mbedtls.c 1.7 MB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234112351123611237112381123911240112411124211243112441124511246112471124811249112501125111252112531125411255112561125711258112591126011261112621126311264112651126611267112681126911270112711127211273112741127511276112771127811279112801128111282112831128411285112861128711288112891129011291112921129311294112951129611297112981129911300113011130211303113041130511306113071130811309113101131111312113131131411315113161131711318113191132011321113221132311324113251132611327113281132911330113311133211333113341133511336113371133811339113401134111342113431134411345113461134711348113491135011351113521135311354113551135611357113581135911360113611136211363113641136511366113671136811369113701137111372113731137411375113761137711378113791138011381113821138311384113851138611387113881138911390113911139211393113941139511396113971139811399114001140111402114031140411405114061140711408114091141011411114121141311414114151141611417114181141911420114211142211423114241142511426114271142811429114301143111432114331143411435114361143711438114391144011441114421144311444114451144611447114481144911450114511145211453114541145511456114571145811459114601146111462114631146411465114661146711468114691147011471114721147311474114751147611477114781147911480114811148211483114841148511486114871148811489114901149111492114931149411495114961149711498114991150011501115021150311504115051150611507115081150911510115111151211513115141151511516115171151811519115201152111522115231152411525115261152711528115291153011531115321153311534115351153611537115381153911540115411154211543115441154511546115471154811549115501155111552115531155411555115561155711558115591156011561115621156311564115651156611567115681156911570115711157211573115741157511576115771157811579115801158111582115831158411585115861158711588115891159011591115921159311594115951159611597115981159911600116011160211603116041160511606116071160811609116101161111612116131161411615116161161711618116191162011621116221162311624116251162611627116281162911630116311163211633116341163511636116371163811639116401164111642116431164411645116461164711648116491165011651116521165311654116551165611657116581165911660116611166211663116641166511666116671166811669116701167111672116731167411675116761167711678116791168011681116821168311684116851168611687116881168911690116911169211693116941169511696116971169811699117001170111702117031170411705117061170711708117091171011711117121171311714117151171611717117181171911720117211172211723117241172511726117271172811729117301173111732117331173411735117361173711738117391174011741117421174311744117451174611747117481174911750117511175211753117541175511756117571175811759117601176111762117631176411765117661176711768117691177011771117721177311774117751177611777117781177911780117811178211783117841178511786117871178811789117901179111792117931179411795117961179711798117991180011801118021180311804118051180611807118081180911810118111181211813118141181511816118171181811819118201182111822118231182411825118261182711828118291183011831118321183311834118351183611837118381183911840118411184211843118441184511846118471184811849118501185111852118531185411855118561185711858118591186011861118621186311864118651186611867118681186911870118711187211873118741187511876118771187811879118801188111882118831188411885118861188711888118891189011891118921189311894118951189611897118981189911900119011190211903119041190511906119071190811909119101191111912119131191411915119161191711918119191192011921119221192311924119251192611927119281192911930119311193211933119341193511936119371193811939119401194111942119431194411945119461194711948119491195011951119521195311954119551195611957119581195911960119611196211963119641196511966119671196811969119701197111972119731197411975119761197711978119791198011981119821198311984119851198611987119881198911990119911199211993119941199511996119971199811999120001200112002120031200412005120061200712008120091201012011120121201312014120151201612017120181201912020120211202212023120241202512026120271202812029120301203112032120331203412035120361203712038120391204012041120421204312044120451204612047120481204912050120511205212053120541205512056120571205812059120601206112062120631206412065120661206712068120691207012071120721207312074120751207612077120781207912080120811208212083120841208512086120871208812089120901209112092120931209412095120961209712098120991210012101121021210312104121051210612107121081210912110121111211212113121141211512116121171211812119121201212112122121231212412125121261212712128121291213012131121321213312134121351213612137121381213912140121411214212143121441214512146121471214812149121501215112152121531215412155121561215712158121591216012161121621216312164121651216612167121681216912170121711217212173121741217512176121771217812179121801218112182121831218412185121861218712188121891219012191121921219312194121951219612197121981219912200122011220212203122041220512206122071220812209122101221112212122131221412215122161221712218122191222012221122221222312224122251222612227122281222912230122311223212233122341223512236122371223812239122401224112242122431224412245122461224712248122491225012251122521225312254122551225612257122581225912260122611226212263122641226512266122671226812269122701227112272122731227412275122761227712278122791228012281122821228312284122851228612287122881228912290122911229212293122941229512296122971229812299123001230112302123031230412305123061230712308123091231012311123121231312314123151231612317123181231912320123211232212323123241232512326123271232812329123301233112332123331233412335123361233712338123391234012341123421234312344123451234612347123481234912350123511235212353123541235512356123571235812359123601236112362123631236412365123661236712368123691237012371123721237312374123751237612377123781237912380123811238212383123841238512386123871238812389123901239112392123931239412395123961239712398123991240012401124021240312404124051240612407124081240912410124111241212413124141241512416124171241812419124201242112422124231242412425124261242712428124291243012431124321243312434124351243612437124381243912440124411244212443124441244512446124471244812449124501245112452124531245412455124561245712458124591246012461124621246312464124651246612467124681246912470124711247212473124741247512476124771247812479124801248112482124831248412485124861248712488124891249012491124921249312494124951249612497124981249912500125011250212503125041250512506125071250812509125101251112512125131251412515125161251712518125191252012521125221252312524125251252612527125281252912530125311253212533125341253512536125371253812539125401254112542125431254412545125461254712548125491255012551125521255312554125551255612557125581255912560125611256212563125641256512566125671256812569125701257112572125731257412575125761257712578125791258012581125821258312584125851258612587125881258912590125911259212593125941259512596125971259812599126001260112602126031260412605126061260712608126091261012611126121261312614126151261612617126181261912620126211262212623126241262512626126271262812629126301263112632126331263412635126361263712638126391264012641126421264312644126451264612647126481264912650126511265212653126541265512656126571265812659126601266112662126631266412665126661266712668126691267012671126721267312674126751267612677126781267912680126811268212683126841268512686126871268812689126901269112692126931269412695126961269712698126991270012701127021270312704127051270612707127081270912710127111271212713127141271512716127171271812719127201272112722127231272412725127261272712728127291273012731127321273312734127351273612737127381273912740127411274212743127441274512746127471274812749127501275112752127531275412755127561275712758127591276012761127621276312764127651276612767127681276912770127711277212773127741277512776127771277812779127801278112782127831278412785127861278712788127891279012791127921279312794127951279612797127981279912800128011280212803128041280512806128071280812809128101281112812128131281412815128161281712818128191282012821128221282312824128251282612827128281282912830128311283212833128341283512836128371283812839128401284112842128431284412845128461284712848128491285012851128521285312854128551285612857128581285912860128611286212863128641286512866128671286812869128701287112872128731287412875128761287712878128791288012881128821288312884128851288612887128881288912890128911289212893128941289512896128971289812899129001290112902129031290412905129061290712908129091291012911129121291312914129151291612917129181291912920129211292212923129241292512926129271292812929129301293112932129331293412935129361293712938129391294012941129421294312944129451294612947129481294912950129511295212953129541295512956129571295812959129601296112962129631296412965129661296712968129691297012971129721297312974129751297612977129781297912980129811298212983129841298512986129871298812989129901299112992129931299412995129961299712998129991300013001130021300313004130051300613007130081300913010130111301213013130141301513016130171301813019130201302113022130231302413025130261302713028130291303013031130321303313034130351303613037130381303913040130411304213043130441304513046130471304813049130501305113052130531305413055130561305713058130591306013061130621306313064130651306613067130681306913070130711307213073130741307513076130771307813079130801308113082130831308413085130861308713088130891309013091130921309313094130951309613097130981309913100131011310213103131041310513106131071310813109131101311113112131131311413115131161311713118131191312013121131221312313124131251312613127131281312913130131311313213133131341313513136131371313813139131401314113142131431314413145131461314713148131491315013151131521315313154131551315613157131581315913160131611316213163131641316513166131671316813169131701317113172131731317413175131761317713178131791318013181131821318313184131851318613187131881318913190131911319213193131941319513196131971319813199132001320113202132031320413205132061320713208132091321013211132121321313214132151321613217132181321913220132211322213223132241322513226132271322813229132301323113232132331323413235132361323713238132391324013241132421324313244132451324613247132481324913250132511325213253132541325513256132571325813259132601326113262132631326413265132661326713268132691327013271132721327313274132751327613277132781327913280132811328213283132841328513286132871328813289132901329113292132931329413295132961329713298132991330013301133021330313304133051330613307133081330913310133111331213313133141331513316133171331813319133201332113322133231332413325133261332713328133291333013331133321333313334133351333613337133381333913340133411334213343133441334513346133471334813349133501335113352133531335413355133561335713358133591336013361133621336313364133651336613367133681336913370133711337213373133741337513376133771337813379133801338113382133831338413385133861338713388133891339013391133921339313394133951339613397133981339913400134011340213403134041340513406134071340813409134101341113412134131341413415134161341713418134191342013421134221342313424134251342613427134281342913430134311343213433134341343513436134371343813439134401344113442134431344413445134461344713448134491345013451134521345313454134551345613457134581345913460134611346213463134641346513466134671346813469134701347113472134731347413475134761347713478134791348013481134821348313484134851348613487134881348913490134911349213493134941349513496134971349813499135001350113502135031350413505135061350713508135091351013511135121351313514135151351613517135181351913520135211352213523135241352513526135271352813529135301353113532135331353413535135361353713538135391354013541135421354313544135451354613547135481354913550135511355213553135541355513556135571355813559135601356113562135631356413565135661356713568135691357013571135721357313574135751357613577135781357913580135811358213583135841358513586135871358813589135901359113592135931359413595135961359713598135991360013601136021360313604136051360613607136081360913610136111361213613136141361513616136171361813619136201362113622136231362413625136261362713628136291363013631136321363313634136351363613637136381363913640136411364213643136441364513646136471364813649136501365113652136531365413655136561365713658136591366013661136621366313664136651366613667136681366913670136711367213673136741367513676136771367813679136801368113682136831368413685136861368713688136891369013691136921369313694136951369613697136981369913700137011370213703137041370513706137071370813709137101371113712137131371413715137161371713718137191372013721137221372313724137251372613727137281372913730137311373213733137341373513736137371373813739137401374113742137431374413745137461374713748137491375013751137521375313754137551375613757137581375913760137611376213763137641376513766137671376813769137701377113772137731377413775137761377713778137791378013781137821378313784137851378613787137881378913790137911379213793137941379513796137971379813799138001380113802138031380413805138061380713808138091381013811138121381313814138151381613817138181381913820138211382213823138241382513826138271382813829138301383113832138331383413835138361383713838138391384013841138421384313844138451384613847138481384913850138511385213853138541385513856138571385813859138601386113862138631386413865138661386713868138691387013871138721387313874138751387613877138781387913880138811388213883138841388513886138871388813889138901389113892138931389413895138961389713898138991390013901139021390313904139051390613907139081390913910139111391213913139141391513916139171391813919139201392113922139231392413925139261392713928139291393013931139321393313934139351393613937139381393913940139411394213943139441394513946139471394813949139501395113952139531395413955139561395713958139591396013961139621396313964139651396613967139681396913970139711397213973139741397513976139771397813979139801398113982139831398413985139861398713988139891399013991139921399313994139951399613997139981399914000140011400214003140041400514006140071400814009140101401114012140131401414015140161401714018140191402014021140221402314024140251402614027140281402914030140311403214033140341403514036140371403814039140401404114042140431404414045140461404714048140491405014051140521405314054140551405614057140581405914060140611406214063140641406514066140671406814069140701407114072140731407414075140761407714078140791408014081140821408314084140851408614087140881408914090140911409214093140941409514096140971409814099141001410114102141031410414105141061410714108141091411014111141121411314114141151411614117141181411914120141211412214123141241412514126141271412814129141301413114132141331413414135141361413714138141391414014141141421414314144141451414614147141481414914150141511415214153141541415514156141571415814159141601416114162141631416414165141661416714168141691417014171141721417314174141751417614177141781417914180141811418214183141841418514186141871418814189141901419114192141931419414195141961419714198141991420014201142021420314204142051420614207142081420914210142111421214213142141421514216142171421814219142201422114222142231422414225142261422714228142291423014231142321423314234142351423614237142381423914240142411424214243142441424514246142471424814249142501425114252142531425414255142561425714258142591426014261142621426314264142651426614267142681426914270142711427214273142741427514276142771427814279142801428114282142831428414285142861428714288142891429014291142921429314294142951429614297142981429914300143011430214303143041430514306143071430814309143101431114312143131431414315143161431714318143191432014321143221432314324143251432614327143281432914330143311433214333143341433514336143371433814339143401434114342143431434414345143461434714348143491435014351143521435314354143551435614357143581435914360143611436214363143641436514366143671436814369143701437114372143731437414375143761437714378143791438014381143821438314384143851438614387143881438914390143911439214393143941439514396143971439814399144001440114402144031440414405144061440714408144091441014411144121441314414144151441614417144181441914420144211442214423144241442514426144271442814429144301443114432144331443414435144361443714438144391444014441144421444314444144451444614447144481444914450144511445214453144541445514456144571445814459144601446114462144631446414465144661446714468144691447014471144721447314474144751447614477144781447914480144811448214483144841448514486144871448814489144901449114492144931449414495144961449714498144991450014501145021450314504145051450614507145081450914510145111451214513145141451514516145171451814519145201452114522145231452414525145261452714528145291453014531145321453314534145351453614537145381453914540145411454214543145441454514546145471454814549145501455114552145531455414555145561455714558145591456014561145621456314564145651456614567145681456914570145711457214573145741457514576145771457814579145801458114582145831458414585145861458714588145891459014591145921459314594145951459614597145981459914600146011460214603146041460514606146071460814609146101461114612146131461414615146161461714618146191462014621146221462314624146251462614627146281462914630146311463214633146341463514636146371463814639146401464114642146431464414645146461464714648146491465014651146521465314654146551465614657146581465914660146611466214663146641466514666146671466814669146701467114672146731467414675146761467714678146791468014681146821468314684146851468614687146881468914690146911469214693146941469514696146971469814699147001470114702147031470414705147061470714708147091471014711147121471314714147151471614717147181471914720147211472214723147241472514726147271472814729147301473114732147331473414735147361473714738147391474014741147421474314744147451474614747147481474914750147511475214753147541475514756147571475814759147601476114762147631476414765147661476714768147691477014771147721477314774147751477614777147781477914780147811478214783147841478514786147871478814789147901479114792147931479414795147961479714798147991480014801148021480314804148051480614807148081480914810148111481214813148141481514816148171481814819148201482114822148231482414825148261482714828148291483014831148321483314834148351483614837148381483914840148411484214843148441484514846148471484814849148501485114852148531485414855148561485714858148591486014861148621486314864148651486614867148681486914870148711487214873148741487514876148771487814879148801488114882148831488414885148861488714888148891489014891148921489314894148951489614897148981489914900149011490214903149041490514906149071490814909149101491114912149131491414915149161491714918149191492014921149221492314924149251492614927149281492914930149311493214933149341493514936149371493814939149401494114942149431494414945149461494714948149491495014951149521495314954149551495614957149581495914960149611496214963149641496514966149671496814969149701497114972149731497414975149761497714978149791498014981149821498314984149851498614987149881498914990149911499214993149941499514996149971499814999150001500115002150031500415005150061500715008150091501015011150121501315014150151501615017150181501915020150211502215023150241502515026150271502815029150301503115032150331503415035150361503715038150391504015041150421504315044150451504615047150481504915050150511505215053150541505515056150571505815059150601506115062150631506415065150661506715068150691507015071150721507315074150751507615077150781507915080150811508215083150841508515086150871508815089150901509115092150931509415095150961509715098150991510015101151021510315104151051510615107151081510915110151111511215113151141511515116151171511815119151201512115122151231512415125151261512715128151291513015131151321513315134151351513615137151381513915140151411514215143151441514515146151471514815149151501515115152151531515415155151561515715158151591516015161151621516315164151651516615167151681516915170151711517215173151741517515176151771517815179151801518115182151831518415185151861518715188151891519015191151921519315194151951519615197151981519915200152011520215203152041520515206152071520815209152101521115212152131521415215152161521715218152191522015221152221522315224152251522615227152281522915230152311523215233152341523515236152371523815239152401524115242152431524415245152461524715248152491525015251152521525315254152551525615257152581525915260152611526215263152641526515266152671526815269152701527115272152731527415275152761527715278152791528015281152821528315284152851528615287152881528915290152911529215293152941529515296152971529815299153001530115302153031530415305153061530715308153091531015311153121531315314153151531615317153181531915320153211532215323153241532515326153271532815329153301533115332153331533415335153361533715338153391534015341153421534315344153451534615347153481534915350153511535215353153541535515356153571535815359153601536115362153631536415365153661536715368153691537015371153721537315374153751537615377153781537915380153811538215383153841538515386153871538815389153901539115392153931539415395153961539715398153991540015401154021540315404154051540615407154081540915410154111541215413154141541515416154171541815419154201542115422154231542415425154261542715428154291543015431154321543315434154351543615437154381543915440154411544215443154441544515446154471544815449154501545115452154531545415455154561545715458154591546015461154621546315464154651546615467154681546915470154711547215473154741547515476154771547815479154801548115482154831548415485154861548715488154891549015491154921549315494154951549615497154981549915500155011550215503155041550515506155071550815509155101551115512155131551415515155161551715518155191552015521155221552315524155251552615527155281552915530155311553215533155341553515536155371553815539155401554115542155431554415545155461554715548155491555015551155521555315554155551555615557155581555915560155611556215563155641556515566155671556815569155701557115572155731557415575155761557715578155791558015581155821558315584155851558615587155881558915590155911559215593155941559515596155971559815599156001560115602156031560415605156061560715608156091561015611156121561315614156151561615617156181561915620156211562215623156241562515626156271562815629156301563115632156331563415635156361563715638156391564015641156421564315644156451564615647156481564915650156511565215653156541565515656156571565815659156601566115662156631566415665156661566715668156691567015671156721567315674156751567615677156781567915680156811568215683156841568515686156871568815689156901569115692156931569415695156961569715698156991570015701157021570315704157051570615707157081570915710157111571215713157141571515716157171571815719157201572115722157231572415725157261572715728157291573015731157321573315734157351573615737157381573915740157411574215743157441574515746157471574815749157501575115752157531575415755157561575715758157591576015761157621576315764157651576615767157681576915770157711577215773157741577515776157771577815779157801578115782157831578415785157861578715788157891579015791157921579315794157951579615797157981579915800158011580215803158041580515806158071580815809158101581115812158131581415815158161581715818158191582015821158221582315824158251582615827158281582915830158311583215833158341583515836158371583815839158401584115842158431584415845158461584715848158491585015851158521585315854158551585615857158581585915860158611586215863158641586515866158671586815869158701587115872158731587415875158761587715878158791588015881158821588315884158851588615887158881588915890158911589215893158941589515896158971589815899159001590115902159031590415905159061590715908159091591015911159121591315914159151591615917159181591915920159211592215923159241592515926159271592815929159301593115932159331593415935159361593715938159391594015941159421594315944159451594615947159481594915950159511595215953159541595515956159571595815959159601596115962159631596415965159661596715968159691597015971159721597315974159751597615977159781597915980159811598215983159841598515986159871598815989159901599115992159931599415995159961599715998159991600016001160021600316004160051600616007160081600916010160111601216013160141601516016160171601816019160201602116022160231602416025160261602716028160291603016031160321603316034160351603616037160381603916040160411604216043160441604516046160471604816049160501605116052160531605416055160561605716058160591606016061160621606316064160651606616067160681606916070160711607216073160741607516076160771607816079160801608116082160831608416085160861608716088160891609016091160921609316094160951609616097160981609916100161011610216103161041610516106161071610816109161101611116112161131611416115161161611716118161191612016121161221612316124161251612616127161281612916130161311613216133161341613516136161371613816139161401614116142161431614416145161461614716148161491615016151161521615316154161551615616157161581615916160161611616216163161641616516166161671616816169161701617116172161731617416175161761617716178161791618016181161821618316184161851618616187161881618916190161911619216193161941619516196161971619816199162001620116202162031620416205162061620716208162091621016211162121621316214162151621616217162181621916220162211622216223162241622516226162271622816229162301623116232162331623416235162361623716238162391624016241162421624316244162451624616247162481624916250162511625216253162541625516256162571625816259162601626116262162631626416265162661626716268162691627016271162721627316274162751627616277162781627916280162811628216283162841628516286162871628816289162901629116292162931629416295162961629716298162991630016301163021630316304163051630616307163081630916310163111631216313163141631516316163171631816319163201632116322163231632416325163261632716328163291633016331163321633316334163351633616337163381633916340163411634216343163441634516346163471634816349163501635116352163531635416355163561635716358163591636016361163621636316364163651636616367163681636916370163711637216373163741637516376163771637816379163801638116382163831638416385163861638716388163891639016391163921639316394163951639616397163981639916400164011640216403164041640516406164071640816409164101641116412164131641416415164161641716418164191642016421164221642316424164251642616427164281642916430164311643216433164341643516436164371643816439164401644116442164431644416445164461644716448164491645016451164521645316454164551645616457164581645916460164611646216463164641646516466164671646816469164701647116472164731647416475164761647716478164791648016481164821648316484164851648616487164881648916490164911649216493164941649516496164971649816499165001650116502165031650416505165061650716508165091651016511165121651316514165151651616517165181651916520165211652216523165241652516526165271652816529165301653116532165331653416535165361653716538165391654016541165421654316544165451654616547165481654916550165511655216553165541655516556165571655816559165601656116562165631656416565165661656716568165691657016571165721657316574165751657616577165781657916580165811658216583165841658516586165871658816589165901659116592165931659416595165961659716598165991660016601166021660316604166051660616607166081660916610166111661216613166141661516616166171661816619166201662116622166231662416625166261662716628166291663016631166321663316634166351663616637166381663916640166411664216643166441664516646166471664816649166501665116652166531665416655166561665716658166591666016661166621666316664166651666616667166681666916670166711667216673166741667516676166771667816679166801668116682166831668416685166861668716688166891669016691166921669316694166951669616697166981669916700167011670216703167041670516706167071670816709167101671116712167131671416715167161671716718167191672016721167221672316724167251672616727167281672916730167311673216733167341673516736167371673816739167401674116742167431674416745167461674716748167491675016751167521675316754167551675616757167581675916760167611676216763167641676516766167671676816769167701677116772167731677416775167761677716778167791678016781167821678316784167851678616787167881678916790167911679216793167941679516796167971679816799168001680116802168031680416805168061680716808168091681016811168121681316814168151681616817168181681916820168211682216823168241682516826168271682816829168301683116832168331683416835168361683716838168391684016841168421684316844168451684616847168481684916850168511685216853168541685516856168571685816859168601686116862168631686416865168661686716868168691687016871168721687316874168751687616877168781687916880168811688216883168841688516886168871688816889168901689116892168931689416895168961689716898168991690016901169021690316904169051690616907169081690916910169111691216913169141691516916169171691816919169201692116922169231692416925169261692716928169291693016931169321693316934169351693616937169381693916940169411694216943169441694516946169471694816949169501695116952169531695416955169561695716958169591696016961169621696316964169651696616967169681696916970169711697216973169741697516976169771697816979169801698116982169831698416985169861698716988169891699016991169921699316994169951699616997169981699917000170011700217003170041700517006170071700817009170101701117012170131701417015170161701717018170191702017021170221702317024170251702617027170281702917030170311703217033170341703517036170371703817039170401704117042170431704417045170461704717048170491705017051170521705317054170551705617057170581705917060170611706217063170641706517066170671706817069170701707117072170731707417075170761707717078170791708017081170821708317084170851708617087170881708917090170911709217093170941709517096170971709817099171001710117102171031710417105171061710717108171091711017111171121711317114171151711617117171181711917120171211712217123171241712517126171271712817129171301713117132171331713417135171361713717138171391714017141171421714317144171451714617147171481714917150171511715217153171541715517156171571715817159171601716117162171631716417165171661716717168171691717017171171721717317174171751717617177171781717917180171811718217183171841718517186171871718817189171901719117192171931719417195171961719717198171991720017201172021720317204172051720617207172081720917210172111721217213172141721517216172171721817219172201722117222172231722417225172261722717228172291723017231172321723317234172351723617237172381723917240172411724217243172441724517246172471724817249172501725117252172531725417255172561725717258172591726017261172621726317264172651726617267172681726917270172711727217273172741727517276172771727817279172801728117282172831728417285172861728717288172891729017291172921729317294172951729617297172981729917300173011730217303173041730517306173071730817309173101731117312173131731417315173161731717318173191732017321173221732317324173251732617327173281732917330173311733217333173341733517336173371733817339173401734117342173431734417345173461734717348173491735017351173521735317354173551735617357173581735917360173611736217363173641736517366173671736817369173701737117372173731737417375173761737717378173791738017381173821738317384173851738617387173881738917390173911739217393173941739517396173971739817399174001740117402174031740417405174061740717408174091741017411174121741317414174151741617417174181741917420174211742217423174241742517426174271742817429174301743117432174331743417435174361743717438174391744017441174421744317444174451744617447174481744917450174511745217453174541745517456174571745817459174601746117462174631746417465174661746717468174691747017471174721747317474174751747617477174781747917480174811748217483174841748517486174871748817489174901749117492174931749417495174961749717498174991750017501175021750317504175051750617507175081750917510175111751217513175141751517516175171751817519175201752117522175231752417525175261752717528175291753017531175321753317534175351753617537175381753917540175411754217543175441754517546175471754817549175501755117552175531755417555175561755717558175591756017561175621756317564175651756617567175681756917570175711757217573175741757517576175771757817579175801758117582175831758417585175861758717588175891759017591175921759317594175951759617597175981759917600176011760217603176041760517606176071760817609176101761117612176131761417615176161761717618176191762017621176221762317624176251762617627176281762917630176311763217633176341763517636176371763817639176401764117642176431764417645176461764717648176491765017651176521765317654176551765617657176581765917660176611766217663176641766517666176671766817669176701767117672176731767417675176761767717678176791768017681176821768317684176851768617687176881768917690176911769217693176941769517696176971769817699177001770117702177031770417705177061770717708177091771017711177121771317714177151771617717177181771917720177211772217723177241772517726177271772817729177301773117732177331773417735177361773717738177391774017741177421774317744177451774617747177481774917750177511775217753177541775517756177571775817759177601776117762177631776417765177661776717768177691777017771177721777317774177751777617777177781777917780177811778217783177841778517786177871778817789177901779117792177931779417795177961779717798177991780017801178021780317804178051780617807178081780917810178111781217813178141781517816178171781817819178201782117822178231782417825178261782717828178291783017831178321783317834178351783617837178381783917840178411784217843178441784517846178471784817849178501785117852178531785417855178561785717858178591786017861178621786317864178651786617867178681786917870178711787217873178741787517876178771787817879178801788117882178831788417885178861788717888178891789017891178921789317894178951789617897178981789917900179011790217903179041790517906179071790817909179101791117912179131791417915179161791717918179191792017921179221792317924179251792617927179281792917930179311793217933179341793517936179371793817939179401794117942179431794417945179461794717948179491795017951179521795317954179551795617957179581795917960179611796217963179641796517966179671796817969179701797117972179731797417975179761797717978179791798017981179821798317984179851798617987179881798917990179911799217993179941799517996179971799817999180001800118002180031800418005180061800718008180091801018011180121801318014180151801618017180181801918020180211802218023180241802518026180271802818029180301803118032180331803418035180361803718038180391804018041180421804318044180451804618047180481804918050180511805218053180541805518056180571805818059180601806118062180631806418065180661806718068180691807018071180721807318074180751807618077180781807918080180811808218083180841808518086180871808818089180901809118092180931809418095180961809718098180991810018101181021810318104181051810618107181081810918110181111811218113181141811518116181171811818119181201812118122181231812418125181261812718128181291813018131181321813318134181351813618137181381813918140181411814218143181441814518146181471814818149181501815118152181531815418155181561815718158181591816018161181621816318164181651816618167181681816918170181711817218173181741817518176181771817818179181801818118182181831818418185181861818718188181891819018191181921819318194181951819618197181981819918200182011820218203182041820518206182071820818209182101821118212182131821418215182161821718218182191822018221182221822318224182251822618227182281822918230182311823218233182341823518236182371823818239182401824118242182431824418245182461824718248182491825018251182521825318254182551825618257182581825918260182611826218263182641826518266182671826818269182701827118272182731827418275182761827718278182791828018281182821828318284182851828618287182881828918290182911829218293182941829518296182971829818299183001830118302183031830418305183061830718308183091831018311183121831318314183151831618317183181831918320183211832218323183241832518326183271832818329183301833118332183331833418335183361833718338183391834018341183421834318344183451834618347183481834918350183511835218353183541835518356183571835818359183601836118362183631836418365183661836718368183691837018371183721837318374183751837618377183781837918380183811838218383183841838518386183871838818389183901839118392183931839418395183961839718398183991840018401184021840318404184051840618407184081840918410184111841218413184141841518416184171841818419184201842118422184231842418425184261842718428184291843018431184321843318434184351843618437184381843918440184411844218443184441844518446184471844818449184501845118452184531845418455184561845718458184591846018461184621846318464184651846618467184681846918470184711847218473184741847518476184771847818479184801848118482184831848418485184861848718488184891849018491184921849318494184951849618497184981849918500185011850218503185041850518506185071850818509185101851118512185131851418515185161851718518185191852018521185221852318524185251852618527185281852918530185311853218533185341853518536185371853818539185401854118542185431854418545185461854718548185491855018551185521855318554185551855618557185581855918560185611856218563185641856518566185671856818569185701857118572185731857418575185761857718578185791858018581185821858318584185851858618587185881858918590185911859218593185941859518596185971859818599186001860118602186031860418605186061860718608186091861018611186121861318614186151861618617186181861918620186211862218623186241862518626186271862818629186301863118632186331863418635186361863718638186391864018641186421864318644186451864618647186481864918650186511865218653186541865518656186571865818659186601866118662186631866418665186661866718668186691867018671186721867318674186751867618677186781867918680186811868218683186841868518686186871868818689186901869118692186931869418695186961869718698186991870018701187021870318704187051870618707187081870918710187111871218713187141871518716187171871818719187201872118722187231872418725187261872718728187291873018731187321873318734187351873618737187381873918740187411874218743187441874518746187471874818749187501875118752187531875418755187561875718758187591876018761187621876318764187651876618767187681876918770187711877218773187741877518776187771877818779187801878118782187831878418785187861878718788187891879018791187921879318794187951879618797187981879918800188011880218803188041880518806188071880818809188101881118812188131881418815188161881718818188191882018821188221882318824188251882618827188281882918830188311883218833188341883518836188371883818839188401884118842188431884418845188461884718848188491885018851188521885318854188551885618857188581885918860188611886218863188641886518866188671886818869188701887118872188731887418875188761887718878188791888018881188821888318884188851888618887188881888918890188911889218893188941889518896188971889818899189001890118902189031890418905189061890718908189091891018911189121891318914189151891618917189181891918920189211892218923189241892518926189271892818929189301893118932189331893418935189361893718938189391894018941189421894318944189451894618947189481894918950189511895218953189541895518956189571895818959189601896118962189631896418965189661896718968189691897018971189721897318974189751897618977189781897918980189811898218983189841898518986189871898818989189901899118992189931899418995189961899718998189991900019001190021900319004190051900619007190081900919010190111901219013190141901519016190171901819019190201902119022190231902419025190261902719028190291903019031190321903319034190351903619037190381903919040190411904219043190441904519046190471904819049190501905119052190531905419055190561905719058190591906019061190621906319064190651906619067190681906919070190711907219073190741907519076190771907819079190801908119082190831908419085190861908719088190891909019091190921909319094190951909619097190981909919100191011910219103191041910519106191071910819109191101911119112191131911419115191161911719118191191912019121191221912319124191251912619127191281912919130191311913219133191341913519136191371913819139191401914119142191431914419145191461914719148191491915019151191521915319154191551915619157191581915919160191611916219163191641916519166191671916819169191701917119172191731917419175191761917719178191791918019181191821918319184191851918619187191881918919190191911919219193191941919519196191971919819199192001920119202192031920419205192061920719208192091921019211192121921319214192151921619217192181921919220192211922219223192241922519226192271922819229192301923119232192331923419235192361923719238192391924019241192421924319244192451924619247192481924919250192511925219253192541925519256192571925819259192601926119262192631926419265192661926719268192691927019271192721927319274192751927619277192781927919280192811928219283192841928519286192871928819289192901929119292192931929419295192961929719298192991930019301193021930319304193051930619307193081930919310193111931219313193141931519316193171931819319193201932119322193231932419325193261932719328193291933019331193321933319334193351933619337193381933919340193411934219343193441934519346193471934819349193501935119352193531935419355193561935719358193591936019361193621936319364193651936619367193681936919370193711937219373193741937519376193771937819379193801938119382193831938419385193861938719388193891939019391193921939319394193951939619397193981939919400194011940219403194041940519406194071940819409194101941119412194131941419415194161941719418194191942019421194221942319424194251942619427194281942919430194311943219433194341943519436194371943819439194401944119442194431944419445194461944719448194491945019451194521945319454194551945619457194581945919460194611946219463194641946519466194671946819469194701947119472194731947419475194761947719478194791948019481194821948319484194851948619487194881948919490194911949219493194941949519496194971949819499195001950119502195031950419505195061950719508195091951019511195121951319514195151951619517195181951919520195211952219523195241952519526195271952819529195301953119532195331953419535195361953719538195391954019541195421954319544195451954619547195481954919550195511955219553195541955519556195571955819559195601956119562195631956419565195661956719568195691957019571195721957319574195751957619577195781957919580195811958219583195841958519586195871958819589195901959119592195931959419595195961959719598195991960019601196021960319604196051960619607196081960919610196111961219613196141961519616196171961819619196201962119622196231962419625196261962719628196291963019631196321963319634196351963619637196381963919640196411964219643196441964519646196471964819649196501965119652196531965419655196561965719658196591966019661196621966319664196651966619667196681966919670196711967219673196741967519676196771967819679196801968119682196831968419685196861968719688196891969019691196921969319694196951969619697196981969919700197011970219703197041970519706197071970819709197101971119712197131971419715197161971719718197191972019721197221972319724197251972619727197281972919730197311973219733197341973519736197371973819739197401974119742197431974419745197461974719748197491975019751197521975319754197551975619757197581975919760197611976219763197641976519766197671976819769197701977119772197731977419775197761977719778197791978019781197821978319784197851978619787197881978919790197911979219793197941979519796197971979819799198001980119802198031980419805198061980719808198091981019811198121981319814198151981619817198181981919820198211982219823198241982519826198271982819829198301983119832198331983419835198361983719838198391984019841198421984319844198451984619847198481984919850198511985219853198541985519856198571985819859198601986119862198631986419865198661986719868198691987019871198721987319874198751987619877198781987919880198811988219883198841988519886198871988819889198901989119892198931989419895198961989719898198991990019901199021990319904199051990619907199081990919910199111991219913199141991519916199171991819919199201992119922199231992419925199261992719928199291993019931199321993319934199351993619937199381993919940199411994219943199441994519946199471994819949199501995119952199531995419955199561995719958199591996019961199621996319964199651996619967199681996919970199711997219973199741997519976199771997819979199801998119982199831998419985199861998719988199891999019991199921999319994199951999619997199981999920000200012000220003200042000520006200072000820009200102001120012200132001420015200162001720018200192002020021200222002320024200252002620027200282002920030200312003220033200342003520036200372003820039200402004120042200432004420045200462004720048200492005020051200522005320054200552005620057200582005920060200612006220063200642006520066200672006820069200702007120072200732007420075200762007720078200792008020081200822008320084200852008620087200882008920090200912009220093200942009520096200972009820099201002010120102201032010420105201062010720108201092011020111201122011320114201152011620117201182011920120201212012220123201242012520126201272012820129201302013120132201332013420135201362013720138201392014020141201422014320144201452014620147201482014920150201512015220153201542015520156201572015820159201602016120162201632016420165201662016720168201692017020171201722017320174201752017620177201782017920180201812018220183201842018520186201872018820189201902019120192201932019420195201962019720198201992020020201202022020320204202052020620207202082020920210202112021220213202142021520216202172021820219202202022120222202232022420225202262022720228202292023020231202322023320234202352023620237202382023920240202412024220243202442024520246202472024820249202502025120252202532025420255202562025720258202592026020261202622026320264202652026620267202682026920270202712027220273202742027520276202772027820279202802028120282202832028420285202862028720288202892029020291202922029320294202952029620297202982029920300203012030220303203042030520306203072030820309203102031120312203132031420315203162031720318203192032020321203222032320324203252032620327203282032920330203312033220333203342033520336203372033820339203402034120342203432034420345203462034720348203492035020351203522035320354203552035620357203582035920360203612036220363203642036520366203672036820369203702037120372203732037420375203762037720378203792038020381203822038320384203852038620387203882038920390203912039220393203942039520396203972039820399204002040120402204032040420405204062040720408204092041020411204122041320414204152041620417204182041920420204212042220423204242042520426204272042820429204302043120432204332043420435204362043720438204392044020441204422044320444204452044620447204482044920450204512045220453204542045520456204572045820459204602046120462204632046420465204662046720468204692047020471204722047320474204752047620477204782047920480204812048220483204842048520486204872048820489204902049120492204932049420495204962049720498204992050020501205022050320504205052050620507205082050920510205112051220513205142051520516205172051820519205202052120522205232052420525205262052720528205292053020531205322053320534205352053620537205382053920540205412054220543205442054520546205472054820549205502055120552205532055420555205562055720558205592056020561205622056320564205652056620567205682056920570205712057220573205742057520576205772057820579205802058120582205832058420585205862058720588205892059020591205922059320594205952059620597205982059920600206012060220603206042060520606206072060820609206102061120612206132061420615206162061720618206192062020621206222062320624206252062620627206282062920630206312063220633206342063520636206372063820639206402064120642206432064420645206462064720648206492065020651206522065320654206552065620657206582065920660206612066220663206642066520666206672066820669206702067120672206732067420675206762067720678206792068020681206822068320684206852068620687206882068920690206912069220693206942069520696206972069820699207002070120702207032070420705207062070720708207092071020711207122071320714207152071620717207182071920720207212072220723207242072520726207272072820729207302073120732207332073420735207362073720738207392074020741207422074320744207452074620747207482074920750207512075220753207542075520756207572075820759207602076120762207632076420765207662076720768207692077020771207722077320774207752077620777207782077920780207812078220783207842078520786207872078820789207902079120792207932079420795207962079720798207992080020801208022080320804208052080620807208082080920810208112081220813208142081520816208172081820819208202082120822208232082420825208262082720828208292083020831208322083320834208352083620837208382083920840208412084220843208442084520846208472084820849208502085120852208532085420855208562085720858208592086020861208622086320864208652086620867208682086920870208712087220873208742087520876208772087820879208802088120882208832088420885208862088720888208892089020891208922089320894208952089620897208982089920900209012090220903209042090520906209072090820909209102091120912209132091420915209162091720918209192092020921209222092320924209252092620927209282092920930209312093220933209342093520936209372093820939209402094120942209432094420945209462094720948209492095020951209522095320954209552095620957209582095920960209612096220963209642096520966209672096820969209702097120972209732097420975209762097720978209792098020981209822098320984209852098620987209882098920990209912099220993209942099520996209972099820999210002100121002210032100421005210062100721008210092101021011210122101321014210152101621017210182101921020210212102221023210242102521026210272102821029210302103121032210332103421035210362103721038210392104021041210422104321044210452104621047210482104921050210512105221053210542105521056210572105821059210602106121062210632106421065210662106721068210692107021071210722107321074210752107621077210782107921080210812108221083210842108521086210872108821089210902109121092210932109421095210962109721098210992110021101211022110321104211052110621107211082110921110211112111221113211142111521116211172111821119211202112121122211232112421125211262112721128211292113021131211322113321134211352113621137211382113921140211412114221143211442114521146211472114821149211502115121152211532115421155211562115721158211592116021161211622116321164211652116621167211682116921170211712117221173211742117521176211772117821179211802118121182211832118421185211862118721188211892119021191211922119321194211952119621197211982119921200212012120221203212042120521206212072120821209212102121121212212132121421215212162121721218212192122021221212222122321224212252122621227212282122921230212312123221233212342123521236212372123821239212402124121242212432124421245212462124721248212492125021251212522125321254212552125621257212582125921260212612126221263212642126521266212672126821269212702127121272212732127421275212762127721278212792128021281212822128321284212852128621287212882128921290212912129221293212942129521296212972129821299213002130121302213032130421305213062130721308213092131021311213122131321314213152131621317213182131921320213212132221323213242132521326213272132821329213302133121332213332133421335213362133721338213392134021341213422134321344213452134621347213482134921350213512135221353213542135521356213572135821359213602136121362213632136421365213662136721368213692137021371213722137321374213752137621377213782137921380213812138221383213842138521386213872138821389213902139121392213932139421395213962139721398213992140021401214022140321404214052140621407214082140921410214112141221413214142141521416214172141821419214202142121422214232142421425214262142721428214292143021431214322143321434214352143621437214382143921440214412144221443214442144521446214472144821449214502145121452214532145421455214562145721458214592146021461214622146321464214652146621467214682146921470214712147221473214742147521476214772147821479214802148121482214832148421485214862148721488214892149021491214922149321494214952149621497214982149921500215012150221503215042150521506215072150821509215102151121512215132151421515215162151721518215192152021521215222152321524215252152621527215282152921530215312153221533215342153521536215372153821539215402154121542215432154421545215462154721548215492155021551215522155321554215552155621557215582155921560215612156221563215642156521566215672156821569215702157121572215732157421575215762157721578215792158021581215822158321584215852158621587215882158921590215912159221593215942159521596215972159821599216002160121602216032160421605216062160721608216092161021611216122161321614216152161621617216182161921620216212162221623216242162521626216272162821629216302163121632216332163421635216362163721638216392164021641216422164321644216452164621647216482164921650216512165221653216542165521656216572165821659216602166121662216632166421665216662166721668216692167021671216722167321674216752167621677216782167921680216812168221683216842168521686216872168821689216902169121692216932169421695216962169721698216992170021701217022170321704217052170621707217082170921710217112171221713217142171521716217172171821719217202172121722217232172421725217262172721728217292173021731217322173321734217352173621737217382173921740217412174221743217442174521746217472174821749217502175121752217532175421755217562175721758217592176021761217622176321764217652176621767217682176921770217712177221773217742177521776217772177821779217802178121782217832178421785217862178721788217892179021791217922179321794217952179621797217982179921800218012180221803218042180521806218072180821809218102181121812218132181421815218162181721818218192182021821218222182321824218252182621827218282182921830218312183221833218342183521836218372183821839218402184121842218432184421845218462184721848218492185021851218522185321854218552185621857218582185921860218612186221863218642186521866218672186821869218702187121872218732187421875218762187721878218792188021881218822188321884218852188621887218882188921890218912189221893218942189521896218972189821899219002190121902219032190421905219062190721908219092191021911219122191321914219152191621917219182191921920219212192221923219242192521926219272192821929219302193121932219332193421935219362193721938219392194021941219422194321944219452194621947219482194921950219512195221953219542195521956219572195821959219602196121962219632196421965219662196721968219692197021971219722197321974219752197621977219782197921980219812198221983219842198521986219872198821989219902199121992219932199421995219962199721998219992200022001220022200322004220052200622007220082200922010220112201222013220142201522016220172201822019220202202122022220232202422025220262202722028220292203022031220322203322034220352203622037220382203922040220412204222043220442204522046220472204822049220502205122052220532205422055220562205722058220592206022061220622206322064220652206622067220682206922070220712207222073220742207522076220772207822079220802208122082220832208422085220862208722088220892209022091220922209322094220952209622097220982209922100221012210222103221042210522106221072210822109221102211122112221132211422115221162211722118221192212022121221222212322124221252212622127221282212922130221312213222133221342213522136221372213822139221402214122142221432214422145221462214722148221492215022151221522215322154221552215622157221582215922160221612216222163221642216522166221672216822169221702217122172221732217422175221762217722178221792218022181221822218322184221852218622187221882218922190221912219222193221942219522196221972219822199222002220122202222032220422205222062220722208222092221022211222122221322214222152221622217222182221922220222212222222223222242222522226222272222822229222302223122232222332223422235222362223722238222392224022241222422224322244222452224622247222482224922250222512225222253222542225522256222572225822259222602226122262222632226422265222662226722268222692227022271222722227322274222752227622277222782227922280222812228222283222842228522286222872228822289222902229122292222932229422295222962229722298222992230022301223022230322304223052230622307223082230922310223112231222313223142231522316223172231822319223202232122322223232232422325223262232722328223292233022331223322233322334223352233622337223382233922340223412234222343223442234522346223472234822349223502235122352223532235422355223562235722358223592236022361223622236322364223652236622367223682236922370223712237222373223742237522376223772237822379223802238122382223832238422385223862238722388223892239022391223922239322394223952239622397223982239922400224012240222403224042240522406224072240822409224102241122412224132241422415224162241722418224192242022421224222242322424224252242622427224282242922430224312243222433224342243522436224372243822439224402244122442224432244422445224462244722448224492245022451224522245322454224552245622457224582245922460224612246222463224642246522466224672246822469224702247122472224732247422475224762247722478224792248022481224822248322484224852248622487224882248922490224912249222493224942249522496224972249822499225002250122502225032250422505225062250722508225092251022511225122251322514225152251622517225182251922520225212252222523225242252522526225272252822529225302253122532225332253422535225362253722538225392254022541225422254322544225452254622547225482254922550225512255222553225542255522556225572255822559225602256122562225632256422565225662256722568225692257022571225722257322574225752257622577225782257922580225812258222583225842258522586225872258822589225902259122592225932259422595225962259722598225992260022601226022260322604226052260622607226082260922610226112261222613226142261522616226172261822619226202262122622226232262422625226262262722628226292263022631226322263322634226352263622637226382263922640226412264222643226442264522646226472264822649226502265122652226532265422655226562265722658226592266022661226622266322664226652266622667226682266922670226712267222673226742267522676226772267822679226802268122682226832268422685226862268722688226892269022691226922269322694226952269622697226982269922700227012270222703227042270522706227072270822709227102271122712227132271422715227162271722718227192272022721227222272322724227252272622727227282272922730227312273222733227342273522736227372273822739227402274122742227432274422745227462274722748227492275022751227522275322754227552275622757227582275922760227612276222763227642276522766227672276822769227702277122772227732277422775227762277722778227792278022781227822278322784227852278622787227882278922790227912279222793227942279522796227972279822799228002280122802228032280422805228062280722808228092281022811228122281322814228152281622817228182281922820228212282222823228242282522826228272282822829228302283122832228332283422835228362283722838228392284022841228422284322844228452284622847228482284922850228512285222853228542285522856228572285822859228602286122862228632286422865228662286722868228692287022871228722287322874228752287622877228782287922880228812288222883228842288522886228872288822889228902289122892228932289422895228962289722898228992290022901229022290322904229052290622907229082290922910229112291222913229142291522916229172291822919229202292122922229232292422925229262292722928229292293022931229322293322934229352293622937229382293922940229412294222943229442294522946229472294822949229502295122952229532295422955229562295722958229592296022961229622296322964229652296622967229682296922970229712297222973229742297522976229772297822979229802298122982229832298422985229862298722988229892299022991229922299322994229952299622997229982299923000230012300223003230042300523006230072300823009230102301123012230132301423015230162301723018230192302023021230222302323024230252302623027230282302923030230312303223033230342303523036230372303823039230402304123042230432304423045230462304723048230492305023051230522305323054230552305623057230582305923060230612306223063230642306523066230672306823069230702307123072230732307423075230762307723078230792308023081230822308323084230852308623087230882308923090230912309223093230942309523096230972309823099231002310123102231032310423105231062310723108231092311023111231122311323114231152311623117231182311923120231212312223123231242312523126231272312823129231302313123132231332313423135231362313723138231392314023141231422314323144231452314623147231482314923150231512315223153231542315523156231572315823159231602316123162231632316423165231662316723168231692317023171231722317323174231752317623177231782317923180231812318223183231842318523186231872318823189231902319123192231932319423195231962319723198231992320023201232022320323204232052320623207232082320923210232112321223213232142321523216232172321823219232202322123222232232322423225232262322723228232292323023231232322323323234232352323623237232382323923240232412324223243232442324523246232472324823249232502325123252232532325423255232562325723258232592326023261232622326323264232652326623267232682326923270232712327223273232742327523276232772327823279232802328123282232832328423285232862328723288232892329023291232922329323294232952329623297232982329923300233012330223303233042330523306233072330823309233102331123312233132331423315233162331723318233192332023321233222332323324233252332623327233282332923330233312333223333233342333523336233372333823339233402334123342233432334423345233462334723348233492335023351233522335323354233552335623357233582335923360233612336223363233642336523366233672336823369233702337123372233732337423375233762337723378233792338023381233822338323384233852338623387233882338923390233912339223393233942339523396233972339823399234002340123402234032340423405234062340723408234092341023411234122341323414234152341623417234182341923420234212342223423234242342523426234272342823429234302343123432234332343423435234362343723438234392344023441234422344323444234452344623447234482344923450234512345223453234542345523456234572345823459234602346123462234632346423465234662346723468234692347023471234722347323474234752347623477234782347923480234812348223483234842348523486234872348823489234902349123492234932349423495234962349723498234992350023501235022350323504235052350623507235082350923510235112351223513235142351523516235172351823519235202352123522235232352423525235262352723528235292353023531235322353323534235352353623537235382353923540235412354223543235442354523546235472354823549235502355123552235532355423555235562355723558235592356023561235622356323564235652356623567235682356923570235712357223573235742357523576235772357823579235802358123582235832358423585235862358723588235892359023591235922359323594235952359623597235982359923600236012360223603236042360523606236072360823609236102361123612236132361423615236162361723618236192362023621236222362323624236252362623627236282362923630236312363223633236342363523636236372363823639236402364123642236432364423645236462364723648236492365023651236522365323654236552365623657236582365923660236612366223663236642366523666236672366823669236702367123672236732367423675236762367723678236792368023681236822368323684236852368623687236882368923690236912369223693236942369523696236972369823699237002370123702237032370423705237062370723708237092371023711237122371323714237152371623717237182371923720237212372223723237242372523726237272372823729237302373123732237332373423735237362373723738237392374023741237422374323744237452374623747237482374923750237512375223753237542375523756237572375823759237602376123762237632376423765237662376723768237692377023771237722377323774237752377623777237782377923780237812378223783237842378523786237872378823789237902379123792237932379423795237962379723798237992380023801238022380323804238052380623807238082380923810238112381223813238142381523816238172381823819238202382123822238232382423825238262382723828238292383023831238322383323834238352383623837238382383923840238412384223843238442384523846238472384823849238502385123852238532385423855238562385723858238592386023861238622386323864238652386623867238682386923870238712387223873238742387523876238772387823879238802388123882238832388423885238862388723888238892389023891238922389323894238952389623897238982389923900239012390223903239042390523906239072390823909239102391123912239132391423915239162391723918239192392023921239222392323924239252392623927239282392923930239312393223933239342393523936239372393823939239402394123942239432394423945239462394723948239492395023951239522395323954239552395623957239582395923960239612396223963239642396523966239672396823969239702397123972239732397423975239762397723978239792398023981239822398323984239852398623987239882398923990239912399223993239942399523996239972399823999240002400124002240032400424005240062400724008240092401024011240122401324014240152401624017240182401924020240212402224023240242402524026240272402824029240302403124032240332403424035240362403724038240392404024041240422404324044240452404624047240482404924050240512405224053240542405524056240572405824059240602406124062240632406424065240662406724068240692407024071240722407324074240752407624077240782407924080240812408224083240842408524086240872408824089240902409124092240932409424095240962409724098240992410024101241022410324104241052410624107241082410924110241112411224113241142411524116241172411824119241202412124122241232412424125241262412724128241292413024131241322413324134241352413624137241382413924140241412414224143241442414524146241472414824149241502415124152241532415424155241562415724158241592416024161241622416324164241652416624167241682416924170241712417224173241742417524176241772417824179241802418124182241832418424185241862418724188241892419024191241922419324194241952419624197241982419924200242012420224203242042420524206242072420824209242102421124212242132421424215242162421724218242192422024221242222422324224242252422624227242282422924230242312423224233242342423524236242372423824239242402424124242242432424424245242462424724248242492425024251242522425324254242552425624257242582425924260242612426224263242642426524266242672426824269242702427124272242732427424275242762427724278242792428024281242822428324284242852428624287242882428924290242912429224293242942429524296242972429824299243002430124302243032430424305243062430724308243092431024311243122431324314243152431624317243182431924320243212432224323243242432524326243272432824329243302433124332243332433424335243362433724338243392434024341243422434324344243452434624347243482434924350243512435224353243542435524356243572435824359243602436124362243632436424365243662436724368243692437024371243722437324374243752437624377243782437924380243812438224383243842438524386243872438824389243902439124392243932439424395243962439724398243992440024401244022440324404244052440624407244082440924410244112441224413244142441524416244172441824419244202442124422244232442424425244262442724428244292443024431244322443324434244352443624437244382443924440244412444224443244442444524446244472444824449244502445124452244532445424455244562445724458244592446024461244622446324464244652446624467244682446924470244712447224473244742447524476244772447824479244802448124482244832448424485244862448724488244892449024491244922449324494244952449624497244982449924500245012450224503245042450524506245072450824509245102451124512245132451424515245162451724518245192452024521245222452324524245252452624527245282452924530245312453224533245342453524536245372453824539245402454124542245432454424545245462454724548245492455024551245522455324554245552455624557245582455924560245612456224563245642456524566245672456824569245702457124572245732457424575245762457724578245792458024581245822458324584245852458624587245882458924590245912459224593245942459524596245972459824599246002460124602246032460424605246062460724608246092461024611246122461324614246152461624617246182461924620246212462224623246242462524626246272462824629246302463124632246332463424635246362463724638246392464024641246422464324644246452464624647246482464924650246512465224653246542465524656246572465824659246602466124662246632466424665246662466724668246692467024671246722467324674246752467624677246782467924680246812468224683246842468524686246872468824689246902469124692246932469424695246962469724698246992470024701247022470324704247052470624707247082470924710247112471224713247142471524716247172471824719247202472124722247232472424725247262472724728247292473024731247322473324734247352473624737247382473924740247412474224743247442474524746247472474824749247502475124752247532475424755247562475724758247592476024761247622476324764247652476624767247682476924770247712477224773247742477524776247772477824779247802478124782247832478424785247862478724788247892479024791247922479324794247952479624797247982479924800248012480224803248042480524806248072480824809248102481124812248132481424815248162481724818248192482024821248222482324824248252482624827248282482924830248312483224833248342483524836248372483824839248402484124842248432484424845248462484724848248492485024851248522485324854248552485624857248582485924860248612486224863248642486524866248672486824869248702487124872248732487424875248762487724878248792488024881248822488324884248852488624887248882488924890248912489224893248942489524896248972489824899249002490124902249032490424905249062490724908249092491024911249122491324914249152491624917249182491924920249212492224923249242492524926249272492824929249302493124932249332493424935249362493724938249392494024941249422494324944249452494624947249482494924950249512495224953249542495524956249572495824959249602496124962249632496424965249662496724968249692497024971249722497324974249752497624977249782497924980249812498224983249842498524986249872498824989249902499124992249932499424995249962499724998249992500025001250022500325004250052500625007250082500925010250112501225013250142501525016250172501825019250202502125022250232502425025250262502725028250292503025031250322503325034250352503625037250382503925040250412504225043250442504525046250472504825049250502505125052250532505425055250562505725058250592506025061250622506325064250652506625067250682506925070250712507225073250742507525076250772507825079250802508125082250832508425085250862508725088250892509025091250922509325094250952509625097250982509925100251012510225103251042510525106251072510825109251102511125112251132511425115251162511725118251192512025121251222512325124251252512625127251282512925130251312513225133251342513525136251372513825139251402514125142251432514425145251462514725148251492515025151251522515325154251552515625157251582515925160251612516225163251642516525166251672516825169251702517125172251732517425175251762517725178251792518025181251822518325184251852518625187251882518925190251912519225193251942519525196251972519825199252002520125202252032520425205252062520725208252092521025211252122521325214252152521625217252182521925220252212522225223252242522525226252272522825229252302523125232252332523425235252362523725238252392524025241252422524325244252452524625247252482524925250252512525225253252542525525256252572525825259252602526125262252632526425265252662526725268252692527025271252722527325274252752527625277252782527925280252812528225283252842528525286252872528825289252902529125292252932529425295252962529725298252992530025301253022530325304253052530625307253082530925310253112531225313253142531525316253172531825319253202532125322253232532425325253262532725328253292533025331253322533325334253352533625337253382533925340253412534225343253442534525346253472534825349253502535125352253532535425355253562535725358253592536025361253622536325364253652536625367253682536925370253712537225373253742537525376253772537825379253802538125382253832538425385253862538725388253892539025391253922539325394253952539625397253982539925400254012540225403254042540525406254072540825409254102541125412254132541425415254162541725418254192542025421254222542325424254252542625427254282542925430254312543225433254342543525436254372543825439254402544125442254432544425445254462544725448254492545025451254522545325454254552545625457254582545925460254612546225463254642546525466254672546825469254702547125472254732547425475254762547725478254792548025481254822548325484254852548625487254882548925490254912549225493254942549525496254972549825499255002550125502255032550425505255062550725508255092551025511255122551325514255152551625517255182551925520255212552225523255242552525526255272552825529255302553125532255332553425535255362553725538255392554025541255422554325544255452554625547255482554925550255512555225553255542555525556255572555825559255602556125562255632556425565255662556725568255692557025571255722557325574255752557625577255782557925580255812558225583255842558525586255872558825589255902559125592255932559425595255962559725598255992560025601256022560325604256052560625607256082560925610256112561225613256142561525616256172561825619256202562125622256232562425625256262562725628256292563025631256322563325634256352563625637256382563925640256412564225643256442564525646256472564825649256502565125652256532565425655256562565725658256592566025661256622566325664256652566625667256682566925670256712567225673256742567525676256772567825679256802568125682256832568425685256862568725688256892569025691256922569325694256952569625697256982569925700257012570225703257042570525706257072570825709257102571125712257132571425715257162571725718257192572025721257222572325724257252572625727257282572925730257312573225733257342573525736257372573825739257402574125742257432574425745257462574725748257492575025751257522575325754257552575625757257582575925760257612576225763257642576525766257672576825769257702577125772257732577425775257762577725778257792578025781257822578325784257852578625787257882578925790257912579225793257942579525796257972579825799258002580125802258032580425805258062580725808258092581025811258122581325814258152581625817258182581925820258212582225823258242582525826258272582825829258302583125832258332583425835258362583725838258392584025841258422584325844258452584625847258482584925850258512585225853258542585525856258572585825859258602586125862258632586425865258662586725868258692587025871258722587325874258752587625877258782587925880258812588225883258842588525886258872588825889258902589125892258932589425895258962589725898258992590025901259022590325904259052590625907259082590925910259112591225913259142591525916259172591825919259202592125922259232592425925259262592725928259292593025931259322593325934259352593625937259382593925940259412594225943259442594525946259472594825949259502595125952259532595425955259562595725958259592596025961259622596325964259652596625967259682596925970259712597225973259742597525976259772597825979259802598125982259832598425985259862598725988259892599025991259922599325994259952599625997259982599926000260012600226003260042600526006260072600826009260102601126012260132601426015260162601726018260192602026021260222602326024260252602626027260282602926030260312603226033260342603526036260372603826039260402604126042260432604426045260462604726048260492605026051260522605326054260552605626057260582605926060260612606226063260642606526066260672606826069260702607126072260732607426075260762607726078260792608026081260822608326084260852608626087260882608926090260912609226093260942609526096260972609826099261002610126102261032610426105261062610726108261092611026111261122611326114261152611626117261182611926120261212612226123261242612526126261272612826129261302613126132261332613426135261362613726138261392614026141261422614326144261452614626147261482614926150261512615226153261542615526156261572615826159261602616126162261632616426165261662616726168261692617026171261722617326174261752617626177261782617926180261812618226183261842618526186261872618826189261902619126192261932619426195261962619726198261992620026201262022620326204262052620626207262082620926210262112621226213262142621526216262172621826219262202622126222262232622426225262262622726228262292623026231262322623326234262352623626237262382623926240262412624226243262442624526246262472624826249262502625126252262532625426255262562625726258262592626026261262622626326264262652626626267262682626926270262712627226273262742627526276262772627826279262802628126282262832628426285262862628726288262892629026291262922629326294262952629626297262982629926300263012630226303263042630526306263072630826309263102631126312263132631426315263162631726318263192632026321263222632326324263252632626327263282632926330263312633226333263342633526336263372633826339263402634126342263432634426345263462634726348263492635026351263522635326354263552635626357263582635926360263612636226363263642636526366263672636826369263702637126372263732637426375263762637726378263792638026381263822638326384263852638626387263882638926390263912639226393263942639526396263972639826399264002640126402264032640426405264062640726408264092641026411264122641326414264152641626417264182641926420264212642226423264242642526426264272642826429264302643126432264332643426435264362643726438264392644026441264422644326444264452644626447264482644926450264512645226453264542645526456264572645826459264602646126462264632646426465264662646726468264692647026471264722647326474264752647626477264782647926480264812648226483264842648526486264872648826489264902649126492264932649426495264962649726498264992650026501265022650326504265052650626507265082650926510265112651226513265142651526516265172651826519265202652126522265232652426525265262652726528265292653026531265322653326534265352653626537265382653926540265412654226543265442654526546265472654826549265502655126552265532655426555265562655726558265592656026561265622656326564265652656626567265682656926570265712657226573265742657526576265772657826579265802658126582265832658426585265862658726588265892659026591265922659326594265952659626597265982659926600266012660226603266042660526606266072660826609266102661126612266132661426615266162661726618266192662026621266222662326624266252662626627266282662926630266312663226633266342663526636266372663826639266402664126642266432664426645266462664726648266492665026651266522665326654266552665626657266582665926660266612666226663266642666526666266672666826669266702667126672266732667426675266762667726678266792668026681266822668326684266852668626687266882668926690266912669226693266942669526696266972669826699267002670126702267032670426705267062670726708267092671026711267122671326714267152671626717267182671926720267212672226723267242672526726267272672826729267302673126732267332673426735267362673726738267392674026741267422674326744267452674626747267482674926750267512675226753267542675526756267572675826759267602676126762267632676426765267662676726768267692677026771267722677326774267752677626777267782677926780267812678226783267842678526786267872678826789267902679126792267932679426795267962679726798267992680026801268022680326804268052680626807268082680926810268112681226813268142681526816268172681826819268202682126822268232682426825268262682726828268292683026831268322683326834268352683626837268382683926840268412684226843268442684526846268472684826849268502685126852268532685426855268562685726858268592686026861268622686326864268652686626867268682686926870268712687226873268742687526876268772687826879268802688126882268832688426885268862688726888268892689026891268922689326894268952689626897268982689926900269012690226903269042690526906269072690826909269102691126912269132691426915269162691726918269192692026921269222692326924269252692626927269282692926930269312693226933269342693526936269372693826939269402694126942269432694426945269462694726948269492695026951269522695326954269552695626957269582695926960269612696226963269642696526966269672696826969269702697126972269732697426975269762697726978269792698026981269822698326984269852698626987269882698926990269912699226993269942699526996269972699826999270002700127002270032700427005270062700727008270092701027011270122701327014270152701627017270182701927020270212702227023270242702527026270272702827029270302703127032270332703427035270362703727038270392704027041270422704327044270452704627047270482704927050270512705227053270542705527056270572705827059270602706127062270632706427065270662706727068270692707027071270722707327074270752707627077270782707927080270812708227083270842708527086270872708827089270902709127092270932709427095270962709727098270992710027101271022710327104271052710627107271082710927110271112711227113271142711527116271172711827119271202712127122271232712427125271262712727128271292713027131271322713327134271352713627137271382713927140271412714227143271442714527146271472714827149271502715127152271532715427155271562715727158271592716027161271622716327164271652716627167271682716927170271712717227173271742717527176271772717827179271802718127182271832718427185271862718727188271892719027191271922719327194271952719627197271982719927200272012720227203272042720527206272072720827209272102721127212272132721427215272162721727218272192722027221272222722327224272252722627227272282722927230272312723227233272342723527236272372723827239272402724127242272432724427245272462724727248272492725027251272522725327254272552725627257272582725927260272612726227263272642726527266272672726827269272702727127272272732727427275272762727727278272792728027281272822728327284272852728627287272882728927290272912729227293272942729527296272972729827299273002730127302273032730427305273062730727308273092731027311273122731327314273152731627317273182731927320273212732227323273242732527326273272732827329273302733127332273332733427335273362733727338273392734027341273422734327344273452734627347273482734927350273512735227353273542735527356273572735827359273602736127362273632736427365273662736727368273692737027371273722737327374273752737627377273782737927380273812738227383273842738527386273872738827389273902739127392273932739427395273962739727398273992740027401274022740327404274052740627407274082740927410274112741227413274142741527416274172741827419274202742127422274232742427425274262742727428274292743027431274322743327434274352743627437274382743927440274412744227443274442744527446274472744827449274502745127452274532745427455274562745727458274592746027461274622746327464274652746627467274682746927470274712747227473274742747527476274772747827479274802748127482274832748427485274862748727488274892749027491274922749327494274952749627497274982749927500275012750227503275042750527506275072750827509275102751127512275132751427515275162751727518275192752027521275222752327524275252752627527275282752927530275312753227533275342753527536275372753827539275402754127542275432754427545275462754727548275492755027551275522755327554275552755627557275582755927560275612756227563275642756527566275672756827569275702757127572275732757427575275762757727578275792758027581275822758327584275852758627587275882758927590275912759227593275942759527596275972759827599276002760127602276032760427605276062760727608276092761027611276122761327614276152761627617276182761927620276212762227623276242762527626276272762827629276302763127632276332763427635276362763727638276392764027641276422764327644276452764627647276482764927650276512765227653276542765527656276572765827659276602766127662276632766427665276662766727668276692767027671276722767327674276752767627677276782767927680276812768227683276842768527686276872768827689276902769127692276932769427695276962769727698276992770027701277022770327704277052770627707277082770927710277112771227713277142771527716277172771827719277202772127722277232772427725277262772727728277292773027731277322773327734277352773627737277382773927740277412774227743277442774527746277472774827749277502775127752277532775427755277562775727758277592776027761277622776327764277652776627767277682776927770277712777227773277742777527776277772777827779277802778127782277832778427785277862778727788277892779027791277922779327794277952779627797277982779927800278012780227803278042780527806278072780827809278102781127812278132781427815278162781727818278192782027821278222782327824278252782627827278282782927830278312783227833278342783527836278372783827839278402784127842278432784427845278462784727848278492785027851278522785327854278552785627857278582785927860278612786227863278642786527866278672786827869278702787127872278732787427875278762787727878278792788027881278822788327884278852788627887278882788927890278912789227893278942789527896278972789827899279002790127902279032790427905279062790727908279092791027911279122791327914279152791627917279182791927920279212792227923279242792527926279272792827929279302793127932279332793427935279362793727938279392794027941279422794327944279452794627947279482794927950279512795227953279542795527956279572795827959279602796127962279632796427965279662796727968279692797027971279722797327974279752797627977279782797927980279812798227983279842798527986279872798827989279902799127992279932799427995279962799727998279992800028001280022800328004280052800628007280082800928010280112801228013280142801528016280172801828019280202802128022280232802428025280262802728028280292803028031280322803328034280352803628037280382803928040280412804228043280442804528046280472804828049280502805128052280532805428055280562805728058280592806028061280622806328064280652806628067280682806928070280712807228073280742807528076280772807828079280802808128082280832808428085280862808728088280892809028091280922809328094280952809628097280982809928100281012810228103281042810528106281072810828109281102811128112281132811428115281162811728118281192812028121281222812328124281252812628127281282812928130281312813228133281342813528136281372813828139281402814128142281432814428145281462814728148281492815028151281522815328154281552815628157281582815928160281612816228163281642816528166281672816828169281702817128172281732817428175281762817728178281792818028181281822818328184281852818628187281882818928190281912819228193281942819528196281972819828199282002820128202282032820428205282062820728208282092821028211282122821328214282152821628217282182821928220282212822228223282242822528226282272822828229282302823128232282332823428235282362823728238282392824028241282422824328244282452824628247282482824928250282512825228253282542825528256282572825828259282602826128262282632826428265282662826728268282692827028271282722827328274282752827628277282782827928280282812828228283282842828528286282872828828289282902829128292282932829428295282962829728298282992830028301283022830328304283052830628307283082830928310283112831228313283142831528316283172831828319283202832128322283232832428325283262832728328283292833028331283322833328334283352833628337283382833928340283412834228343283442834528346283472834828349283502835128352283532835428355283562835728358283592836028361283622836328364283652836628367283682836928370283712837228373283742837528376283772837828379283802838128382283832838428385283862838728388283892839028391283922839328394283952839628397283982839928400284012840228403284042840528406284072840828409284102841128412284132841428415284162841728418284192842028421284222842328424284252842628427284282842928430284312843228433284342843528436284372843828439284402844128442284432844428445284462844728448284492845028451284522845328454284552845628457284582845928460284612846228463284642846528466284672846828469284702847128472284732847428475284762847728478284792848028481284822848328484284852848628487284882848928490284912849228493284942849528496284972849828499285002850128502285032850428505285062850728508285092851028511285122851328514285152851628517285182851928520285212852228523285242852528526285272852828529285302853128532285332853428535285362853728538285392854028541285422854328544285452854628547285482854928550285512855228553285542855528556285572855828559285602856128562285632856428565285662856728568285692857028571285722857328574285752857628577285782857928580285812858228583285842858528586285872858828589285902859128592285932859428595285962859728598285992860028601286022860328604286052860628607286082860928610286112861228613286142861528616286172861828619286202862128622286232862428625286262862728628286292863028631286322863328634286352863628637286382863928640286412864228643286442864528646286472864828649286502865128652286532865428655286562865728658286592866028661286622866328664286652866628667286682866928670286712867228673286742867528676286772867828679286802868128682286832868428685286862868728688286892869028691286922869328694286952869628697286982869928700287012870228703287042870528706287072870828709287102871128712287132871428715287162871728718287192872028721287222872328724287252872628727287282872928730287312873228733287342873528736287372873828739287402874128742287432874428745287462874728748287492875028751287522875328754287552875628757287582875928760287612876228763287642876528766287672876828769287702877128772287732877428775287762877728778287792878028781287822878328784287852878628787287882878928790287912879228793287942879528796287972879828799288002880128802288032880428805288062880728808288092881028811288122881328814288152881628817288182881928820288212882228823288242882528826288272882828829288302883128832288332883428835288362883728838288392884028841288422884328844288452884628847288482884928850288512885228853288542885528856288572885828859288602886128862288632886428865288662886728868288692887028871288722887328874288752887628877288782887928880288812888228883288842888528886288872888828889288902889128892288932889428895288962889728898288992890028901289022890328904289052890628907289082890928910289112891228913289142891528916289172891828919289202892128922289232892428925289262892728928289292893028931289322893328934289352893628937289382893928940289412894228943289442894528946289472894828949289502895128952289532895428955289562895728958289592896028961289622896328964289652896628967289682896928970289712897228973289742897528976289772897828979289802898128982289832898428985289862898728988289892899028991289922899328994289952899628997289982899929000290012900229003290042900529006290072900829009290102901129012290132901429015290162901729018290192902029021290222902329024290252902629027290282902929030290312903229033290342903529036290372903829039290402904129042290432904429045290462904729048290492905029051290522905329054290552905629057290582905929060290612906229063290642906529066290672906829069290702907129072290732907429075290762907729078290792908029081290822908329084290852908629087290882908929090290912909229093290942909529096290972909829099291002910129102291032910429105291062910729108291092911029111291122911329114291152911629117291182911929120291212912229123291242912529126291272912829129291302913129132291332913429135291362913729138291392914029141291422914329144291452914629147291482914929150291512915229153291542915529156291572915829159291602916129162291632916429165291662916729168291692917029171291722917329174291752917629177291782917929180291812918229183291842918529186291872918829189291902919129192291932919429195291962919729198291992920029201292022920329204292052920629207292082920929210292112921229213292142921529216292172921829219292202922129222292232922429225292262922729228292292923029231292322923329234292352923629237292382923929240292412924229243292442924529246292472924829249292502925129252292532925429255292562925729258292592926029261292622926329264292652926629267292682926929270292712927229273292742927529276292772927829279292802928129282292832928429285292862928729288292892929029291292922929329294292952929629297292982929929300293012930229303293042930529306293072930829309293102931129312293132931429315293162931729318293192932029321293222932329324293252932629327293282932929330293312933229333293342933529336293372933829339293402934129342293432934429345293462934729348293492935029351293522935329354293552935629357293582935929360293612936229363293642936529366293672936829369293702937129372293732937429375293762937729378293792938029381293822938329384293852938629387293882938929390293912939229393293942939529396293972939829399294002940129402294032940429405294062940729408294092941029411294122941329414294152941629417294182941929420294212942229423294242942529426294272942829429294302943129432294332943429435294362943729438294392944029441294422944329444294452944629447294482944929450294512945229453294542945529456294572945829459294602946129462294632946429465294662946729468294692947029471294722947329474294752947629477294782947929480294812948229483294842948529486294872948829489294902949129492294932949429495294962949729498294992950029501295022950329504295052950629507295082950929510295112951229513295142951529516295172951829519295202952129522295232952429525295262952729528295292953029531295322953329534295352953629537295382953929540295412954229543295442954529546295472954829549295502955129552295532955429555295562955729558295592956029561295622956329564295652956629567295682956929570295712957229573295742957529576295772957829579295802958129582295832958429585295862958729588295892959029591295922959329594295952959629597295982959929600296012960229603296042960529606296072960829609296102961129612296132961429615296162961729618296192962029621296222962329624296252962629627296282962929630296312963229633296342963529636296372963829639296402964129642296432964429645296462964729648296492965029651296522965329654296552965629657296582965929660296612966229663296642966529666296672966829669296702967129672296732967429675296762967729678296792968029681296822968329684296852968629687296882968929690296912969229693296942969529696296972969829699297002970129702297032970429705297062970729708297092971029711297122971329714297152971629717297182971929720297212972229723297242972529726297272972829729297302973129732297332973429735297362973729738297392974029741297422974329744297452974629747297482974929750297512975229753297542975529756297572975829759297602976129762297632976429765297662976729768297692977029771297722977329774297752977629777297782977929780297812978229783297842978529786297872978829789297902979129792297932979429795297962979729798297992980029801298022980329804298052980629807298082980929810298112981229813298142981529816298172981829819298202982129822298232982429825298262982729828298292983029831298322983329834298352983629837298382983929840298412984229843298442984529846298472984829849298502985129852298532985429855298562985729858298592986029861298622986329864298652986629867298682986929870298712987229873298742987529876298772987829879298802988129882298832988429885298862988729888298892989029891298922989329894298952989629897298982989929900299012990229903299042990529906299072990829909299102991129912299132991429915299162991729918299192992029921299222992329924299252992629927299282992929930299312993229933299342993529936299372993829939299402994129942299432994429945299462994729948299492995029951299522995329954299552995629957299582995929960299612996229963299642996529966299672996829969299702997129972299732997429975299762997729978299792998029981299822998329984299852998629987299882998929990299912999229993299942999529996299972999829999300003000130002300033000430005300063000730008300093001030011300123001330014300153001630017300183001930020300213002230023300243002530026300273002830029300303003130032300333003430035300363003730038300393004030041300423004330044300453004630047300483004930050300513005230053300543005530056300573005830059300603006130062300633006430065300663006730068300693007030071300723007330074300753007630077300783007930080300813008230083300843008530086300873008830089300903009130092300933009430095300963009730098300993010030101301023010330104301053010630107301083010930110301113011230113301143011530116301173011830119301203012130122301233012430125301263012730128301293013030131301323013330134301353013630137301383013930140301413014230143301443014530146301473014830149301503015130152301533015430155301563015730158301593016030161301623016330164301653016630167301683016930170301713017230173301743017530176301773017830179301803018130182301833018430185301863018730188301893019030191301923019330194301953019630197301983019930200302013020230203302043020530206302073020830209302103021130212302133021430215302163021730218302193022030221302223022330224302253022630227302283022930230302313023230233302343023530236302373023830239302403024130242302433024430245302463024730248302493025030251302523025330254302553025630257302583025930260302613026230263302643026530266302673026830269302703027130272302733027430275302763027730278302793028030281302823028330284302853028630287302883028930290302913029230293302943029530296302973029830299303003030130302303033030430305303063030730308303093031030311303123031330314303153031630317303183031930320303213032230323303243032530326303273032830329303303033130332303333033430335303363033730338303393034030341303423034330344303453034630347303483034930350303513035230353303543035530356303573035830359303603036130362303633036430365303663036730368303693037030371303723037330374303753037630377303783037930380303813038230383303843038530386303873038830389303903039130392303933039430395303963039730398303993040030401304023040330404304053040630407304083040930410304113041230413304143041530416304173041830419304203042130422304233042430425304263042730428304293043030431304323043330434304353043630437304383043930440304413044230443304443044530446304473044830449304503045130452304533045430455304563045730458304593046030461304623046330464304653046630467304683046930470304713047230473304743047530476304773047830479304803048130482304833048430485304863048730488304893049030491304923049330494304953049630497304983049930500305013050230503305043050530506305073050830509305103051130512305133051430515305163051730518305193052030521305223052330524305253052630527305283052930530305313053230533305343053530536305373053830539305403054130542305433054430545305463054730548305493055030551305523055330554305553055630557305583055930560305613056230563305643056530566305673056830569305703057130572305733057430575305763057730578305793058030581305823058330584305853058630587305883058930590305913059230593305943059530596305973059830599306003060130602306033060430605306063060730608306093061030611306123061330614306153061630617306183061930620306213062230623306243062530626306273062830629306303063130632306333063430635306363063730638306393064030641306423064330644306453064630647306483064930650306513065230653306543065530656306573065830659306603066130662306633066430665306663066730668306693067030671306723067330674306753067630677306783067930680306813068230683306843068530686306873068830689306903069130692306933069430695306963069730698306993070030701307023070330704307053070630707307083070930710307113071230713307143071530716307173071830719307203072130722307233072430725307263072730728307293073030731307323073330734307353073630737307383073930740307413074230743307443074530746307473074830749307503075130752307533075430755307563075730758307593076030761307623076330764307653076630767307683076930770307713077230773307743077530776307773077830779307803078130782307833078430785307863078730788307893079030791307923079330794307953079630797307983079930800308013080230803308043080530806308073080830809308103081130812308133081430815308163081730818308193082030821308223082330824308253082630827308283082930830308313083230833308343083530836308373083830839308403084130842308433084430845308463084730848308493085030851308523085330854308553085630857308583085930860308613086230863308643086530866308673086830869308703087130872308733087430875308763087730878308793088030881308823088330884308853088630887308883088930890308913089230893308943089530896308973089830899309003090130902309033090430905309063090730908309093091030911309123091330914309153091630917309183091930920309213092230923309243092530926309273092830929309303093130932309333093430935309363093730938309393094030941309423094330944309453094630947309483094930950309513095230953309543095530956309573095830959309603096130962309633096430965309663096730968309693097030971309723097330974309753097630977309783097930980309813098230983309843098530986309873098830989309903099130992309933099430995309963099730998309993100031001310023100331004310053100631007310083100931010310113101231013310143101531016310173101831019310203102131022310233102431025310263102731028310293103031031310323103331034310353103631037310383103931040310413104231043310443104531046310473104831049310503105131052310533105431055310563105731058310593106031061310623106331064310653106631067310683106931070310713107231073310743107531076310773107831079310803108131082310833108431085310863108731088310893109031091310923109331094310953109631097310983109931100311013110231103311043110531106311073110831109311103111131112311133111431115311163111731118311193112031121311223112331124311253112631127311283112931130311313113231133311343113531136311373113831139311403114131142311433114431145311463114731148311493115031151311523115331154311553115631157311583115931160311613116231163311643116531166311673116831169311703117131172311733117431175311763117731178311793118031181311823118331184311853118631187311883118931190311913119231193311943119531196311973119831199312003120131202312033120431205312063120731208312093121031211312123121331214312153121631217312183121931220312213122231223312243122531226312273122831229312303123131232312333123431235312363123731238312393124031241312423124331244312453124631247312483124931250312513125231253312543125531256312573125831259312603126131262312633126431265312663126731268312693127031271312723127331274312753127631277312783127931280312813128231283312843128531286312873128831289312903129131292312933129431295312963129731298312993130031301313023130331304313053130631307313083130931310313113131231313313143131531316313173131831319313203132131322313233132431325313263132731328313293133031331313323133331334313353133631337313383133931340313413134231343313443134531346313473134831349313503135131352313533135431355313563135731358313593136031361313623136331364313653136631367313683136931370313713137231373313743137531376313773137831379313803138131382313833138431385313863138731388313893139031391313923139331394313953139631397313983139931400314013140231403314043140531406314073140831409314103141131412314133141431415314163141731418314193142031421314223142331424314253142631427314283142931430314313143231433314343143531436314373143831439314403144131442314433144431445314463144731448314493145031451314523145331454314553145631457314583145931460314613146231463314643146531466314673146831469314703147131472314733147431475314763147731478314793148031481314823148331484314853148631487314883148931490314913149231493314943149531496314973149831499315003150131502315033150431505315063150731508315093151031511315123151331514315153151631517315183151931520315213152231523315243152531526315273152831529315303153131532315333153431535315363153731538315393154031541315423154331544315453154631547315483154931550315513155231553315543155531556315573155831559315603156131562315633156431565315663156731568315693157031571315723157331574315753157631577315783157931580315813158231583315843158531586315873158831589315903159131592315933159431595315963159731598315993160031601316023160331604316053160631607316083160931610316113161231613316143161531616316173161831619316203162131622316233162431625316263162731628316293163031631316323163331634316353163631637316383163931640316413164231643316443164531646316473164831649316503165131652316533165431655316563165731658316593166031661316623166331664316653166631667316683166931670316713167231673316743167531676316773167831679316803168131682316833168431685316863168731688316893169031691316923169331694316953169631697316983169931700317013170231703317043170531706317073170831709317103171131712317133171431715317163171731718317193172031721317223172331724317253172631727317283172931730317313173231733317343173531736317373173831739317403174131742317433174431745317463174731748317493175031751317523175331754317553175631757317583175931760317613176231763317643176531766317673176831769317703177131772317733177431775317763177731778317793178031781317823178331784317853178631787317883178931790317913179231793317943179531796317973179831799318003180131802318033180431805318063180731808318093181031811318123181331814318153181631817318183181931820318213182231823318243182531826318273182831829318303183131832318333183431835318363183731838318393184031841318423184331844318453184631847318483184931850318513185231853318543185531856318573185831859318603186131862318633186431865318663186731868318693187031871318723187331874318753187631877318783187931880318813188231883318843188531886318873188831889318903189131892318933189431895318963189731898318993190031901319023190331904319053190631907319083190931910319113191231913319143191531916319173191831919319203192131922319233192431925319263192731928319293193031931319323193331934319353193631937319383193931940319413194231943319443194531946319473194831949319503195131952319533195431955319563195731958319593196031961319623196331964319653196631967319683196931970319713197231973319743197531976319773197831979319803198131982319833198431985319863198731988319893199031991319923199331994319953199631997319983199932000320013200232003320043200532006320073200832009320103201132012320133201432015320163201732018320193202032021320223202332024320253202632027320283202932030320313203232033320343203532036320373203832039320403204132042320433204432045320463204732048320493205032051320523205332054320553205632057320583205932060320613206232063320643206532066320673206832069320703207132072320733207432075320763207732078320793208032081320823208332084320853208632087320883208932090320913209232093320943209532096320973209832099321003210132102321033210432105321063210732108321093211032111321123211332114321153211632117321183211932120321213212232123321243212532126321273212832129321303213132132321333213432135321363213732138321393214032141321423214332144321453214632147321483214932150321513215232153321543215532156321573215832159321603216132162321633216432165321663216732168321693217032171321723217332174321753217632177321783217932180321813218232183321843218532186321873218832189321903219132192321933219432195321963219732198321993220032201322023220332204322053220632207322083220932210322113221232213322143221532216322173221832219322203222132222322233222432225322263222732228322293223032231322323223332234322353223632237322383223932240322413224232243322443224532246322473224832249322503225132252322533225432255322563225732258322593226032261322623226332264322653226632267322683226932270322713227232273322743227532276322773227832279322803228132282322833228432285322863228732288322893229032291322923229332294322953229632297322983229932300323013230232303323043230532306323073230832309323103231132312323133231432315323163231732318323193232032321323223232332324323253232632327323283232932330323313233232333323343233532336323373233832339323403234132342323433234432345323463234732348323493235032351323523235332354323553235632357323583235932360323613236232363323643236532366323673236832369323703237132372323733237432375323763237732378323793238032381323823238332384323853238632387323883238932390323913239232393323943239532396323973239832399324003240132402324033240432405324063240732408324093241032411324123241332414324153241632417324183241932420324213242232423324243242532426324273242832429324303243132432324333243432435324363243732438324393244032441324423244332444324453244632447324483244932450324513245232453324543245532456324573245832459324603246132462324633246432465324663246732468324693247032471324723247332474324753247632477324783247932480324813248232483324843248532486324873248832489324903249132492324933249432495324963249732498324993250032501325023250332504325053250632507325083250932510325113251232513325143251532516325173251832519325203252132522325233252432525325263252732528325293253032531325323253332534325353253632537325383253932540325413254232543325443254532546325473254832549325503255132552325533255432555325563255732558325593256032561325623256332564325653256632567325683256932570325713257232573325743257532576325773257832579325803258132582325833258432585325863258732588325893259032591325923259332594325953259632597325983259932600326013260232603326043260532606326073260832609326103261132612326133261432615326163261732618326193262032621326223262332624326253262632627326283262932630326313263232633326343263532636326373263832639326403264132642326433264432645326463264732648326493265032651326523265332654326553265632657326583265932660326613266232663326643266532666326673266832669326703267132672326733267432675326763267732678326793268032681326823268332684326853268632687326883268932690326913269232693326943269532696326973269832699327003270132702327033270432705327063270732708327093271032711327123271332714327153271632717327183271932720327213272232723327243272532726327273272832729327303273132732327333273432735327363273732738327393274032741327423274332744327453274632747327483274932750327513275232753327543275532756327573275832759327603276132762327633276432765327663276732768327693277032771327723277332774327753277632777327783277932780327813278232783327843278532786327873278832789327903279132792327933279432795327963279732798327993280032801328023280332804328053280632807328083280932810328113281232813328143281532816328173281832819328203282132822328233282432825328263282732828328293283032831328323283332834328353283632837328383283932840328413284232843328443284532846328473284832849328503285132852328533285432855328563285732858328593286032861328623286332864328653286632867328683286932870328713287232873328743287532876328773287832879328803288132882328833288432885328863288732888328893289032891328923289332894328953289632897328983289932900329013290232903329043290532906329073290832909329103291132912329133291432915329163291732918329193292032921329223292332924329253292632927329283292932930329313293232933329343293532936329373293832939329403294132942329433294432945329463294732948329493295032951329523295332954329553295632957329583295932960329613296232963329643296532966329673296832969329703297132972329733297432975329763297732978329793298032981329823298332984329853298632987329883298932990329913299232993329943299532996329973299832999330003300133002330033300433005330063300733008330093301033011330123301333014330153301633017330183301933020330213302233023330243302533026330273302833029330303303133032330333303433035330363303733038330393304033041330423304333044330453304633047330483304933050330513305233053330543305533056330573305833059330603306133062330633306433065330663306733068330693307033071330723307333074330753307633077330783307933080330813308233083330843308533086330873308833089330903309133092330933309433095330963309733098330993310033101331023310333104331053310633107331083310933110331113311233113331143311533116331173311833119331203312133122331233312433125331263312733128331293313033131331323313333134331353313633137331383313933140331413314233143331443314533146331473314833149331503315133152331533315433155331563315733158331593316033161331623316333164331653316633167331683316933170331713317233173331743317533176331773317833179331803318133182331833318433185331863318733188331893319033191331923319333194331953319633197331983319933200332013320233203332043320533206332073320833209332103321133212332133321433215332163321733218332193322033221332223322333224332253322633227332283322933230332313323233233332343323533236332373323833239332403324133242332433324433245332463324733248332493325033251332523325333254332553325633257332583325933260332613326233263332643326533266332673326833269332703327133272332733327433275332763327733278332793328033281332823328333284332853328633287332883328933290332913329233293332943329533296332973329833299333003330133302333033330433305333063330733308333093331033311333123331333314333153331633317333183331933320333213332233323333243332533326333273332833329333303333133332333333333433335333363333733338333393334033341333423334333344333453334633347333483334933350333513335233353333543335533356333573335833359333603336133362333633336433365333663336733368333693337033371333723337333374333753337633377333783337933380333813338233383333843338533386333873338833389333903339133392333933339433395333963339733398333993340033401334023340333404334053340633407334083340933410334113341233413334143341533416334173341833419334203342133422334233342433425334263342733428334293343033431334323343333434334353343633437334383343933440334413344233443334443344533446334473344833449334503345133452334533345433455334563345733458334593346033461334623346333464334653346633467334683346933470334713347233473334743347533476334773347833479334803348133482334833348433485334863348733488334893349033491334923349333494334953349633497334983349933500335013350233503335043350533506335073350833509335103351133512335133351433515335163351733518335193352033521335223352333524335253352633527335283352933530335313353233533335343353533536335373353833539335403354133542335433354433545335463354733548335493355033551335523355333554335553355633557335583355933560335613356233563335643356533566335673356833569335703357133572335733357433575335763357733578335793358033581335823358333584335853358633587335883358933590335913359233593335943359533596335973359833599336003360133602336033360433605336063360733608336093361033611336123361333614336153361633617336183361933620336213362233623336243362533626336273362833629336303363133632336333363433635336363363733638336393364033641336423364333644336453364633647336483364933650336513365233653336543365533656336573365833659336603366133662336633366433665336663366733668336693367033671336723367333674336753367633677336783367933680336813368233683336843368533686336873368833689336903369133692336933369433695336963369733698336993370033701337023370333704337053370633707337083370933710337113371233713337143371533716337173371833719337203372133722337233372433725337263372733728337293373033731337323373333734337353373633737337383373933740337413374233743337443374533746337473374833749337503375133752337533375433755337563375733758337593376033761337623376333764337653376633767337683376933770337713377233773337743377533776337773377833779337803378133782337833378433785337863378733788337893379033791337923379333794337953379633797337983379933800338013380233803338043380533806338073380833809338103381133812338133381433815338163381733818338193382033821338223382333824338253382633827338283382933830338313383233833338343383533836338373383833839338403384133842338433384433845338463384733848338493385033851338523385333854338553385633857338583385933860338613386233863338643386533866338673386833869338703387133872338733387433875338763387733878338793388033881338823388333884338853388633887338883388933890338913389233893338943389533896338973389833899339003390133902339033390433905339063390733908339093391033911339123391333914339153391633917339183391933920339213392233923339243392533926339273392833929339303393133932339333393433935339363393733938339393394033941339423394333944339453394633947339483394933950339513395233953339543395533956339573395833959339603396133962339633396433965339663396733968339693397033971339723397333974339753397633977339783397933980339813398233983339843398533986339873398833989339903399133992339933399433995339963399733998339993400034001340023400334004340053400634007340083400934010340113401234013340143401534016340173401834019340203402134022340233402434025340263402734028340293403034031340323403334034340353403634037340383403934040340413404234043340443404534046340473404834049340503405134052340533405434055340563405734058340593406034061340623406334064340653406634067340683406934070340713407234073340743407534076340773407834079340803408134082340833408434085340863408734088340893409034091340923409334094340953409634097340983409934100341013410234103341043410534106341073410834109341103411134112341133411434115341163411734118341193412034121341223412334124341253412634127341283412934130341313413234133341343413534136341373413834139341403414134142341433414434145341463414734148341493415034151341523415334154341553415634157341583415934160341613416234163341643416534166341673416834169341703417134172341733417434175341763417734178341793418034181341823418334184341853418634187341883418934190341913419234193341943419534196341973419834199342003420134202342033420434205342063420734208342093421034211342123421334214342153421634217342183421934220342213422234223342243422534226342273422834229342303423134232342333423434235342363423734238342393424034241342423424334244342453424634247342483424934250342513425234253342543425534256342573425834259342603426134262342633426434265342663426734268342693427034271342723427334274342753427634277342783427934280342813428234283342843428534286342873428834289342903429134292342933429434295342963429734298342993430034301343023430334304343053430634307343083430934310343113431234313343143431534316343173431834319343203432134322343233432434325343263432734328343293433034331343323433334334343353433634337343383433934340343413434234343343443434534346343473434834349343503435134352343533435434355343563435734358343593436034361343623436334364343653436634367343683436934370343713437234373343743437534376343773437834379343803438134382343833438434385343863438734388343893439034391343923439334394343953439634397343983439934400344013440234403344043440534406344073440834409344103441134412344133441434415344163441734418344193442034421344223442334424344253442634427344283442934430344313443234433344343443534436344373443834439344403444134442344433444434445344463444734448344493445034451344523445334454344553445634457344583445934460344613446234463344643446534466344673446834469344703447134472344733447434475344763447734478344793448034481344823448334484344853448634487344883448934490344913449234493344943449534496344973449834499345003450134502345033450434505345063450734508345093451034511345123451334514345153451634517345183451934520345213452234523345243452534526345273452834529345303453134532345333453434535345363453734538345393454034541345423454334544345453454634547345483454934550345513455234553345543455534556345573455834559345603456134562345633456434565345663456734568345693457034571345723457334574345753457634577345783457934580345813458234583345843458534586345873458834589345903459134592345933459434595345963459734598345993460034601346023460334604346053460634607346083460934610346113461234613346143461534616346173461834619346203462134622346233462434625346263462734628346293463034631346323463334634346353463634637346383463934640346413464234643346443464534646346473464834649346503465134652346533465434655346563465734658346593466034661346623466334664346653466634667346683466934670346713467234673346743467534676346773467834679346803468134682346833468434685346863468734688346893469034691346923469334694346953469634697346983469934700347013470234703347043470534706347073470834709347103471134712347133471434715347163471734718347193472034721347223472334724347253472634727347283472934730347313473234733347343473534736347373473834739347403474134742347433474434745347463474734748347493475034751347523475334754347553475634757347583475934760347613476234763347643476534766347673476834769347703477134772347733477434775347763477734778347793478034781347823478334784347853478634787347883478934790347913479234793347943479534796347973479834799348003480134802348033480434805348063480734808348093481034811348123481334814348153481634817348183481934820348213482234823348243482534826348273482834829348303483134832348333483434835348363483734838348393484034841348423484334844348453484634847348483484934850348513485234853348543485534856348573485834859348603486134862348633486434865348663486734868348693487034871348723487334874348753487634877348783487934880348813488234883348843488534886348873488834889348903489134892348933489434895348963489734898348993490034901349023490334904349053490634907349083490934910349113491234913349143491534916349173491834919349203492134922349233492434925349263492734928349293493034931349323493334934349353493634937349383493934940349413494234943349443494534946349473494834949349503495134952349533495434955349563495734958349593496034961349623496334964349653496634967349683496934970349713497234973349743497534976349773497834979349803498134982349833498434985349863498734988349893499034991349923499334994349953499634997349983499935000350013500235003350043500535006350073500835009350103501135012350133501435015350163501735018350193502035021350223502335024350253502635027350283502935030350313503235033350343503535036350373503835039350403504135042350433504435045350463504735048350493505035051350523505335054350553505635057350583505935060350613506235063350643506535066350673506835069350703507135072350733507435075350763507735078350793508035081350823508335084350853508635087350883508935090350913509235093350943509535096350973509835099351003510135102351033510435105351063510735108351093511035111351123511335114351153511635117351183511935120351213512235123351243512535126351273512835129351303513135132351333513435135351363513735138351393514035141351423514335144351453514635147351483514935150351513515235153351543515535156351573515835159351603516135162351633516435165351663516735168351693517035171351723517335174351753517635177351783517935180351813518235183351843518535186351873518835189351903519135192351933519435195351963519735198351993520035201352023520335204352053520635207352083520935210352113521235213352143521535216352173521835219352203522135222352233522435225352263522735228352293523035231352323523335234352353523635237352383523935240352413524235243352443524535246352473524835249352503525135252352533525435255352563525735258352593526035261352623526335264352653526635267352683526935270352713527235273352743527535276352773527835279352803528135282352833528435285352863528735288352893529035291352923529335294352953529635297352983529935300353013530235303353043530535306353073530835309353103531135312353133531435315353163531735318353193532035321353223532335324353253532635327353283532935330353313533235333353343533535336353373533835339353403534135342353433534435345353463534735348353493535035351353523535335354353553535635357353583535935360353613536235363353643536535366353673536835369353703537135372353733537435375353763537735378353793538035381353823538335384353853538635387353883538935390353913539235393353943539535396353973539835399354003540135402354033540435405354063540735408354093541035411354123541335414354153541635417354183541935420354213542235423354243542535426354273542835429354303543135432354333543435435354363543735438354393544035441354423544335444354453544635447354483544935450354513545235453354543545535456354573545835459354603546135462354633546435465354663546735468354693547035471354723547335474354753547635477354783547935480354813548235483354843548535486354873548835489354903549135492354933549435495354963549735498354993550035501355023550335504355053550635507355083550935510355113551235513355143551535516355173551835519355203552135522355233552435525355263552735528355293553035531355323553335534355353553635537355383553935540355413554235543355443554535546355473554835549355503555135552355533555435555355563555735558355593556035561355623556335564355653556635567355683556935570355713557235573355743557535576355773557835579355803558135582355833558435585355863558735588355893559035591355923559335594355953559635597355983559935600356013560235603356043560535606356073560835609356103561135612356133561435615356163561735618356193562035621356223562335624356253562635627356283562935630356313563235633356343563535636356373563835639356403564135642356433564435645356463564735648356493565035651356523565335654356553565635657356583565935660356613566235663356643566535666356673566835669356703567135672356733567435675356763567735678356793568035681356823568335684356853568635687356883568935690356913569235693356943569535696356973569835699357003570135702357033570435705357063570735708357093571035711357123571335714357153571635717357183571935720357213572235723357243572535726357273572835729357303573135732357333573435735357363573735738357393574035741357423574335744357453574635747357483574935750357513575235753357543575535756357573575835759357603576135762357633576435765357663576735768357693577035771357723577335774357753577635777357783577935780357813578235783357843578535786357873578835789357903579135792357933579435795357963579735798357993580035801358023580335804358053580635807358083580935810358113581235813358143581535816358173581835819358203582135822358233582435825358263582735828358293583035831358323583335834358353583635837358383583935840358413584235843358443584535846358473584835849358503585135852358533585435855358563585735858358593586035861358623586335864358653586635867358683586935870358713587235873358743587535876358773587835879358803588135882358833588435885358863588735888358893589035891358923589335894358953589635897358983589935900359013590235903359043590535906359073590835909359103591135912359133591435915359163591735918359193592035921359223592335924359253592635927359283592935930359313593235933359343593535936359373593835939359403594135942359433594435945359463594735948359493595035951359523595335954359553595635957359583595935960359613596235963359643596535966359673596835969359703597135972359733597435975359763597735978359793598035981359823598335984359853598635987359883598935990359913599235993359943599535996359973599835999360003600136002360033600436005360063600736008360093601036011360123601336014360153601636017360183601936020360213602236023360243602536026360273602836029360303603136032360333603436035360363603736038360393604036041360423604336044360453604636047360483604936050360513605236053360543605536056360573605836059360603606136062360633606436065360663606736068360693607036071360723607336074360753607636077360783607936080360813608236083360843608536086360873608836089360903609136092360933609436095360963609736098360993610036101361023610336104361053610636107361083610936110361113611236113361143611536116361173611836119361203612136122361233612436125361263612736128361293613036131361323613336134361353613636137361383613936140361413614236143361443614536146361473614836149361503615136152361533615436155361563615736158361593616036161361623616336164361653616636167361683616936170361713617236173361743617536176361773617836179361803618136182361833618436185361863618736188361893619036191361923619336194361953619636197361983619936200362013620236203362043620536206362073620836209362103621136212362133621436215362163621736218362193622036221362223622336224362253622636227362283622936230362313623236233362343623536236362373623836239362403624136242362433624436245362463624736248362493625036251362523625336254362553625636257362583625936260362613626236263362643626536266362673626836269362703627136272362733627436275362763627736278362793628036281362823628336284362853628636287362883628936290362913629236293362943629536296362973629836299363003630136302363033630436305363063630736308363093631036311363123631336314363153631636317363183631936320363213632236323363243632536326363273632836329363303633136332363333633436335363363633736338363393634036341363423634336344363453634636347363483634936350363513635236353363543635536356363573635836359363603636136362363633636436365363663636736368363693637036371363723637336374363753637636377363783637936380363813638236383363843638536386363873638836389363903639136392363933639436395363963639736398363993640036401364023640336404364053640636407364083640936410364113641236413364143641536416364173641836419364203642136422364233642436425364263642736428364293643036431364323643336434364353643636437364383643936440364413644236443364443644536446364473644836449364503645136452364533645436455364563645736458364593646036461364623646336464364653646636467364683646936470364713647236473364743647536476364773647836479364803648136482364833648436485364863648736488364893649036491364923649336494364953649636497364983649936500365013650236503365043650536506365073650836509365103651136512365133651436515365163651736518365193652036521365223652336524365253652636527365283652936530365313653236533365343653536536365373653836539365403654136542365433654436545365463654736548365493655036551365523655336554365553655636557365583655936560365613656236563365643656536566365673656836569365703657136572365733657436575365763657736578365793658036581365823658336584365853658636587365883658936590365913659236593365943659536596365973659836599366003660136602366033660436605366063660736608366093661036611366123661336614366153661636617366183661936620366213662236623366243662536626366273662836629366303663136632366333663436635366363663736638366393664036641366423664336644366453664636647366483664936650366513665236653366543665536656366573665836659366603666136662366633666436665366663666736668366693667036671366723667336674366753667636677366783667936680366813668236683366843668536686366873668836689366903669136692366933669436695366963669736698366993670036701367023670336704367053670636707367083670936710367113671236713367143671536716367173671836719367203672136722367233672436725367263672736728367293673036731367323673336734367353673636737367383673936740367413674236743367443674536746367473674836749367503675136752367533675436755367563675736758367593676036761367623676336764367653676636767367683676936770367713677236773367743677536776367773677836779367803678136782367833678436785367863678736788367893679036791367923679336794367953679636797367983679936800368013680236803368043680536806368073680836809368103681136812368133681436815368163681736818368193682036821368223682336824368253682636827368283682936830368313683236833368343683536836368373683836839368403684136842368433684436845368463684736848368493685036851368523685336854368553685636857368583685936860368613686236863368643686536866368673686836869368703687136872368733687436875368763687736878368793688036881368823688336884368853688636887368883688936890368913689236893368943689536896368973689836899369003690136902369033690436905369063690736908369093691036911369123691336914369153691636917369183691936920369213692236923369243692536926369273692836929369303693136932369333693436935369363693736938369393694036941369423694336944369453694636947369483694936950369513695236953369543695536956369573695836959369603696136962369633696436965369663696736968369693697036971369723697336974369753697636977369783697936980369813698236983369843698536986369873698836989369903699136992369933699436995369963699736998369993700037001370023700337004370053700637007370083700937010370113701237013370143701537016370173701837019370203702137022370233702437025370263702737028370293703037031370323703337034370353703637037370383703937040370413704237043370443704537046370473704837049370503705137052370533705437055370563705737058370593706037061370623706337064370653706637067370683706937070370713707237073370743707537076370773707837079370803708137082370833708437085370863708737088370893709037091370923709337094370953709637097370983709937100371013710237103371043710537106371073710837109371103711137112371133711437115371163711737118371193712037121371223712337124371253712637127371283712937130371313713237133371343713537136371373713837139371403714137142371433714437145371463714737148371493715037151371523715337154371553715637157371583715937160371613716237163371643716537166371673716837169371703717137172371733717437175371763717737178371793718037181371823718337184371853718637187371883718937190371913719237193371943719537196371973719837199372003720137202372033720437205372063720737208372093721037211372123721337214372153721637217372183721937220372213722237223372243722537226372273722837229372303723137232372333723437235372363723737238372393724037241372423724337244372453724637247372483724937250372513725237253372543725537256372573725837259372603726137262372633726437265372663726737268372693727037271372723727337274372753727637277372783727937280372813728237283372843728537286372873728837289372903729137292372933729437295372963729737298372993730037301373023730337304373053730637307373083730937310373113731237313373143731537316373173731837319373203732137322373233732437325373263732737328373293733037331373323733337334373353733637337373383733937340373413734237343373443734537346373473734837349373503735137352373533735437355373563735737358373593736037361373623736337364373653736637367373683736937370373713737237373373743737537376373773737837379373803738137382373833738437385373863738737388373893739037391373923739337394373953739637397373983739937400374013740237403374043740537406374073740837409374103741137412374133741437415374163741737418374193742037421374223742337424374253742637427374283742937430374313743237433374343743537436374373743837439374403744137442374433744437445374463744737448374493745037451374523745337454374553745637457374583745937460374613746237463374643746537466374673746837469374703747137472374733747437475374763747737478374793748037481374823748337484374853748637487374883748937490374913749237493374943749537496374973749837499375003750137502375033750437505375063750737508375093751037511375123751337514375153751637517375183751937520375213752237523375243752537526375273752837529375303753137532375333753437535375363753737538375393754037541375423754337544375453754637547375483754937550375513755237553375543755537556375573755837559375603756137562375633756437565375663756737568375693757037571375723757337574375753757637577375783757937580375813758237583375843758537586375873758837589375903759137592375933759437595375963759737598375993760037601376023760337604376053760637607376083760937610376113761237613376143761537616376173761837619376203762137622376233762437625376263762737628376293763037631376323763337634376353763637637376383763937640376413764237643376443764537646376473764837649376503765137652376533765437655376563765737658376593766037661376623766337664376653766637667376683766937670376713767237673376743767537676376773767837679376803768137682376833768437685376863768737688376893769037691376923769337694376953769637697376983769937700377013770237703377043770537706377073770837709377103771137712377133771437715377163771737718377193772037721377223772337724377253772637727377283772937730377313773237733377343773537736377373773837739377403774137742377433774437745377463774737748377493775037751377523775337754377553775637757377583775937760377613776237763377643776537766377673776837769377703777137772377733777437775377763777737778377793778037781377823778337784377853778637787377883778937790377913779237793377943779537796377973779837799378003780137802378033780437805378063780737808378093781037811378123781337814378153781637817378183781937820378213782237823378243782537826378273782837829378303783137832378333783437835378363783737838378393784037841378423784337844378453784637847378483784937850378513785237853378543785537856378573785837859378603786137862378633786437865378663786737868378693787037871378723787337874378753787637877378783787937880378813788237883378843788537886378873788837889378903789137892378933789437895378963789737898378993790037901379023790337904379053790637907379083790937910379113791237913379143791537916379173791837919379203792137922379233792437925379263792737928379293793037931379323793337934379353793637937379383793937940379413794237943379443794537946379473794837949379503795137952379533795437955379563795737958379593796037961379623796337964379653796637967379683796937970379713797237973379743797537976379773797837979379803798137982379833798437985379863798737988379893799037991379923799337994379953799637997379983799938000380013800238003380043800538006380073800838009380103801138012380133801438015380163801738018380193802038021380223802338024380253802638027380283802938030380313803238033380343803538036380373803838039380403804138042380433804438045380463804738048380493805038051380523805338054380553805638057380583805938060380613806238063380643806538066380673806838069380703807138072380733807438075380763807738078380793808038081380823808338084380853808638087380883808938090380913809238093380943809538096380973809838099381003810138102381033810438105381063810738108381093811038111381123811338114381153811638117381183811938120381213812238123381243812538126381273812838129381303813138132381333813438135381363813738138381393814038141381423814338144381453814638147381483814938150381513815238153381543815538156381573815838159381603816138162381633816438165381663816738168381693817038171381723817338174381753817638177381783817938180381813818238183381843818538186381873818838189381903819138192381933819438195381963819738198381993820038201382023820338204382053820638207382083820938210382113821238213382143821538216382173821838219382203822138222382233822438225382263822738228382293823038231382323823338234382353823638237382383823938240382413824238243382443824538246382473824838249382503825138252382533825438255382563825738258382593826038261382623826338264382653826638267382683826938270382713827238273382743827538276382773827838279382803828138282382833828438285382863828738288382893829038291382923829338294382953829638297382983829938300383013830238303383043830538306383073830838309383103831138312383133831438315383163831738318383193832038321383223832338324383253832638327383283832938330383313833238333383343833538336383373833838339383403834138342383433834438345383463834738348383493835038351383523835338354383553835638357383583835938360383613836238363383643836538366383673836838369383703837138372383733837438375383763837738378383793838038381383823838338384383853838638387383883838938390383913839238393383943839538396383973839838399384003840138402384033840438405384063840738408384093841038411384123841338414384153841638417384183841938420384213842238423384243842538426384273842838429384303843138432384333843438435384363843738438384393844038441384423844338444384453844638447384483844938450384513845238453384543845538456384573845838459384603846138462384633846438465384663846738468384693847038471384723847338474384753847638477384783847938480384813848238483384843848538486384873848838489384903849138492384933849438495384963849738498384993850038501385023850338504385053850638507385083850938510385113851238513385143851538516385173851838519385203852138522385233852438525385263852738528385293853038531385323853338534385353853638537385383853938540385413854238543385443854538546385473854838549385503855138552385533855438555385563855738558385593856038561385623856338564385653856638567385683856938570385713857238573385743857538576385773857838579385803858138582385833858438585385863858738588385893859038591385923859338594385953859638597385983859938600386013860238603386043860538606386073860838609386103861138612386133861438615386163861738618386193862038621386223862338624386253862638627386283862938630386313863238633386343863538636386373863838639386403864138642386433864438645386463864738648386493865038651386523865338654386553865638657386583865938660386613866238663386643866538666386673866838669386703867138672386733867438675386763867738678386793868038681386823868338684386853868638687386883868938690386913869238693386943869538696386973869838699387003870138702387033870438705387063870738708387093871038711387123871338714387153871638717387183871938720387213872238723387243872538726387273872838729387303873138732387333873438735387363873738738387393874038741387423874338744387453874638747387483874938750387513875238753387543875538756387573875838759387603876138762387633876438765387663876738768387693877038771387723877338774387753877638777387783877938780387813878238783387843878538786387873878838789387903879138792387933879438795387963879738798387993880038801388023880338804388053880638807388083880938810388113881238813388143881538816388173881838819388203882138822388233882438825388263882738828388293883038831388323883338834388353883638837388383883938840388413884238843388443884538846388473884838849388503885138852388533885438855388563885738858388593886038861388623886338864388653886638867388683886938870388713887238873388743887538876388773887838879388803888138882388833888438885388863888738888388893889038891388923889338894388953889638897388983889938900389013890238903389043890538906389073890838909389103891138912389133891438915389163891738918389193892038921389223892338924389253892638927389283892938930389313893238933389343893538936389373893838939389403894138942389433894438945389463894738948389493895038951389523895338954389553895638957389583895938960389613896238963389643896538966389673896838969389703897138972389733897438975389763897738978389793898038981389823898338984389853898638987389883898938990389913899238993389943899538996389973899838999390003900139002390033900439005390063900739008390093901039011390123901339014390153901639017390183901939020390213902239023390243902539026390273902839029390303903139032390333903439035390363903739038390393904039041390423904339044390453904639047390483904939050390513905239053390543905539056390573905839059390603906139062390633906439065390663906739068390693907039071390723907339074390753907639077390783907939080390813908239083390843908539086390873908839089390903909139092390933909439095390963909739098390993910039101391023910339104391053910639107391083910939110391113911239113391143911539116391173911839119391203912139122391233912439125391263912739128391293913039131391323913339134391353913639137391383913939140391413914239143391443914539146391473914839149391503915139152391533915439155391563915739158391593916039161391623916339164391653916639167391683916939170391713917239173391743917539176391773917839179391803918139182391833918439185391863918739188391893919039191391923919339194391953919639197391983919939200392013920239203392043920539206392073920839209392103921139212392133921439215392163921739218392193922039221392223922339224392253922639227392283922939230392313923239233392343923539236392373923839239392403924139242392433924439245392463924739248392493925039251392523925339254392553925639257392583925939260392613926239263392643926539266392673926839269392703927139272392733927439275392763927739278392793928039281392823928339284392853928639287392883928939290392913929239293392943929539296392973929839299393003930139302393033930439305393063930739308393093931039311393123931339314393153931639317393183931939320393213932239323393243932539326393273932839329393303933139332393333933439335393363933739338393393934039341393423934339344393453934639347393483934939350393513935239353393543935539356393573935839359393603936139362393633936439365393663936739368393693937039371393723937339374393753937639377393783937939380393813938239383393843938539386393873938839389393903939139392393933939439395393963939739398393993940039401394023940339404394053940639407394083940939410394113941239413394143941539416394173941839419394203942139422394233942439425394263942739428394293943039431394323943339434394353943639437394383943939440394413944239443394443944539446394473944839449394503945139452394533945439455394563945739458394593946039461394623946339464394653946639467394683946939470394713947239473394743947539476394773947839479394803948139482394833948439485394863948739488394893949039491394923949339494394953949639497394983949939500395013950239503395043950539506395073950839509395103951139512395133951439515395163951739518395193952039521395223952339524395253952639527395283952939530395313953239533395343953539536395373953839539395403954139542395433954439545395463954739548395493955039551395523955339554395553955639557395583955939560395613956239563395643956539566395673956839569395703957139572395733957439575395763957739578395793958039581395823958339584395853958639587395883958939590395913959239593395943959539596395973959839599396003960139602396033960439605396063960739608396093961039611396123961339614396153961639617396183961939620396213962239623396243962539626396273962839629396303963139632396333963439635396363963739638396393964039641396423964339644396453964639647396483964939650396513965239653396543965539656396573965839659396603966139662396633966439665396663966739668396693967039671396723967339674396753967639677396783967939680396813968239683396843968539686396873968839689396903969139692396933969439695396963969739698396993970039701397023970339704397053970639707397083970939710397113971239713397143971539716397173971839719397203972139722397233972439725397263972739728397293973039731397323973339734397353973639737397383973939740397413974239743397443974539746397473974839749397503975139752397533975439755397563975739758397593976039761397623976339764397653976639767397683976939770397713977239773397743977539776397773977839779397803978139782397833978439785397863978739788397893979039791397923979339794397953979639797397983979939800398013980239803398043980539806398073980839809398103981139812398133981439815398163981739818398193982039821398223982339824398253982639827398283982939830398313983239833398343983539836398373983839839398403984139842398433984439845398463984739848398493985039851398523985339854398553985639857398583985939860398613986239863398643986539866398673986839869398703987139872398733987439875398763987739878398793988039881398823988339884398853988639887398883988939890398913989239893398943989539896398973989839899399003990139902399033990439905399063990739908399093991039911399123991339914399153991639917399183991939920399213992239923399243992539926399273992839929399303993139932399333993439935399363993739938399393994039941399423994339944399453994639947399483994939950399513995239953399543995539956399573995839959399603996139962399633996439965399663996739968399693997039971399723997339974399753997639977399783997939980399813998239983399843998539986399873998839989399903999139992399933999439995399963999739998399994000040001400024000340004400054000640007400084000940010400114001240013400144001540016400174001840019400204002140022400234002440025400264002740028400294003040031400324003340034400354003640037400384003940040400414004240043400444004540046400474004840049400504005140052400534005440055400564005740058400594006040061400624006340064400654006640067400684006940070400714007240073400744007540076400774007840079400804008140082400834008440085400864008740088400894009040091400924009340094400954009640097400984009940100401014010240103401044010540106401074010840109401104011140112401134011440115401164011740118401194012040121401224012340124401254012640127401284012940130401314013240133401344013540136401374013840139401404014140142401434014440145401464014740148401494015040151401524015340154401554015640157401584015940160401614016240163401644016540166401674016840169401704017140172401734017440175401764017740178401794018040181401824018340184401854018640187401884018940190401914019240193401944019540196401974019840199402004020140202402034020440205402064020740208402094021040211402124021340214402154021640217402184021940220402214022240223402244022540226402274022840229402304023140232402334023440235402364023740238402394024040241402424024340244402454024640247402484024940250402514025240253402544025540256402574025840259402604026140262402634026440265402664026740268402694027040271402724027340274402754027640277402784027940280402814028240283402844028540286402874028840289402904029140292402934029440295402964029740298402994030040301403024030340304403054030640307403084030940310403114031240313403144031540316403174031840319403204032140322403234032440325403264032740328403294033040331403324033340334403354033640337403384033940340403414034240343403444034540346403474034840349403504035140352403534035440355403564035740358403594036040361403624036340364403654036640367403684036940370403714037240373403744037540376403774037840379403804038140382403834038440385403864038740388403894039040391403924039340394403954039640397403984039940400404014040240403404044040540406404074040840409404104041140412404134041440415404164041740418404194042040421404224042340424404254042640427404284042940430404314043240433404344043540436404374043840439404404044140442404434044440445404464044740448404494045040451404524045340454404554045640457404584045940460404614046240463404644046540466404674046840469404704047140472404734047440475404764047740478404794048040481404824048340484404854048640487404884048940490404914049240493404944049540496404974049840499405004050140502405034050440505405064050740508405094051040511405124051340514405154051640517405184051940520405214052240523405244052540526405274052840529405304053140532405334053440535405364053740538405394054040541405424054340544405454054640547405484054940550405514055240553405544055540556405574055840559405604056140562405634056440565405664056740568405694057040571405724057340574405754057640577405784057940580405814058240583405844058540586405874058840589405904059140592405934059440595405964059740598405994060040601406024060340604406054060640607406084060940610406114061240613406144061540616406174061840619406204062140622406234062440625406264062740628406294063040631406324063340634406354063640637406384063940640406414064240643406444064540646406474064840649406504065140652406534065440655406564065740658406594066040661406624066340664406654066640667406684066940670406714067240673406744067540676406774067840679406804068140682406834068440685406864068740688406894069040691406924069340694406954069640697406984069940700407014070240703407044070540706407074070840709407104071140712407134071440715407164071740718407194072040721407224072340724407254072640727407284072940730407314073240733407344073540736407374073840739407404074140742407434074440745407464074740748407494075040751407524075340754407554075640757407584075940760407614076240763407644076540766407674076840769407704077140772407734077440775407764077740778407794078040781407824078340784407854078640787407884078940790407914079240793407944079540796407974079840799408004080140802408034080440805408064080740808408094081040811408124081340814408154081640817408184081940820408214082240823408244082540826408274082840829408304083140832408334083440835408364083740838408394084040841408424084340844408454084640847408484084940850408514085240853408544085540856408574085840859408604086140862408634086440865408664086740868408694087040871408724087340874408754087640877408784087940880408814088240883408844088540886408874088840889408904089140892408934089440895408964089740898408994090040901409024090340904409054090640907409084090940910409114091240913409144091540916409174091840919409204092140922409234092440925409264092740928409294093040931409324093340934409354093640937409384093940940409414094240943409444094540946409474094840949409504095140952409534095440955409564095740958409594096040961409624096340964409654096640967409684096940970409714097240973409744097540976409774097840979409804098140982409834098440985409864098740988409894099040991409924099340994409954099640997409984099941000410014100241003410044100541006410074100841009410104101141012410134101441015410164101741018410194102041021410224102341024410254102641027410284102941030410314103241033410344103541036410374103841039410404104141042410434104441045410464104741048410494105041051410524105341054410554105641057410584105941060410614106241063410644106541066410674106841069410704107141072410734107441075410764107741078410794108041081410824108341084410854108641087410884108941090410914109241093410944109541096410974109841099411004110141102411034110441105411064110741108411094111041111411124111341114411154111641117411184111941120411214112241123411244112541126411274112841129411304113141132411334113441135411364113741138411394114041141411424114341144411454114641147411484114941150411514115241153411544115541156411574115841159411604116141162411634116441165411664116741168411694117041171411724117341174411754117641177411784117941180411814118241183411844118541186411874118841189411904119141192411934119441195411964119741198411994120041201412024120341204412054120641207412084120941210412114121241213412144121541216412174121841219412204122141222412234122441225412264122741228412294123041231412324123341234412354123641237412384123941240412414124241243412444124541246412474124841249412504125141252412534125441255412564125741258412594126041261412624126341264412654126641267412684126941270412714127241273412744127541276412774127841279412804128141282412834128441285412864128741288412894129041291412924129341294412954129641297412984129941300413014130241303413044130541306413074130841309413104131141312413134131441315413164131741318413194132041321413224132341324413254132641327413284132941330413314133241333413344133541336413374133841339413404134141342413434134441345413464134741348413494135041351413524135341354413554135641357413584135941360413614136241363413644136541366413674136841369413704137141372413734137441375413764137741378413794138041381413824138341384413854138641387413884138941390413914139241393413944139541396413974139841399414004140141402414034140441405414064140741408414094141041411414124141341414414154141641417414184141941420414214142241423414244142541426414274142841429414304143141432414334143441435414364143741438414394144041441414424144341444414454144641447414484144941450414514145241453414544145541456414574145841459414604146141462414634146441465414664146741468414694147041471414724147341474414754147641477414784147941480414814148241483414844148541486414874148841489414904149141492414934149441495414964149741498414994150041501415024150341504415054150641507415084150941510415114151241513415144151541516415174151841519415204152141522415234152441525415264152741528415294153041531415324153341534415354153641537415384153941540415414154241543415444154541546415474154841549415504155141552415534155441555415564155741558415594156041561415624156341564415654156641567415684156941570415714157241573415744157541576415774157841579415804158141582415834158441585415864158741588415894159041591415924159341594415954159641597415984159941600416014160241603416044160541606416074160841609416104161141612416134161441615416164161741618416194162041621416224162341624416254162641627416284162941630416314163241633416344163541636416374163841639416404164141642416434164441645416464164741648416494165041651416524165341654416554165641657416584165941660416614166241663416644166541666416674166841669416704167141672416734167441675416764167741678416794168041681416824168341684416854168641687416884168941690416914169241693416944169541696416974169841699417004170141702417034170441705417064170741708417094171041711417124171341714417154171641717417184171941720417214172241723417244172541726417274172841729417304173141732417334173441735417364173741738417394174041741417424174341744417454174641747417484174941750417514175241753417544175541756417574175841759417604176141762417634176441765417664176741768417694177041771417724177341774417754177641777417784177941780417814178241783417844178541786417874178841789417904179141792417934179441795417964179741798417994180041801418024180341804418054180641807418084180941810418114181241813418144181541816418174181841819418204182141822418234182441825418264182741828418294183041831418324183341834418354183641837418384183941840418414184241843418444184541846418474184841849418504185141852418534185441855418564185741858418594186041861418624186341864418654186641867418684186941870418714187241873418744187541876418774187841879418804188141882418834188441885418864188741888418894189041891418924189341894418954189641897418984189941900419014190241903419044190541906419074190841909419104191141912419134191441915419164191741918419194192041921419224192341924419254192641927419284192941930419314193241933419344193541936419374193841939419404194141942419434194441945419464194741948419494195041951419524195341954419554195641957419584195941960419614196241963419644196541966419674196841969419704197141972419734197441975419764197741978419794198041981419824198341984419854198641987419884198941990419914199241993419944199541996419974199841999420004200142002420034200442005420064200742008420094201042011420124201342014420154201642017420184201942020420214202242023420244202542026420274202842029420304203142032420334203442035420364203742038420394204042041420424204342044420454204642047420484204942050420514205242053420544205542056420574205842059420604206142062420634206442065420664206742068420694207042071420724207342074420754207642077420784207942080420814208242083420844208542086420874208842089420904209142092420934209442095420964209742098420994210042101421024210342104421054210642107421084210942110421114211242113421144211542116421174211842119421204212142122421234212442125421264212742128421294213042131421324213342134421354213642137421384213942140421414214242143421444214542146421474214842149421504215142152421534215442155421564215742158421594216042161421624216342164421654216642167421684216942170421714217242173421744217542176421774217842179421804218142182421834218442185421864218742188421894219042191421924219342194421954219642197421984219942200422014220242203422044220542206422074220842209422104221142212422134221442215422164221742218422194222042221422224222342224422254222642227422284222942230422314223242233422344223542236422374223842239422404224142242422434224442245422464224742248422494225042251422524225342254422554225642257422584225942260422614226242263422644226542266422674226842269422704227142272422734227442275422764227742278422794228042281422824228342284422854228642287422884228942290422914229242293422944229542296422974229842299423004230142302423034230442305423064230742308423094231042311423124231342314423154231642317423184231942320423214232242323423244232542326423274232842329423304233142332423334233442335423364233742338423394234042341423424234342344423454234642347423484234942350423514235242353423544235542356423574235842359423604236142362423634236442365423664236742368423694237042371423724237342374423754237642377423784237942380423814238242383423844238542386423874238842389423904239142392423934239442395423964239742398423994240042401424024240342404424054240642407424084240942410424114241242413424144241542416424174241842419424204242142422424234242442425424264242742428424294243042431424324243342434424354243642437424384243942440424414244242443424444244542446424474244842449424504245142452424534245442455424564245742458424594246042461424624246342464424654246642467424684246942470424714247242473424744247542476424774247842479424804248142482424834248442485424864248742488424894249042491424924249342494424954249642497424984249942500425014250242503425044250542506425074250842509425104251142512425134251442515425164251742518425194252042521425224252342524425254252642527425284252942530425314253242533425344253542536425374253842539425404254142542425434254442545425464254742548425494255042551425524255342554425554255642557425584255942560425614256242563425644256542566425674256842569425704257142572425734257442575425764257742578425794258042581425824258342584425854258642587425884258942590425914259242593425944259542596425974259842599426004260142602426034260442605426064260742608426094261042611426124261342614426154261642617426184261942620426214262242623426244262542626426274262842629426304263142632426334263442635426364263742638426394264042641426424264342644426454264642647426484264942650426514265242653426544265542656426574265842659426604266142662426634266442665426664266742668426694267042671426724267342674426754267642677426784267942680426814268242683426844268542686426874268842689426904269142692426934269442695426964269742698426994270042701427024270342704427054270642707427084270942710427114271242713427144271542716427174271842719427204272142722427234272442725427264272742728427294273042731427324273342734427354273642737427384273942740427414274242743427444274542746427474274842749427504275142752427534275442755427564275742758427594276042761427624276342764427654276642767427684276942770427714277242773427744277542776427774277842779427804278142782427834278442785427864278742788427894279042791427924279342794427954279642797427984279942800428014280242803428044280542806428074280842809428104281142812428134281442815428164281742818428194282042821428224282342824428254282642827428284282942830428314283242833428344283542836428374283842839428404284142842428434284442845428464284742848428494285042851428524285342854428554285642857428584285942860428614286242863428644286542866428674286842869428704287142872428734287442875428764287742878428794288042881428824288342884428854288642887428884288942890428914289242893428944289542896428974289842899429004290142902429034290442905429064290742908429094291042911429124291342914429154291642917429184291942920429214292242923429244292542926429274292842929429304293142932429334293442935429364293742938429394294042941429424294342944429454294642947429484294942950429514295242953429544295542956429574295842959429604296142962429634296442965429664296742968429694297042971429724297342974429754297642977429784297942980429814298242983429844298542986429874298842989429904299142992429934299442995429964299742998429994300043001430024300343004430054300643007430084300943010430114301243013430144301543016430174301843019430204302143022430234302443025430264302743028430294303043031430324303343034430354303643037430384303943040430414304243043430444304543046430474304843049430504305143052430534305443055430564305743058430594306043061430624306343064430654306643067430684306943070430714307243073430744307543076430774307843079430804308143082430834308443085430864308743088430894309043091430924309343094430954309643097430984309943100431014310243103431044310543106431074310843109431104311143112431134311443115431164311743118431194312043121431224312343124431254312643127431284312943130431314313243133431344313543136431374313843139431404314143142431434314443145431464314743148431494315043151431524315343154431554315643157431584315943160431614316243163431644316543166431674316843169431704317143172431734317443175431764317743178431794318043181431824318343184431854318643187431884318943190431914319243193431944319543196431974319843199432004320143202432034320443205432064320743208432094321043211432124321343214432154321643217432184321943220432214322243223432244322543226432274322843229432304323143232432334323443235432364323743238432394324043241432424324343244432454324643247432484324943250432514325243253432544325543256432574325843259432604326143262432634326443265432664326743268432694327043271432724327343274432754327643277432784327943280432814328243283432844328543286432874328843289432904329143292432934329443295432964329743298432994330043301433024330343304433054330643307433084330943310433114331243313433144331543316433174331843319433204332143322433234332443325433264332743328433294333043331433324333343334433354333643337433384333943340433414334243343433444334543346433474334843349433504335143352433534335443355433564335743358433594336043361433624336343364433654336643367433684336943370433714337243373433744337543376433774337843379433804338143382433834338443385433864338743388433894339043391433924339343394433954339643397433984339943400434014340243403434044340543406434074340843409434104341143412434134341443415434164341743418434194342043421434224342343424434254342643427434284342943430434314343243433434344343543436434374343843439434404344143442434434344443445434464344743448434494345043451434524345343454434554345643457434584345943460434614346243463434644346543466434674346843469434704347143472434734347443475434764347743478434794348043481434824348343484434854348643487434884348943490434914349243493434944349543496434974349843499435004350143502435034350443505435064350743508435094351043511435124351343514435154351643517435184351943520435214352243523435244352543526435274352843529435304353143532435334353443535435364353743538435394354043541435424354343544435454354643547435484354943550435514355243553435544355543556435574355843559435604356143562435634356443565435664356743568435694357043571435724357343574435754357643577435784357943580435814358243583435844358543586435874358843589435904359143592435934359443595435964359743598435994360043601436024360343604436054360643607436084360943610436114361243613436144361543616436174361843619436204362143622436234362443625436264362743628436294363043631436324363343634436354363643637436384363943640436414364243643436444364543646436474364843649436504365143652436534365443655436564365743658436594366043661436624366343664436654366643667436684366943670436714367243673436744367543676436774367843679436804368143682436834368443685436864368743688436894369043691436924369343694436954369643697436984369943700437014370243703437044370543706437074370843709437104371143712437134371443715437164371743718437194372043721437224372343724437254372643727437284372943730437314373243733437344373543736437374373843739437404374143742437434374443745437464374743748437494375043751437524375343754437554375643757437584375943760437614376243763437644376543766437674376843769437704377143772437734377443775437764377743778437794378043781437824378343784437854378643787437884378943790437914379243793437944379543796437974379843799438004380143802438034380443805438064380743808438094381043811438124381343814438154381643817438184381943820438214382243823438244382543826438274382843829438304383143832438334383443835438364383743838438394384043841438424384343844438454384643847438484384943850438514385243853438544385543856438574385843859438604386143862438634386443865438664386743868438694387043871438724387343874438754387643877438784387943880438814388243883438844388543886438874388843889438904389143892438934389443895438964389743898438994390043901439024390343904439054390643907439084390943910439114391243913439144391543916439174391843919439204392143922439234392443925439264392743928439294393043931439324393343934439354393643937439384393943940439414394243943439444394543946439474394843949439504395143952439534395443955439564395743958439594396043961439624396343964439654396643967439684396943970439714397243973439744397543976439774397843979439804398143982439834398443985439864398743988439894399043991439924399343994439954399643997439984399944000440014400244003440044400544006440074400844009440104401144012440134401444015440164401744018440194402044021440224402344024440254402644027440284402944030440314403244033440344403544036440374403844039440404404144042440434404444045440464404744048440494405044051440524405344054440554405644057440584405944060440614406244063440644406544066440674406844069440704407144072440734407444075440764407744078440794408044081440824408344084440854408644087440884408944090440914409244093440944409544096440974409844099441004410144102441034410444105441064410744108441094411044111441124411344114441154411644117441184411944120441214412244123441244412544126441274412844129441304413144132441334413444135441364413744138441394414044141441424414344144441454414644147441484414944150441514415244153441544415544156441574415844159441604416144162441634416444165441664416744168441694417044171441724417344174441754417644177441784417944180441814418244183441844418544186441874418844189441904419144192441934419444195441964419744198441994420044201442024420344204442054420644207442084420944210442114421244213442144421544216442174421844219442204422144222442234422444225442264422744228442294423044231442324423344234442354423644237442384423944240442414424244243442444424544246442474424844249442504425144252442534425444255442564425744258442594426044261442624426344264442654426644267442684426944270442714427244273442744427544276442774427844279442804428144282442834428444285442864428744288442894429044291442924429344294442954429644297442984429944300443014430244303443044430544306443074430844309443104431144312443134431444315443164431744318443194432044321443224432344324443254432644327443284432944330443314433244333443344433544336443374433844339443404434144342443434434444345443464434744348443494435044351443524435344354443554435644357443584435944360443614436244363443644436544366443674436844369443704437144372443734437444375443764437744378443794438044381443824438344384443854438644387443884438944390443914439244393443944439544396443974439844399444004440144402444034440444405444064440744408444094441044411444124441344414444154441644417444184441944420444214442244423444244442544426444274442844429444304443144432444334443444435444364443744438444394444044441444424444344444444454444644447444484444944450444514445244453444544445544456444574445844459444604446144462444634446444465444664446744468444694447044471444724447344474444754447644477444784447944480444814448244483444844448544486444874448844489444904449144492444934449444495444964449744498444994450044501445024450344504445054450644507445084450944510445114451244513445144451544516445174451844519445204452144522445234452444525445264452744528445294453044531445324453344534445354453644537445384453944540445414454244543445444454544546445474454844549445504455144552445534455444555445564455744558445594456044561445624456344564445654456644567445684456944570445714457244573445744457544576445774457844579445804458144582445834458444585445864458744588445894459044591445924459344594445954459644597445984459944600446014460244603446044460544606446074460844609446104461144612446134461444615446164461744618446194462044621446224462344624446254462644627446284462944630446314463244633446344463544636446374463844639446404464144642446434464444645446464464744648446494465044651446524465344654446554465644657446584465944660446614466244663446644466544666446674466844669446704467144672446734467444675446764467744678446794468044681446824468344684446854468644687446884468944690446914469244693446944469544696446974469844699447004470144702447034470444705447064470744708447094471044711447124471344714447154471644717447184471944720447214472244723447244472544726447274472844729447304473144732447334473444735447364473744738447394474044741447424474344744447454474644747447484474944750447514475244753447544475544756447574475844759447604476144762447634476444765447664476744768447694477044771447724477344774447754477644777447784477944780447814478244783447844478544786447874478844789447904479144792447934479444795447964479744798447994480044801448024480344804448054480644807448084480944810448114481244813448144481544816448174481844819448204482144822448234482444825448264482744828448294483044831448324483344834448354483644837448384483944840448414484244843448444484544846448474484844849448504485144852448534485444855448564485744858448594486044861448624486344864448654486644867448684486944870448714487244873448744487544876448774487844879448804488144882448834488444885448864488744888448894489044891448924489344894448954489644897448984489944900449014490244903449044490544906449074490844909449104491144912449134491444915449164491744918449194492044921449224492344924449254492644927449284492944930449314493244933449344493544936449374493844939449404494144942449434494444945449464494744948449494495044951449524495344954449554495644957449584495944960449614496244963449644496544966449674496844969449704497144972449734497444975449764497744978449794498044981449824498344984449854498644987449884498944990449914499244993449944499544996449974499844999450004500145002450034500445005450064500745008450094501045011450124501345014450154501645017450184501945020450214502245023450244502545026450274502845029450304503145032450334503445035450364503745038450394504045041450424504345044450454504645047450484504945050450514505245053450544505545056450574505845059450604506145062450634506445065450664506745068450694507045071450724507345074450754507645077450784507945080450814508245083450844508545086450874508845089450904509145092450934509445095450964509745098450994510045101451024510345104451054510645107451084510945110451114511245113451144511545116451174511845119451204512145122451234512445125451264512745128451294513045131451324513345134451354513645137451384513945140451414514245143451444514545146451474514845149451504515145152451534515445155451564515745158451594516045161451624516345164451654516645167451684516945170451714517245173451744517545176451774517845179451804518145182451834518445185451864518745188451894519045191451924519345194451954519645197451984519945200452014520245203452044520545206452074520845209452104521145212452134521445215452164521745218452194522045221452224522345224452254522645227452284522945230452314523245233452344523545236452374523845239452404524145242452434524445245452464524745248452494525045251452524525345254452554525645257452584525945260452614526245263452644526545266452674526845269452704527145272452734527445275452764527745278452794528045281452824528345284452854528645287452884528945290452914529245293452944529545296452974529845299453004530145302453034530445305453064530745308453094531045311453124531345314453154531645317453184531945320453214532245323453244532545326453274532845329453304533145332453334533445335453364533745338453394534045341453424534345344453454534645347453484534945350453514535245353453544535545356453574535845359453604536145362453634536445365453664536745368453694537045371453724537345374453754537645377453784537945380453814538245383453844538545386453874538845389453904539145392453934539445395453964539745398453994540045401454024540345404454054540645407454084540945410454114541245413454144541545416454174541845419454204542145422454234542445425454264542745428454294543045431454324543345434454354543645437454384543945440454414544245443454444544545446454474544845449454504545145452454534545445455454564545745458454594546045461454624546345464454654546645467454684546945470454714547245473454744547545476454774547845479454804548145482454834548445485454864548745488454894549045491454924549345494454954549645497454984549945500455014550245503455044550545506455074550845509455104551145512455134551445515455164551745518455194552045521455224552345524455254552645527455284552945530455314553245533455344553545536455374553845539455404554145542455434554445545455464554745548455494555045551455524555345554455554555645557455584555945560455614556245563455644556545566455674556845569455704557145572455734557445575455764557745578455794558045581455824558345584455854558645587455884558945590455914559245593455944559545596455974559845599456004560145602456034560445605456064560745608456094561045611456124561345614456154561645617456184561945620456214562245623456244562545626456274562845629456304563145632456334563445635456364563745638456394564045641456424564345644456454564645647456484564945650456514565245653456544565545656456574565845659456604566145662456634566445665456664566745668456694567045671456724567345674456754567645677456784567945680456814568245683456844568545686456874568845689456904569145692456934569445695456964569745698456994570045701457024570345704457054570645707457084570945710457114571245713457144571545716457174571845719457204572145722457234572445725457264572745728457294573045731457324573345734457354573645737457384573945740457414574245743457444574545746457474574845749457504575145752457534575445755457564575745758457594576045761457624576345764457654576645767457684576945770457714577245773457744577545776457774577845779457804578145782457834578445785457864578745788457894579045791457924579345794457954579645797457984579945800458014580245803458044580545806458074580845809458104581145812458134581445815458164581745818458194582045821458224582345824458254582645827458284582945830458314583245833458344583545836458374583845839458404584145842458434584445845458464584745848458494585045851458524585345854458554585645857458584585945860458614586245863458644586545866458674586845869458704587145872458734587445875458764587745878458794588045881458824588345884458854588645887458884588945890458914589245893458944589545896458974589845899459004590145902459034590445905459064590745908459094591045911459124591345914459154591645917459184591945920459214592245923459244592545926459274592845929459304593145932459334593445935459364593745938459394594045941459424594345944459454594645947459484594945950459514595245953459544595545956459574595845959459604596145962459634596445965459664596745968459694597045971459724597345974459754597645977459784597945980459814598245983459844598545986459874598845989459904599145992459934599445995459964599745998459994600046001460024600346004460054600646007460084600946010460114601246013460144601546016460174601846019460204602146022460234602446025460264602746028460294603046031460324603346034460354603646037460384603946040460414604246043460444604546046460474604846049460504605146052460534605446055460564605746058460594606046061460624606346064460654606646067460684606946070460714607246073460744607546076460774607846079460804608146082460834608446085460864608746088460894609046091460924609346094460954609646097460984609946100461014610246103461044610546106461074610846109461104611146112461134611446115461164611746118461194612046121461224612346124461254612646127461284612946130461314613246133461344613546136461374613846139461404614146142461434614446145461464614746148461494615046151461524615346154461554615646157461584615946160461614616246163461644616546166461674616846169461704617146172461734617446175461764617746178461794618046181461824618346184461854618646187461884618946190461914619246193461944619546196461974619846199462004620146202462034620446205462064620746208462094621046211462124621346214462154621646217462184621946220462214622246223462244622546226462274622846229462304623146232462334623446235462364623746238462394624046241462424624346244462454624646247462484624946250462514625246253462544625546256462574625846259462604626146262462634626446265462664626746268462694627046271462724627346274462754627646277462784627946280462814628246283462844628546286462874628846289462904629146292462934629446295462964629746298462994630046301463024630346304463054630646307463084630946310463114631246313463144631546316463174631846319463204632146322463234632446325463264632746328463294633046331463324633346334463354633646337463384633946340463414634246343463444634546346463474634846349463504635146352463534635446355463564635746358463594636046361463624636346364463654636646367463684636946370463714637246373463744637546376463774637846379463804638146382463834638446385463864638746388463894639046391463924639346394463954639646397463984639946400464014640246403464044640546406464074640846409464104641146412464134641446415464164641746418464194642046421464224642346424464254642646427464284642946430464314643246433464344643546436464374643846439464404644146442464434644446445464464644746448464494645046451464524645346454464554645646457464584645946460464614646246463464644646546466464674646846469464704647146472464734647446475464764647746478464794648046481464824648346484464854648646487464884648946490464914649246493464944649546496464974649846499465004650146502465034650446505465064650746508465094651046511465124651346514465154651646517465184651946520465214652246523465244652546526465274652846529465304653146532465334653446535465364653746538465394654046541465424654346544465454654646547465484654946550465514655246553465544655546556465574655846559465604656146562465634656446565465664656746568465694657046571465724657346574465754657646577465784657946580465814658246583465844658546586465874658846589465904659146592465934659446595465964659746598465994660046601466024660346604466054660646607466084660946610466114661246613466144661546616466174661846619466204662146622466234662446625466264662746628466294663046631466324663346634466354663646637466384663946640466414664246643466444664546646466474664846649466504665146652466534665446655466564665746658466594666046661466624666346664466654666646667466684666946670466714667246673466744667546676466774667846679466804668146682466834668446685466864668746688466894669046691466924669346694466954669646697466984669946700467014670246703467044670546706467074670846709467104671146712467134671446715467164671746718467194672046721467224672346724467254672646727467284672946730467314673246733467344673546736467374673846739467404674146742467434674446745467464674746748467494675046751467524675346754467554675646757467584675946760467614676246763467644676546766467674676846769467704677146772467734677446775467764677746778467794678046781467824678346784467854678646787467884678946790467914679246793467944679546796467974679846799468004680146802468034680446805468064680746808468094681046811468124681346814468154681646817468184681946820468214682246823468244682546826468274682846829468304683146832468334683446835468364683746838468394684046841468424684346844468454684646847468484684946850468514685246853468544685546856468574685846859468604686146862468634686446865468664686746868468694687046871468724687346874468754687646877468784687946880468814688246883468844688546886468874688846889468904689146892468934689446895468964689746898468994690046901469024690346904469054690646907469084690946910469114691246913469144691546916469174691846919469204692146922469234692446925469264692746928469294693046931469324693346934469354693646937469384693946940469414694246943469444694546946469474694846949469504695146952469534695446955469564695746958469594696046961469624696346964469654696646967469684696946970469714697246973469744697546976469774697846979469804698146982469834698446985469864698746988469894699046991469924699346994469954699646997469984699947000470014700247003470044700547006470074700847009470104701147012470134701447015470164701747018470194702047021470224702347024470254702647027470284702947030470314703247033470344703547036470374703847039470404704147042470434704447045470464704747048470494705047051470524705347054470554705647057470584705947060470614706247063470644706547066470674706847069470704707147072470734707447075470764707747078470794708047081470824708347084470854708647087470884708947090470914709247093470944709547096470974709847099471004710147102471034710447105471064710747108471094711047111471124711347114471154711647117471184711947120471214712247123471244712547126471274712847129471304713147132471334713447135471364713747138471394714047141471424714347144471454714647147471484714947150471514715247153471544715547156471574715847159471604716147162471634716447165471664716747168471694717047171471724717347174471754717647177471784717947180471814718247183471844718547186471874718847189471904719147192471934719447195471964719747198471994720047201472024720347204472054720647207472084720947210472114721247213472144721547216472174721847219472204722147222472234722447225472264722747228472294723047231472324723347234472354723647237472384723947240472414724247243472444724547246472474724847249472504725147252472534725447255472564725747258472594726047261472624726347264472654726647267472684726947270472714727247273472744727547276472774727847279472804728147282472834728447285472864728747288472894729047291472924729347294472954729647297472984729947300473014730247303473044730547306473074730847309473104731147312473134731447315473164731747318473194732047321473224732347324473254732647327473284732947330473314733247333473344733547336473374733847339473404734147342473434734447345473464734747348473494735047351473524735347354473554735647357473584735947360473614736247363473644736547366473674736847369473704737147372473734737447375473764737747378473794738047381473824738347384473854738647387473884738947390473914739247393473944739547396473974739847399474004740147402474034740447405474064740747408474094741047411474124741347414474154741647417474184741947420474214742247423474244742547426474274742847429474304743147432474334743447435474364743747438474394744047441474424744347444474454744647447474484744947450474514745247453474544745547456474574745847459474604746147462474634746447465474664746747468474694747047471474724747347474474754747647477474784747947480474814748247483474844748547486474874748847489474904749147492474934749447495474964749747498474994750047501475024750347504475054750647507475084750947510475114751247513475144751547516475174751847519475204752147522475234752447525475264752747528475294753047531475324753347534475354753647537475384753947540475414754247543475444754547546475474754847549475504755147552475534755447555475564755747558475594756047561475624756347564475654756647567475684756947570475714757247573475744757547576475774757847579475804758147582475834758447585475864758747588475894759047591475924759347594475954759647597475984759947600476014760247603476044760547606476074760847609476104761147612476134761447615476164761747618476194762047621476224762347624476254762647627476284762947630476314763247633476344763547636476374763847639476404764147642476434764447645476464764747648476494765047651476524765347654476554765647657476584765947660476614766247663476644766547666476674766847669476704767147672476734767447675476764767747678476794768047681476824768347684476854768647687476884768947690476914769247693476944769547696476974769847699477004770147702477034770447705477064770747708477094771047711477124771347714477154771647717477184771947720477214772247723477244772547726477274772847729477304773147732477334773447735477364773747738477394774047741477424774347744477454774647747477484774947750477514775247753477544775547756477574775847759477604776147762477634776447765477664776747768477694777047771477724777347774477754777647777477784777947780477814778247783477844778547786477874778847789477904779147792477934779447795477964779747798477994780047801478024780347804478054780647807478084780947810478114781247813478144781547816478174781847819478204782147822478234782447825478264782747828478294783047831478324783347834478354783647837478384783947840478414784247843478444784547846478474784847849478504785147852478534785447855478564785747858478594786047861478624786347864478654786647867478684786947870478714787247873478744787547876478774787847879478804788147882478834788447885478864788747888478894789047891478924789347894478954789647897478984789947900479014790247903479044790547906479074790847909479104791147912479134791447915479164791747918479194792047921479224792347924479254792647927479284792947930479314793247933479344793547936479374793847939479404794147942479434794447945479464794747948479494795047951479524795347954479554795647957479584795947960479614796247963479644796547966479674796847969479704797147972479734797447975479764797747978479794798047981479824798347984479854798647987479884798947990479914799247993479944799547996479974799847999480004800148002480034800448005480064800748008480094801048011480124801348014480154801648017480184801948020480214802248023480244802548026480274802848029480304803148032480334803448035480364803748038480394804048041480424804348044480454804648047480484804948050480514805248053480544805548056480574805848059480604806148062480634806448065480664806748068480694807048071480724807348074480754807648077480784807948080480814808248083480844808548086480874808848089480904809148092480934809448095480964809748098480994810048101481024810348104481054810648107481084810948110481114811248113481144811548116481174811848119481204812148122481234812448125481264812748128481294813048131481324813348134481354813648137481384813948140481414814248143481444814548146481474814848149481504815148152481534815448155481564815748158481594816048161481624816348164481654816648167481684816948170481714817248173481744817548176481774817848179481804818148182481834818448185481864818748188481894819048191481924819348194481954819648197481984819948200482014820248203482044820548206482074820848209482104821148212482134821448215482164821748218482194822048221482224822348224482254822648227482284822948230482314823248233482344823548236482374823848239482404824148242482434824448245482464824748248482494825048251482524825348254482554825648257482584825948260482614826248263482644826548266482674826848269482704827148272482734827448275482764827748278482794828048281482824828348284482854828648287482884828948290482914829248293482944829548296482974829848299483004830148302483034830448305483064830748308483094831048311483124831348314483154831648317483184831948320483214832248323483244832548326483274832848329483304833148332483334833448335483364833748338483394834048341483424834348344483454834648347483484834948350483514835248353483544835548356483574835848359483604836148362483634836448365483664836748368483694837048371483724837348374483754837648377483784837948380483814838248383483844838548386483874838848389483904839148392483934839448395483964839748398483994840048401484024840348404484054840648407484084840948410484114841248413484144841548416484174841848419484204842148422484234842448425484264842748428484294843048431484324843348434484354843648437484384843948440484414844248443484444844548446484474844848449484504845148452484534845448455484564845748458484594846048461484624846348464484654846648467484684846948470484714847248473484744847548476484774847848479484804848148482484834848448485484864848748488484894849048491484924849348494484954849648497484984849948500485014850248503485044850548506485074850848509485104851148512485134851448515485164851748518485194852048521485224852348524485254852648527485284852948530485314853248533485344853548536485374853848539485404854148542485434854448545485464854748548485494855048551485524855348554485554855648557485584855948560485614856248563485644856548566485674856848569485704857148572485734857448575485764857748578485794858048581485824858348584485854858648587485884858948590485914859248593485944859548596485974859848599486004860148602486034860448605486064860748608486094861048611486124861348614486154861648617486184861948620486214862248623486244862548626486274862848629486304863148632486334863448635486364863748638486394864048641486424864348644486454864648647486484864948650486514865248653486544865548656486574865848659486604866148662486634866448665486664866748668486694867048671486724867348674486754867648677486784867948680486814868248683486844868548686486874868848689486904869148692486934869448695486964869748698486994870048701487024870348704487054870648707487084870948710487114871248713487144871548716487174871848719487204872148722487234872448725487264872748728487294873048731487324873348734487354873648737487384873948740487414874248743487444874548746487474874848749487504875148752487534875448755487564875748758487594876048761487624876348764487654876648767487684876948770487714877248773487744877548776487774877848779487804878148782487834878448785487864878748788487894879048791487924879348794487954879648797487984879948800488014880248803488044880548806488074880848809488104881148812488134881448815488164881748818488194882048821488224882348824488254882648827488284882948830488314883248833488344883548836488374883848839488404884148842488434884448845488464884748848488494885048851488524885348854488554885648857488584885948860488614886248863488644886548866488674886848869488704887148872488734887448875488764887748878488794888048881488824888348884488854888648887488884888948890488914889248893488944889548896488974889848899489004890148902489034890448905489064890748908489094891048911489124891348914489154891648917489184891948920489214892248923489244892548926489274892848929489304893148932489334893448935489364893748938489394894048941489424894348944489454894648947489484894948950489514895248953489544895548956489574895848959489604896148962489634896448965489664896748968489694897048971489724897348974489754897648977489784897948980489814898248983489844898548986489874898848989489904899148992489934899448995489964899748998489994900049001490024900349004490054900649007490084900949010490114901249013490144901549016490174901849019490204902149022490234902449025490264902749028490294903049031490324903349034490354903649037490384903949040490414904249043490444904549046490474904849049490504905149052490534905449055490564905749058490594906049061490624906349064490654906649067490684906949070490714907249073490744907549076490774907849079490804908149082490834908449085490864908749088490894909049091490924909349094490954909649097490984909949100491014910249103491044910549106491074910849109491104911149112491134911449115491164911749118491194912049121491224912349124491254912649127491284912949130491314913249133491344913549136491374913849139491404914149142491434914449145491464914749148491494915049151491524915349154491554915649157491584915949160491614916249163491644916549166491674916849169491704917149172491734917449175491764917749178491794918049181491824918349184491854918649187491884918949190491914919249193491944919549196491974919849199492004920149202492034920449205492064920749208492094921049211492124921349214492154921649217492184921949220492214922249223492244922549226492274922849229492304923149232492334923449235492364923749238492394924049241492424924349244492454924649247492484924949250492514925249253492544925549256492574925849259492604926149262492634926449265492664926749268492694927049271492724927349274492754927649277492784927949280492814928249283492844928549286492874928849289492904929149292492934929449295492964929749298492994930049301493024930349304493054930649307493084930949310493114931249313493144931549316493174931849319493204932149322493234932449325493264932749328493294933049331493324933349334493354933649337493384933949340493414934249343493444934549346493474934849349493504935149352493534935449355493564935749358493594936049361493624936349364493654936649367493684936949370493714937249373493744937549376493774937849379493804938149382493834938449385493864938749388493894939049391493924939349394493954939649397493984939949400494014940249403494044940549406494074940849409494104941149412494134941449415494164941749418494194942049421494224942349424494254942649427494284942949430494314943249433494344943549436494374943849439494404944149442494434944449445494464944749448494494945049451494524945349454494554945649457494584945949460494614946249463494644946549466494674946849469494704947149472494734947449475494764947749478494794948049481494824948349484494854948649487494884948949490494914949249493494944949549496494974949849499495004950149502495034950449505495064950749508495094951049511495124951349514495154951649517495184951949520495214952249523495244952549526495274952849529495304953149532495334953449535495364953749538495394954049541495424954349544495454954649547495484954949550495514955249553495544955549556495574955849559495604956149562495634956449565495664956749568495694957049571495724957349574495754957649577495784957949580495814958249583495844958549586495874958849589495904959149592495934959449595495964959749598495994960049601496024960349604496054960649607496084960949610496114961249613496144961549616496174961849619496204962149622496234962449625496264962749628496294963049631496324963349634496354963649637496384963949640496414964249643496444964549646496474964849649496504965149652496534965449655496564965749658496594966049661496624966349664496654966649667496684966949670496714967249673496744967549676496774967849679496804968149682496834968449685496864968749688496894969049691496924969349694496954969649697496984969949700497014970249703497044970549706497074970849709497104971149712497134971449715497164971749718497194972049721497224972349724497254972649727497284972949730497314973249733497344973549736497374973849739497404974149742497434974449745497464974749748497494975049751497524975349754497554975649757497584975949760497614976249763497644976549766497674976849769497704977149772497734977449775497764977749778497794978049781497824978349784497854978649787497884978949790497914979249793497944979549796497974979849799498004980149802498034980449805498064980749808498094981049811498124981349814498154981649817498184981949820498214982249823498244982549826498274982849829498304983149832498334983449835498364983749838498394984049841498424984349844498454984649847498484984949850498514985249853498544985549856498574985849859498604986149862498634986449865498664986749868498694987049871498724987349874498754987649877498784987949880498814988249883498844988549886498874988849889498904989149892498934989449895498964989749898498994990049901499024990349904499054990649907499084990949910499114991249913499144991549916499174991849919499204992149922499234992449925499264992749928499294993049931499324993349934499354993649937499384993949940499414994249943499444994549946499474994849949499504995149952499534995449955499564995749958499594996049961499624996349964499654996649967499684996949970499714997249973499744997549976499774997849979499804998149982499834998449985499864998749988499894999049991499924999349994499954999649997499984999950000500015000250003500045000550006500075000850009500105001150012500135001450015500165001750018500195002050021500225002350024500255002650027500285002950030500315003250033500345003550036500375003850039500405004150042500435004450045500465004750048500495005050051500525005350054500555005650057500585005950060500615006250063500645006550066500675006850069500705007150072500735007450075500765007750078500795008050081500825008350084500855008650087500885008950090500915009250093500945009550096500975009850099501005010150102501035010450105501065010750108501095011050111501125011350114501155011650117501185011950120501215012250123501245012550126501275012850129501305013150132501335013450135501365013750138501395014050141501425014350144501455014650147501485014950150501515015250153501545015550156501575015850159501605016150162501635016450165501665016750168501695017050171501725017350174501755017650177501785017950180501815018250183501845018550186501875018850189501905019150192501935019450195501965019750198501995020050201502025020350204502055020650207502085020950210502115021250213502145021550216502175021850219502205022150222502235022450225502265022750228502295023050231502325023350234502355023650237502385023950240502415024250243502445024550246502475024850249502505025150252502535025450255502565025750258502595026050261502625026350264502655026650267502685026950270502715027250273502745027550276502775027850279502805028150282502835028450285502865028750288502895029050291502925029350294502955029650297502985029950300503015030250303503045030550306503075030850309503105031150312503135031450315503165031750318503195032050321503225032350324503255032650327503285032950330503315033250333503345033550336503375033850339503405034150342503435034450345503465034750348503495035050351503525035350354503555035650357503585035950360503615036250363503645036550366503675036850369503705037150372503735037450375503765037750378503795038050381503825038350384503855038650387503885038950390503915039250393503945039550396503975039850399504005040150402504035040450405504065040750408504095041050411504125041350414504155041650417504185041950420504215042250423504245042550426504275042850429504305043150432504335043450435504365043750438504395044050441504425044350444504455044650447504485044950450504515045250453504545045550456504575045850459504605046150462504635046450465504665046750468504695047050471504725047350474504755047650477504785047950480504815048250483504845048550486504875048850489504905049150492504935049450495504965049750498504995050050501505025050350504505055050650507505085050950510505115051250513505145051550516505175051850519505205052150522505235052450525505265052750528505295053050531505325053350534505355053650537505385053950540505415054250543505445054550546505475054850549505505055150552505535055450555505565055750558505595056050561505625056350564505655056650567505685056950570505715057250573505745057550576505775057850579505805058150582505835058450585505865058750588505895059050591505925059350594505955059650597505985059950600506015060250603506045060550606506075060850609506105061150612506135061450615506165061750618506195062050621506225062350624506255062650627506285062950630506315063250633506345063550636506375063850639506405064150642506435064450645506465064750648506495065050651506525065350654506555065650657506585065950660506615066250663506645066550666506675066850669506705067150672506735067450675506765067750678506795068050681506825068350684506855068650687506885068950690506915069250693506945069550696506975069850699507005070150702507035070450705507065070750708507095071050711507125071350714507155071650717507185071950720507215072250723507245072550726507275072850729507305073150732507335073450735507365073750738507395074050741507425074350744507455074650747507485074950750507515075250753507545075550756507575075850759507605076150762507635076450765507665076750768507695077050771507725077350774507755077650777507785077950780507815078250783507845078550786507875078850789507905079150792507935079450795507965079750798507995080050801508025080350804508055080650807508085080950810508115081250813508145081550816508175081850819508205082150822508235082450825508265082750828508295083050831508325083350834508355083650837508385083950840508415084250843508445084550846508475084850849508505085150852508535085450855508565085750858508595086050861508625086350864508655086650867508685086950870508715087250873508745087550876508775087850879508805088150882508835088450885508865088750888508895089050891508925089350894508955089650897508985089950900509015090250903509045090550906509075090850909509105091150912509135091450915509165091750918509195092050921509225092350924509255092650927509285092950930509315093250933509345093550936509375093850939509405094150942509435094450945509465094750948509495095050951509525095350954509555095650957509585095950960509615096250963509645096550966509675096850969509705097150972509735097450975509765097750978509795098050981509825098350984509855098650987509885098950990509915099250993509945099550996509975099850999510005100151002510035100451005510065100751008510095101051011510125101351014510155101651017510185101951020510215102251023510245102551026510275102851029510305103151032510335103451035510365103751038510395104051041510425104351044510455104651047510485104951050510515105251053510545105551056510575105851059510605106151062510635106451065510665106751068510695107051071510725107351074510755107651077510785107951080510815108251083510845108551086510875108851089510905109151092510935109451095510965109751098510995110051101511025110351104511055110651107511085110951110511115111251113511145111551116511175111851119511205112151122511235112451125511265112751128511295113051131511325113351134511355113651137511385113951140511415114251143511445114551146511475114851149511505115151152511535115451155511565115751158511595116051161511625116351164511655116651167511685116951170511715117251173511745117551176511775117851179511805118151182511835118451185511865118751188511895119051191511925119351194511955119651197511985119951200512015120251203512045120551206512075120851209512105121151212512135121451215512165121751218512195122051221512225122351224512255122651227512285122951230512315123251233512345123551236512375123851239512405124151242512435124451245512465124751248512495125051251512525125351254512555125651257512585125951260512615126251263512645126551266512675126851269512705127151272512735127451275512765127751278512795128051281512825128351284512855128651287512885128951290512915129251293512945129551296512975129851299513005130151302513035130451305513065130751308513095131051311513125131351314513155131651317513185131951320513215132251323513245132551326513275132851329513305133151332513335133451335513365133751338513395134051341513425134351344513455134651347513485134951350513515135251353513545135551356513575135851359513605136151362513635136451365513665136751368513695137051371513725137351374513755137651377513785137951380513815138251383513845138551386513875138851389513905139151392513935139451395513965139751398513995140051401514025140351404514055140651407514085140951410514115141251413514145141551416514175141851419514205142151422514235142451425514265142751428514295143051431514325143351434514355143651437514385143951440514415144251443514445144551446514475144851449514505145151452514535145451455514565145751458514595146051461514625146351464514655146651467514685146951470514715147251473514745147551476514775147851479514805148151482514835148451485514865148751488514895149051491514925149351494514955149651497514985149951500515015150251503515045150551506515075150851509515105151151512515135151451515515165151751518515195152051521515225152351524515255152651527515285152951530515315153251533515345153551536515375153851539515405154151542515435154451545515465154751548515495155051551515525155351554515555155651557515585155951560515615156251563515645156551566515675156851569515705157151572515735157451575515765157751578515795158051581515825158351584515855158651587515885158951590515915159251593515945159551596515975159851599516005160151602516035160451605516065160751608516095161051611516125161351614516155161651617516185161951620516215162251623516245162551626516275162851629516305163151632516335163451635516365163751638516395164051641516425164351644516455164651647516485164951650516515165251653516545165551656516575165851659516605166151662516635166451665516665166751668516695167051671516725167351674516755167651677516785167951680516815168251683516845168551686516875168851689516905169151692516935169451695516965169751698516995170051701517025170351704517055170651707517085170951710517115171251713517145171551716517175171851719517205172151722517235172451725517265172751728517295173051731517325173351734517355173651737517385173951740517415174251743517445174551746517475174851749517505175151752517535175451755517565175751758517595176051761517625176351764517655176651767517685176951770517715177251773517745177551776517775177851779517805178151782517835178451785517865178751788517895179051791517925179351794517955179651797517985179951800518015180251803518045180551806518075180851809518105181151812518135181451815518165181751818518195182051821518225182351824518255182651827518285182951830518315183251833518345183551836518375183851839518405184151842518435184451845518465184751848518495185051851518525185351854518555185651857518585185951860518615186251863518645186551866518675186851869518705187151872518735187451875518765187751878518795188051881518825188351884518855188651887518885188951890518915189251893518945189551896518975189851899519005190151902519035190451905519065190751908519095191051911519125191351914519155191651917519185191951920519215192251923519245192551926519275192851929519305193151932519335193451935519365193751938519395194051941519425194351944519455194651947519485194951950519515195251953519545195551956519575195851959519605196151962519635196451965519665196751968519695197051971519725197351974519755197651977519785197951980519815198251983519845198551986519875198851989519905199151992519935199451995519965199751998519995200052001520025200352004520055200652007520085200952010520115201252013520145201552016520175201852019520205202152022520235202452025520265202752028520295203052031520325203352034520355203652037520385203952040520415204252043520445204552046520475204852049520505205152052520535205452055520565205752058520595206052061520625206352064520655206652067520685206952070520715207252073520745207552076520775207852079520805208152082520835208452085520865208752088520895209052091520925209352094520955209652097520985209952100521015210252103521045210552106521075210852109521105211152112521135211452115521165211752118521195212052121521225212352124521255212652127521285212952130521315213252133521345213552136521375213852139521405214152142521435214452145521465214752148521495215052151521525215352154521555215652157521585215952160521615216252163521645216552166521675216852169521705217152172521735217452175521765217752178521795218052181521825218352184521855218652187521885218952190521915219252193521945219552196521975219852199522005220152202522035220452205522065220752208522095221052211522125221352214522155221652217522185221952220522215222252223522245222552226522275222852229522305223152232522335223452235522365223752238522395224052241522425224352244522455224652247522485224952250522515225252253522545225552256522575225852259522605226152262522635226452265522665226752268522695227052271522725227352274522755227652277522785227952280522815228252283522845228552286522875228852289522905229152292522935229452295522965229752298522995230052301523025230352304523055230652307523085230952310523115231252313523145231552316523175231852319523205232152322523235232452325523265232752328523295233052331523325233352334523355233652337523385233952340523415234252343523445234552346523475234852349523505235152352523535235452355523565235752358523595236052361523625236352364523655236652367523685236952370523715237252373523745237552376523775237852379523805238152382523835238452385523865238752388523895239052391523925239352394523955239652397523985239952400524015240252403524045240552406524075240852409524105241152412524135241452415524165241752418524195242052421524225242352424524255242652427524285242952430524315243252433524345243552436524375243852439524405244152442524435244452445524465244752448524495245052451524525245352454524555245652457524585245952460524615246252463524645246552466524675246852469524705247152472524735247452475524765247752478524795248052481524825248352484524855248652487524885248952490524915249252493524945249552496524975249852499525005250152502525035250452505525065250752508525095251052511525125251352514525155251652517525185251952520525215252252523525245252552526525275252852529525305253152532525335253452535525365253752538525395254052541525425254352544525455254652547525485254952550525515255252553525545255552556525575255852559525605256152562525635256452565525665256752568525695257052571525725257352574525755257652577525785257952580525815258252583525845258552586525875258852589525905259152592525935259452595525965259752598525995260052601526025260352604526055260652607526085260952610526115261252613526145261552616526175261852619526205262152622526235262452625526265262752628526295263052631526325263352634526355263652637526385263952640526415264252643526445264552646526475264852649526505265152652526535265452655526565265752658526595266052661526625266352664526655266652667526685266952670526715267252673526745267552676526775267852679526805268152682526835268452685526865268752688526895269052691526925269352694526955269652697526985269952700527015270252703527045270552706527075270852709527105271152712527135271452715527165271752718527195272052721527225272352724527255272652727527285272952730527315273252733527345273552736527375273852739527405274152742527435274452745527465274752748527495275052751527525275352754527555275652757527585275952760527615276252763527645276552766527675276852769527705277152772527735277452775527765277752778527795278052781527825278352784527855278652787527885278952790527915279252793527945279552796527975279852799528005280152802528035280452805528065280752808528095281052811528125281352814528155281652817528185281952820528215282252823528245282552826528275282852829528305283152832528335283452835528365283752838528395284052841528425284352844528455284652847528485284952850528515285252853528545285552856528575285852859528605286152862528635286452865528665286752868528695287052871528725287352874528755287652877528785287952880528815288252883528845288552886528875288852889528905289152892528935289452895528965289752898528995290052901529025290352904529055290652907529085290952910529115291252913529145291552916529175291852919529205292152922529235292452925529265292752928529295293052931529325293352934529355293652937529385293952940529415294252943529445294552946529475294852949529505295152952529535295452955529565295752958529595296052961529625296352964529655296652967529685296952970529715297252973529745297552976529775297852979529805298152982529835298452985529865298752988529895299052991529925299352994529955299652997529985299953000530015300253003530045300553006530075300853009530105301153012530135301453015530165301753018530195302053021530225302353024530255302653027530285302953030530315303253033530345303553036530375303853039530405304153042530435304453045530465304753048530495305053051530525305353054530555305653057530585305953060530615306253063530645306553066530675306853069530705307153072530735307453075530765307753078530795308053081530825308353084530855308653087530885308953090530915309253093530945309553096530975309853099531005310153102531035310453105531065310753108531095311053111531125311353114531155311653117531185311953120531215312253123531245312553126531275312853129531305313153132531335313453135531365313753138531395314053141531425314353144531455314653147531485314953150531515315253153531545315553156531575315853159531605316153162531635316453165531665316753168531695317053171531725317353174531755317653177531785317953180531815318253183531845318553186531875318853189531905319153192531935319453195531965319753198531995320053201532025320353204532055320653207532085320953210532115321253213532145321553216532175321853219532205322153222532235322453225532265322753228532295323053231532325323353234532355323653237532385323953240532415324253243532445324553246532475324853249532505325153252532535325453255532565325753258532595326053261532625326353264532655326653267532685326953270532715327253273532745327553276532775327853279532805328153282532835328453285532865328753288532895329053291532925329353294532955329653297532985329953300533015330253303533045330553306533075330853309533105331153312533135331453315533165331753318533195332053321533225332353324533255332653327533285332953330533315333253333533345333553336533375333853339533405334153342533435334453345533465334753348533495335053351533525335353354533555335653357533585335953360533615336253363533645336553366533675336853369533705337153372533735337453375533765337753378533795338053381533825338353384533855338653387533885338953390533915339253393533945339553396533975339853399534005340153402534035340453405534065340753408534095341053411534125341353414534155341653417534185341953420534215342253423534245342553426534275342853429534305343153432534335343453435534365343753438534395344053441534425344353444534455344653447534485344953450534515345253453534545345553456534575345853459534605346153462534635346453465534665346753468534695347053471534725347353474534755347653477534785347953480534815348253483534845348553486534875348853489534905349153492534935349453495534965349753498534995350053501535025350353504535055350653507535085350953510535115351253513535145351553516535175351853519535205352153522535235352453525535265352753528535295353053531535325353353534535355353653537535385353953540535415354253543535445354553546535475354853549535505355153552535535355453555535565355753558535595356053561535625356353564535655356653567535685356953570535715357253573535745357553576535775357853579535805358153582535835358453585535865358753588535895359053591535925359353594535955359653597535985359953600536015360253603536045360553606536075360853609536105361153612536135361453615536165361753618536195362053621536225362353624536255362653627536285362953630536315363253633536345363553636536375363853639536405364153642536435364453645536465364753648536495365053651536525365353654536555365653657536585365953660536615366253663536645366553666536675366853669536705367153672536735367453675536765367753678536795368053681536825368353684536855368653687536885368953690536915369253693536945369553696536975369853699537005370153702537035370453705537065370753708537095371053711537125371353714537155371653717537185371953720537215372253723537245372553726537275372853729537305373153732537335373453735537365373753738537395374053741537425374353744537455374653747537485374953750537515375253753537545375553756537575375853759537605376153762537635376453765537665376753768537695377053771537725377353774537755377653777537785377953780537815378253783537845378553786537875378853789537905379153792537935379453795537965379753798537995380053801538025380353804538055380653807538085380953810538115381253813538145381553816538175381853819538205382153822538235382453825538265382753828538295383053831538325383353834538355383653837538385383953840538415384253843538445384553846538475384853849538505385153852538535385453855538565385753858538595386053861538625386353864538655386653867538685386953870538715387253873538745387553876538775387853879538805388153882538835388453885538865388753888538895389053891538925389353894538955389653897538985389953900539015390253903539045390553906539075390853909539105391153912539135391453915539165391753918539195392053921539225392353924539255392653927539285392953930539315393253933539345393553936539375393853939539405394153942539435394453945539465394753948539495395053951539525395353954539555395653957539585395953960539615396253963539645396553966539675396853969539705397153972539735397453975539765397753978539795398053981539825398353984539855398653987539885398953990539915399253993539945399553996539975399853999540005400154002540035400454005540065400754008540095401054011540125401354014540155401654017540185401954020540215402254023540245402554026540275402854029540305403154032540335403454035540365403754038540395404054041540425404354044540455404654047540485404954050540515405254053540545405554056540575405854059540605406154062540635406454065540665406754068540695407054071540725407354074540755407654077540785407954080540815408254083540845408554086540875408854089540905409154092540935409454095540965409754098540995410054101541025410354104541055410654107541085410954110541115411254113541145411554116541175411854119541205412154122541235412454125541265412754128541295413054131541325413354134541355413654137541385413954140541415414254143541445414554146541475414854149541505415154152541535415454155541565415754158541595416054161541625416354164541655416654167541685416954170541715417254173541745417554176541775417854179541805418154182541835418454185541865418754188541895419054191541925419354194541955419654197541985419954200542015420254203542045420554206542075420854209542105421154212542135421454215542165421754218542195422054221542225422354224542255422654227542285422954230542315423254233542345423554236542375423854239542405424154242542435424454245542465424754248542495425054251542525425354254542555425654257542585425954260542615426254263542645426554266542675426854269542705427154272542735427454275542765427754278542795428054281542825428354284542855428654287542885428954290542915429254293542945429554296542975429854299543005430154302543035430454305543065430754308543095431054311543125431354314543155431654317543185431954320543215432254323543245432554326543275432854329543305433154332543335433454335543365433754338543395434054341543425434354344543455434654347543485434954350543515435254353543545435554356543575435854359543605436154362543635436454365543665436754368543695437054371543725437354374543755437654377543785437954380543815438254383543845438554386543875438854389543905439154392543935439454395543965439754398543995440054401544025440354404544055440654407544085440954410544115441254413544145441554416544175441854419544205442154422544235442454425544265442754428544295443054431544325443354434544355443654437544385443954440544415444254443544445444554446544475444854449544505445154452544535445454455544565445754458544595446054461544625446354464544655446654467544685446954470544715447254473544745447554476544775447854479544805448154482544835448454485544865448754488544895449054491544925449354494544955449654497544985449954500545015450254503545045450554506545075450854509545105451154512545135451454515545165451754518545195452054521545225452354524545255452654527545285452954530545315453254533545345453554536545375453854539545405454154542545435454454545545465454754548545495455054551545525455354554545555455654557545585455954560545615456254563545645456554566545675456854569545705457154572545735457454575545765457754578545795458054581545825458354584545855458654587545885458954590545915459254593545945459554596545975459854599546005460154602546035460454605546065460754608546095461054611546125461354614546155461654617546185461954620546215462254623546245462554626546275462854629546305463154632546335463454635546365463754638546395464054641546425464354644546455464654647546485464954650546515465254653546545465554656546575465854659546605466154662546635466454665546665466754668546695467054671546725467354674546755467654677546785467954680546815468254683546845468554686546875468854689546905469154692546935469454695546965469754698546995470054701547025470354704547055470654707547085470954710547115471254713547145471554716547175471854719547205472154722547235472454725547265472754728547295473054731547325473354734547355473654737547385473954740547415474254743547445474554746547475474854749547505475154752547535475454755547565475754758547595476054761547625476354764547655476654767547685476954770547715477254773547745477554776547775477854779547805478154782547835478454785547865478754788547895479054791547925479354794547955479654797547985479954800548015480254803548045480554806548075480854809548105481154812548135481454815548165481754818548195482054821548225482354824548255482654827548285482954830548315483254833548345483554836548375483854839548405484154842548435484454845548465484754848548495485054851548525485354854548555485654857548585485954860548615486254863548645486554866548675486854869548705487154872548735487454875548765487754878548795488054881548825488354884548855488654887548885488954890548915489254893548945489554896548975489854899549005490154902549035490454905549065490754908549095491054911549125491354914549155491654917549185491954920549215492254923549245492554926549275492854929549305493154932549335493454935549365493754938549395494054941549425494354944549455494654947549485494954950549515495254953549545495554956549575495854959549605496154962549635496454965549665496754968549695497054971549725497354974549755497654977549785497954980549815498254983549845498554986549875498854989549905499154992549935499454995549965499754998549995500055001550025500355004550055500655007550085500955010550115501255013550145501555016550175501855019550205502155022550235502455025550265502755028550295503055031550325503355034550355503655037550385503955040550415504255043550445504555046550475504855049550505505155052550535505455055550565505755058550595506055061550625506355064550655506655067550685506955070550715507255073550745507555076550775507855079550805508155082550835508455085550865508755088550895509055091550925509355094550955509655097550985509955100551015510255103551045510555106551075510855109551105511155112551135511455115551165511755118551195512055121551225512355124551255512655127551285512955130551315513255133551345513555136551375513855139551405514155142551435514455145551465514755148551495515055151551525515355154551555515655157551585515955160551615516255163551645516555166551675516855169551705517155172551735517455175551765517755178551795518055181551825518355184551855518655187551885518955190551915519255193551945519555196551975519855199552005520155202552035520455205552065520755208552095521055211552125521355214552155521655217552185521955220552215522255223552245522555226552275522855229552305523155232552335523455235552365523755238552395524055241552425524355244552455524655247552485524955250552515525255253552545525555256552575525855259552605526155262552635526455265552665526755268552695527055271552725527355274552755527655277552785527955280552815528255283552845528555286552875528855289552905529155292552935529455295552965529755298552995530055301553025530355304553055530655307553085530955310553115531255313553145531555316553175531855319553205532155322553235532455325553265532755328553295533055331553325533355334553355533655337553385533955340553415534255343553445534555346553475534855349553505535155352553535535455355553565535755358553595536055361553625536355364553655536655367553685536955370553715537255373553745537555376553775537855379553805538155382553835538455385553865538755388553895539055391553925539355394553955539655397553985539955400554015540255403554045540555406554075540855409554105541155412554135541455415554165541755418554195542055421554225542355424554255542655427554285542955430554315543255433554345543555436554375543855439554405544155442554435544455445554465544755448554495545055451554525545355454554555545655457554585545955460554615546255463554645546555466554675546855469554705547155472554735547455475554765547755478554795548055481554825548355484554855548655487554885548955490554915549255493554945549555496554975549855499555005550155502555035550455505555065550755508555095551055511555125551355514555155551655517555185551955520555215552255523555245552555526555275552855529555305553155532555335553455535555365553755538555395554055541555425554355544555455554655547555485554955550555515555255553555545555555556555575555855559555605556155562555635556455565555665556755568555695557055571555725557355574555755557655577555785557955580555815558255583555845558555586555875558855589555905559155592555935559455595555965559755598555995560055601556025560355604556055560655607556085560955610556115561255613556145561555616556175561855619556205562155622556235562455625556265562755628556295563055631556325563355634556355563655637556385563955640556415564255643556445564555646556475564855649556505565155652556535565455655556565565755658556595566055661556625566355664556655566655667556685566955670556715567255673556745567555676556775567855679556805568155682556835568455685556865568755688556895569055691556925569355694556955569655697556985569955700557015570255703557045570555706557075570855709557105571155712557135571455715557165571755718557195572055721557225572355724557255572655727557285572955730557315573255733557345573555736557375573855739557405574155742557435574455745557465574755748557495575055751557525575355754557555575655757557585575955760557615576255763557645576555766557675576855769557705577155772557735577455775557765577755778557795578055781557825578355784557855578655787557885578955790557915579255793557945579555796557975579855799558005580155802558035580455805558065580755808558095581055811558125581355814558155581655817558185581955820558215582255823558245582555826558275582855829558305583155832558335583455835558365583755838558395584055841558425584355844558455584655847558485584955850558515585255853558545585555856558575585855859558605586155862558635586455865558665586755868558695587055871558725587355874558755587655877558785587955880558815588255883558845588555886558875588855889558905589155892558935589455895558965589755898558995590055901559025590355904559055590655907559085590955910559115591255913559145591555916559175591855919559205592155922559235592455925559265592755928559295593055931559325593355934559355593655937559385593955940559415594255943559445594555946559475594855949559505595155952559535595455955559565595755958559595596055961559625596355964559655596655967559685596955970559715597255973559745597555976559775597855979559805598155982559835598455985559865598755988559895599055991559925599355994559955599655997559985599956000560015600256003560045600556006560075600856009560105601156012560135601456015560165601756018560195602056021560225602356024560255602656027560285602956030560315603256033560345603556036560375603856039560405604156042560435604456045560465604756048560495605056051560525605356054560555605656057560585605956060560615606256063560645606556066560675606856069560705607156072560735607456075560765607756078560795608056081560825608356084560855608656087560885608956090560915609256093560945609556096560975609856099561005610156102561035610456105561065610756108561095611056111561125611356114561155611656117561185611956120561215612256123561245612556126561275612856129561305613156132561335613456135561365613756138561395614056141561425614356144561455614656147561485614956150561515615256153561545615556156561575615856159561605616156162561635616456165561665616756168561695617056171561725617356174561755617656177561785617956180561815618256183561845618556186561875618856189561905619156192561935619456195561965619756198561995620056201562025620356204562055620656207562085620956210562115621256213562145621556216562175621856219562205622156222562235622456225562265622756228562295623056231562325623356234562355623656237562385623956240562415624256243562445624556246562475624856249562505625156252562535625456255562565625756258562595626056261562625626356264562655626656267562685626956270562715627256273562745627556276562775627856279562805628156282562835628456285562865628756288562895629056291562925629356294562955629656297562985629956300563015630256303563045630556306563075630856309563105631156312563135631456315563165631756318563195632056321563225632356324563255632656327563285632956330563315633256333563345633556336563375633856339563405634156342563435634456345563465634756348563495635056351563525635356354563555635656357563585635956360563615636256363563645636556366563675636856369563705637156372563735637456375563765637756378563795638056381563825638356384563855638656387563885638956390563915639256393563945639556396563975639856399564005640156402564035640456405564065640756408564095641056411564125641356414564155641656417564185641956420564215642256423564245642556426564275642856429564305643156432564335643456435564365643756438564395644056441564425644356444564455644656447564485644956450564515645256453564545645556456564575645856459564605646156462564635646456465564665646756468564695647056471564725647356474564755647656477564785647956480564815648256483564845648556486564875648856489564905649156492564935649456495564965649756498564995650056501565025650356504565055650656507565085650956510565115651256513565145651556516565175651856519565205652156522565235652456525565265652756528565295653056531565325653356534565355653656537565385653956540565415654256543565445654556546565475654856549565505655156552565535655456555565565655756558565595656056561565625656356564565655656656567565685656956570565715657256573565745657556576565775657856579565805658156582565835658456585565865658756588565895659056591565925659356594565955659656597565985659956600566015660256603566045660556606566075660856609566105661156612566135661456615566165661756618566195662056621566225662356624566255662656627566285662956630566315663256633566345663556636566375663856639566405664156642566435664456645566465664756648566495665056651566525665356654566555665656657566585665956660566615666256663566645666556666566675666856669566705667156672566735667456675566765667756678566795668056681566825668356684566855668656687566885668956690566915669256693566945669556696566975669856699567005670156702567035670456705567065670756708567095671056711567125671356714567155671656717567185671956720567215672256723567245672556726567275672856729567305673156732567335673456735567365673756738567395674056741567425674356744567455674656747567485674956750567515675256753567545675556756567575675856759567605676156762567635676456765567665676756768567695677056771567725677356774567755677656777567785677956780567815678256783567845678556786567875678856789567905679156792567935679456795567965679756798567995680056801568025680356804568055680656807568085680956810568115681256813568145681556816568175681856819568205682156822568235682456825568265682756828568295683056831568325683356834568355683656837568385683956840568415684256843568445684556846568475684856849568505685156852568535685456855568565685756858568595686056861568625686356864568655686656867568685686956870568715687256873568745687556876568775687856879568805688156882568835688456885568865688756888568895689056891568925689356894568955689656897568985689956900569015690256903569045690556906569075690856909569105691156912569135691456915569165691756918569195692056921569225692356924569255692656927569285692956930569315693256933569345693556936569375693856939569405694156942569435694456945569465694756948569495695056951569525695356954569555695656957569585695956960569615696256963569645696556966569675696856969569705697156972569735697456975569765697756978569795698056981569825698356984569855698656987569885698956990569915699256993569945699556996569975699856999570005700157002570035700457005570065700757008570095701057011570125701357014570155701657017570185701957020570215702257023570245702557026570275702857029570305703157032570335703457035570365703757038570395704057041570425704357044570455704657047570485704957050570515705257053570545705557056570575705857059570605706157062570635706457065570665706757068570695707057071570725707357074570755707657077570785707957080570815708257083570845708557086570875708857089570905709157092570935709457095570965709757098570995710057101571025710357104571055710657107571085710957110571115711257113571145711557116571175711857119571205712157122571235712457125571265712757128571295713057131571325713357134571355713657137571385713957140571415714257143571445714557146571475714857149571505715157152571535715457155571565715757158571595716057161571625716357164571655716657167571685716957170571715717257173571745717557176571775717857179571805718157182571835718457185571865718757188571895719057191571925719357194571955719657197571985719957200572015720257203572045720557206572075720857209572105721157212572135721457215572165721757218572195722057221572225722357224572255722657227572285722957230572315723257233572345723557236572375723857239572405724157242572435724457245572465724757248572495725057251572525725357254572555725657257572585725957260572615726257263572645726557266572675726857269572705727157272572735727457275572765727757278572795728057281572825728357284572855728657287572885728957290572915729257293572945729557296572975729857299573005730157302573035730457305573065730757308573095731057311573125731357314573155731657317573185731957320573215732257323573245732557326573275732857329573305733157332573335733457335573365733757338573395734057341573425734357344573455734657347573485734957350573515735257353573545735557356573575735857359573605736157362573635736457365573665736757368573695737057371573725737357374573755737657377573785737957380573815738257383573845738557386573875738857389573905739157392573935739457395573965739757398573995740057401574025740357404574055740657407574085740957410574115741257413574145741557416574175741857419574205742157422574235742457425574265742757428574295743057431574325743357434574355743657437574385743957440574415744257443574445744557446574475744857449574505745157452574535745457455574565745757458574595746057461574625746357464574655746657467574685746957470574715747257473574745747557476574775747857479574805748157482574835748457485574865748757488574895749057491574925749357494574955749657497574985749957500575015750257503575045750557506575075750857509575105751157512575135751457515575165751757518575195752057521575225752357524575255752657527575285752957530575315753257533575345753557536575375753857539575405754157542575435754457545575465754757548575495755057551575525755357554575555755657557575585755957560575615756257563575645756557566575675756857569575705757157572575735757457575575765757757578575795758057581575825758357584575855758657587575885758957590575915759257593575945759557596575975759857599576005760157602576035760457605576065760757608576095761057611576125761357614576155761657617576185761957620576215762257623576245762557626576275762857629576305763157632576335763457635576365763757638576395764057641576425764357644576455764657647576485764957650576515765257653576545765557656576575765857659576605766157662576635766457665576665766757668576695767057671576725767357674576755767657677576785767957680576815768257683576845768557686576875768857689576905769157692576935769457695576965769757698576995770057701577025770357704577055770657707577085770957710577115771257713577145771557716577175771857719577205772157722577235772457725577265772757728577295773057731577325773357734577355773657737577385773957740577415774257743577445774557746577475774857749577505775157752577535775457755577565775757758577595776057761577625776357764577655776657767577685776957770577715777257773577745777557776577775777857779577805778157782577835778457785577865778757788577895779057791577925779357794577955779657797577985779957800578015780257803578045780557806578075780857809578105781157812578135781457815578165781757818578195782057821578225782357824578255782657827578285782957830578315783257833578345783557836578375783857839578405784157842578435784457845578465784757848578495785057851578525785357854578555785657857578585785957860578615786257863578645786557866578675786857869578705787157872578735787457875578765787757878578795788057881578825788357884578855788657887578885788957890578915789257893578945789557896578975789857899579005790157902579035790457905579065790757908579095791057911579125791357914579155791657917579185791957920579215792257923579245792557926579275792857929579305793157932579335793457935579365793757938579395794057941579425794357944579455794657947579485794957950579515795257953579545795557956579575795857959579605796157962579635796457965579665796757968579695797057971579725797357974579755797657977579785797957980579815798257983579845798557986579875798857989579905799157992579935799457995579965799757998579995800058001580025800358004580055800658007580085800958010580115801258013580145801558016580175801858019580205802158022580235802458025580265802758028580295803058031580325803358034580355803658037580385803958040580415804258043580445804558046580475804858049580505805158052580535805458055580565805758058580595806058061580625806358064580655806658067580685806958070580715807258073580745807558076580775807858079580805808158082580835808458085580865808758088580895809058091580925809358094580955809658097580985809958100581015810258103581045810558106581075810858109581105811158112581135811458115581165811758118581195812058121581225812358124581255812658127581285812958130581315813258133581345813558136581375813858139581405814158142581435814458145581465814758148581495815058151581525815358154581555815658157581585815958160581615816258163581645816558166581675816858169581705817158172581735817458175581765817758178581795818058181581825818358184581855818658187581885818958190581915819258193581945819558196581975819858199582005820158202582035820458205582065820758208582095821058211582125821358214582155821658217582185821958220582215822258223582245822558226582275822858229582305823158232582335823458235582365823758238582395824058241582425824358244582455824658247582485824958250582515825258253582545825558256582575825858259582605826158262582635826458265582665826758268582695827058271582725827358274582755827658277582785827958280582815828258283582845828558286582875828858289582905829158292582935829458295582965829758298582995830058301583025830358304583055830658307583085830958310583115831258313583145831558316583175831858319583205832158322583235832458325583265832758328583295833058331583325833358334583355833658337583385833958340583415834258343583445834558346583475834858349583505835158352583535835458355583565835758358583595836058361583625836358364583655836658367583685836958370583715837258373583745837558376583775837858379583805838158382583835838458385583865838758388583895839058391583925839358394583955839658397583985839958400584015840258403584045840558406584075840858409584105841158412584135841458415584165841758418584195842058421584225842358424584255842658427584285842958430584315843258433584345843558436584375843858439584405844158442584435844458445584465844758448584495845058451584525845358454584555845658457584585845958460584615846258463584645846558466584675846858469584705847158472584735847458475584765847758478584795848058481584825848358484584855848658487584885848958490584915849258493584945849558496584975849858499585005850158502585035850458505585065850758508585095851058511585125851358514585155851658517585185851958520585215852258523585245852558526585275852858529585305853158532585335853458535585365853758538585395854058541585425854358544585455854658547585485854958550585515855258553585545855558556585575855858559585605856158562585635856458565585665856758568585695857058571585725857358574585755857658577585785857958580585815858258583585845858558586585875858858589585905859158592585935859458595585965859758598585995860058601586025860358604586055860658607586085860958610586115861258613586145861558616586175861858619586205862158622586235862458625586265862758628586295863058631586325863358634586355863658637586385863958640586415864258643586445864558646586475864858649586505865158652586535865458655586565865758658586595866058661586625866358664586655866658667586685866958670586715867258673586745867558676586775867858679586805868158682586835868458685586865868758688586895869058691586925869358694586955869658697586985869958700587015870258703587045870558706587075870858709587105871158712587135871458715587165871758718587195872058721587225872358724587255872658727587285872958730587315873258733587345873558736587375873858739587405874158742587435874458745587465874758748587495875058751587525875358754587555875658757587585875958760587615876258763587645876558766587675876858769587705877158772587735877458775587765877758778587795878058781587825878358784587855878658787587885878958790587915879258793587945879558796587975879858799588005880158802588035880458805588065880758808588095881058811588125881358814588155881658817588185881958820588215882258823588245882558826588275882858829588305883158832588335883458835588365883758838588395884058841588425884358844588455884658847588485884958850588515885258853588545885558856588575885858859588605886158862588635886458865588665886758868588695887058871588725887358874588755887658877588785887958880588815888258883588845888558886588875888858889588905889158892588935889458895588965889758898588995890058901589025890358904589055890658907589085890958910589115891258913589145891558916589175891858919589205892158922589235892458925589265892758928589295893058931589325893358934589355893658937589385893958940589415894258943589445894558946589475894858949589505895158952589535895458955589565895758958589595896058961589625896358964589655896658967589685896958970589715897258973589745897558976589775897858979589805898158982589835898458985589865898758988589895899058991589925899358994589955899658997589985899959000590015900259003590045900559006590075900859009590105901159012590135901459015590165901759018590195902059021590225902359024590255902659027590285902959030590315903259033590345903559036590375903859039590405904159042590435904459045590465904759048590495905059051590525905359054590555905659057590585905959060590615906259063590645906559066590675906859069590705907159072590735907459075590765907759078590795908059081590825908359084590855908659087590885908959090590915909259093590945909559096590975909859099591005910159102591035910459105591065910759108591095911059111591125911359114591155911659117591185911959120591215912259123591245912559126591275912859129591305913159132591335913459135591365913759138591395914059141591425914359144591455914659147591485914959150591515915259153591545915559156591575915859159591605916159162591635916459165591665916759168591695917059171591725917359174591755917659177591785917959180591815918259183591845918559186591875918859189591905919159192
  1. /*
  2. * MbedTLS Source Code Library Source
  3. */
  4. #include "mbedtls.h"
  5. #if ME_COM_MBEDTLS
  6. /********* Start of file library/aes.c ************/
  7. /*
  8. * FIPS-197 compliant AES implementation
  9. *
  10. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  11. * SPDX-License-Identifier: Apache-2.0
  12. *
  13. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  14. * not use this file except in compliance with the License.
  15. * You may obtain a copy of the License at
  16. *
  17. * http://www.apache.org/licenses/LICENSE-2.0
  18. *
  19. * Unless required by applicable law or agreed to in writing, software
  20. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  21. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  22. * See the License for the specific language governing permissions and
  23. * limitations under the License.
  24. *
  25. * This file is part of mbed TLS (https://tls.mbed.org)
  26. */
  27. /*
  28. * The AES block cipher was designed by Vincent Rijmen and Joan Daemen.
  29. *
  30. * http://csrc.nist.gov/encryption/aes/rijndael/Rijndael.pdf
  31. * http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf
  32. */
  33. #if !defined(MBEDTLS_CONFIG_FILE)
  34. #else
  35. #endif
  36. #if defined(MBEDTLS_AES_C)
  37. #include <string.h>
  38. #if defined(MBEDTLS_PADLOCK_C)
  39. #endif
  40. #if defined(MBEDTLS_AESNI_C)
  41. #endif
  42. #if defined(MBEDTLS_SELF_TEST)
  43. #if defined(MBEDTLS_PLATFORM_C)
  44. #else
  45. #include <stdio.h>
  46. #define mbedtls_printf printf
  47. #endif /* MBEDTLS_PLATFORM_C */
  48. #endif /* MBEDTLS_SELF_TEST */
  49. #if !defined(MBEDTLS_AES_ALT)
  50. /* Amalgamated Release Mappings */
  51. #define FSb AESFSb
  52. /* Implementation that should never be optimized out by the compiler */
  53. static void aes_zeroize( void *v, size_t n ) {
  54. volatile unsigned char *p = v; while( n-- ) *p++ = 0;
  55. }
  56. /*
  57. * 32-bit integer manipulation macros (little endian)
  58. */
  59. #ifndef GET_UINT32_LE
  60. #define GET_UINT32_LE(n,b,i) \
  61. { \
  62. (n) = ( (uint32_t) (b)[(i) ] ) \
  63. | ( (uint32_t) (b)[(i) + 1] << 8 ) \
  64. | ( (uint32_t) (b)[(i) + 2] << 16 ) \
  65. | ( (uint32_t) (b)[(i) + 3] << 24 ); \
  66. }
  67. #endif
  68. #ifndef PUT_UINT32_LE
  69. #define PUT_UINT32_LE(n,b,i) \
  70. { \
  71. (b)[(i) ] = (unsigned char) ( ( (n) ) & 0xFF ); \
  72. (b)[(i) + 1] = (unsigned char) ( ( (n) >> 8 ) & 0xFF ); \
  73. (b)[(i) + 2] = (unsigned char) ( ( (n) >> 16 ) & 0xFF ); \
  74. (b)[(i) + 3] = (unsigned char) ( ( (n) >> 24 ) & 0xFF ); \
  75. }
  76. #endif
  77. #if defined(MBEDTLS_PADLOCK_C) && \
  78. ( defined(MBEDTLS_HAVE_X86) || defined(MBEDTLS_PADLOCK_ALIGN16) )
  79. static int aes_padlock_ace = -1;
  80. #endif
  81. #if defined(MBEDTLS_AES_ROM_TABLES)
  82. /*
  83. * Forward S-box
  84. */
  85. static const unsigned char FSb[256] =
  86. {
  87. 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5,
  88. 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
  89. 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,
  90. 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
  91. 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC,
  92. 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
  93. 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A,
  94. 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
  95. 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0,
  96. 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
  97. 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B,
  98. 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
  99. 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85,
  100. 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
  101. 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5,
  102. 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
  103. 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17,
  104. 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
  105. 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88,
  106. 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
  107. 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C,
  108. 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
  109. 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9,
  110. 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
  111. 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6,
  112. 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
  113. 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E,
  114. 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
  115. 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94,
  116. 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
  117. 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68,
  118. 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
  119. };
  120. /*
  121. * Forward tables
  122. */
  123. #define FT \
  124. \
  125. V(A5,63,63,C6), V(84,7C,7C,F8), V(99,77,77,EE), V(8D,7B,7B,F6), \
  126. V(0D,F2,F2,FF), V(BD,6B,6B,D6), V(B1,6F,6F,DE), V(54,C5,C5,91), \
  127. V(50,30,30,60), V(03,01,01,02), V(A9,67,67,CE), V(7D,2B,2B,56), \
  128. V(19,FE,FE,E7), V(62,D7,D7,B5), V(E6,AB,AB,4D), V(9A,76,76,EC), \
  129. V(45,CA,CA,8F), V(9D,82,82,1F), V(40,C9,C9,89), V(87,7D,7D,FA), \
  130. V(15,FA,FA,EF), V(EB,59,59,B2), V(C9,47,47,8E), V(0B,F0,F0,FB), \
  131. V(EC,AD,AD,41), V(67,D4,D4,B3), V(FD,A2,A2,5F), V(EA,AF,AF,45), \
  132. V(BF,9C,9C,23), V(F7,A4,A4,53), V(96,72,72,E4), V(5B,C0,C0,9B), \
  133. V(C2,B7,B7,75), V(1C,FD,FD,E1), V(AE,93,93,3D), V(6A,26,26,4C), \
  134. V(5A,36,36,6C), V(41,3F,3F,7E), V(02,F7,F7,F5), V(4F,CC,CC,83), \
  135. V(5C,34,34,68), V(F4,A5,A5,51), V(34,E5,E5,D1), V(08,F1,F1,F9), \
  136. V(93,71,71,E2), V(73,D8,D8,AB), V(53,31,31,62), V(3F,15,15,2A), \
  137. V(0C,04,04,08), V(52,C7,C7,95), V(65,23,23,46), V(5E,C3,C3,9D), \
  138. V(28,18,18,30), V(A1,96,96,37), V(0F,05,05,0A), V(B5,9A,9A,2F), \
  139. V(09,07,07,0E), V(36,12,12,24), V(9B,80,80,1B), V(3D,E2,E2,DF), \
  140. V(26,EB,EB,CD), V(69,27,27,4E), V(CD,B2,B2,7F), V(9F,75,75,EA), \
  141. V(1B,09,09,12), V(9E,83,83,1D), V(74,2C,2C,58), V(2E,1A,1A,34), \
  142. V(2D,1B,1B,36), V(B2,6E,6E,DC), V(EE,5A,5A,B4), V(FB,A0,A0,5B), \
  143. V(F6,52,52,A4), V(4D,3B,3B,76), V(61,D6,D6,B7), V(CE,B3,B3,7D), \
  144. V(7B,29,29,52), V(3E,E3,E3,DD), V(71,2F,2F,5E), V(97,84,84,13), \
  145. V(F5,53,53,A6), V(68,D1,D1,B9), V(00,00,00,00), V(2C,ED,ED,C1), \
  146. V(60,20,20,40), V(1F,FC,FC,E3), V(C8,B1,B1,79), V(ED,5B,5B,B6), \
  147. V(BE,6A,6A,D4), V(46,CB,CB,8D), V(D9,BE,BE,67), V(4B,39,39,72), \
  148. V(DE,4A,4A,94), V(D4,4C,4C,98), V(E8,58,58,B0), V(4A,CF,CF,85), \
  149. V(6B,D0,D0,BB), V(2A,EF,EF,C5), V(E5,AA,AA,4F), V(16,FB,FB,ED), \
  150. V(C5,43,43,86), V(D7,4D,4D,9A), V(55,33,33,66), V(94,85,85,11), \
  151. V(CF,45,45,8A), V(10,F9,F9,E9), V(06,02,02,04), V(81,7F,7F,FE), \
  152. V(F0,50,50,A0), V(44,3C,3C,78), V(BA,9F,9F,25), V(E3,A8,A8,4B), \
  153. V(F3,51,51,A2), V(FE,A3,A3,5D), V(C0,40,40,80), V(8A,8F,8F,05), \
  154. V(AD,92,92,3F), V(BC,9D,9D,21), V(48,38,38,70), V(04,F5,F5,F1), \
  155. V(DF,BC,BC,63), V(C1,B6,B6,77), V(75,DA,DA,AF), V(63,21,21,42), \
  156. V(30,10,10,20), V(1A,FF,FF,E5), V(0E,F3,F3,FD), V(6D,D2,D2,BF), \
  157. V(4C,CD,CD,81), V(14,0C,0C,18), V(35,13,13,26), V(2F,EC,EC,C3), \
  158. V(E1,5F,5F,BE), V(A2,97,97,35), V(CC,44,44,88), V(39,17,17,2E), \
  159. V(57,C4,C4,93), V(F2,A7,A7,55), V(82,7E,7E,FC), V(47,3D,3D,7A), \
  160. V(AC,64,64,C8), V(E7,5D,5D,BA), V(2B,19,19,32), V(95,73,73,E6), \
  161. V(A0,60,60,C0), V(98,81,81,19), V(D1,4F,4F,9E), V(7F,DC,DC,A3), \
  162. V(66,22,22,44), V(7E,2A,2A,54), V(AB,90,90,3B), V(83,88,88,0B), \
  163. V(CA,46,46,8C), V(29,EE,EE,C7), V(D3,B8,B8,6B), V(3C,14,14,28), \
  164. V(79,DE,DE,A7), V(E2,5E,5E,BC), V(1D,0B,0B,16), V(76,DB,DB,AD), \
  165. V(3B,E0,E0,DB), V(56,32,32,64), V(4E,3A,3A,74), V(1E,0A,0A,14), \
  166. V(DB,49,49,92), V(0A,06,06,0C), V(6C,24,24,48), V(E4,5C,5C,B8), \
  167. V(5D,C2,C2,9F), V(6E,D3,D3,BD), V(EF,AC,AC,43), V(A6,62,62,C4), \
  168. V(A8,91,91,39), V(A4,95,95,31), V(37,E4,E4,D3), V(8B,79,79,F2), \
  169. V(32,E7,E7,D5), V(43,C8,C8,8B), V(59,37,37,6E), V(B7,6D,6D,DA), \
  170. V(8C,8D,8D,01), V(64,D5,D5,B1), V(D2,4E,4E,9C), V(E0,A9,A9,49), \
  171. V(B4,6C,6C,D8), V(FA,56,56,AC), V(07,F4,F4,F3), V(25,EA,EA,CF), \
  172. V(AF,65,65,CA), V(8E,7A,7A,F4), V(E9,AE,AE,47), V(18,08,08,10), \
  173. V(D5,BA,BA,6F), V(88,78,78,F0), V(6F,25,25,4A), V(72,2E,2E,5C), \
  174. V(24,1C,1C,38), V(F1,A6,A6,57), V(C7,B4,B4,73), V(51,C6,C6,97), \
  175. V(23,E8,E8,CB), V(7C,DD,DD,A1), V(9C,74,74,E8), V(21,1F,1F,3E), \
  176. V(DD,4B,4B,96), V(DC,BD,BD,61), V(86,8B,8B,0D), V(85,8A,8A,0F), \
  177. V(90,70,70,E0), V(42,3E,3E,7C), V(C4,B5,B5,71), V(AA,66,66,CC), \
  178. V(D8,48,48,90), V(05,03,03,06), V(01,F6,F6,F7), V(12,0E,0E,1C), \
  179. V(A3,61,61,C2), V(5F,35,35,6A), V(F9,57,57,AE), V(D0,B9,B9,69), \
  180. V(91,86,86,17), V(58,C1,C1,99), V(27,1D,1D,3A), V(B9,9E,9E,27), \
  181. V(38,E1,E1,D9), V(13,F8,F8,EB), V(B3,98,98,2B), V(33,11,11,22), \
  182. V(BB,69,69,D2), V(70,D9,D9,A9), V(89,8E,8E,07), V(A7,94,94,33), \
  183. V(B6,9B,9B,2D), V(22,1E,1E,3C), V(92,87,87,15), V(20,E9,E9,C9), \
  184. V(49,CE,CE,87), V(FF,55,55,AA), V(78,28,28,50), V(7A,DF,DF,A5), \
  185. V(8F,8C,8C,03), V(F8,A1,A1,59), V(80,89,89,09), V(17,0D,0D,1A), \
  186. V(DA,BF,BF,65), V(31,E6,E6,D7), V(C6,42,42,84), V(B8,68,68,D0), \
  187. V(C3,41,41,82), V(B0,99,99,29), V(77,2D,2D,5A), V(11,0F,0F,1E), \
  188. V(CB,B0,B0,7B), V(FC,54,54,A8), V(D6,BB,BB,6D), V(3A,16,16,2C)
  189. #define V(a,b,c,d) 0x##a##b##c##d
  190. static const uint32_t FT0[256] = { FT };
  191. #undef V
  192. #define V(a,b,c,d) 0x##b##c##d##a
  193. static const uint32_t FT1[256] = { FT };
  194. #undef V
  195. #define V(a,b,c,d) 0x##c##d##a##b
  196. static const uint32_t FT2[256] = { FT };
  197. #undef V
  198. #define V(a,b,c,d) 0x##d##a##b##c
  199. static const uint32_t FT3[256] = { FT };
  200. #undef V
  201. #undef FT
  202. /*
  203. * Reverse S-box
  204. */
  205. static const unsigned char RSb[256] =
  206. {
  207. 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38,
  208. 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,
  209. 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87,
  210. 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,
  211. 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D,
  212. 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
  213. 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2,
  214. 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,
  215. 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16,
  216. 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,
  217. 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA,
  218. 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
  219. 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A,
  220. 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,
  221. 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02,
  222. 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,
  223. 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA,
  224. 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
  225. 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85,
  226. 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,
  227. 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89,
  228. 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,
  229. 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20,
  230. 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
  231. 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31,
  232. 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,
  233. 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D,
  234. 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,
  235. 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0,
  236. 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
  237. 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26,
  238. 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D
  239. };
  240. /*
  241. * Reverse tables
  242. */
  243. #define RT \
  244. \
  245. V(50,A7,F4,51), V(53,65,41,7E), V(C3,A4,17,1A), V(96,5E,27,3A), \
  246. V(CB,6B,AB,3B), V(F1,45,9D,1F), V(AB,58,FA,AC), V(93,03,E3,4B), \
  247. V(55,FA,30,20), V(F6,6D,76,AD), V(91,76,CC,88), V(25,4C,02,F5), \
  248. V(FC,D7,E5,4F), V(D7,CB,2A,C5), V(80,44,35,26), V(8F,A3,62,B5), \
  249. V(49,5A,B1,DE), V(67,1B,BA,25), V(98,0E,EA,45), V(E1,C0,FE,5D), \
  250. V(02,75,2F,C3), V(12,F0,4C,81), V(A3,97,46,8D), V(C6,F9,D3,6B), \
  251. V(E7,5F,8F,03), V(95,9C,92,15), V(EB,7A,6D,BF), V(DA,59,52,95), \
  252. V(2D,83,BE,D4), V(D3,21,74,58), V(29,69,E0,49), V(44,C8,C9,8E), \
  253. V(6A,89,C2,75), V(78,79,8E,F4), V(6B,3E,58,99), V(DD,71,B9,27), \
  254. V(B6,4F,E1,BE), V(17,AD,88,F0), V(66,AC,20,C9), V(B4,3A,CE,7D), \
  255. V(18,4A,DF,63), V(82,31,1A,E5), V(60,33,51,97), V(45,7F,53,62), \
  256. V(E0,77,64,B1), V(84,AE,6B,BB), V(1C,A0,81,FE), V(94,2B,08,F9), \
  257. V(58,68,48,70), V(19,FD,45,8F), V(87,6C,DE,94), V(B7,F8,7B,52), \
  258. V(23,D3,73,AB), V(E2,02,4B,72), V(57,8F,1F,E3), V(2A,AB,55,66), \
  259. V(07,28,EB,B2), V(03,C2,B5,2F), V(9A,7B,C5,86), V(A5,08,37,D3), \
  260. V(F2,87,28,30), V(B2,A5,BF,23), V(BA,6A,03,02), V(5C,82,16,ED), \
  261. V(2B,1C,CF,8A), V(92,B4,79,A7), V(F0,F2,07,F3), V(A1,E2,69,4E), \
  262. V(CD,F4,DA,65), V(D5,BE,05,06), V(1F,62,34,D1), V(8A,FE,A6,C4), \
  263. V(9D,53,2E,34), V(A0,55,F3,A2), V(32,E1,8A,05), V(75,EB,F6,A4), \
  264. V(39,EC,83,0B), V(AA,EF,60,40), V(06,9F,71,5E), V(51,10,6E,BD), \
  265. V(F9,8A,21,3E), V(3D,06,DD,96), V(AE,05,3E,DD), V(46,BD,E6,4D), \
  266. V(B5,8D,54,91), V(05,5D,C4,71), V(6F,D4,06,04), V(FF,15,50,60), \
  267. V(24,FB,98,19), V(97,E9,BD,D6), V(CC,43,40,89), V(77,9E,D9,67), \
  268. V(BD,42,E8,B0), V(88,8B,89,07), V(38,5B,19,E7), V(DB,EE,C8,79), \
  269. V(47,0A,7C,A1), V(E9,0F,42,7C), V(C9,1E,84,F8), V(00,00,00,00), \
  270. V(83,86,80,09), V(48,ED,2B,32), V(AC,70,11,1E), V(4E,72,5A,6C), \
  271. V(FB,FF,0E,FD), V(56,38,85,0F), V(1E,D5,AE,3D), V(27,39,2D,36), \
  272. V(64,D9,0F,0A), V(21,A6,5C,68), V(D1,54,5B,9B), V(3A,2E,36,24), \
  273. V(B1,67,0A,0C), V(0F,E7,57,93), V(D2,96,EE,B4), V(9E,91,9B,1B), \
  274. V(4F,C5,C0,80), V(A2,20,DC,61), V(69,4B,77,5A), V(16,1A,12,1C), \
  275. V(0A,BA,93,E2), V(E5,2A,A0,C0), V(43,E0,22,3C), V(1D,17,1B,12), \
  276. V(0B,0D,09,0E), V(AD,C7,8B,F2), V(B9,A8,B6,2D), V(C8,A9,1E,14), \
  277. V(85,19,F1,57), V(4C,07,75,AF), V(BB,DD,99,EE), V(FD,60,7F,A3), \
  278. V(9F,26,01,F7), V(BC,F5,72,5C), V(C5,3B,66,44), V(34,7E,FB,5B), \
  279. V(76,29,43,8B), V(DC,C6,23,CB), V(68,FC,ED,B6), V(63,F1,E4,B8), \
  280. V(CA,DC,31,D7), V(10,85,63,42), V(40,22,97,13), V(20,11,C6,84), \
  281. V(7D,24,4A,85), V(F8,3D,BB,D2), V(11,32,F9,AE), V(6D,A1,29,C7), \
  282. V(4B,2F,9E,1D), V(F3,30,B2,DC), V(EC,52,86,0D), V(D0,E3,C1,77), \
  283. V(6C,16,B3,2B), V(99,B9,70,A9), V(FA,48,94,11), V(22,64,E9,47), \
  284. V(C4,8C,FC,A8), V(1A,3F,F0,A0), V(D8,2C,7D,56), V(EF,90,33,22), \
  285. V(C7,4E,49,87), V(C1,D1,38,D9), V(FE,A2,CA,8C), V(36,0B,D4,98), \
  286. V(CF,81,F5,A6), V(28,DE,7A,A5), V(26,8E,B7,DA), V(A4,BF,AD,3F), \
  287. V(E4,9D,3A,2C), V(0D,92,78,50), V(9B,CC,5F,6A), V(62,46,7E,54), \
  288. V(C2,13,8D,F6), V(E8,B8,D8,90), V(5E,F7,39,2E), V(F5,AF,C3,82), \
  289. V(BE,80,5D,9F), V(7C,93,D0,69), V(A9,2D,D5,6F), V(B3,12,25,CF), \
  290. V(3B,99,AC,C8), V(A7,7D,18,10), V(6E,63,9C,E8), V(7B,BB,3B,DB), \
  291. V(09,78,26,CD), V(F4,18,59,6E), V(01,B7,9A,EC), V(A8,9A,4F,83), \
  292. V(65,6E,95,E6), V(7E,E6,FF,AA), V(08,CF,BC,21), V(E6,E8,15,EF), \
  293. V(D9,9B,E7,BA), V(CE,36,6F,4A), V(D4,09,9F,EA), V(D6,7C,B0,29), \
  294. V(AF,B2,A4,31), V(31,23,3F,2A), V(30,94,A5,C6), V(C0,66,A2,35), \
  295. V(37,BC,4E,74), V(A6,CA,82,FC), V(B0,D0,90,E0), V(15,D8,A7,33), \
  296. V(4A,98,04,F1), V(F7,DA,EC,41), V(0E,50,CD,7F), V(2F,F6,91,17), \
  297. V(8D,D6,4D,76), V(4D,B0,EF,43), V(54,4D,AA,CC), V(DF,04,96,E4), \
  298. V(E3,B5,D1,9E), V(1B,88,6A,4C), V(B8,1F,2C,C1), V(7F,51,65,46), \
  299. V(04,EA,5E,9D), V(5D,35,8C,01), V(73,74,87,FA), V(2E,41,0B,FB), \
  300. V(5A,1D,67,B3), V(52,D2,DB,92), V(33,56,10,E9), V(13,47,D6,6D), \
  301. V(8C,61,D7,9A), V(7A,0C,A1,37), V(8E,14,F8,59), V(89,3C,13,EB), \
  302. V(EE,27,A9,CE), V(35,C9,61,B7), V(ED,E5,1C,E1), V(3C,B1,47,7A), \
  303. V(59,DF,D2,9C), V(3F,73,F2,55), V(79,CE,14,18), V(BF,37,C7,73), \
  304. V(EA,CD,F7,53), V(5B,AA,FD,5F), V(14,6F,3D,DF), V(86,DB,44,78), \
  305. V(81,F3,AF,CA), V(3E,C4,68,B9), V(2C,34,24,38), V(5F,40,A3,C2), \
  306. V(72,C3,1D,16), V(0C,25,E2,BC), V(8B,49,3C,28), V(41,95,0D,FF), \
  307. V(71,01,A8,39), V(DE,B3,0C,08), V(9C,E4,B4,D8), V(90,C1,56,64), \
  308. V(61,84,CB,7B), V(70,B6,32,D5), V(74,5C,6C,48), V(42,57,B8,D0)
  309. #define V(a,b,c,d) 0x##a##b##c##d
  310. static const uint32_t RT0[256] = { RT };
  311. #undef V
  312. #define V(a,b,c,d) 0x##b##c##d##a
  313. static const uint32_t RT1[256] = { RT };
  314. #undef V
  315. #define V(a,b,c,d) 0x##c##d##a##b
  316. static const uint32_t RT2[256] = { RT };
  317. #undef V
  318. #define V(a,b,c,d) 0x##d##a##b##c
  319. static const uint32_t RT3[256] = { RT };
  320. #undef V
  321. #undef RT
  322. /*
  323. * Round constants
  324. */
  325. static const uint32_t RCON[10] =
  326. {
  327. 0x00000001, 0x00000002, 0x00000004, 0x00000008,
  328. 0x00000010, 0x00000020, 0x00000040, 0x00000080,
  329. 0x0000001B, 0x00000036
  330. };
  331. #else /* MBEDTLS_AES_ROM_TABLES */
  332. /*
  333. * Forward S-box & tables
  334. */
  335. static unsigned char FSb[256];
  336. static uint32_t FT0[256];
  337. static uint32_t FT1[256];
  338. static uint32_t FT2[256];
  339. static uint32_t FT3[256];
  340. /*
  341. * Reverse S-box & tables
  342. */
  343. static unsigned char RSb[256];
  344. static uint32_t RT0[256];
  345. static uint32_t RT1[256];
  346. static uint32_t RT2[256];
  347. static uint32_t RT3[256];
  348. /*
  349. * Round constants
  350. */
  351. static uint32_t RCON[10];
  352. /*
  353. * Tables generation code
  354. */
  355. #define ROTL8(x) ( ( x << 8 ) & 0xFFFFFFFF ) | ( x >> 24 )
  356. #define XTIME(x) ( ( x << 1 ) ^ ( ( x & 0x80 ) ? 0x1B : 0x00 ) )
  357. #define MUL(x,y) ( ( x && y ) ? pow[(log[x]+log[y]) % 255] : 0 )
  358. static int aes_init_done = 0;
  359. static void aes_gen_tables( void )
  360. {
  361. int i, x, y, z;
  362. int pow[256];
  363. int log[256];
  364. /*
  365. * compute pow and log tables over GF(2^8)
  366. */
  367. for( i = 0, x = 1; i < 256; i++ )
  368. {
  369. pow[i] = x;
  370. log[x] = i;
  371. x = ( x ^ XTIME( x ) ) & 0xFF;
  372. }
  373. /*
  374. * calculate the round constants
  375. */
  376. for( i = 0, x = 1; i < 10; i++ )
  377. {
  378. RCON[i] = (uint32_t) x;
  379. x = XTIME( x ) & 0xFF;
  380. }
  381. /*
  382. * generate the forward and reverse S-boxes
  383. */
  384. FSb[0x00] = 0x63;
  385. RSb[0x63] = 0x00;
  386. for( i = 1; i < 256; i++ )
  387. {
  388. x = pow[255 - log[i]];
  389. y = x; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
  390. x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
  391. x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
  392. x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;
  393. x ^= y ^ 0x63;
  394. FSb[i] = (unsigned char) x;
  395. RSb[x] = (unsigned char) i;
  396. }
  397. /*
  398. * generate the forward and reverse tables
  399. */
  400. for( i = 0; i < 256; i++ )
  401. {
  402. x = FSb[i];
  403. y = XTIME( x ) & 0xFF;
  404. z = ( y ^ x ) & 0xFF;
  405. FT0[i] = ( (uint32_t) y ) ^
  406. ( (uint32_t) x << 8 ) ^
  407. ( (uint32_t) x << 16 ) ^
  408. ( (uint32_t) z << 24 );
  409. FT1[i] = ROTL8( FT0[i] );
  410. FT2[i] = ROTL8( FT1[i] );
  411. FT3[i] = ROTL8( FT2[i] );
  412. x = RSb[i];
  413. RT0[i] = ( (uint32_t) MUL( 0x0E, x ) ) ^
  414. ( (uint32_t) MUL( 0x09, x ) << 8 ) ^
  415. ( (uint32_t) MUL( 0x0D, x ) << 16 ) ^
  416. ( (uint32_t) MUL( 0x0B, x ) << 24 );
  417. RT1[i] = ROTL8( RT0[i] );
  418. RT2[i] = ROTL8( RT1[i] );
  419. RT3[i] = ROTL8( RT2[i] );
  420. }
  421. }
  422. #endif /* MBEDTLS_AES_ROM_TABLES */
  423. void mbedtls_aes_init( mbedtls_aes_context *ctx )
  424. {
  425. memset( ctx, 0, sizeof( mbedtls_aes_context ) );
  426. }
  427. void mbedtls_aes_free( mbedtls_aes_context *ctx )
  428. {
  429. if( ctx == NULL )
  430. return;
  431. aes_zeroize( ctx, sizeof( mbedtls_aes_context ) );
  432. }
  433. /*
  434. * AES key schedule (encryption)
  435. */
  436. #if !defined(MBEDTLS_AES_SETKEY_ENC_ALT)
  437. int mbedtls_aes_setkey_enc( mbedtls_aes_context *ctx, const unsigned char *key,
  438. unsigned int keybits )
  439. {
  440. unsigned int i;
  441. uint32_t *RK;
  442. #if !defined(MBEDTLS_AES_ROM_TABLES)
  443. if( aes_init_done == 0 )
  444. {
  445. aes_gen_tables();
  446. aes_init_done = 1;
  447. }
  448. #endif
  449. switch( keybits )
  450. {
  451. case 128: ctx->nr = 10; break;
  452. case 192: ctx->nr = 12; break;
  453. case 256: ctx->nr = 14; break;
  454. default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH );
  455. }
  456. #if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_PADLOCK_ALIGN16)
  457. if( aes_padlock_ace == -1 )
  458. aes_padlock_ace = mbedtls_padlock_has_support( MBEDTLS_PADLOCK_ACE );
  459. if( aes_padlock_ace )
  460. ctx->rk = RK = MBEDTLS_PADLOCK_ALIGN16( ctx->buf );
  461. else
  462. #endif
  463. ctx->rk = RK = ctx->buf;
  464. #if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
  465. if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
  466. return( mbedtls_aesni_setkey_enc( (unsigned char *) ctx->rk, key, keybits ) );
  467. #endif
  468. for( i = 0; i < ( keybits >> 5 ); i++ )
  469. {
  470. GET_UINT32_LE( RK[i], key, i << 2 );
  471. }
  472. switch( ctx->nr )
  473. {
  474. case 10:
  475. for( i = 0; i < 10; i++, RK += 4 )
  476. {
  477. RK[4] = RK[0] ^ RCON[i] ^
  478. ( (uint32_t) FSb[ ( RK[3] >> 8 ) & 0xFF ] ) ^
  479. ( (uint32_t) FSb[ ( RK[3] >> 16 ) & 0xFF ] << 8 ) ^
  480. ( (uint32_t) FSb[ ( RK[3] >> 24 ) & 0xFF ] << 16 ) ^
  481. ( (uint32_t) FSb[ ( RK[3] ) & 0xFF ] << 24 );
  482. RK[5] = RK[1] ^ RK[4];
  483. RK[6] = RK[2] ^ RK[5];
  484. RK[7] = RK[3] ^ RK[6];
  485. }
  486. break;
  487. case 12:
  488. for( i = 0; i < 8; i++, RK += 6 )
  489. {
  490. RK[6] = RK[0] ^ RCON[i] ^
  491. ( (uint32_t) FSb[ ( RK[5] >> 8 ) & 0xFF ] ) ^
  492. ( (uint32_t) FSb[ ( RK[5] >> 16 ) & 0xFF ] << 8 ) ^
  493. ( (uint32_t) FSb[ ( RK[5] >> 24 ) & 0xFF ] << 16 ) ^
  494. ( (uint32_t) FSb[ ( RK[5] ) & 0xFF ] << 24 );
  495. RK[7] = RK[1] ^ RK[6];
  496. RK[8] = RK[2] ^ RK[7];
  497. RK[9] = RK[3] ^ RK[8];
  498. RK[10] = RK[4] ^ RK[9];
  499. RK[11] = RK[5] ^ RK[10];
  500. }
  501. break;
  502. case 14:
  503. for( i = 0; i < 7; i++, RK += 8 )
  504. {
  505. RK[8] = RK[0] ^ RCON[i] ^
  506. ( (uint32_t) FSb[ ( RK[7] >> 8 ) & 0xFF ] ) ^
  507. ( (uint32_t) FSb[ ( RK[7] >> 16 ) & 0xFF ] << 8 ) ^
  508. ( (uint32_t) FSb[ ( RK[7] >> 24 ) & 0xFF ] << 16 ) ^
  509. ( (uint32_t) FSb[ ( RK[7] ) & 0xFF ] << 24 );
  510. RK[9] = RK[1] ^ RK[8];
  511. RK[10] = RK[2] ^ RK[9];
  512. RK[11] = RK[3] ^ RK[10];
  513. RK[12] = RK[4] ^
  514. ( (uint32_t) FSb[ ( RK[11] ) & 0xFF ] ) ^
  515. ( (uint32_t) FSb[ ( RK[11] >> 8 ) & 0xFF ] << 8 ) ^
  516. ( (uint32_t) FSb[ ( RK[11] >> 16 ) & 0xFF ] << 16 ) ^
  517. ( (uint32_t) FSb[ ( RK[11] >> 24 ) & 0xFF ] << 24 );
  518. RK[13] = RK[5] ^ RK[12];
  519. RK[14] = RK[6] ^ RK[13];
  520. RK[15] = RK[7] ^ RK[14];
  521. }
  522. break;
  523. }
  524. return( 0 );
  525. }
  526. #endif /* !MBEDTLS_AES_SETKEY_ENC_ALT */
  527. /*
  528. * AES key schedule (decryption)
  529. */
  530. #if !defined(MBEDTLS_AES_SETKEY_DEC_ALT)
  531. int mbedtls_aes_setkey_dec( mbedtls_aes_context *ctx, const unsigned char *key,
  532. unsigned int keybits )
  533. {
  534. int i, j, ret;
  535. mbedtls_aes_context cty;
  536. uint32_t *RK;
  537. uint32_t *SK;
  538. mbedtls_aes_init( &cty );
  539. #if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_PADLOCK_ALIGN16)
  540. if( aes_padlock_ace == -1 )
  541. aes_padlock_ace = mbedtls_padlock_has_support( MBEDTLS_PADLOCK_ACE );
  542. if( aes_padlock_ace )
  543. ctx->rk = RK = MBEDTLS_PADLOCK_ALIGN16( ctx->buf );
  544. else
  545. #endif
  546. ctx->rk = RK = ctx->buf;
  547. /* Also checks keybits */
  548. if( ( ret = mbedtls_aes_setkey_enc( &cty, key, keybits ) ) != 0 )
  549. goto exit;
  550. ctx->nr = cty.nr;
  551. #if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
  552. if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
  553. {
  554. mbedtls_aesni_inverse_key( (unsigned char *) ctx->rk,
  555. (const unsigned char *) cty.rk, ctx->nr );
  556. goto exit;
  557. }
  558. #endif
  559. SK = cty.rk + cty.nr * 4;
  560. *RK++ = *SK++;
  561. *RK++ = *SK++;
  562. *RK++ = *SK++;
  563. *RK++ = *SK++;
  564. for( i = ctx->nr - 1, SK -= 8; i > 0; i--, SK -= 8 )
  565. {
  566. for( j = 0; j < 4; j++, SK++ )
  567. {
  568. *RK++ = RT0[ FSb[ ( *SK ) & 0xFF ] ] ^
  569. RT1[ FSb[ ( *SK >> 8 ) & 0xFF ] ] ^
  570. RT2[ FSb[ ( *SK >> 16 ) & 0xFF ] ] ^
  571. RT3[ FSb[ ( *SK >> 24 ) & 0xFF ] ];
  572. }
  573. }
  574. *RK++ = *SK++;
  575. *RK++ = *SK++;
  576. *RK++ = *SK++;
  577. *RK++ = *SK++;
  578. exit:
  579. mbedtls_aes_free( &cty );
  580. return( ret );
  581. }
  582. #endif /* !MBEDTLS_AES_SETKEY_DEC_ALT */
  583. #define AES_FROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \
  584. { \
  585. X0 = *RK++ ^ FT0[ ( Y0 ) & 0xFF ] ^ \
  586. FT1[ ( Y1 >> 8 ) & 0xFF ] ^ \
  587. FT2[ ( Y2 >> 16 ) & 0xFF ] ^ \
  588. FT3[ ( Y3 >> 24 ) & 0xFF ]; \
  589. \
  590. X1 = *RK++ ^ FT0[ ( Y1 ) & 0xFF ] ^ \
  591. FT1[ ( Y2 >> 8 ) & 0xFF ] ^ \
  592. FT2[ ( Y3 >> 16 ) & 0xFF ] ^ \
  593. FT3[ ( Y0 >> 24 ) & 0xFF ]; \
  594. \
  595. X2 = *RK++ ^ FT0[ ( Y2 ) & 0xFF ] ^ \
  596. FT1[ ( Y3 >> 8 ) & 0xFF ] ^ \
  597. FT2[ ( Y0 >> 16 ) & 0xFF ] ^ \
  598. FT3[ ( Y1 >> 24 ) & 0xFF ]; \
  599. \
  600. X3 = *RK++ ^ FT0[ ( Y3 ) & 0xFF ] ^ \
  601. FT1[ ( Y0 >> 8 ) & 0xFF ] ^ \
  602. FT2[ ( Y1 >> 16 ) & 0xFF ] ^ \
  603. FT3[ ( Y2 >> 24 ) & 0xFF ]; \
  604. }
  605. #define AES_RROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \
  606. { \
  607. X0 = *RK++ ^ RT0[ ( Y0 ) & 0xFF ] ^ \
  608. RT1[ ( Y3 >> 8 ) & 0xFF ] ^ \
  609. RT2[ ( Y2 >> 16 ) & 0xFF ] ^ \
  610. RT3[ ( Y1 >> 24 ) & 0xFF ]; \
  611. \
  612. X1 = *RK++ ^ RT0[ ( Y1 ) & 0xFF ] ^ \
  613. RT1[ ( Y0 >> 8 ) & 0xFF ] ^ \
  614. RT2[ ( Y3 >> 16 ) & 0xFF ] ^ \
  615. RT3[ ( Y2 >> 24 ) & 0xFF ]; \
  616. \
  617. X2 = *RK++ ^ RT0[ ( Y2 ) & 0xFF ] ^ \
  618. RT1[ ( Y1 >> 8 ) & 0xFF ] ^ \
  619. RT2[ ( Y0 >> 16 ) & 0xFF ] ^ \
  620. RT3[ ( Y3 >> 24 ) & 0xFF ]; \
  621. \
  622. X3 = *RK++ ^ RT0[ ( Y3 ) & 0xFF ] ^ \
  623. RT1[ ( Y2 >> 8 ) & 0xFF ] ^ \
  624. RT2[ ( Y1 >> 16 ) & 0xFF ] ^ \
  625. RT3[ ( Y0 >> 24 ) & 0xFF ]; \
  626. }
  627. /*
  628. * AES-ECB block encryption
  629. */
  630. #if !defined(MBEDTLS_AES_ENCRYPT_ALT)
  631. void mbedtls_aes_encrypt( mbedtls_aes_context *ctx,
  632. const unsigned char input[16],
  633. unsigned char output[16] )
  634. {
  635. int i;
  636. uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;
  637. RK = ctx->rk;
  638. GET_UINT32_LE( X0, input, 0 ); X0 ^= *RK++;
  639. GET_UINT32_LE( X1, input, 4 ); X1 ^= *RK++;
  640. GET_UINT32_LE( X2, input, 8 ); X2 ^= *RK++;
  641. GET_UINT32_LE( X3, input, 12 ); X3 ^= *RK++;
  642. for( i = ( ctx->nr >> 1 ) - 1; i > 0; i-- )
  643. {
  644. AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
  645. AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
  646. }
  647. AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
  648. X0 = *RK++ ^ \
  649. ( (uint32_t) FSb[ ( Y0 ) & 0xFF ] ) ^
  650. ( (uint32_t) FSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^
  651. ( (uint32_t) FSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^
  652. ( (uint32_t) FSb[ ( Y3 >> 24 ) & 0xFF ] << 24 );
  653. X1 = *RK++ ^ \
  654. ( (uint32_t) FSb[ ( Y1 ) & 0xFF ] ) ^
  655. ( (uint32_t) FSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^
  656. ( (uint32_t) FSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^
  657. ( (uint32_t) FSb[ ( Y0 >> 24 ) & 0xFF ] << 24 );
  658. X2 = *RK++ ^ \
  659. ( (uint32_t) FSb[ ( Y2 ) & 0xFF ] ) ^
  660. ( (uint32_t) FSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^
  661. ( (uint32_t) FSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^
  662. ( (uint32_t) FSb[ ( Y1 >> 24 ) & 0xFF ] << 24 );
  663. X3 = *RK++ ^ \
  664. ( (uint32_t) FSb[ ( Y3 ) & 0xFF ] ) ^
  665. ( (uint32_t) FSb[ ( Y0 >> 8 ) & 0xFF ] << 8 ) ^
  666. ( (uint32_t) FSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^
  667. ( (uint32_t) FSb[ ( Y2 >> 24 ) & 0xFF ] << 24 );
  668. PUT_UINT32_LE( X0, output, 0 );
  669. PUT_UINT32_LE( X1, output, 4 );
  670. PUT_UINT32_LE( X2, output, 8 );
  671. PUT_UINT32_LE( X3, output, 12 );
  672. }
  673. #endif /* !MBEDTLS_AES_ENCRYPT_ALT */
  674. /*
  675. * AES-ECB block decryption
  676. */
  677. #if !defined(MBEDTLS_AES_DECRYPT_ALT)
  678. void mbedtls_aes_decrypt( mbedtls_aes_context *ctx,
  679. const unsigned char input[16],
  680. unsigned char output[16] )
  681. {
  682. int i;
  683. uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;
  684. RK = ctx->rk;
  685. GET_UINT32_LE( X0, input, 0 ); X0 ^= *RK++;
  686. GET_UINT32_LE( X1, input, 4 ); X1 ^= *RK++;
  687. GET_UINT32_LE( X2, input, 8 ); X2 ^= *RK++;
  688. GET_UINT32_LE( X3, input, 12 ); X3 ^= *RK++;
  689. for( i = ( ctx->nr >> 1 ) - 1; i > 0; i-- )
  690. {
  691. AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
  692. AES_RROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );
  693. }
  694. AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );
  695. X0 = *RK++ ^ \
  696. ( (uint32_t) RSb[ ( Y0 ) & 0xFF ] ) ^
  697. ( (uint32_t) RSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^
  698. ( (uint32_t) RSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^
  699. ( (uint32_t) RSb[ ( Y1 >> 24 ) & 0xFF ] << 24 );
  700. X1 = *RK++ ^ \
  701. ( (uint32_t) RSb[ ( Y1 ) & 0xFF ] ) ^
  702. ( (uint32_t) RSb[ ( Y0 >> 8 ) & 0xFF ] << 8 ) ^
  703. ( (uint32_t) RSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^
  704. ( (uint32_t) RSb[ ( Y2 >> 24 ) & 0xFF ] << 24 );
  705. X2 = *RK++ ^ \
  706. ( (uint32_t) RSb[ ( Y2 ) & 0xFF ] ) ^
  707. ( (uint32_t) RSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^
  708. ( (uint32_t) RSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^
  709. ( (uint32_t) RSb[ ( Y3 >> 24 ) & 0xFF ] << 24 );
  710. X3 = *RK++ ^ \
  711. ( (uint32_t) RSb[ ( Y3 ) & 0xFF ] ) ^
  712. ( (uint32_t) RSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^
  713. ( (uint32_t) RSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^
  714. ( (uint32_t) RSb[ ( Y0 >> 24 ) & 0xFF ] << 24 );
  715. PUT_UINT32_LE( X0, output, 0 );
  716. PUT_UINT32_LE( X1, output, 4 );
  717. PUT_UINT32_LE( X2, output, 8 );
  718. PUT_UINT32_LE( X3, output, 12 );
  719. }
  720. #endif /* !MBEDTLS_AES_DECRYPT_ALT */
  721. /*
  722. * AES-ECB block encryption/decryption
  723. */
  724. int mbedtls_aes_crypt_ecb( mbedtls_aes_context *ctx,
  725. int mode,
  726. const unsigned char input[16],
  727. unsigned char output[16] )
  728. {
  729. #if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
  730. if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )
  731. return( mbedtls_aesni_crypt_ecb( ctx, mode, input, output ) );
  732. #endif
  733. #if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
  734. if( aes_padlock_ace )
  735. {
  736. if( mbedtls_padlock_xcryptecb( ctx, mode, input, output ) == 0 )
  737. return( 0 );
  738. // If padlock data misaligned, we just fall back to
  739. // unaccelerated mode
  740. //
  741. }
  742. #endif
  743. if( mode == MBEDTLS_AES_ENCRYPT )
  744. mbedtls_aes_encrypt( ctx, input, output );
  745. else
  746. mbedtls_aes_decrypt( ctx, input, output );
  747. return( 0 );
  748. }
  749. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  750. /*
  751. * AES-CBC buffer encryption/decryption
  752. */
  753. int mbedtls_aes_crypt_cbc( mbedtls_aes_context *ctx,
  754. int mode,
  755. size_t length,
  756. unsigned char iv[16],
  757. const unsigned char *input,
  758. unsigned char *output )
  759. {
  760. int i;
  761. unsigned char temp[16];
  762. if( length % 16 )
  763. return( MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH );
  764. #if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
  765. if( aes_padlock_ace )
  766. {
  767. if( mbedtls_padlock_xcryptcbc( ctx, mode, length, iv, input, output ) == 0 )
  768. return( 0 );
  769. // If padlock data misaligned, we just fall back to
  770. // unaccelerated mode
  771. //
  772. }
  773. #endif
  774. if( mode == MBEDTLS_AES_DECRYPT )
  775. {
  776. while( length > 0 )
  777. {
  778. memcpy( temp, input, 16 );
  779. mbedtls_aes_crypt_ecb( ctx, mode, input, output );
  780. for( i = 0; i < 16; i++ )
  781. output[i] = (unsigned char)( output[i] ^ iv[i] );
  782. memcpy( iv, temp, 16 );
  783. input += 16;
  784. output += 16;
  785. length -= 16;
  786. }
  787. }
  788. else
  789. {
  790. while( length > 0 )
  791. {
  792. for( i = 0; i < 16; i++ )
  793. output[i] = (unsigned char)( input[i] ^ iv[i] );
  794. mbedtls_aes_crypt_ecb( ctx, mode, output, output );
  795. memcpy( iv, output, 16 );
  796. input += 16;
  797. output += 16;
  798. length -= 16;
  799. }
  800. }
  801. return( 0 );
  802. }
  803. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  804. #if defined(MBEDTLS_CIPHER_MODE_CFB)
  805. /*
  806. * AES-CFB128 buffer encryption/decryption
  807. */
  808. int mbedtls_aes_crypt_cfb128( mbedtls_aes_context *ctx,
  809. int mode,
  810. size_t length,
  811. size_t *iv_off,
  812. unsigned char iv[16],
  813. const unsigned char *input,
  814. unsigned char *output )
  815. {
  816. int c;
  817. size_t n = *iv_off;
  818. if( mode == MBEDTLS_AES_DECRYPT )
  819. {
  820. while( length-- )
  821. {
  822. if( n == 0 )
  823. mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
  824. c = *input++;
  825. *output++ = (unsigned char)( c ^ iv[n] );
  826. iv[n] = (unsigned char) c;
  827. n = ( n + 1 ) & 0x0F;
  828. }
  829. }
  830. else
  831. {
  832. while( length-- )
  833. {
  834. if( n == 0 )
  835. mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
  836. iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
  837. n = ( n + 1 ) & 0x0F;
  838. }
  839. }
  840. *iv_off = n;
  841. return( 0 );
  842. }
  843. /*
  844. * AES-CFB8 buffer encryption/decryption
  845. */
  846. int mbedtls_aes_crypt_cfb8( mbedtls_aes_context *ctx,
  847. int mode,
  848. size_t length,
  849. unsigned char iv[16],
  850. const unsigned char *input,
  851. unsigned char *output )
  852. {
  853. unsigned char c;
  854. unsigned char ov[17];
  855. while( length-- )
  856. {
  857. memcpy( ov, iv, 16 );
  858. mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
  859. if( mode == MBEDTLS_AES_DECRYPT )
  860. ov[16] = *input;
  861. c = *output++ = (unsigned char)( iv[0] ^ *input++ );
  862. if( mode == MBEDTLS_AES_ENCRYPT )
  863. ov[16] = c;
  864. memcpy( iv, ov + 1, 16 );
  865. }
  866. return( 0 );
  867. }
  868. #endif /*MBEDTLS_CIPHER_MODE_CFB */
  869. #if defined(MBEDTLS_CIPHER_MODE_CTR)
  870. /*
  871. * AES-CTR buffer encryption/decryption
  872. */
  873. int mbedtls_aes_crypt_ctr( mbedtls_aes_context *ctx,
  874. size_t length,
  875. size_t *nc_off,
  876. unsigned char nonce_counter[16],
  877. unsigned char stream_block[16],
  878. const unsigned char *input,
  879. unsigned char *output )
  880. {
  881. int c, i;
  882. size_t n = *nc_off;
  883. while( length-- )
  884. {
  885. if( n == 0 ) {
  886. mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, nonce_counter, stream_block );
  887. for( i = 16; i > 0; i-- )
  888. if( ++nonce_counter[i - 1] != 0 )
  889. break;
  890. }
  891. c = *input++;
  892. *output++ = (unsigned char)( c ^ stream_block[n] );
  893. n = ( n + 1 ) & 0x0F;
  894. }
  895. *nc_off = n;
  896. return( 0 );
  897. }
  898. #endif /* MBEDTLS_CIPHER_MODE_CTR */
  899. #endif /* !MBEDTLS_AES_ALT */
  900. #if defined(MBEDTLS_SELF_TEST)
  901. /*
  902. * AES test vectors from:
  903. *
  904. * http://csrc.nist.gov/archive/aes/rijndael/rijndael-vals.zip
  905. */
  906. static const unsigned char aes_test_ecb_dec[3][16] =
  907. {
  908. { 0x44, 0x41, 0x6A, 0xC2, 0xD1, 0xF5, 0x3C, 0x58,
  909. 0x33, 0x03, 0x91, 0x7E, 0x6B, 0xE9, 0xEB, 0xE0 },
  910. { 0x48, 0xE3, 0x1E, 0x9E, 0x25, 0x67, 0x18, 0xF2,
  911. 0x92, 0x29, 0x31, 0x9C, 0x19, 0xF1, 0x5B, 0xA4 },
  912. { 0x05, 0x8C, 0xCF, 0xFD, 0xBB, 0xCB, 0x38, 0x2D,
  913. 0x1F, 0x6F, 0x56, 0x58, 0x5D, 0x8A, 0x4A, 0xDE }
  914. };
  915. static const unsigned char aes_test_ecb_enc[3][16] =
  916. {
  917. { 0xC3, 0x4C, 0x05, 0x2C, 0xC0, 0xDA, 0x8D, 0x73,
  918. 0x45, 0x1A, 0xFE, 0x5F, 0x03, 0xBE, 0x29, 0x7F },
  919. { 0xF3, 0xF6, 0x75, 0x2A, 0xE8, 0xD7, 0x83, 0x11,
  920. 0x38, 0xF0, 0x41, 0x56, 0x06, 0x31, 0xB1, 0x14 },
  921. { 0x8B, 0x79, 0xEE, 0xCC, 0x93, 0xA0, 0xEE, 0x5D,
  922. 0xFF, 0x30, 0xB4, 0xEA, 0x21, 0x63, 0x6D, 0xA4 }
  923. };
  924. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  925. static const unsigned char aes_test_cbc_dec[3][16] =
  926. {
  927. { 0xFA, 0xCA, 0x37, 0xE0, 0xB0, 0xC8, 0x53, 0x73,
  928. 0xDF, 0x70, 0x6E, 0x73, 0xF7, 0xC9, 0xAF, 0x86 },
  929. { 0x5D, 0xF6, 0x78, 0xDD, 0x17, 0xBA, 0x4E, 0x75,
  930. 0xB6, 0x17, 0x68, 0xC6, 0xAD, 0xEF, 0x7C, 0x7B },
  931. { 0x48, 0x04, 0xE1, 0x81, 0x8F, 0xE6, 0x29, 0x75,
  932. 0x19, 0xA3, 0xE8, 0x8C, 0x57, 0x31, 0x04, 0x13 }
  933. };
  934. static const unsigned char aes_test_cbc_enc[3][16] =
  935. {
  936. { 0x8A, 0x05, 0xFC, 0x5E, 0x09, 0x5A, 0xF4, 0x84,
  937. 0x8A, 0x08, 0xD3, 0x28, 0xD3, 0x68, 0x8E, 0x3D },
  938. { 0x7B, 0xD9, 0x66, 0xD5, 0x3A, 0xD8, 0xC1, 0xBB,
  939. 0x85, 0xD2, 0xAD, 0xFA, 0xE8, 0x7B, 0xB1, 0x04 },
  940. { 0xFE, 0x3C, 0x53, 0x65, 0x3E, 0x2F, 0x45, 0xB5,
  941. 0x6F, 0xCD, 0x88, 0xB2, 0xCC, 0x89, 0x8F, 0xF0 }
  942. };
  943. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  944. #if defined(MBEDTLS_CIPHER_MODE_CFB)
  945. /*
  946. * AES-CFB128 test vectors from:
  947. *
  948. * http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
  949. */
  950. static const unsigned char aes_test_cfb128_key[3][32] =
  951. {
  952. { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
  953. 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },
  954. { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
  955. 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
  956. 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },
  957. { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
  958. 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
  959. 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
  960. 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
  961. };
  962. static const unsigned char aes_test_cfb128_iv[16] =
  963. {
  964. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
  965. 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
  966. };
  967. static const unsigned char aes_test_cfb128_pt[64] =
  968. {
  969. 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
  970. 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
  971. 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
  972. 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
  973. 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
  974. 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
  975. 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
  976. 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
  977. };
  978. static const unsigned char aes_test_cfb128_ct[3][64] =
  979. {
  980. { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
  981. 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
  982. 0xC8, 0xA6, 0x45, 0x37, 0xA0, 0xB3, 0xA9, 0x3F,
  983. 0xCD, 0xE3, 0xCD, 0xAD, 0x9F, 0x1C, 0xE5, 0x8B,
  984. 0x26, 0x75, 0x1F, 0x67, 0xA3, 0xCB, 0xB1, 0x40,
  985. 0xB1, 0x80, 0x8C, 0xF1, 0x87, 0xA4, 0xF4, 0xDF,
  986. 0xC0, 0x4B, 0x05, 0x35, 0x7C, 0x5D, 0x1C, 0x0E,
  987. 0xEA, 0xC4, 0xC6, 0x6F, 0x9F, 0xF7, 0xF2, 0xE6 },
  988. { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
  989. 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
  990. 0x67, 0xCE, 0x7F, 0x7F, 0x81, 0x17, 0x36, 0x21,
  991. 0x96, 0x1A, 0x2B, 0x70, 0x17, 0x1D, 0x3D, 0x7A,
  992. 0x2E, 0x1E, 0x8A, 0x1D, 0xD5, 0x9B, 0x88, 0xB1,
  993. 0xC8, 0xE6, 0x0F, 0xED, 0x1E, 0xFA, 0xC4, 0xC9,
  994. 0xC0, 0x5F, 0x9F, 0x9C, 0xA9, 0x83, 0x4F, 0xA0,
  995. 0x42, 0xAE, 0x8F, 0xBA, 0x58, 0x4B, 0x09, 0xFF },
  996. { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
  997. 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
  998. 0x39, 0xFF, 0xED, 0x14, 0x3B, 0x28, 0xB1, 0xC8,
  999. 0x32, 0x11, 0x3C, 0x63, 0x31, 0xE5, 0x40, 0x7B,
  1000. 0xDF, 0x10, 0x13, 0x24, 0x15, 0xE5, 0x4B, 0x92,
  1001. 0xA1, 0x3E, 0xD0, 0xA8, 0x26, 0x7A, 0xE2, 0xF9,
  1002. 0x75, 0xA3, 0x85, 0x74, 0x1A, 0xB9, 0xCE, 0xF8,
  1003. 0x20, 0x31, 0x62, 0x3D, 0x55, 0xB1, 0xE4, 0x71 }
  1004. };
  1005. #endif /* MBEDTLS_CIPHER_MODE_CFB */
  1006. #if defined(MBEDTLS_CIPHER_MODE_CTR)
  1007. /*
  1008. * AES-CTR test vectors from:
  1009. *
  1010. * http://www.faqs.org/rfcs/rfc3686.html
  1011. */
  1012. static const unsigned char aes_test_ctr_key[3][16] =
  1013. {
  1014. { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,
  1015. 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },
  1016. { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,
  1017. 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },
  1018. { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,
  1019. 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }
  1020. };
  1021. static const unsigned char aes_test_ctr_nonce_counter[3][16] =
  1022. {
  1023. { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
  1024. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
  1025. { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,
  1026. 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },
  1027. { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,
  1028. 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }
  1029. };
  1030. static const unsigned char aes_test_ctr_pt[3][48] =
  1031. {
  1032. { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,
  1033. 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },
  1034. { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
  1035. 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
  1036. 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
  1037. 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },
  1038. { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
  1039. 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
  1040. 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
  1041. 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
  1042. 0x20, 0x21, 0x22, 0x23 }
  1043. };
  1044. static const unsigned char aes_test_ctr_ct[3][48] =
  1045. {
  1046. { 0xE4, 0x09, 0x5D, 0x4F, 0xB7, 0xA7, 0xB3, 0x79,
  1047. 0x2D, 0x61, 0x75, 0xA3, 0x26, 0x13, 0x11, 0xB8 },
  1048. { 0x51, 0x04, 0xA1, 0x06, 0x16, 0x8A, 0x72, 0xD9,
  1049. 0x79, 0x0D, 0x41, 0xEE, 0x8E, 0xDA, 0xD3, 0x88,
  1050. 0xEB, 0x2E, 0x1E, 0xFC, 0x46, 0xDA, 0x57, 0xC8,
  1051. 0xFC, 0xE6, 0x30, 0xDF, 0x91, 0x41, 0xBE, 0x28 },
  1052. { 0xC1, 0xCF, 0x48, 0xA8, 0x9F, 0x2F, 0xFD, 0xD9,
  1053. 0xCF, 0x46, 0x52, 0xE9, 0xEF, 0xDB, 0x72, 0xD7,
  1054. 0x45, 0x40, 0xA4, 0x2B, 0xDE, 0x6D, 0x78, 0x36,
  1055. 0xD5, 0x9A, 0x5C, 0xEA, 0xAE, 0xF3, 0x10, 0x53,
  1056. 0x25, 0xB2, 0x07, 0x2F }
  1057. };
  1058. static const int aes_test_ctr_len[3] =
  1059. { 16, 32, 36 };
  1060. #endif /* MBEDTLS_CIPHER_MODE_CTR */
  1061. /*
  1062. * Checkup routine
  1063. */
  1064. int mbedtls_aes_self_test( int verbose )
  1065. {
  1066. int ret = 0, i, j, u, v;
  1067. unsigned char key[32];
  1068. unsigned char buf[64];
  1069. unsigned char iv[16];
  1070. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  1071. unsigned char prv[16];
  1072. #endif
  1073. #if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_CFB)
  1074. size_t offset;
  1075. #endif
  1076. #if defined(MBEDTLS_CIPHER_MODE_CTR)
  1077. int len;
  1078. unsigned char nonce_counter[16];
  1079. unsigned char stream_block[16];
  1080. #endif
  1081. mbedtls_aes_context ctx;
  1082. memset( key, 0, 32 );
  1083. mbedtls_aes_init( &ctx );
  1084. /*
  1085. * ECB mode
  1086. */
  1087. for( i = 0; i < 6; i++ )
  1088. {
  1089. u = i >> 1;
  1090. v = i & 1;
  1091. if( verbose != 0 )
  1092. mbedtls_printf( " AES-ECB-%3d (%s): ", 128 + u * 64,
  1093. ( v == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
  1094. memset( buf, 0, 16 );
  1095. if( v == MBEDTLS_AES_DECRYPT )
  1096. {
  1097. mbedtls_aes_setkey_dec( &ctx, key, 128 + u * 64 );
  1098. for( j = 0; j < 10000; j++ )
  1099. mbedtls_aes_crypt_ecb( &ctx, v, buf, buf );
  1100. if( memcmp( buf, aes_test_ecb_dec[u], 16 ) != 0 )
  1101. {
  1102. if( verbose != 0 )
  1103. mbedtls_printf( "failed\n" );
  1104. ret = 1;
  1105. goto exit;
  1106. }
  1107. }
  1108. else
  1109. {
  1110. mbedtls_aes_setkey_enc( &ctx, key, 128 + u * 64 );
  1111. for( j = 0; j < 10000; j++ )
  1112. mbedtls_aes_crypt_ecb( &ctx, v, buf, buf );
  1113. if( memcmp( buf, aes_test_ecb_enc[u], 16 ) != 0 )
  1114. {
  1115. if( verbose != 0 )
  1116. mbedtls_printf( "failed\n" );
  1117. ret = 1;
  1118. goto exit;
  1119. }
  1120. }
  1121. if( verbose != 0 )
  1122. mbedtls_printf( "passed\n" );
  1123. }
  1124. if( verbose != 0 )
  1125. mbedtls_printf( "\n" );
  1126. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  1127. /*
  1128. * CBC mode
  1129. */
  1130. for( i = 0; i < 6; i++ )
  1131. {
  1132. u = i >> 1;
  1133. v = i & 1;
  1134. if( verbose != 0 )
  1135. mbedtls_printf( " AES-CBC-%3d (%s): ", 128 + u * 64,
  1136. ( v == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
  1137. memset( iv , 0, 16 );
  1138. memset( prv, 0, 16 );
  1139. memset( buf, 0, 16 );
  1140. if( v == MBEDTLS_AES_DECRYPT )
  1141. {
  1142. mbedtls_aes_setkey_dec( &ctx, key, 128 + u * 64 );
  1143. for( j = 0; j < 10000; j++ )
  1144. mbedtls_aes_crypt_cbc( &ctx, v, 16, iv, buf, buf );
  1145. if( memcmp( buf, aes_test_cbc_dec[u], 16 ) != 0 )
  1146. {
  1147. if( verbose != 0 )
  1148. mbedtls_printf( "failed\n" );
  1149. ret = 1;
  1150. goto exit;
  1151. }
  1152. }
  1153. else
  1154. {
  1155. mbedtls_aes_setkey_enc( &ctx, key, 128 + u * 64 );
  1156. for( j = 0; j < 10000; j++ )
  1157. {
  1158. unsigned char tmp[16];
  1159. mbedtls_aes_crypt_cbc( &ctx, v, 16, iv, buf, buf );
  1160. memcpy( tmp, prv, 16 );
  1161. memcpy( prv, buf, 16 );
  1162. memcpy( buf, tmp, 16 );
  1163. }
  1164. if( memcmp( prv, aes_test_cbc_enc[u], 16 ) != 0 )
  1165. {
  1166. if( verbose != 0 )
  1167. mbedtls_printf( "failed\n" );
  1168. ret = 1;
  1169. goto exit;
  1170. }
  1171. }
  1172. if( verbose != 0 )
  1173. mbedtls_printf( "passed\n" );
  1174. }
  1175. if( verbose != 0 )
  1176. mbedtls_printf( "\n" );
  1177. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  1178. #if defined(MBEDTLS_CIPHER_MODE_CFB)
  1179. /*
  1180. * CFB128 mode
  1181. */
  1182. for( i = 0; i < 6; i++ )
  1183. {
  1184. u = i >> 1;
  1185. v = i & 1;
  1186. if( verbose != 0 )
  1187. mbedtls_printf( " AES-CFB128-%3d (%s): ", 128 + u * 64,
  1188. ( v == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
  1189. memcpy( iv, aes_test_cfb128_iv, 16 );
  1190. memcpy( key, aes_test_cfb128_key[u], 16 + u * 8 );
  1191. offset = 0;
  1192. mbedtls_aes_setkey_enc( &ctx, key, 128 + u * 64 );
  1193. if( v == MBEDTLS_AES_DECRYPT )
  1194. {
  1195. memcpy( buf, aes_test_cfb128_ct[u], 64 );
  1196. mbedtls_aes_crypt_cfb128( &ctx, v, 64, &offset, iv, buf, buf );
  1197. if( memcmp( buf, aes_test_cfb128_pt, 64 ) != 0 )
  1198. {
  1199. if( verbose != 0 )
  1200. mbedtls_printf( "failed\n" );
  1201. ret = 1;
  1202. goto exit;
  1203. }
  1204. }
  1205. else
  1206. {
  1207. memcpy( buf, aes_test_cfb128_pt, 64 );
  1208. mbedtls_aes_crypt_cfb128( &ctx, v, 64, &offset, iv, buf, buf );
  1209. if( memcmp( buf, aes_test_cfb128_ct[u], 64 ) != 0 )
  1210. {
  1211. if( verbose != 0 )
  1212. mbedtls_printf( "failed\n" );
  1213. ret = 1;
  1214. goto exit;
  1215. }
  1216. }
  1217. if( verbose != 0 )
  1218. mbedtls_printf( "passed\n" );
  1219. }
  1220. if( verbose != 0 )
  1221. mbedtls_printf( "\n" );
  1222. #endif /* MBEDTLS_CIPHER_MODE_CFB */
  1223. #if defined(MBEDTLS_CIPHER_MODE_CTR)
  1224. /*
  1225. * CTR mode
  1226. */
  1227. for( i = 0; i < 6; i++ )
  1228. {
  1229. u = i >> 1;
  1230. v = i & 1;
  1231. if( verbose != 0 )
  1232. mbedtls_printf( " AES-CTR-128 (%s): ",
  1233. ( v == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" );
  1234. memcpy( nonce_counter, aes_test_ctr_nonce_counter[u], 16 );
  1235. memcpy( key, aes_test_ctr_key[u], 16 );
  1236. offset = 0;
  1237. mbedtls_aes_setkey_enc( &ctx, key, 128 );
  1238. if( v == MBEDTLS_AES_DECRYPT )
  1239. {
  1240. len = aes_test_ctr_len[u];
  1241. memcpy( buf, aes_test_ctr_ct[u], len );
  1242. mbedtls_aes_crypt_ctr( &ctx, len, &offset, nonce_counter, stream_block,
  1243. buf, buf );
  1244. if( memcmp( buf, aes_test_ctr_pt[u], len ) != 0 )
  1245. {
  1246. if( verbose != 0 )
  1247. mbedtls_printf( "failed\n" );
  1248. ret = 1;
  1249. goto exit;
  1250. }
  1251. }
  1252. else
  1253. {
  1254. len = aes_test_ctr_len[u];
  1255. memcpy( buf, aes_test_ctr_pt[u], len );
  1256. mbedtls_aes_crypt_ctr( &ctx, len, &offset, nonce_counter, stream_block,
  1257. buf, buf );
  1258. if( memcmp( buf, aes_test_ctr_ct[u], len ) != 0 )
  1259. {
  1260. if( verbose != 0 )
  1261. mbedtls_printf( "failed\n" );
  1262. ret = 1;
  1263. goto exit;
  1264. }
  1265. }
  1266. if( verbose != 0 )
  1267. mbedtls_printf( "passed\n" );
  1268. }
  1269. if( verbose != 0 )
  1270. mbedtls_printf( "\n" );
  1271. #endif /* MBEDTLS_CIPHER_MODE_CTR */
  1272. ret = 0;
  1273. exit:
  1274. mbedtls_aes_free( &ctx );
  1275. return( ret );
  1276. }
  1277. #endif /* MBEDTLS_SELF_TEST */
  1278. /* Amalgamated Release Mappings */
  1279. #undef FSb
  1280. #endif /* MBEDTLS_AES_C */
  1281. /********* Start of file library/aesni.c ************/
  1282. /*
  1283. * AES-NI support functions
  1284. *
  1285. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  1286. * SPDX-License-Identifier: Apache-2.0
  1287. *
  1288. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  1289. * not use this file except in compliance with the License.
  1290. * You may obtain a copy of the License at
  1291. *
  1292. * http://www.apache.org/licenses/LICENSE-2.0
  1293. *
  1294. * Unless required by applicable law or agreed to in writing, software
  1295. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  1296. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  1297. * See the License for the specific language governing permissions and
  1298. * limitations under the License.
  1299. *
  1300. * This file is part of mbed TLS (https://tls.mbed.org)
  1301. */
  1302. /*
  1303. * [AES-WP] http://software.intel.com/en-us/articles/intel-advanced-encryption-standard-aes-instructions-set
  1304. * [CLMUL-WP] http://software.intel.com/en-us/articles/intel-carry-less-multiplication-instruction-and-its-usage-for-computing-the-gcm-mode/
  1305. */
  1306. #if !defined(MBEDTLS_CONFIG_FILE)
  1307. #else
  1308. #endif
  1309. #if defined(MBEDTLS_AESNI_C)
  1310. #include <string.h>
  1311. #ifndef asm
  1312. #define asm __asm
  1313. #endif
  1314. #if defined(MBEDTLS_HAVE_X86_64)
  1315. /*
  1316. * AES-NI support detection routine
  1317. */
  1318. int mbedtls_aesni_has_support( unsigned int what )
  1319. {
  1320. static int done = 0;
  1321. static unsigned int c = 0;
  1322. if( ! done )
  1323. {
  1324. asm( "movl $1, %%eax \n\t"
  1325. "cpuid \n\t"
  1326. : "=c" (c)
  1327. :
  1328. : "eax", "ebx", "edx" );
  1329. done = 1;
  1330. }
  1331. return( ( c & what ) != 0 );
  1332. }
  1333. /*
  1334. * Binutils needs to be at least 2.19 to support AES-NI instructions.
  1335. * Unfortunately, a lot of users have a lower version now (2014-04).
  1336. * Emit bytecode directly in order to support "old" version of gas.
  1337. *
  1338. * Opcodes from the Intel architecture reference manual, vol. 3.
  1339. * We always use registers, so we don't need prefixes for memory operands.
  1340. * Operand macros are in gas order (src, dst) as opposed to Intel order
  1341. * (dst, src) in order to blend better into the surrounding assembly code.
  1342. */
  1343. #define AESDEC ".byte 0x66,0x0F,0x38,0xDE,"
  1344. #define AESDECLAST ".byte 0x66,0x0F,0x38,0xDF,"
  1345. #define AESENC ".byte 0x66,0x0F,0x38,0xDC,"
  1346. #define AESENCLAST ".byte 0x66,0x0F,0x38,0xDD,"
  1347. #define AESIMC ".byte 0x66,0x0F,0x38,0xDB,"
  1348. #define AESKEYGENA ".byte 0x66,0x0F,0x3A,0xDF,"
  1349. #define PCLMULQDQ ".byte 0x66,0x0F,0x3A,0x44,"
  1350. #define xmm0_xmm0 "0xC0"
  1351. #define xmm0_xmm1 "0xC8"
  1352. #define xmm0_xmm2 "0xD0"
  1353. #define xmm0_xmm3 "0xD8"
  1354. #define xmm0_xmm4 "0xE0"
  1355. #define xmm1_xmm0 "0xC1"
  1356. #define xmm1_xmm2 "0xD1"
  1357. /*
  1358. * AES-NI AES-ECB block en(de)cryption
  1359. */
  1360. int mbedtls_aesni_crypt_ecb( mbedtls_aes_context *ctx,
  1361. int mode,
  1362. const unsigned char input[16],
  1363. unsigned char output[16] )
  1364. {
  1365. asm( "movdqu (%3), %%xmm0 \n\t" // load input
  1366. "movdqu (%1), %%xmm1 \n\t" // load round key 0
  1367. "pxor %%xmm1, %%xmm0 \n\t" // round 0
  1368. "addq $16, %1 \n\t" // point to next round key
  1369. "subl $1, %0 \n\t" // normal rounds = nr - 1
  1370. "test %2, %2 \n\t" // mode?
  1371. "jz 2f \n\t" // 0 = decrypt
  1372. "1: \n\t" // encryption loop
  1373. "movdqu (%1), %%xmm1 \n\t" // load round key
  1374. AESENC xmm1_xmm0 "\n\t" // do round
  1375. "addq $16, %1 \n\t" // point to next round key
  1376. "subl $1, %0 \n\t" // loop
  1377. "jnz 1b \n\t"
  1378. "movdqu (%1), %%xmm1 \n\t" // load round key
  1379. AESENCLAST xmm1_xmm0 "\n\t" // last round
  1380. "jmp 3f \n\t"
  1381. "2: \n\t" // decryption loop
  1382. "movdqu (%1), %%xmm1 \n\t"
  1383. AESDEC xmm1_xmm0 "\n\t" // do round
  1384. "addq $16, %1 \n\t"
  1385. "subl $1, %0 \n\t"
  1386. "jnz 2b \n\t"
  1387. "movdqu (%1), %%xmm1 \n\t" // load round key
  1388. AESDECLAST xmm1_xmm0 "\n\t" // last round
  1389. "3: \n\t"
  1390. "movdqu %%xmm0, (%4) \n\t" // export output
  1391. :
  1392. : "r" (ctx->nr), "r" (ctx->rk), "r" (mode), "r" (input), "r" (output)
  1393. : "memory", "cc", "xmm0", "xmm1" );
  1394. return( 0 );
  1395. }
  1396. /*
  1397. * GCM multiplication: c = a times b in GF(2^128)
  1398. * Based on [CLMUL-WP] algorithms 1 (with equation 27) and 5.
  1399. */
  1400. void mbedtls_aesni_gcm_mult( unsigned char c[16],
  1401. const unsigned char a[16],
  1402. const unsigned char b[16] )
  1403. {
  1404. unsigned char aa[16], bb[16], cc[16];
  1405. size_t i;
  1406. /* The inputs are in big-endian order, so byte-reverse them */
  1407. for( i = 0; i < 16; i++ )
  1408. {
  1409. aa[i] = a[15 - i];
  1410. bb[i] = b[15 - i];
  1411. }
  1412. asm( "movdqu (%0), %%xmm0 \n\t" // a1:a0
  1413. "movdqu (%1), %%xmm1 \n\t" // b1:b0
  1414. /*
  1415. * Caryless multiplication xmm2:xmm1 = xmm0 * xmm1
  1416. * using [CLMUL-WP] algorithm 1 (p. 13).
  1417. */
  1418. "movdqa %%xmm1, %%xmm2 \n\t" // copy of b1:b0
  1419. "movdqa %%xmm1, %%xmm3 \n\t" // same
  1420. "movdqa %%xmm1, %%xmm4 \n\t" // same
  1421. PCLMULQDQ xmm0_xmm1 ",0x00 \n\t" // a0*b0 = c1:c0
  1422. PCLMULQDQ xmm0_xmm2 ",0x11 \n\t" // a1*b1 = d1:d0
  1423. PCLMULQDQ xmm0_xmm3 ",0x10 \n\t" // a0*b1 = e1:e0
  1424. PCLMULQDQ xmm0_xmm4 ",0x01 \n\t" // a1*b0 = f1:f0
  1425. "pxor %%xmm3, %%xmm4 \n\t" // e1+f1:e0+f0
  1426. "movdqa %%xmm4, %%xmm3 \n\t" // same
  1427. "psrldq $8, %%xmm4 \n\t" // 0:e1+f1
  1428. "pslldq $8, %%xmm3 \n\t" // e0+f0:0
  1429. "pxor %%xmm4, %%xmm2 \n\t" // d1:d0+e1+f1
  1430. "pxor %%xmm3, %%xmm1 \n\t" // c1+e0+f1:c0
  1431. /*
  1432. * Now shift the result one bit to the left,
  1433. * taking advantage of [CLMUL-WP] eq 27 (p. 20)
  1434. */
  1435. "movdqa %%xmm1, %%xmm3 \n\t" // r1:r0
  1436. "movdqa %%xmm2, %%xmm4 \n\t" // r3:r2
  1437. "psllq $1, %%xmm1 \n\t" // r1<<1:r0<<1
  1438. "psllq $1, %%xmm2 \n\t" // r3<<1:r2<<1
  1439. "psrlq $63, %%xmm3 \n\t" // r1>>63:r0>>63
  1440. "psrlq $63, %%xmm4 \n\t" // r3>>63:r2>>63
  1441. "movdqa %%xmm3, %%xmm5 \n\t" // r1>>63:r0>>63
  1442. "pslldq $8, %%xmm3 \n\t" // r0>>63:0
  1443. "pslldq $8, %%xmm4 \n\t" // r2>>63:0
  1444. "psrldq $8, %%xmm5 \n\t" // 0:r1>>63
  1445. "por %%xmm3, %%xmm1 \n\t" // r1<<1|r0>>63:r0<<1
  1446. "por %%xmm4, %%xmm2 \n\t" // r3<<1|r2>>62:r2<<1
  1447. "por %%xmm5, %%xmm2 \n\t" // r3<<1|r2>>62:r2<<1|r1>>63
  1448. /*
  1449. * Now reduce modulo the GCM polynomial x^128 + x^7 + x^2 + x + 1
  1450. * using [CLMUL-WP] algorithm 5 (p. 20).
  1451. * Currently xmm2:xmm1 holds x3:x2:x1:x0 (already shifted).
  1452. */
  1453. /* Step 2 (1) */
  1454. "movdqa %%xmm1, %%xmm3 \n\t" // x1:x0
  1455. "movdqa %%xmm1, %%xmm4 \n\t" // same
  1456. "movdqa %%xmm1, %%xmm5 \n\t" // same
  1457. "psllq $63, %%xmm3 \n\t" // x1<<63:x0<<63 = stuff:a
  1458. "psllq $62, %%xmm4 \n\t" // x1<<62:x0<<62 = stuff:b
  1459. "psllq $57, %%xmm5 \n\t" // x1<<57:x0<<57 = stuff:c
  1460. /* Step 2 (2) */
  1461. "pxor %%xmm4, %%xmm3 \n\t" // stuff:a+b
  1462. "pxor %%xmm5, %%xmm3 \n\t" // stuff:a+b+c
  1463. "pslldq $8, %%xmm3 \n\t" // a+b+c:0
  1464. "pxor %%xmm3, %%xmm1 \n\t" // x1+a+b+c:x0 = d:x0
  1465. /* Steps 3 and 4 */
  1466. "movdqa %%xmm1,%%xmm0 \n\t" // d:x0
  1467. "movdqa %%xmm1,%%xmm4 \n\t" // same
  1468. "movdqa %%xmm1,%%xmm5 \n\t" // same
  1469. "psrlq $1, %%xmm0 \n\t" // e1:x0>>1 = e1:e0'
  1470. "psrlq $2, %%xmm4 \n\t" // f1:x0>>2 = f1:f0'
  1471. "psrlq $7, %%xmm5 \n\t" // g1:x0>>7 = g1:g0'
  1472. "pxor %%xmm4, %%xmm0 \n\t" // e1+f1:e0'+f0'
  1473. "pxor %%xmm5, %%xmm0 \n\t" // e1+f1+g1:e0'+f0'+g0'
  1474. // e0'+f0'+g0' is almost e0+f0+g0, ex\tcept for some missing
  1475. // bits carried from d. Now get those\t bits back in.
  1476. "movdqa %%xmm1,%%xmm3 \n\t" // d:x0
  1477. "movdqa %%xmm1,%%xmm4 \n\t" // same
  1478. "movdqa %%xmm1,%%xmm5 \n\t" // same
  1479. "psllq $63, %%xmm3 \n\t" // d<<63:stuff
  1480. "psllq $62, %%xmm4 \n\t" // d<<62:stuff
  1481. "psllq $57, %%xmm5 \n\t" // d<<57:stuff
  1482. "pxor %%xmm4, %%xmm3 \n\t" // d<<63+d<<62:stuff
  1483. "pxor %%xmm5, %%xmm3 \n\t" // missing bits of d:stuff
  1484. "psrldq $8, %%xmm3 \n\t" // 0:missing bits of d
  1485. "pxor %%xmm3, %%xmm0 \n\t" // e1+f1+g1:e0+f0+g0
  1486. "pxor %%xmm1, %%xmm0 \n\t" // h1:h0
  1487. "pxor %%xmm2, %%xmm0 \n\t" // x3+h1:x2+h0
  1488. "movdqu %%xmm0, (%2) \n\t" // done
  1489. :
  1490. : "r" (aa), "r" (bb), "r" (cc)
  1491. : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" );
  1492. /* Now byte-reverse the outputs */
  1493. for( i = 0; i < 16; i++ )
  1494. c[i] = cc[15 - i];
  1495. return;
  1496. }
  1497. /*
  1498. * Compute decryption round keys from encryption round keys
  1499. */
  1500. void mbedtls_aesni_inverse_key( unsigned char *invkey,
  1501. const unsigned char *fwdkey, int nr )
  1502. {
  1503. unsigned char *ik = invkey;
  1504. const unsigned char *fk = fwdkey + 16 * nr;
  1505. memcpy( ik, fk, 16 );
  1506. for( fk -= 16, ik += 16; fk > fwdkey; fk -= 16, ik += 16 )
  1507. asm( "movdqu (%0), %%xmm0 \n\t"
  1508. AESIMC xmm0_xmm0 "\n\t"
  1509. "movdqu %%xmm0, (%1) \n\t"
  1510. :
  1511. : "r" (fk), "r" (ik)
  1512. : "memory", "xmm0" );
  1513. memcpy( ik, fk, 16 );
  1514. }
  1515. /*
  1516. * Key expansion, 128-bit case
  1517. */
  1518. static void aesni_setkey_enc_128( unsigned char *rk,
  1519. const unsigned char *key )
  1520. {
  1521. asm( "movdqu (%1), %%xmm0 \n\t" // copy the original key
  1522. "movdqu %%xmm0, (%0) \n\t" // as round key 0
  1523. "jmp 2f \n\t" // skip auxiliary routine
  1524. /*
  1525. * Finish generating the next round key.
  1526. *
  1527. * On entry xmm0 is r3:r2:r1:r0 and xmm1 is X:stuff:stuff:stuff
  1528. * with X = rot( sub( r3 ) ) ^ RCON.
  1529. *
  1530. * On exit, xmm0 is r7:r6:r5:r4
  1531. * with r4 = X + r0, r5 = r4 + r1, r6 = r5 + r2, r7 = r6 + r3
  1532. * and those are written to the round key buffer.
  1533. */
  1534. "1: \n\t"
  1535. "pshufd $0xff, %%xmm1, %%xmm1 \n\t" // X:X:X:X
  1536. "pxor %%xmm0, %%xmm1 \n\t" // X+r3:X+r2:X+r1:r4
  1537. "pslldq $4, %%xmm0 \n\t" // r2:r1:r0:0
  1538. "pxor %%xmm0, %%xmm1 \n\t" // X+r3+r2:X+r2+r1:r5:r4
  1539. "pslldq $4, %%xmm0 \n\t" // etc
  1540. "pxor %%xmm0, %%xmm1 \n\t"
  1541. "pslldq $4, %%xmm0 \n\t"
  1542. "pxor %%xmm1, %%xmm0 \n\t" // update xmm0 for next time!
  1543. "add $16, %0 \n\t" // point to next round key
  1544. "movdqu %%xmm0, (%0) \n\t" // write it
  1545. "ret \n\t"
  1546. /* Main "loop" */
  1547. "2: \n\t"
  1548. AESKEYGENA xmm0_xmm1 ",0x01 \n\tcall 1b \n\t"
  1549. AESKEYGENA xmm0_xmm1 ",0x02 \n\tcall 1b \n\t"
  1550. AESKEYGENA xmm0_xmm1 ",0x04 \n\tcall 1b \n\t"
  1551. AESKEYGENA xmm0_xmm1 ",0x08 \n\tcall 1b \n\t"
  1552. AESKEYGENA xmm0_xmm1 ",0x10 \n\tcall 1b \n\t"
  1553. AESKEYGENA xmm0_xmm1 ",0x20 \n\tcall 1b \n\t"
  1554. AESKEYGENA xmm0_xmm1 ",0x40 \n\tcall 1b \n\t"
  1555. AESKEYGENA xmm0_xmm1 ",0x80 \n\tcall 1b \n\t"
  1556. AESKEYGENA xmm0_xmm1 ",0x1B \n\tcall 1b \n\t"
  1557. AESKEYGENA xmm0_xmm1 ",0x36 \n\tcall 1b \n\t"
  1558. :
  1559. : "r" (rk), "r" (key)
  1560. : "memory", "cc", "0" );
  1561. }
  1562. /*
  1563. * Key expansion, 192-bit case
  1564. */
  1565. static void aesni_setkey_enc_192( unsigned char *rk,
  1566. const unsigned char *key )
  1567. {
  1568. asm( "movdqu (%1), %%xmm0 \n\t" // copy original round key
  1569. "movdqu %%xmm0, (%0) \n\t"
  1570. "add $16, %0 \n\t"
  1571. "movq 16(%1), %%xmm1 \n\t"
  1572. "movq %%xmm1, (%0) \n\t"
  1573. "add $8, %0 \n\t"
  1574. "jmp 2f \n\t" // skip auxiliary routine
  1575. /*
  1576. * Finish generating the next 6 quarter-keys.
  1577. *
  1578. * On entry xmm0 is r3:r2:r1:r0, xmm1 is stuff:stuff:r5:r4
  1579. * and xmm2 is stuff:stuff:X:stuff with X = rot( sub( r3 ) ) ^ RCON.
  1580. *
  1581. * On exit, xmm0 is r9:r8:r7:r6 and xmm1 is stuff:stuff:r11:r10
  1582. * and those are written to the round key buffer.
  1583. */
  1584. "1: \n\t"
  1585. "pshufd $0x55, %%xmm2, %%xmm2 \n\t" // X:X:X:X
  1586. "pxor %%xmm0, %%xmm2 \n\t" // X+r3:X+r2:X+r1:r4
  1587. "pslldq $4, %%xmm0 \n\t" // etc
  1588. "pxor %%xmm0, %%xmm2 \n\t"
  1589. "pslldq $4, %%xmm0 \n\t"
  1590. "pxor %%xmm0, %%xmm2 \n\t"
  1591. "pslldq $4, %%xmm0 \n\t"
  1592. "pxor %%xmm2, %%xmm0 \n\t" // update xmm0 = r9:r8:r7:r6
  1593. "movdqu %%xmm0, (%0) \n\t"
  1594. "add $16, %0 \n\t"
  1595. "pshufd $0xff, %%xmm0, %%xmm2 \n\t" // r9:r9:r9:r9
  1596. "pxor %%xmm1, %%xmm2 \n\t" // stuff:stuff:r9+r5:r10
  1597. "pslldq $4, %%xmm1 \n\t" // r2:r1:r0:0
  1598. "pxor %%xmm2, %%xmm1 \n\t" // xmm1 = stuff:stuff:r11:r10
  1599. "movq %%xmm1, (%0) \n\t"
  1600. "add $8, %0 \n\t"
  1601. "ret \n\t"
  1602. "2: \n\t"
  1603. AESKEYGENA xmm1_xmm2 ",0x01 \n\tcall 1b \n\t"
  1604. AESKEYGENA xmm1_xmm2 ",0x02 \n\tcall 1b \n\t"
  1605. AESKEYGENA xmm1_xmm2 ",0x04 \n\tcall 1b \n\t"
  1606. AESKEYGENA xmm1_xmm2 ",0x08 \n\tcall 1b \n\t"
  1607. AESKEYGENA xmm1_xmm2 ",0x10 \n\tcall 1b \n\t"
  1608. AESKEYGENA xmm1_xmm2 ",0x20 \n\tcall 1b \n\t"
  1609. AESKEYGENA xmm1_xmm2 ",0x40 \n\tcall 1b \n\t"
  1610. AESKEYGENA xmm1_xmm2 ",0x80 \n\tcall 1b \n\t"
  1611. :
  1612. : "r" (rk), "r" (key)
  1613. : "memory", "cc", "0" );
  1614. }
  1615. /*
  1616. * Key expansion, 256-bit case
  1617. */
  1618. static void aesni_setkey_enc_256( unsigned char *rk,
  1619. const unsigned char *key )
  1620. {
  1621. asm( "movdqu (%1), %%xmm0 \n\t"
  1622. "movdqu %%xmm0, (%0) \n\t"
  1623. "add $16, %0 \n\t"
  1624. "movdqu 16(%1), %%xmm1 \n\t"
  1625. "movdqu %%xmm1, (%0) \n\t"
  1626. "jmp 2f \n\t" // skip auxiliary routine
  1627. /*
  1628. * Finish generating the next two round keys.
  1629. *
  1630. * On entry xmm0 is r3:r2:r1:r0, xmm1 is r7:r6:r5:r4 and
  1631. * xmm2 is X:stuff:stuff:stuff with X = rot( sub( r7 )) ^ RCON
  1632. *
  1633. * On exit, xmm0 is r11:r10:r9:r8 and xmm1 is r15:r14:r13:r12
  1634. * and those have been written to the output buffer.
  1635. */
  1636. "1: \n\t"
  1637. "pshufd $0xff, %%xmm2, %%xmm2 \n\t"
  1638. "pxor %%xmm0, %%xmm2 \n\t"
  1639. "pslldq $4, %%xmm0 \n\t"
  1640. "pxor %%xmm0, %%xmm2 \n\t"
  1641. "pslldq $4, %%xmm0 \n\t"
  1642. "pxor %%xmm0, %%xmm2 \n\t"
  1643. "pslldq $4, %%xmm0 \n\t"
  1644. "pxor %%xmm2, %%xmm0 \n\t"
  1645. "add $16, %0 \n\t"
  1646. "movdqu %%xmm0, (%0) \n\t"
  1647. /* Set xmm2 to stuff:Y:stuff:stuff with Y = subword( r11 )
  1648. * and proceed to generate next round key from there */
  1649. AESKEYGENA xmm0_xmm2 ",0x00 \n\t"
  1650. "pshufd $0xaa, %%xmm2, %%xmm2 \n\t"
  1651. "pxor %%xmm1, %%xmm2 \n\t"
  1652. "pslldq $4, %%xmm1 \n\t"
  1653. "pxor %%xmm1, %%xmm2 \n\t"
  1654. "pslldq $4, %%xmm1 \n\t"
  1655. "pxor %%xmm1, %%xmm2 \n\t"
  1656. "pslldq $4, %%xmm1 \n\t"
  1657. "pxor %%xmm2, %%xmm1 \n\t"
  1658. "add $16, %0 \n\t"
  1659. "movdqu %%xmm1, (%0) \n\t"
  1660. "ret \n\t"
  1661. /*
  1662. * Main "loop" - Generating one more key than necessary,
  1663. * see definition of mbedtls_aes_context.buf
  1664. */
  1665. "2: \n\t"
  1666. AESKEYGENA xmm1_xmm2 ",0x01 \n\tcall 1b \n\t"
  1667. AESKEYGENA xmm1_xmm2 ",0x02 \n\tcall 1b \n\t"
  1668. AESKEYGENA xmm1_xmm2 ",0x04 \n\tcall 1b \n\t"
  1669. AESKEYGENA xmm1_xmm2 ",0x08 \n\tcall 1b \n\t"
  1670. AESKEYGENA xmm1_xmm2 ",0x10 \n\tcall 1b \n\t"
  1671. AESKEYGENA xmm1_xmm2 ",0x20 \n\tcall 1b \n\t"
  1672. AESKEYGENA xmm1_xmm2 ",0x40 \n\tcall 1b \n\t"
  1673. :
  1674. : "r" (rk), "r" (key)
  1675. : "memory", "cc", "0" );
  1676. }
  1677. /*
  1678. * Key expansion, wrapper
  1679. */
  1680. int mbedtls_aesni_setkey_enc( unsigned char *rk,
  1681. const unsigned char *key,
  1682. size_t bits )
  1683. {
  1684. switch( bits )
  1685. {
  1686. case 128: aesni_setkey_enc_128( rk, key ); break;
  1687. case 192: aesni_setkey_enc_192( rk, key ); break;
  1688. case 256: aesni_setkey_enc_256( rk, key ); break;
  1689. default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH );
  1690. }
  1691. return( 0 );
  1692. }
  1693. #endif /* MBEDTLS_HAVE_X86_64 */
  1694. #endif /* MBEDTLS_AESNI_C */
  1695. /********* Start of file library/arc4.c ************/
  1696. /*
  1697. * An implementation of the ARCFOUR algorithm
  1698. *
  1699. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  1700. * SPDX-License-Identifier: Apache-2.0
  1701. *
  1702. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  1703. * not use this file except in compliance with the License.
  1704. * You may obtain a copy of the License at
  1705. *
  1706. * http://www.apache.org/licenses/LICENSE-2.0
  1707. *
  1708. * Unless required by applicable law or agreed to in writing, software
  1709. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  1710. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  1711. * See the License for the specific language governing permissions and
  1712. * limitations under the License.
  1713. *
  1714. * This file is part of mbed TLS (https://tls.mbed.org)
  1715. */
  1716. /*
  1717. * The ARCFOUR algorithm was publicly disclosed on 94/09.
  1718. *
  1719. * http://groups.google.com/group/sci.crypt/msg/10a300c9d21afca0
  1720. */
  1721. #if !defined(MBEDTLS_CONFIG_FILE)
  1722. #else
  1723. #endif
  1724. #if defined(MBEDTLS_ARC4_C)
  1725. #include <string.h>
  1726. #if defined(MBEDTLS_SELF_TEST)
  1727. #if defined(MBEDTLS_PLATFORM_C)
  1728. #else
  1729. #include <stdio.h>
  1730. #define mbedtls_printf printf
  1731. #endif /* MBEDTLS_PLATFORM_C */
  1732. #endif /* MBEDTLS_SELF_TEST */
  1733. #if !defined(MBEDTLS_ARC4_ALT)
  1734. /* Implementation that should never be optimized out by the compiler */
  1735. static void arc4_zeroize( void *v, size_t n ) {
  1736. volatile unsigned char *p = v; while( n-- ) *p++ = 0;
  1737. }
  1738. void mbedtls_arc4_init( mbedtls_arc4_context *ctx )
  1739. {
  1740. memset( ctx, 0, sizeof( mbedtls_arc4_context ) );
  1741. }
  1742. void mbedtls_arc4_free( mbedtls_arc4_context *ctx )
  1743. {
  1744. if( ctx == NULL )
  1745. return;
  1746. arc4_zeroize( ctx, sizeof( mbedtls_arc4_context ) );
  1747. }
  1748. /*
  1749. * ARC4 key schedule
  1750. */
  1751. void mbedtls_arc4_setup( mbedtls_arc4_context *ctx, const unsigned char *key,
  1752. unsigned int keylen )
  1753. {
  1754. int i, j, a;
  1755. unsigned int k;
  1756. unsigned char *m;
  1757. ctx->x = 0;
  1758. ctx->y = 0;
  1759. m = ctx->m;
  1760. for( i = 0; i < 256; i++ )
  1761. m[i] = (unsigned char) i;
  1762. j = k = 0;
  1763. for( i = 0; i < 256; i++, k++ )
  1764. {
  1765. if( k >= keylen ) k = 0;
  1766. a = m[i];
  1767. j = ( j + a + key[k] ) & 0xFF;
  1768. m[i] = m[j];
  1769. m[j] = (unsigned char) a;
  1770. }
  1771. }
  1772. /*
  1773. * ARC4 cipher function
  1774. */
  1775. int mbedtls_arc4_crypt( mbedtls_arc4_context *ctx, size_t length, const unsigned char *input,
  1776. unsigned char *output )
  1777. {
  1778. int x, y, a, b;
  1779. size_t i;
  1780. unsigned char *m;
  1781. x = ctx->x;
  1782. y = ctx->y;
  1783. m = ctx->m;
  1784. for( i = 0; i < length; i++ )
  1785. {
  1786. x = ( x + 1 ) & 0xFF; a = m[x];
  1787. y = ( y + a ) & 0xFF; b = m[y];
  1788. m[x] = (unsigned char) b;
  1789. m[y] = (unsigned char) a;
  1790. output[i] = (unsigned char)
  1791. ( input[i] ^ m[(unsigned char)( a + b )] );
  1792. }
  1793. ctx->x = x;
  1794. ctx->y = y;
  1795. return( 0 );
  1796. }
  1797. #endif /* !MBEDTLS_ARC4_ALT */
  1798. #if defined(MBEDTLS_SELF_TEST)
  1799. /*
  1800. * ARC4 tests vectors as posted by Eric Rescorla in sep. 1994:
  1801. *
  1802. * http://groups.google.com/group/comp.security.misc/msg/10a300c9d21afca0
  1803. */
  1804. static const unsigned char arc4_test_key[3][8] =
  1805. {
  1806. { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF },
  1807. { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF },
  1808. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
  1809. };
  1810. static const unsigned char arc4_test_pt[3][8] =
  1811. {
  1812. { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF },
  1813. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  1814. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
  1815. };
  1816. static const unsigned char arc4_test_ct[3][8] =
  1817. {
  1818. { 0x75, 0xB7, 0x87, 0x80, 0x99, 0xE0, 0xC5, 0x96 },
  1819. { 0x74, 0x94, 0xC2, 0xE7, 0x10, 0x4B, 0x08, 0x79 },
  1820. { 0xDE, 0x18, 0x89, 0x41, 0xA3, 0x37, 0x5D, 0x3A }
  1821. };
  1822. /*
  1823. * Checkup routine
  1824. */
  1825. int mbedtls_arc4_self_test( int verbose )
  1826. {
  1827. int i, ret = 0;
  1828. unsigned char ibuf[8];
  1829. unsigned char obuf[8];
  1830. mbedtls_arc4_context ctx;
  1831. mbedtls_arc4_init( &ctx );
  1832. for( i = 0; i < 3; i++ )
  1833. {
  1834. if( verbose != 0 )
  1835. mbedtls_printf( " ARC4 test #%d: ", i + 1 );
  1836. memcpy( ibuf, arc4_test_pt[i], 8 );
  1837. mbedtls_arc4_setup( &ctx, arc4_test_key[i], 8 );
  1838. mbedtls_arc4_crypt( &ctx, 8, ibuf, obuf );
  1839. if( memcmp( obuf, arc4_test_ct[i], 8 ) != 0 )
  1840. {
  1841. if( verbose != 0 )
  1842. mbedtls_printf( "failed\n" );
  1843. ret = 1;
  1844. goto exit;
  1845. }
  1846. if( verbose != 0 )
  1847. mbedtls_printf( "passed\n" );
  1848. }
  1849. if( verbose != 0 )
  1850. mbedtls_printf( "\n" );
  1851. exit:
  1852. mbedtls_arc4_free( &ctx );
  1853. return( ret );
  1854. }
  1855. #endif /* MBEDTLS_SELF_TEST */
  1856. #endif /* MBEDTLS_ARC4_C */
  1857. /********* Start of file library/asn1parse.c ************/
  1858. /*
  1859. * Generic ASN.1 parsing
  1860. *
  1861. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  1862. * SPDX-License-Identifier: Apache-2.0
  1863. *
  1864. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  1865. * not use this file except in compliance with the License.
  1866. * You may obtain a copy of the License at
  1867. *
  1868. * http://www.apache.org/licenses/LICENSE-2.0
  1869. *
  1870. * Unless required by applicable law or agreed to in writing, software
  1871. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  1872. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  1873. * See the License for the specific language governing permissions and
  1874. * limitations under the License.
  1875. *
  1876. * This file is part of mbed TLS (https://tls.mbed.org)
  1877. */
  1878. #if !defined(MBEDTLS_CONFIG_FILE)
  1879. #else
  1880. #endif
  1881. #if defined(MBEDTLS_ASN1_PARSE_C)
  1882. #include <string.h>
  1883. #if defined(MBEDTLS_BIGNUM_C)
  1884. #endif
  1885. #if defined(MBEDTLS_PLATFORM_C)
  1886. #else
  1887. #include <stdlib.h>
  1888. #define mbedtls_calloc calloc
  1889. #define mbedtls_free free
  1890. #endif
  1891. /* Implementation that should never be optimized out by the compiler */
  1892. static void asn1_zeroize( void *v, size_t n ) {
  1893. volatile unsigned char *p = v; while( n-- ) *p++ = 0;
  1894. }
  1895. /*
  1896. * ASN.1 DER decoding routines
  1897. */
  1898. int mbedtls_asn1_get_len( unsigned char **p,
  1899. const unsigned char *end,
  1900. size_t *len )
  1901. {
  1902. if( ( end - *p ) < 1 )
  1903. return( MBEDTLS_ERR_ASN1_OUT_OF_DATA );
  1904. if( ( **p & 0x80 ) == 0 )
  1905. *len = *(*p)++;
  1906. else
  1907. {
  1908. switch( **p & 0x7F )
  1909. {
  1910. case 1:
  1911. if( ( end - *p ) < 2 )
  1912. return( MBEDTLS_ERR_ASN1_OUT_OF_DATA );
  1913. *len = (*p)[1];
  1914. (*p) += 2;
  1915. break;
  1916. case 2:
  1917. if( ( end - *p ) < 3 )
  1918. return( MBEDTLS_ERR_ASN1_OUT_OF_DATA );
  1919. *len = ( (size_t)(*p)[1] << 8 ) | (*p)[2];
  1920. (*p) += 3;
  1921. break;
  1922. case 3:
  1923. if( ( end - *p ) < 4 )
  1924. return( MBEDTLS_ERR_ASN1_OUT_OF_DATA );
  1925. *len = ( (size_t)(*p)[1] << 16 ) |
  1926. ( (size_t)(*p)[2] << 8 ) | (*p)[3];
  1927. (*p) += 4;
  1928. break;
  1929. case 4:
  1930. if( ( end - *p ) < 5 )
  1931. return( MBEDTLS_ERR_ASN1_OUT_OF_DATA );
  1932. *len = ( (size_t)(*p)[1] << 24 ) | ( (size_t)(*p)[2] << 16 ) |
  1933. ( (size_t)(*p)[3] << 8 ) | (*p)[4];
  1934. (*p) += 5;
  1935. break;
  1936. default:
  1937. return( MBEDTLS_ERR_ASN1_INVALID_LENGTH );
  1938. }
  1939. }
  1940. if( *len > (size_t) ( end - *p ) )
  1941. return( MBEDTLS_ERR_ASN1_OUT_OF_DATA );
  1942. return( 0 );
  1943. }
  1944. int mbedtls_asn1_get_tag( unsigned char **p,
  1945. const unsigned char *end,
  1946. size_t *len, int tag )
  1947. {
  1948. if( ( end - *p ) < 1 )
  1949. return( MBEDTLS_ERR_ASN1_OUT_OF_DATA );
  1950. if( **p != tag )
  1951. return( MBEDTLS_ERR_ASN1_UNEXPECTED_TAG );
  1952. (*p)++;
  1953. return( mbedtls_asn1_get_len( p, end, len ) );
  1954. }
  1955. int mbedtls_asn1_get_bool( unsigned char **p,
  1956. const unsigned char *end,
  1957. int *val )
  1958. {
  1959. int ret;
  1960. size_t len;
  1961. if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_BOOLEAN ) ) != 0 )
  1962. return( ret );
  1963. if( len != 1 )
  1964. return( MBEDTLS_ERR_ASN1_INVALID_LENGTH );
  1965. *val = ( **p != 0 ) ? 1 : 0;
  1966. (*p)++;
  1967. return( 0 );
  1968. }
  1969. int mbedtls_asn1_get_int( unsigned char **p,
  1970. const unsigned char *end,
  1971. int *val )
  1972. {
  1973. int ret;
  1974. size_t len;
  1975. if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_INTEGER ) ) != 0 )
  1976. return( ret );
  1977. if( len > sizeof( int ) || ( **p & 0x80 ) != 0 )
  1978. return( MBEDTLS_ERR_ASN1_INVALID_LENGTH );
  1979. *val = 0;
  1980. while( len-- > 0 )
  1981. {
  1982. *val = ( *val << 8 ) | **p;
  1983. (*p)++;
  1984. }
  1985. return( 0 );
  1986. }
  1987. #if defined(MBEDTLS_BIGNUM_C)
  1988. int mbedtls_asn1_get_mpi( unsigned char **p,
  1989. const unsigned char *end,
  1990. mbedtls_mpi *X )
  1991. {
  1992. int ret;
  1993. size_t len;
  1994. if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_INTEGER ) ) != 0 )
  1995. return( ret );
  1996. ret = mbedtls_mpi_read_binary( X, *p, len );
  1997. *p += len;
  1998. return( ret );
  1999. }
  2000. #endif /* MBEDTLS_BIGNUM_C */
  2001. int mbedtls_asn1_get_bitstring( unsigned char **p, const unsigned char *end,
  2002. mbedtls_asn1_bitstring *bs)
  2003. {
  2004. int ret;
  2005. /* Certificate type is a single byte bitstring */
  2006. if( ( ret = mbedtls_asn1_get_tag( p, end, &bs->len, MBEDTLS_ASN1_BIT_STRING ) ) != 0 )
  2007. return( ret );
  2008. /* Check length, subtract one for actual bit string length */
  2009. if( bs->len < 1 )
  2010. return( MBEDTLS_ERR_ASN1_OUT_OF_DATA );
  2011. bs->len -= 1;
  2012. /* Get number of unused bits, ensure unused bits <= 7 */
  2013. bs->unused_bits = **p;
  2014. if( bs->unused_bits > 7 )
  2015. return( MBEDTLS_ERR_ASN1_INVALID_LENGTH );
  2016. (*p)++;
  2017. /* Get actual bitstring */
  2018. bs->p = *p;
  2019. *p += bs->len;
  2020. if( *p != end )
  2021. return( MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
  2022. return( 0 );
  2023. }
  2024. /*
  2025. * Get a bit string without unused bits
  2026. */
  2027. int mbedtls_asn1_get_bitstring_null( unsigned char **p, const unsigned char *end,
  2028. size_t *len )
  2029. {
  2030. int ret;
  2031. if( ( ret = mbedtls_asn1_get_tag( p, end, len, MBEDTLS_ASN1_BIT_STRING ) ) != 0 )
  2032. return( ret );
  2033. if( (*len)-- < 2 || *(*p)++ != 0 )
  2034. return( MBEDTLS_ERR_ASN1_INVALID_DATA );
  2035. return( 0 );
  2036. }
  2037. /*
  2038. * Parses and splits an ASN.1 "SEQUENCE OF <tag>"
  2039. */
  2040. int mbedtls_asn1_get_sequence_of( unsigned char **p,
  2041. const unsigned char *end,
  2042. mbedtls_asn1_sequence *cur,
  2043. int tag)
  2044. {
  2045. int ret;
  2046. size_t len;
  2047. mbedtls_asn1_buf *buf;
  2048. /* Get main sequence tag */
  2049. if( ( ret = mbedtls_asn1_get_tag( p, end, &len,
  2050. MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )
  2051. return( ret );
  2052. if( *p + len != end )
  2053. return( MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
  2054. while( *p < end )
  2055. {
  2056. buf = &(cur->buf);
  2057. buf->tag = **p;
  2058. if( ( ret = mbedtls_asn1_get_tag( p, end, &buf->len, tag ) ) != 0 )
  2059. return( ret );
  2060. buf->p = *p;
  2061. *p += buf->len;
  2062. /* Allocate and assign next pointer */
  2063. if( *p < end )
  2064. {
  2065. cur->next = mbedtls_calloc( 1, sizeof( mbedtls_asn1_sequence ) );
  2066. if( cur->next == NULL )
  2067. return( MBEDTLS_ERR_ASN1_ALLOC_FAILED );
  2068. cur = cur->next;
  2069. }
  2070. }
  2071. /* Set final sequence entry's next pointer to NULL */
  2072. cur->next = NULL;
  2073. if( *p != end )
  2074. return( MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
  2075. return( 0 );
  2076. }
  2077. int mbedtls_asn1_get_alg( unsigned char **p,
  2078. const unsigned char *end,
  2079. mbedtls_asn1_buf *alg, mbedtls_asn1_buf *params )
  2080. {
  2081. int ret;
  2082. size_t len;
  2083. if( ( ret = mbedtls_asn1_get_tag( p, end, &len,
  2084. MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )
  2085. return( ret );
  2086. if( ( end - *p ) < 1 )
  2087. return( MBEDTLS_ERR_ASN1_OUT_OF_DATA );
  2088. alg->tag = **p;
  2089. end = *p + len;
  2090. if( ( ret = mbedtls_asn1_get_tag( p, end, &alg->len, MBEDTLS_ASN1_OID ) ) != 0 )
  2091. return( ret );
  2092. alg->p = *p;
  2093. *p += alg->len;
  2094. if( *p == end )
  2095. {
  2096. asn1_zeroize( params, sizeof(mbedtls_asn1_buf) );
  2097. return( 0 );
  2098. }
  2099. params->tag = **p;
  2100. (*p)++;
  2101. if( ( ret = mbedtls_asn1_get_len( p, end, &params->len ) ) != 0 )
  2102. return( ret );
  2103. params->p = *p;
  2104. *p += params->len;
  2105. if( *p != end )
  2106. return( MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
  2107. return( 0 );
  2108. }
  2109. int mbedtls_asn1_get_alg_null( unsigned char **p,
  2110. const unsigned char *end,
  2111. mbedtls_asn1_buf *alg )
  2112. {
  2113. int ret;
  2114. mbedtls_asn1_buf params;
  2115. memset( &params, 0, sizeof(mbedtls_asn1_buf) );
  2116. if( ( ret = mbedtls_asn1_get_alg( p, end, alg, &params ) ) != 0 )
  2117. return( ret );
  2118. if( ( params.tag != MBEDTLS_ASN1_NULL && params.tag != 0 ) || params.len != 0 )
  2119. return( MBEDTLS_ERR_ASN1_INVALID_DATA );
  2120. return( 0 );
  2121. }
  2122. void mbedtls_asn1_free_named_data( mbedtls_asn1_named_data *cur )
  2123. {
  2124. if( cur == NULL )
  2125. return;
  2126. mbedtls_free( cur->oid.p );
  2127. mbedtls_free( cur->val.p );
  2128. asn1_zeroize( cur, sizeof( mbedtls_asn1_named_data ) );
  2129. }
  2130. void mbedtls_asn1_free_named_data_list( mbedtls_asn1_named_data **head )
  2131. {
  2132. mbedtls_asn1_named_data *cur;
  2133. while( ( cur = *head ) != NULL )
  2134. {
  2135. *head = cur->next;
  2136. mbedtls_asn1_free_named_data( cur );
  2137. mbedtls_free( cur );
  2138. }
  2139. }
  2140. mbedtls_asn1_named_data *mbedtls_asn1_find_named_data( mbedtls_asn1_named_data *list,
  2141. const char *oid, size_t len )
  2142. {
  2143. while( list != NULL )
  2144. {
  2145. if( list->oid.len == len &&
  2146. memcmp( list->oid.p, oid, len ) == 0 )
  2147. {
  2148. break;
  2149. }
  2150. list = list->next;
  2151. }
  2152. return( list );
  2153. }
  2154. #endif /* MBEDTLS_ASN1_PARSE_C */
  2155. /********* Start of file library/asn1write.c ************/
  2156. /*
  2157. * ASN.1 buffer writing functionality
  2158. *
  2159. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  2160. * SPDX-License-Identifier: Apache-2.0
  2161. *
  2162. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  2163. * not use this file except in compliance with the License.
  2164. * You may obtain a copy of the License at
  2165. *
  2166. * http://www.apache.org/licenses/LICENSE-2.0
  2167. *
  2168. * Unless required by applicable law or agreed to in writing, software
  2169. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  2170. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  2171. * See the License for the specific language governing permissions and
  2172. * limitations under the License.
  2173. *
  2174. * This file is part of mbed TLS (https://tls.mbed.org)
  2175. */
  2176. #if !defined(MBEDTLS_CONFIG_FILE)
  2177. #else
  2178. #endif
  2179. #if defined(MBEDTLS_ASN1_WRITE_C)
  2180. #include <string.h>
  2181. #if defined(MBEDTLS_PLATFORM_C)
  2182. #else
  2183. #include <stdlib.h>
  2184. #define mbedtls_calloc calloc
  2185. #define mbedtls_free free
  2186. #endif
  2187. int mbedtls_asn1_write_len( unsigned char **p, unsigned char *start, size_t len )
  2188. {
  2189. if( len < 0x80 )
  2190. {
  2191. if( *p - start < 1 )
  2192. return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );
  2193. *--(*p) = (unsigned char) len;
  2194. return( 1 );
  2195. }
  2196. if( len <= 0xFF )
  2197. {
  2198. if( *p - start < 2 )
  2199. return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );
  2200. *--(*p) = (unsigned char) len;
  2201. *--(*p) = 0x81;
  2202. return( 2 );
  2203. }
  2204. if( *p - start < 3 )
  2205. return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );
  2206. // We assume we never have lengths larger than 65535 bytes
  2207. //
  2208. *--(*p) = len % 256;
  2209. *--(*p) = ( len / 256 ) % 256;
  2210. *--(*p) = 0x82;
  2211. return( 3 );
  2212. }
  2213. int mbedtls_asn1_write_tag( unsigned char **p, unsigned char *start, unsigned char tag )
  2214. {
  2215. if( *p - start < 1 )
  2216. return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );
  2217. *--(*p) = tag;
  2218. return( 1 );
  2219. }
  2220. int mbedtls_asn1_write_raw_buffer( unsigned char **p, unsigned char *start,
  2221. const unsigned char *buf, size_t size )
  2222. {
  2223. size_t len = 0;
  2224. if( *p < start || (size_t)( *p - start ) < size )
  2225. return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );
  2226. len = size;
  2227. (*p) -= len;
  2228. memcpy( *p, buf, len );
  2229. return( (int) len );
  2230. }
  2231. #if defined(MBEDTLS_BIGNUM_C)
  2232. int mbedtls_asn1_write_mpi( unsigned char **p, unsigned char *start, const mbedtls_mpi *X )
  2233. {
  2234. int ret;
  2235. size_t len = 0;
  2236. // Write the MPI
  2237. //
  2238. len = mbedtls_mpi_size( X );
  2239. if( *p < start || (size_t)( *p - start ) < len )
  2240. return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );
  2241. (*p) -= len;
  2242. MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( X, *p, len ) );
  2243. // DER format assumes 2s complement for numbers, so the leftmost bit
  2244. // should be 0 for positive numbers and 1 for negative numbers.
  2245. //
  2246. if( X->s ==1 && **p & 0x80 )
  2247. {
  2248. if( *p - start < 1 )
  2249. return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );
  2250. *--(*p) = 0x00;
  2251. len += 1;
  2252. }
  2253. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) );
  2254. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_INTEGER ) );
  2255. ret = (int) len;
  2256. cleanup:
  2257. return( ret );
  2258. }
  2259. #endif /* MBEDTLS_BIGNUM_C */
  2260. int mbedtls_asn1_write_null( unsigned char **p, unsigned char *start )
  2261. {
  2262. int ret;
  2263. size_t len = 0;
  2264. // Write NULL
  2265. //
  2266. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, 0) );
  2267. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_NULL ) );
  2268. return( (int) len );
  2269. }
  2270. int mbedtls_asn1_write_oid( unsigned char **p, unsigned char *start,
  2271. const char *oid, size_t oid_len )
  2272. {
  2273. int ret;
  2274. size_t len = 0;
  2275. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_raw_buffer( p, start,
  2276. (const unsigned char *) oid, oid_len ) );
  2277. MBEDTLS_ASN1_CHK_ADD( len , mbedtls_asn1_write_len( p, start, len ) );
  2278. MBEDTLS_ASN1_CHK_ADD( len , mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_OID ) );
  2279. return( (int) len );
  2280. }
  2281. int mbedtls_asn1_write_algorithm_identifier( unsigned char **p, unsigned char *start,
  2282. const char *oid, size_t oid_len,
  2283. size_t par_len )
  2284. {
  2285. int ret;
  2286. size_t len = 0;
  2287. if( par_len == 0 )
  2288. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_null( p, start ) );
  2289. else
  2290. len += par_len;
  2291. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_oid( p, start, oid, oid_len ) );
  2292. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) );
  2293. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start,
  2294. MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) );
  2295. return( (int) len );
  2296. }
  2297. int mbedtls_asn1_write_bool( unsigned char **p, unsigned char *start, int boolean )
  2298. {
  2299. int ret;
  2300. size_t len = 0;
  2301. if( *p - start < 1 )
  2302. return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );
  2303. *--(*p) = (boolean) ? 255 : 0;
  2304. len++;
  2305. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) );
  2306. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_BOOLEAN ) );
  2307. return( (int) len );
  2308. }
  2309. int mbedtls_asn1_write_int( unsigned char **p, unsigned char *start, int val )
  2310. {
  2311. int ret;
  2312. size_t len = 0;
  2313. // TODO negative values and values larger than 128
  2314. // DER format assumes 2s complement for numbers, so the leftmost bit
  2315. // should be 0 for positive numbers and 1 for negative numbers.
  2316. //
  2317. if( *p - start < 1 )
  2318. return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );
  2319. len += 1;
  2320. *--(*p) = val;
  2321. if( val > 0 && **p & 0x80 )
  2322. {
  2323. if( *p - start < 1 )
  2324. return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );
  2325. *--(*p) = 0x00;
  2326. len += 1;
  2327. }
  2328. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) );
  2329. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_INTEGER ) );
  2330. return( (int) len );
  2331. }
  2332. int mbedtls_asn1_write_printable_string( unsigned char **p, unsigned char *start,
  2333. const char *text, size_t text_len )
  2334. {
  2335. int ret;
  2336. size_t len = 0;
  2337. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_raw_buffer( p, start,
  2338. (const unsigned char *) text, text_len ) );
  2339. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) );
  2340. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_PRINTABLE_STRING ) );
  2341. return( (int) len );
  2342. }
  2343. int mbedtls_asn1_write_ia5_string( unsigned char **p, unsigned char *start,
  2344. const char *text, size_t text_len )
  2345. {
  2346. int ret;
  2347. size_t len = 0;
  2348. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_raw_buffer( p, start,
  2349. (const unsigned char *) text, text_len ) );
  2350. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) );
  2351. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_IA5_STRING ) );
  2352. return( (int) len );
  2353. }
  2354. int mbedtls_asn1_write_bitstring( unsigned char **p, unsigned char *start,
  2355. const unsigned char *buf, size_t bits )
  2356. {
  2357. int ret;
  2358. size_t len = 0, size;
  2359. size = ( bits / 8 ) + ( ( bits % 8 ) ? 1 : 0 );
  2360. // Calculate byte length
  2361. //
  2362. if( *p < start || (size_t)( *p - start ) < size + 1 )
  2363. return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );
  2364. len = size + 1;
  2365. (*p) -= size;
  2366. memcpy( *p, buf, size );
  2367. // Write unused bits
  2368. //
  2369. *--(*p) = (unsigned char) (size * 8 - bits);
  2370. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) );
  2371. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_BIT_STRING ) );
  2372. return( (int) len );
  2373. }
  2374. int mbedtls_asn1_write_octet_string( unsigned char **p, unsigned char *start,
  2375. const unsigned char *buf, size_t size )
  2376. {
  2377. int ret;
  2378. size_t len = 0;
  2379. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_raw_buffer( p, start, buf, size ) );
  2380. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) );
  2381. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_OCTET_STRING ) );
  2382. return( (int) len );
  2383. }
  2384. mbedtls_asn1_named_data *mbedtls_asn1_store_named_data( mbedtls_asn1_named_data **head,
  2385. const char *oid, size_t oid_len,
  2386. const unsigned char *val,
  2387. size_t val_len )
  2388. {
  2389. mbedtls_asn1_named_data *cur;
  2390. if( ( cur = mbedtls_asn1_find_named_data( *head, oid, oid_len ) ) == NULL )
  2391. {
  2392. // Add new entry if not present yet based on OID
  2393. //
  2394. if( ( cur = mbedtls_calloc( 1, sizeof(mbedtls_asn1_named_data) ) ) == NULL )
  2395. return( NULL );
  2396. cur->oid.len = oid_len;
  2397. cur->oid.p = mbedtls_calloc( 1, oid_len );
  2398. if( cur->oid.p == NULL )
  2399. {
  2400. mbedtls_free( cur );
  2401. return( NULL );
  2402. }
  2403. memcpy( cur->oid.p, oid, oid_len );
  2404. cur->val.len = val_len;
  2405. cur->val.p = mbedtls_calloc( 1, val_len );
  2406. if( cur->val.p == NULL )
  2407. {
  2408. mbedtls_free( cur->oid.p );
  2409. mbedtls_free( cur );
  2410. return( NULL );
  2411. }
  2412. cur->next = *head;
  2413. *head = cur;
  2414. }
  2415. else if( cur->val.len < val_len )
  2416. {
  2417. /*
  2418. * Enlarge existing value buffer if needed
  2419. * Preserve old data until the allocation succeeded, to leave list in
  2420. * a consistent state in case allocation fails.
  2421. */
  2422. void *p = mbedtls_calloc( 1, val_len );
  2423. if( p == NULL )
  2424. return( NULL );
  2425. mbedtls_free( cur->val.p );
  2426. cur->val.p = p;
  2427. cur->val.len = val_len;
  2428. }
  2429. if( val != NULL )
  2430. memcpy( cur->val.p, val, val_len );
  2431. return( cur );
  2432. }
  2433. #endif /* MBEDTLS_ASN1_WRITE_C */
  2434. /********* Start of file library/base64.c ************/
  2435. /*
  2436. * RFC 1521 base64 encoding/decoding
  2437. *
  2438. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  2439. * SPDX-License-Identifier: Apache-2.0
  2440. *
  2441. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  2442. * not use this file except in compliance with the License.
  2443. * You may obtain a copy of the License at
  2444. *
  2445. * http://www.apache.org/licenses/LICENSE-2.0
  2446. *
  2447. * Unless required by applicable law or agreed to in writing, software
  2448. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  2449. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  2450. * See the License for the specific language governing permissions and
  2451. * limitations under the License.
  2452. *
  2453. * This file is part of mbed TLS (https://tls.mbed.org)
  2454. */
  2455. #if !defined(MBEDTLS_CONFIG_FILE)
  2456. #else
  2457. #endif
  2458. #if defined(MBEDTLS_BASE64_C)
  2459. #if !VXWORKS
  2460. #include <stdint.h>
  2461. #endif
  2462. #if defined(MBEDTLS_SELF_TEST)
  2463. #include <string.h>
  2464. #if defined(MBEDTLS_PLATFORM_C)
  2465. #else
  2466. #include <stdio.h>
  2467. #define mbedtls_printf printf
  2468. #endif /* MBEDTLS_PLATFORM_C */
  2469. #endif /* MBEDTLS_SELF_TEST */
  2470. static const unsigned char base64_enc_map[64] =
  2471. {
  2472. 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
  2473. 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
  2474. 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd',
  2475. 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
  2476. 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
  2477. 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7',
  2478. '8', '9', '+', '/'
  2479. };
  2480. static const unsigned char base64_dec_map[128] =
  2481. {
  2482. 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
  2483. 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
  2484. 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
  2485. 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
  2486. 127, 127, 127, 62, 127, 127, 127, 63, 52, 53,
  2487. 54, 55, 56, 57, 58, 59, 60, 61, 127, 127,
  2488. 127, 64, 127, 127, 127, 0, 1, 2, 3, 4,
  2489. 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
  2490. 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
  2491. 25, 127, 127, 127, 127, 127, 127, 26, 27, 28,
  2492. 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
  2493. 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
  2494. 49, 50, 51, 127, 127, 127, 127, 127
  2495. };
  2496. #define BASE64_SIZE_T_MAX ( (size_t) -1 ) /* SIZE_T_MAX is not standard */
  2497. /*
  2498. * Encode a buffer into base64 format
  2499. */
  2500. int mbedtls_base64_encode( unsigned char *dst, size_t dlen, size_t *olen,
  2501. const unsigned char *src, size_t slen )
  2502. {
  2503. size_t i, n;
  2504. int C1, C2, C3;
  2505. unsigned char *p;
  2506. if( slen == 0 )
  2507. {
  2508. *olen = 0;
  2509. return( 0 );
  2510. }
  2511. n = slen / 3 + ( slen % 3 != 0 );
  2512. if( n > ( BASE64_SIZE_T_MAX - 1 ) / 4 )
  2513. {
  2514. *olen = BASE64_SIZE_T_MAX;
  2515. return( MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL );
  2516. }
  2517. n *= 4;
  2518. if( dlen < n + 1 )
  2519. {
  2520. *olen = n + 1;
  2521. return( MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL );
  2522. }
  2523. n = ( slen / 3 ) * 3;
  2524. for( i = 0, p = dst; i < n; i += 3 )
  2525. {
  2526. C1 = *src++;
  2527. C2 = *src++;
  2528. C3 = *src++;
  2529. *p++ = base64_enc_map[(C1 >> 2) & 0x3F];
  2530. *p++ = base64_enc_map[(((C1 & 3) << 4) + (C2 >> 4)) & 0x3F];
  2531. *p++ = base64_enc_map[(((C2 & 15) << 2) + (C3 >> 6)) & 0x3F];
  2532. *p++ = base64_enc_map[C3 & 0x3F];
  2533. }
  2534. if( i < slen )
  2535. {
  2536. C1 = *src++;
  2537. C2 = ( ( i + 1 ) < slen ) ? *src++ : 0;
  2538. *p++ = base64_enc_map[(C1 >> 2) & 0x3F];
  2539. *p++ = base64_enc_map[(((C1 & 3) << 4) + (C2 >> 4)) & 0x3F];
  2540. if( ( i + 1 ) < slen )
  2541. *p++ = base64_enc_map[((C2 & 15) << 2) & 0x3F];
  2542. else *p++ = '=';
  2543. *p++ = '=';
  2544. }
  2545. *olen = p - dst;
  2546. *p = 0;
  2547. return( 0 );
  2548. }
  2549. /*
  2550. * Decode a base64-formatted buffer
  2551. */
  2552. int mbedtls_base64_decode( unsigned char *dst, size_t dlen, size_t *olen,
  2553. const unsigned char *src, size_t slen )
  2554. {
  2555. size_t i, n;
  2556. uint32_t j, x;
  2557. unsigned char *p;
  2558. /* First pass: check for validity and get output length */
  2559. for( i = n = j = 0; i < slen; i++ )
  2560. {
  2561. /* Skip spaces before checking for EOL */
  2562. x = 0;
  2563. while( i < slen && src[i] == ' ' )
  2564. {
  2565. ++i;
  2566. ++x;
  2567. }
  2568. /* Spaces at end of buffer are OK */
  2569. if( i == slen )
  2570. break;
  2571. if( ( slen - i ) >= 2 &&
  2572. src[i] == '\r' && src[i + 1] == '\n' )
  2573. continue;
  2574. if( src[i] == '\n' )
  2575. continue;
  2576. /* Space inside a line is an error */
  2577. if( x != 0 )
  2578. return( MBEDTLS_ERR_BASE64_INVALID_CHARACTER );
  2579. if( src[i] == '=' && ++j > 2 )
  2580. return( MBEDTLS_ERR_BASE64_INVALID_CHARACTER );
  2581. if( src[i] > 127 || base64_dec_map[src[i]] == 127 )
  2582. return( MBEDTLS_ERR_BASE64_INVALID_CHARACTER );
  2583. if( base64_dec_map[src[i]] < 64 && j != 0 )
  2584. return( MBEDTLS_ERR_BASE64_INVALID_CHARACTER );
  2585. n++;
  2586. }
  2587. if( n == 0 )
  2588. {
  2589. *olen = 0;
  2590. return( 0 );
  2591. }
  2592. n = ( ( n * 6 ) + 7 ) >> 3;
  2593. n -= j;
  2594. if( dst == NULL || dlen < n )
  2595. {
  2596. *olen = n;
  2597. return( MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL );
  2598. }
  2599. for( j = 3, n = x = 0, p = dst; i > 0; i--, src++ )
  2600. {
  2601. if( *src == '\r' || *src == '\n' || *src == ' ' )
  2602. continue;
  2603. j -= ( base64_dec_map[*src] == 64 );
  2604. x = ( x << 6 ) | ( base64_dec_map[*src] & 0x3F );
  2605. if( ++n == 4 )
  2606. {
  2607. n = 0;
  2608. if( j > 0 ) *p++ = (unsigned char)( x >> 16 );
  2609. if( j > 1 ) *p++ = (unsigned char)( x >> 8 );
  2610. if( j > 2 ) *p++ = (unsigned char)( x );
  2611. }
  2612. }
  2613. *olen = p - dst;
  2614. return( 0 );
  2615. }
  2616. #if defined(MBEDTLS_SELF_TEST)
  2617. static const unsigned char base64_test_dec[64] =
  2618. {
  2619. 0x24, 0x48, 0x6E, 0x56, 0x87, 0x62, 0x5A, 0xBD,
  2620. 0xBF, 0x17, 0xD9, 0xA2, 0xC4, 0x17, 0x1A, 0x01,
  2621. 0x94, 0xED, 0x8F, 0x1E, 0x11, 0xB3, 0xD7, 0x09,
  2622. 0x0C, 0xB6, 0xE9, 0x10, 0x6F, 0x22, 0xEE, 0x13,
  2623. 0xCA, 0xB3, 0x07, 0x05, 0x76, 0xC9, 0xFA, 0x31,
  2624. 0x6C, 0x08, 0x34, 0xFF, 0x8D, 0xC2, 0x6C, 0x38,
  2625. 0x00, 0x43, 0xE9, 0x54, 0x97, 0xAF, 0x50, 0x4B,
  2626. 0xD1, 0x41, 0xBA, 0x95, 0x31, 0x5A, 0x0B, 0x97
  2627. };
  2628. static const unsigned char base64_test_enc[] =
  2629. "JEhuVodiWr2/F9mixBcaAZTtjx4Rs9cJDLbpEG8i7hPK"
  2630. "swcFdsn6MWwINP+Nwmw4AEPpVJevUEvRQbqVMVoLlw==";
  2631. /*
  2632. * Checkup routine
  2633. */
  2634. int mbedtls_base64_self_test( int verbose )
  2635. {
  2636. size_t len;
  2637. const unsigned char *src;
  2638. unsigned char buffer[128];
  2639. if( verbose != 0 )
  2640. mbedtls_printf( " Base64 encoding test: " );
  2641. src = base64_test_dec;
  2642. if( mbedtls_base64_encode( buffer, sizeof( buffer ), &len, src, 64 ) != 0 ||
  2643. memcmp( base64_test_enc, buffer, 88 ) != 0 )
  2644. {
  2645. if( verbose != 0 )
  2646. mbedtls_printf( "failed\n" );
  2647. return( 1 );
  2648. }
  2649. if( verbose != 0 )
  2650. mbedtls_printf( "passed\n Base64 decoding test: " );
  2651. src = base64_test_enc;
  2652. if( mbedtls_base64_decode( buffer, sizeof( buffer ), &len, src, 88 ) != 0 ||
  2653. memcmp( base64_test_dec, buffer, 64 ) != 0 )
  2654. {
  2655. if( verbose != 0 )
  2656. mbedtls_printf( "failed\n" );
  2657. return( 1 );
  2658. }
  2659. if( verbose != 0 )
  2660. mbedtls_printf( "passed\n\n" );
  2661. return( 0 );
  2662. }
  2663. #endif /* MBEDTLS_SELF_TEST */
  2664. #endif /* MBEDTLS_BASE64_C */
  2665. /********* Start of file library/bignum.c ************/
  2666. /*
  2667. * Multi-precision integer library
  2668. *
  2669. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  2670. * SPDX-License-Identifier: Apache-2.0
  2671. *
  2672. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  2673. * not use this file except in compliance with the License.
  2674. * You may obtain a copy of the License at
  2675. *
  2676. * http://www.apache.org/licenses/LICENSE-2.0
  2677. *
  2678. * Unless required by applicable law or agreed to in writing, software
  2679. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  2680. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  2681. * See the License for the specific language governing permissions and
  2682. * limitations under the License.
  2683. *
  2684. * This file is part of mbed TLS (https://tls.mbed.org)
  2685. */
  2686. /*
  2687. * The following sources were referenced in the design of this Multi-precision
  2688. * Integer library:
  2689. *
  2690. * [1] Handbook of Applied Cryptography - 1997
  2691. * Menezes, van Oorschot and Vanstone
  2692. *
  2693. * [2] Multi-Precision Math
  2694. * Tom St Denis
  2695. * https://github.com/libtom/libtommath/blob/develop/tommath.pdf
  2696. *
  2697. * [3] GNU Multi-Precision Arithmetic Library
  2698. * https://gmplib.org/manual/index.html
  2699. *
  2700. */
  2701. #if !defined(MBEDTLS_CONFIG_FILE)
  2702. #else
  2703. #endif
  2704. #if defined(MBEDTLS_BIGNUM_C)
  2705. #include <string.h>
  2706. #if defined(MBEDTLS_PLATFORM_C)
  2707. #else
  2708. #include <stdio.h>
  2709. #include <stdlib.h>
  2710. #define mbedtls_printf printf
  2711. #define mbedtls_calloc calloc
  2712. #define mbedtls_free free
  2713. #endif
  2714. /* Implementation that should never be optimized out by the compiler */
  2715. static void mbedtls_zeroize( void *v, size_t n ) {
  2716. volatile unsigned char *p = v; while( n-- ) *p++ = 0;
  2717. }
  2718. #define ciL (sizeof(mbedtls_mpi_uint)) /* chars in limb */
  2719. #define biL (ciL << 3) /* bits in limb */
  2720. #define biH (ciL << 2) /* half limb size */
  2721. #define MPI_SIZE_T_MAX ( (size_t) -1 ) /* SIZE_T_MAX is not standard */
  2722. /*
  2723. * Convert between bits/chars and number of limbs
  2724. * Divide first in order to avoid potential overflows
  2725. */
  2726. #define BITS_TO_LIMBS(i) ( (i) / biL + ( (i) % biL != 0 ) )
  2727. #define CHARS_TO_LIMBS(i) ( (i) / ciL + ( (i) % ciL != 0 ) )
  2728. /*
  2729. * Initialize one MPI
  2730. */
  2731. void mbedtls_mpi_init( mbedtls_mpi *X )
  2732. {
  2733. if( X == NULL )
  2734. return;
  2735. X->s = 1;
  2736. X->n = 0;
  2737. X->p = NULL;
  2738. }
  2739. /*
  2740. * Unallocate one MPI
  2741. */
  2742. void mbedtls_mpi_free( mbedtls_mpi *X )
  2743. {
  2744. if( X == NULL )
  2745. return;
  2746. if( X->p != NULL )
  2747. {
  2748. mbedtls_zeroize( X->p, X->n * ciL );
  2749. mbedtls_free( X->p );
  2750. }
  2751. X->s = 1;
  2752. X->n = 0;
  2753. X->p = NULL;
  2754. }
  2755. /*
  2756. * Enlarge to the specified number of limbs
  2757. */
  2758. int mbedtls_mpi_grow( mbedtls_mpi *X, size_t nblimbs )
  2759. {
  2760. mbedtls_mpi_uint *p;
  2761. if( nblimbs > MBEDTLS_MPI_MAX_LIMBS )
  2762. return( MBEDTLS_ERR_MPI_ALLOC_FAILED );
  2763. if( X->n < nblimbs )
  2764. {
  2765. if( ( p = mbedtls_calloc( nblimbs, ciL ) ) == NULL )
  2766. return( MBEDTLS_ERR_MPI_ALLOC_FAILED );
  2767. if( X->p != NULL )
  2768. {
  2769. memcpy( p, X->p, X->n * ciL );
  2770. mbedtls_zeroize( X->p, X->n * ciL );
  2771. mbedtls_free( X->p );
  2772. }
  2773. X->n = nblimbs;
  2774. X->p = p;
  2775. }
  2776. return( 0 );
  2777. }
  2778. /*
  2779. * Resize down as much as possible,
  2780. * while keeping at least the specified number of limbs
  2781. */
  2782. int mbedtls_mpi_shrink( mbedtls_mpi *X, size_t nblimbs )
  2783. {
  2784. mbedtls_mpi_uint *p;
  2785. size_t i;
  2786. /* Actually resize up in this case */
  2787. if( X->n <= nblimbs )
  2788. return( mbedtls_mpi_grow( X, nblimbs ) );
  2789. for( i = X->n - 1; i > 0; i-- )
  2790. if( X->p[i] != 0 )
  2791. break;
  2792. i++;
  2793. if( i < nblimbs )
  2794. i = nblimbs;
  2795. if( ( p = mbedtls_calloc( i, ciL ) ) == NULL )
  2796. return( MBEDTLS_ERR_MPI_ALLOC_FAILED );
  2797. if( X->p != NULL )
  2798. {
  2799. memcpy( p, X->p, i * ciL );
  2800. mbedtls_zeroize( X->p, X->n * ciL );
  2801. mbedtls_free( X->p );
  2802. }
  2803. X->n = i;
  2804. X->p = p;
  2805. return( 0 );
  2806. }
  2807. /*
  2808. * Copy the contents of Y into X
  2809. */
  2810. int mbedtls_mpi_copy( mbedtls_mpi *X, const mbedtls_mpi *Y )
  2811. {
  2812. int ret;
  2813. size_t i;
  2814. if( X == Y )
  2815. return( 0 );
  2816. if( Y->p == NULL )
  2817. {
  2818. mbedtls_mpi_free( X );
  2819. return( 0 );
  2820. }
  2821. for( i = Y->n - 1; i > 0; i-- )
  2822. if( Y->p[i] != 0 )
  2823. break;
  2824. i++;
  2825. X->s = Y->s;
  2826. MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, i ) );
  2827. memset( X->p, 0, X->n * ciL );
  2828. memcpy( X->p, Y->p, i * ciL );
  2829. cleanup:
  2830. return( ret );
  2831. }
  2832. /*
  2833. * Swap the contents of X and Y
  2834. */
  2835. void mbedtls_mpi_swap( mbedtls_mpi *X, mbedtls_mpi *Y )
  2836. {
  2837. mbedtls_mpi T;
  2838. memcpy( &T, X, sizeof( mbedtls_mpi ) );
  2839. memcpy( X, Y, sizeof( mbedtls_mpi ) );
  2840. memcpy( Y, &T, sizeof( mbedtls_mpi ) );
  2841. }
  2842. /*
  2843. * Conditionally assign X = Y, without leaking information
  2844. * about whether the assignment was made or not.
  2845. * (Leaking information about the respective sizes of X and Y is ok however.)
  2846. */
  2847. int mbedtls_mpi_safe_cond_assign( mbedtls_mpi *X, const mbedtls_mpi *Y, unsigned char assign )
  2848. {
  2849. int ret = 0;
  2850. size_t i;
  2851. /* make sure assign is 0 or 1 in a time-constant manner */
  2852. assign = (assign | (unsigned char)-assign) >> 7;
  2853. MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, Y->n ) );
  2854. X->s = X->s * ( 1 - assign ) + Y->s * assign;
  2855. for( i = 0; i < Y->n; i++ )
  2856. X->p[i] = X->p[i] * ( 1 - assign ) + Y->p[i] * assign;
  2857. for( ; i < X->n; i++ )
  2858. X->p[i] *= ( 1 - assign );
  2859. cleanup:
  2860. return( ret );
  2861. }
  2862. /*
  2863. * Conditionally swap X and Y, without leaking information
  2864. * about whether the swap was made or not.
  2865. * Here it is not ok to simply swap the pointers, which whould lead to
  2866. * different memory access patterns when X and Y are used afterwards.
  2867. */
  2868. int mbedtls_mpi_safe_cond_swap( mbedtls_mpi *X, mbedtls_mpi *Y, unsigned char swap )
  2869. {
  2870. int ret, s;
  2871. size_t i;
  2872. mbedtls_mpi_uint tmp;
  2873. if( X == Y )
  2874. return( 0 );
  2875. /* make sure swap is 0 or 1 in a time-constant manner */
  2876. swap = (swap | (unsigned char)-swap) >> 7;
  2877. MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, Y->n ) );
  2878. MBEDTLS_MPI_CHK( mbedtls_mpi_grow( Y, X->n ) );
  2879. s = X->s;
  2880. X->s = X->s * ( 1 - swap ) + Y->s * swap;
  2881. Y->s = Y->s * ( 1 - swap ) + s * swap;
  2882. for( i = 0; i < X->n; i++ )
  2883. {
  2884. tmp = X->p[i];
  2885. X->p[i] = X->p[i] * ( 1 - swap ) + Y->p[i] * swap;
  2886. Y->p[i] = Y->p[i] * ( 1 - swap ) + tmp * swap;
  2887. }
  2888. cleanup:
  2889. return( ret );
  2890. }
  2891. /*
  2892. * Set value from integer
  2893. */
  2894. int mbedtls_mpi_lset( mbedtls_mpi *X, mbedtls_mpi_sint z )
  2895. {
  2896. int ret;
  2897. MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, 1 ) );
  2898. memset( X->p, 0, X->n * ciL );
  2899. X->p[0] = ( z < 0 ) ? -z : z;
  2900. X->s = ( z < 0 ) ? -1 : 1;
  2901. cleanup:
  2902. return( ret );
  2903. }
  2904. /*
  2905. * Get a specific bit
  2906. */
  2907. int mbedtls_mpi_get_bit( const mbedtls_mpi *X, size_t pos )
  2908. {
  2909. if( X->n * biL <= pos )
  2910. return( 0 );
  2911. return( ( X->p[pos / biL] >> ( pos % biL ) ) & 0x01 );
  2912. }
  2913. /*
  2914. * Set a bit to a specific value of 0 or 1
  2915. */
  2916. int mbedtls_mpi_set_bit( mbedtls_mpi *X, size_t pos, unsigned char val )
  2917. {
  2918. int ret = 0;
  2919. size_t off = pos / biL;
  2920. size_t idx = pos % biL;
  2921. if( val != 0 && val != 1 )
  2922. return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA );
  2923. if( X->n * biL <= pos )
  2924. {
  2925. if( val == 0 )
  2926. return( 0 );
  2927. MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, off + 1 ) );
  2928. }
  2929. X->p[off] &= ~( (mbedtls_mpi_uint) 0x01 << idx );
  2930. X->p[off] |= (mbedtls_mpi_uint) val << idx;
  2931. cleanup:
  2932. return( ret );
  2933. }
  2934. /*
  2935. * Return the number of less significant zero-bits
  2936. */
  2937. size_t mbedtls_mpi_lsb( const mbedtls_mpi *X )
  2938. {
  2939. size_t i, j, count = 0;
  2940. for( i = 0; i < X->n; i++ )
  2941. for( j = 0; j < biL; j++, count++ )
  2942. if( ( ( X->p[i] >> j ) & 1 ) != 0 )
  2943. return( count );
  2944. return( 0 );
  2945. }
  2946. /*
  2947. * Count leading zero bits in a given integer
  2948. */
  2949. static size_t mbedtls_clz( const mbedtls_mpi_uint x )
  2950. {
  2951. size_t j;
  2952. mbedtls_mpi_uint mask = (mbedtls_mpi_uint) 1 << (biL - 1);
  2953. for( j = 0; j < biL; j++ )
  2954. {
  2955. if( x & mask ) break;
  2956. mask >>= 1;
  2957. }
  2958. return j;
  2959. }
  2960. /*
  2961. * Return the number of bits
  2962. */
  2963. size_t mbedtls_mpi_bitlen( const mbedtls_mpi *X )
  2964. {
  2965. size_t i, j;
  2966. if( X->n == 0 )
  2967. return( 0 );
  2968. for( i = X->n - 1; i > 0; i-- )
  2969. if( X->p[i] != 0 )
  2970. break;
  2971. j = biL - mbedtls_clz( X->p[i] );
  2972. return( ( i * biL ) + j );
  2973. }
  2974. /*
  2975. * Return the total size in bytes
  2976. */
  2977. size_t mbedtls_mpi_size( const mbedtls_mpi *X )
  2978. {
  2979. return( ( mbedtls_mpi_bitlen( X ) + 7 ) >> 3 );
  2980. }
  2981. /*
  2982. * Convert an ASCII character to digit value
  2983. */
  2984. static int mpi_get_digit( mbedtls_mpi_uint *d, int radix, char c )
  2985. {
  2986. *d = 255;
  2987. if( c >= 0x30 && c <= 0x39 ) *d = c - 0x30;
  2988. if( c >= 0x41 && c <= 0x46 ) *d = c - 0x37;
  2989. if( c >= 0x61 && c <= 0x66 ) *d = c - 0x57;
  2990. if( *d >= (mbedtls_mpi_uint) radix )
  2991. return( MBEDTLS_ERR_MPI_INVALID_CHARACTER );
  2992. return( 0 );
  2993. }
  2994. /*
  2995. * Import from an ASCII string
  2996. */
  2997. int mbedtls_mpi_read_string( mbedtls_mpi *X, int radix, const char *s )
  2998. {
  2999. int ret;
  3000. size_t i, j, slen, n;
  3001. mbedtls_mpi_uint d;
  3002. mbedtls_mpi T;
  3003. if( radix < 2 || radix > 16 )
  3004. return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA );
  3005. mbedtls_mpi_init( &T );
  3006. slen = strlen( s );
  3007. if( radix == 16 )
  3008. {
  3009. if( slen > MPI_SIZE_T_MAX >> 2 )
  3010. return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA );
  3011. n = BITS_TO_LIMBS( slen << 2 );
  3012. MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, n ) );
  3013. MBEDTLS_MPI_CHK( mbedtls_mpi_lset( X, 0 ) );
  3014. for( i = slen, j = 0; i > 0; i--, j++ )
  3015. {
  3016. if( i == 1 && s[i - 1] == '-' )
  3017. {
  3018. X->s = -1;
  3019. break;
  3020. }
  3021. MBEDTLS_MPI_CHK( mpi_get_digit( &d, radix, s[i - 1] ) );
  3022. X->p[j / ( 2 * ciL )] |= d << ( ( j % ( 2 * ciL ) ) << 2 );
  3023. }
  3024. }
  3025. else
  3026. {
  3027. MBEDTLS_MPI_CHK( mbedtls_mpi_lset( X, 0 ) );
  3028. for( i = 0; i < slen; i++ )
  3029. {
  3030. if( i == 0 && s[i] == '-' )
  3031. {
  3032. X->s = -1;
  3033. continue;
  3034. }
  3035. MBEDTLS_MPI_CHK( mpi_get_digit( &d, radix, s[i] ) );
  3036. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_int( &T, X, radix ) );
  3037. if( X->s == 1 )
  3038. {
  3039. MBEDTLS_MPI_CHK( mbedtls_mpi_add_int( X, &T, d ) );
  3040. }
  3041. else
  3042. {
  3043. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( X, &T, d ) );
  3044. }
  3045. }
  3046. }
  3047. cleanup:
  3048. mbedtls_mpi_free( &T );
  3049. return( ret );
  3050. }
  3051. /*
  3052. * Helper to write the digits high-order first
  3053. */
  3054. static int mpi_write_hlp( mbedtls_mpi *X, int radix, char **p )
  3055. {
  3056. int ret;
  3057. mbedtls_mpi_uint r;
  3058. if( radix < 2 || radix > 16 )
  3059. return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA );
  3060. MBEDTLS_MPI_CHK( mbedtls_mpi_mod_int( &r, X, radix ) );
  3061. MBEDTLS_MPI_CHK( mbedtls_mpi_div_int( X, NULL, X, radix ) );
  3062. if( mbedtls_mpi_cmp_int( X, 0 ) != 0 )
  3063. MBEDTLS_MPI_CHK( mpi_write_hlp( X, radix, p ) );
  3064. if( r < 10 )
  3065. *(*p)++ = (char)( r + 0x30 );
  3066. else
  3067. *(*p)++ = (char)( r + 0x37 );
  3068. cleanup:
  3069. return( ret );
  3070. }
  3071. /*
  3072. * Export into an ASCII string
  3073. */
  3074. int mbedtls_mpi_write_string( const mbedtls_mpi *X, int radix,
  3075. char *buf, size_t buflen, size_t *olen )
  3076. {
  3077. int ret = 0;
  3078. size_t n;
  3079. char *p;
  3080. mbedtls_mpi T;
  3081. if( radix < 2 || radix > 16 )
  3082. return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA );
  3083. n = mbedtls_mpi_bitlen( X );
  3084. if( radix >= 4 ) n >>= 1;
  3085. if( radix >= 16 ) n >>= 1;
  3086. n += 3;
  3087. if( buflen < n )
  3088. {
  3089. *olen = n;
  3090. return( MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL );
  3091. }
  3092. p = buf;
  3093. mbedtls_mpi_init( &T );
  3094. if( X->s == -1 )
  3095. *p++ = '-';
  3096. if( radix == 16 )
  3097. {
  3098. int c;
  3099. size_t i, j, k;
  3100. for( i = X->n, k = 0; i > 0; i-- )
  3101. {
  3102. for( j = ciL; j > 0; j-- )
  3103. {
  3104. c = ( X->p[i - 1] >> ( ( j - 1 ) << 3) ) & 0xFF;
  3105. if( c == 0 && k == 0 && ( i + j ) != 2 )
  3106. continue;
  3107. *(p++) = "0123456789ABCDEF" [c / 16];
  3108. *(p++) = "0123456789ABCDEF" [c % 16];
  3109. k = 1;
  3110. }
  3111. }
  3112. }
  3113. else
  3114. {
  3115. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &T, X ) );
  3116. if( T.s == -1 )
  3117. T.s = 1;
  3118. MBEDTLS_MPI_CHK( mpi_write_hlp( &T, radix, &p ) );
  3119. }
  3120. *p++ = '\0';
  3121. *olen = p - buf;
  3122. cleanup:
  3123. mbedtls_mpi_free( &T );
  3124. return( ret );
  3125. }
  3126. #if defined(MBEDTLS_FS_IO)
  3127. /*
  3128. * Read X from an opened file
  3129. */
  3130. int mbedtls_mpi_read_file( mbedtls_mpi *X, int radix, FILE *fin )
  3131. {
  3132. mbedtls_mpi_uint d;
  3133. size_t slen;
  3134. char *p;
  3135. /*
  3136. * Buffer should have space for (short) label and decimal formatted MPI,
  3137. * newline characters and '\0'
  3138. */
  3139. char s[ MBEDTLS_MPI_RW_BUFFER_SIZE ];
  3140. memset( s, 0, sizeof( s ) );
  3141. if( fgets( s, sizeof( s ) - 1, fin ) == NULL )
  3142. return( MBEDTLS_ERR_MPI_FILE_IO_ERROR );
  3143. slen = strlen( s );
  3144. if( slen == sizeof( s ) - 2 )
  3145. return( MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL );
  3146. if( s[slen - 1] == '\n' ) { slen--; s[slen] = '\0'; }
  3147. if( s[slen - 1] == '\r' ) { slen--; s[slen] = '\0'; }
  3148. p = s + slen;
  3149. while( --p >= s )
  3150. if( mpi_get_digit( &d, radix, *p ) != 0 )
  3151. break;
  3152. return( mbedtls_mpi_read_string( X, radix, p + 1 ) );
  3153. }
  3154. /*
  3155. * Write X into an opened file (or stdout if fout == NULL)
  3156. */
  3157. int mbedtls_mpi_write_file( const char *p, const mbedtls_mpi *X, int radix, FILE *fout )
  3158. {
  3159. int ret;
  3160. size_t n, slen, plen;
  3161. /*
  3162. * Buffer should have space for (short) label and decimal formatted MPI,
  3163. * newline characters and '\0'
  3164. */
  3165. char s[ MBEDTLS_MPI_RW_BUFFER_SIZE ];
  3166. memset( s, 0, sizeof( s ) );
  3167. MBEDTLS_MPI_CHK( mbedtls_mpi_write_string( X, radix, s, sizeof( s ) - 2, &n ) );
  3168. if( p == NULL ) p = "";
  3169. plen = strlen( p );
  3170. slen = strlen( s );
  3171. s[slen++] = '\r';
  3172. s[slen++] = '\n';
  3173. if( fout != NULL )
  3174. {
  3175. if( fwrite( p, 1, plen, fout ) != plen ||
  3176. fwrite( s, 1, slen, fout ) != slen )
  3177. return( MBEDTLS_ERR_MPI_FILE_IO_ERROR );
  3178. }
  3179. else
  3180. mbedtls_printf( "%s%s", p, s );
  3181. cleanup:
  3182. return( ret );
  3183. }
  3184. #endif /* MBEDTLS_FS_IO */
  3185. /*
  3186. * Import X from unsigned binary data, big endian
  3187. */
  3188. int mbedtls_mpi_read_binary( mbedtls_mpi *X, const unsigned char *buf, size_t buflen )
  3189. {
  3190. int ret;
  3191. size_t i, j, n;
  3192. for( n = 0; n < buflen; n++ )
  3193. if( buf[n] != 0 )
  3194. break;
  3195. MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, CHARS_TO_LIMBS( buflen - n ) ) );
  3196. MBEDTLS_MPI_CHK( mbedtls_mpi_lset( X, 0 ) );
  3197. for( i = buflen, j = 0; i > n; i--, j++ )
  3198. X->p[j / ciL] |= ((mbedtls_mpi_uint) buf[i - 1]) << ((j % ciL) << 3);
  3199. cleanup:
  3200. return( ret );
  3201. }
  3202. /*
  3203. * Export X into unsigned binary data, big endian
  3204. */
  3205. int mbedtls_mpi_write_binary( const mbedtls_mpi *X, unsigned char *buf, size_t buflen )
  3206. {
  3207. size_t i, j, n;
  3208. n = mbedtls_mpi_size( X );
  3209. if( buflen < n )
  3210. return( MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL );
  3211. memset( buf, 0, buflen );
  3212. for( i = buflen - 1, j = 0; n > 0; i--, j++, n-- )
  3213. buf[i] = (unsigned char)( X->p[j / ciL] >> ((j % ciL) << 3) );
  3214. return( 0 );
  3215. }
  3216. /*
  3217. * Left-shift: X <<= count
  3218. */
  3219. int mbedtls_mpi_shift_l( mbedtls_mpi *X, size_t count )
  3220. {
  3221. int ret;
  3222. size_t i, v0, t1;
  3223. mbedtls_mpi_uint r0 = 0, r1;
  3224. v0 = count / (biL );
  3225. t1 = count & (biL - 1);
  3226. i = mbedtls_mpi_bitlen( X ) + count;
  3227. if( X->n * biL < i )
  3228. MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, BITS_TO_LIMBS( i ) ) );
  3229. ret = 0;
  3230. /*
  3231. * shift by count / limb_size
  3232. */
  3233. if( v0 > 0 )
  3234. {
  3235. for( i = X->n; i > v0; i-- )
  3236. X->p[i - 1] = X->p[i - v0 - 1];
  3237. for( ; i > 0; i-- )
  3238. X->p[i - 1] = 0;
  3239. }
  3240. /*
  3241. * shift by count % limb_size
  3242. */
  3243. if( t1 > 0 )
  3244. {
  3245. for( i = v0; i < X->n; i++ )
  3246. {
  3247. r1 = X->p[i] >> (biL - t1);
  3248. X->p[i] <<= t1;
  3249. X->p[i] |= r0;
  3250. r0 = r1;
  3251. }
  3252. }
  3253. cleanup:
  3254. return( ret );
  3255. }
  3256. /*
  3257. * Right-shift: X >>= count
  3258. */
  3259. int mbedtls_mpi_shift_r( mbedtls_mpi *X, size_t count )
  3260. {
  3261. size_t i, v0, v1;
  3262. mbedtls_mpi_uint r0 = 0, r1;
  3263. v0 = count / biL;
  3264. v1 = count & (biL - 1);
  3265. if( v0 > X->n || ( v0 == X->n && v1 > 0 ) )
  3266. return mbedtls_mpi_lset( X, 0 );
  3267. /*
  3268. * shift by count / limb_size
  3269. */
  3270. if( v0 > 0 )
  3271. {
  3272. for( i = 0; i < X->n - v0; i++ )
  3273. X->p[i] = X->p[i + v0];
  3274. for( ; i < X->n; i++ )
  3275. X->p[i] = 0;
  3276. }
  3277. /*
  3278. * shift by count % limb_size
  3279. */
  3280. if( v1 > 0 )
  3281. {
  3282. for( i = X->n; i > 0; i-- )
  3283. {
  3284. r1 = X->p[i - 1] << (biL - v1);
  3285. X->p[i - 1] >>= v1;
  3286. X->p[i - 1] |= r0;
  3287. r0 = r1;
  3288. }
  3289. }
  3290. return( 0 );
  3291. }
  3292. /*
  3293. * Compare unsigned values
  3294. */
  3295. int mbedtls_mpi_cmp_abs( const mbedtls_mpi *X, const mbedtls_mpi *Y )
  3296. {
  3297. size_t i, j;
  3298. for( i = X->n; i > 0; i-- )
  3299. if( X->p[i - 1] != 0 )
  3300. break;
  3301. for( j = Y->n; j > 0; j-- )
  3302. if( Y->p[j - 1] != 0 )
  3303. break;
  3304. if( i == 0 && j == 0 )
  3305. return( 0 );
  3306. if( i > j ) return( 1 );
  3307. if( j > i ) return( -1 );
  3308. for( ; i > 0; i-- )
  3309. {
  3310. if( X->p[i - 1] > Y->p[i - 1] ) return( 1 );
  3311. if( X->p[i - 1] < Y->p[i - 1] ) return( -1 );
  3312. }
  3313. return( 0 );
  3314. }
  3315. /*
  3316. * Compare signed values
  3317. */
  3318. int mbedtls_mpi_cmp_mpi( const mbedtls_mpi *X, const mbedtls_mpi *Y )
  3319. {
  3320. size_t i, j;
  3321. for( i = X->n; i > 0; i-- )
  3322. if( X->p[i - 1] != 0 )
  3323. break;
  3324. for( j = Y->n; j > 0; j-- )
  3325. if( Y->p[j - 1] != 0 )
  3326. break;
  3327. if( i == 0 && j == 0 )
  3328. return( 0 );
  3329. if( i > j ) return( X->s );
  3330. if( j > i ) return( -Y->s );
  3331. if( X->s > 0 && Y->s < 0 ) return( 1 );
  3332. if( Y->s > 0 && X->s < 0 ) return( -1 );
  3333. for( ; i > 0; i-- )
  3334. {
  3335. if( X->p[i - 1] > Y->p[i - 1] ) return( X->s );
  3336. if( X->p[i - 1] < Y->p[i - 1] ) return( -X->s );
  3337. }
  3338. return( 0 );
  3339. }
  3340. /*
  3341. * Compare signed values
  3342. */
  3343. int mbedtls_mpi_cmp_int( const mbedtls_mpi *X, mbedtls_mpi_sint z )
  3344. {
  3345. mbedtls_mpi Y;
  3346. mbedtls_mpi_uint p[1];
  3347. *p = ( z < 0 ) ? -z : z;
  3348. Y.s = ( z < 0 ) ? -1 : 1;
  3349. Y.n = 1;
  3350. Y.p = p;
  3351. return( mbedtls_mpi_cmp_mpi( X, &Y ) );
  3352. }
  3353. /*
  3354. * Unsigned addition: X = |A| + |B| (HAC 14.7)
  3355. */
  3356. int mbedtls_mpi_add_abs( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B )
  3357. {
  3358. int ret;
  3359. size_t i, j;
  3360. mbedtls_mpi_uint *o, *p, c;
  3361. if( X == B )
  3362. {
  3363. const mbedtls_mpi *T = A; A = X; B = T;
  3364. }
  3365. if( X != A )
  3366. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( X, A ) );
  3367. /*
  3368. * X should always be positive as a result of unsigned additions.
  3369. */
  3370. X->s = 1;
  3371. for( j = B->n; j > 0; j-- )
  3372. if( B->p[j - 1] != 0 )
  3373. break;
  3374. MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, j ) );
  3375. o = B->p; p = X->p; c = 0;
  3376. for( i = 0; i < j; i++, o++, p++ )
  3377. {
  3378. *p += c; c = ( *p < c );
  3379. *p += *o; c += ( *p < *o );
  3380. }
  3381. while( c != 0 )
  3382. {
  3383. if( i >= X->n )
  3384. {
  3385. MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, i + 1 ) );
  3386. p = X->p + i;
  3387. }
  3388. *p += c; c = ( *p < c ); i++; p++;
  3389. }
  3390. cleanup:
  3391. return( ret );
  3392. }
  3393. /*
  3394. * Helper for mbedtls_mpi subtraction
  3395. */
  3396. static void mpi_sub_hlp( size_t n, mbedtls_mpi_uint *s, mbedtls_mpi_uint *d )
  3397. {
  3398. size_t i;
  3399. mbedtls_mpi_uint c, z;
  3400. for( i = c = 0; i < n; i++, s++, d++ )
  3401. {
  3402. z = ( *d < c ); *d -= c;
  3403. c = ( *d < *s ) + z; *d -= *s;
  3404. }
  3405. while( c != 0 )
  3406. {
  3407. z = ( *d < c ); *d -= c;
  3408. c = z; i++; d++;
  3409. }
  3410. }
  3411. /*
  3412. * Unsigned subtraction: X = |A| - |B| (HAC 14.9)
  3413. */
  3414. int mbedtls_mpi_sub_abs( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B )
  3415. {
  3416. mbedtls_mpi TB;
  3417. int ret;
  3418. size_t n;
  3419. if( mbedtls_mpi_cmp_abs( A, B ) < 0 )
  3420. return( MBEDTLS_ERR_MPI_NEGATIVE_VALUE );
  3421. mbedtls_mpi_init( &TB );
  3422. if( X == B )
  3423. {
  3424. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TB, B ) );
  3425. B = &TB;
  3426. }
  3427. if( X != A )
  3428. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( X, A ) );
  3429. /*
  3430. * X should always be positive as a result of unsigned subtractions.
  3431. */
  3432. X->s = 1;
  3433. ret = 0;
  3434. for( n = B->n; n > 0; n-- )
  3435. if( B->p[n - 1] != 0 )
  3436. break;
  3437. mpi_sub_hlp( n, B->p, X->p );
  3438. cleanup:
  3439. mbedtls_mpi_free( &TB );
  3440. return( ret );
  3441. }
  3442. /*
  3443. * Signed addition: X = A + B
  3444. */
  3445. int mbedtls_mpi_add_mpi( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B )
  3446. {
  3447. int ret, s = A->s;
  3448. if( A->s * B->s < 0 )
  3449. {
  3450. if( mbedtls_mpi_cmp_abs( A, B ) >= 0 )
  3451. {
  3452. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( X, A, B ) );
  3453. X->s = s;
  3454. }
  3455. else
  3456. {
  3457. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( X, B, A ) );
  3458. X->s = -s;
  3459. }
  3460. }
  3461. else
  3462. {
  3463. MBEDTLS_MPI_CHK( mbedtls_mpi_add_abs( X, A, B ) );
  3464. X->s = s;
  3465. }
  3466. cleanup:
  3467. return( ret );
  3468. }
  3469. /*
  3470. * Signed subtraction: X = A - B
  3471. */
  3472. int mbedtls_mpi_sub_mpi( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B )
  3473. {
  3474. int ret, s = A->s;
  3475. if( A->s * B->s > 0 )
  3476. {
  3477. if( mbedtls_mpi_cmp_abs( A, B ) >= 0 )
  3478. {
  3479. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( X, A, B ) );
  3480. X->s = s;
  3481. }
  3482. else
  3483. {
  3484. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( X, B, A ) );
  3485. X->s = -s;
  3486. }
  3487. }
  3488. else
  3489. {
  3490. MBEDTLS_MPI_CHK( mbedtls_mpi_add_abs( X, A, B ) );
  3491. X->s = s;
  3492. }
  3493. cleanup:
  3494. return( ret );
  3495. }
  3496. /*
  3497. * Signed addition: X = A + b
  3498. */
  3499. int mbedtls_mpi_add_int( mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_sint b )
  3500. {
  3501. mbedtls_mpi _B;
  3502. mbedtls_mpi_uint p[1];
  3503. p[0] = ( b < 0 ) ? -b : b;
  3504. _B.s = ( b < 0 ) ? -1 : 1;
  3505. _B.n = 1;
  3506. _B.p = p;
  3507. return( mbedtls_mpi_add_mpi( X, A, &_B ) );
  3508. }
  3509. /*
  3510. * Signed subtraction: X = A - b
  3511. */
  3512. int mbedtls_mpi_sub_int( mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_sint b )
  3513. {
  3514. mbedtls_mpi _B;
  3515. mbedtls_mpi_uint p[1];
  3516. p[0] = ( b < 0 ) ? -b : b;
  3517. _B.s = ( b < 0 ) ? -1 : 1;
  3518. _B.n = 1;
  3519. _B.p = p;
  3520. return( mbedtls_mpi_sub_mpi( X, A, &_B ) );
  3521. }
  3522. /*
  3523. * Helper for mbedtls_mpi multiplication
  3524. */
  3525. static
  3526. #if defined(__APPLE__) && defined(__arm__)
  3527. /*
  3528. * Apple LLVM version 4.2 (clang-425.0.24) (based on LLVM 3.2svn)
  3529. * appears to need this to prevent bad ARM code generation at -O3.
  3530. */
  3531. __attribute__ ((noinline))
  3532. #endif
  3533. void mpi_mul_hlp( size_t i, mbedtls_mpi_uint *s, mbedtls_mpi_uint *d, mbedtls_mpi_uint b )
  3534. {
  3535. mbedtls_mpi_uint c = 0, t = 0;
  3536. #if defined(MULADDC_HUIT)
  3537. for( ; i >= 8; i -= 8 )
  3538. {
  3539. MULADDC_INIT
  3540. MULADDC_HUIT
  3541. MULADDC_STOP
  3542. }
  3543. for( ; i > 0; i-- )
  3544. {
  3545. MULADDC_INIT
  3546. MULADDC_CORE
  3547. MULADDC_STOP
  3548. }
  3549. #else /* MULADDC_HUIT */
  3550. for( ; i >= 16; i -= 16 )
  3551. {
  3552. MULADDC_INIT
  3553. MULADDC_CORE MULADDC_CORE
  3554. MULADDC_CORE MULADDC_CORE
  3555. MULADDC_CORE MULADDC_CORE
  3556. MULADDC_CORE MULADDC_CORE
  3557. MULADDC_CORE MULADDC_CORE
  3558. MULADDC_CORE MULADDC_CORE
  3559. MULADDC_CORE MULADDC_CORE
  3560. MULADDC_CORE MULADDC_CORE
  3561. MULADDC_STOP
  3562. }
  3563. for( ; i >= 8; i -= 8 )
  3564. {
  3565. MULADDC_INIT
  3566. MULADDC_CORE MULADDC_CORE
  3567. MULADDC_CORE MULADDC_CORE
  3568. MULADDC_CORE MULADDC_CORE
  3569. MULADDC_CORE MULADDC_CORE
  3570. MULADDC_STOP
  3571. }
  3572. for( ; i > 0; i-- )
  3573. {
  3574. MULADDC_INIT
  3575. MULADDC_CORE
  3576. MULADDC_STOP
  3577. }
  3578. #endif /* MULADDC_HUIT */
  3579. t++;
  3580. do {
  3581. *d += c; c = ( *d < c ); d++;
  3582. }
  3583. while( c != 0 );
  3584. }
  3585. /*
  3586. * Baseline multiplication: X = A * B (HAC 14.12)
  3587. */
  3588. int mbedtls_mpi_mul_mpi( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B )
  3589. {
  3590. int ret;
  3591. size_t i, j;
  3592. mbedtls_mpi TA, TB;
  3593. mbedtls_mpi_init( &TA ); mbedtls_mpi_init( &TB );
  3594. if( X == A ) { MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TA, A ) ); A = &TA; }
  3595. if( X == B ) { MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TB, B ) ); B = &TB; }
  3596. for( i = A->n; i > 0; i-- )
  3597. if( A->p[i - 1] != 0 )
  3598. break;
  3599. for( j = B->n; j > 0; j-- )
  3600. if( B->p[j - 1] != 0 )
  3601. break;
  3602. MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, i + j ) );
  3603. MBEDTLS_MPI_CHK( mbedtls_mpi_lset( X, 0 ) );
  3604. for( i++; j > 0; j-- )
  3605. mpi_mul_hlp( i - 1, A->p, X->p + j - 1, B->p[j - 1] );
  3606. X->s = A->s * B->s;
  3607. cleanup:
  3608. mbedtls_mpi_free( &TB ); mbedtls_mpi_free( &TA );
  3609. return( ret );
  3610. }
  3611. /*
  3612. * Baseline multiplication: X = A * b
  3613. */
  3614. int mbedtls_mpi_mul_int( mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_uint b )
  3615. {
  3616. mbedtls_mpi _B;
  3617. mbedtls_mpi_uint p[1];
  3618. _B.s = 1;
  3619. _B.n = 1;
  3620. _B.p = p;
  3621. p[0] = b;
  3622. return( mbedtls_mpi_mul_mpi( X, A, &_B ) );
  3623. }
  3624. /*
  3625. * Unsigned integer divide - double mbedtls_mpi_uint dividend, u1/u0, and
  3626. * mbedtls_mpi_uint divisor, d
  3627. */
  3628. static mbedtls_mpi_uint mbedtls_int_div_int( mbedtls_mpi_uint u1,
  3629. mbedtls_mpi_uint u0, mbedtls_mpi_uint d, mbedtls_mpi_uint *r )
  3630. {
  3631. #if defined(MBEDTLS_HAVE_UDBL)
  3632. mbedtls_t_udbl dividend, quotient;
  3633. #else
  3634. const mbedtls_mpi_uint radix = (mbedtls_mpi_uint) 1 << biH;
  3635. const mbedtls_mpi_uint uint_halfword_mask = ( (mbedtls_mpi_uint) 1 << biH ) - 1;
  3636. mbedtls_mpi_uint d0, d1, q0, q1, rAX, r0, quotient;
  3637. mbedtls_mpi_uint u0_msw, u0_lsw;
  3638. size_t s;
  3639. #endif
  3640. /*
  3641. * Check for overflow
  3642. */
  3643. if( 0 == d || u1 >= d )
  3644. {
  3645. if (r != NULL) *r = ~0;
  3646. return ( ~0 );
  3647. }
  3648. #if defined(MBEDTLS_HAVE_UDBL)
  3649. dividend = (mbedtls_t_udbl) u1 << biL;
  3650. dividend |= (mbedtls_t_udbl) u0;
  3651. quotient = dividend / d;
  3652. if( quotient > ( (mbedtls_t_udbl) 1 << biL ) - 1 )
  3653. quotient = ( (mbedtls_t_udbl) 1 << biL ) - 1;
  3654. if( r != NULL )
  3655. *r = (mbedtls_mpi_uint)( dividend - (quotient * d ) );
  3656. return (mbedtls_mpi_uint) quotient;
  3657. #else
  3658. /*
  3659. * Algorithm D, Section 4.3.1 - The Art of Computer Programming
  3660. * Vol. 2 - Seminumerical Algorithms, Knuth
  3661. */
  3662. /*
  3663. * Normalize the divisor, d, and dividend, u0, u1
  3664. */
  3665. s = mbedtls_clz( d );
  3666. d = d << s;
  3667. u1 = u1 << s;
  3668. u1 |= ( u0 >> ( biL - s ) ) & ( -(mbedtls_mpi_sint)s >> ( biL - 1 ) );
  3669. u0 = u0 << s;
  3670. d1 = d >> biH;
  3671. d0 = d & uint_halfword_mask;
  3672. u0_msw = u0 >> biH;
  3673. u0_lsw = u0 & uint_halfword_mask;
  3674. /*
  3675. * Find the first quotient and remainder
  3676. */
  3677. q1 = u1 / d1;
  3678. r0 = u1 - d1 * q1;
  3679. while( q1 >= radix || ( q1 * d0 > radix * r0 + u0_msw ) )
  3680. {
  3681. q1 -= 1;
  3682. r0 += d1;
  3683. if ( r0 >= radix ) break;
  3684. }
  3685. rAX = ( u1 * radix ) + ( u0_msw - q1 * d );
  3686. q0 = rAX / d1;
  3687. r0 = rAX - q0 * d1;
  3688. while( q0 >= radix || ( q0 * d0 > radix * r0 + u0_lsw ) )
  3689. {
  3690. q0 -= 1;
  3691. r0 += d1;
  3692. if ( r0 >= radix ) break;
  3693. }
  3694. if (r != NULL)
  3695. *r = ( rAX * radix + u0_lsw - q0 * d ) >> s;
  3696. quotient = q1 * radix + q0;
  3697. return quotient;
  3698. #endif
  3699. }
  3700. /*
  3701. * Division by mbedtls_mpi: A = Q * B + R (HAC 14.20)
  3702. */
  3703. int mbedtls_mpi_div_mpi( mbedtls_mpi *Q, mbedtls_mpi *R, const mbedtls_mpi *A, const mbedtls_mpi *B )
  3704. {
  3705. int ret;
  3706. size_t i, n, t, k;
  3707. mbedtls_mpi X, Y, Z, T1, T2;
  3708. if( mbedtls_mpi_cmp_int( B, 0 ) == 0 )
  3709. return( MBEDTLS_ERR_MPI_DIVISION_BY_ZERO );
  3710. mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z );
  3711. mbedtls_mpi_init( &T1 ); mbedtls_mpi_init( &T2 );
  3712. if( mbedtls_mpi_cmp_abs( A, B ) < 0 )
  3713. {
  3714. if( Q != NULL ) MBEDTLS_MPI_CHK( mbedtls_mpi_lset( Q, 0 ) );
  3715. if( R != NULL ) MBEDTLS_MPI_CHK( mbedtls_mpi_copy( R, A ) );
  3716. return( 0 );
  3717. }
  3718. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &X, A ) );
  3719. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &Y, B ) );
  3720. X.s = Y.s = 1;
  3721. MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &Z, A->n + 2 ) );
  3722. MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &Z, 0 ) );
  3723. MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &T1, 2 ) );
  3724. MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &T2, 3 ) );
  3725. k = mbedtls_mpi_bitlen( &Y ) % biL;
  3726. if( k < biL - 1 )
  3727. {
  3728. k = biL - 1 - k;
  3729. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &X, k ) );
  3730. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &Y, k ) );
  3731. }
  3732. else k = 0;
  3733. n = X.n - 1;
  3734. t = Y.n - 1;
  3735. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &Y, biL * ( n - t ) ) );
  3736. while( mbedtls_mpi_cmp_mpi( &X, &Y ) >= 0 )
  3737. {
  3738. Z.p[n - t]++;
  3739. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &X, &X, &Y ) );
  3740. }
  3741. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &Y, biL * ( n - t ) ) );
  3742. for( i = n; i > t ; i-- )
  3743. {
  3744. if( X.p[i] >= Y.p[t] )
  3745. Z.p[i - t - 1] = ~0;
  3746. else
  3747. {
  3748. Z.p[i - t - 1] = mbedtls_int_div_int( X.p[i], X.p[i - 1],
  3749. Y.p[t], NULL);
  3750. }
  3751. Z.p[i - t - 1]++;
  3752. do
  3753. {
  3754. Z.p[i - t - 1]--;
  3755. MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &T1, 0 ) );
  3756. T1.p[0] = ( t < 1 ) ? 0 : Y.p[t - 1];
  3757. T1.p[1] = Y.p[t];
  3758. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_int( &T1, &T1, Z.p[i - t - 1] ) );
  3759. MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &T2, 0 ) );
  3760. T2.p[0] = ( i < 2 ) ? 0 : X.p[i - 2];
  3761. T2.p[1] = ( i < 1 ) ? 0 : X.p[i - 1];
  3762. T2.p[2] = X.p[i];
  3763. }
  3764. while( mbedtls_mpi_cmp_mpi( &T1, &T2 ) > 0 );
  3765. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_int( &T1, &Y, Z.p[i - t - 1] ) );
  3766. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &T1, biL * ( i - t - 1 ) ) );
  3767. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &X, &X, &T1 ) );
  3768. if( mbedtls_mpi_cmp_int( &X, 0 ) < 0 )
  3769. {
  3770. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &T1, &Y ) );
  3771. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &T1, biL * ( i - t - 1 ) ) );
  3772. MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &X, &X, &T1 ) );
  3773. Z.p[i - t - 1]--;
  3774. }
  3775. }
  3776. if( Q != NULL )
  3777. {
  3778. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( Q, &Z ) );
  3779. Q->s = A->s * B->s;
  3780. }
  3781. if( R != NULL )
  3782. {
  3783. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &X, k ) );
  3784. X.s = A->s;
  3785. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( R, &X ) );
  3786. if( mbedtls_mpi_cmp_int( R, 0 ) == 0 )
  3787. R->s = 1;
  3788. }
  3789. cleanup:
  3790. mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z );
  3791. mbedtls_mpi_free( &T1 ); mbedtls_mpi_free( &T2 );
  3792. return( ret );
  3793. }
  3794. /*
  3795. * Division by int: A = Q * b + R
  3796. */
  3797. int mbedtls_mpi_div_int( mbedtls_mpi *Q, mbedtls_mpi *R, const mbedtls_mpi *A, mbedtls_mpi_sint b )
  3798. {
  3799. mbedtls_mpi _B;
  3800. mbedtls_mpi_uint p[1];
  3801. p[0] = ( b < 0 ) ? -b : b;
  3802. _B.s = ( b < 0 ) ? -1 : 1;
  3803. _B.n = 1;
  3804. _B.p = p;
  3805. return( mbedtls_mpi_div_mpi( Q, R, A, &_B ) );
  3806. }
  3807. /*
  3808. * Modulo: R = A mod B
  3809. */
  3810. int mbedtls_mpi_mod_mpi( mbedtls_mpi *R, const mbedtls_mpi *A, const mbedtls_mpi *B )
  3811. {
  3812. int ret;
  3813. if( mbedtls_mpi_cmp_int( B, 0 ) < 0 )
  3814. return( MBEDTLS_ERR_MPI_NEGATIVE_VALUE );
  3815. MBEDTLS_MPI_CHK( mbedtls_mpi_div_mpi( NULL, R, A, B ) );
  3816. while( mbedtls_mpi_cmp_int( R, 0 ) < 0 )
  3817. MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( R, R, B ) );
  3818. while( mbedtls_mpi_cmp_mpi( R, B ) >= 0 )
  3819. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( R, R, B ) );
  3820. cleanup:
  3821. return( ret );
  3822. }
  3823. /*
  3824. * Modulo: r = A mod b
  3825. */
  3826. int mbedtls_mpi_mod_int( mbedtls_mpi_uint *r, const mbedtls_mpi *A, mbedtls_mpi_sint b )
  3827. {
  3828. size_t i;
  3829. mbedtls_mpi_uint x, y, z;
  3830. if( b == 0 )
  3831. return( MBEDTLS_ERR_MPI_DIVISION_BY_ZERO );
  3832. if( b < 0 )
  3833. return( MBEDTLS_ERR_MPI_NEGATIVE_VALUE );
  3834. /*
  3835. * handle trivial cases
  3836. */
  3837. if( b == 1 )
  3838. {
  3839. *r = 0;
  3840. return( 0 );
  3841. }
  3842. if( b == 2 )
  3843. {
  3844. *r = A->p[0] & 1;
  3845. return( 0 );
  3846. }
  3847. /*
  3848. * general case
  3849. */
  3850. for( i = A->n, y = 0; i > 0; i-- )
  3851. {
  3852. x = A->p[i - 1];
  3853. y = ( y << biH ) | ( x >> biH );
  3854. z = y / b;
  3855. y -= z * b;
  3856. x <<= biH;
  3857. y = ( y << biH ) | ( x >> biH );
  3858. z = y / b;
  3859. y -= z * b;
  3860. }
  3861. /*
  3862. * If A is negative, then the current y represents a negative value.
  3863. * Flipping it to the positive side.
  3864. */
  3865. if( A->s < 0 && y != 0 )
  3866. y = b - y;
  3867. *r = y;
  3868. return( 0 );
  3869. }
  3870. /*
  3871. * Fast Montgomery initialization (thanks to Tom St Denis)
  3872. */
  3873. static void mpi_montg_init( mbedtls_mpi_uint *mm, const mbedtls_mpi *N )
  3874. {
  3875. mbedtls_mpi_uint x, m0 = N->p[0];
  3876. unsigned int i;
  3877. x = m0;
  3878. x += ( ( m0 + 2 ) & 4 ) << 1;
  3879. for( i = biL; i >= 8; i /= 2 )
  3880. x *= ( 2 - ( m0 * x ) );
  3881. *mm = ~x + 1;
  3882. }
  3883. /*
  3884. * Montgomery multiplication: A = A * B * R^-1 mod N (HAC 14.36)
  3885. */
  3886. static void mpi_montmul( mbedtls_mpi *A, const mbedtls_mpi *B, const mbedtls_mpi *N, mbedtls_mpi_uint mm,
  3887. const mbedtls_mpi *T )
  3888. {
  3889. size_t i, n, m;
  3890. mbedtls_mpi_uint u0, u1, *d;
  3891. memset( T->p, 0, T->n * ciL );
  3892. d = T->p;
  3893. n = N->n;
  3894. m = ( B->n < n ) ? B->n : n;
  3895. for( i = 0; i < n; i++ )
  3896. {
  3897. /*
  3898. * T = (T + u0*B + u1*N) / 2^biL
  3899. */
  3900. u0 = A->p[i];
  3901. u1 = ( d[0] + u0 * B->p[0] ) * mm;
  3902. mpi_mul_hlp( m, B->p, d, u0 );
  3903. mpi_mul_hlp( n, N->p, d, u1 );
  3904. *d++ = u0; d[n + 1] = 0;
  3905. }
  3906. memcpy( A->p, d, ( n + 1 ) * ciL );
  3907. if( mbedtls_mpi_cmp_abs( A, N ) >= 0 )
  3908. mpi_sub_hlp( n, N->p, A->p );
  3909. else
  3910. /* prevent timing attacks */
  3911. mpi_sub_hlp( n, A->p, T->p );
  3912. }
  3913. /*
  3914. * Montgomery reduction: A = A * R^-1 mod N
  3915. */
  3916. static void mpi_montred( mbedtls_mpi *A, const mbedtls_mpi *N, mbedtls_mpi_uint mm, const mbedtls_mpi *T )
  3917. {
  3918. mbedtls_mpi_uint z = 1;
  3919. mbedtls_mpi U;
  3920. U.n = U.s = (int) z;
  3921. U.p = &z;
  3922. mpi_montmul( A, &U, N, mm, T );
  3923. }
  3924. /*
  3925. * Sliding-window exponentiation: X = A^E mod N (HAC 14.85)
  3926. */
  3927. int mbedtls_mpi_exp_mod( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *E, const mbedtls_mpi *N, mbedtls_mpi *_RR )
  3928. {
  3929. int ret;
  3930. size_t wbits, wsize, one = 1;
  3931. size_t i, j, nblimbs;
  3932. size_t bufsize, nbits;
  3933. mbedtls_mpi_uint ei, mm, state;
  3934. mbedtls_mpi RR, T, W[ 2 << MBEDTLS_MPI_WINDOW_SIZE ], Apos;
  3935. int neg;
  3936. if( mbedtls_mpi_cmp_int( N, 0 ) < 0 || ( N->p[0] & 1 ) == 0 )
  3937. return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA );
  3938. if( mbedtls_mpi_cmp_int( E, 0 ) < 0 )
  3939. return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA );
  3940. /*
  3941. * Init temps and window size
  3942. */
  3943. mpi_montg_init( &mm, N );
  3944. mbedtls_mpi_init( &RR ); mbedtls_mpi_init( &T );
  3945. mbedtls_mpi_init( &Apos );
  3946. memset( W, 0, sizeof( W ) );
  3947. i = mbedtls_mpi_bitlen( E );
  3948. wsize = ( i > 671 ) ? 6 : ( i > 239 ) ? 5 :
  3949. ( i > 79 ) ? 4 : ( i > 23 ) ? 3 : 1;
  3950. if( wsize > MBEDTLS_MPI_WINDOW_SIZE )
  3951. wsize = MBEDTLS_MPI_WINDOW_SIZE;
  3952. j = N->n + 1;
  3953. MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, j ) );
  3954. MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &W[1], j ) );
  3955. MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &T, j * 2 ) );
  3956. /*
  3957. * Compensate for negative A (and correct at the end)
  3958. */
  3959. neg = ( A->s == -1 );
  3960. if( neg )
  3961. {
  3962. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &Apos, A ) );
  3963. Apos.s = 1;
  3964. A = &Apos;
  3965. }
  3966. /*
  3967. * If 1st call, pre-compute R^2 mod N
  3968. */
  3969. if( _RR == NULL || _RR->p == NULL )
  3970. {
  3971. MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &RR, 1 ) );
  3972. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &RR, N->n * 2 * biL ) );
  3973. MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &RR, &RR, N ) );
  3974. if( _RR != NULL )
  3975. memcpy( _RR, &RR, sizeof( mbedtls_mpi ) );
  3976. }
  3977. else
  3978. memcpy( &RR, _RR, sizeof( mbedtls_mpi ) );
  3979. /*
  3980. * W[1] = A * R^2 * R^-1 mod N = A * R mod N
  3981. */
  3982. if( mbedtls_mpi_cmp_mpi( A, N ) >= 0 )
  3983. MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &W[1], A, N ) );
  3984. else
  3985. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &W[1], A ) );
  3986. mpi_montmul( &W[1], &RR, N, mm, &T );
  3987. /*
  3988. * X = R^2 * R^-1 mod N = R mod N
  3989. */
  3990. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( X, &RR ) );
  3991. mpi_montred( X, N, mm, &T );
  3992. if( wsize > 1 )
  3993. {
  3994. /*
  3995. * W[1 << (wsize - 1)] = W[1] ^ (wsize - 1)
  3996. */
  3997. j = one << ( wsize - 1 );
  3998. MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &W[j], N->n + 1 ) );
  3999. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &W[j], &W[1] ) );
  4000. for( i = 0; i < wsize - 1; i++ )
  4001. mpi_montmul( &W[j], &W[j], N, mm, &T );
  4002. /*
  4003. * W[i] = W[i - 1] * W[1]
  4004. */
  4005. for( i = j + 1; i < ( one << wsize ); i++ )
  4006. {
  4007. MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &W[i], N->n + 1 ) );
  4008. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &W[i], &W[i - 1] ) );
  4009. mpi_montmul( &W[i], &W[1], N, mm, &T );
  4010. }
  4011. }
  4012. nblimbs = E->n;
  4013. bufsize = 0;
  4014. nbits = 0;
  4015. wbits = 0;
  4016. state = 0;
  4017. while( 1 )
  4018. {
  4019. if( bufsize == 0 )
  4020. {
  4021. if( nblimbs == 0 )
  4022. break;
  4023. nblimbs--;
  4024. bufsize = sizeof( mbedtls_mpi_uint ) << 3;
  4025. }
  4026. bufsize--;
  4027. ei = (E->p[nblimbs] >> bufsize) & 1;
  4028. /*
  4029. * skip leading 0s
  4030. */
  4031. if( ei == 0 && state == 0 )
  4032. continue;
  4033. if( ei == 0 && state == 1 )
  4034. {
  4035. /*
  4036. * out of window, square X
  4037. */
  4038. mpi_montmul( X, X, N, mm, &T );
  4039. continue;
  4040. }
  4041. /*
  4042. * add ei to current window
  4043. */
  4044. state = 2;
  4045. nbits++;
  4046. wbits |= ( ei << ( wsize - nbits ) );
  4047. if( nbits == wsize )
  4048. {
  4049. /*
  4050. * X = X^wsize R^-1 mod N
  4051. */
  4052. for( i = 0; i < wsize; i++ )
  4053. mpi_montmul( X, X, N, mm, &T );
  4054. /*
  4055. * X = X * W[wbits] R^-1 mod N
  4056. */
  4057. mpi_montmul( X, &W[wbits], N, mm, &T );
  4058. state--;
  4059. nbits = 0;
  4060. wbits = 0;
  4061. }
  4062. }
  4063. /*
  4064. * process the remaining bits
  4065. */
  4066. for( i = 0; i < nbits; i++ )
  4067. {
  4068. mpi_montmul( X, X, N, mm, &T );
  4069. wbits <<= 1;
  4070. if( ( wbits & ( one << wsize ) ) != 0 )
  4071. mpi_montmul( X, &W[1], N, mm, &T );
  4072. }
  4073. /*
  4074. * X = A^E * R * R^-1 mod N = A^E mod N
  4075. */
  4076. mpi_montred( X, N, mm, &T );
  4077. if( neg )
  4078. {
  4079. X->s = -1;
  4080. MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( X, N, X ) );
  4081. }
  4082. cleanup:
  4083. for( i = ( one << ( wsize - 1 ) ); i < ( one << wsize ); i++ )
  4084. mbedtls_mpi_free( &W[i] );
  4085. mbedtls_mpi_free( &W[1] ); mbedtls_mpi_free( &T ); mbedtls_mpi_free( &Apos );
  4086. if( _RR == NULL || _RR->p == NULL )
  4087. mbedtls_mpi_free( &RR );
  4088. return( ret );
  4089. }
  4090. /*
  4091. * Greatest common divisor: G = gcd(A, B) (HAC 14.54)
  4092. */
  4093. int mbedtls_mpi_gcd( mbedtls_mpi *G, const mbedtls_mpi *A, const mbedtls_mpi *B )
  4094. {
  4095. int ret;
  4096. size_t lz, lzt;
  4097. mbedtls_mpi TG, TA, TB;
  4098. mbedtls_mpi_init( &TG ); mbedtls_mpi_init( &TA ); mbedtls_mpi_init( &TB );
  4099. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TA, A ) );
  4100. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TB, B ) );
  4101. lz = mbedtls_mpi_lsb( &TA );
  4102. lzt = mbedtls_mpi_lsb( &TB );
  4103. if( lzt < lz )
  4104. lz = lzt;
  4105. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TA, lz ) );
  4106. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TB, lz ) );
  4107. TA.s = TB.s = 1;
  4108. while( mbedtls_mpi_cmp_int( &TA, 0 ) != 0 )
  4109. {
  4110. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TA, mbedtls_mpi_lsb( &TA ) ) );
  4111. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TB, mbedtls_mpi_lsb( &TB ) ) );
  4112. if( mbedtls_mpi_cmp_mpi( &TA, &TB ) >= 0 )
  4113. {
  4114. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( &TA, &TA, &TB ) );
  4115. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TA, 1 ) );
  4116. }
  4117. else
  4118. {
  4119. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( &TB, &TB, &TA ) );
  4120. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TB, 1 ) );
  4121. }
  4122. }
  4123. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &TB, lz ) );
  4124. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( G, &TB ) );
  4125. cleanup:
  4126. mbedtls_mpi_free( &TG ); mbedtls_mpi_free( &TA ); mbedtls_mpi_free( &TB );
  4127. return( ret );
  4128. }
  4129. /*
  4130. * Fill X with size bytes of random.
  4131. *
  4132. * Use a temporary bytes representation to make sure the result is the same
  4133. * regardless of the platform endianness (useful when f_rng is actually
  4134. * deterministic, eg for tests).
  4135. */
  4136. int mbedtls_mpi_fill_random( mbedtls_mpi *X, size_t size,
  4137. int (*f_rng)(void *, unsigned char *, size_t),
  4138. void *p_rng )
  4139. {
  4140. int ret;
  4141. unsigned char buf[MBEDTLS_MPI_MAX_SIZE];
  4142. if( size > MBEDTLS_MPI_MAX_SIZE )
  4143. return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA );
  4144. MBEDTLS_MPI_CHK( f_rng( p_rng, buf, size ) );
  4145. MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( X, buf, size ) );
  4146. cleanup:
  4147. return( ret );
  4148. }
  4149. /*
  4150. * Modular inverse: X = A^-1 mod N (HAC 14.61 / 14.64)
  4151. */
  4152. int mbedtls_mpi_inv_mod( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *N )
  4153. {
  4154. int ret;
  4155. mbedtls_mpi G, TA, TU, U1, U2, TB, TV, V1, V2;
  4156. if( mbedtls_mpi_cmp_int( N, 0 ) <= 0 )
  4157. return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA );
  4158. mbedtls_mpi_init( &TA ); mbedtls_mpi_init( &TU ); mbedtls_mpi_init( &U1 ); mbedtls_mpi_init( &U2 );
  4159. mbedtls_mpi_init( &G ); mbedtls_mpi_init( &TB ); mbedtls_mpi_init( &TV );
  4160. mbedtls_mpi_init( &V1 ); mbedtls_mpi_init( &V2 );
  4161. MBEDTLS_MPI_CHK( mbedtls_mpi_gcd( &G, A, N ) );
  4162. if( mbedtls_mpi_cmp_int( &G, 1 ) != 0 )
  4163. {
  4164. ret = MBEDTLS_ERR_MPI_NOT_ACCEPTABLE;
  4165. goto cleanup;
  4166. }
  4167. MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &TA, A, N ) );
  4168. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TU, &TA ) );
  4169. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TB, N ) );
  4170. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TV, N ) );
  4171. MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &U1, 1 ) );
  4172. MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &U2, 0 ) );
  4173. MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &V1, 0 ) );
  4174. MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &V2, 1 ) );
  4175. do
  4176. {
  4177. while( ( TU.p[0] & 1 ) == 0 )
  4178. {
  4179. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TU, 1 ) );
  4180. if( ( U1.p[0] & 1 ) != 0 || ( U2.p[0] & 1 ) != 0 )
  4181. {
  4182. MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &U1, &U1, &TB ) );
  4183. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &U2, &U2, &TA ) );
  4184. }
  4185. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &U1, 1 ) );
  4186. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &U2, 1 ) );
  4187. }
  4188. while( ( TV.p[0] & 1 ) == 0 )
  4189. {
  4190. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TV, 1 ) );
  4191. if( ( V1.p[0] & 1 ) != 0 || ( V2.p[0] & 1 ) != 0 )
  4192. {
  4193. MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &V1, &V1, &TB ) );
  4194. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &V2, &V2, &TA ) );
  4195. }
  4196. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &V1, 1 ) );
  4197. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &V2, 1 ) );
  4198. }
  4199. if( mbedtls_mpi_cmp_mpi( &TU, &TV ) >= 0 )
  4200. {
  4201. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &TU, &TU, &TV ) );
  4202. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &U1, &U1, &V1 ) );
  4203. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &U2, &U2, &V2 ) );
  4204. }
  4205. else
  4206. {
  4207. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &TV, &TV, &TU ) );
  4208. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &V1, &V1, &U1 ) );
  4209. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &V2, &V2, &U2 ) );
  4210. }
  4211. }
  4212. while( mbedtls_mpi_cmp_int( &TU, 0 ) != 0 );
  4213. while( mbedtls_mpi_cmp_int( &V1, 0 ) < 0 )
  4214. MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &V1, &V1, N ) );
  4215. while( mbedtls_mpi_cmp_mpi( &V1, N ) >= 0 )
  4216. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &V1, &V1, N ) );
  4217. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( X, &V1 ) );
  4218. cleanup:
  4219. mbedtls_mpi_free( &TA ); mbedtls_mpi_free( &TU ); mbedtls_mpi_free( &U1 ); mbedtls_mpi_free( &U2 );
  4220. mbedtls_mpi_free( &G ); mbedtls_mpi_free( &TB ); mbedtls_mpi_free( &TV );
  4221. mbedtls_mpi_free( &V1 ); mbedtls_mpi_free( &V2 );
  4222. return( ret );
  4223. }
  4224. #if defined(MBEDTLS_GENPRIME)
  4225. static const int small_prime[] =
  4226. {
  4227. 3, 5, 7, 11, 13, 17, 19, 23,
  4228. 29, 31, 37, 41, 43, 47, 53, 59,
  4229. 61, 67, 71, 73, 79, 83, 89, 97,
  4230. 101, 103, 107, 109, 113, 127, 131, 137,
  4231. 139, 149, 151, 157, 163, 167, 173, 179,
  4232. 181, 191, 193, 197, 199, 211, 223, 227,
  4233. 229, 233, 239, 241, 251, 257, 263, 269,
  4234. 271, 277, 281, 283, 293, 307, 311, 313,
  4235. 317, 331, 337, 347, 349, 353, 359, 367,
  4236. 373, 379, 383, 389, 397, 401, 409, 419,
  4237. 421, 431, 433, 439, 443, 449, 457, 461,
  4238. 463, 467, 479, 487, 491, 499, 503, 509,
  4239. 521, 523, 541, 547, 557, 563, 569, 571,
  4240. 577, 587, 593, 599, 601, 607, 613, 617,
  4241. 619, 631, 641, 643, 647, 653, 659, 661,
  4242. 673, 677, 683, 691, 701, 709, 719, 727,
  4243. 733, 739, 743, 751, 757, 761, 769, 773,
  4244. 787, 797, 809, 811, 821, 823, 827, 829,
  4245. 839, 853, 857, 859, 863, 877, 881, 883,
  4246. 887, 907, 911, 919, 929, 937, 941, 947,
  4247. 953, 967, 971, 977, 983, 991, 997, -103
  4248. };
  4249. /*
  4250. * Small divisors test (X must be positive)
  4251. *
  4252. * Return values:
  4253. * 0: no small factor (possible prime, more tests needed)
  4254. * 1: certain prime
  4255. * MBEDTLS_ERR_MPI_NOT_ACCEPTABLE: certain non-prime
  4256. * other negative: error
  4257. */
  4258. static int mpi_check_small_factors( const mbedtls_mpi *X )
  4259. {
  4260. int ret = 0;
  4261. size_t i;
  4262. mbedtls_mpi_uint r;
  4263. if( ( X->p[0] & 1 ) == 0 )
  4264. return( MBEDTLS_ERR_MPI_NOT_ACCEPTABLE );
  4265. for( i = 0; small_prime[i] > 0; i++ )
  4266. {
  4267. if( mbedtls_mpi_cmp_int( X, small_prime[i] ) <= 0 )
  4268. return( 1 );
  4269. MBEDTLS_MPI_CHK( mbedtls_mpi_mod_int( &r, X, small_prime[i] ) );
  4270. if( r == 0 )
  4271. return( MBEDTLS_ERR_MPI_NOT_ACCEPTABLE );
  4272. }
  4273. cleanup:
  4274. return( ret );
  4275. }
  4276. /*
  4277. * Miller-Rabin pseudo-primality test (HAC 4.24)
  4278. */
  4279. static int mpi_miller_rabin( const mbedtls_mpi *X,
  4280. int (*f_rng)(void *, unsigned char *, size_t),
  4281. void *p_rng )
  4282. {
  4283. int ret, count;
  4284. size_t i, j, k, n, s;
  4285. mbedtls_mpi W, R, T, A, RR;
  4286. mbedtls_mpi_init( &W ); mbedtls_mpi_init( &R ); mbedtls_mpi_init( &T ); mbedtls_mpi_init( &A );
  4287. mbedtls_mpi_init( &RR );
  4288. /*
  4289. * W = |X| - 1
  4290. * R = W >> lsb( W )
  4291. */
  4292. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &W, X, 1 ) );
  4293. s = mbedtls_mpi_lsb( &W );
  4294. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &R, &W ) );
  4295. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &R, s ) );
  4296. i = mbedtls_mpi_bitlen( X );
  4297. /*
  4298. * HAC, table 4.4
  4299. */
  4300. n = ( ( i >= 1300 ) ? 2 : ( i >= 850 ) ? 3 :
  4301. ( i >= 650 ) ? 4 : ( i >= 350 ) ? 8 :
  4302. ( i >= 250 ) ? 12 : ( i >= 150 ) ? 18 : 27 );
  4303. for( i = 0; i < n; i++ )
  4304. {
  4305. /*
  4306. * pick a random A, 1 < A < |X| - 1
  4307. */
  4308. MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &A, X->n * ciL, f_rng, p_rng ) );
  4309. if( mbedtls_mpi_cmp_mpi( &A, &W ) >= 0 )
  4310. {
  4311. j = mbedtls_mpi_bitlen( &A ) - mbedtls_mpi_bitlen( &W );
  4312. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &A, j + 1 ) );
  4313. }
  4314. A.p[0] |= 3;
  4315. count = 0;
  4316. do {
  4317. MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &A, X->n * ciL, f_rng, p_rng ) );
  4318. j = mbedtls_mpi_bitlen( &A );
  4319. k = mbedtls_mpi_bitlen( &W );
  4320. if (j > k) {
  4321. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &A, j - k ) );
  4322. }
  4323. if (count++ > 30) {
  4324. return MBEDTLS_ERR_MPI_NOT_ACCEPTABLE;
  4325. }
  4326. } while ( mbedtls_mpi_cmp_mpi( &A, &W ) >= 0 ||
  4327. mbedtls_mpi_cmp_int( &A, 1 ) <= 0 );
  4328. /*
  4329. * A = A^R mod |X|
  4330. */
  4331. MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &A, &A, &R, X, &RR ) );
  4332. if( mbedtls_mpi_cmp_mpi( &A, &W ) == 0 ||
  4333. mbedtls_mpi_cmp_int( &A, 1 ) == 0 )
  4334. continue;
  4335. j = 1;
  4336. while( j < s && mbedtls_mpi_cmp_mpi( &A, &W ) != 0 )
  4337. {
  4338. /*
  4339. * A = A * A mod |X|
  4340. */
  4341. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T, &A, &A ) );
  4342. MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &A, &T, X ) );
  4343. if( mbedtls_mpi_cmp_int( &A, 1 ) == 0 )
  4344. break;
  4345. j++;
  4346. }
  4347. /*
  4348. * not prime if A != |X| - 1 or A == 1
  4349. */
  4350. if( mbedtls_mpi_cmp_mpi( &A, &W ) != 0 ||
  4351. mbedtls_mpi_cmp_int( &A, 1 ) == 0 )
  4352. {
  4353. ret = MBEDTLS_ERR_MPI_NOT_ACCEPTABLE;
  4354. break;
  4355. }
  4356. }
  4357. cleanup:
  4358. mbedtls_mpi_free( &W ); mbedtls_mpi_free( &R ); mbedtls_mpi_free( &T ); mbedtls_mpi_free( &A );
  4359. mbedtls_mpi_free( &RR );
  4360. return( ret );
  4361. }
  4362. /*
  4363. * Pseudo-primality test: small factors, then Miller-Rabin
  4364. */
  4365. int mbedtls_mpi_is_prime( const mbedtls_mpi *X,
  4366. int (*f_rng)(void *, unsigned char *, size_t),
  4367. void *p_rng )
  4368. {
  4369. int ret;
  4370. mbedtls_mpi XX;
  4371. XX.s = 1;
  4372. XX.n = X->n;
  4373. XX.p = X->p;
  4374. if( mbedtls_mpi_cmp_int( &XX, 0 ) == 0 ||
  4375. mbedtls_mpi_cmp_int( &XX, 1 ) == 0 )
  4376. return( MBEDTLS_ERR_MPI_NOT_ACCEPTABLE );
  4377. if( mbedtls_mpi_cmp_int( &XX, 2 ) == 0 )
  4378. return( 0 );
  4379. if( ( ret = mpi_check_small_factors( &XX ) ) != 0 )
  4380. {
  4381. if( ret == 1 )
  4382. return( 0 );
  4383. return( ret );
  4384. }
  4385. return( mpi_miller_rabin( &XX, f_rng, p_rng ) );
  4386. }
  4387. /*
  4388. * Prime number generation
  4389. */
  4390. int mbedtls_mpi_gen_prime( mbedtls_mpi *X, size_t nbits, int dh_flag,
  4391. int (*f_rng)(void *, unsigned char *, size_t),
  4392. void *p_rng )
  4393. {
  4394. int ret;
  4395. size_t k, n;
  4396. mbedtls_mpi_uint r;
  4397. mbedtls_mpi Y;
  4398. if( nbits < 3 || nbits > MBEDTLS_MPI_MAX_BITS )
  4399. return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA );
  4400. mbedtls_mpi_init( &Y );
  4401. n = BITS_TO_LIMBS( nbits );
  4402. MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( X, n * ciL, f_rng, p_rng ) );
  4403. k = mbedtls_mpi_bitlen( X );
  4404. if( k > nbits ) MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( X, k - nbits + 1 ) );
  4405. mbedtls_mpi_set_bit( X, nbits-1, 1 );
  4406. X->p[0] |= 1;
  4407. if( dh_flag == 0 )
  4408. {
  4409. while( ( ret = mbedtls_mpi_is_prime( X, f_rng, p_rng ) ) != 0 )
  4410. {
  4411. if( ret != MBEDTLS_ERR_MPI_NOT_ACCEPTABLE )
  4412. goto cleanup;
  4413. MBEDTLS_MPI_CHK( mbedtls_mpi_add_int( X, X, 2 ) );
  4414. }
  4415. }
  4416. else
  4417. {
  4418. /*
  4419. * An necessary condition for Y and X = 2Y + 1 to be prime
  4420. * is X = 2 mod 3 (which is equivalent to Y = 2 mod 3).
  4421. * Make sure it is satisfied, while keeping X = 3 mod 4
  4422. */
  4423. X->p[0] |= 2;
  4424. MBEDTLS_MPI_CHK( mbedtls_mpi_mod_int( &r, X, 3 ) );
  4425. if( r == 0 )
  4426. MBEDTLS_MPI_CHK( mbedtls_mpi_add_int( X, X, 8 ) );
  4427. else if( r == 1 )
  4428. MBEDTLS_MPI_CHK( mbedtls_mpi_add_int( X, X, 4 ) );
  4429. /* Set Y = (X-1) / 2, which is X / 2 because X is odd */
  4430. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &Y, X ) );
  4431. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &Y, 1 ) );
  4432. while( 1 )
  4433. {
  4434. /*
  4435. * First, check small factors for X and Y
  4436. * before doing Miller-Rabin on any of them
  4437. */
  4438. if( ( ret = mpi_check_small_factors( X ) ) == 0 &&
  4439. ( ret = mpi_check_small_factors( &Y ) ) == 0 &&
  4440. ( ret = mpi_miller_rabin( X, f_rng, p_rng ) ) == 0 &&
  4441. ( ret = mpi_miller_rabin( &Y, f_rng, p_rng ) ) == 0 )
  4442. {
  4443. break;
  4444. }
  4445. if( ret != MBEDTLS_ERR_MPI_NOT_ACCEPTABLE )
  4446. goto cleanup;
  4447. /*
  4448. * Next candidates. We want to preserve Y = (X-1) / 2 and
  4449. * Y = 1 mod 2 and Y = 2 mod 3 (eq X = 3 mod 4 and X = 2 mod 3)
  4450. * so up Y by 6 and X by 12.
  4451. */
  4452. MBEDTLS_MPI_CHK( mbedtls_mpi_add_int( X, X, 12 ) );
  4453. MBEDTLS_MPI_CHK( mbedtls_mpi_add_int( &Y, &Y, 6 ) );
  4454. }
  4455. }
  4456. cleanup:
  4457. mbedtls_mpi_free( &Y );
  4458. return( ret );
  4459. }
  4460. #endif /* MBEDTLS_GENPRIME */
  4461. #if defined(MBEDTLS_SELF_TEST)
  4462. #define GCD_PAIR_COUNT 3
  4463. static const int gcd_pairs[GCD_PAIR_COUNT][3] =
  4464. {
  4465. { 693, 609, 21 },
  4466. { 1764, 868, 28 },
  4467. { 768454923, 542167814, 1 }
  4468. };
  4469. /*
  4470. * Checkup routine
  4471. */
  4472. int mbedtls_mpi_self_test( int verbose )
  4473. {
  4474. int ret, i;
  4475. mbedtls_mpi A, E, N, X, Y, U, V;
  4476. mbedtls_mpi_init( &A ); mbedtls_mpi_init( &E ); mbedtls_mpi_init( &N ); mbedtls_mpi_init( &X );
  4477. mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &U ); mbedtls_mpi_init( &V );
  4478. MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &A, 16,
  4479. "EFE021C2645FD1DC586E69184AF4A31E" \
  4480. "D5F53E93B5F123FA41680867BA110131" \
  4481. "944FE7952E2517337780CB0DB80E61AA" \
  4482. "E7C8DDC6C5C6AADEB34EB38A2F40D5E6" ) );
  4483. MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &E, 16,
  4484. "B2E7EFD37075B9F03FF989C7C5051C20" \
  4485. "34D2A323810251127E7BF8625A4F49A5" \
  4486. "F3E27F4DA8BD59C47D6DAABA4C8127BD" \
  4487. "5B5C25763222FEFCCFC38B832366C29E" ) );
  4488. MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &N, 16,
  4489. "0066A198186C18C10B2F5ED9B522752A" \
  4490. "9830B69916E535C8F047518A889A43A5" \
  4491. "94B6BED27A168D31D4A52F88925AA8F5" ) );
  4492. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &X, &A, &N ) );
  4493. MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &U, 16,
  4494. "602AB7ECA597A3D6B56FF9829A5E8B85" \
  4495. "9E857EA95A03512E2BAE7391688D264A" \
  4496. "A5663B0341DB9CCFD2C4C5F421FEC814" \
  4497. "8001B72E848A38CAE1C65F78E56ABDEF" \
  4498. "E12D3C039B8A02D6BE593F0BBBDA56F1" \
  4499. "ECF677152EF804370C1A305CAF3B5BF1" \
  4500. "30879B56C61DE584A0F53A2447A51E" ) );
  4501. if( verbose != 0 )
  4502. mbedtls_printf( " MPI test #1 (mul_mpi): " );
  4503. if( mbedtls_mpi_cmp_mpi( &X, &U ) != 0 )
  4504. {
  4505. if( verbose != 0 )
  4506. mbedtls_printf( "failed\n" );
  4507. ret = 1;
  4508. goto cleanup;
  4509. }
  4510. if( verbose != 0 )
  4511. mbedtls_printf( "passed\n" );
  4512. MBEDTLS_MPI_CHK( mbedtls_mpi_div_mpi( &X, &Y, &A, &N ) );
  4513. MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &U, 16,
  4514. "256567336059E52CAE22925474705F39A94" ) );
  4515. MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &V, 16,
  4516. "6613F26162223DF488E9CD48CC132C7A" \
  4517. "0AC93C701B001B092E4E5B9F73BCD27B" \
  4518. "9EE50D0657C77F374E903CDFA4C642" ) );
  4519. if( verbose != 0 )
  4520. mbedtls_printf( " MPI test #2 (div_mpi): " );
  4521. if( mbedtls_mpi_cmp_mpi( &X, &U ) != 0 ||
  4522. mbedtls_mpi_cmp_mpi( &Y, &V ) != 0 )
  4523. {
  4524. if( verbose != 0 )
  4525. mbedtls_printf( "failed\n" );
  4526. ret = 1;
  4527. goto cleanup;
  4528. }
  4529. if( verbose != 0 )
  4530. mbedtls_printf( "passed\n" );
  4531. MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &X, &A, &E, &N, NULL ) );
  4532. MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &U, 16,
  4533. "36E139AEA55215609D2816998ED020BB" \
  4534. "BD96C37890F65171D948E9BC7CBAA4D9" \
  4535. "325D24D6A3C12710F10A09FA08AB87" ) );
  4536. if( verbose != 0 )
  4537. mbedtls_printf( " MPI test #3 (exp_mod): " );
  4538. if( mbedtls_mpi_cmp_mpi( &X, &U ) != 0 )
  4539. {
  4540. if( verbose != 0 )
  4541. mbedtls_printf( "failed\n" );
  4542. ret = 1;
  4543. goto cleanup;
  4544. }
  4545. if( verbose != 0 )
  4546. mbedtls_printf( "passed\n" );
  4547. MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( &X, &A, &N ) );
  4548. MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &U, 16,
  4549. "003A0AAEDD7E784FC07D8F9EC6E3BFD5" \
  4550. "C3DBA76456363A10869622EAC2DD84EC" \
  4551. "C5B8A74DAC4D09E03B5E0BE779F2DF61" ) );
  4552. if( verbose != 0 )
  4553. mbedtls_printf( " MPI test #4 (inv_mod): " );
  4554. if( mbedtls_mpi_cmp_mpi( &X, &U ) != 0 )
  4555. {
  4556. if( verbose != 0 )
  4557. mbedtls_printf( "failed\n" );
  4558. ret = 1;
  4559. goto cleanup;
  4560. }
  4561. if( verbose != 0 )
  4562. mbedtls_printf( "passed\n" );
  4563. if( verbose != 0 )
  4564. mbedtls_printf( " MPI test #5 (simple gcd): " );
  4565. for( i = 0; i < GCD_PAIR_COUNT; i++ )
  4566. {
  4567. MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &X, gcd_pairs[i][0] ) );
  4568. MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &Y, gcd_pairs[i][1] ) );
  4569. MBEDTLS_MPI_CHK( mbedtls_mpi_gcd( &A, &X, &Y ) );
  4570. if( mbedtls_mpi_cmp_int( &A, gcd_pairs[i][2] ) != 0 )
  4571. {
  4572. if( verbose != 0 )
  4573. mbedtls_printf( "failed at %d\n", i );
  4574. ret = 1;
  4575. goto cleanup;
  4576. }
  4577. }
  4578. if( verbose != 0 )
  4579. mbedtls_printf( "passed\n" );
  4580. cleanup:
  4581. if( ret != 0 && verbose != 0 )
  4582. mbedtls_printf( "Unexpected error, return code = %08X\n", ret );
  4583. mbedtls_mpi_free( &A ); mbedtls_mpi_free( &E ); mbedtls_mpi_free( &N ); mbedtls_mpi_free( &X );
  4584. mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &U ); mbedtls_mpi_free( &V );
  4585. if( verbose != 0 )
  4586. mbedtls_printf( "\n" );
  4587. return( ret );
  4588. }
  4589. #endif /* MBEDTLS_SELF_TEST */
  4590. #endif /* MBEDTLS_BIGNUM_C */
  4591. /********* Start of file library/blowfish.c ************/
  4592. /*
  4593. * Blowfish implementation
  4594. *
  4595. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  4596. * SPDX-License-Identifier: Apache-2.0
  4597. *
  4598. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  4599. * not use this file except in compliance with the License.
  4600. * You may obtain a copy of the License at
  4601. *
  4602. * http://www.apache.org/licenses/LICENSE-2.0
  4603. *
  4604. * Unless required by applicable law or agreed to in writing, software
  4605. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  4606. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  4607. * See the License for the specific language governing permissions and
  4608. * limitations under the License.
  4609. *
  4610. * This file is part of mbed TLS (https://tls.mbed.org)
  4611. */
  4612. /*
  4613. * The Blowfish block cipher was designed by Bruce Schneier in 1993.
  4614. * http://www.schneier.com/blowfish.html
  4615. * http://en.wikipedia.org/wiki/Blowfish_%28cipher%29
  4616. *
  4617. */
  4618. #if !defined(MBEDTLS_CONFIG_FILE)
  4619. #else
  4620. #endif
  4621. #if defined(MBEDTLS_BLOWFISH_C)
  4622. #include <string.h>
  4623. #if !defined(MBEDTLS_BLOWFISH_ALT)
  4624. /* Implementation that should never be optimized out by the compiler */
  4625. static void blowfish_zeroize( void *v, size_t n ) {
  4626. volatile unsigned char *p = v; while( n-- ) *p++ = 0;
  4627. }
  4628. /*
  4629. * 32-bit integer manipulation macros (big endian)
  4630. */
  4631. #ifndef GET_UINT32_BE
  4632. #define GET_UINT32_BE(n,b,i) \
  4633. { \
  4634. (n) = ( (uint32_t) (b)[(i) ] << 24 ) \
  4635. | ( (uint32_t) (b)[(i) + 1] << 16 ) \
  4636. | ( (uint32_t) (b)[(i) + 2] << 8 ) \
  4637. | ( (uint32_t) (b)[(i) + 3] ); \
  4638. }
  4639. #endif
  4640. #ifndef PUT_UINT32_BE
  4641. #define PUT_UINT32_BE(n,b,i) \
  4642. { \
  4643. (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
  4644. (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \
  4645. (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \
  4646. (b)[(i) + 3] = (unsigned char) ( (n) ); \
  4647. }
  4648. #endif
  4649. static const uint32_t P[MBEDTLS_BLOWFISH_ROUNDS + 2] = {
  4650. 0x243F6A88L, 0x85A308D3L, 0x13198A2EL, 0x03707344L,
  4651. 0xA4093822L, 0x299F31D0L, 0x082EFA98L, 0xEC4E6C89L,
  4652. 0x452821E6L, 0x38D01377L, 0xBE5466CFL, 0x34E90C6CL,
  4653. 0xC0AC29B7L, 0xC97C50DDL, 0x3F84D5B5L, 0xB5470917L,
  4654. 0x9216D5D9L, 0x8979FB1BL
  4655. };
  4656. /* declarations of data at the end of this file */
  4657. static const uint32_t S[4][256];
  4658. static uint32_t F( mbedtls_blowfish_context *ctx, uint32_t x )
  4659. {
  4660. unsigned short a, b, c, d;
  4661. uint32_t y;
  4662. d = (unsigned short)(x & 0xFF);
  4663. x >>= 8;
  4664. c = (unsigned short)(x & 0xFF);
  4665. x >>= 8;
  4666. b = (unsigned short)(x & 0xFF);
  4667. x >>= 8;
  4668. a = (unsigned short)(x & 0xFF);
  4669. y = ctx->S[0][a] + ctx->S[1][b];
  4670. y = y ^ ctx->S[2][c];
  4671. y = y + ctx->S[3][d];
  4672. return( y );
  4673. }
  4674. static void blowfish_enc( mbedtls_blowfish_context *ctx, uint32_t *xl, uint32_t *xr )
  4675. {
  4676. uint32_t Xl, Xr, temp;
  4677. short i;
  4678. Xl = *xl;
  4679. Xr = *xr;
  4680. for( i = 0; i < MBEDTLS_BLOWFISH_ROUNDS; ++i )
  4681. {
  4682. Xl = Xl ^ ctx->P[i];
  4683. Xr = F( ctx, Xl ) ^ Xr;
  4684. temp = Xl;
  4685. Xl = Xr;
  4686. Xr = temp;
  4687. }
  4688. temp = Xl;
  4689. Xl = Xr;
  4690. Xr = temp;
  4691. Xr = Xr ^ ctx->P[MBEDTLS_BLOWFISH_ROUNDS];
  4692. Xl = Xl ^ ctx->P[MBEDTLS_BLOWFISH_ROUNDS + 1];
  4693. *xl = Xl;
  4694. *xr = Xr;
  4695. }
  4696. static void blowfish_dec( mbedtls_blowfish_context *ctx, uint32_t *xl, uint32_t *xr )
  4697. {
  4698. uint32_t Xl, Xr, temp;
  4699. short i;
  4700. Xl = *xl;
  4701. Xr = *xr;
  4702. for( i = MBEDTLS_BLOWFISH_ROUNDS + 1; i > 1; --i )
  4703. {
  4704. Xl = Xl ^ ctx->P[i];
  4705. Xr = F( ctx, Xl ) ^ Xr;
  4706. temp = Xl;
  4707. Xl = Xr;
  4708. Xr = temp;
  4709. }
  4710. temp = Xl;
  4711. Xl = Xr;
  4712. Xr = temp;
  4713. Xr = Xr ^ ctx->P[1];
  4714. Xl = Xl ^ ctx->P[0];
  4715. *xl = Xl;
  4716. *xr = Xr;
  4717. }
  4718. void mbedtls_blowfish_init( mbedtls_blowfish_context *ctx )
  4719. {
  4720. memset( ctx, 0, sizeof( mbedtls_blowfish_context ) );
  4721. }
  4722. void mbedtls_blowfish_free( mbedtls_blowfish_context *ctx )
  4723. {
  4724. if( ctx == NULL )
  4725. return;
  4726. blowfish_zeroize( ctx, sizeof( mbedtls_blowfish_context ) );
  4727. }
  4728. /*
  4729. * Blowfish key schedule
  4730. */
  4731. int mbedtls_blowfish_setkey( mbedtls_blowfish_context *ctx, const unsigned char *key,
  4732. unsigned int keybits )
  4733. {
  4734. unsigned int i, j, k;
  4735. uint32_t data, datal, datar;
  4736. if( keybits < MBEDTLS_BLOWFISH_MIN_KEY_BITS || keybits > MBEDTLS_BLOWFISH_MAX_KEY_BITS ||
  4737. ( keybits % 8 ) )
  4738. {
  4739. return( MBEDTLS_ERR_BLOWFISH_INVALID_KEY_LENGTH );
  4740. }
  4741. keybits >>= 3;
  4742. for( i = 0; i < 4; i++ )
  4743. {
  4744. for( j = 0; j < 256; j++ )
  4745. ctx->S[i][j] = S[i][j];
  4746. }
  4747. j = 0;
  4748. for( i = 0; i < MBEDTLS_BLOWFISH_ROUNDS + 2; ++i )
  4749. {
  4750. data = 0x00000000;
  4751. for( k = 0; k < 4; ++k )
  4752. {
  4753. data = ( data << 8 ) | key[j++];
  4754. if( j >= keybits )
  4755. j = 0;
  4756. }
  4757. ctx->P[i] = P[i] ^ data;
  4758. }
  4759. datal = 0x00000000;
  4760. datar = 0x00000000;
  4761. for( i = 0; i < MBEDTLS_BLOWFISH_ROUNDS + 2; i += 2 )
  4762. {
  4763. blowfish_enc( ctx, &datal, &datar );
  4764. ctx->P[i] = datal;
  4765. ctx->P[i + 1] = datar;
  4766. }
  4767. for( i = 0; i < 4; i++ )
  4768. {
  4769. for( j = 0; j < 256; j += 2 )
  4770. {
  4771. blowfish_enc( ctx, &datal, &datar );
  4772. ctx->S[i][j] = datal;
  4773. ctx->S[i][j + 1] = datar;
  4774. }
  4775. }
  4776. return( 0 );
  4777. }
  4778. /*
  4779. * Blowfish-ECB block encryption/decryption
  4780. */
  4781. int mbedtls_blowfish_crypt_ecb( mbedtls_blowfish_context *ctx,
  4782. int mode,
  4783. const unsigned char input[MBEDTLS_BLOWFISH_BLOCKSIZE],
  4784. unsigned char output[MBEDTLS_BLOWFISH_BLOCKSIZE] )
  4785. {
  4786. uint32_t X0, X1;
  4787. GET_UINT32_BE( X0, input, 0 );
  4788. GET_UINT32_BE( X1, input, 4 );
  4789. if( mode == MBEDTLS_BLOWFISH_DECRYPT )
  4790. {
  4791. blowfish_dec( ctx, &X0, &X1 );
  4792. }
  4793. else /* MBEDTLS_BLOWFISH_ENCRYPT */
  4794. {
  4795. blowfish_enc( ctx, &X0, &X1 );
  4796. }
  4797. PUT_UINT32_BE( X0, output, 0 );
  4798. PUT_UINT32_BE( X1, output, 4 );
  4799. return( 0 );
  4800. }
  4801. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  4802. /*
  4803. * Blowfish-CBC buffer encryption/decryption
  4804. */
  4805. int mbedtls_blowfish_crypt_cbc( mbedtls_blowfish_context *ctx,
  4806. int mode,
  4807. size_t length,
  4808. unsigned char iv[MBEDTLS_BLOWFISH_BLOCKSIZE],
  4809. const unsigned char *input,
  4810. unsigned char *output )
  4811. {
  4812. int i;
  4813. unsigned char temp[MBEDTLS_BLOWFISH_BLOCKSIZE];
  4814. if( length % MBEDTLS_BLOWFISH_BLOCKSIZE )
  4815. return( MBEDTLS_ERR_BLOWFISH_INVALID_INPUT_LENGTH );
  4816. if( mode == MBEDTLS_BLOWFISH_DECRYPT )
  4817. {
  4818. while( length > 0 )
  4819. {
  4820. memcpy( temp, input, MBEDTLS_BLOWFISH_BLOCKSIZE );
  4821. mbedtls_blowfish_crypt_ecb( ctx, mode, input, output );
  4822. for( i = 0; i < MBEDTLS_BLOWFISH_BLOCKSIZE;i++ )
  4823. output[i] = (unsigned char)( output[i] ^ iv[i] );
  4824. memcpy( iv, temp, MBEDTLS_BLOWFISH_BLOCKSIZE );
  4825. input += MBEDTLS_BLOWFISH_BLOCKSIZE;
  4826. output += MBEDTLS_BLOWFISH_BLOCKSIZE;
  4827. length -= MBEDTLS_BLOWFISH_BLOCKSIZE;
  4828. }
  4829. }
  4830. else
  4831. {
  4832. while( length > 0 )
  4833. {
  4834. for( i = 0; i < MBEDTLS_BLOWFISH_BLOCKSIZE; i++ )
  4835. output[i] = (unsigned char)( input[i] ^ iv[i] );
  4836. mbedtls_blowfish_crypt_ecb( ctx, mode, output, output );
  4837. memcpy( iv, output, MBEDTLS_BLOWFISH_BLOCKSIZE );
  4838. input += MBEDTLS_BLOWFISH_BLOCKSIZE;
  4839. output += MBEDTLS_BLOWFISH_BLOCKSIZE;
  4840. length -= MBEDTLS_BLOWFISH_BLOCKSIZE;
  4841. }
  4842. }
  4843. return( 0 );
  4844. }
  4845. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  4846. #if defined(MBEDTLS_CIPHER_MODE_CFB)
  4847. /*
  4848. * Blowfish CFB buffer encryption/decryption
  4849. */
  4850. int mbedtls_blowfish_crypt_cfb64( mbedtls_blowfish_context *ctx,
  4851. int mode,
  4852. size_t length,
  4853. size_t *iv_off,
  4854. unsigned char iv[MBEDTLS_BLOWFISH_BLOCKSIZE],
  4855. const unsigned char *input,
  4856. unsigned char *output )
  4857. {
  4858. int c;
  4859. size_t n = *iv_off;
  4860. if( mode == MBEDTLS_BLOWFISH_DECRYPT )
  4861. {
  4862. while( length-- )
  4863. {
  4864. if( n == 0 )
  4865. mbedtls_blowfish_crypt_ecb( ctx, MBEDTLS_BLOWFISH_ENCRYPT, iv, iv );
  4866. c = *input++;
  4867. *output++ = (unsigned char)( c ^ iv[n] );
  4868. iv[n] = (unsigned char) c;
  4869. n = ( n + 1 ) % MBEDTLS_BLOWFISH_BLOCKSIZE;
  4870. }
  4871. }
  4872. else
  4873. {
  4874. while( length-- )
  4875. {
  4876. if( n == 0 )
  4877. mbedtls_blowfish_crypt_ecb( ctx, MBEDTLS_BLOWFISH_ENCRYPT, iv, iv );
  4878. iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
  4879. n = ( n + 1 ) % MBEDTLS_BLOWFISH_BLOCKSIZE;
  4880. }
  4881. }
  4882. *iv_off = n;
  4883. return( 0 );
  4884. }
  4885. #endif /*MBEDTLS_CIPHER_MODE_CFB */
  4886. #if defined(MBEDTLS_CIPHER_MODE_CTR)
  4887. /*
  4888. * Blowfish CTR buffer encryption/decryption
  4889. */
  4890. int mbedtls_blowfish_crypt_ctr( mbedtls_blowfish_context *ctx,
  4891. size_t length,
  4892. size_t *nc_off,
  4893. unsigned char nonce_counter[MBEDTLS_BLOWFISH_BLOCKSIZE],
  4894. unsigned char stream_block[MBEDTLS_BLOWFISH_BLOCKSIZE],
  4895. const unsigned char *input,
  4896. unsigned char *output )
  4897. {
  4898. int c, i;
  4899. size_t n = *nc_off;
  4900. while( length-- )
  4901. {
  4902. if( n == 0 ) {
  4903. mbedtls_blowfish_crypt_ecb( ctx, MBEDTLS_BLOWFISH_ENCRYPT, nonce_counter,
  4904. stream_block );
  4905. for( i = MBEDTLS_BLOWFISH_BLOCKSIZE; i > 0; i-- )
  4906. if( ++nonce_counter[i - 1] != 0 )
  4907. break;
  4908. }
  4909. c = *input++;
  4910. *output++ = (unsigned char)( c ^ stream_block[n] );
  4911. n = ( n + 1 ) % MBEDTLS_BLOWFISH_BLOCKSIZE;
  4912. }
  4913. *nc_off = n;
  4914. return( 0 );
  4915. }
  4916. #endif /* MBEDTLS_CIPHER_MODE_CTR */
  4917. static const uint32_t S[4][256] = {
  4918. { 0xD1310BA6L, 0x98DFB5ACL, 0x2FFD72DBL, 0xD01ADFB7L,
  4919. 0xB8E1AFEDL, 0x6A267E96L, 0xBA7C9045L, 0xF12C7F99L,
  4920. 0x24A19947L, 0xB3916CF7L, 0x0801F2E2L, 0x858EFC16L,
  4921. 0x636920D8L, 0x71574E69L, 0xA458FEA3L, 0xF4933D7EL,
  4922. 0x0D95748FL, 0x728EB658L, 0x718BCD58L, 0x82154AEEL,
  4923. 0x7B54A41DL, 0xC25A59B5L, 0x9C30D539L, 0x2AF26013L,
  4924. 0xC5D1B023L, 0x286085F0L, 0xCA417918L, 0xB8DB38EFL,
  4925. 0x8E79DCB0L, 0x603A180EL, 0x6C9E0E8BL, 0xB01E8A3EL,
  4926. 0xD71577C1L, 0xBD314B27L, 0x78AF2FDAL, 0x55605C60L,
  4927. 0xE65525F3L, 0xAA55AB94L, 0x57489862L, 0x63E81440L,
  4928. 0x55CA396AL, 0x2AAB10B6L, 0xB4CC5C34L, 0x1141E8CEL,
  4929. 0xA15486AFL, 0x7C72E993L, 0xB3EE1411L, 0x636FBC2AL,
  4930. 0x2BA9C55DL, 0x741831F6L, 0xCE5C3E16L, 0x9B87931EL,
  4931. 0xAFD6BA33L, 0x6C24CF5CL, 0x7A325381L, 0x28958677L,
  4932. 0x3B8F4898L, 0x6B4BB9AFL, 0xC4BFE81BL, 0x66282193L,
  4933. 0x61D809CCL, 0xFB21A991L, 0x487CAC60L, 0x5DEC8032L,
  4934. 0xEF845D5DL, 0xE98575B1L, 0xDC262302L, 0xEB651B88L,
  4935. 0x23893E81L, 0xD396ACC5L, 0x0F6D6FF3L, 0x83F44239L,
  4936. 0x2E0B4482L, 0xA4842004L, 0x69C8F04AL, 0x9E1F9B5EL,
  4937. 0x21C66842L, 0xF6E96C9AL, 0x670C9C61L, 0xABD388F0L,
  4938. 0x6A51A0D2L, 0xD8542F68L, 0x960FA728L, 0xAB5133A3L,
  4939. 0x6EEF0B6CL, 0x137A3BE4L, 0xBA3BF050L, 0x7EFB2A98L,
  4940. 0xA1F1651DL, 0x39AF0176L, 0x66CA593EL, 0x82430E88L,
  4941. 0x8CEE8619L, 0x456F9FB4L, 0x7D84A5C3L, 0x3B8B5EBEL,
  4942. 0xE06F75D8L, 0x85C12073L, 0x401A449FL, 0x56C16AA6L,
  4943. 0x4ED3AA62L, 0x363F7706L, 0x1BFEDF72L, 0x429B023DL,
  4944. 0x37D0D724L, 0xD00A1248L, 0xDB0FEAD3L, 0x49F1C09BL,
  4945. 0x075372C9L, 0x80991B7BL, 0x25D479D8L, 0xF6E8DEF7L,
  4946. 0xE3FE501AL, 0xB6794C3BL, 0x976CE0BDL, 0x04C006BAL,
  4947. 0xC1A94FB6L, 0x409F60C4L, 0x5E5C9EC2L, 0x196A2463L,
  4948. 0x68FB6FAFL, 0x3E6C53B5L, 0x1339B2EBL, 0x3B52EC6FL,
  4949. 0x6DFC511FL, 0x9B30952CL, 0xCC814544L, 0xAF5EBD09L,
  4950. 0xBEE3D004L, 0xDE334AFDL, 0x660F2807L, 0x192E4BB3L,
  4951. 0xC0CBA857L, 0x45C8740FL, 0xD20B5F39L, 0xB9D3FBDBL,
  4952. 0x5579C0BDL, 0x1A60320AL, 0xD6A100C6L, 0x402C7279L,
  4953. 0x679F25FEL, 0xFB1FA3CCL, 0x8EA5E9F8L, 0xDB3222F8L,
  4954. 0x3C7516DFL, 0xFD616B15L, 0x2F501EC8L, 0xAD0552ABL,
  4955. 0x323DB5FAL, 0xFD238760L, 0x53317B48L, 0x3E00DF82L,
  4956. 0x9E5C57BBL, 0xCA6F8CA0L, 0x1A87562EL, 0xDF1769DBL,
  4957. 0xD542A8F6L, 0x287EFFC3L, 0xAC6732C6L, 0x8C4F5573L,
  4958. 0x695B27B0L, 0xBBCA58C8L, 0xE1FFA35DL, 0xB8F011A0L,
  4959. 0x10FA3D98L, 0xFD2183B8L, 0x4AFCB56CL, 0x2DD1D35BL,
  4960. 0x9A53E479L, 0xB6F84565L, 0xD28E49BCL, 0x4BFB9790L,
  4961. 0xE1DDF2DAL, 0xA4CB7E33L, 0x62FB1341L, 0xCEE4C6E8L,
  4962. 0xEF20CADAL, 0x36774C01L, 0xD07E9EFEL, 0x2BF11FB4L,
  4963. 0x95DBDA4DL, 0xAE909198L, 0xEAAD8E71L, 0x6B93D5A0L,
  4964. 0xD08ED1D0L, 0xAFC725E0L, 0x8E3C5B2FL, 0x8E7594B7L,
  4965. 0x8FF6E2FBL, 0xF2122B64L, 0x8888B812L, 0x900DF01CL,
  4966. 0x4FAD5EA0L, 0x688FC31CL, 0xD1CFF191L, 0xB3A8C1ADL,
  4967. 0x2F2F2218L, 0xBE0E1777L, 0xEA752DFEL, 0x8B021FA1L,
  4968. 0xE5A0CC0FL, 0xB56F74E8L, 0x18ACF3D6L, 0xCE89E299L,
  4969. 0xB4A84FE0L, 0xFD13E0B7L, 0x7CC43B81L, 0xD2ADA8D9L,
  4970. 0x165FA266L, 0x80957705L, 0x93CC7314L, 0x211A1477L,
  4971. 0xE6AD2065L, 0x77B5FA86L, 0xC75442F5L, 0xFB9D35CFL,
  4972. 0xEBCDAF0CL, 0x7B3E89A0L, 0xD6411BD3L, 0xAE1E7E49L,
  4973. 0x00250E2DL, 0x2071B35EL, 0x226800BBL, 0x57B8E0AFL,
  4974. 0x2464369BL, 0xF009B91EL, 0x5563911DL, 0x59DFA6AAL,
  4975. 0x78C14389L, 0xD95A537FL, 0x207D5BA2L, 0x02E5B9C5L,
  4976. 0x83260376L, 0x6295CFA9L, 0x11C81968L, 0x4E734A41L,
  4977. 0xB3472DCAL, 0x7B14A94AL, 0x1B510052L, 0x9A532915L,
  4978. 0xD60F573FL, 0xBC9BC6E4L, 0x2B60A476L, 0x81E67400L,
  4979. 0x08BA6FB5L, 0x571BE91FL, 0xF296EC6BL, 0x2A0DD915L,
  4980. 0xB6636521L, 0xE7B9F9B6L, 0xFF34052EL, 0xC5855664L,
  4981. 0x53B02D5DL, 0xA99F8FA1L, 0x08BA4799L, 0x6E85076AL },
  4982. { 0x4B7A70E9L, 0xB5B32944L, 0xDB75092EL, 0xC4192623L,
  4983. 0xAD6EA6B0L, 0x49A7DF7DL, 0x9CEE60B8L, 0x8FEDB266L,
  4984. 0xECAA8C71L, 0x699A17FFL, 0x5664526CL, 0xC2B19EE1L,
  4985. 0x193602A5L, 0x75094C29L, 0xA0591340L, 0xE4183A3EL,
  4986. 0x3F54989AL, 0x5B429D65L, 0x6B8FE4D6L, 0x99F73FD6L,
  4987. 0xA1D29C07L, 0xEFE830F5L, 0x4D2D38E6L, 0xF0255DC1L,
  4988. 0x4CDD2086L, 0x8470EB26L, 0x6382E9C6L, 0x021ECC5EL,
  4989. 0x09686B3FL, 0x3EBAEFC9L, 0x3C971814L, 0x6B6A70A1L,
  4990. 0x687F3584L, 0x52A0E286L, 0xB79C5305L, 0xAA500737L,
  4991. 0x3E07841CL, 0x7FDEAE5CL, 0x8E7D44ECL, 0x5716F2B8L,
  4992. 0xB03ADA37L, 0xF0500C0DL, 0xF01C1F04L, 0x0200B3FFL,
  4993. 0xAE0CF51AL, 0x3CB574B2L, 0x25837A58L, 0xDC0921BDL,
  4994. 0xD19113F9L, 0x7CA92FF6L, 0x94324773L, 0x22F54701L,
  4995. 0x3AE5E581L, 0x37C2DADCL, 0xC8B57634L, 0x9AF3DDA7L,
  4996. 0xA9446146L, 0x0FD0030EL, 0xECC8C73EL, 0xA4751E41L,
  4997. 0xE238CD99L, 0x3BEA0E2FL, 0x3280BBA1L, 0x183EB331L,
  4998. 0x4E548B38L, 0x4F6DB908L, 0x6F420D03L, 0xF60A04BFL,
  4999. 0x2CB81290L, 0x24977C79L, 0x5679B072L, 0xBCAF89AFL,
  5000. 0xDE9A771FL, 0xD9930810L, 0xB38BAE12L, 0xDCCF3F2EL,
  5001. 0x5512721FL, 0x2E6B7124L, 0x501ADDE6L, 0x9F84CD87L,
  5002. 0x7A584718L, 0x7408DA17L, 0xBC9F9ABCL, 0xE94B7D8CL,
  5003. 0xEC7AEC3AL, 0xDB851DFAL, 0x63094366L, 0xC464C3D2L,
  5004. 0xEF1C1847L, 0x3215D908L, 0xDD433B37L, 0x24C2BA16L,
  5005. 0x12A14D43L, 0x2A65C451L, 0x50940002L, 0x133AE4DDL,
  5006. 0x71DFF89EL, 0x10314E55L, 0x81AC77D6L, 0x5F11199BL,
  5007. 0x043556F1L, 0xD7A3C76BL, 0x3C11183BL, 0x5924A509L,
  5008. 0xF28FE6EDL, 0x97F1FBFAL, 0x9EBABF2CL, 0x1E153C6EL,
  5009. 0x86E34570L, 0xEAE96FB1L, 0x860E5E0AL, 0x5A3E2AB3L,
  5010. 0x771FE71CL, 0x4E3D06FAL, 0x2965DCB9L, 0x99E71D0FL,
  5011. 0x803E89D6L, 0x5266C825L, 0x2E4CC978L, 0x9C10B36AL,
  5012. 0xC6150EBAL, 0x94E2EA78L, 0xA5FC3C53L, 0x1E0A2DF4L,
  5013. 0xF2F74EA7L, 0x361D2B3DL, 0x1939260FL, 0x19C27960L,
  5014. 0x5223A708L, 0xF71312B6L, 0xEBADFE6EL, 0xEAC31F66L,
  5015. 0xE3BC4595L, 0xA67BC883L, 0xB17F37D1L, 0x018CFF28L,
  5016. 0xC332DDEFL, 0xBE6C5AA5L, 0x65582185L, 0x68AB9802L,
  5017. 0xEECEA50FL, 0xDB2F953BL, 0x2AEF7DADL, 0x5B6E2F84L,
  5018. 0x1521B628L, 0x29076170L, 0xECDD4775L, 0x619F1510L,
  5019. 0x13CCA830L, 0xEB61BD96L, 0x0334FE1EL, 0xAA0363CFL,
  5020. 0xB5735C90L, 0x4C70A239L, 0xD59E9E0BL, 0xCBAADE14L,
  5021. 0xEECC86BCL, 0x60622CA7L, 0x9CAB5CABL, 0xB2F3846EL,
  5022. 0x648B1EAFL, 0x19BDF0CAL, 0xA02369B9L, 0x655ABB50L,
  5023. 0x40685A32L, 0x3C2AB4B3L, 0x319EE9D5L, 0xC021B8F7L,
  5024. 0x9B540B19L, 0x875FA099L, 0x95F7997EL, 0x623D7DA8L,
  5025. 0xF837889AL, 0x97E32D77L, 0x11ED935FL, 0x16681281L,
  5026. 0x0E358829L, 0xC7E61FD6L, 0x96DEDFA1L, 0x7858BA99L,
  5027. 0x57F584A5L, 0x1B227263L, 0x9B83C3FFL, 0x1AC24696L,
  5028. 0xCDB30AEBL, 0x532E3054L, 0x8FD948E4L, 0x6DBC3128L,
  5029. 0x58EBF2EFL, 0x34C6FFEAL, 0xFE28ED61L, 0xEE7C3C73L,
  5030. 0x5D4A14D9L, 0xE864B7E3L, 0x42105D14L, 0x203E13E0L,
  5031. 0x45EEE2B6L, 0xA3AAABEAL, 0xDB6C4F15L, 0xFACB4FD0L,
  5032. 0xC742F442L, 0xEF6ABBB5L, 0x654F3B1DL, 0x41CD2105L,
  5033. 0xD81E799EL, 0x86854DC7L, 0xE44B476AL, 0x3D816250L,
  5034. 0xCF62A1F2L, 0x5B8D2646L, 0xFC8883A0L, 0xC1C7B6A3L,
  5035. 0x7F1524C3L, 0x69CB7492L, 0x47848A0BL, 0x5692B285L,
  5036. 0x095BBF00L, 0xAD19489DL, 0x1462B174L, 0x23820E00L,
  5037. 0x58428D2AL, 0x0C55F5EAL, 0x1DADF43EL, 0x233F7061L,
  5038. 0x3372F092L, 0x8D937E41L, 0xD65FECF1L, 0x6C223BDBL,
  5039. 0x7CDE3759L, 0xCBEE7460L, 0x4085F2A7L, 0xCE77326EL,
  5040. 0xA6078084L, 0x19F8509EL, 0xE8EFD855L, 0x61D99735L,
  5041. 0xA969A7AAL, 0xC50C06C2L, 0x5A04ABFCL, 0x800BCADCL,
  5042. 0x9E447A2EL, 0xC3453484L, 0xFDD56705L, 0x0E1E9EC9L,
  5043. 0xDB73DBD3L, 0x105588CDL, 0x675FDA79L, 0xE3674340L,
  5044. 0xC5C43465L, 0x713E38D8L, 0x3D28F89EL, 0xF16DFF20L,
  5045. 0x153E21E7L, 0x8FB03D4AL, 0xE6E39F2BL, 0xDB83ADF7L },
  5046. { 0xE93D5A68L, 0x948140F7L, 0xF64C261CL, 0x94692934L,
  5047. 0x411520F7L, 0x7602D4F7L, 0xBCF46B2EL, 0xD4A20068L,
  5048. 0xD4082471L, 0x3320F46AL, 0x43B7D4B7L, 0x500061AFL,
  5049. 0x1E39F62EL, 0x97244546L, 0x14214F74L, 0xBF8B8840L,
  5050. 0x4D95FC1DL, 0x96B591AFL, 0x70F4DDD3L, 0x66A02F45L,
  5051. 0xBFBC09ECL, 0x03BD9785L, 0x7FAC6DD0L, 0x31CB8504L,
  5052. 0x96EB27B3L, 0x55FD3941L, 0xDA2547E6L, 0xABCA0A9AL,
  5053. 0x28507825L, 0x530429F4L, 0x0A2C86DAL, 0xE9B66DFBL,
  5054. 0x68DC1462L, 0xD7486900L, 0x680EC0A4L, 0x27A18DEEL,
  5055. 0x4F3FFEA2L, 0xE887AD8CL, 0xB58CE006L, 0x7AF4D6B6L,
  5056. 0xAACE1E7CL, 0xD3375FECL, 0xCE78A399L, 0x406B2A42L,
  5057. 0x20FE9E35L, 0xD9F385B9L, 0xEE39D7ABL, 0x3B124E8BL,
  5058. 0x1DC9FAF7L, 0x4B6D1856L, 0x26A36631L, 0xEAE397B2L,
  5059. 0x3A6EFA74L, 0xDD5B4332L, 0x6841E7F7L, 0xCA7820FBL,
  5060. 0xFB0AF54EL, 0xD8FEB397L, 0x454056ACL, 0xBA489527L,
  5061. 0x55533A3AL, 0x20838D87L, 0xFE6BA9B7L, 0xD096954BL,
  5062. 0x55A867BCL, 0xA1159A58L, 0xCCA92963L, 0x99E1DB33L,
  5063. 0xA62A4A56L, 0x3F3125F9L, 0x5EF47E1CL, 0x9029317CL,
  5064. 0xFDF8E802L, 0x04272F70L, 0x80BB155CL, 0x05282CE3L,
  5065. 0x95C11548L, 0xE4C66D22L, 0x48C1133FL, 0xC70F86DCL,
  5066. 0x07F9C9EEL, 0x41041F0FL, 0x404779A4L, 0x5D886E17L,
  5067. 0x325F51EBL, 0xD59BC0D1L, 0xF2BCC18FL, 0x41113564L,
  5068. 0x257B7834L, 0x602A9C60L, 0xDFF8E8A3L, 0x1F636C1BL,
  5069. 0x0E12B4C2L, 0x02E1329EL, 0xAF664FD1L, 0xCAD18115L,
  5070. 0x6B2395E0L, 0x333E92E1L, 0x3B240B62L, 0xEEBEB922L,
  5071. 0x85B2A20EL, 0xE6BA0D99L, 0xDE720C8CL, 0x2DA2F728L,
  5072. 0xD0127845L, 0x95B794FDL, 0x647D0862L, 0xE7CCF5F0L,
  5073. 0x5449A36FL, 0x877D48FAL, 0xC39DFD27L, 0xF33E8D1EL,
  5074. 0x0A476341L, 0x992EFF74L, 0x3A6F6EABL, 0xF4F8FD37L,
  5075. 0xA812DC60L, 0xA1EBDDF8L, 0x991BE14CL, 0xDB6E6B0DL,
  5076. 0xC67B5510L, 0x6D672C37L, 0x2765D43BL, 0xDCD0E804L,
  5077. 0xF1290DC7L, 0xCC00FFA3L, 0xB5390F92L, 0x690FED0BL,
  5078. 0x667B9FFBL, 0xCEDB7D9CL, 0xA091CF0BL, 0xD9155EA3L,
  5079. 0xBB132F88L, 0x515BAD24L, 0x7B9479BFL, 0x763BD6EBL,
  5080. 0x37392EB3L, 0xCC115979L, 0x8026E297L, 0xF42E312DL,
  5081. 0x6842ADA7L, 0xC66A2B3BL, 0x12754CCCL, 0x782EF11CL,
  5082. 0x6A124237L, 0xB79251E7L, 0x06A1BBE6L, 0x4BFB6350L,
  5083. 0x1A6B1018L, 0x11CAEDFAL, 0x3D25BDD8L, 0xE2E1C3C9L,
  5084. 0x44421659L, 0x0A121386L, 0xD90CEC6EL, 0xD5ABEA2AL,
  5085. 0x64AF674EL, 0xDA86A85FL, 0xBEBFE988L, 0x64E4C3FEL,
  5086. 0x9DBC8057L, 0xF0F7C086L, 0x60787BF8L, 0x6003604DL,
  5087. 0xD1FD8346L, 0xF6381FB0L, 0x7745AE04L, 0xD736FCCCL,
  5088. 0x83426B33L, 0xF01EAB71L, 0xB0804187L, 0x3C005E5FL,
  5089. 0x77A057BEL, 0xBDE8AE24L, 0x55464299L, 0xBF582E61L,
  5090. 0x4E58F48FL, 0xF2DDFDA2L, 0xF474EF38L, 0x8789BDC2L,
  5091. 0x5366F9C3L, 0xC8B38E74L, 0xB475F255L, 0x46FCD9B9L,
  5092. 0x7AEB2661L, 0x8B1DDF84L, 0x846A0E79L, 0x915F95E2L,
  5093. 0x466E598EL, 0x20B45770L, 0x8CD55591L, 0xC902DE4CL,
  5094. 0xB90BACE1L, 0xBB8205D0L, 0x11A86248L, 0x7574A99EL,
  5095. 0xB77F19B6L, 0xE0A9DC09L, 0x662D09A1L, 0xC4324633L,
  5096. 0xE85A1F02L, 0x09F0BE8CL, 0x4A99A025L, 0x1D6EFE10L,
  5097. 0x1AB93D1DL, 0x0BA5A4DFL, 0xA186F20FL, 0x2868F169L,
  5098. 0xDCB7DA83L, 0x573906FEL, 0xA1E2CE9BL, 0x4FCD7F52L,
  5099. 0x50115E01L, 0xA70683FAL, 0xA002B5C4L, 0x0DE6D027L,
  5100. 0x9AF88C27L, 0x773F8641L, 0xC3604C06L, 0x61A806B5L,
  5101. 0xF0177A28L, 0xC0F586E0L, 0x006058AAL, 0x30DC7D62L,
  5102. 0x11E69ED7L, 0x2338EA63L, 0x53C2DD94L, 0xC2C21634L,
  5103. 0xBBCBEE56L, 0x90BCB6DEL, 0xEBFC7DA1L, 0xCE591D76L,
  5104. 0x6F05E409L, 0x4B7C0188L, 0x39720A3DL, 0x7C927C24L,
  5105. 0x86E3725FL, 0x724D9DB9L, 0x1AC15BB4L, 0xD39EB8FCL,
  5106. 0xED545578L, 0x08FCA5B5L, 0xD83D7CD3L, 0x4DAD0FC4L,
  5107. 0x1E50EF5EL, 0xB161E6F8L, 0xA28514D9L, 0x6C51133CL,
  5108. 0x6FD5C7E7L, 0x56E14EC4L, 0x362ABFCEL, 0xDDC6C837L,
  5109. 0xD79A3234L, 0x92638212L, 0x670EFA8EL, 0x406000E0L },
  5110. { 0x3A39CE37L, 0xD3FAF5CFL, 0xABC27737L, 0x5AC52D1BL,
  5111. 0x5CB0679EL, 0x4FA33742L, 0xD3822740L, 0x99BC9BBEL,
  5112. 0xD5118E9DL, 0xBF0F7315L, 0xD62D1C7EL, 0xC700C47BL,
  5113. 0xB78C1B6BL, 0x21A19045L, 0xB26EB1BEL, 0x6A366EB4L,
  5114. 0x5748AB2FL, 0xBC946E79L, 0xC6A376D2L, 0x6549C2C8L,
  5115. 0x530FF8EEL, 0x468DDE7DL, 0xD5730A1DL, 0x4CD04DC6L,
  5116. 0x2939BBDBL, 0xA9BA4650L, 0xAC9526E8L, 0xBE5EE304L,
  5117. 0xA1FAD5F0L, 0x6A2D519AL, 0x63EF8CE2L, 0x9A86EE22L,
  5118. 0xC089C2B8L, 0x43242EF6L, 0xA51E03AAL, 0x9CF2D0A4L,
  5119. 0x83C061BAL, 0x9BE96A4DL, 0x8FE51550L, 0xBA645BD6L,
  5120. 0x2826A2F9L, 0xA73A3AE1L, 0x4BA99586L, 0xEF5562E9L,
  5121. 0xC72FEFD3L, 0xF752F7DAL, 0x3F046F69L, 0x77FA0A59L,
  5122. 0x80E4A915L, 0x87B08601L, 0x9B09E6ADL, 0x3B3EE593L,
  5123. 0xE990FD5AL, 0x9E34D797L, 0x2CF0B7D9L, 0x022B8B51L,
  5124. 0x96D5AC3AL, 0x017DA67DL, 0xD1CF3ED6L, 0x7C7D2D28L,
  5125. 0x1F9F25CFL, 0xADF2B89BL, 0x5AD6B472L, 0x5A88F54CL,
  5126. 0xE029AC71L, 0xE019A5E6L, 0x47B0ACFDL, 0xED93FA9BL,
  5127. 0xE8D3C48DL, 0x283B57CCL, 0xF8D56629L, 0x79132E28L,
  5128. 0x785F0191L, 0xED756055L, 0xF7960E44L, 0xE3D35E8CL,
  5129. 0x15056DD4L, 0x88F46DBAL, 0x03A16125L, 0x0564F0BDL,
  5130. 0xC3EB9E15L, 0x3C9057A2L, 0x97271AECL, 0xA93A072AL,
  5131. 0x1B3F6D9BL, 0x1E6321F5L, 0xF59C66FBL, 0x26DCF319L,
  5132. 0x7533D928L, 0xB155FDF5L, 0x03563482L, 0x8ABA3CBBL,
  5133. 0x28517711L, 0xC20AD9F8L, 0xABCC5167L, 0xCCAD925FL,
  5134. 0x4DE81751L, 0x3830DC8EL, 0x379D5862L, 0x9320F991L,
  5135. 0xEA7A90C2L, 0xFB3E7BCEL, 0x5121CE64L, 0x774FBE32L,
  5136. 0xA8B6E37EL, 0xC3293D46L, 0x48DE5369L, 0x6413E680L,
  5137. 0xA2AE0810L, 0xDD6DB224L, 0x69852DFDL, 0x09072166L,
  5138. 0xB39A460AL, 0x6445C0DDL, 0x586CDECFL, 0x1C20C8AEL,
  5139. 0x5BBEF7DDL, 0x1B588D40L, 0xCCD2017FL, 0x6BB4E3BBL,
  5140. 0xDDA26A7EL, 0x3A59FF45L, 0x3E350A44L, 0xBCB4CDD5L,
  5141. 0x72EACEA8L, 0xFA6484BBL, 0x8D6612AEL, 0xBF3C6F47L,
  5142. 0xD29BE463L, 0x542F5D9EL, 0xAEC2771BL, 0xF64E6370L,
  5143. 0x740E0D8DL, 0xE75B1357L, 0xF8721671L, 0xAF537D5DL,
  5144. 0x4040CB08L, 0x4EB4E2CCL, 0x34D2466AL, 0x0115AF84L,
  5145. 0xE1B00428L, 0x95983A1DL, 0x06B89FB4L, 0xCE6EA048L,
  5146. 0x6F3F3B82L, 0x3520AB82L, 0x011A1D4BL, 0x277227F8L,
  5147. 0x611560B1L, 0xE7933FDCL, 0xBB3A792BL, 0x344525BDL,
  5148. 0xA08839E1L, 0x51CE794BL, 0x2F32C9B7L, 0xA01FBAC9L,
  5149. 0xE01CC87EL, 0xBCC7D1F6L, 0xCF0111C3L, 0xA1E8AAC7L,
  5150. 0x1A908749L, 0xD44FBD9AL, 0xD0DADECBL, 0xD50ADA38L,
  5151. 0x0339C32AL, 0xC6913667L, 0x8DF9317CL, 0xE0B12B4FL,
  5152. 0xF79E59B7L, 0x43F5BB3AL, 0xF2D519FFL, 0x27D9459CL,
  5153. 0xBF97222CL, 0x15E6FC2AL, 0x0F91FC71L, 0x9B941525L,
  5154. 0xFAE59361L, 0xCEB69CEBL, 0xC2A86459L, 0x12BAA8D1L,
  5155. 0xB6C1075EL, 0xE3056A0CL, 0x10D25065L, 0xCB03A442L,
  5156. 0xE0EC6E0EL, 0x1698DB3BL, 0x4C98A0BEL, 0x3278E964L,
  5157. 0x9F1F9532L, 0xE0D392DFL, 0xD3A0342BL, 0x8971F21EL,
  5158. 0x1B0A7441L, 0x4BA3348CL, 0xC5BE7120L, 0xC37632D8L,
  5159. 0xDF359F8DL, 0x9B992F2EL, 0xE60B6F47L, 0x0FE3F11DL,
  5160. 0xE54CDA54L, 0x1EDAD891L, 0xCE6279CFL, 0xCD3E7E6FL,
  5161. 0x1618B166L, 0xFD2C1D05L, 0x848FD2C5L, 0xF6FB2299L,
  5162. 0xF523F357L, 0xA6327623L, 0x93A83531L, 0x56CCCD02L,
  5163. 0xACF08162L, 0x5A75EBB5L, 0x6E163697L, 0x88D273CCL,
  5164. 0xDE966292L, 0x81B949D0L, 0x4C50901BL, 0x71C65614L,
  5165. 0xE6C6C7BDL, 0x327A140AL, 0x45E1D006L, 0xC3F27B9AL,
  5166. 0xC9AA53FDL, 0x62A80F00L, 0xBB25BFE2L, 0x35BDD2F6L,
  5167. 0x71126905L, 0xB2040222L, 0xB6CBCF7CL, 0xCD769C2BL,
  5168. 0x53113EC0L, 0x1640E3D3L, 0x38ABBD60L, 0x2547ADF0L,
  5169. 0xBA38209CL, 0xF746CE76L, 0x77AFA1C5L, 0x20756060L,
  5170. 0x85CBFE4EL, 0x8AE88DD8L, 0x7AAAF9B0L, 0x4CF9AA7EL,
  5171. 0x1948C25CL, 0x02FB8A8CL, 0x01C36AE4L, 0xD6EBE1F9L,
  5172. 0x90D4F869L, 0xA65CDEA0L, 0x3F09252DL, 0xC208E69FL,
  5173. 0xB74E6132L, 0xCE77E25BL, 0x578FDFE3L, 0x3AC372E6L }
  5174. };
  5175. #endif /* !MBEDTLS_BLOWFISH_ALT */
  5176. #endif /* MBEDTLS_BLOWFISH_C */
  5177. /********* Start of file library/camellia.c ************/
  5178. /*
  5179. * Camellia implementation
  5180. *
  5181. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  5182. * SPDX-License-Identifier: Apache-2.0
  5183. *
  5184. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  5185. * not use this file except in compliance with the License.
  5186. * You may obtain a copy of the License at
  5187. *
  5188. * http://www.apache.org/licenses/LICENSE-2.0
  5189. *
  5190. * Unless required by applicable law or agreed to in writing, software
  5191. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  5192. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  5193. * See the License for the specific language governing permissions and
  5194. * limitations under the License.
  5195. *
  5196. * This file is part of mbed TLS (https://tls.mbed.org)
  5197. */
  5198. /*
  5199. * The Camellia block cipher was designed by NTT and Mitsubishi Electric
  5200. * Corporation.
  5201. *
  5202. * http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/01espec.pdf
  5203. */
  5204. #if !defined(MBEDTLS_CONFIG_FILE)
  5205. #else
  5206. #endif
  5207. #if defined(MBEDTLS_CAMELLIA_C)
  5208. #include <string.h>
  5209. #if defined(MBEDTLS_SELF_TEST)
  5210. #if defined(MBEDTLS_PLATFORM_C)
  5211. #else
  5212. #include <stdio.h>
  5213. #define mbedtls_printf printf
  5214. #endif /* MBEDTLS_PLATFORM_C */
  5215. #endif /* MBEDTLS_SELF_TEST */
  5216. /* Amalgamated Release Mappings */
  5217. #define FSb CAMELLIAFSb
  5218. #if !defined(MBEDTLS_CAMELLIA_ALT)
  5219. /* Implementation that should never be optimized out by the compiler */
  5220. static void camellia_zeroize( void *v, size_t n ) {
  5221. volatile unsigned char *p = v; while( n-- ) *p++ = 0;
  5222. }
  5223. /*
  5224. * 32-bit integer manipulation macros (big endian)
  5225. */
  5226. #ifndef GET_UINT32_BE
  5227. #define GET_UINT32_BE(n,b,i) \
  5228. { \
  5229. (n) = ( (uint32_t) (b)[(i) ] << 24 ) \
  5230. | ( (uint32_t) (b)[(i) + 1] << 16 ) \
  5231. | ( (uint32_t) (b)[(i) + 2] << 8 ) \
  5232. | ( (uint32_t) (b)[(i) + 3] ); \
  5233. }
  5234. #endif
  5235. #ifndef PUT_UINT32_BE
  5236. #define PUT_UINT32_BE(n,b,i) \
  5237. { \
  5238. (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
  5239. (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \
  5240. (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \
  5241. (b)[(i) + 3] = (unsigned char) ( (n) ); \
  5242. }
  5243. #endif
  5244. static const unsigned char SIGMA_CHARS[6][8] =
  5245. {
  5246. { 0xa0, 0x9e, 0x66, 0x7f, 0x3b, 0xcc, 0x90, 0x8b },
  5247. { 0xb6, 0x7a, 0xe8, 0x58, 0x4c, 0xaa, 0x73, 0xb2 },
  5248. { 0xc6, 0xef, 0x37, 0x2f, 0xe9, 0x4f, 0x82, 0xbe },
  5249. { 0x54, 0xff, 0x53, 0xa5, 0xf1, 0xd3, 0x6f, 0x1c },
  5250. { 0x10, 0xe5, 0x27, 0xfa, 0xde, 0x68, 0x2d, 0x1d },
  5251. { 0xb0, 0x56, 0x88, 0xc2, 0xb3, 0xe6, 0xc1, 0xfd }
  5252. };
  5253. #if defined(MBEDTLS_CAMELLIA_SMALL_MEMORY)
  5254. static const unsigned char FSb[256] =
  5255. {
  5256. 112,130, 44,236,179, 39,192,229,228,133, 87, 53,234, 12,174, 65,
  5257. 35,239,107,147, 69, 25,165, 33,237, 14, 79, 78, 29,101,146,189,
  5258. 134,184,175,143,124,235, 31,206, 62, 48,220, 95, 94,197, 11, 26,
  5259. 166,225, 57,202,213, 71, 93, 61,217, 1, 90,214, 81, 86,108, 77,
  5260. 139, 13,154,102,251,204,176, 45,116, 18, 43, 32,240,177,132,153,
  5261. 223, 76,203,194, 52,126,118, 5,109,183,169, 49,209, 23, 4,215,
  5262. 20, 88, 58, 97,222, 27, 17, 28, 50, 15,156, 22, 83, 24,242, 34,
  5263. 254, 68,207,178,195,181,122,145, 36, 8,232,168, 96,252,105, 80,
  5264. 170,208,160,125,161,137, 98,151, 84, 91, 30,149,224,255,100,210,
  5265. 16,196, 0, 72,163,247,117,219,138, 3,230,218, 9, 63,221,148,
  5266. 135, 92,131, 2,205, 74,144, 51,115,103,246,243,157,127,191,226,
  5267. 82,155,216, 38,200, 55,198, 59,129,150,111, 75, 19,190, 99, 46,
  5268. 233,121,167,140,159,110,188,142, 41,245,249,182, 47,253,180, 89,
  5269. 120,152, 6,106,231, 70,113,186,212, 37,171, 66,136,162,141,250,
  5270. 114, 7,185, 85,248,238,172, 10, 54, 73, 42,104, 60, 56,241,164,
  5271. 64, 40,211,123,187,201, 67,193, 21,227,173,244,119,199,128,158
  5272. };
  5273. #define SBOX1(n) FSb[(n)]
  5274. #define SBOX2(n) (unsigned char)((FSb[(n)] >> 7 ^ FSb[(n)] << 1) & 0xff)
  5275. #define SBOX3(n) (unsigned char)((FSb[(n)] >> 1 ^ FSb[(n)] << 7) & 0xff)
  5276. #define SBOX4(n) FSb[((n) << 1 ^ (n) >> 7) &0xff]
  5277. #else /* MBEDTLS_CAMELLIA_SMALL_MEMORY */
  5278. static const unsigned char FSb[256] =
  5279. {
  5280. 112, 130, 44, 236, 179, 39, 192, 229, 228, 133, 87, 53, 234, 12, 174, 65,
  5281. 35, 239, 107, 147, 69, 25, 165, 33, 237, 14, 79, 78, 29, 101, 146, 189,
  5282. 134, 184, 175, 143, 124, 235, 31, 206, 62, 48, 220, 95, 94, 197, 11, 26,
  5283. 166, 225, 57, 202, 213, 71, 93, 61, 217, 1, 90, 214, 81, 86, 108, 77,
  5284. 139, 13, 154, 102, 251, 204, 176, 45, 116, 18, 43, 32, 240, 177, 132, 153,
  5285. 223, 76, 203, 194, 52, 126, 118, 5, 109, 183, 169, 49, 209, 23, 4, 215,
  5286. 20, 88, 58, 97, 222, 27, 17, 28, 50, 15, 156, 22, 83, 24, 242, 34,
  5287. 254, 68, 207, 178, 195, 181, 122, 145, 36, 8, 232, 168, 96, 252, 105, 80,
  5288. 170, 208, 160, 125, 161, 137, 98, 151, 84, 91, 30, 149, 224, 255, 100, 210,
  5289. 16, 196, 0, 72, 163, 247, 117, 219, 138, 3, 230, 218, 9, 63, 221, 148,
  5290. 135, 92, 131, 2, 205, 74, 144, 51, 115, 103, 246, 243, 157, 127, 191, 226,
  5291. 82, 155, 216, 38, 200, 55, 198, 59, 129, 150, 111, 75, 19, 190, 99, 46,
  5292. 233, 121, 167, 140, 159, 110, 188, 142, 41, 245, 249, 182, 47, 253, 180, 89,
  5293. 120, 152, 6, 106, 231, 70, 113, 186, 212, 37, 171, 66, 136, 162, 141, 250,
  5294. 114, 7, 185, 85, 248, 238, 172, 10, 54, 73, 42, 104, 60, 56, 241, 164,
  5295. 64, 40, 211, 123, 187, 201, 67, 193, 21, 227, 173, 244, 119, 199, 128, 158
  5296. };
  5297. static const unsigned char FSb2[256] =
  5298. {
  5299. 224, 5, 88, 217, 103, 78, 129, 203, 201, 11, 174, 106, 213, 24, 93, 130,
  5300. 70, 223, 214, 39, 138, 50, 75, 66, 219, 28, 158, 156, 58, 202, 37, 123,
  5301. 13, 113, 95, 31, 248, 215, 62, 157, 124, 96, 185, 190, 188, 139, 22, 52,
  5302. 77, 195, 114, 149, 171, 142, 186, 122, 179, 2, 180, 173, 162, 172, 216, 154,
  5303. 23, 26, 53, 204, 247, 153, 97, 90, 232, 36, 86, 64, 225, 99, 9, 51,
  5304. 191, 152, 151, 133, 104, 252, 236, 10, 218, 111, 83, 98, 163, 46, 8, 175,
  5305. 40, 176, 116, 194, 189, 54, 34, 56, 100, 30, 57, 44, 166, 48, 229, 68,
  5306. 253, 136, 159, 101, 135, 107, 244, 35, 72, 16, 209, 81, 192, 249, 210, 160,
  5307. 85, 161, 65, 250, 67, 19, 196, 47, 168, 182, 60, 43, 193, 255, 200, 165,
  5308. 32, 137, 0, 144, 71, 239, 234, 183, 21, 6, 205, 181, 18, 126, 187, 41,
  5309. 15, 184, 7, 4, 155, 148, 33, 102, 230, 206, 237, 231, 59, 254, 127, 197,
  5310. 164, 55, 177, 76, 145, 110, 141, 118, 3, 45, 222, 150, 38, 125, 198, 92,
  5311. 211, 242, 79, 25, 63, 220, 121, 29, 82, 235, 243, 109, 94, 251, 105, 178,
  5312. 240, 49, 12, 212, 207, 140, 226, 117, 169, 74, 87, 132, 17, 69, 27, 245,
  5313. 228, 14, 115, 170, 241, 221, 89, 20, 108, 146, 84, 208, 120, 112, 227, 73,
  5314. 128, 80, 167, 246, 119, 147, 134, 131, 42, 199, 91, 233, 238, 143, 1, 61
  5315. };
  5316. static const unsigned char FSb3[256] =
  5317. {
  5318. 56, 65, 22, 118, 217, 147, 96, 242, 114, 194, 171, 154, 117, 6, 87, 160,
  5319. 145, 247, 181, 201, 162, 140, 210, 144, 246, 7, 167, 39, 142, 178, 73, 222,
  5320. 67, 92, 215, 199, 62, 245, 143, 103, 31, 24, 110, 175, 47, 226, 133, 13,
  5321. 83, 240, 156, 101, 234, 163, 174, 158, 236, 128, 45, 107, 168, 43, 54, 166,
  5322. 197, 134, 77, 51, 253, 102, 88, 150, 58, 9, 149, 16, 120, 216, 66, 204,
  5323. 239, 38, 229, 97, 26, 63, 59, 130, 182, 219, 212, 152, 232, 139, 2, 235,
  5324. 10, 44, 29, 176, 111, 141, 136, 14, 25, 135, 78, 11, 169, 12, 121, 17,
  5325. 127, 34, 231, 89, 225, 218, 61, 200, 18, 4, 116, 84, 48, 126, 180, 40,
  5326. 85, 104, 80, 190, 208, 196, 49, 203, 42, 173, 15, 202, 112, 255, 50, 105,
  5327. 8, 98, 0, 36, 209, 251, 186, 237, 69, 129, 115, 109, 132, 159, 238, 74,
  5328. 195, 46, 193, 1, 230, 37, 72, 153, 185, 179, 123, 249, 206, 191, 223, 113,
  5329. 41, 205, 108, 19, 100, 155, 99, 157, 192, 75, 183, 165, 137, 95, 177, 23,
  5330. 244, 188, 211, 70, 207, 55, 94, 71, 148, 250, 252, 91, 151, 254, 90, 172,
  5331. 60, 76, 3, 53, 243, 35, 184, 93, 106, 146, 213, 33, 68, 81, 198, 125,
  5332. 57, 131, 220, 170, 124, 119, 86, 5, 27, 164, 21, 52, 30, 28, 248, 82,
  5333. 32, 20, 233, 189, 221, 228, 161, 224, 138, 241, 214, 122, 187, 227, 64, 79
  5334. };
  5335. static const unsigned char FSb4[256] =
  5336. {
  5337. 112, 44, 179, 192, 228, 87, 234, 174, 35, 107, 69, 165, 237, 79, 29, 146,
  5338. 134, 175, 124, 31, 62, 220, 94, 11, 166, 57, 213, 93, 217, 90, 81, 108,
  5339. 139, 154, 251, 176, 116, 43, 240, 132, 223, 203, 52, 118, 109, 169, 209, 4,
  5340. 20, 58, 222, 17, 50, 156, 83, 242, 254, 207, 195, 122, 36, 232, 96, 105,
  5341. 170, 160, 161, 98, 84, 30, 224, 100, 16, 0, 163, 117, 138, 230, 9, 221,
  5342. 135, 131, 205, 144, 115, 246, 157, 191, 82, 216, 200, 198, 129, 111, 19, 99,
  5343. 233, 167, 159, 188, 41, 249, 47, 180, 120, 6, 231, 113, 212, 171, 136, 141,
  5344. 114, 185, 248, 172, 54, 42, 60, 241, 64, 211, 187, 67, 21, 173, 119, 128,
  5345. 130, 236, 39, 229, 133, 53, 12, 65, 239, 147, 25, 33, 14, 78, 101, 189,
  5346. 184, 143, 235, 206, 48, 95, 197, 26, 225, 202, 71, 61, 1, 214, 86, 77,
  5347. 13, 102, 204, 45, 18, 32, 177, 153, 76, 194, 126, 5, 183, 49, 23, 215,
  5348. 88, 97, 27, 28, 15, 22, 24, 34, 68, 178, 181, 145, 8, 168, 252, 80,
  5349. 208, 125, 137, 151, 91, 149, 255, 210, 196, 72, 247, 219, 3, 218, 63, 148,
  5350. 92, 2, 74, 51, 103, 243, 127, 226, 155, 38, 55, 59, 150, 75, 190, 46,
  5351. 121, 140, 110, 142, 245, 182, 253, 89, 152, 106, 70, 186, 37, 66, 162, 250,
  5352. 7, 85, 238, 10, 73, 104, 56, 164, 40, 123, 201, 193, 227, 244, 199, 158
  5353. };
  5354. #define SBOX1(n) FSb[(n)]
  5355. #define SBOX2(n) FSb2[(n)]
  5356. #define SBOX3(n) FSb3[(n)]
  5357. #define SBOX4(n) FSb4[(n)]
  5358. #endif /* MBEDTLS_CAMELLIA_SMALL_MEMORY */
  5359. static const unsigned char shifts[2][4][4] =
  5360. {
  5361. {
  5362. { 1, 1, 1, 1 }, /* KL */
  5363. { 0, 0, 0, 0 }, /* KR */
  5364. { 1, 1, 1, 1 }, /* KA */
  5365. { 0, 0, 0, 0 } /* KB */
  5366. },
  5367. {
  5368. { 1, 0, 1, 1 }, /* KL */
  5369. { 1, 1, 0, 1 }, /* KR */
  5370. { 1, 1, 1, 0 }, /* KA */
  5371. { 1, 1, 0, 1 } /* KB */
  5372. }
  5373. };
  5374. static const signed char indexes[2][4][20] =
  5375. {
  5376. {
  5377. { 0, 1, 2, 3, 8, 9, 10, 11, 38, 39,
  5378. 36, 37, 23, 20, 21, 22, 27, -1, -1, 26 }, /* KL -> RK */
  5379. { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  5380. -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, /* KR -> RK */
  5381. { 4, 5, 6, 7, 12, 13, 14, 15, 16, 17,
  5382. 18, 19, -1, 24, 25, -1, 31, 28, 29, 30 }, /* KA -> RK */
  5383. { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  5384. -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 } /* KB -> RK */
  5385. },
  5386. {
  5387. { 0, 1, 2, 3, 61, 62, 63, 60, -1, -1,
  5388. -1, -1, 27, 24, 25, 26, 35, 32, 33, 34 }, /* KL -> RK */
  5389. { -1, -1, -1, -1, 8, 9, 10, 11, 16, 17,
  5390. 18, 19, -1, -1, -1, -1, 39, 36, 37, 38 }, /* KR -> RK */
  5391. { -1, -1, -1, -1, 12, 13, 14, 15, 58, 59,
  5392. 56, 57, 31, 28, 29, 30, -1, -1, -1, -1 }, /* KA -> RK */
  5393. { 4, 5, 6, 7, 65, 66, 67, 64, 20, 21,
  5394. 22, 23, -1, -1, -1, -1, 43, 40, 41, 42 } /* KB -> RK */
  5395. }
  5396. };
  5397. static const signed char transposes[2][20] =
  5398. {
  5399. {
  5400. 21, 22, 23, 20,
  5401. -1, -1, -1, -1,
  5402. 18, 19, 16, 17,
  5403. 11, 8, 9, 10,
  5404. 15, 12, 13, 14
  5405. },
  5406. {
  5407. 25, 26, 27, 24,
  5408. 29, 30, 31, 28,
  5409. 18, 19, 16, 17,
  5410. -1, -1, -1, -1,
  5411. -1, -1, -1, -1
  5412. }
  5413. };
  5414. /* Shift macro for 128 bit strings with rotation smaller than 32 bits (!) */
  5415. #define ROTL(DEST, SRC, SHIFT) \
  5416. { \
  5417. (DEST)[0] = (SRC)[0] << (SHIFT) ^ (SRC)[1] >> (32 - (SHIFT)); \
  5418. (DEST)[1] = (SRC)[1] << (SHIFT) ^ (SRC)[2] >> (32 - (SHIFT)); \
  5419. (DEST)[2] = (SRC)[2] << (SHIFT) ^ (SRC)[3] >> (32 - (SHIFT)); \
  5420. (DEST)[3] = (SRC)[3] << (SHIFT) ^ (SRC)[0] >> (32 - (SHIFT)); \
  5421. }
  5422. #define FL(XL, XR, KL, KR) \
  5423. { \
  5424. (XR) = ((((XL) & (KL)) << 1) | (((XL) & (KL)) >> 31)) ^ (XR); \
  5425. (XL) = ((XR) | (KR)) ^ (XL); \
  5426. }
  5427. #define FLInv(YL, YR, KL, KR) \
  5428. { \
  5429. (YL) = ((YR) | (KR)) ^ (YL); \
  5430. (YR) = ((((YL) & (KL)) << 1) | (((YL) & (KL)) >> 31)) ^ (YR); \
  5431. }
  5432. #define SHIFT_AND_PLACE(INDEX, OFFSET) \
  5433. { \
  5434. TK[0] = KC[(OFFSET) * 4 + 0]; \
  5435. TK[1] = KC[(OFFSET) * 4 + 1]; \
  5436. TK[2] = KC[(OFFSET) * 4 + 2]; \
  5437. TK[3] = KC[(OFFSET) * 4 + 3]; \
  5438. \
  5439. for( i = 1; i <= 4; i++ ) \
  5440. if( shifts[(INDEX)][(OFFSET)][i -1] ) \
  5441. ROTL(TK + i * 4, TK, ( 15 * i ) % 32); \
  5442. \
  5443. for( i = 0; i < 20; i++ ) \
  5444. if( indexes[(INDEX)][(OFFSET)][i] != -1 ) { \
  5445. RK[indexes[(INDEX)][(OFFSET)][i]] = TK[ i ]; \
  5446. } \
  5447. }
  5448. static void camellia_feistel( const uint32_t x[2], const uint32_t k[2],
  5449. uint32_t z[2])
  5450. {
  5451. uint32_t I0, I1;
  5452. I0 = x[0] ^ k[0];
  5453. I1 = x[1] ^ k[1];
  5454. I0 = ((uint32_t) SBOX1((I0 >> 24) & 0xFF) << 24) |
  5455. ((uint32_t) SBOX2((I0 >> 16) & 0xFF) << 16) |
  5456. ((uint32_t) SBOX3((I0 >> 8) & 0xFF) << 8) |
  5457. ((uint32_t) SBOX4((I0 ) & 0xFF) );
  5458. I1 = ((uint32_t) SBOX2((I1 >> 24) & 0xFF) << 24) |
  5459. ((uint32_t) SBOX3((I1 >> 16) & 0xFF) << 16) |
  5460. ((uint32_t) SBOX4((I1 >> 8) & 0xFF) << 8) |
  5461. ((uint32_t) SBOX1((I1 ) & 0xFF) );
  5462. I0 ^= (I1 << 8) | (I1 >> 24);
  5463. I1 ^= (I0 << 16) | (I0 >> 16);
  5464. I0 ^= (I1 >> 8) | (I1 << 24);
  5465. I1 ^= (I0 >> 8) | (I0 << 24);
  5466. z[0] ^= I1;
  5467. z[1] ^= I0;
  5468. }
  5469. void mbedtls_camellia_init( mbedtls_camellia_context *ctx )
  5470. {
  5471. memset( ctx, 0, sizeof( mbedtls_camellia_context ) );
  5472. }
  5473. void mbedtls_camellia_free( mbedtls_camellia_context *ctx )
  5474. {
  5475. if( ctx == NULL )
  5476. return;
  5477. camellia_zeroize( ctx, sizeof( mbedtls_camellia_context ) );
  5478. }
  5479. /*
  5480. * Camellia key schedule (encryption)
  5481. */
  5482. int mbedtls_camellia_setkey_enc( mbedtls_camellia_context *ctx, const unsigned char *key,
  5483. unsigned int keybits )
  5484. {
  5485. int idx;
  5486. size_t i;
  5487. uint32_t *RK;
  5488. unsigned char t[64];
  5489. uint32_t SIGMA[6][2];
  5490. uint32_t KC[16];
  5491. uint32_t TK[20];
  5492. RK = ctx->rk;
  5493. memset( t, 0, 64 );
  5494. memset( RK, 0, sizeof(ctx->rk) );
  5495. switch( keybits )
  5496. {
  5497. case 128: ctx->nr = 3; idx = 0; break;
  5498. case 192:
  5499. case 256: ctx->nr = 4; idx = 1; break;
  5500. default : return( MBEDTLS_ERR_CAMELLIA_INVALID_KEY_LENGTH );
  5501. }
  5502. for( i = 0; i < keybits / 8; ++i )
  5503. t[i] = key[i];
  5504. if( keybits == 192 ) {
  5505. for( i = 0; i < 8; i++ )
  5506. t[24 + i] = ~t[16 + i];
  5507. }
  5508. /*
  5509. * Prepare SIGMA values
  5510. */
  5511. for( i = 0; i < 6; i++ ) {
  5512. GET_UINT32_BE( SIGMA[i][0], SIGMA_CHARS[i], 0 );
  5513. GET_UINT32_BE( SIGMA[i][1], SIGMA_CHARS[i], 4 );
  5514. }
  5515. /*
  5516. * Key storage in KC
  5517. * Order: KL, KR, KA, KB
  5518. */
  5519. memset( KC, 0, sizeof(KC) );
  5520. /* Store KL, KR */
  5521. for( i = 0; i < 8; i++ )
  5522. GET_UINT32_BE( KC[i], t, i * 4 );
  5523. /* Generate KA */
  5524. for( i = 0; i < 4; ++i )
  5525. KC[8 + i] = KC[i] ^ KC[4 + i];
  5526. camellia_feistel( KC + 8, SIGMA[0], KC + 10 );
  5527. camellia_feistel( KC + 10, SIGMA[1], KC + 8 );
  5528. for( i = 0; i < 4; ++i )
  5529. KC[8 + i] ^= KC[i];
  5530. camellia_feistel( KC + 8, SIGMA[2], KC + 10 );
  5531. camellia_feistel( KC + 10, SIGMA[3], KC + 8 );
  5532. if( keybits > 128 ) {
  5533. /* Generate KB */
  5534. for( i = 0; i < 4; ++i )
  5535. KC[12 + i] = KC[4 + i] ^ KC[8 + i];
  5536. camellia_feistel( KC + 12, SIGMA[4], KC + 14 );
  5537. camellia_feistel( KC + 14, SIGMA[5], KC + 12 );
  5538. }
  5539. /*
  5540. * Generating subkeys
  5541. */
  5542. /* Manipulating KL */
  5543. SHIFT_AND_PLACE( idx, 0 );
  5544. /* Manipulating KR */
  5545. if( keybits > 128 ) {
  5546. SHIFT_AND_PLACE( idx, 1 );
  5547. }
  5548. /* Manipulating KA */
  5549. SHIFT_AND_PLACE( idx, 2 );
  5550. /* Manipulating KB */
  5551. if( keybits > 128 ) {
  5552. SHIFT_AND_PLACE( idx, 3 );
  5553. }
  5554. /* Do transpositions */
  5555. for( i = 0; i < 20; i++ ) {
  5556. if( transposes[idx][i] != -1 ) {
  5557. RK[32 + 12 * idx + i] = RK[transposes[idx][i]];
  5558. }
  5559. }
  5560. return( 0 );
  5561. }
  5562. /*
  5563. * Camellia key schedule (decryption)
  5564. */
  5565. int mbedtls_camellia_setkey_dec( mbedtls_camellia_context *ctx, const unsigned char *key,
  5566. unsigned int keybits )
  5567. {
  5568. int idx, ret;
  5569. size_t i;
  5570. mbedtls_camellia_context cty;
  5571. uint32_t *RK;
  5572. uint32_t *SK;
  5573. mbedtls_camellia_init( &cty );
  5574. /* Also checks keybits */
  5575. if( ( ret = mbedtls_camellia_setkey_enc( &cty, key, keybits ) ) != 0 )
  5576. goto exit;
  5577. ctx->nr = cty.nr;
  5578. idx = ( ctx->nr == 4 );
  5579. RK = ctx->rk;
  5580. SK = cty.rk + 24 * 2 + 8 * idx * 2;
  5581. *RK++ = *SK++;
  5582. *RK++ = *SK++;
  5583. *RK++ = *SK++;
  5584. *RK++ = *SK++;
  5585. for( i = 22 + 8 * idx, SK -= 6; i > 0; i--, SK -= 4 )
  5586. {
  5587. *RK++ = *SK++;
  5588. *RK++ = *SK++;
  5589. }
  5590. SK -= 2;
  5591. *RK++ = *SK++;
  5592. *RK++ = *SK++;
  5593. *RK++ = *SK++;
  5594. *RK++ = *SK++;
  5595. exit:
  5596. mbedtls_camellia_free( &cty );
  5597. return( ret );
  5598. }
  5599. /*
  5600. * Camellia-ECB block encryption/decryption
  5601. */
  5602. int mbedtls_camellia_crypt_ecb( mbedtls_camellia_context *ctx,
  5603. int mode,
  5604. const unsigned char input[16],
  5605. unsigned char output[16] )
  5606. {
  5607. int NR;
  5608. uint32_t *RK, X[4];
  5609. ( (void) mode );
  5610. NR = ctx->nr;
  5611. RK = ctx->rk;
  5612. GET_UINT32_BE( X[0], input, 0 );
  5613. GET_UINT32_BE( X[1], input, 4 );
  5614. GET_UINT32_BE( X[2], input, 8 );
  5615. GET_UINT32_BE( X[3], input, 12 );
  5616. X[0] ^= *RK++;
  5617. X[1] ^= *RK++;
  5618. X[2] ^= *RK++;
  5619. X[3] ^= *RK++;
  5620. while( NR ) {
  5621. --NR;
  5622. camellia_feistel( X, RK, X + 2 );
  5623. RK += 2;
  5624. camellia_feistel( X + 2, RK, X );
  5625. RK += 2;
  5626. camellia_feistel( X, RK, X + 2 );
  5627. RK += 2;
  5628. camellia_feistel( X + 2, RK, X );
  5629. RK += 2;
  5630. camellia_feistel( X, RK, X + 2 );
  5631. RK += 2;
  5632. camellia_feistel( X + 2, RK, X );
  5633. RK += 2;
  5634. if( NR ) {
  5635. FL(X[0], X[1], RK[0], RK[1]);
  5636. RK += 2;
  5637. FLInv(X[2], X[3], RK[0], RK[1]);
  5638. RK += 2;
  5639. }
  5640. }
  5641. X[2] ^= *RK++;
  5642. X[3] ^= *RK++;
  5643. X[0] ^= *RK++;
  5644. X[1] ^= *RK++;
  5645. PUT_UINT32_BE( X[2], output, 0 );
  5646. PUT_UINT32_BE( X[3], output, 4 );
  5647. PUT_UINT32_BE( X[0], output, 8 );
  5648. PUT_UINT32_BE( X[1], output, 12 );
  5649. return( 0 );
  5650. }
  5651. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  5652. /*
  5653. * Camellia-CBC buffer encryption/decryption
  5654. */
  5655. int mbedtls_camellia_crypt_cbc( mbedtls_camellia_context *ctx,
  5656. int mode,
  5657. size_t length,
  5658. unsigned char iv[16],
  5659. const unsigned char *input,
  5660. unsigned char *output )
  5661. {
  5662. int i;
  5663. unsigned char temp[16];
  5664. if( length % 16 )
  5665. return( MBEDTLS_ERR_CAMELLIA_INVALID_INPUT_LENGTH );
  5666. if( mode == MBEDTLS_CAMELLIA_DECRYPT )
  5667. {
  5668. while( length > 0 )
  5669. {
  5670. memcpy( temp, input, 16 );
  5671. mbedtls_camellia_crypt_ecb( ctx, mode, input, output );
  5672. for( i = 0; i < 16; i++ )
  5673. output[i] = (unsigned char)( output[i] ^ iv[i] );
  5674. memcpy( iv, temp, 16 );
  5675. input += 16;
  5676. output += 16;
  5677. length -= 16;
  5678. }
  5679. }
  5680. else
  5681. {
  5682. while( length > 0 )
  5683. {
  5684. for( i = 0; i < 16; i++ )
  5685. output[i] = (unsigned char)( input[i] ^ iv[i] );
  5686. mbedtls_camellia_crypt_ecb( ctx, mode, output, output );
  5687. memcpy( iv, output, 16 );
  5688. input += 16;
  5689. output += 16;
  5690. length -= 16;
  5691. }
  5692. }
  5693. return( 0 );
  5694. }
  5695. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  5696. #if defined(MBEDTLS_CIPHER_MODE_CFB)
  5697. /*
  5698. * Camellia-CFB128 buffer encryption/decryption
  5699. */
  5700. int mbedtls_camellia_crypt_cfb128( mbedtls_camellia_context *ctx,
  5701. int mode,
  5702. size_t length,
  5703. size_t *iv_off,
  5704. unsigned char iv[16],
  5705. const unsigned char *input,
  5706. unsigned char *output )
  5707. {
  5708. int c;
  5709. size_t n = *iv_off;
  5710. if( mode == MBEDTLS_CAMELLIA_DECRYPT )
  5711. {
  5712. while( length-- )
  5713. {
  5714. if( n == 0 )
  5715. mbedtls_camellia_crypt_ecb( ctx, MBEDTLS_CAMELLIA_ENCRYPT, iv, iv );
  5716. c = *input++;
  5717. *output++ = (unsigned char)( c ^ iv[n] );
  5718. iv[n] = (unsigned char) c;
  5719. n = ( n + 1 ) & 0x0F;
  5720. }
  5721. }
  5722. else
  5723. {
  5724. while( length-- )
  5725. {
  5726. if( n == 0 )
  5727. mbedtls_camellia_crypt_ecb( ctx, MBEDTLS_CAMELLIA_ENCRYPT, iv, iv );
  5728. iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
  5729. n = ( n + 1 ) & 0x0F;
  5730. }
  5731. }
  5732. *iv_off = n;
  5733. return( 0 );
  5734. }
  5735. #endif /* MBEDTLS_CIPHER_MODE_CFB */
  5736. #if defined(MBEDTLS_CIPHER_MODE_CTR)
  5737. /*
  5738. * Camellia-CTR buffer encryption/decryption
  5739. */
  5740. int mbedtls_camellia_crypt_ctr( mbedtls_camellia_context *ctx,
  5741. size_t length,
  5742. size_t *nc_off,
  5743. unsigned char nonce_counter[16],
  5744. unsigned char stream_block[16],
  5745. const unsigned char *input,
  5746. unsigned char *output )
  5747. {
  5748. int c, i;
  5749. size_t n = *nc_off;
  5750. while( length-- )
  5751. {
  5752. if( n == 0 ) {
  5753. mbedtls_camellia_crypt_ecb( ctx, MBEDTLS_CAMELLIA_ENCRYPT, nonce_counter,
  5754. stream_block );
  5755. for( i = 16; i > 0; i-- )
  5756. if( ++nonce_counter[i - 1] != 0 )
  5757. break;
  5758. }
  5759. c = *input++;
  5760. *output++ = (unsigned char)( c ^ stream_block[n] );
  5761. n = ( n + 1 ) & 0x0F;
  5762. }
  5763. *nc_off = n;
  5764. return( 0 );
  5765. }
  5766. #endif /* MBEDTLS_CIPHER_MODE_CTR */
  5767. #endif /* !MBEDTLS_CAMELLIA_ALT */
  5768. #if defined(MBEDTLS_SELF_TEST)
  5769. /*
  5770. * Camellia test vectors from:
  5771. *
  5772. * http://info.isl.ntt.co.jp/crypt/eng/camellia/technology.html:
  5773. * http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/cryptrec/intermediate.txt
  5774. * http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/cryptrec/t_camellia.txt
  5775. * (For each bitlength: Key 0, Nr 39)
  5776. */
  5777. #define CAMELLIA_TESTS_ECB 2
  5778. static const unsigned char camellia_test_ecb_key[3][CAMELLIA_TESTS_ECB][32] =
  5779. {
  5780. {
  5781. { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
  5782. 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
  5783. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  5784. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
  5785. },
  5786. {
  5787. { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
  5788. 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
  5789. 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 },
  5790. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  5791. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  5792. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
  5793. },
  5794. {
  5795. { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
  5796. 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
  5797. 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
  5798. 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
  5799. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  5800. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  5801. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  5802. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
  5803. },
  5804. };
  5805. static const unsigned char camellia_test_ecb_plain[CAMELLIA_TESTS_ECB][16] =
  5806. {
  5807. { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
  5808. 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
  5809. { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
  5810. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
  5811. };
  5812. static const unsigned char camellia_test_ecb_cipher[3][CAMELLIA_TESTS_ECB][16] =
  5813. {
  5814. {
  5815. { 0x67, 0x67, 0x31, 0x38, 0x54, 0x96, 0x69, 0x73,
  5816. 0x08, 0x57, 0x06, 0x56, 0x48, 0xea, 0xbe, 0x43 },
  5817. { 0x38, 0x3C, 0x6C, 0x2A, 0xAB, 0xEF, 0x7F, 0xDE,
  5818. 0x25, 0xCD, 0x47, 0x0B, 0xF7, 0x74, 0xA3, 0x31 }
  5819. },
  5820. {
  5821. { 0xb4, 0x99, 0x34, 0x01, 0xb3, 0xe9, 0x96, 0xf8,
  5822. 0x4e, 0xe5, 0xce, 0xe7, 0xd7, 0x9b, 0x09, 0xb9 },
  5823. { 0xD1, 0x76, 0x3F, 0xC0, 0x19, 0xD7, 0x7C, 0xC9,
  5824. 0x30, 0xBF, 0xF2, 0xA5, 0x6F, 0x7C, 0x93, 0x64 }
  5825. },
  5826. {
  5827. { 0x9a, 0xcc, 0x23, 0x7d, 0xff, 0x16, 0xd7, 0x6c,
  5828. 0x20, 0xef, 0x7c, 0x91, 0x9e, 0x3a, 0x75, 0x09 },
  5829. { 0x05, 0x03, 0xFB, 0x10, 0xAB, 0x24, 0x1E, 0x7C,
  5830. 0xF4, 0x5D, 0x8C, 0xDE, 0xEE, 0x47, 0x43, 0x35 }
  5831. }
  5832. };
  5833. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  5834. #define CAMELLIA_TESTS_CBC 3
  5835. static const unsigned char camellia_test_cbc_key[3][32] =
  5836. {
  5837. { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
  5838. 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C }
  5839. ,
  5840. { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
  5841. 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
  5842. 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B }
  5843. ,
  5844. { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
  5845. 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
  5846. 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
  5847. 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
  5848. };
  5849. static const unsigned char camellia_test_cbc_iv[16] =
  5850. { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
  5851. 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F }
  5852. ;
  5853. static const unsigned char camellia_test_cbc_plain[CAMELLIA_TESTS_CBC][16] =
  5854. {
  5855. { 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
  5856. 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A },
  5857. { 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
  5858. 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51 },
  5859. { 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
  5860. 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF }
  5861. };
  5862. static const unsigned char camellia_test_cbc_cipher[3][CAMELLIA_TESTS_CBC][16] =
  5863. {
  5864. {
  5865. { 0x16, 0x07, 0xCF, 0x49, 0x4B, 0x36, 0xBB, 0xF0,
  5866. 0x0D, 0xAE, 0xB0, 0xB5, 0x03, 0xC8, 0x31, 0xAB },
  5867. { 0xA2, 0xF2, 0xCF, 0x67, 0x16, 0x29, 0xEF, 0x78,
  5868. 0x40, 0xC5, 0xA5, 0xDF, 0xB5, 0x07, 0x48, 0x87 },
  5869. { 0x0F, 0x06, 0x16, 0x50, 0x08, 0xCF, 0x8B, 0x8B,
  5870. 0x5A, 0x63, 0x58, 0x63, 0x62, 0x54, 0x3E, 0x54 }
  5871. },
  5872. {
  5873. { 0x2A, 0x48, 0x30, 0xAB, 0x5A, 0xC4, 0xA1, 0xA2,
  5874. 0x40, 0x59, 0x55, 0xFD, 0x21, 0x95, 0xCF, 0x93 },
  5875. { 0x5D, 0x5A, 0x86, 0x9B, 0xD1, 0x4C, 0xE5, 0x42,
  5876. 0x64, 0xF8, 0x92, 0xA6, 0xDD, 0x2E, 0xC3, 0xD5 },
  5877. { 0x37, 0xD3, 0x59, 0xC3, 0x34, 0x98, 0x36, 0xD8,
  5878. 0x84, 0xE3, 0x10, 0xAD, 0xDF, 0x68, 0xC4, 0x49 }
  5879. },
  5880. {
  5881. { 0xE6, 0xCF, 0xA3, 0x5F, 0xC0, 0x2B, 0x13, 0x4A,
  5882. 0x4D, 0x2C, 0x0B, 0x67, 0x37, 0xAC, 0x3E, 0xDA },
  5883. { 0x36, 0xCB, 0xEB, 0x73, 0xBD, 0x50, 0x4B, 0x40,
  5884. 0x70, 0xB1, 0xB7, 0xDE, 0x2B, 0x21, 0xEB, 0x50 },
  5885. { 0xE3, 0x1A, 0x60, 0x55, 0x29, 0x7D, 0x96, 0xCA,
  5886. 0x33, 0x30, 0xCD, 0xF1, 0xB1, 0x86, 0x0A, 0x83 }
  5887. }
  5888. };
  5889. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  5890. #if defined(MBEDTLS_CIPHER_MODE_CTR)
  5891. /*
  5892. * Camellia-CTR test vectors from:
  5893. *
  5894. * http://www.faqs.org/rfcs/rfc5528.html
  5895. */
  5896. static const unsigned char camellia_test_ctr_key[3][16] =
  5897. {
  5898. { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,
  5899. 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },
  5900. { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,
  5901. 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },
  5902. { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,
  5903. 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }
  5904. };
  5905. static const unsigned char camellia_test_ctr_nonce_counter[3][16] =
  5906. {
  5907. { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
  5908. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
  5909. { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,
  5910. 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },
  5911. { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,
  5912. 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }
  5913. };
  5914. static const unsigned char camellia_test_ctr_pt[3][48] =
  5915. {
  5916. { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,
  5917. 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },
  5918. { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
  5919. 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
  5920. 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
  5921. 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },
  5922. { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
  5923. 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
  5924. 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
  5925. 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
  5926. 0x20, 0x21, 0x22, 0x23 }
  5927. };
  5928. static const unsigned char camellia_test_ctr_ct[3][48] =
  5929. {
  5930. { 0xD0, 0x9D, 0xC2, 0x9A, 0x82, 0x14, 0x61, 0x9A,
  5931. 0x20, 0x87, 0x7C, 0x76, 0xDB, 0x1F, 0x0B, 0x3F },
  5932. { 0xDB, 0xF3, 0xC7, 0x8D, 0xC0, 0x83, 0x96, 0xD4,
  5933. 0xDA, 0x7C, 0x90, 0x77, 0x65, 0xBB, 0xCB, 0x44,
  5934. 0x2B, 0x8E, 0x8E, 0x0F, 0x31, 0xF0, 0xDC, 0xA7,
  5935. 0x2C, 0x74, 0x17, 0xE3, 0x53, 0x60, 0xE0, 0x48 },
  5936. { 0xB1, 0x9D, 0x1F, 0xCD, 0xCB, 0x75, 0xEB, 0x88,
  5937. 0x2F, 0x84, 0x9C, 0xE2, 0x4D, 0x85, 0xCF, 0x73,
  5938. 0x9C, 0xE6, 0x4B, 0x2B, 0x5C, 0x9D, 0x73, 0xF1,
  5939. 0x4F, 0x2D, 0x5D, 0x9D, 0xCE, 0x98, 0x89, 0xCD,
  5940. 0xDF, 0x50, 0x86, 0x96 }
  5941. };
  5942. static const int camellia_test_ctr_len[3] =
  5943. { 16, 32, 36 };
  5944. #endif /* MBEDTLS_CIPHER_MODE_CTR */
  5945. /*
  5946. * Checkup routine
  5947. */
  5948. int mbedtls_camellia_self_test( int verbose )
  5949. {
  5950. int i, j, u, v;
  5951. unsigned char key[32];
  5952. unsigned char buf[64];
  5953. unsigned char src[16];
  5954. unsigned char dst[16];
  5955. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  5956. unsigned char iv[16];
  5957. #endif
  5958. #if defined(MBEDTLS_CIPHER_MODE_CTR)
  5959. size_t offset, len;
  5960. unsigned char nonce_counter[16];
  5961. unsigned char stream_block[16];
  5962. #endif
  5963. mbedtls_camellia_context ctx;
  5964. memset( key, 0, 32 );
  5965. for( j = 0; j < 6; j++ ) {
  5966. u = j >> 1;
  5967. v = j & 1;
  5968. if( verbose != 0 )
  5969. mbedtls_printf( " CAMELLIA-ECB-%3d (%s): ", 128 + u * 64,
  5970. (v == MBEDTLS_CAMELLIA_DECRYPT) ? "dec" : "enc");
  5971. for( i = 0; i < CAMELLIA_TESTS_ECB; i++ ) {
  5972. memcpy( key, camellia_test_ecb_key[u][i], 16 + 8 * u );
  5973. if( v == MBEDTLS_CAMELLIA_DECRYPT ) {
  5974. mbedtls_camellia_setkey_dec( &ctx, key, 128 + u * 64 );
  5975. memcpy( src, camellia_test_ecb_cipher[u][i], 16 );
  5976. memcpy( dst, camellia_test_ecb_plain[i], 16 );
  5977. } else { /* MBEDTLS_CAMELLIA_ENCRYPT */
  5978. mbedtls_camellia_setkey_enc( &ctx, key, 128 + u * 64 );
  5979. memcpy( src, camellia_test_ecb_plain[i], 16 );
  5980. memcpy( dst, camellia_test_ecb_cipher[u][i], 16 );
  5981. }
  5982. mbedtls_camellia_crypt_ecb( &ctx, v, src, buf );
  5983. if( memcmp( buf, dst, 16 ) != 0 )
  5984. {
  5985. if( verbose != 0 )
  5986. mbedtls_printf( "failed\n" );
  5987. return( 1 );
  5988. }
  5989. }
  5990. if( verbose != 0 )
  5991. mbedtls_printf( "passed\n" );
  5992. }
  5993. if( verbose != 0 )
  5994. mbedtls_printf( "\n" );
  5995. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  5996. /*
  5997. * CBC mode
  5998. */
  5999. for( j = 0; j < 6; j++ )
  6000. {
  6001. u = j >> 1;
  6002. v = j & 1;
  6003. if( verbose != 0 )
  6004. mbedtls_printf( " CAMELLIA-CBC-%3d (%s): ", 128 + u * 64,
  6005. ( v == MBEDTLS_CAMELLIA_DECRYPT ) ? "dec" : "enc" );
  6006. memcpy( src, camellia_test_cbc_iv, 16 );
  6007. memcpy( dst, camellia_test_cbc_iv, 16 );
  6008. memcpy( key, camellia_test_cbc_key[u], 16 + 8 * u );
  6009. if( v == MBEDTLS_CAMELLIA_DECRYPT ) {
  6010. mbedtls_camellia_setkey_dec( &ctx, key, 128 + u * 64 );
  6011. } else {
  6012. mbedtls_camellia_setkey_enc( &ctx, key, 128 + u * 64 );
  6013. }
  6014. for( i = 0; i < CAMELLIA_TESTS_CBC; i++ ) {
  6015. if( v == MBEDTLS_CAMELLIA_DECRYPT ) {
  6016. memcpy( iv , src, 16 );
  6017. memcpy( src, camellia_test_cbc_cipher[u][i], 16 );
  6018. memcpy( dst, camellia_test_cbc_plain[i], 16 );
  6019. } else { /* MBEDTLS_CAMELLIA_ENCRYPT */
  6020. memcpy( iv , dst, 16 );
  6021. memcpy( src, camellia_test_cbc_plain[i], 16 );
  6022. memcpy( dst, camellia_test_cbc_cipher[u][i], 16 );
  6023. }
  6024. mbedtls_camellia_crypt_cbc( &ctx, v, 16, iv, src, buf );
  6025. if( memcmp( buf, dst, 16 ) != 0 )
  6026. {
  6027. if( verbose != 0 )
  6028. mbedtls_printf( "failed\n" );
  6029. return( 1 );
  6030. }
  6031. }
  6032. if( verbose != 0 )
  6033. mbedtls_printf( "passed\n" );
  6034. }
  6035. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  6036. if( verbose != 0 )
  6037. mbedtls_printf( "\n" );
  6038. #if defined(MBEDTLS_CIPHER_MODE_CTR)
  6039. /*
  6040. * CTR mode
  6041. */
  6042. for( i = 0; i < 6; i++ )
  6043. {
  6044. u = i >> 1;
  6045. v = i & 1;
  6046. if( verbose != 0 )
  6047. mbedtls_printf( " CAMELLIA-CTR-128 (%s): ",
  6048. ( v == MBEDTLS_CAMELLIA_DECRYPT ) ? "dec" : "enc" );
  6049. memcpy( nonce_counter, camellia_test_ctr_nonce_counter[u], 16 );
  6050. memcpy( key, camellia_test_ctr_key[u], 16 );
  6051. offset = 0;
  6052. mbedtls_camellia_setkey_enc( &ctx, key, 128 );
  6053. if( v == MBEDTLS_CAMELLIA_DECRYPT )
  6054. {
  6055. len = camellia_test_ctr_len[u];
  6056. memcpy( buf, camellia_test_ctr_ct[u], len );
  6057. mbedtls_camellia_crypt_ctr( &ctx, len, &offset, nonce_counter, stream_block,
  6058. buf, buf );
  6059. if( memcmp( buf, camellia_test_ctr_pt[u], len ) != 0 )
  6060. {
  6061. if( verbose != 0 )
  6062. mbedtls_printf( "failed\n" );
  6063. return( 1 );
  6064. }
  6065. }
  6066. else
  6067. {
  6068. len = camellia_test_ctr_len[u];
  6069. memcpy( buf, camellia_test_ctr_pt[u], len );
  6070. mbedtls_camellia_crypt_ctr( &ctx, len, &offset, nonce_counter, stream_block,
  6071. buf, buf );
  6072. if( memcmp( buf, camellia_test_ctr_ct[u], len ) != 0 )
  6073. {
  6074. if( verbose != 0 )
  6075. mbedtls_printf( "failed\n" );
  6076. return( 1 );
  6077. }
  6078. }
  6079. if( verbose != 0 )
  6080. mbedtls_printf( "passed\n" );
  6081. }
  6082. if( verbose != 0 )
  6083. mbedtls_printf( "\n" );
  6084. #endif /* MBEDTLS_CIPHER_MODE_CTR */
  6085. return( 0 );
  6086. }
  6087. #endif /* MBEDTLS_SELF_TEST */
  6088. /* Amalgamated Release Mappings */
  6089. #undef FSb
  6090. #endif /* MBEDTLS_CAMELLIA_C */
  6091. /********* Start of file library/ccm.c ************/
  6092. /*
  6093. * NIST SP800-38C compliant CCM implementation
  6094. *
  6095. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  6096. * SPDX-License-Identifier: Apache-2.0
  6097. *
  6098. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  6099. * not use this file except in compliance with the License.
  6100. * You may obtain a copy of the License at
  6101. *
  6102. * http://www.apache.org/licenses/LICENSE-2.0
  6103. *
  6104. * Unless required by applicable law or agreed to in writing, software
  6105. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  6106. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  6107. * See the License for the specific language governing permissions and
  6108. * limitations under the License.
  6109. *
  6110. * This file is part of mbed TLS (https://tls.mbed.org)
  6111. */
  6112. /*
  6113. * Definition of CCM:
  6114. * http://csrc.nist.gov/publications/nistpubs/800-38C/SP800-38C_updated-July20_2007.pdf
  6115. * RFC 3610 "Counter with CBC-MAC (CCM)"
  6116. *
  6117. * Related:
  6118. * RFC 5116 "An Interface and Algorithms for Authenticated Encryption"
  6119. */
  6120. #if !defined(MBEDTLS_CONFIG_FILE)
  6121. #else
  6122. #endif
  6123. #if defined(MBEDTLS_CCM_C)
  6124. #include <string.h>
  6125. #if defined(MBEDTLS_SELF_TEST) && defined(MBEDTLS_AES_C)
  6126. #if defined(MBEDTLS_PLATFORM_C)
  6127. #else
  6128. #include <stdio.h>
  6129. #define mbedtls_printf printf
  6130. #endif /* MBEDTLS_PLATFORM_C */
  6131. #endif /* MBEDTLS_SELF_TEST && MBEDTLS_AES_C */
  6132. /* Implementation that should never be optimized out by the compiler */
  6133. static void ccm_zeroize( void *v, size_t n ) {
  6134. volatile unsigned char *p = v; while( n-- ) *p++ = 0;
  6135. }
  6136. #define CCM_ENCRYPT 0
  6137. #define CCM_DECRYPT 1
  6138. /*
  6139. * Initialize context
  6140. */
  6141. void mbedtls_ccm_init( mbedtls_ccm_context *ctx )
  6142. {
  6143. memset( ctx, 0, sizeof( mbedtls_ccm_context ) );
  6144. }
  6145. int mbedtls_ccm_setkey( mbedtls_ccm_context *ctx,
  6146. mbedtls_cipher_id_t cipher,
  6147. const unsigned char *key,
  6148. unsigned int keybits )
  6149. {
  6150. int ret;
  6151. const mbedtls_cipher_info_t *cipher_info;
  6152. cipher_info = mbedtls_cipher_info_from_values( cipher, keybits, MBEDTLS_MODE_ECB );
  6153. if( cipher_info == NULL )
  6154. return( MBEDTLS_ERR_CCM_BAD_INPUT );
  6155. if( cipher_info->block_size != 16 )
  6156. return( MBEDTLS_ERR_CCM_BAD_INPUT );
  6157. mbedtls_cipher_free( &ctx->cipher_ctx );
  6158. if( ( ret = mbedtls_cipher_setup( &ctx->cipher_ctx, cipher_info ) ) != 0 )
  6159. return( ret );
  6160. if( ( ret = mbedtls_cipher_setkey( &ctx->cipher_ctx, key, keybits,
  6161. MBEDTLS_ENCRYPT ) ) != 0 )
  6162. {
  6163. return( ret );
  6164. }
  6165. return( 0 );
  6166. }
  6167. /*
  6168. * Free context
  6169. */
  6170. void mbedtls_ccm_free( mbedtls_ccm_context *ctx )
  6171. {
  6172. mbedtls_cipher_free( &ctx->cipher_ctx );
  6173. ccm_zeroize( ctx, sizeof( mbedtls_ccm_context ) );
  6174. }
  6175. /*
  6176. * Macros for common operations.
  6177. * Results in smaller compiled code than static inline functions.
  6178. */
  6179. /*
  6180. * Update the CBC-MAC state in y using a block in b
  6181. * (Always using b as the source helps the compiler optimise a bit better.)
  6182. */
  6183. #define UPDATE_CBC_MAC \
  6184. for( i = 0; i < 16; i++ ) \
  6185. y[i] ^= b[i]; \
  6186. \
  6187. if( ( ret = mbedtls_cipher_update( &ctx->cipher_ctx, y, 16, y, &olen ) ) != 0 ) \
  6188. return( ret );
  6189. /*
  6190. * Encrypt or decrypt a partial block with CTR
  6191. * Warning: using b for temporary storage! src and dst must not be b!
  6192. * This avoids allocating one more 16 bytes buffer while allowing src == dst.
  6193. */
  6194. #define CTR_CRYPT( dst, src, len ) \
  6195. if( ( ret = mbedtls_cipher_update( &ctx->cipher_ctx, ctr, 16, b, &olen ) ) != 0 ) \
  6196. return( ret ); \
  6197. \
  6198. for( i = 0; i < len; i++ ) \
  6199. dst[i] = src[i] ^ b[i];
  6200. /*
  6201. * Authenticated encryption or decryption
  6202. */
  6203. static int ccm_auth_crypt( mbedtls_ccm_context *ctx, int mode, size_t length,
  6204. const unsigned char *iv, size_t iv_len,
  6205. const unsigned char *add, size_t add_len,
  6206. const unsigned char *input, unsigned char *output,
  6207. unsigned char *tag, size_t tag_len )
  6208. {
  6209. int ret;
  6210. unsigned char i;
  6211. unsigned char q;
  6212. size_t len_left, olen;
  6213. unsigned char b[16];
  6214. unsigned char y[16];
  6215. unsigned char ctr[16];
  6216. const unsigned char *src;
  6217. unsigned char *dst;
  6218. /*
  6219. * Check length requirements: SP800-38C A.1
  6220. * Additional requirement: a < 2^16 - 2^8 to simplify the code.
  6221. * 'length' checked later (when writing it to the first block)
  6222. */
  6223. if( tag_len < 4 || tag_len > 16 || tag_len % 2 != 0 )
  6224. return( MBEDTLS_ERR_CCM_BAD_INPUT );
  6225. /* Also implies q is within bounds */
  6226. if( iv_len < 7 || iv_len > 13 )
  6227. return( MBEDTLS_ERR_CCM_BAD_INPUT );
  6228. if( add_len > 0xFF00 )
  6229. return( MBEDTLS_ERR_CCM_BAD_INPUT );
  6230. q = 16 - 1 - (unsigned char) iv_len;
  6231. /*
  6232. * First block B_0:
  6233. * 0 .. 0 flags
  6234. * 1 .. iv_len nonce (aka iv)
  6235. * iv_len+1 .. 15 length
  6236. *
  6237. * With flags as (bits):
  6238. * 7 0
  6239. * 6 add present?
  6240. * 5 .. 3 (t - 2) / 2
  6241. * 2 .. 0 q - 1
  6242. */
  6243. b[0] = 0;
  6244. b[0] |= ( add_len > 0 ) << 6;
  6245. b[0] |= ( ( tag_len - 2 ) / 2 ) << 3;
  6246. b[0] |= q - 1;
  6247. memcpy( b + 1, iv, iv_len );
  6248. for( i = 0, len_left = length; i < q; i++, len_left >>= 8 )
  6249. b[15-i] = (unsigned char)( len_left & 0xFF );
  6250. if( len_left > 0 )
  6251. return( MBEDTLS_ERR_CCM_BAD_INPUT );
  6252. /* Start CBC-MAC with first block */
  6253. memset( y, 0, 16 );
  6254. UPDATE_CBC_MAC;
  6255. /*
  6256. * If there is additional data, update CBC-MAC with
  6257. * add_len, add, 0 (padding to a block boundary)
  6258. */
  6259. if( add_len > 0 )
  6260. {
  6261. size_t use_len;
  6262. len_left = add_len;
  6263. src = add;
  6264. memset( b, 0, 16 );
  6265. b[0] = (unsigned char)( ( add_len >> 8 ) & 0xFF );
  6266. b[1] = (unsigned char)( ( add_len ) & 0xFF );
  6267. use_len = len_left < 16 - 2 ? len_left : 16 - 2;
  6268. memcpy( b + 2, src, use_len );
  6269. len_left -= use_len;
  6270. src += use_len;
  6271. UPDATE_CBC_MAC;
  6272. while( len_left > 0 )
  6273. {
  6274. use_len = len_left > 16 ? 16 : len_left;
  6275. memset( b, 0, 16 );
  6276. memcpy( b, src, use_len );
  6277. UPDATE_CBC_MAC;
  6278. len_left -= use_len;
  6279. src += use_len;
  6280. }
  6281. }
  6282. /*
  6283. * Prepare counter block for encryption:
  6284. * 0 .. 0 flags
  6285. * 1 .. iv_len nonce (aka iv)
  6286. * iv_len+1 .. 15 counter (initially 1)
  6287. *
  6288. * With flags as (bits):
  6289. * 7 .. 3 0
  6290. * 2 .. 0 q - 1
  6291. */
  6292. ctr[0] = q - 1;
  6293. memcpy( ctr + 1, iv, iv_len );
  6294. memset( ctr + 1 + iv_len, 0, q );
  6295. ctr[15] = 1;
  6296. /*
  6297. * Authenticate and {en,de}crypt the message.
  6298. *
  6299. * The only difference between encryption and decryption is
  6300. * the respective order of authentication and {en,de}cryption.
  6301. */
  6302. len_left = length;
  6303. src = input;
  6304. dst = output;
  6305. while( len_left > 0 )
  6306. {
  6307. size_t use_len = len_left > 16 ? 16 : len_left;
  6308. if( mode == CCM_ENCRYPT )
  6309. {
  6310. memset( b, 0, 16 );
  6311. memcpy( b, src, use_len );
  6312. UPDATE_CBC_MAC;
  6313. }
  6314. CTR_CRYPT( dst, src, use_len );
  6315. if( mode == CCM_DECRYPT )
  6316. {
  6317. memset( b, 0, 16 );
  6318. memcpy( b, dst, use_len );
  6319. UPDATE_CBC_MAC;
  6320. }
  6321. dst += use_len;
  6322. src += use_len;
  6323. len_left -= use_len;
  6324. /*
  6325. * Increment counter.
  6326. * No need to check for overflow thanks to the length check above.
  6327. */
  6328. for( i = 0; i < q; i++ )
  6329. if( ++ctr[15-i] != 0 )
  6330. break;
  6331. }
  6332. /*
  6333. * Authentication: reset counter and crypt/mask internal tag
  6334. */
  6335. for( i = 0; i < q; i++ )
  6336. ctr[15-i] = 0;
  6337. CTR_CRYPT( y, y, 16 );
  6338. memcpy( tag, y, tag_len );
  6339. return( 0 );
  6340. }
  6341. /*
  6342. * Authenticated encryption
  6343. */
  6344. int mbedtls_ccm_encrypt_and_tag( mbedtls_ccm_context *ctx, size_t length,
  6345. const unsigned char *iv, size_t iv_len,
  6346. const unsigned char *add, size_t add_len,
  6347. const unsigned char *input, unsigned char *output,
  6348. unsigned char *tag, size_t tag_len )
  6349. {
  6350. return( ccm_auth_crypt( ctx, CCM_ENCRYPT, length, iv, iv_len,
  6351. add, add_len, input, output, tag, tag_len ) );
  6352. }
  6353. /*
  6354. * Authenticated decryption
  6355. */
  6356. int mbedtls_ccm_auth_decrypt( mbedtls_ccm_context *ctx, size_t length,
  6357. const unsigned char *iv, size_t iv_len,
  6358. const unsigned char *add, size_t add_len,
  6359. const unsigned char *input, unsigned char *output,
  6360. const unsigned char *tag, size_t tag_len )
  6361. {
  6362. int ret;
  6363. unsigned char check_tag[16];
  6364. unsigned char i;
  6365. int diff;
  6366. if( ( ret = ccm_auth_crypt( ctx, CCM_DECRYPT, length,
  6367. iv, iv_len, add, add_len,
  6368. input, output, check_tag, tag_len ) ) != 0 )
  6369. {
  6370. return( ret );
  6371. }
  6372. /* Check tag in "constant-time" */
  6373. for( diff = 0, i = 0; i < tag_len; i++ )
  6374. diff |= tag[i] ^ check_tag[i];
  6375. if( diff != 0 )
  6376. {
  6377. ccm_zeroize( output, length );
  6378. return( MBEDTLS_ERR_CCM_AUTH_FAILED );
  6379. }
  6380. return( 0 );
  6381. }
  6382. #if defined(MBEDTLS_SELF_TEST) && defined(MBEDTLS_AES_C)
  6383. /*
  6384. * Examples 1 to 3 from SP800-38C Appendix C
  6385. */
  6386. #define NB_TESTS 3
  6387. /*
  6388. * The data is the same for all tests, only the used length changes
  6389. */
  6390. static const unsigned char key[] = {
  6391. 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
  6392. 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f
  6393. };
  6394. static const unsigned char iv[] = {
  6395. 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
  6396. 0x18, 0x19, 0x1a, 0x1b
  6397. };
  6398. static const unsigned char ad[] = {
  6399. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
  6400. 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
  6401. 0x10, 0x11, 0x12, 0x13
  6402. };
  6403. static const unsigned char msg[] = {
  6404. 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
  6405. 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
  6406. 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
  6407. };
  6408. static const size_t iv_len [NB_TESTS] = { 7, 8, 12 };
  6409. static const size_t add_len[NB_TESTS] = { 8, 16, 20 };
  6410. static const size_t msg_len[NB_TESTS] = { 4, 16, 24 };
  6411. static const size_t tag_len[NB_TESTS] = { 4, 6, 8 };
  6412. static const unsigned char res[NB_TESTS][32] = {
  6413. { 0x71, 0x62, 0x01, 0x5b, 0x4d, 0xac, 0x25, 0x5d },
  6414. { 0xd2, 0xa1, 0xf0, 0xe0, 0x51, 0xea, 0x5f, 0x62,
  6415. 0x08, 0x1a, 0x77, 0x92, 0x07, 0x3d, 0x59, 0x3d,
  6416. 0x1f, 0xc6, 0x4f, 0xbf, 0xac, 0xcd },
  6417. { 0xe3, 0xb2, 0x01, 0xa9, 0xf5, 0xb7, 0x1a, 0x7a,
  6418. 0x9b, 0x1c, 0xea, 0xec, 0xcd, 0x97, 0xe7, 0x0b,
  6419. 0x61, 0x76, 0xaa, 0xd9, 0xa4, 0x42, 0x8a, 0xa5,
  6420. 0x48, 0x43, 0x92, 0xfb, 0xc1, 0xb0, 0x99, 0x51 }
  6421. };
  6422. int mbedtls_ccm_self_test( int verbose )
  6423. {
  6424. mbedtls_ccm_context ctx;
  6425. unsigned char out[32];
  6426. size_t i;
  6427. int ret;
  6428. mbedtls_ccm_init( &ctx );
  6429. if( mbedtls_ccm_setkey( &ctx, MBEDTLS_CIPHER_ID_AES, key, 8 * sizeof key ) != 0 )
  6430. {
  6431. if( verbose != 0 )
  6432. mbedtls_printf( " CCM: setup failed" );
  6433. return( 1 );
  6434. }
  6435. for( i = 0; i < NB_TESTS; i++ )
  6436. {
  6437. if( verbose != 0 )
  6438. mbedtls_printf( " CCM-AES #%u: ", (unsigned int) i + 1 );
  6439. ret = mbedtls_ccm_encrypt_and_tag( &ctx, msg_len[i],
  6440. iv, iv_len[i], ad, add_len[i],
  6441. msg, out,
  6442. out + msg_len[i], tag_len[i] );
  6443. if( ret != 0 ||
  6444. memcmp( out, res[i], msg_len[i] + tag_len[i] ) != 0 )
  6445. {
  6446. if( verbose != 0 )
  6447. mbedtls_printf( "failed\n" );
  6448. return( 1 );
  6449. }
  6450. ret = mbedtls_ccm_auth_decrypt( &ctx, msg_len[i],
  6451. iv, iv_len[i], ad, add_len[i],
  6452. res[i], out,
  6453. res[i] + msg_len[i], tag_len[i] );
  6454. if( ret != 0 ||
  6455. memcmp( out, msg, msg_len[i] ) != 0 )
  6456. {
  6457. if( verbose != 0 )
  6458. mbedtls_printf( "failed\n" );
  6459. return( 1 );
  6460. }
  6461. if( verbose != 0 )
  6462. mbedtls_printf( "passed\n" );
  6463. }
  6464. mbedtls_ccm_free( &ctx );
  6465. if( verbose != 0 )
  6466. mbedtls_printf( "\n" );
  6467. return( 0 );
  6468. }
  6469. #endif /* MBEDTLS_SELF_TEST && MBEDTLS_AES_C */
  6470. #endif /* MBEDTLS_CCM_C */
  6471. /********* Start of file library/certs.c ************/
  6472. /*
  6473. * X.509 test certificates
  6474. *
  6475. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  6476. * SPDX-License-Identifier: Apache-2.0
  6477. *
  6478. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  6479. * not use this file except in compliance with the License.
  6480. * You may obtain a copy of the License at
  6481. *
  6482. * http://www.apache.org/licenses/LICENSE-2.0
  6483. *
  6484. * Unless required by applicable law or agreed to in writing, software
  6485. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  6486. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  6487. * See the License for the specific language governing permissions and
  6488. * limitations under the License.
  6489. *
  6490. * This file is part of mbed TLS (https://tls.mbed.org)
  6491. */
  6492. #if !defined(MBEDTLS_CONFIG_FILE)
  6493. #else
  6494. #endif
  6495. #if defined(MBEDTLS_CERTS_C)
  6496. #if defined(MBEDTLS_ECDSA_C)
  6497. #define TEST_CA_CRT_EC \
  6498. "-----BEGIN CERTIFICATE-----\r\n" \
  6499. "MIICUjCCAdegAwIBAgIJAMFD4n5iQ8zoMAoGCCqGSM49BAMCMD4xCzAJBgNVBAYT\r\n" \
  6500. "Ak5MMREwDwYDVQQKEwhQb2xhclNTTDEcMBoGA1UEAxMTUG9sYXJzc2wgVGVzdCBF\r\n" \
  6501. "QyBDQTAeFw0xMzA5MjQxNTQ5NDhaFw0yMzA5MjIxNTQ5NDhaMD4xCzAJBgNVBAYT\r\n" \
  6502. "Ak5MMREwDwYDVQQKEwhQb2xhclNTTDEcMBoGA1UEAxMTUG9sYXJzc2wgVGVzdCBF\r\n" \
  6503. "QyBDQTB2MBAGByqGSM49AgEGBSuBBAAiA2IABMPaKzRBN1gvh1b+/Im6KUNLTuBu\r\n" \
  6504. "ww5XUzM5WNRStJGVOQsj318XJGJI/BqVKc4sLYfCiFKAr9ZqqyHduNMcbli4yuiy\r\n" \
  6505. "aY7zQa0pw7RfdadHb9UZKVVpmlM7ILRmFmAzHqOBoDCBnTAdBgNVHQ4EFgQUnW0g\r\n" \
  6506. "JEkBPyvLeLUZvH4kydv7NnwwbgYDVR0jBGcwZYAUnW0gJEkBPyvLeLUZvH4kydv7\r\n" \
  6507. "NnyhQqRAMD4xCzAJBgNVBAYTAk5MMREwDwYDVQQKEwhQb2xhclNTTDEcMBoGA1UE\r\n" \
  6508. "AxMTUG9sYXJzc2wgVGVzdCBFQyBDQYIJAMFD4n5iQ8zoMAwGA1UdEwQFMAMBAf8w\r\n" \
  6509. "CgYIKoZIzj0EAwIDaQAwZgIxAMO0YnNWKJUAfXgSJtJxexn4ipg+kv4znuR50v56\r\n" \
  6510. "t4d0PCu412mUC6Nnd7izvtE2MgIxAP1nnJQjZ8BWukszFQDG48wxCCyci9qpdSMv\r\n" \
  6511. "uCjn8pwUOkABXK8Mss90fzCfCEOtIA==\r\n" \
  6512. "-----END CERTIFICATE-----\r\n"
  6513. const char mbedtls_test_ca_crt_ec[] = TEST_CA_CRT_EC;
  6514. const char mbedtls_test_ca_key_ec[] =
  6515. "-----BEGIN EC PRIVATE KEY-----\r\n"
  6516. "Proc-Type: 4,ENCRYPTED\r\n"
  6517. "DEK-Info: DES-EDE3-CBC,307EAB469933D64E\r\n"
  6518. "\r\n"
  6519. "IxbrRmKcAzctJqPdTQLA4SWyBYYGYJVkYEna+F7Pa5t5Yg/gKADrFKcm6B72e7DG\r\n"
  6520. "ihExtZI648s0zdYw6qSJ74vrPSuWDe5qm93BqsfVH9svtCzWHW0pm1p0KTBCFfUq\r\n"
  6521. "UsuWTITwJImcnlAs1gaRZ3sAWm7cOUidL0fo2G0fYUFNcYoCSLffCFTEHBuPnagb\r\n"
  6522. "a77x/sY1Bvii8S9/XhDTb6pTMx06wzrm\r\n"
  6523. "-----END EC PRIVATE KEY-----\r\n";
  6524. const char mbedtls_test_ca_pwd_ec[] = "PolarSSLTest";
  6525. const char mbedtls_test_srv_crt_ec[] =
  6526. "-----BEGIN CERTIFICATE-----\r\n"
  6527. "MIICHzCCAaWgAwIBAgIBCTAKBggqhkjOPQQDAjA+MQswCQYDVQQGEwJOTDERMA8G\r\n"
  6528. "A1UEChMIUG9sYXJTU0wxHDAaBgNVBAMTE1BvbGFyc3NsIFRlc3QgRUMgQ0EwHhcN\r\n"
  6529. "MTMwOTI0MTU1MjA0WhcNMjMwOTIyMTU1MjA0WjA0MQswCQYDVQQGEwJOTDERMA8G\r\n"
  6530. "A1UEChMIUG9sYXJTU0wxEjAQBgNVBAMTCWxvY2FsaG9zdDBZMBMGByqGSM49AgEG\r\n"
  6531. "CCqGSM49AwEHA0IABDfMVtl2CR5acj7HWS3/IG7ufPkGkXTQrRS192giWWKSTuUA\r\n"
  6532. "2CMR/+ov0jRdXRa9iojCa3cNVc2KKg76Aci07f+jgZ0wgZowCQYDVR0TBAIwADAd\r\n"
  6533. "BgNVHQ4EFgQUUGGlj9QH2deCAQzlZX+MY0anE74wbgYDVR0jBGcwZYAUnW0gJEkB\r\n"
  6534. "PyvLeLUZvH4kydv7NnyhQqRAMD4xCzAJBgNVBAYTAk5MMREwDwYDVQQKEwhQb2xh\r\n"
  6535. "clNTTDEcMBoGA1UEAxMTUG9sYXJzc2wgVGVzdCBFQyBDQYIJAMFD4n5iQ8zoMAoG\r\n"
  6536. "CCqGSM49BAMCA2gAMGUCMQCaLFzXptui5WQN8LlO3ddh1hMxx6tzgLvT03MTVK2S\r\n"
  6537. "C12r0Lz3ri/moSEpNZWqPjkCMCE2f53GXcYLqyfyJR078c/xNSUU5+Xxl7VZ414V\r\n"
  6538. "fGa5kHvHARBPc8YAIVIqDvHH1Q==\r\n"
  6539. "-----END CERTIFICATE-----\r\n";
  6540. const char mbedtls_test_srv_key_ec[] =
  6541. "-----BEGIN EC PRIVATE KEY-----\r\n"
  6542. "MHcCAQEEIPEqEyB2AnCoPL/9U/YDHvdqXYbIogTywwyp6/UfDw6noAoGCCqGSM49\r\n"
  6543. "AwEHoUQDQgAEN8xW2XYJHlpyPsdZLf8gbu58+QaRdNCtFLX3aCJZYpJO5QDYIxH/\r\n"
  6544. "6i/SNF1dFr2KiMJrdw1VzYoqDvoByLTt/w==\r\n"
  6545. "-----END EC PRIVATE KEY-----\r\n";
  6546. const char mbedtls_test_cli_crt_ec[] =
  6547. "-----BEGIN CERTIFICATE-----\r\n"
  6548. "MIICLDCCAbKgAwIBAgIBDTAKBggqhkjOPQQDAjA+MQswCQYDVQQGEwJOTDERMA8G\r\n"
  6549. "A1UEChMIUG9sYXJTU0wxHDAaBgNVBAMTE1BvbGFyc3NsIFRlc3QgRUMgQ0EwHhcN\r\n"
  6550. "MTMwOTI0MTU1MjA0WhcNMjMwOTIyMTU1MjA0WjBBMQswCQYDVQQGEwJOTDERMA8G\r\n"
  6551. "A1UEChMIUG9sYXJTU0wxHzAdBgNVBAMTFlBvbGFyU1NMIFRlc3QgQ2xpZW50IDIw\r\n"
  6552. "WTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARX5a6xc9/TrLuTuIH/Eq7u5lOszlVT\r\n"
  6553. "9jQOzC7jYyUL35ji81xgNpbA1RgUcOV/n9VLRRjlsGzVXPiWj4dwo+THo4GdMIGa\r\n"
  6554. "MAkGA1UdEwQCMAAwHQYDVR0OBBYEFHoAX4Zk/OBd5REQO7LmO8QmP8/iMG4GA1Ud\r\n"
  6555. "IwRnMGWAFJ1tICRJAT8ry3i1Gbx+JMnb+zZ8oUKkQDA+MQswCQYDVQQGEwJOTDER\r\n"
  6556. "MA8GA1UEChMIUG9sYXJTU0wxHDAaBgNVBAMTE1BvbGFyc3NsIFRlc3QgRUMgQ0GC\r\n"
  6557. "CQDBQ+J+YkPM6DAKBggqhkjOPQQDAgNoADBlAjBKZQ17IIOimbmoD/yN7o89u3BM\r\n"
  6558. "lgOsjnhw3fIOoLIWy2WOGsk/LGF++DzvrRzuNiACMQCd8iem1XS4JK7haj8xocpU\r\n"
  6559. "LwjQje5PDGHfd3h9tP38Qknu5bJqws0md2KOKHyeV0U=\r\n"
  6560. "-----END CERTIFICATE-----\r\n";
  6561. const char mbedtls_test_cli_key_ec[] =
  6562. "-----BEGIN EC PRIVATE KEY-----\r\n"
  6563. "MHcCAQEEIPb3hmTxZ3/mZI3vyk7p3U3wBf+WIop6hDhkFzJhmLcqoAoGCCqGSM49\r\n"
  6564. "AwEHoUQDQgAEV+WusXPf06y7k7iB/xKu7uZTrM5VU/Y0Dswu42MlC9+Y4vNcYDaW\r\n"
  6565. "wNUYFHDlf5/VS0UY5bBs1Vz4lo+HcKPkxw==\r\n"
  6566. "-----END EC PRIVATE KEY-----\r\n";
  6567. const size_t mbedtls_test_ca_crt_ec_len = sizeof( mbedtls_test_ca_crt_ec );
  6568. const size_t mbedtls_test_ca_key_ec_len = sizeof( mbedtls_test_ca_key_ec );
  6569. const size_t mbedtls_test_ca_pwd_ec_len = sizeof( mbedtls_test_ca_pwd_ec ) - 1;
  6570. const size_t mbedtls_test_srv_crt_ec_len = sizeof( mbedtls_test_srv_crt_ec );
  6571. const size_t mbedtls_test_srv_key_ec_len = sizeof( mbedtls_test_srv_key_ec );
  6572. const size_t mbedtls_test_cli_crt_ec_len = sizeof( mbedtls_test_cli_crt_ec );
  6573. const size_t mbedtls_test_cli_key_ec_len = sizeof( mbedtls_test_cli_key_ec );
  6574. #else
  6575. #define TEST_CA_CRT_EC
  6576. #endif /* MBEDTLS_ECDSA_C */
  6577. #if defined(MBEDTLS_RSA_C)
  6578. #define TEST_CA_CRT_RSA \
  6579. "-----BEGIN CERTIFICATE-----\r\n" \
  6580. "MIIDhzCCAm+gAwIBAgIBADANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDER\r\n" \
  6581. "MA8GA1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwHhcN\r\n" \
  6582. "MTEwMjEyMTQ0NDAwWhcNMjEwMjEyMTQ0NDAwWjA7MQswCQYDVQQGEwJOTDERMA8G\r\n" \
  6583. "A1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwggEiMA0G\r\n" \
  6584. "CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDA3zf8F7vglp0/ht6WMn1EpRagzSHx\r\n" \
  6585. "mdTs6st8GFgIlKXsm8WL3xoemTiZhx57wI053zhdcHgH057Zk+i5clHFzqMwUqny\r\n" \
  6586. "50BwFMtEonILwuVA+T7lpg6z+exKY8C4KQB0nFc7qKUEkHHxvYPZP9al4jwqj+8n\r\n" \
  6587. "YMPGn8u67GB9t+aEMr5P+1gmIgNb1LTV+/Xjli5wwOQuvfwu7uJBVcA0Ln0kcmnL\r\n" \
  6588. "R7EUQIN9Z/SG9jGr8XmksrUuEvmEF/Bibyc+E1ixVA0hmnM3oTDPb5Lc9un8rNsu\r\n" \
  6589. "KNF+AksjoBXyOGVkCeoMbo4bF6BxyLObyavpw/LPh5aPgAIynplYb6LVAgMBAAGj\r\n" \
  6590. "gZUwgZIwDAYDVR0TBAUwAwEB/zAdBgNVHQ4EFgQUtFrkpbPe0lL2udWmlQ/rPrzH\r\n" \
  6591. "/f8wYwYDVR0jBFwwWoAUtFrkpbPe0lL2udWmlQ/rPrzH/f+hP6Q9MDsxCzAJBgNV\r\n" \
  6592. "BAYTAk5MMREwDwYDVQQKEwhQb2xhclNTTDEZMBcGA1UEAxMQUG9sYXJTU0wgVGVz\r\n" \
  6593. "dCBDQYIBADANBgkqhkiG9w0BAQUFAAOCAQEAuP1U2ABUkIslsCfdlc2i94QHHYeJ\r\n" \
  6594. "SsR4EdgHtdciUI5I62J6Mom+Y0dT/7a+8S6MVMCZP6C5NyNyXw1GWY/YR82XTJ8H\r\n" \
  6595. "DBJiCTok5DbZ6SzaONBzdWHXwWwmi5vg1dxn7YxrM9d0IjxM27WNKs4sDQhZBQkF\r\n" \
  6596. "pjmfs2cb4oPl4Y9T9meTx/lvdkRYEug61Jfn6cA+qHpyPYdTH+UshITnmp5/Ztkf\r\n" \
  6597. "m/UTSLBNFNHesiTZeH31NcxYGdHSme9Nc/gfidRa0FLOCfWxRlFqAI47zG9jAQCZ\r\n" \
  6598. "7Z2mCGDNMhjQc+BYcdnl0lPXjdDK6V0qCg1dVewhUBcW5gZKzV7e9+DpVA==\r\n" \
  6599. "-----END CERTIFICATE-----\r\n"
  6600. const char mbedtls_test_ca_crt_rsa[] = TEST_CA_CRT_RSA;
  6601. const char mbedtls_test_ca_key_rsa[] =
  6602. "-----BEGIN RSA PRIVATE KEY-----\r\n"
  6603. "Proc-Type: 4,ENCRYPTED\r\n"
  6604. "DEK-Info: DES-EDE3-CBC,A8A95B05D5B7206B\r\n"
  6605. "\r\n"
  6606. "9Qd9GeArejl1GDVh2lLV1bHt0cPtfbh5h/5zVpAVaFpqtSPMrElp50Rntn9et+JA\r\n"
  6607. "7VOyboR+Iy2t/HU4WvA687k3Bppe9GwKHjHhtl//8xFKwZr3Xb5yO5JUP8AUctQq\r\n"
  6608. "Nb8CLlZyuUC+52REAAthdWgsX+7dJO4yabzUcQ22Tp9JSD0hiL43BlkWYUNK3dAo\r\n"
  6609. "PZlmiptjnzVTjg1MxsBSydZinWOLBV8/JQgxSPo2yD4uEfig28qbvQ2wNIn0pnAb\r\n"
  6610. "GxnSAOazkongEGfvcjIIs+LZN9gXFhxcOh6kc4Q/c99B7QWETwLLkYgZ+z1a9VY9\r\n"
  6611. "gEU7CwCxYCD+h9hY6FPmsK0/lC4O7aeRKpYq00rPPxs6i7phiexg6ax6yTMmArQq\r\n"
  6612. "QmK3TAsJm8V/J5AWpLEV6jAFgRGymGGHnof0DXzVWZidrcZJWTNuGEX90nB3ee2w\r\n"
  6613. "PXJEFWKoD3K3aFcSLdHYr3mLGxP7H9ThQai9VsycxZKS5kwvBKQ//YMrmFfwPk8x\r\n"
  6614. "vTeY4KZMaUrveEel5tWZC94RSMKgxR6cyE1nBXyTQnDOGbfpNNgBKxyKbINWoOJU\r\n"
  6615. "WJZAwlsQn+QzCDwpri7+sV1mS3gBE6UY7aQmnmiiaC2V3Hbphxct/en5QsfDOt1X\r\n"
  6616. "JczSfpRWLlbPznZg8OQh/VgCMA58N5DjOzTIK7sJJ5r+94ZBTCpgAMbF588f0NTR\r\n"
  6617. "KCe4yrxGJR7X02M4nvD4IwOlpsQ8xQxZtOSgXv4LkxvdU9XJJKWZ/XNKJeWztxSe\r\n"
  6618. "Z1vdTc2YfsDBA2SEv33vxHx2g1vqtw8SjDRT2RaQSS0QuSaMJimdOX6mTOCBKk1J\r\n"
  6619. "9Q5mXTrER+/LnK0jEmXsBXWA5bqqVZIyahXSx4VYZ7l7w/PHiUDtDgyRhMMKi4n2\r\n"
  6620. "iQvQcWSQTjrpnlJbca1/DkpRt3YwrvJwdqb8asZU2VrNETh5x0QVefDRLFiVpif/\r\n"
  6621. "tUaeAe/P1F8OkS7OIZDs1SUbv/sD2vMbhNkUoCms3/PvNtdnvgL4F0zhaDpKCmlT\r\n"
  6622. "P8vx49E7v5CyRNmED9zZg4o3wmMqrQO93PtTug3Eu9oVx1zPQM1NVMyBa2+f29DL\r\n"
  6623. "1nuTCeXdo9+ni45xx+jAI4DCwrRdhJ9uzZyC6962H37H6D+5naNvClFR1s6li1Gb\r\n"
  6624. "nqPoiy/OBsEx9CaDGcqQBp5Wme/3XW+6z1ISOx+igwNTVCT14mHdBMbya0eIKft5\r\n"
  6625. "X+GnwtgEMyCYyyWuUct8g4RzErcY9+yW9Om5Hzpx4zOuW4NPZgPDTgK+t2RSL/Yq\r\n"
  6626. "rE1njrgeGYcVeG3f+OftH4s6fPbq7t1A5ZgUscbLMBqr9tK+OqygR4EgKBPsH6Cz\r\n"
  6627. "L6zlv/2RV0qAHvVuDJcIDIgwY5rJtINEm32rhOeFNJwZS5MNIC1czXZx5//ugX7l\r\n"
  6628. "I4sy5nbVhwSjtAk8Xg5dZbdTZ6mIrb7xqH+fdakZor1khG7bC2uIwibD3cSl2XkR\r\n"
  6629. "wN48lslbHnqqagr6Xm1nNOSVl8C/6kbJEsMpLhAezfRtGwvOucoaE+WbeUNolGde\r\n"
  6630. "P/eQiddSf0brnpiLJRh7qZrl9XuqYdpUqnoEdMAfotDOID8OtV7gt8a48ad8VPW2\r\n"
  6631. "-----END RSA PRIVATE KEY-----\r\n";
  6632. const char mbedtls_test_ca_pwd_rsa[] = "PolarSSLTest";
  6633. const char mbedtls_test_srv_crt_rsa[] =
  6634. "-----BEGIN CERTIFICATE-----\r\n"
  6635. "MIIDNzCCAh+gAwIBAgIBAjANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDER\r\n"
  6636. "MA8GA1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwHhcN\r\n"
  6637. "MTEwMjEyMTQ0NDA2WhcNMjEwMjEyMTQ0NDA2WjA0MQswCQYDVQQGEwJOTDERMA8G\r\n"
  6638. "A1UEChMIUG9sYXJTU0wxEjAQBgNVBAMTCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcN\r\n"
  6639. "AQEBBQADggEPADCCAQoCggEBAMFNo93nzR3RBNdJcriZrA545Do8Ss86ExbQWuTN\r\n"
  6640. "owCIp+4ea5anUrSQ7y1yej4kmvy2NKwk9XfgJmSMnLAofaHa6ozmyRyWvP7BBFKz\r\n"
  6641. "NtSj+uGxdtiQwWG0ZlI2oiZTqqt0Xgd9GYLbKtgfoNkNHC1JZvdbJXNG6AuKT2kM\r\n"
  6642. "tQCQ4dqCEGZ9rlQri2V5kaHiYcPNQEkI7mgM8YuG0ka/0LiqEQMef1aoGh5EGA8P\r\n"
  6643. "hYvai0Re4hjGYi/HZo36Xdh98yeJKQHFkA4/J/EwyEoO79bex8cna8cFPXrEAjya\r\n"
  6644. "HT4P6DSYW8tzS1KW2BGiLICIaTla0w+w3lkvEcf36hIBMJcCAwEAAaNNMEswCQYD\r\n"
  6645. "VR0TBAIwADAdBgNVHQ4EFgQUpQXoZLjc32APUBJNYKhkr02LQ5MwHwYDVR0jBBgw\r\n"
  6646. "FoAUtFrkpbPe0lL2udWmlQ/rPrzH/f8wDQYJKoZIhvcNAQEFBQADggEBAJxnXClY\r\n"
  6647. "oHkbp70cqBrsGXLybA74czbO5RdLEgFs7rHVS9r+c293luS/KdliLScZqAzYVylw\r\n"
  6648. "UfRWvKMoWhHYKp3dEIS4xTXk6/5zXxhv9Rw8SGc8qn6vITHk1S1mPevtekgasY5Y\r\n"
  6649. "iWQuM3h4YVlRH3HHEMAD1TnAexfXHHDFQGe+Bd1iAbz1/sH9H8l4StwX6egvTK3M\r\n"
  6650. "wXRwkKkvjKaEDA9ATbZx0mI8LGsxSuCqe9r9dyjmttd47J1p1Rulz3CLzaRcVIuS\r\n"
  6651. "RRQfaD8neM9c1S/iJ/amTVqJxA1KOdOS5780WhPfSArA+g4qAmSjelc3p4wWpha8\r\n"
  6652. "zhuYwjVuX6JHG0c=\r\n"
  6653. "-----END CERTIFICATE-----\r\n";
  6654. const char mbedtls_test_srv_key_rsa[] =
  6655. "-----BEGIN RSA PRIVATE KEY-----\r\n"
  6656. "MIIEpAIBAAKCAQEAwU2j3efNHdEE10lyuJmsDnjkOjxKzzoTFtBa5M2jAIin7h5r\r\n"
  6657. "lqdStJDvLXJ6PiSa/LY0rCT1d+AmZIycsCh9odrqjObJHJa8/sEEUrM21KP64bF2\r\n"
  6658. "2JDBYbRmUjaiJlOqq3ReB30Zgtsq2B+g2Q0cLUlm91slc0boC4pPaQy1AJDh2oIQ\r\n"
  6659. "Zn2uVCuLZXmRoeJhw81ASQjuaAzxi4bSRr/QuKoRAx5/VqgaHkQYDw+Fi9qLRF7i\r\n"
  6660. "GMZiL8dmjfpd2H3zJ4kpAcWQDj8n8TDISg7v1t7HxydrxwU9esQCPJodPg/oNJhb\r\n"
  6661. "y3NLUpbYEaIsgIhpOVrTD7DeWS8Rx/fqEgEwlwIDAQABAoIBAQCXR0S8EIHFGORZ\r\n"
  6662. "++AtOg6eENxD+xVs0f1IeGz57Tjo3QnXX7VBZNdj+p1ECvhCE/G7XnkgU5hLZX+G\r\n"
  6663. "Z0jkz/tqJOI0vRSdLBbipHnWouyBQ4e/A1yIJdlBtqXxJ1KE/ituHRbNc4j4kL8Z\r\n"
  6664. "/r6pvwnTI0PSx2Eqs048YdS92LT6qAv4flbNDxMn2uY7s4ycS4Q8w1JXnCeaAnYm\r\n"
  6665. "WYI5wxO+bvRELR2Mcz5DmVnL8jRyml6l6582bSv5oufReFIbyPZbQWlXgYnpu6He\r\n"
  6666. "GTc7E1zKYQGG/9+DQUl/1vQuCPqQwny0tQoX2w5tdYpdMdVm+zkLtbajzdTviJJa\r\n"
  6667. "TWzL6lt5AoGBAN86+SVeJDcmQJcv4Eq6UhtRr4QGMiQMz0Sod6ettYxYzMgxtw28\r\n"
  6668. "CIrgpozCc+UaZJLo7UxvC6an85r1b2nKPCLQFaggJ0H4Q0J/sZOhBIXaoBzWxveK\r\n"
  6669. "nupceKdVxGsFi8CDy86DBfiyFivfBj+47BbaQzPBj7C4rK7UlLjab2rDAoGBAN2u\r\n"
  6670. "AM2gchoFiu4v1HFL8D7lweEpi6ZnMJjnEu/dEgGQJFjwdpLnPbsj4c75odQ4Gz8g\r\n"
  6671. "sw9lao9VVzbusoRE/JGI4aTdO0pATXyG7eG1Qu+5Yc1YGXcCrliA2xM9xx+d7f+s\r\n"
  6672. "mPzN+WIEg5GJDYZDjAzHG5BNvi/FfM1C9dOtjv2dAoGAF0t5KmwbjWHBhcVqO4Ic\r\n"
  6673. "BVvN3BIlc1ue2YRXEDlxY5b0r8N4XceMgKmW18OHApZxfl8uPDauWZLXOgl4uepv\r\n"
  6674. "whZC3EuWrSyyICNhLY21Ah7hbIEBPF3L3ZsOwC+UErL+dXWLdB56Jgy3gZaBeW7b\r\n"
  6675. "vDrEnocJbqCm7IukhXHOBK8CgYEAwqdHB0hqyNSzIOGY7v9abzB6pUdA3BZiQvEs\r\n"
  6676. "3LjHVd4HPJ2x0N8CgrBIWOE0q8+0hSMmeE96WW/7jD3fPWwCR5zlXknxBQsfv0gP\r\n"
  6677. "3BC5PR0Qdypz+d+9zfMf625kyit4T/hzwhDveZUzHnk1Cf+IG7Q+TOEnLnWAWBED\r\n"
  6678. "ISOWmrUCgYAFEmRxgwAc/u+D6t0syCwAYh6POtscq9Y0i9GyWk89NzgC4NdwwbBH\r\n"
  6679. "4AgahOxIxXx2gxJnq3yfkJfIjwf0s2DyP0kY2y6Ua1OeomPeY9mrIS4tCuDQ6LrE\r\n"
  6680. "TB6l9VGoxJL4fyHnZb8L5gGvnB1bbD8cL6YPaDiOhcRseC9vBiEuVg==\r\n"
  6681. "-----END RSA PRIVATE KEY-----\r\n";
  6682. const char mbedtls_test_cli_crt_rsa[] =
  6683. "-----BEGIN CERTIFICATE-----\r\n"
  6684. "MIIDPzCCAiegAwIBAgIBBDANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDER\r\n"
  6685. "MA8GA1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwHhcN\r\n"
  6686. "MTEwMjEyMTQ0NDA3WhcNMjEwMjEyMTQ0NDA3WjA8MQswCQYDVQQGEwJOTDERMA8G\r\n"
  6687. "A1UEChMIUG9sYXJTU0wxGjAYBgNVBAMTEVBvbGFyU1NMIENsaWVudCAyMIIBIjAN\r\n"
  6688. "BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyHTEzLn5tXnpRdkUYLB9u5Pyax6f\r\n"
  6689. "M60Nj4o8VmXl3ETZzGaFB9X4J7BKNdBjngpuG7fa8H6r7gwQk4ZJGDTzqCrSV/Uu\r\n"
  6690. "1C93KYRhTYJQj6eVSHD1bk2y1RPD0hrt5kPqQhTrdOrA7R/UV06p86jt0uDBMHEw\r\n"
  6691. "MjDV0/YI0FZPRo7yX/k9Z5GIMC5Cst99++UMd//sMcB4j7/Cf8qtbCHWjdmLao5v\r\n"
  6692. "4Jv4EFbMs44TFeY0BGbH7vk2DmqV9gmaBmf0ZXH4yqSxJeD+PIs1BGe64E92hfx/\r\n"
  6693. "/DZrtenNLQNiTrM9AM+vdqBpVoNq0qjU51Bx5rU2BXcFbXvI5MT9TNUhXwIDAQAB\r\n"
  6694. "o00wSzAJBgNVHRMEAjAAMB0GA1UdDgQWBBRxoQBzckAvVHZeM/xSj7zx3WtGITAf\r\n"
  6695. "BgNVHSMEGDAWgBS0WuSls97SUva51aaVD+s+vMf9/zANBgkqhkiG9w0BAQUFAAOC\r\n"
  6696. "AQEAAn86isAM8X+mVwJqeItt6E9slhEQbAofyk+diH1Lh8Y9iLlWQSKbw/UXYjx5\r\n"
  6697. "LLPZcniovxIcARC/BjyZR9g3UwTHNGNm+rwrqa15viuNOFBchykX/Orsk02EH7NR\r\n"
  6698. "Alw5WLPorYjED6cdVQgBl9ot93HdJogRiXCxErM7NC8/eP511mjq+uLDjLKH8ZPQ\r\n"
  6699. "8I4ekHJnroLsDkIwXKGIsvIBHQy2ac/NwHLCQOK6mfum1pRx52V4Utu5dLLjD5bM\r\n"
  6700. "xOBC7KU4xZKuMXXZM6/93Yb51K/J4ahf1TxJlTWXtnzDr9saEYdNy2SKY/6ZiDNH\r\n"
  6701. "D+stpAKiQLAWaAusIWKYEyw9MQ==\r\n"
  6702. "-----END CERTIFICATE-----\r\n";
  6703. const char mbedtls_test_cli_key_rsa[] =
  6704. "-----BEGIN RSA PRIVATE KEY-----\r\n"
  6705. "MIIEpAIBAAKCAQEAyHTEzLn5tXnpRdkUYLB9u5Pyax6fM60Nj4o8VmXl3ETZzGaF\r\n"
  6706. "B9X4J7BKNdBjngpuG7fa8H6r7gwQk4ZJGDTzqCrSV/Uu1C93KYRhTYJQj6eVSHD1\r\n"
  6707. "bk2y1RPD0hrt5kPqQhTrdOrA7R/UV06p86jt0uDBMHEwMjDV0/YI0FZPRo7yX/k9\r\n"
  6708. "Z5GIMC5Cst99++UMd//sMcB4j7/Cf8qtbCHWjdmLao5v4Jv4EFbMs44TFeY0BGbH\r\n"
  6709. "7vk2DmqV9gmaBmf0ZXH4yqSxJeD+PIs1BGe64E92hfx//DZrtenNLQNiTrM9AM+v\r\n"
  6710. "dqBpVoNq0qjU51Bx5rU2BXcFbXvI5MT9TNUhXwIDAQABAoIBAGdNtfYDiap6bzst\r\n"
  6711. "yhCiI8m9TtrhZw4MisaEaN/ll3XSjaOG2dvV6xMZCMV+5TeXDHOAZnY18Yi18vzz\r\n"
  6712. "4Ut2TnNFzizCECYNaA2fST3WgInnxUkV3YXAyP6CNxJaCmv2aA0yFr2kFVSeaKGt\r\n"
  6713. "ymvljNp2NVkvm7Th8fBQBO7I7AXhz43k0mR7XmPgewe8ApZOG3hstkOaMvbWAvWA\r\n"
  6714. "zCZupdDjZYjOJqlA4eEA4H8/w7F83r5CugeBE8LgEREjLPiyejrU5H1fubEY+h0d\r\n"
  6715. "l5HZBJ68ybTXfQ5U9o/QKA3dd0toBEhhdRUDGzWtjvwkEQfqF1reGWj/tod/gCpf\r\n"
  6716. "DFi6X0ECgYEA4wOv/pjSC3ty6TuOvKX2rOUiBrLXXv2JSxZnMoMiWI5ipLQt+RYT\r\n"
  6717. "VPafL/m7Dn6MbwjayOkcZhBwk5CNz5A6Q4lJ64Mq/lqHznRCQQ2Mc1G8eyDF/fYL\r\n"
  6718. "Ze2pLvwP9VD5jTc2miDfw+MnvJhywRRLcemDFP8k4hQVtm8PMp3ZmNECgYEA4gz7\r\n"
  6719. "wzObR4gn8ibe617uQPZjWzUj9dUHYd+in1gwBCIrtNnaRn9I9U/Q6tegRYpii4ys\r\n"
  6720. "c176NmU+umy6XmuSKV5qD9bSpZWG2nLFnslrN15Lm3fhZxoeMNhBaEDTnLT26yoi\r\n"
  6721. "33gp0mSSWy94ZEqipms+ULF6sY1ZtFW6tpGFoy8CgYAQHhnnvJflIs2ky4q10B60\r\n"
  6722. "ZcxFp3rtDpkp0JxhFLhiizFrujMtZSjYNm5U7KkgPVHhLELEUvCmOnKTt4ap/vZ0\r\n"
  6723. "BxJNe1GZH3pW6SAvGDQpl9sG7uu/vTFP+lCxukmzxB0DrrDcvorEkKMom7ZCCRvW\r\n"
  6724. "KZsZ6YeH2Z81BauRj218kQKBgQCUV/DgKP2985xDTT79N08jUo3hTP5MVYCCuj/+\r\n"
  6725. "UeEw1TvZcx3LJby7P6Xad6a1/BqveaGyFKIfEFIaBUBItk801sDDpDaYc4gL00Xc\r\n"
  6726. "7lFuBHOZkxJYlss5QrGpuOEl9ZwUt5IrFLBdYaKqNHzNVC1pCPfb/JyH6Dr2HUxq\r\n"
  6727. "gxUwAQKBgQCcU6G2L8AG9d9c0UpOyL1tMvFe5Ttw0KjlQVdsh1MP6yigYo9DYuwu\r\n"
  6728. "bHFVW2r0dBTqegP2/KTOxKzaHfC1qf0RGDsUoJCNJrd1cwoCLG8P2EF4w3OBrKqv\r\n"
  6729. "8u4ytY0F+Vlanj5lm3TaoHSVF1+NWPyOTiwevIECGKwSxvlki4fDAA==\r\n"
  6730. "-----END RSA PRIVATE KEY-----\r\n";
  6731. const size_t mbedtls_test_ca_crt_rsa_len = sizeof( mbedtls_test_ca_crt_rsa );
  6732. const size_t mbedtls_test_ca_key_rsa_len = sizeof( mbedtls_test_ca_key_rsa );
  6733. const size_t mbedtls_test_ca_pwd_rsa_len = sizeof( mbedtls_test_ca_pwd_rsa ) - 1;
  6734. const size_t mbedtls_test_srv_crt_rsa_len = sizeof( mbedtls_test_srv_crt_rsa );
  6735. const size_t mbedtls_test_srv_key_rsa_len = sizeof( mbedtls_test_srv_key_rsa );
  6736. const size_t mbedtls_test_cli_crt_rsa_len = sizeof( mbedtls_test_cli_crt_rsa );
  6737. const size_t mbedtls_test_cli_key_rsa_len = sizeof( mbedtls_test_cli_key_rsa );
  6738. #else
  6739. #define TEST_CA_CRT_RSA
  6740. #endif /* MBEDTLS_RSA_C */
  6741. #if defined(MBEDTLS_PEM_PARSE_C)
  6742. /* Concatenation of all available CA certificates */
  6743. const char mbedtls_test_cas_pem[] = TEST_CA_CRT_RSA TEST_CA_CRT_EC;
  6744. const size_t mbedtls_test_cas_pem_len = sizeof( mbedtls_test_cas_pem );
  6745. #endif
  6746. /* List of all available CA certificates */
  6747. const char * mbedtls_test_cas[] = {
  6748. #if defined(MBEDTLS_RSA_C)
  6749. mbedtls_test_ca_crt_rsa,
  6750. #endif
  6751. #if defined(MBEDTLS_ECDSA_C)
  6752. mbedtls_test_ca_crt_ec,
  6753. #endif
  6754. NULL
  6755. };
  6756. const size_t mbedtls_test_cas_len[] = {
  6757. #if defined(MBEDTLS_RSA_C)
  6758. sizeof( mbedtls_test_ca_crt_rsa ),
  6759. #endif
  6760. #if defined(MBEDTLS_ECDSA_C)
  6761. sizeof( mbedtls_test_ca_crt_ec ),
  6762. #endif
  6763. 0
  6764. };
  6765. #if defined(MBEDTLS_RSA_C)
  6766. const char *mbedtls_test_ca_crt = mbedtls_test_ca_crt_rsa;
  6767. const char *mbedtls_test_ca_key = mbedtls_test_ca_key_rsa;
  6768. const char *mbedtls_test_ca_pwd = mbedtls_test_ca_pwd_rsa;
  6769. const char *mbedtls_test_srv_crt = mbedtls_test_srv_crt_rsa;
  6770. const char *mbedtls_test_srv_key = mbedtls_test_srv_key_rsa;
  6771. const char *mbedtls_test_cli_crt = mbedtls_test_cli_crt_rsa;
  6772. const char *mbedtls_test_cli_key = mbedtls_test_cli_key_rsa;
  6773. const size_t mbedtls_test_ca_crt_len = sizeof( mbedtls_test_ca_crt_rsa );
  6774. const size_t mbedtls_test_ca_key_len = sizeof( mbedtls_test_ca_key_rsa );
  6775. const size_t mbedtls_test_ca_pwd_len = sizeof( mbedtls_test_ca_pwd_rsa ) - 1;
  6776. const size_t mbedtls_test_srv_crt_len = sizeof( mbedtls_test_srv_crt_rsa );
  6777. const size_t mbedtls_test_srv_key_len = sizeof( mbedtls_test_srv_key_rsa );
  6778. const size_t mbedtls_test_cli_crt_len = sizeof( mbedtls_test_cli_crt_rsa );
  6779. const size_t mbedtls_test_cli_key_len = sizeof( mbedtls_test_cli_key_rsa );
  6780. #else /* ! MBEDTLS_RSA_C, so MBEDTLS_ECDSA_C */
  6781. const char *mbedtls_test_ca_crt = mbedtls_test_ca_crt_ec;
  6782. const char *mbedtls_test_ca_key = mbedtls_test_ca_key_ec;
  6783. const char *mbedtls_test_ca_pwd = mbedtls_test_ca_pwd_ec;
  6784. const char *mbedtls_test_srv_crt = mbedtls_test_srv_crt_ec;
  6785. const char *mbedtls_test_srv_key = mbedtls_test_srv_key_ec;
  6786. const char *mbedtls_test_cli_crt = mbedtls_test_cli_crt_ec;
  6787. const char *mbedtls_test_cli_key = mbedtls_test_cli_key_ec;
  6788. const size_t mbedtls_test_ca_crt_len = sizeof( mbedtls_test_ca_crt_ec );
  6789. const size_t mbedtls_test_ca_key_len = sizeof( mbedtls_test_ca_key_ec );
  6790. const size_t mbedtls_test_ca_pwd_len = sizeof( mbedtls_test_ca_pwd_ec ) - 1;
  6791. const size_t mbedtls_test_srv_crt_len = sizeof( mbedtls_test_srv_crt_ec );
  6792. const size_t mbedtls_test_srv_key_len = sizeof( mbedtls_test_srv_key_ec );
  6793. const size_t mbedtls_test_cli_crt_len = sizeof( mbedtls_test_cli_crt_ec );
  6794. const size_t mbedtls_test_cli_key_len = sizeof( mbedtls_test_cli_key_ec );
  6795. #endif /* MBEDTLS_RSA_C */
  6796. #endif /* MBEDTLS_CERTS_C */
  6797. /********* Start of file library/cipher.c ************/
  6798. /**
  6799. * \file cipher.c
  6800. *
  6801. * \brief Generic cipher wrapper for mbed TLS
  6802. *
  6803. * \author Adriaan de Jong <dejong@fox-it.com>
  6804. *
  6805. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  6806. * SPDX-License-Identifier: Apache-2.0
  6807. *
  6808. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  6809. * not use this file except in compliance with the License.
  6810. * You may obtain a copy of the License at
  6811. *
  6812. * http://www.apache.org/licenses/LICENSE-2.0
  6813. *
  6814. * Unless required by applicable law or agreed to in writing, software
  6815. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  6816. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  6817. * See the License for the specific language governing permissions and
  6818. * limitations under the License.
  6819. *
  6820. * This file is part of mbed TLS (https://tls.mbed.org)
  6821. */
  6822. #if !defined(MBEDTLS_CONFIG_FILE)
  6823. #else
  6824. #endif
  6825. #if defined(MBEDTLS_CIPHER_C)
  6826. #include <stdlib.h>
  6827. #include <string.h>
  6828. #if defined(MBEDTLS_GCM_C)
  6829. #endif
  6830. #if defined(MBEDTLS_CCM_C)
  6831. #endif
  6832. #if defined(MBEDTLS_ARC4_C) || defined(MBEDTLS_CIPHER_NULL_CIPHER)
  6833. #define MBEDTLS_CIPHER_MODE_STREAM
  6834. #endif
  6835. /* Implementation that should never be optimized out by the compiler */
  6836. static void cipher_zeroize( void *v, size_t n ) {
  6837. volatile unsigned char *p = v; while( n-- ) *p++ = 0;
  6838. }
  6839. /* Amalgamated Release Mappings */
  6840. #define supported_init cipher_supported_init
  6841. static int supported_init = 0;
  6842. const int *mbedtls_cipher_list( void )
  6843. {
  6844. const mbedtls_cipher_definition_t *def;
  6845. int *type;
  6846. if( ! supported_init )
  6847. {
  6848. def = mbedtls_cipher_definitions;
  6849. type = mbedtls_cipher_supported;
  6850. while( def->type != 0 )
  6851. *type++ = (*def++).type;
  6852. *type = 0;
  6853. supported_init = 1;
  6854. }
  6855. return( mbedtls_cipher_supported );
  6856. }
  6857. const mbedtls_cipher_info_t *mbedtls_cipher_info_from_type( const mbedtls_cipher_type_t cipher_type )
  6858. {
  6859. const mbedtls_cipher_definition_t *def;
  6860. for( def = mbedtls_cipher_definitions; def->info != NULL; def++ )
  6861. if( def->type == cipher_type )
  6862. return( def->info );
  6863. return( NULL );
  6864. }
  6865. const mbedtls_cipher_info_t *mbedtls_cipher_info_from_string( const char *cipher_name )
  6866. {
  6867. const mbedtls_cipher_definition_t *def;
  6868. if( NULL == cipher_name )
  6869. return( NULL );
  6870. for( def = mbedtls_cipher_definitions; def->info != NULL; def++ )
  6871. if( ! strcmp( def->info->name, cipher_name ) )
  6872. return( def->info );
  6873. return( NULL );
  6874. }
  6875. const mbedtls_cipher_info_t *mbedtls_cipher_info_from_values( const mbedtls_cipher_id_t cipher_id,
  6876. int key_bitlen,
  6877. const mbedtls_cipher_mode_t mode )
  6878. {
  6879. const mbedtls_cipher_definition_t *def;
  6880. for( def = mbedtls_cipher_definitions; def->info != NULL; def++ )
  6881. if( def->info->base->cipher == cipher_id &&
  6882. def->info->key_bitlen == (unsigned) key_bitlen &&
  6883. def->info->mode == mode )
  6884. return( def->info );
  6885. return( NULL );
  6886. }
  6887. void mbedtls_cipher_init( mbedtls_cipher_context_t *ctx )
  6888. {
  6889. memset( ctx, 0, sizeof( mbedtls_cipher_context_t ) );
  6890. }
  6891. void mbedtls_cipher_free( mbedtls_cipher_context_t *ctx )
  6892. {
  6893. if( ctx == NULL )
  6894. return;
  6895. if( ctx->cipher_ctx )
  6896. ctx->cipher_info->base->ctx_free_func( ctx->cipher_ctx );
  6897. cipher_zeroize( ctx, sizeof(mbedtls_cipher_context_t) );
  6898. }
  6899. int mbedtls_cipher_setup( mbedtls_cipher_context_t *ctx, const mbedtls_cipher_info_t *cipher_info )
  6900. {
  6901. if( NULL == cipher_info || NULL == ctx )
  6902. return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
  6903. memset( ctx, 0, sizeof( mbedtls_cipher_context_t ) );
  6904. if( NULL == ( ctx->cipher_ctx = cipher_info->base->ctx_alloc_func() ) )
  6905. return( MBEDTLS_ERR_CIPHER_ALLOC_FAILED );
  6906. ctx->cipher_info = cipher_info;
  6907. #if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)
  6908. /*
  6909. * Ignore possible errors caused by a cipher mode that doesn't use padding
  6910. */
  6911. #if defined(MBEDTLS_CIPHER_PADDING_PKCS7)
  6912. (void) mbedtls_cipher_set_padding_mode( ctx, MBEDTLS_PADDING_PKCS7 );
  6913. #else
  6914. (void) mbedtls_cipher_set_padding_mode( ctx, MBEDTLS_PADDING_NONE );
  6915. #endif
  6916. #endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */
  6917. return( 0 );
  6918. }
  6919. int mbedtls_cipher_setkey( mbedtls_cipher_context_t *ctx, const unsigned char *key,
  6920. int key_bitlen, const mbedtls_operation_t operation )
  6921. {
  6922. if( NULL == ctx || NULL == ctx->cipher_info )
  6923. return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
  6924. if( ( ctx->cipher_info->flags & MBEDTLS_CIPHER_VARIABLE_KEY_LEN ) == 0 &&
  6925. (int) ctx->cipher_info->key_bitlen != key_bitlen )
  6926. {
  6927. return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
  6928. }
  6929. ctx->key_bitlen = key_bitlen;
  6930. ctx->operation = operation;
  6931. /*
  6932. * For CFB and CTR mode always use the encryption key schedule
  6933. */
  6934. if( MBEDTLS_ENCRYPT == operation ||
  6935. MBEDTLS_MODE_CFB == ctx->cipher_info->mode ||
  6936. MBEDTLS_MODE_CTR == ctx->cipher_info->mode )
  6937. {
  6938. return ctx->cipher_info->base->setkey_enc_func( ctx->cipher_ctx, key,
  6939. ctx->key_bitlen );
  6940. }
  6941. if( MBEDTLS_DECRYPT == operation )
  6942. return ctx->cipher_info->base->setkey_dec_func( ctx->cipher_ctx, key,
  6943. ctx->key_bitlen );
  6944. return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
  6945. }
  6946. int mbedtls_cipher_set_iv( mbedtls_cipher_context_t *ctx,
  6947. const unsigned char *iv, size_t iv_len )
  6948. {
  6949. size_t actual_iv_size;
  6950. if( NULL == ctx || NULL == ctx->cipher_info || NULL == iv )
  6951. return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
  6952. /* avoid buffer overflow in ctx->iv */
  6953. if( iv_len > MBEDTLS_MAX_IV_LENGTH )
  6954. return( MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE );
  6955. if( ( ctx->cipher_info->flags & MBEDTLS_CIPHER_VARIABLE_IV_LEN ) != 0 )
  6956. actual_iv_size = iv_len;
  6957. else
  6958. {
  6959. actual_iv_size = ctx->cipher_info->iv_size;
  6960. /* avoid reading past the end of input buffer */
  6961. if( actual_iv_size > iv_len )
  6962. return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
  6963. }
  6964. memcpy( ctx->iv, iv, actual_iv_size );
  6965. ctx->iv_size = actual_iv_size;
  6966. return( 0 );
  6967. }
  6968. int mbedtls_cipher_reset( mbedtls_cipher_context_t *ctx )
  6969. {
  6970. if( NULL == ctx || NULL == ctx->cipher_info )
  6971. return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
  6972. ctx->unprocessed_len = 0;
  6973. return( 0 );
  6974. }
  6975. #if defined(MBEDTLS_GCM_C)
  6976. int mbedtls_cipher_update_ad( mbedtls_cipher_context_t *ctx,
  6977. const unsigned char *ad, size_t ad_len )
  6978. {
  6979. if( NULL == ctx || NULL == ctx->cipher_info )
  6980. return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
  6981. if( MBEDTLS_MODE_GCM == ctx->cipher_info->mode )
  6982. {
  6983. return mbedtls_gcm_starts( (mbedtls_gcm_context *) ctx->cipher_ctx, ctx->operation,
  6984. ctx->iv, ctx->iv_size, ad, ad_len );
  6985. }
  6986. return( 0 );
  6987. }
  6988. #endif /* MBEDTLS_GCM_C */
  6989. int mbedtls_cipher_update( mbedtls_cipher_context_t *ctx, const unsigned char *input,
  6990. size_t ilen, unsigned char *output, size_t *olen )
  6991. {
  6992. int ret;
  6993. if( NULL == ctx || NULL == ctx->cipher_info || NULL == olen )
  6994. {
  6995. return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
  6996. }
  6997. *olen = 0;
  6998. if( ctx->cipher_info->mode == MBEDTLS_MODE_ECB )
  6999. {
  7000. if( ilen != mbedtls_cipher_get_block_size( ctx ) )
  7001. return( MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED );
  7002. *olen = ilen;
  7003. if( 0 != ( ret = ctx->cipher_info->base->ecb_func( ctx->cipher_ctx,
  7004. ctx->operation, input, output ) ) )
  7005. {
  7006. return( ret );
  7007. }
  7008. return( 0 );
  7009. }
  7010. #if defined(MBEDTLS_GCM_C)
  7011. if( ctx->cipher_info->mode == MBEDTLS_MODE_GCM )
  7012. {
  7013. *olen = ilen;
  7014. return mbedtls_gcm_update( (mbedtls_gcm_context *) ctx->cipher_ctx, ilen, input,
  7015. output );
  7016. }
  7017. #endif
  7018. if( input == output &&
  7019. ( ctx->unprocessed_len != 0 || ilen % mbedtls_cipher_get_block_size( ctx ) ) )
  7020. {
  7021. return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
  7022. }
  7023. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  7024. if( ctx->cipher_info->mode == MBEDTLS_MODE_CBC )
  7025. {
  7026. size_t copy_len = 0;
  7027. /*
  7028. * If there is not enough data for a full block, cache it.
  7029. */
  7030. if( ( ctx->operation == MBEDTLS_DECRYPT &&
  7031. ilen + ctx->unprocessed_len <= mbedtls_cipher_get_block_size( ctx ) ) ||
  7032. ( ctx->operation == MBEDTLS_ENCRYPT &&
  7033. ilen + ctx->unprocessed_len < mbedtls_cipher_get_block_size( ctx ) ) )
  7034. {
  7035. memcpy( &( ctx->unprocessed_data[ctx->unprocessed_len] ), input,
  7036. ilen );
  7037. ctx->unprocessed_len += ilen;
  7038. return( 0 );
  7039. }
  7040. /*
  7041. * Process cached data first
  7042. */
  7043. if( ctx->unprocessed_len != 0 )
  7044. {
  7045. copy_len = mbedtls_cipher_get_block_size( ctx ) - ctx->unprocessed_len;
  7046. memcpy( &( ctx->unprocessed_data[ctx->unprocessed_len] ), input,
  7047. copy_len );
  7048. if( 0 != ( ret = ctx->cipher_info->base->cbc_func( ctx->cipher_ctx,
  7049. ctx->operation, mbedtls_cipher_get_block_size( ctx ), ctx->iv,
  7050. ctx->unprocessed_data, output ) ) )
  7051. {
  7052. return( ret );
  7053. }
  7054. *olen += mbedtls_cipher_get_block_size( ctx );
  7055. output += mbedtls_cipher_get_block_size( ctx );
  7056. ctx->unprocessed_len = 0;
  7057. input += copy_len;
  7058. ilen -= copy_len;
  7059. }
  7060. /*
  7061. * Cache final, incomplete block
  7062. */
  7063. if( 0 != ilen )
  7064. {
  7065. copy_len = ilen % mbedtls_cipher_get_block_size( ctx );
  7066. if( copy_len == 0 && ctx->operation == MBEDTLS_DECRYPT )
  7067. copy_len = mbedtls_cipher_get_block_size( ctx );
  7068. memcpy( ctx->unprocessed_data, &( input[ilen - copy_len] ),
  7069. copy_len );
  7070. ctx->unprocessed_len += copy_len;
  7071. ilen -= copy_len;
  7072. }
  7073. /*
  7074. * Process remaining full blocks
  7075. */
  7076. if( ilen )
  7077. {
  7078. if( 0 != ( ret = ctx->cipher_info->base->cbc_func( ctx->cipher_ctx,
  7079. ctx->operation, ilen, ctx->iv, input, output ) ) )
  7080. {
  7081. return( ret );
  7082. }
  7083. *olen += ilen;
  7084. }
  7085. return( 0 );
  7086. }
  7087. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  7088. #if defined(MBEDTLS_CIPHER_MODE_CFB)
  7089. if( ctx->cipher_info->mode == MBEDTLS_MODE_CFB )
  7090. {
  7091. if( 0 != ( ret = ctx->cipher_info->base->cfb_func( ctx->cipher_ctx,
  7092. ctx->operation, ilen, &ctx->unprocessed_len, ctx->iv,
  7093. input, output ) ) )
  7094. {
  7095. return( ret );
  7096. }
  7097. *olen = ilen;
  7098. return( 0 );
  7099. }
  7100. #endif /* MBEDTLS_CIPHER_MODE_CFB */
  7101. #if defined(MBEDTLS_CIPHER_MODE_CTR)
  7102. if( ctx->cipher_info->mode == MBEDTLS_MODE_CTR )
  7103. {
  7104. if( 0 != ( ret = ctx->cipher_info->base->ctr_func( ctx->cipher_ctx,
  7105. ilen, &ctx->unprocessed_len, ctx->iv,
  7106. ctx->unprocessed_data, input, output ) ) )
  7107. {
  7108. return( ret );
  7109. }
  7110. *olen = ilen;
  7111. return( 0 );
  7112. }
  7113. #endif /* MBEDTLS_CIPHER_MODE_CTR */
  7114. #if defined(MBEDTLS_CIPHER_MODE_STREAM)
  7115. if( ctx->cipher_info->mode == MBEDTLS_MODE_STREAM )
  7116. {
  7117. if( 0 != ( ret = ctx->cipher_info->base->stream_func( ctx->cipher_ctx,
  7118. ilen, input, output ) ) )
  7119. {
  7120. return( ret );
  7121. }
  7122. *olen = ilen;
  7123. return( 0 );
  7124. }
  7125. #endif /* MBEDTLS_CIPHER_MODE_STREAM */
  7126. return( MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE );
  7127. }
  7128. #if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)
  7129. #if defined(MBEDTLS_CIPHER_PADDING_PKCS7)
  7130. /*
  7131. * PKCS7 (and PKCS5) padding: fill with ll bytes, with ll = padding_len
  7132. */
  7133. static void add_pkcs_padding( unsigned char *output, size_t output_len,
  7134. size_t data_len )
  7135. {
  7136. size_t padding_len = output_len - data_len;
  7137. unsigned char i;
  7138. for( i = 0; i < padding_len; i++ )
  7139. output[data_len + i] = (unsigned char) padding_len;
  7140. }
  7141. static int get_pkcs_padding( unsigned char *input, size_t input_len,
  7142. size_t *data_len )
  7143. {
  7144. size_t i, pad_idx;
  7145. unsigned char padding_len, bad = 0;
  7146. if( NULL == input || NULL == data_len )
  7147. return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
  7148. padding_len = input[input_len - 1];
  7149. *data_len = input_len - padding_len;
  7150. /* Avoid logical || since it results in a branch */
  7151. bad |= padding_len > input_len;
  7152. bad |= padding_len == 0;
  7153. /* The number of bytes checked must be independent of padding_len,
  7154. * so pick input_len, which is usually 8 or 16 (one block) */
  7155. pad_idx = input_len - padding_len;
  7156. for( i = 0; i < input_len; i++ )
  7157. bad |= ( input[i] ^ padding_len ) * ( i >= pad_idx );
  7158. return( MBEDTLS_ERR_CIPHER_INVALID_PADDING * ( bad != 0 ) );
  7159. }
  7160. #endif /* MBEDTLS_CIPHER_PADDING_PKCS7 */
  7161. #if defined(MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS)
  7162. /*
  7163. * One and zeros padding: fill with 80 00 ... 00
  7164. */
  7165. static void add_one_and_zeros_padding( unsigned char *output,
  7166. size_t output_len, size_t data_len )
  7167. {
  7168. size_t padding_len = output_len - data_len;
  7169. unsigned char i = 0;
  7170. output[data_len] = 0x80;
  7171. for( i = 1; i < padding_len; i++ )
  7172. output[data_len + i] = 0x00;
  7173. }
  7174. static int get_one_and_zeros_padding( unsigned char *input, size_t input_len,
  7175. size_t *data_len )
  7176. {
  7177. size_t i;
  7178. unsigned char done = 0, prev_done, bad;
  7179. if( NULL == input || NULL == data_len )
  7180. return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
  7181. bad = 0xFF;
  7182. *data_len = 0;
  7183. for( i = input_len; i > 0; i-- )
  7184. {
  7185. prev_done = done;
  7186. done |= ( input[i-1] != 0 );
  7187. *data_len |= ( i - 1 ) * ( done != prev_done );
  7188. bad &= ( input[i-1] ^ 0x80 ) | ( done == prev_done );
  7189. }
  7190. return( MBEDTLS_ERR_CIPHER_INVALID_PADDING * ( bad != 0 ) );
  7191. }
  7192. #endif /* MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS */
  7193. #if defined(MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN)
  7194. /*
  7195. * Zeros and len padding: fill with 00 ... 00 ll, where ll is padding length
  7196. */
  7197. static void add_zeros_and_len_padding( unsigned char *output,
  7198. size_t output_len, size_t data_len )
  7199. {
  7200. size_t padding_len = output_len - data_len;
  7201. unsigned char i = 0;
  7202. for( i = 1; i < padding_len; i++ )
  7203. output[data_len + i - 1] = 0x00;
  7204. output[output_len - 1] = (unsigned char) padding_len;
  7205. }
  7206. static int get_zeros_and_len_padding( unsigned char *input, size_t input_len,
  7207. size_t *data_len )
  7208. {
  7209. size_t i, pad_idx;
  7210. unsigned char padding_len, bad = 0;
  7211. if( NULL == input || NULL == data_len )
  7212. return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
  7213. padding_len = input[input_len - 1];
  7214. *data_len = input_len - padding_len;
  7215. /* Avoid logical || since it results in a branch */
  7216. bad |= padding_len > input_len;
  7217. bad |= padding_len == 0;
  7218. /* The number of bytes checked must be independent of padding_len */
  7219. pad_idx = input_len - padding_len;
  7220. for( i = 0; i < input_len - 1; i++ )
  7221. bad |= input[i] * ( i >= pad_idx );
  7222. return( MBEDTLS_ERR_CIPHER_INVALID_PADDING * ( bad != 0 ) );
  7223. }
  7224. #endif /* MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN */
  7225. #if defined(MBEDTLS_CIPHER_PADDING_ZEROS)
  7226. /*
  7227. * Zero padding: fill with 00 ... 00
  7228. */
  7229. static void add_zeros_padding( unsigned char *output,
  7230. size_t output_len, size_t data_len )
  7231. {
  7232. size_t i;
  7233. for( i = data_len; i < output_len; i++ )
  7234. output[i] = 0x00;
  7235. }
  7236. static int get_zeros_padding( unsigned char *input, size_t input_len,
  7237. size_t *data_len )
  7238. {
  7239. size_t i;
  7240. unsigned char done = 0, prev_done;
  7241. if( NULL == input || NULL == data_len )
  7242. return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
  7243. *data_len = 0;
  7244. for( i = input_len; i > 0; i-- )
  7245. {
  7246. prev_done = done;
  7247. done |= ( input[i-1] != 0 );
  7248. *data_len |= i * ( done != prev_done );
  7249. }
  7250. return( 0 );
  7251. }
  7252. #endif /* MBEDTLS_CIPHER_PADDING_ZEROS */
  7253. /*
  7254. * No padding: don't pad :)
  7255. *
  7256. * There is no add_padding function (check for NULL in mbedtls_cipher_finish)
  7257. * but a trivial get_padding function
  7258. */
  7259. static int get_no_padding( unsigned char *input, size_t input_len,
  7260. size_t *data_len )
  7261. {
  7262. if( NULL == input || NULL == data_len )
  7263. return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
  7264. *data_len = input_len;
  7265. return( 0 );
  7266. }
  7267. #endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */
  7268. int mbedtls_cipher_finish( mbedtls_cipher_context_t *ctx,
  7269. unsigned char *output, size_t *olen )
  7270. {
  7271. if( NULL == ctx || NULL == ctx->cipher_info || NULL == olen )
  7272. return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
  7273. *olen = 0;
  7274. if( MBEDTLS_MODE_CFB == ctx->cipher_info->mode ||
  7275. MBEDTLS_MODE_CTR == ctx->cipher_info->mode ||
  7276. MBEDTLS_MODE_GCM == ctx->cipher_info->mode ||
  7277. MBEDTLS_MODE_STREAM == ctx->cipher_info->mode )
  7278. {
  7279. return( 0 );
  7280. }
  7281. if( MBEDTLS_MODE_ECB == ctx->cipher_info->mode )
  7282. {
  7283. if( ctx->unprocessed_len != 0 )
  7284. return( MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED );
  7285. return( 0 );
  7286. }
  7287. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  7288. if( MBEDTLS_MODE_CBC == ctx->cipher_info->mode )
  7289. {
  7290. int ret = 0;
  7291. if( MBEDTLS_ENCRYPT == ctx->operation )
  7292. {
  7293. /* check for 'no padding' mode */
  7294. if( NULL == ctx->add_padding )
  7295. {
  7296. if( 0 != ctx->unprocessed_len )
  7297. return( MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED );
  7298. return( 0 );
  7299. }
  7300. ctx->add_padding( ctx->unprocessed_data, mbedtls_cipher_get_iv_size( ctx ),
  7301. ctx->unprocessed_len );
  7302. }
  7303. else if( mbedtls_cipher_get_block_size( ctx ) != ctx->unprocessed_len )
  7304. {
  7305. /*
  7306. * For decrypt operations, expect a full block,
  7307. * or an empty block if no padding
  7308. */
  7309. if( NULL == ctx->add_padding && 0 == ctx->unprocessed_len )
  7310. return( 0 );
  7311. return( MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED );
  7312. }
  7313. /* cipher block */
  7314. if( 0 != ( ret = ctx->cipher_info->base->cbc_func( ctx->cipher_ctx,
  7315. ctx->operation, mbedtls_cipher_get_block_size( ctx ), ctx->iv,
  7316. ctx->unprocessed_data, output ) ) )
  7317. {
  7318. return( ret );
  7319. }
  7320. /* Set output size for decryption */
  7321. if( MBEDTLS_DECRYPT == ctx->operation )
  7322. return ctx->get_padding( output, mbedtls_cipher_get_block_size( ctx ),
  7323. olen );
  7324. /* Set output size for encryption */
  7325. *olen = mbedtls_cipher_get_block_size( ctx );
  7326. return( 0 );
  7327. }
  7328. #else
  7329. ((void) output);
  7330. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  7331. return( MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE );
  7332. }
  7333. #if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)
  7334. int mbedtls_cipher_set_padding_mode( mbedtls_cipher_context_t *ctx, mbedtls_cipher_padding_t mode )
  7335. {
  7336. if( NULL == ctx ||
  7337. MBEDTLS_MODE_CBC != ctx->cipher_info->mode )
  7338. {
  7339. return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
  7340. }
  7341. switch( mode )
  7342. {
  7343. #if defined(MBEDTLS_CIPHER_PADDING_PKCS7)
  7344. case MBEDTLS_PADDING_PKCS7:
  7345. ctx->add_padding = add_pkcs_padding;
  7346. ctx->get_padding = get_pkcs_padding;
  7347. break;
  7348. #endif
  7349. #if defined(MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS)
  7350. case MBEDTLS_PADDING_ONE_AND_ZEROS:
  7351. ctx->add_padding = add_one_and_zeros_padding;
  7352. ctx->get_padding = get_one_and_zeros_padding;
  7353. break;
  7354. #endif
  7355. #if defined(MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN)
  7356. case MBEDTLS_PADDING_ZEROS_AND_LEN:
  7357. ctx->add_padding = add_zeros_and_len_padding;
  7358. ctx->get_padding = get_zeros_and_len_padding;
  7359. break;
  7360. #endif
  7361. #if defined(MBEDTLS_CIPHER_PADDING_ZEROS)
  7362. case MBEDTLS_PADDING_ZEROS:
  7363. ctx->add_padding = add_zeros_padding;
  7364. ctx->get_padding = get_zeros_padding;
  7365. break;
  7366. #endif
  7367. case MBEDTLS_PADDING_NONE:
  7368. ctx->add_padding = NULL;
  7369. ctx->get_padding = get_no_padding;
  7370. break;
  7371. default:
  7372. return( MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE );
  7373. }
  7374. return( 0 );
  7375. }
  7376. #endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */
  7377. #if defined(MBEDTLS_GCM_C)
  7378. int mbedtls_cipher_write_tag( mbedtls_cipher_context_t *ctx,
  7379. unsigned char *tag, size_t tag_len )
  7380. {
  7381. if( NULL == ctx || NULL == ctx->cipher_info || NULL == tag )
  7382. return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
  7383. if( MBEDTLS_ENCRYPT != ctx->operation )
  7384. return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
  7385. if( MBEDTLS_MODE_GCM == ctx->cipher_info->mode )
  7386. return mbedtls_gcm_finish( (mbedtls_gcm_context *) ctx->cipher_ctx, tag, tag_len );
  7387. return( 0 );
  7388. }
  7389. int mbedtls_cipher_check_tag( mbedtls_cipher_context_t *ctx,
  7390. const unsigned char *tag, size_t tag_len )
  7391. {
  7392. int ret;
  7393. if( NULL == ctx || NULL == ctx->cipher_info ||
  7394. MBEDTLS_DECRYPT != ctx->operation )
  7395. {
  7396. return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
  7397. }
  7398. if( MBEDTLS_MODE_GCM == ctx->cipher_info->mode )
  7399. {
  7400. unsigned char check_tag[16];
  7401. size_t i;
  7402. int diff;
  7403. if( tag_len > sizeof( check_tag ) )
  7404. return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
  7405. if( 0 != ( ret = mbedtls_gcm_finish( (mbedtls_gcm_context *) ctx->cipher_ctx,
  7406. check_tag, tag_len ) ) )
  7407. {
  7408. return( ret );
  7409. }
  7410. /* Check the tag in "constant-time" */
  7411. for( diff = 0, i = 0; i < tag_len; i++ )
  7412. diff |= tag[i] ^ check_tag[i];
  7413. if( diff != 0 )
  7414. return( MBEDTLS_ERR_CIPHER_AUTH_FAILED );
  7415. return( 0 );
  7416. }
  7417. return( 0 );
  7418. }
  7419. #endif /* MBEDTLS_GCM_C */
  7420. /*
  7421. * Packet-oriented wrapper for non-AEAD modes
  7422. */
  7423. int mbedtls_cipher_crypt( mbedtls_cipher_context_t *ctx,
  7424. const unsigned char *iv, size_t iv_len,
  7425. const unsigned char *input, size_t ilen,
  7426. unsigned char *output, size_t *olen )
  7427. {
  7428. int ret;
  7429. size_t finish_olen;
  7430. if( ( ret = mbedtls_cipher_set_iv( ctx, iv, iv_len ) ) != 0 )
  7431. return( ret );
  7432. if( ( ret = mbedtls_cipher_reset( ctx ) ) != 0 )
  7433. return( ret );
  7434. if( ( ret = mbedtls_cipher_update( ctx, input, ilen, output, olen ) ) != 0 )
  7435. return( ret );
  7436. if( ( ret = mbedtls_cipher_finish( ctx, output + *olen, &finish_olen ) ) != 0 )
  7437. return( ret );
  7438. *olen += finish_olen;
  7439. return( 0 );
  7440. }
  7441. #if defined(MBEDTLS_CIPHER_MODE_AEAD)
  7442. /*
  7443. * Packet-oriented encryption for AEAD modes
  7444. */
  7445. int mbedtls_cipher_auth_encrypt( mbedtls_cipher_context_t *ctx,
  7446. const unsigned char *iv, size_t iv_len,
  7447. const unsigned char *ad, size_t ad_len,
  7448. const unsigned char *input, size_t ilen,
  7449. unsigned char *output, size_t *olen,
  7450. unsigned char *tag, size_t tag_len )
  7451. {
  7452. #if defined(MBEDTLS_GCM_C)
  7453. if( MBEDTLS_MODE_GCM == ctx->cipher_info->mode )
  7454. {
  7455. *olen = ilen;
  7456. return( mbedtls_gcm_crypt_and_tag( ctx->cipher_ctx, MBEDTLS_GCM_ENCRYPT, ilen,
  7457. iv, iv_len, ad, ad_len, input, output,
  7458. tag_len, tag ) );
  7459. }
  7460. #endif /* MBEDTLS_GCM_C */
  7461. #if defined(MBEDTLS_CCM_C)
  7462. if( MBEDTLS_MODE_CCM == ctx->cipher_info->mode )
  7463. {
  7464. *olen = ilen;
  7465. return( mbedtls_ccm_encrypt_and_tag( ctx->cipher_ctx, ilen,
  7466. iv, iv_len, ad, ad_len, input, output,
  7467. tag, tag_len ) );
  7468. }
  7469. #endif /* MBEDTLS_CCM_C */
  7470. return( MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE );
  7471. }
  7472. /*
  7473. * Packet-oriented decryption for AEAD modes
  7474. */
  7475. int mbedtls_cipher_auth_decrypt( mbedtls_cipher_context_t *ctx,
  7476. const unsigned char *iv, size_t iv_len,
  7477. const unsigned char *ad, size_t ad_len,
  7478. const unsigned char *input, size_t ilen,
  7479. unsigned char *output, size_t *olen,
  7480. const unsigned char *tag, size_t tag_len )
  7481. {
  7482. #if defined(MBEDTLS_GCM_C)
  7483. if( MBEDTLS_MODE_GCM == ctx->cipher_info->mode )
  7484. {
  7485. int ret;
  7486. *olen = ilen;
  7487. ret = mbedtls_gcm_auth_decrypt( ctx->cipher_ctx, ilen,
  7488. iv, iv_len, ad, ad_len,
  7489. tag, tag_len, input, output );
  7490. if( ret == MBEDTLS_ERR_GCM_AUTH_FAILED )
  7491. ret = MBEDTLS_ERR_CIPHER_AUTH_FAILED;
  7492. return( ret );
  7493. }
  7494. #endif /* MBEDTLS_GCM_C */
  7495. #if defined(MBEDTLS_CCM_C)
  7496. if( MBEDTLS_MODE_CCM == ctx->cipher_info->mode )
  7497. {
  7498. int ret;
  7499. *olen = ilen;
  7500. ret = mbedtls_ccm_auth_decrypt( ctx->cipher_ctx, ilen,
  7501. iv, iv_len, ad, ad_len,
  7502. input, output, tag, tag_len );
  7503. if( ret == MBEDTLS_ERR_CCM_AUTH_FAILED )
  7504. ret = MBEDTLS_ERR_CIPHER_AUTH_FAILED;
  7505. return( ret );
  7506. }
  7507. #endif /* MBEDTLS_CCM_C */
  7508. return( MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE );
  7509. }
  7510. #endif /* MBEDTLS_CIPHER_MODE_AEAD */
  7511. /* Amalgamated Release Mappings */
  7512. #undef supported_init
  7513. #endif /* MBEDTLS_CIPHER_C */
  7514. /********* Start of file library/cipher_wrap.c ************/
  7515. /**
  7516. * \file cipher_wrap.c
  7517. *
  7518. * \brief Generic cipher wrapper for mbed TLS
  7519. *
  7520. * \author Adriaan de Jong <dejong@fox-it.com>
  7521. *
  7522. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  7523. * SPDX-License-Identifier: Apache-2.0
  7524. *
  7525. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  7526. * not use this file except in compliance with the License.
  7527. * You may obtain a copy of the License at
  7528. *
  7529. * http://www.apache.org/licenses/LICENSE-2.0
  7530. *
  7531. * Unless required by applicable law or agreed to in writing, software
  7532. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  7533. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  7534. * See the License for the specific language governing permissions and
  7535. * limitations under the License.
  7536. *
  7537. * This file is part of mbed TLS (https://tls.mbed.org)
  7538. */
  7539. #if !defined(MBEDTLS_CONFIG_FILE)
  7540. #else
  7541. #endif
  7542. #if defined(MBEDTLS_CIPHER_C)
  7543. #if defined(MBEDTLS_AES_C)
  7544. #endif
  7545. #if defined(MBEDTLS_ARC4_C)
  7546. #endif
  7547. #if defined(MBEDTLS_CAMELLIA_C)
  7548. #endif
  7549. #if defined(MBEDTLS_DES_C)
  7550. #endif
  7551. #if defined(MBEDTLS_BLOWFISH_C)
  7552. #endif
  7553. #if defined(MBEDTLS_GCM_C)
  7554. #endif
  7555. #if defined(MBEDTLS_CCM_C)
  7556. #endif
  7557. #if defined(MBEDTLS_CIPHER_NULL_CIPHER)
  7558. #include <string.h>
  7559. #endif
  7560. #if defined(MBEDTLS_PLATFORM_C)
  7561. #else
  7562. #include <stdlib.h>
  7563. #define mbedtls_calloc calloc
  7564. #define mbedtls_free free
  7565. #endif
  7566. #if defined(MBEDTLS_GCM_C)
  7567. /* shared by all GCM ciphers */
  7568. static void *gcm_ctx_alloc( void )
  7569. {
  7570. void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_gcm_context ) );
  7571. if( ctx != NULL )
  7572. mbedtls_gcm_init( (mbedtls_gcm_context *) ctx );
  7573. return( ctx );
  7574. }
  7575. static void gcm_ctx_free( void *ctx )
  7576. {
  7577. mbedtls_gcm_free( ctx );
  7578. mbedtls_free( ctx );
  7579. }
  7580. #endif /* MBEDTLS_GCM_C */
  7581. #if defined(MBEDTLS_CCM_C)
  7582. /* shared by all CCM ciphers */
  7583. static void *ccm_ctx_alloc( void )
  7584. {
  7585. void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_ccm_context ) );
  7586. if( ctx != NULL )
  7587. mbedtls_ccm_init( (mbedtls_ccm_context *) ctx );
  7588. return( ctx );
  7589. }
  7590. static void ccm_ctx_free( void *ctx )
  7591. {
  7592. mbedtls_ccm_free( ctx );
  7593. mbedtls_free( ctx );
  7594. }
  7595. #endif /* MBEDTLS_CCM_C */
  7596. #if defined(MBEDTLS_AES_C)
  7597. static int aes_crypt_ecb_wrap( void *ctx, mbedtls_operation_t operation,
  7598. const unsigned char *input, unsigned char *output )
  7599. {
  7600. return mbedtls_aes_crypt_ecb( (mbedtls_aes_context *) ctx, operation, input, output );
  7601. }
  7602. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  7603. static int aes_crypt_cbc_wrap( void *ctx, mbedtls_operation_t operation, size_t length,
  7604. unsigned char *iv, const unsigned char *input, unsigned char *output )
  7605. {
  7606. return mbedtls_aes_crypt_cbc( (mbedtls_aes_context *) ctx, operation, length, iv, input,
  7607. output );
  7608. }
  7609. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  7610. #if defined(MBEDTLS_CIPHER_MODE_CFB)
  7611. static int aes_crypt_cfb128_wrap( void *ctx, mbedtls_operation_t operation,
  7612. size_t length, size_t *iv_off, unsigned char *iv,
  7613. const unsigned char *input, unsigned char *output )
  7614. {
  7615. return mbedtls_aes_crypt_cfb128( (mbedtls_aes_context *) ctx, operation, length, iv_off, iv,
  7616. input, output );
  7617. }
  7618. #endif /* MBEDTLS_CIPHER_MODE_CFB */
  7619. #if defined(MBEDTLS_CIPHER_MODE_CTR)
  7620. static int aes_crypt_ctr_wrap( void *ctx, size_t length, size_t *nc_off,
  7621. unsigned char *nonce_counter, unsigned char *stream_block,
  7622. const unsigned char *input, unsigned char *output )
  7623. {
  7624. return mbedtls_aes_crypt_ctr( (mbedtls_aes_context *) ctx, length, nc_off, nonce_counter,
  7625. stream_block, input, output );
  7626. }
  7627. #endif /* MBEDTLS_CIPHER_MODE_CTR */
  7628. static int aes_setkey_dec_wrap( void *ctx, const unsigned char *key,
  7629. unsigned int key_bitlen )
  7630. {
  7631. return mbedtls_aes_setkey_dec( (mbedtls_aes_context *) ctx, key, key_bitlen );
  7632. }
  7633. static int aes_setkey_enc_wrap( void *ctx, const unsigned char *key,
  7634. unsigned int key_bitlen )
  7635. {
  7636. return mbedtls_aes_setkey_enc( (mbedtls_aes_context *) ctx, key, key_bitlen );
  7637. }
  7638. static void * aes_ctx_alloc( void )
  7639. {
  7640. mbedtls_aes_context *aes = mbedtls_calloc( 1, sizeof( mbedtls_aes_context ) );
  7641. if( aes == NULL )
  7642. return( NULL );
  7643. mbedtls_aes_init( aes );
  7644. return( aes );
  7645. }
  7646. static void aes_ctx_free( void *ctx )
  7647. {
  7648. mbedtls_aes_free( (mbedtls_aes_context *) ctx );
  7649. mbedtls_free( ctx );
  7650. }
  7651. static const mbedtls_cipher_base_t aes_info = {
  7652. MBEDTLS_CIPHER_ID_AES,
  7653. aes_crypt_ecb_wrap,
  7654. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  7655. aes_crypt_cbc_wrap,
  7656. #endif
  7657. #if defined(MBEDTLS_CIPHER_MODE_CFB)
  7658. aes_crypt_cfb128_wrap,
  7659. #endif
  7660. #if defined(MBEDTLS_CIPHER_MODE_CTR)
  7661. aes_crypt_ctr_wrap,
  7662. #endif
  7663. #if defined(MBEDTLS_CIPHER_MODE_STREAM)
  7664. NULL,
  7665. #endif
  7666. aes_setkey_enc_wrap,
  7667. aes_setkey_dec_wrap,
  7668. aes_ctx_alloc,
  7669. aes_ctx_free
  7670. };
  7671. static const mbedtls_cipher_info_t aes_128_ecb_info = {
  7672. MBEDTLS_CIPHER_AES_128_ECB,
  7673. MBEDTLS_MODE_ECB,
  7674. 128,
  7675. "AES-128-ECB",
  7676. 16,
  7677. 0,
  7678. 16,
  7679. &aes_info
  7680. };
  7681. static const mbedtls_cipher_info_t aes_192_ecb_info = {
  7682. MBEDTLS_CIPHER_AES_192_ECB,
  7683. MBEDTLS_MODE_ECB,
  7684. 192,
  7685. "AES-192-ECB",
  7686. 16,
  7687. 0,
  7688. 16,
  7689. &aes_info
  7690. };
  7691. static const mbedtls_cipher_info_t aes_256_ecb_info = {
  7692. MBEDTLS_CIPHER_AES_256_ECB,
  7693. MBEDTLS_MODE_ECB,
  7694. 256,
  7695. "AES-256-ECB",
  7696. 16,
  7697. 0,
  7698. 16,
  7699. &aes_info
  7700. };
  7701. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  7702. static const mbedtls_cipher_info_t aes_128_cbc_info = {
  7703. MBEDTLS_CIPHER_AES_128_CBC,
  7704. MBEDTLS_MODE_CBC,
  7705. 128,
  7706. "AES-128-CBC",
  7707. 16,
  7708. 0,
  7709. 16,
  7710. &aes_info
  7711. };
  7712. static const mbedtls_cipher_info_t aes_192_cbc_info = {
  7713. MBEDTLS_CIPHER_AES_192_CBC,
  7714. MBEDTLS_MODE_CBC,
  7715. 192,
  7716. "AES-192-CBC",
  7717. 16,
  7718. 0,
  7719. 16,
  7720. &aes_info
  7721. };
  7722. static const mbedtls_cipher_info_t aes_256_cbc_info = {
  7723. MBEDTLS_CIPHER_AES_256_CBC,
  7724. MBEDTLS_MODE_CBC,
  7725. 256,
  7726. "AES-256-CBC",
  7727. 16,
  7728. 0,
  7729. 16,
  7730. &aes_info
  7731. };
  7732. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  7733. #if defined(MBEDTLS_CIPHER_MODE_CFB)
  7734. static const mbedtls_cipher_info_t aes_128_cfb128_info = {
  7735. MBEDTLS_CIPHER_AES_128_CFB128,
  7736. MBEDTLS_MODE_CFB,
  7737. 128,
  7738. "AES-128-CFB128",
  7739. 16,
  7740. 0,
  7741. 16,
  7742. &aes_info
  7743. };
  7744. static const mbedtls_cipher_info_t aes_192_cfb128_info = {
  7745. MBEDTLS_CIPHER_AES_192_CFB128,
  7746. MBEDTLS_MODE_CFB,
  7747. 192,
  7748. "AES-192-CFB128",
  7749. 16,
  7750. 0,
  7751. 16,
  7752. &aes_info
  7753. };
  7754. static const mbedtls_cipher_info_t aes_256_cfb128_info = {
  7755. MBEDTLS_CIPHER_AES_256_CFB128,
  7756. MBEDTLS_MODE_CFB,
  7757. 256,
  7758. "AES-256-CFB128",
  7759. 16,
  7760. 0,
  7761. 16,
  7762. &aes_info
  7763. };
  7764. #endif /* MBEDTLS_CIPHER_MODE_CFB */
  7765. #if defined(MBEDTLS_CIPHER_MODE_CTR)
  7766. static const mbedtls_cipher_info_t aes_128_ctr_info = {
  7767. MBEDTLS_CIPHER_AES_128_CTR,
  7768. MBEDTLS_MODE_CTR,
  7769. 128,
  7770. "AES-128-CTR",
  7771. 16,
  7772. 0,
  7773. 16,
  7774. &aes_info
  7775. };
  7776. static const mbedtls_cipher_info_t aes_192_ctr_info = {
  7777. MBEDTLS_CIPHER_AES_192_CTR,
  7778. MBEDTLS_MODE_CTR,
  7779. 192,
  7780. "AES-192-CTR",
  7781. 16,
  7782. 0,
  7783. 16,
  7784. &aes_info
  7785. };
  7786. static const mbedtls_cipher_info_t aes_256_ctr_info = {
  7787. MBEDTLS_CIPHER_AES_256_CTR,
  7788. MBEDTLS_MODE_CTR,
  7789. 256,
  7790. "AES-256-CTR",
  7791. 16,
  7792. 0,
  7793. 16,
  7794. &aes_info
  7795. };
  7796. #endif /* MBEDTLS_CIPHER_MODE_CTR */
  7797. #if defined(MBEDTLS_GCM_C)
  7798. static int gcm_aes_setkey_wrap( void *ctx, const unsigned char *key,
  7799. unsigned int key_bitlen )
  7800. {
  7801. return mbedtls_gcm_setkey( (mbedtls_gcm_context *) ctx, MBEDTLS_CIPHER_ID_AES,
  7802. key, key_bitlen );
  7803. }
  7804. static const mbedtls_cipher_base_t gcm_aes_info = {
  7805. MBEDTLS_CIPHER_ID_AES,
  7806. NULL,
  7807. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  7808. NULL,
  7809. #endif
  7810. #if defined(MBEDTLS_CIPHER_MODE_CFB)
  7811. NULL,
  7812. #endif
  7813. #if defined(MBEDTLS_CIPHER_MODE_CTR)
  7814. NULL,
  7815. #endif
  7816. #if defined(MBEDTLS_CIPHER_MODE_STREAM)
  7817. NULL,
  7818. #endif
  7819. gcm_aes_setkey_wrap,
  7820. gcm_aes_setkey_wrap,
  7821. gcm_ctx_alloc,
  7822. gcm_ctx_free,
  7823. };
  7824. static const mbedtls_cipher_info_t aes_128_gcm_info = {
  7825. MBEDTLS_CIPHER_AES_128_GCM,
  7826. MBEDTLS_MODE_GCM,
  7827. 128,
  7828. "AES-128-GCM",
  7829. 12,
  7830. MBEDTLS_CIPHER_VARIABLE_IV_LEN,
  7831. 16,
  7832. &gcm_aes_info
  7833. };
  7834. static const mbedtls_cipher_info_t aes_192_gcm_info = {
  7835. MBEDTLS_CIPHER_AES_192_GCM,
  7836. MBEDTLS_MODE_GCM,
  7837. 192,
  7838. "AES-192-GCM",
  7839. 12,
  7840. MBEDTLS_CIPHER_VARIABLE_IV_LEN,
  7841. 16,
  7842. &gcm_aes_info
  7843. };
  7844. static const mbedtls_cipher_info_t aes_256_gcm_info = {
  7845. MBEDTLS_CIPHER_AES_256_GCM,
  7846. MBEDTLS_MODE_GCM,
  7847. 256,
  7848. "AES-256-GCM",
  7849. 12,
  7850. MBEDTLS_CIPHER_VARIABLE_IV_LEN,
  7851. 16,
  7852. &gcm_aes_info
  7853. };
  7854. #endif /* MBEDTLS_GCM_C */
  7855. #if defined(MBEDTLS_CCM_C)
  7856. static int ccm_aes_setkey_wrap( void *ctx, const unsigned char *key,
  7857. unsigned int key_bitlen )
  7858. {
  7859. return mbedtls_ccm_setkey( (mbedtls_ccm_context *) ctx, MBEDTLS_CIPHER_ID_AES,
  7860. key, key_bitlen );
  7861. }
  7862. static const mbedtls_cipher_base_t ccm_aes_info = {
  7863. MBEDTLS_CIPHER_ID_AES,
  7864. NULL,
  7865. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  7866. NULL,
  7867. #endif
  7868. #if defined(MBEDTLS_CIPHER_MODE_CFB)
  7869. NULL,
  7870. #endif
  7871. #if defined(MBEDTLS_CIPHER_MODE_CTR)
  7872. NULL,
  7873. #endif
  7874. #if defined(MBEDTLS_CIPHER_MODE_STREAM)
  7875. NULL,
  7876. #endif
  7877. ccm_aes_setkey_wrap,
  7878. ccm_aes_setkey_wrap,
  7879. ccm_ctx_alloc,
  7880. ccm_ctx_free,
  7881. };
  7882. static const mbedtls_cipher_info_t aes_128_ccm_info = {
  7883. MBEDTLS_CIPHER_AES_128_CCM,
  7884. MBEDTLS_MODE_CCM,
  7885. 128,
  7886. "AES-128-CCM",
  7887. 12,
  7888. MBEDTLS_CIPHER_VARIABLE_IV_LEN,
  7889. 16,
  7890. &ccm_aes_info
  7891. };
  7892. static const mbedtls_cipher_info_t aes_192_ccm_info = {
  7893. MBEDTLS_CIPHER_AES_192_CCM,
  7894. MBEDTLS_MODE_CCM,
  7895. 192,
  7896. "AES-192-CCM",
  7897. 12,
  7898. MBEDTLS_CIPHER_VARIABLE_IV_LEN,
  7899. 16,
  7900. &ccm_aes_info
  7901. };
  7902. static const mbedtls_cipher_info_t aes_256_ccm_info = {
  7903. MBEDTLS_CIPHER_AES_256_CCM,
  7904. MBEDTLS_MODE_CCM,
  7905. 256,
  7906. "AES-256-CCM",
  7907. 12,
  7908. MBEDTLS_CIPHER_VARIABLE_IV_LEN,
  7909. 16,
  7910. &ccm_aes_info
  7911. };
  7912. #endif /* MBEDTLS_CCM_C */
  7913. #endif /* MBEDTLS_AES_C */
  7914. #if defined(MBEDTLS_CAMELLIA_C)
  7915. static int camellia_crypt_ecb_wrap( void *ctx, mbedtls_operation_t operation,
  7916. const unsigned char *input, unsigned char *output )
  7917. {
  7918. return mbedtls_camellia_crypt_ecb( (mbedtls_camellia_context *) ctx, operation, input,
  7919. output );
  7920. }
  7921. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  7922. static int camellia_crypt_cbc_wrap( void *ctx, mbedtls_operation_t operation,
  7923. size_t length, unsigned char *iv,
  7924. const unsigned char *input, unsigned char *output )
  7925. {
  7926. return mbedtls_camellia_crypt_cbc( (mbedtls_camellia_context *) ctx, operation, length, iv,
  7927. input, output );
  7928. }
  7929. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  7930. #if defined(MBEDTLS_CIPHER_MODE_CFB)
  7931. static int camellia_crypt_cfb128_wrap( void *ctx, mbedtls_operation_t operation,
  7932. size_t length, size_t *iv_off, unsigned char *iv,
  7933. const unsigned char *input, unsigned char *output )
  7934. {
  7935. return mbedtls_camellia_crypt_cfb128( (mbedtls_camellia_context *) ctx, operation, length,
  7936. iv_off, iv, input, output );
  7937. }
  7938. #endif /* MBEDTLS_CIPHER_MODE_CFB */
  7939. #if defined(MBEDTLS_CIPHER_MODE_CTR)
  7940. static int camellia_crypt_ctr_wrap( void *ctx, size_t length, size_t *nc_off,
  7941. unsigned char *nonce_counter, unsigned char *stream_block,
  7942. const unsigned char *input, unsigned char *output )
  7943. {
  7944. return mbedtls_camellia_crypt_ctr( (mbedtls_camellia_context *) ctx, length, nc_off,
  7945. nonce_counter, stream_block, input, output );
  7946. }
  7947. #endif /* MBEDTLS_CIPHER_MODE_CTR */
  7948. static int camellia_setkey_dec_wrap( void *ctx, const unsigned char *key,
  7949. unsigned int key_bitlen )
  7950. {
  7951. return mbedtls_camellia_setkey_dec( (mbedtls_camellia_context *) ctx, key, key_bitlen );
  7952. }
  7953. static int camellia_setkey_enc_wrap( void *ctx, const unsigned char *key,
  7954. unsigned int key_bitlen )
  7955. {
  7956. return mbedtls_camellia_setkey_enc( (mbedtls_camellia_context *) ctx, key, key_bitlen );
  7957. }
  7958. static void * camellia_ctx_alloc( void )
  7959. {
  7960. mbedtls_camellia_context *ctx;
  7961. ctx = mbedtls_calloc( 1, sizeof( mbedtls_camellia_context ) );
  7962. if( ctx == NULL )
  7963. return( NULL );
  7964. mbedtls_camellia_init( ctx );
  7965. return( ctx );
  7966. }
  7967. static void camellia_ctx_free( void *ctx )
  7968. {
  7969. mbedtls_camellia_free( (mbedtls_camellia_context *) ctx );
  7970. mbedtls_free( ctx );
  7971. }
  7972. static const mbedtls_cipher_base_t camellia_info = {
  7973. MBEDTLS_CIPHER_ID_CAMELLIA,
  7974. camellia_crypt_ecb_wrap,
  7975. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  7976. camellia_crypt_cbc_wrap,
  7977. #endif
  7978. #if defined(MBEDTLS_CIPHER_MODE_CFB)
  7979. camellia_crypt_cfb128_wrap,
  7980. #endif
  7981. #if defined(MBEDTLS_CIPHER_MODE_CTR)
  7982. camellia_crypt_ctr_wrap,
  7983. #endif
  7984. #if defined(MBEDTLS_CIPHER_MODE_STREAM)
  7985. NULL,
  7986. #endif
  7987. camellia_setkey_enc_wrap,
  7988. camellia_setkey_dec_wrap,
  7989. camellia_ctx_alloc,
  7990. camellia_ctx_free
  7991. };
  7992. static const mbedtls_cipher_info_t camellia_128_ecb_info = {
  7993. MBEDTLS_CIPHER_CAMELLIA_128_ECB,
  7994. MBEDTLS_MODE_ECB,
  7995. 128,
  7996. "CAMELLIA-128-ECB",
  7997. 16,
  7998. 0,
  7999. 16,
  8000. &camellia_info
  8001. };
  8002. static const mbedtls_cipher_info_t camellia_192_ecb_info = {
  8003. MBEDTLS_CIPHER_CAMELLIA_192_ECB,
  8004. MBEDTLS_MODE_ECB,
  8005. 192,
  8006. "CAMELLIA-192-ECB",
  8007. 16,
  8008. 0,
  8009. 16,
  8010. &camellia_info
  8011. };
  8012. static const mbedtls_cipher_info_t camellia_256_ecb_info = {
  8013. MBEDTLS_CIPHER_CAMELLIA_256_ECB,
  8014. MBEDTLS_MODE_ECB,
  8015. 256,
  8016. "CAMELLIA-256-ECB",
  8017. 16,
  8018. 0,
  8019. 16,
  8020. &camellia_info
  8021. };
  8022. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  8023. static const mbedtls_cipher_info_t camellia_128_cbc_info = {
  8024. MBEDTLS_CIPHER_CAMELLIA_128_CBC,
  8025. MBEDTLS_MODE_CBC,
  8026. 128,
  8027. "CAMELLIA-128-CBC",
  8028. 16,
  8029. 0,
  8030. 16,
  8031. &camellia_info
  8032. };
  8033. static const mbedtls_cipher_info_t camellia_192_cbc_info = {
  8034. MBEDTLS_CIPHER_CAMELLIA_192_CBC,
  8035. MBEDTLS_MODE_CBC,
  8036. 192,
  8037. "CAMELLIA-192-CBC",
  8038. 16,
  8039. 0,
  8040. 16,
  8041. &camellia_info
  8042. };
  8043. static const mbedtls_cipher_info_t camellia_256_cbc_info = {
  8044. MBEDTLS_CIPHER_CAMELLIA_256_CBC,
  8045. MBEDTLS_MODE_CBC,
  8046. 256,
  8047. "CAMELLIA-256-CBC",
  8048. 16,
  8049. 0,
  8050. 16,
  8051. &camellia_info
  8052. };
  8053. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  8054. #if defined(MBEDTLS_CIPHER_MODE_CFB)
  8055. static const mbedtls_cipher_info_t camellia_128_cfb128_info = {
  8056. MBEDTLS_CIPHER_CAMELLIA_128_CFB128,
  8057. MBEDTLS_MODE_CFB,
  8058. 128,
  8059. "CAMELLIA-128-CFB128",
  8060. 16,
  8061. 0,
  8062. 16,
  8063. &camellia_info
  8064. };
  8065. static const mbedtls_cipher_info_t camellia_192_cfb128_info = {
  8066. MBEDTLS_CIPHER_CAMELLIA_192_CFB128,
  8067. MBEDTLS_MODE_CFB,
  8068. 192,
  8069. "CAMELLIA-192-CFB128",
  8070. 16,
  8071. 0,
  8072. 16,
  8073. &camellia_info
  8074. };
  8075. static const mbedtls_cipher_info_t camellia_256_cfb128_info = {
  8076. MBEDTLS_CIPHER_CAMELLIA_256_CFB128,
  8077. MBEDTLS_MODE_CFB,
  8078. 256,
  8079. "CAMELLIA-256-CFB128",
  8080. 16,
  8081. 0,
  8082. 16,
  8083. &camellia_info
  8084. };
  8085. #endif /* MBEDTLS_CIPHER_MODE_CFB */
  8086. #if defined(MBEDTLS_CIPHER_MODE_CTR)
  8087. static const mbedtls_cipher_info_t camellia_128_ctr_info = {
  8088. MBEDTLS_CIPHER_CAMELLIA_128_CTR,
  8089. MBEDTLS_MODE_CTR,
  8090. 128,
  8091. "CAMELLIA-128-CTR",
  8092. 16,
  8093. 0,
  8094. 16,
  8095. &camellia_info
  8096. };
  8097. static const mbedtls_cipher_info_t camellia_192_ctr_info = {
  8098. MBEDTLS_CIPHER_CAMELLIA_192_CTR,
  8099. MBEDTLS_MODE_CTR,
  8100. 192,
  8101. "CAMELLIA-192-CTR",
  8102. 16,
  8103. 0,
  8104. 16,
  8105. &camellia_info
  8106. };
  8107. static const mbedtls_cipher_info_t camellia_256_ctr_info = {
  8108. MBEDTLS_CIPHER_CAMELLIA_256_CTR,
  8109. MBEDTLS_MODE_CTR,
  8110. 256,
  8111. "CAMELLIA-256-CTR",
  8112. 16,
  8113. 0,
  8114. 16,
  8115. &camellia_info
  8116. };
  8117. #endif /* MBEDTLS_CIPHER_MODE_CTR */
  8118. #if defined(MBEDTLS_GCM_C)
  8119. static int gcm_camellia_setkey_wrap( void *ctx, const unsigned char *key,
  8120. unsigned int key_bitlen )
  8121. {
  8122. return mbedtls_gcm_setkey( (mbedtls_gcm_context *) ctx, MBEDTLS_CIPHER_ID_CAMELLIA,
  8123. key, key_bitlen );
  8124. }
  8125. static const mbedtls_cipher_base_t gcm_camellia_info = {
  8126. MBEDTLS_CIPHER_ID_CAMELLIA,
  8127. NULL,
  8128. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  8129. NULL,
  8130. #endif
  8131. #if defined(MBEDTLS_CIPHER_MODE_CFB)
  8132. NULL,
  8133. #endif
  8134. #if defined(MBEDTLS_CIPHER_MODE_CTR)
  8135. NULL,
  8136. #endif
  8137. #if defined(MBEDTLS_CIPHER_MODE_STREAM)
  8138. NULL,
  8139. #endif
  8140. gcm_camellia_setkey_wrap,
  8141. gcm_camellia_setkey_wrap,
  8142. gcm_ctx_alloc,
  8143. gcm_ctx_free,
  8144. };
  8145. static const mbedtls_cipher_info_t camellia_128_gcm_info = {
  8146. MBEDTLS_CIPHER_CAMELLIA_128_GCM,
  8147. MBEDTLS_MODE_GCM,
  8148. 128,
  8149. "CAMELLIA-128-GCM",
  8150. 12,
  8151. MBEDTLS_CIPHER_VARIABLE_IV_LEN,
  8152. 16,
  8153. &gcm_camellia_info
  8154. };
  8155. static const mbedtls_cipher_info_t camellia_192_gcm_info = {
  8156. MBEDTLS_CIPHER_CAMELLIA_192_GCM,
  8157. MBEDTLS_MODE_GCM,
  8158. 192,
  8159. "CAMELLIA-192-GCM",
  8160. 12,
  8161. MBEDTLS_CIPHER_VARIABLE_IV_LEN,
  8162. 16,
  8163. &gcm_camellia_info
  8164. };
  8165. static const mbedtls_cipher_info_t camellia_256_gcm_info = {
  8166. MBEDTLS_CIPHER_CAMELLIA_256_GCM,
  8167. MBEDTLS_MODE_GCM,
  8168. 256,
  8169. "CAMELLIA-256-GCM",
  8170. 12,
  8171. MBEDTLS_CIPHER_VARIABLE_IV_LEN,
  8172. 16,
  8173. &gcm_camellia_info
  8174. };
  8175. #endif /* MBEDTLS_GCM_C */
  8176. #if defined(MBEDTLS_CCM_C)
  8177. static int ccm_camellia_setkey_wrap( void *ctx, const unsigned char *key,
  8178. unsigned int key_bitlen )
  8179. {
  8180. return mbedtls_ccm_setkey( (mbedtls_ccm_context *) ctx, MBEDTLS_CIPHER_ID_CAMELLIA,
  8181. key, key_bitlen );
  8182. }
  8183. static const mbedtls_cipher_base_t ccm_camellia_info = {
  8184. MBEDTLS_CIPHER_ID_CAMELLIA,
  8185. NULL,
  8186. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  8187. NULL,
  8188. #endif
  8189. #if defined(MBEDTLS_CIPHER_MODE_CFB)
  8190. NULL,
  8191. #endif
  8192. #if defined(MBEDTLS_CIPHER_MODE_CTR)
  8193. NULL,
  8194. #endif
  8195. #if defined(MBEDTLS_CIPHER_MODE_STREAM)
  8196. NULL,
  8197. #endif
  8198. ccm_camellia_setkey_wrap,
  8199. ccm_camellia_setkey_wrap,
  8200. ccm_ctx_alloc,
  8201. ccm_ctx_free,
  8202. };
  8203. static const mbedtls_cipher_info_t camellia_128_ccm_info = {
  8204. MBEDTLS_CIPHER_CAMELLIA_128_CCM,
  8205. MBEDTLS_MODE_CCM,
  8206. 128,
  8207. "CAMELLIA-128-CCM",
  8208. 12,
  8209. MBEDTLS_CIPHER_VARIABLE_IV_LEN,
  8210. 16,
  8211. &ccm_camellia_info
  8212. };
  8213. static const mbedtls_cipher_info_t camellia_192_ccm_info = {
  8214. MBEDTLS_CIPHER_CAMELLIA_192_CCM,
  8215. MBEDTLS_MODE_CCM,
  8216. 192,
  8217. "CAMELLIA-192-CCM",
  8218. 12,
  8219. MBEDTLS_CIPHER_VARIABLE_IV_LEN,
  8220. 16,
  8221. &ccm_camellia_info
  8222. };
  8223. static const mbedtls_cipher_info_t camellia_256_ccm_info = {
  8224. MBEDTLS_CIPHER_CAMELLIA_256_CCM,
  8225. MBEDTLS_MODE_CCM,
  8226. 256,
  8227. "CAMELLIA-256-CCM",
  8228. 12,
  8229. MBEDTLS_CIPHER_VARIABLE_IV_LEN,
  8230. 16,
  8231. &ccm_camellia_info
  8232. };
  8233. #endif /* MBEDTLS_CCM_C */
  8234. #endif /* MBEDTLS_CAMELLIA_C */
  8235. #if defined(MBEDTLS_DES_C)
  8236. static int des_crypt_ecb_wrap( void *ctx, mbedtls_operation_t operation,
  8237. const unsigned char *input, unsigned char *output )
  8238. {
  8239. ((void) operation);
  8240. return mbedtls_des_crypt_ecb( (mbedtls_des_context *) ctx, input, output );
  8241. }
  8242. static int des3_crypt_ecb_wrap( void *ctx, mbedtls_operation_t operation,
  8243. const unsigned char *input, unsigned char *output )
  8244. {
  8245. ((void) operation);
  8246. return mbedtls_des3_crypt_ecb( (mbedtls_des3_context *) ctx, input, output );
  8247. }
  8248. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  8249. static int des_crypt_cbc_wrap( void *ctx, mbedtls_operation_t operation, size_t length,
  8250. unsigned char *iv, const unsigned char *input, unsigned char *output )
  8251. {
  8252. return mbedtls_des_crypt_cbc( (mbedtls_des_context *) ctx, operation, length, iv, input,
  8253. output );
  8254. }
  8255. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  8256. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  8257. static int des3_crypt_cbc_wrap( void *ctx, mbedtls_operation_t operation, size_t length,
  8258. unsigned char *iv, const unsigned char *input, unsigned char *output )
  8259. {
  8260. return mbedtls_des3_crypt_cbc( (mbedtls_des3_context *) ctx, operation, length, iv, input,
  8261. output );
  8262. }
  8263. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  8264. static int des_setkey_dec_wrap( void *ctx, const unsigned char *key,
  8265. unsigned int key_bitlen )
  8266. {
  8267. ((void) key_bitlen);
  8268. return mbedtls_des_setkey_dec( (mbedtls_des_context *) ctx, key );
  8269. }
  8270. static int des_setkey_enc_wrap( void *ctx, const unsigned char *key,
  8271. unsigned int key_bitlen )
  8272. {
  8273. ((void) key_bitlen);
  8274. return mbedtls_des_setkey_enc( (mbedtls_des_context *) ctx, key );
  8275. }
  8276. static int des3_set2key_dec_wrap( void *ctx, const unsigned char *key,
  8277. unsigned int key_bitlen )
  8278. {
  8279. ((void) key_bitlen);
  8280. return mbedtls_des3_set2key_dec( (mbedtls_des3_context *) ctx, key );
  8281. }
  8282. static int des3_set2key_enc_wrap( void *ctx, const unsigned char *key,
  8283. unsigned int key_bitlen )
  8284. {
  8285. ((void) key_bitlen);
  8286. return mbedtls_des3_set2key_enc( (mbedtls_des3_context *) ctx, key );
  8287. }
  8288. static int des3_set3key_dec_wrap( void *ctx, const unsigned char *key,
  8289. unsigned int key_bitlen )
  8290. {
  8291. ((void) key_bitlen);
  8292. return mbedtls_des3_set3key_dec( (mbedtls_des3_context *) ctx, key );
  8293. }
  8294. static int des3_set3key_enc_wrap( void *ctx, const unsigned char *key,
  8295. unsigned int key_bitlen )
  8296. {
  8297. ((void) key_bitlen);
  8298. return mbedtls_des3_set3key_enc( (mbedtls_des3_context *) ctx, key );
  8299. }
  8300. static void * des_ctx_alloc( void )
  8301. {
  8302. mbedtls_des_context *des = mbedtls_calloc( 1, sizeof( mbedtls_des_context ) );
  8303. if( des == NULL )
  8304. return( NULL );
  8305. mbedtls_des_init( des );
  8306. return( des );
  8307. }
  8308. static void des_ctx_free( void *ctx )
  8309. {
  8310. mbedtls_des_free( (mbedtls_des_context *) ctx );
  8311. mbedtls_free( ctx );
  8312. }
  8313. static void * des3_ctx_alloc( void )
  8314. {
  8315. mbedtls_des3_context *des3;
  8316. des3 = mbedtls_calloc( 1, sizeof( mbedtls_des3_context ) );
  8317. if( des3 == NULL )
  8318. return( NULL );
  8319. mbedtls_des3_init( des3 );
  8320. return( des3 );
  8321. }
  8322. static void des3_ctx_free( void *ctx )
  8323. {
  8324. mbedtls_des3_free( (mbedtls_des3_context *) ctx );
  8325. mbedtls_free( ctx );
  8326. }
  8327. static const mbedtls_cipher_base_t des_info = {
  8328. MBEDTLS_CIPHER_ID_DES,
  8329. des_crypt_ecb_wrap,
  8330. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  8331. des_crypt_cbc_wrap,
  8332. #endif
  8333. #if defined(MBEDTLS_CIPHER_MODE_CFB)
  8334. NULL,
  8335. #endif
  8336. #if defined(MBEDTLS_CIPHER_MODE_CTR)
  8337. NULL,
  8338. #endif
  8339. #if defined(MBEDTLS_CIPHER_MODE_STREAM)
  8340. NULL,
  8341. #endif
  8342. des_setkey_enc_wrap,
  8343. des_setkey_dec_wrap,
  8344. des_ctx_alloc,
  8345. des_ctx_free
  8346. };
  8347. static const mbedtls_cipher_info_t des_ecb_info = {
  8348. MBEDTLS_CIPHER_DES_ECB,
  8349. MBEDTLS_MODE_ECB,
  8350. MBEDTLS_KEY_LENGTH_DES,
  8351. "DES-ECB",
  8352. 8,
  8353. 0,
  8354. 8,
  8355. &des_info
  8356. };
  8357. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  8358. static const mbedtls_cipher_info_t des_cbc_info = {
  8359. MBEDTLS_CIPHER_DES_CBC,
  8360. MBEDTLS_MODE_CBC,
  8361. MBEDTLS_KEY_LENGTH_DES,
  8362. "DES-CBC",
  8363. 8,
  8364. 0,
  8365. 8,
  8366. &des_info
  8367. };
  8368. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  8369. static const mbedtls_cipher_base_t des_ede_info = {
  8370. MBEDTLS_CIPHER_ID_DES,
  8371. des3_crypt_ecb_wrap,
  8372. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  8373. des3_crypt_cbc_wrap,
  8374. #endif
  8375. #if defined(MBEDTLS_CIPHER_MODE_CFB)
  8376. NULL,
  8377. #endif
  8378. #if defined(MBEDTLS_CIPHER_MODE_CTR)
  8379. NULL,
  8380. #endif
  8381. #if defined(MBEDTLS_CIPHER_MODE_STREAM)
  8382. NULL,
  8383. #endif
  8384. des3_set2key_enc_wrap,
  8385. des3_set2key_dec_wrap,
  8386. des3_ctx_alloc,
  8387. des3_ctx_free
  8388. };
  8389. static const mbedtls_cipher_info_t des_ede_ecb_info = {
  8390. MBEDTLS_CIPHER_DES_EDE_ECB,
  8391. MBEDTLS_MODE_ECB,
  8392. MBEDTLS_KEY_LENGTH_DES_EDE,
  8393. "DES-EDE-ECB",
  8394. 8,
  8395. 0,
  8396. 8,
  8397. &des_ede_info
  8398. };
  8399. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  8400. static const mbedtls_cipher_info_t des_ede_cbc_info = {
  8401. MBEDTLS_CIPHER_DES_EDE_CBC,
  8402. MBEDTLS_MODE_CBC,
  8403. MBEDTLS_KEY_LENGTH_DES_EDE,
  8404. "DES-EDE-CBC",
  8405. 8,
  8406. 0,
  8407. 8,
  8408. &des_ede_info
  8409. };
  8410. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  8411. static const mbedtls_cipher_base_t des_ede3_info = {
  8412. MBEDTLS_CIPHER_ID_3DES,
  8413. des3_crypt_ecb_wrap,
  8414. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  8415. des3_crypt_cbc_wrap,
  8416. #endif
  8417. #if defined(MBEDTLS_CIPHER_MODE_CFB)
  8418. NULL,
  8419. #endif
  8420. #if defined(MBEDTLS_CIPHER_MODE_CTR)
  8421. NULL,
  8422. #endif
  8423. #if defined(MBEDTLS_CIPHER_MODE_STREAM)
  8424. NULL,
  8425. #endif
  8426. des3_set3key_enc_wrap,
  8427. des3_set3key_dec_wrap,
  8428. des3_ctx_alloc,
  8429. des3_ctx_free
  8430. };
  8431. static const mbedtls_cipher_info_t des_ede3_ecb_info = {
  8432. MBEDTLS_CIPHER_DES_EDE3_ECB,
  8433. MBEDTLS_MODE_ECB,
  8434. MBEDTLS_KEY_LENGTH_DES_EDE3,
  8435. "DES-EDE3-ECB",
  8436. 8,
  8437. 0,
  8438. 8,
  8439. &des_ede3_info
  8440. };
  8441. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  8442. static const mbedtls_cipher_info_t des_ede3_cbc_info = {
  8443. MBEDTLS_CIPHER_DES_EDE3_CBC,
  8444. MBEDTLS_MODE_CBC,
  8445. MBEDTLS_KEY_LENGTH_DES_EDE3,
  8446. "DES-EDE3-CBC",
  8447. 8,
  8448. 0,
  8449. 8,
  8450. &des_ede3_info
  8451. };
  8452. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  8453. #endif /* MBEDTLS_DES_C */
  8454. #if defined(MBEDTLS_BLOWFISH_C)
  8455. static int blowfish_crypt_ecb_wrap( void *ctx, mbedtls_operation_t operation,
  8456. const unsigned char *input, unsigned char *output )
  8457. {
  8458. return mbedtls_blowfish_crypt_ecb( (mbedtls_blowfish_context *) ctx, operation, input,
  8459. output );
  8460. }
  8461. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  8462. static int blowfish_crypt_cbc_wrap( void *ctx, mbedtls_operation_t operation,
  8463. size_t length, unsigned char *iv, const unsigned char *input,
  8464. unsigned char *output )
  8465. {
  8466. return mbedtls_blowfish_crypt_cbc( (mbedtls_blowfish_context *) ctx, operation, length, iv,
  8467. input, output );
  8468. }
  8469. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  8470. #if defined(MBEDTLS_CIPHER_MODE_CFB)
  8471. static int blowfish_crypt_cfb64_wrap( void *ctx, mbedtls_operation_t operation,
  8472. size_t length, size_t *iv_off, unsigned char *iv,
  8473. const unsigned char *input, unsigned char *output )
  8474. {
  8475. return mbedtls_blowfish_crypt_cfb64( (mbedtls_blowfish_context *) ctx, operation, length,
  8476. iv_off, iv, input, output );
  8477. }
  8478. #endif /* MBEDTLS_CIPHER_MODE_CFB */
  8479. #if defined(MBEDTLS_CIPHER_MODE_CTR)
  8480. static int blowfish_crypt_ctr_wrap( void *ctx, size_t length, size_t *nc_off,
  8481. unsigned char *nonce_counter, unsigned char *stream_block,
  8482. const unsigned char *input, unsigned char *output )
  8483. {
  8484. return mbedtls_blowfish_crypt_ctr( (mbedtls_blowfish_context *) ctx, length, nc_off,
  8485. nonce_counter, stream_block, input, output );
  8486. }
  8487. #endif /* MBEDTLS_CIPHER_MODE_CTR */
  8488. static int blowfish_setkey_wrap( void *ctx, const unsigned char *key,
  8489. unsigned int key_bitlen )
  8490. {
  8491. return mbedtls_blowfish_setkey( (mbedtls_blowfish_context *) ctx, key, key_bitlen );
  8492. }
  8493. static void * blowfish_ctx_alloc( void )
  8494. {
  8495. mbedtls_blowfish_context *ctx;
  8496. ctx = mbedtls_calloc( 1, sizeof( mbedtls_blowfish_context ) );
  8497. if( ctx == NULL )
  8498. return( NULL );
  8499. mbedtls_blowfish_init( ctx );
  8500. return( ctx );
  8501. }
  8502. static void blowfish_ctx_free( void *ctx )
  8503. {
  8504. mbedtls_blowfish_free( (mbedtls_blowfish_context *) ctx );
  8505. mbedtls_free( ctx );
  8506. }
  8507. static const mbedtls_cipher_base_t blowfish_info = {
  8508. MBEDTLS_CIPHER_ID_BLOWFISH,
  8509. blowfish_crypt_ecb_wrap,
  8510. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  8511. blowfish_crypt_cbc_wrap,
  8512. #endif
  8513. #if defined(MBEDTLS_CIPHER_MODE_CFB)
  8514. blowfish_crypt_cfb64_wrap,
  8515. #endif
  8516. #if defined(MBEDTLS_CIPHER_MODE_CTR)
  8517. blowfish_crypt_ctr_wrap,
  8518. #endif
  8519. #if defined(MBEDTLS_CIPHER_MODE_STREAM)
  8520. NULL,
  8521. #endif
  8522. blowfish_setkey_wrap,
  8523. blowfish_setkey_wrap,
  8524. blowfish_ctx_alloc,
  8525. blowfish_ctx_free
  8526. };
  8527. static const mbedtls_cipher_info_t blowfish_ecb_info = {
  8528. MBEDTLS_CIPHER_BLOWFISH_ECB,
  8529. MBEDTLS_MODE_ECB,
  8530. 128,
  8531. "BLOWFISH-ECB",
  8532. 8,
  8533. MBEDTLS_CIPHER_VARIABLE_KEY_LEN,
  8534. 8,
  8535. &blowfish_info
  8536. };
  8537. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  8538. static const mbedtls_cipher_info_t blowfish_cbc_info = {
  8539. MBEDTLS_CIPHER_BLOWFISH_CBC,
  8540. MBEDTLS_MODE_CBC,
  8541. 128,
  8542. "BLOWFISH-CBC",
  8543. 8,
  8544. MBEDTLS_CIPHER_VARIABLE_KEY_LEN,
  8545. 8,
  8546. &blowfish_info
  8547. };
  8548. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  8549. #if defined(MBEDTLS_CIPHER_MODE_CFB)
  8550. static const mbedtls_cipher_info_t blowfish_cfb64_info = {
  8551. MBEDTLS_CIPHER_BLOWFISH_CFB64,
  8552. MBEDTLS_MODE_CFB,
  8553. 128,
  8554. "BLOWFISH-CFB64",
  8555. 8,
  8556. MBEDTLS_CIPHER_VARIABLE_KEY_LEN,
  8557. 8,
  8558. &blowfish_info
  8559. };
  8560. #endif /* MBEDTLS_CIPHER_MODE_CFB */
  8561. #if defined(MBEDTLS_CIPHER_MODE_CTR)
  8562. static const mbedtls_cipher_info_t blowfish_ctr_info = {
  8563. MBEDTLS_CIPHER_BLOWFISH_CTR,
  8564. MBEDTLS_MODE_CTR,
  8565. 128,
  8566. "BLOWFISH-CTR",
  8567. 8,
  8568. MBEDTLS_CIPHER_VARIABLE_KEY_LEN,
  8569. 8,
  8570. &blowfish_info
  8571. };
  8572. #endif /* MBEDTLS_CIPHER_MODE_CTR */
  8573. #endif /* MBEDTLS_BLOWFISH_C */
  8574. #if defined(MBEDTLS_ARC4_C)
  8575. static int arc4_crypt_stream_wrap( void *ctx, size_t length,
  8576. const unsigned char *input,
  8577. unsigned char *output )
  8578. {
  8579. return( mbedtls_arc4_crypt( (mbedtls_arc4_context *) ctx, length, input, output ) );
  8580. }
  8581. static int arc4_setkey_wrap( void *ctx, const unsigned char *key,
  8582. unsigned int key_bitlen )
  8583. {
  8584. /* we get key_bitlen in bits, arc4 expects it in bytes */
  8585. if( key_bitlen % 8 != 0 )
  8586. return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
  8587. mbedtls_arc4_setup( (mbedtls_arc4_context *) ctx, key, key_bitlen / 8 );
  8588. return( 0 );
  8589. }
  8590. static void * arc4_ctx_alloc( void )
  8591. {
  8592. mbedtls_arc4_context *ctx;
  8593. ctx = mbedtls_calloc( 1, sizeof( mbedtls_arc4_context ) );
  8594. if( ctx == NULL )
  8595. return( NULL );
  8596. mbedtls_arc4_init( ctx );
  8597. return( ctx );
  8598. }
  8599. static void arc4_ctx_free( void *ctx )
  8600. {
  8601. mbedtls_arc4_free( (mbedtls_arc4_context *) ctx );
  8602. mbedtls_free( ctx );
  8603. }
  8604. static const mbedtls_cipher_base_t arc4_base_info = {
  8605. MBEDTLS_CIPHER_ID_ARC4,
  8606. NULL,
  8607. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  8608. NULL,
  8609. #endif
  8610. #if defined(MBEDTLS_CIPHER_MODE_CFB)
  8611. NULL,
  8612. #endif
  8613. #if defined(MBEDTLS_CIPHER_MODE_CTR)
  8614. NULL,
  8615. #endif
  8616. #if defined(MBEDTLS_CIPHER_MODE_STREAM)
  8617. arc4_crypt_stream_wrap,
  8618. #endif
  8619. arc4_setkey_wrap,
  8620. arc4_setkey_wrap,
  8621. arc4_ctx_alloc,
  8622. arc4_ctx_free
  8623. };
  8624. static const mbedtls_cipher_info_t arc4_128_info = {
  8625. MBEDTLS_CIPHER_ARC4_128,
  8626. MBEDTLS_MODE_STREAM,
  8627. 128,
  8628. "ARC4-128",
  8629. 0,
  8630. 0,
  8631. 1,
  8632. &arc4_base_info
  8633. };
  8634. #endif /* MBEDTLS_ARC4_C */
  8635. #if defined(MBEDTLS_CIPHER_NULL_CIPHER)
  8636. static int null_crypt_stream( void *ctx, size_t length,
  8637. const unsigned char *input,
  8638. unsigned char *output )
  8639. {
  8640. ((void) ctx);
  8641. memmove( output, input, length );
  8642. return( 0 );
  8643. }
  8644. static int null_setkey( void *ctx, const unsigned char *key,
  8645. unsigned int key_bitlen )
  8646. {
  8647. ((void) ctx);
  8648. ((void) key);
  8649. ((void) key_bitlen);
  8650. return( 0 );
  8651. }
  8652. static void * null_ctx_alloc( void )
  8653. {
  8654. return( (void *) 1 );
  8655. }
  8656. static void null_ctx_free( void *ctx )
  8657. {
  8658. ((void) ctx);
  8659. }
  8660. static const mbedtls_cipher_base_t null_base_info = {
  8661. MBEDTLS_CIPHER_ID_NULL,
  8662. NULL,
  8663. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  8664. NULL,
  8665. #endif
  8666. #if defined(MBEDTLS_CIPHER_MODE_CFB)
  8667. NULL,
  8668. #endif
  8669. #if defined(MBEDTLS_CIPHER_MODE_CTR)
  8670. NULL,
  8671. #endif
  8672. #if defined(MBEDTLS_CIPHER_MODE_STREAM)
  8673. null_crypt_stream,
  8674. #endif
  8675. null_setkey,
  8676. null_setkey,
  8677. null_ctx_alloc,
  8678. null_ctx_free
  8679. };
  8680. static const mbedtls_cipher_info_t null_cipher_info = {
  8681. MBEDTLS_CIPHER_NULL,
  8682. MBEDTLS_MODE_STREAM,
  8683. 0,
  8684. "NULL",
  8685. 0,
  8686. 0,
  8687. 1,
  8688. &null_base_info
  8689. };
  8690. #endif /* defined(MBEDTLS_CIPHER_NULL_CIPHER) */
  8691. const mbedtls_cipher_definition_t mbedtls_cipher_definitions[] =
  8692. {
  8693. #if defined(MBEDTLS_AES_C)
  8694. { MBEDTLS_CIPHER_AES_128_ECB, &aes_128_ecb_info },
  8695. { MBEDTLS_CIPHER_AES_192_ECB, &aes_192_ecb_info },
  8696. { MBEDTLS_CIPHER_AES_256_ECB, &aes_256_ecb_info },
  8697. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  8698. { MBEDTLS_CIPHER_AES_128_CBC, &aes_128_cbc_info },
  8699. { MBEDTLS_CIPHER_AES_192_CBC, &aes_192_cbc_info },
  8700. { MBEDTLS_CIPHER_AES_256_CBC, &aes_256_cbc_info },
  8701. #endif
  8702. #if defined(MBEDTLS_CIPHER_MODE_CFB)
  8703. { MBEDTLS_CIPHER_AES_128_CFB128, &aes_128_cfb128_info },
  8704. { MBEDTLS_CIPHER_AES_192_CFB128, &aes_192_cfb128_info },
  8705. { MBEDTLS_CIPHER_AES_256_CFB128, &aes_256_cfb128_info },
  8706. #endif
  8707. #if defined(MBEDTLS_CIPHER_MODE_CTR)
  8708. { MBEDTLS_CIPHER_AES_128_CTR, &aes_128_ctr_info },
  8709. { MBEDTLS_CIPHER_AES_192_CTR, &aes_192_ctr_info },
  8710. { MBEDTLS_CIPHER_AES_256_CTR, &aes_256_ctr_info },
  8711. #endif
  8712. #if defined(MBEDTLS_GCM_C)
  8713. { MBEDTLS_CIPHER_AES_128_GCM, &aes_128_gcm_info },
  8714. { MBEDTLS_CIPHER_AES_192_GCM, &aes_192_gcm_info },
  8715. { MBEDTLS_CIPHER_AES_256_GCM, &aes_256_gcm_info },
  8716. #endif
  8717. #if defined(MBEDTLS_CCM_C)
  8718. { MBEDTLS_CIPHER_AES_128_CCM, &aes_128_ccm_info },
  8719. { MBEDTLS_CIPHER_AES_192_CCM, &aes_192_ccm_info },
  8720. { MBEDTLS_CIPHER_AES_256_CCM, &aes_256_ccm_info },
  8721. #endif
  8722. #endif /* MBEDTLS_AES_C */
  8723. #if defined(MBEDTLS_ARC4_C)
  8724. { MBEDTLS_CIPHER_ARC4_128, &arc4_128_info },
  8725. #endif
  8726. #if defined(MBEDTLS_BLOWFISH_C)
  8727. { MBEDTLS_CIPHER_BLOWFISH_ECB, &blowfish_ecb_info },
  8728. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  8729. { MBEDTLS_CIPHER_BLOWFISH_CBC, &blowfish_cbc_info },
  8730. #endif
  8731. #if defined(MBEDTLS_CIPHER_MODE_CFB)
  8732. { MBEDTLS_CIPHER_BLOWFISH_CFB64, &blowfish_cfb64_info },
  8733. #endif
  8734. #if defined(MBEDTLS_CIPHER_MODE_CTR)
  8735. { MBEDTLS_CIPHER_BLOWFISH_CTR, &blowfish_ctr_info },
  8736. #endif
  8737. #endif /* MBEDTLS_BLOWFISH_C */
  8738. #if defined(MBEDTLS_CAMELLIA_C)
  8739. { MBEDTLS_CIPHER_CAMELLIA_128_ECB, &camellia_128_ecb_info },
  8740. { MBEDTLS_CIPHER_CAMELLIA_192_ECB, &camellia_192_ecb_info },
  8741. { MBEDTLS_CIPHER_CAMELLIA_256_ECB, &camellia_256_ecb_info },
  8742. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  8743. { MBEDTLS_CIPHER_CAMELLIA_128_CBC, &camellia_128_cbc_info },
  8744. { MBEDTLS_CIPHER_CAMELLIA_192_CBC, &camellia_192_cbc_info },
  8745. { MBEDTLS_CIPHER_CAMELLIA_256_CBC, &camellia_256_cbc_info },
  8746. #endif
  8747. #if defined(MBEDTLS_CIPHER_MODE_CFB)
  8748. { MBEDTLS_CIPHER_CAMELLIA_128_CFB128, &camellia_128_cfb128_info },
  8749. { MBEDTLS_CIPHER_CAMELLIA_192_CFB128, &camellia_192_cfb128_info },
  8750. { MBEDTLS_CIPHER_CAMELLIA_256_CFB128, &camellia_256_cfb128_info },
  8751. #endif
  8752. #if defined(MBEDTLS_CIPHER_MODE_CTR)
  8753. { MBEDTLS_CIPHER_CAMELLIA_128_CTR, &camellia_128_ctr_info },
  8754. { MBEDTLS_CIPHER_CAMELLIA_192_CTR, &camellia_192_ctr_info },
  8755. { MBEDTLS_CIPHER_CAMELLIA_256_CTR, &camellia_256_ctr_info },
  8756. #endif
  8757. #if defined(MBEDTLS_GCM_C)
  8758. { MBEDTLS_CIPHER_CAMELLIA_128_GCM, &camellia_128_gcm_info },
  8759. { MBEDTLS_CIPHER_CAMELLIA_192_GCM, &camellia_192_gcm_info },
  8760. { MBEDTLS_CIPHER_CAMELLIA_256_GCM, &camellia_256_gcm_info },
  8761. #endif
  8762. #if defined(MBEDTLS_CCM_C)
  8763. { MBEDTLS_CIPHER_CAMELLIA_128_CCM, &camellia_128_ccm_info },
  8764. { MBEDTLS_CIPHER_CAMELLIA_192_CCM, &camellia_192_ccm_info },
  8765. { MBEDTLS_CIPHER_CAMELLIA_256_CCM, &camellia_256_ccm_info },
  8766. #endif
  8767. #endif /* MBEDTLS_CAMELLIA_C */
  8768. #if defined(MBEDTLS_DES_C)
  8769. { MBEDTLS_CIPHER_DES_ECB, &des_ecb_info },
  8770. { MBEDTLS_CIPHER_DES_EDE_ECB, &des_ede_ecb_info },
  8771. { MBEDTLS_CIPHER_DES_EDE3_ECB, &des_ede3_ecb_info },
  8772. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  8773. { MBEDTLS_CIPHER_DES_CBC, &des_cbc_info },
  8774. { MBEDTLS_CIPHER_DES_EDE_CBC, &des_ede_cbc_info },
  8775. { MBEDTLS_CIPHER_DES_EDE3_CBC, &des_ede3_cbc_info },
  8776. #endif
  8777. #endif /* MBEDTLS_DES_C */
  8778. #if defined(MBEDTLS_CIPHER_NULL_CIPHER)
  8779. { MBEDTLS_CIPHER_NULL, &null_cipher_info },
  8780. #endif /* MBEDTLS_CIPHER_NULL_CIPHER */
  8781. { MBEDTLS_CIPHER_NONE, NULL }
  8782. };
  8783. #define NUM_CIPHERS sizeof mbedtls_cipher_definitions / sizeof mbedtls_cipher_definitions[0]
  8784. int mbedtls_cipher_supported[NUM_CIPHERS];
  8785. #endif /* MBEDTLS_CIPHER_C */
  8786. /********* Start of file library/ctr_drbg.c ************/
  8787. /*
  8788. * CTR_DRBG implementation based on AES-256 (NIST SP 800-90)
  8789. *
  8790. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  8791. * SPDX-License-Identifier: Apache-2.0
  8792. *
  8793. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  8794. * not use this file except in compliance with the License.
  8795. * You may obtain a copy of the License at
  8796. *
  8797. * http://www.apache.org/licenses/LICENSE-2.0
  8798. *
  8799. * Unless required by applicable law or agreed to in writing, software
  8800. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  8801. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  8802. * See the License for the specific language governing permissions and
  8803. * limitations under the License.
  8804. *
  8805. * This file is part of mbed TLS (https://tls.mbed.org)
  8806. */
  8807. /*
  8808. * The NIST SP 800-90 DRBGs are described in the following publucation.
  8809. *
  8810. * http://csrc.nist.gov/publications/nistpubs/800-90/SP800-90revised_March2007.pdf
  8811. */
  8812. #if !defined(MBEDTLS_CONFIG_FILE)
  8813. #else
  8814. #endif
  8815. #if defined(MBEDTLS_CTR_DRBG_C)
  8816. #include <string.h>
  8817. #if defined(MBEDTLS_FS_IO)
  8818. #include <stdio.h>
  8819. #endif
  8820. #if defined(MBEDTLS_SELF_TEST)
  8821. #if defined(MBEDTLS_PLATFORM_C)
  8822. #else
  8823. #include <stdio.h>
  8824. #define mbedtls_printf printf
  8825. #endif /* MBEDTLS_PLATFORM_C */
  8826. #endif /* MBEDTLS_SELF_TEST */
  8827. /* Implementation that should never be optimized out by the compiler */
  8828. static void ctr_zeroize( void *v, size_t n ) {
  8829. volatile unsigned char *p = v; while( n-- ) *p++ = 0;
  8830. }
  8831. /*
  8832. * CTR_DRBG context initialization
  8833. */
  8834. void mbedtls_ctr_drbg_init( mbedtls_ctr_drbg_context *ctx )
  8835. {
  8836. memset( ctx, 0, sizeof( mbedtls_ctr_drbg_context ) );
  8837. #if defined(MBEDTLS_THREADING_C)
  8838. mbedtls_mutex_init( &ctx->mutex );
  8839. #endif
  8840. }
  8841. /*
  8842. * Non-public function wrapped by ctr_crbg_init(). Necessary to allow NIST
  8843. * tests to succeed (which require known length fixed entropy)
  8844. */
  8845. int mbedtls_ctr_drbg_seed_entropy_len(
  8846. mbedtls_ctr_drbg_context *ctx,
  8847. int (*f_entropy)(void *, unsigned char *, size_t),
  8848. void *p_entropy,
  8849. const unsigned char *custom,
  8850. size_t len,
  8851. size_t entropy_len )
  8852. {
  8853. int ret;
  8854. unsigned char key[MBEDTLS_CTR_DRBG_KEYSIZE];
  8855. memset( key, 0, MBEDTLS_CTR_DRBG_KEYSIZE );
  8856. mbedtls_aes_init( &ctx->aes_ctx );
  8857. ctx->f_entropy = f_entropy;
  8858. ctx->p_entropy = p_entropy;
  8859. ctx->entropy_len = entropy_len;
  8860. ctx->reseed_interval = MBEDTLS_CTR_DRBG_RESEED_INTERVAL;
  8861. /*
  8862. * Initialize with an empty key
  8863. */
  8864. mbedtls_aes_setkey_enc( &ctx->aes_ctx, key, MBEDTLS_CTR_DRBG_KEYBITS );
  8865. if( ( ret = mbedtls_ctr_drbg_reseed( ctx, custom, len ) ) != 0 )
  8866. return( ret );
  8867. return( 0 );
  8868. }
  8869. int mbedtls_ctr_drbg_seed( mbedtls_ctr_drbg_context *ctx,
  8870. int (*f_entropy)(void *, unsigned char *, size_t),
  8871. void *p_entropy,
  8872. const unsigned char *custom,
  8873. size_t len )
  8874. {
  8875. return( mbedtls_ctr_drbg_seed_entropy_len( ctx, f_entropy, p_entropy, custom, len,
  8876. MBEDTLS_CTR_DRBG_ENTROPY_LEN ) );
  8877. }
  8878. void mbedtls_ctr_drbg_free( mbedtls_ctr_drbg_context *ctx )
  8879. {
  8880. if( ctx == NULL )
  8881. return;
  8882. #if defined(MBEDTLS_THREADING_C)
  8883. mbedtls_mutex_free( &ctx->mutex );
  8884. #endif
  8885. mbedtls_aes_free( &ctx->aes_ctx );
  8886. ctr_zeroize( ctx, sizeof( mbedtls_ctr_drbg_context ) );
  8887. }
  8888. void mbedtls_ctr_drbg_set_prediction_resistance( mbedtls_ctr_drbg_context *ctx, int resistance )
  8889. {
  8890. ctx->prediction_resistance = resistance;
  8891. }
  8892. void mbedtls_ctr_drbg_set_entropy_len( mbedtls_ctr_drbg_context *ctx, size_t len )
  8893. {
  8894. ctx->entropy_len = len;
  8895. }
  8896. void mbedtls_ctr_drbg_set_reseed_interval( mbedtls_ctr_drbg_context *ctx, int interval )
  8897. {
  8898. ctx->reseed_interval = interval;
  8899. }
  8900. static int block_cipher_df( unsigned char *output,
  8901. const unsigned char *data, size_t data_len )
  8902. {
  8903. unsigned char buf[MBEDTLS_CTR_DRBG_MAX_SEED_INPUT + MBEDTLS_CTR_DRBG_BLOCKSIZE + 16];
  8904. unsigned char tmp[MBEDTLS_CTR_DRBG_SEEDLEN];
  8905. unsigned char key[MBEDTLS_CTR_DRBG_KEYSIZE];
  8906. unsigned char chain[MBEDTLS_CTR_DRBG_BLOCKSIZE];
  8907. unsigned char *p, *iv;
  8908. mbedtls_aes_context aes_ctx;
  8909. int i, j;
  8910. size_t buf_len, use_len;
  8911. if( data_len > MBEDTLS_CTR_DRBG_MAX_SEED_INPUT )
  8912. return( MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG );
  8913. memset( buf, 0, MBEDTLS_CTR_DRBG_MAX_SEED_INPUT + MBEDTLS_CTR_DRBG_BLOCKSIZE + 16 );
  8914. mbedtls_aes_init( &aes_ctx );
  8915. /*
  8916. * Construct IV (16 bytes) and S in buffer
  8917. * IV = Counter (in 32-bits) padded to 16 with zeroes
  8918. * S = Length input string (in 32-bits) || Length of output (in 32-bits) ||
  8919. * data || 0x80
  8920. * (Total is padded to a multiple of 16-bytes with zeroes)
  8921. */
  8922. p = buf + MBEDTLS_CTR_DRBG_BLOCKSIZE;
  8923. *p++ = ( data_len >> 24 ) & 0xff;
  8924. *p++ = ( data_len >> 16 ) & 0xff;
  8925. *p++ = ( data_len >> 8 ) & 0xff;
  8926. *p++ = ( data_len ) & 0xff;
  8927. p += 3;
  8928. *p++ = MBEDTLS_CTR_DRBG_SEEDLEN;
  8929. memcpy( p, data, data_len );
  8930. p[data_len] = 0x80;
  8931. buf_len = MBEDTLS_CTR_DRBG_BLOCKSIZE + 8 + data_len + 1;
  8932. for( i = 0; i < MBEDTLS_CTR_DRBG_KEYSIZE; i++ )
  8933. key[i] = i;
  8934. mbedtls_aes_setkey_enc( &aes_ctx, key, MBEDTLS_CTR_DRBG_KEYBITS );
  8935. /*
  8936. * Reduce data to MBEDTLS_CTR_DRBG_SEEDLEN bytes of data
  8937. */
  8938. for( j = 0; j < MBEDTLS_CTR_DRBG_SEEDLEN; j += MBEDTLS_CTR_DRBG_BLOCKSIZE )
  8939. {
  8940. p = buf;
  8941. memset( chain, 0, MBEDTLS_CTR_DRBG_BLOCKSIZE );
  8942. use_len = buf_len;
  8943. while( use_len > 0 )
  8944. {
  8945. for( i = 0; i < MBEDTLS_CTR_DRBG_BLOCKSIZE; i++ )
  8946. chain[i] ^= p[i];
  8947. p += MBEDTLS_CTR_DRBG_BLOCKSIZE;
  8948. use_len -= ( use_len >= MBEDTLS_CTR_DRBG_BLOCKSIZE ) ?
  8949. MBEDTLS_CTR_DRBG_BLOCKSIZE : use_len;
  8950. mbedtls_aes_crypt_ecb( &aes_ctx, MBEDTLS_AES_ENCRYPT, chain, chain );
  8951. }
  8952. memcpy( tmp + j, chain, MBEDTLS_CTR_DRBG_BLOCKSIZE );
  8953. /*
  8954. * Update IV
  8955. */
  8956. buf[3]++;
  8957. }
  8958. /*
  8959. * Do final encryption with reduced data
  8960. */
  8961. mbedtls_aes_setkey_enc( &aes_ctx, tmp, MBEDTLS_CTR_DRBG_KEYBITS );
  8962. iv = tmp + MBEDTLS_CTR_DRBG_KEYSIZE;
  8963. p = output;
  8964. for( j = 0; j < MBEDTLS_CTR_DRBG_SEEDLEN; j += MBEDTLS_CTR_DRBG_BLOCKSIZE )
  8965. {
  8966. mbedtls_aes_crypt_ecb( &aes_ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
  8967. memcpy( p, iv, MBEDTLS_CTR_DRBG_BLOCKSIZE );
  8968. p += MBEDTLS_CTR_DRBG_BLOCKSIZE;
  8969. }
  8970. mbedtls_aes_free( &aes_ctx );
  8971. return( 0 );
  8972. }
  8973. static int ctr_drbg_update_internal( mbedtls_ctr_drbg_context *ctx,
  8974. const unsigned char data[MBEDTLS_CTR_DRBG_SEEDLEN] )
  8975. {
  8976. unsigned char tmp[MBEDTLS_CTR_DRBG_SEEDLEN];
  8977. unsigned char *p = tmp;
  8978. int i, j;
  8979. memset( tmp, 0, MBEDTLS_CTR_DRBG_SEEDLEN );
  8980. for( j = 0; j < MBEDTLS_CTR_DRBG_SEEDLEN; j += MBEDTLS_CTR_DRBG_BLOCKSIZE )
  8981. {
  8982. /*
  8983. * Increase counter
  8984. */
  8985. for( i = MBEDTLS_CTR_DRBG_BLOCKSIZE; i > 0; i-- )
  8986. if( ++ctx->counter[i - 1] != 0 )
  8987. break;
  8988. /*
  8989. * Crypt counter block
  8990. */
  8991. mbedtls_aes_crypt_ecb( &ctx->aes_ctx, MBEDTLS_AES_ENCRYPT, ctx->counter, p );
  8992. p += MBEDTLS_CTR_DRBG_BLOCKSIZE;
  8993. }
  8994. for( i = 0; i < MBEDTLS_CTR_DRBG_SEEDLEN; i++ )
  8995. tmp[i] ^= data[i];
  8996. /*
  8997. * Update key and counter
  8998. */
  8999. mbedtls_aes_setkey_enc( &ctx->aes_ctx, tmp, MBEDTLS_CTR_DRBG_KEYBITS );
  9000. memcpy( ctx->counter, tmp + MBEDTLS_CTR_DRBG_KEYSIZE, MBEDTLS_CTR_DRBG_BLOCKSIZE );
  9001. return( 0 );
  9002. }
  9003. void mbedtls_ctr_drbg_update( mbedtls_ctr_drbg_context *ctx,
  9004. const unsigned char *additional, size_t add_len )
  9005. {
  9006. unsigned char add_input[MBEDTLS_CTR_DRBG_SEEDLEN];
  9007. if( add_len > 0 )
  9008. {
  9009. /* MAX_INPUT would be more logical here, but we have to match
  9010. * block_cipher_df()'s limits since we can't propagate errors */
  9011. if( add_len > MBEDTLS_CTR_DRBG_MAX_SEED_INPUT )
  9012. add_len = MBEDTLS_CTR_DRBG_MAX_SEED_INPUT;
  9013. block_cipher_df( add_input, additional, add_len );
  9014. ctr_drbg_update_internal( ctx, add_input );
  9015. }
  9016. }
  9017. int mbedtls_ctr_drbg_reseed( mbedtls_ctr_drbg_context *ctx,
  9018. const unsigned char *additional, size_t len )
  9019. {
  9020. unsigned char seed[MBEDTLS_CTR_DRBG_MAX_SEED_INPUT];
  9021. size_t seedlen = 0;
  9022. if( ctx->entropy_len + len > MBEDTLS_CTR_DRBG_MAX_SEED_INPUT )
  9023. return( MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG );
  9024. memset( seed, 0, MBEDTLS_CTR_DRBG_MAX_SEED_INPUT );
  9025. /*
  9026. * Gather entropy_len bytes of entropy to seed state
  9027. */
  9028. if( 0 != ctx->f_entropy( ctx->p_entropy, seed,
  9029. ctx->entropy_len ) )
  9030. {
  9031. return( MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED );
  9032. }
  9033. seedlen += ctx->entropy_len;
  9034. /*
  9035. * Add additional data
  9036. */
  9037. if( additional && len )
  9038. {
  9039. memcpy( seed + seedlen, additional, len );
  9040. seedlen += len;
  9041. }
  9042. /*
  9043. * Reduce to 384 bits
  9044. */
  9045. block_cipher_df( seed, seed, seedlen );
  9046. /*
  9047. * Update state
  9048. */
  9049. ctr_drbg_update_internal( ctx, seed );
  9050. ctx->reseed_counter = 1;
  9051. return( 0 );
  9052. }
  9053. int mbedtls_ctr_drbg_random_with_add( void *p_rng,
  9054. unsigned char *output, size_t output_len,
  9055. const unsigned char *additional, size_t add_len )
  9056. {
  9057. int ret = 0;
  9058. mbedtls_ctr_drbg_context *ctx = (mbedtls_ctr_drbg_context *) p_rng;
  9059. unsigned char add_input[MBEDTLS_CTR_DRBG_SEEDLEN];
  9060. unsigned char *p = output;
  9061. unsigned char tmp[MBEDTLS_CTR_DRBG_BLOCKSIZE];
  9062. int i;
  9063. size_t use_len;
  9064. if( output_len > MBEDTLS_CTR_DRBG_MAX_REQUEST )
  9065. return( MBEDTLS_ERR_CTR_DRBG_REQUEST_TOO_BIG );
  9066. if( add_len > MBEDTLS_CTR_DRBG_MAX_INPUT )
  9067. return( MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG );
  9068. memset( add_input, 0, MBEDTLS_CTR_DRBG_SEEDLEN );
  9069. if( ctx->reseed_counter > ctx->reseed_interval ||
  9070. ctx->prediction_resistance )
  9071. {
  9072. if( ( ret = mbedtls_ctr_drbg_reseed( ctx, additional, add_len ) ) != 0 )
  9073. return( ret );
  9074. add_len = 0;
  9075. }
  9076. if( add_len > 0 )
  9077. {
  9078. block_cipher_df( add_input, additional, add_len );
  9079. ctr_drbg_update_internal( ctx, add_input );
  9080. }
  9081. while( output_len > 0 )
  9082. {
  9083. /*
  9084. * Increase counter
  9085. */
  9086. for( i = MBEDTLS_CTR_DRBG_BLOCKSIZE; i > 0; i-- )
  9087. if( ++ctx->counter[i - 1] != 0 )
  9088. break;
  9089. /*
  9090. * Crypt counter block
  9091. */
  9092. mbedtls_aes_crypt_ecb( &ctx->aes_ctx, MBEDTLS_AES_ENCRYPT, ctx->counter, tmp );
  9093. use_len = ( output_len > MBEDTLS_CTR_DRBG_BLOCKSIZE ) ? MBEDTLS_CTR_DRBG_BLOCKSIZE :
  9094. output_len;
  9095. /*
  9096. * Copy random block to destination
  9097. */
  9098. memcpy( p, tmp, use_len );
  9099. p += use_len;
  9100. output_len -= use_len;
  9101. }
  9102. ctr_drbg_update_internal( ctx, add_input );
  9103. ctx->reseed_counter++;
  9104. return( 0 );
  9105. }
  9106. int mbedtls_ctr_drbg_random( void *p_rng, unsigned char *output, size_t output_len )
  9107. {
  9108. int ret;
  9109. mbedtls_ctr_drbg_context *ctx = (mbedtls_ctr_drbg_context *) p_rng;
  9110. #if defined(MBEDTLS_THREADING_C)
  9111. if( ( ret = mbedtls_mutex_lock( &ctx->mutex ) ) != 0 )
  9112. return( ret );
  9113. #endif
  9114. ret = mbedtls_ctr_drbg_random_with_add( ctx, output, output_len, NULL, 0 );
  9115. #if defined(MBEDTLS_THREADING_C)
  9116. if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 )
  9117. return( MBEDTLS_ERR_THREADING_MUTEX_ERROR );
  9118. #endif
  9119. return( ret );
  9120. }
  9121. #if defined(MBEDTLS_FS_IO)
  9122. int mbedtls_ctr_drbg_write_seed_file( mbedtls_ctr_drbg_context *ctx, const char *path )
  9123. {
  9124. int ret = MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR;
  9125. FILE *f;
  9126. unsigned char buf[ MBEDTLS_CTR_DRBG_MAX_INPUT ];
  9127. if( ( f = fopen( path, "wb" ) ) == NULL )
  9128. return( MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR );
  9129. if( ( ret = mbedtls_ctr_drbg_random( ctx, buf, MBEDTLS_CTR_DRBG_MAX_INPUT ) ) != 0 )
  9130. goto exit;
  9131. if( fwrite( buf, 1, MBEDTLS_CTR_DRBG_MAX_INPUT, f ) != MBEDTLS_CTR_DRBG_MAX_INPUT )
  9132. {
  9133. ret = MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR;
  9134. goto exit;
  9135. }
  9136. ret = 0;
  9137. exit:
  9138. fclose( f );
  9139. return( ret );
  9140. }
  9141. int mbedtls_ctr_drbg_update_seed_file( mbedtls_ctr_drbg_context *ctx, const char *path )
  9142. {
  9143. FILE *f;
  9144. size_t n;
  9145. unsigned char buf[ MBEDTLS_CTR_DRBG_MAX_INPUT ];
  9146. if( ( f = fopen( path, "rb" ) ) == NULL )
  9147. return( MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR );
  9148. fseek( f, 0, SEEK_END );
  9149. n = (size_t) ftell( f );
  9150. fseek( f, 0, SEEK_SET );
  9151. if( n > MBEDTLS_CTR_DRBG_MAX_INPUT )
  9152. {
  9153. fclose( f );
  9154. return( MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG );
  9155. }
  9156. if( fread( buf, 1, n, f ) != n )
  9157. {
  9158. fclose( f );
  9159. return( MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR );
  9160. }
  9161. fclose( f );
  9162. mbedtls_ctr_drbg_update( ctx, buf, n );
  9163. return( mbedtls_ctr_drbg_write_seed_file( ctx, path ) );
  9164. }
  9165. #endif /* MBEDTLS_FS_IO */
  9166. #if defined(MBEDTLS_SELF_TEST)
  9167. static const unsigned char entropy_source_pr[96] =
  9168. { 0xc1, 0x80, 0x81, 0xa6, 0x5d, 0x44, 0x02, 0x16,
  9169. 0x19, 0xb3, 0xf1, 0x80, 0xb1, 0xc9, 0x20, 0x02,
  9170. 0x6a, 0x54, 0x6f, 0x0c, 0x70, 0x81, 0x49, 0x8b,
  9171. 0x6e, 0xa6, 0x62, 0x52, 0x6d, 0x51, 0xb1, 0xcb,
  9172. 0x58, 0x3b, 0xfa, 0xd5, 0x37, 0x5f, 0xfb, 0xc9,
  9173. 0xff, 0x46, 0xd2, 0x19, 0xc7, 0x22, 0x3e, 0x95,
  9174. 0x45, 0x9d, 0x82, 0xe1, 0xe7, 0x22, 0x9f, 0x63,
  9175. 0x31, 0x69, 0xd2, 0x6b, 0x57, 0x47, 0x4f, 0xa3,
  9176. 0x37, 0xc9, 0x98, 0x1c, 0x0b, 0xfb, 0x91, 0x31,
  9177. 0x4d, 0x55, 0xb9, 0xe9, 0x1c, 0x5a, 0x5e, 0xe4,
  9178. 0x93, 0x92, 0xcf, 0xc5, 0x23, 0x12, 0xd5, 0x56,
  9179. 0x2c, 0x4a, 0x6e, 0xff, 0xdc, 0x10, 0xd0, 0x68 };
  9180. static const unsigned char entropy_source_nopr[64] =
  9181. { 0x5a, 0x19, 0x4d, 0x5e, 0x2b, 0x31, 0x58, 0x14,
  9182. 0x54, 0xde, 0xf6, 0x75, 0xfb, 0x79, 0x58, 0xfe,
  9183. 0xc7, 0xdb, 0x87, 0x3e, 0x56, 0x89, 0xfc, 0x9d,
  9184. 0x03, 0x21, 0x7c, 0x68, 0xd8, 0x03, 0x38, 0x20,
  9185. 0xf9, 0xe6, 0x5e, 0x04, 0xd8, 0x56, 0xf3, 0xa9,
  9186. 0xc4, 0x4a, 0x4c, 0xbd, 0xc1, 0xd0, 0x08, 0x46,
  9187. 0xf5, 0x98, 0x3d, 0x77, 0x1c, 0x1b, 0x13, 0x7e,
  9188. 0x4e, 0x0f, 0x9d, 0x8e, 0xf4, 0x09, 0xf9, 0x2e };
  9189. static const unsigned char nonce_pers_pr[16] =
  9190. { 0xd2, 0x54, 0xfc, 0xff, 0x02, 0x1e, 0x69, 0xd2,
  9191. 0x29, 0xc9, 0xcf, 0xad, 0x85, 0xfa, 0x48, 0x6c };
  9192. static const unsigned char nonce_pers_nopr[16] =
  9193. { 0x1b, 0x54, 0xb8, 0xff, 0x06, 0x42, 0xbf, 0xf5,
  9194. 0x21, 0xf1, 0x5c, 0x1c, 0x0b, 0x66, 0x5f, 0x3f };
  9195. static const unsigned char result_pr[16] =
  9196. { 0x34, 0x01, 0x16, 0x56, 0xb4, 0x29, 0x00, 0x8f,
  9197. 0x35, 0x63, 0xec, 0xb5, 0xf2, 0x59, 0x07, 0x23 };
  9198. static const unsigned char result_nopr[16] =
  9199. { 0xa0, 0x54, 0x30, 0x3d, 0x8a, 0x7e, 0xa9, 0x88,
  9200. 0x9d, 0x90, 0x3e, 0x07, 0x7c, 0x6f, 0x21, 0x8f };
  9201. static size_t test_offset;
  9202. static int ctr_drbg_self_test_entropy( void *data, unsigned char *buf,
  9203. size_t len )
  9204. {
  9205. const unsigned char *p = data;
  9206. memcpy( buf, p + test_offset, len );
  9207. test_offset += len;
  9208. return( 0 );
  9209. }
  9210. #define CHK( c ) if( (c) != 0 ) \
  9211. { \
  9212. if( verbose != 0 ) \
  9213. mbedtls_printf( "failed\n" ); \
  9214. return( 1 ); \
  9215. }
  9216. /*
  9217. * Checkup routine
  9218. */
  9219. int mbedtls_ctr_drbg_self_test( int verbose )
  9220. {
  9221. mbedtls_ctr_drbg_context ctx;
  9222. unsigned char buf[16];
  9223. mbedtls_ctr_drbg_init( &ctx );
  9224. /*
  9225. * Based on a NIST CTR_DRBG test vector (PR = True)
  9226. */
  9227. if( verbose != 0 )
  9228. mbedtls_printf( " CTR_DRBG (PR = TRUE) : " );
  9229. test_offset = 0;
  9230. CHK( mbedtls_ctr_drbg_seed_entropy_len( &ctx, ctr_drbg_self_test_entropy,
  9231. (void *) entropy_source_pr, nonce_pers_pr, 16, 32 ) );
  9232. mbedtls_ctr_drbg_set_prediction_resistance( &ctx, MBEDTLS_CTR_DRBG_PR_ON );
  9233. CHK( mbedtls_ctr_drbg_random( &ctx, buf, MBEDTLS_CTR_DRBG_BLOCKSIZE ) );
  9234. CHK( mbedtls_ctr_drbg_random( &ctx, buf, MBEDTLS_CTR_DRBG_BLOCKSIZE ) );
  9235. CHK( memcmp( buf, result_pr, MBEDTLS_CTR_DRBG_BLOCKSIZE ) );
  9236. mbedtls_ctr_drbg_free( &ctx );
  9237. if( verbose != 0 )
  9238. mbedtls_printf( "passed\n" );
  9239. /*
  9240. * Based on a NIST CTR_DRBG test vector (PR = FALSE)
  9241. */
  9242. if( verbose != 0 )
  9243. mbedtls_printf( " CTR_DRBG (PR = FALSE): " );
  9244. mbedtls_ctr_drbg_init( &ctx );
  9245. test_offset = 0;
  9246. CHK( mbedtls_ctr_drbg_seed_entropy_len( &ctx, ctr_drbg_self_test_entropy,
  9247. (void *) entropy_source_nopr, nonce_pers_nopr, 16, 32 ) );
  9248. CHK( mbedtls_ctr_drbg_random( &ctx, buf, 16 ) );
  9249. CHK( mbedtls_ctr_drbg_reseed( &ctx, NULL, 0 ) );
  9250. CHK( mbedtls_ctr_drbg_random( &ctx, buf, 16 ) );
  9251. CHK( memcmp( buf, result_nopr, 16 ) );
  9252. mbedtls_ctr_drbg_free( &ctx );
  9253. if( verbose != 0 )
  9254. mbedtls_printf( "passed\n" );
  9255. if( verbose != 0 )
  9256. mbedtls_printf( "\n" );
  9257. return( 0 );
  9258. }
  9259. #endif /* MBEDTLS_SELF_TEST */
  9260. #endif /* MBEDTLS_CTR_DRBG_C */
  9261. /********* Start of file library/debug.c ************/
  9262. /*
  9263. * Debugging routines
  9264. *
  9265. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  9266. * SPDX-License-Identifier: Apache-2.0
  9267. *
  9268. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  9269. * not use this file except in compliance with the License.
  9270. * You may obtain a copy of the License at
  9271. *
  9272. * http://www.apache.org/licenses/LICENSE-2.0
  9273. *
  9274. * Unless required by applicable law or agreed to in writing, software
  9275. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  9276. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  9277. * See the License for the specific language governing permissions and
  9278. * limitations under the License.
  9279. *
  9280. * This file is part of mbed TLS (https://tls.mbed.org)
  9281. */
  9282. #if !defined(MBEDTLS_CONFIG_FILE)
  9283. #else
  9284. #endif
  9285. #if defined(MBEDTLS_DEBUG_C)
  9286. #include <stdarg.h>
  9287. #include <stdio.h>
  9288. #include <string.h>
  9289. #if defined(MBEDTLS_PLATFORM_C)
  9290. #else
  9291. #include <stdlib.h>
  9292. #define mbedtls_calloc calloc
  9293. #define mbedtls_free free
  9294. #define mbedtls_snprintf snprintf
  9295. #endif
  9296. #if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \
  9297. !defined(inline) && !defined(__cplusplus)
  9298. #define inline __inline
  9299. #endif
  9300. #define DEBUG_BUF_SIZE 512
  9301. static int debug_threshold = 0;
  9302. void mbedtls_debug_set_threshold( int threshold )
  9303. {
  9304. debug_threshold = threshold;
  9305. }
  9306. /*
  9307. * All calls to f_dbg must be made via this function
  9308. */
  9309. static inline void debug_send_line( const mbedtls_ssl_context *ssl, int level,
  9310. const char *file, int line,
  9311. const char *str )
  9312. {
  9313. /*
  9314. * If in a threaded environment, we need a thread identifier.
  9315. * Since there is no portable way to get one, use the address of the ssl
  9316. * context instead, as it shouldn't be shared between threads.
  9317. */
  9318. #if defined(MBEDTLS_THREADING_C)
  9319. char idstr[20 + DEBUG_BUF_SIZE]; /* 0x + 16 nibbles + ': ' */
  9320. mbedtls_snprintf( idstr, sizeof( idstr ), "%p: %s", ssl, str );
  9321. ssl->conf->f_dbg( ssl->conf->p_dbg, level, file, line, idstr );
  9322. #else
  9323. ssl->conf->f_dbg( ssl->conf->p_dbg, level, file, line, str );
  9324. #endif
  9325. }
  9326. void mbedtls_debug_print_msg( const mbedtls_ssl_context *ssl, int level,
  9327. const char *file, int line,
  9328. const char *format, ... )
  9329. {
  9330. va_list argp;
  9331. char str[DEBUG_BUF_SIZE];
  9332. int ret;
  9333. if( ssl->conf == NULL || ssl->conf->f_dbg == NULL || level > debug_threshold )
  9334. return;
  9335. va_start( argp, format );
  9336. #if defined(_WIN32)
  9337. #if defined(_TRUNCATE)
  9338. ret = _vsnprintf_s( str, DEBUG_BUF_SIZE, _TRUNCATE, format, argp );
  9339. #else
  9340. ret = _vsnprintf( str, DEBUG_BUF_SIZE, format, argp );
  9341. if( ret < 0 || (size_t) ret == DEBUG_BUF_SIZE )
  9342. {
  9343. str[DEBUG_BUF_SIZE-1] = '\0';
  9344. ret = -1;
  9345. }
  9346. #endif
  9347. #else
  9348. ret = vsnprintf( str, DEBUG_BUF_SIZE, format, argp );
  9349. #endif
  9350. va_end( argp );
  9351. if( ret >= 0 && ret < DEBUG_BUF_SIZE - 1 )
  9352. {
  9353. str[ret] = '\n';
  9354. str[ret + 1] = '\0';
  9355. }
  9356. debug_send_line( ssl, level, file, line, str );
  9357. }
  9358. void mbedtls_debug_print_ret( const mbedtls_ssl_context *ssl, int level,
  9359. const char *file, int line,
  9360. const char *text, int ret )
  9361. {
  9362. char str[DEBUG_BUF_SIZE];
  9363. if( ssl->conf == NULL || ssl->conf->f_dbg == NULL || level > debug_threshold )
  9364. return;
  9365. /*
  9366. * With non-blocking I/O and examples that just retry immediately,
  9367. * the logs would be quickly flooded with WANT_READ, so ignore that.
  9368. * Don't ignore WANT_WRITE however, since is is usually rare.
  9369. */
  9370. if( ret == MBEDTLS_ERR_SSL_WANT_READ )
  9371. return;
  9372. mbedtls_snprintf( str, sizeof( str ), "%s() returned %d (-0x%04x)\n",
  9373. text, ret, -ret );
  9374. debug_send_line( ssl, level, file, line, str );
  9375. }
  9376. void mbedtls_debug_print_buf( const mbedtls_ssl_context *ssl, int level,
  9377. const char *file, int line, const char *text,
  9378. const unsigned char *buf, size_t len )
  9379. {
  9380. char str[DEBUG_BUF_SIZE];
  9381. char txt[17];
  9382. size_t i, idx = 0;
  9383. if( ssl->conf == NULL || ssl->conf->f_dbg == NULL || level > debug_threshold )
  9384. return;
  9385. mbedtls_snprintf( str + idx, sizeof( str ) - idx, "dumping '%s' (%u bytes)\n",
  9386. text, (unsigned int) len );
  9387. debug_send_line( ssl, level, file, line, str );
  9388. idx = 0;
  9389. memset( txt, 0, sizeof( txt ) );
  9390. for( i = 0; i < len; i++ )
  9391. {
  9392. if( i >= 4096 )
  9393. break;
  9394. if( i % 16 == 0 )
  9395. {
  9396. if( i > 0 )
  9397. {
  9398. mbedtls_snprintf( str + idx, sizeof( str ) - idx, " %s\n", txt );
  9399. debug_send_line( ssl, level, file, line, str );
  9400. idx = 0;
  9401. memset( txt, 0, sizeof( txt ) );
  9402. }
  9403. idx += mbedtls_snprintf( str + idx, sizeof( str ) - idx, "%04x: ",
  9404. (unsigned int) i );
  9405. }
  9406. idx += mbedtls_snprintf( str + idx, sizeof( str ) - idx, " %02x",
  9407. (unsigned int) buf[i] );
  9408. txt[i % 16] = ( buf[i] > 31 && buf[i] < 127 ) ? buf[i] : '.' ;
  9409. }
  9410. if( len > 0 )
  9411. {
  9412. for( /* i = i */; i % 16 != 0; i++ )
  9413. idx += mbedtls_snprintf( str + idx, sizeof( str ) - idx, " " );
  9414. mbedtls_snprintf( str + idx, sizeof( str ) - idx, " %s\n", txt );
  9415. debug_send_line( ssl, level, file, line, str );
  9416. }
  9417. }
  9418. #if defined(MBEDTLS_ECP_C)
  9419. void mbedtls_debug_print_ecp( const mbedtls_ssl_context *ssl, int level,
  9420. const char *file, int line,
  9421. const char *text, const mbedtls_ecp_point *X )
  9422. {
  9423. char str[DEBUG_BUF_SIZE];
  9424. if( ssl->conf == NULL || ssl->conf->f_dbg == NULL || level > debug_threshold )
  9425. return;
  9426. mbedtls_snprintf( str, sizeof( str ), "%s(X)", text );
  9427. mbedtls_debug_print_mpi( ssl, level, file, line, str, &X->X );
  9428. mbedtls_snprintf( str, sizeof( str ), "%s(Y)", text );
  9429. mbedtls_debug_print_mpi( ssl, level, file, line, str, &X->Y );
  9430. }
  9431. #endif /* MBEDTLS_ECP_C */
  9432. #if defined(MBEDTLS_BIGNUM_C)
  9433. void mbedtls_debug_print_mpi( const mbedtls_ssl_context *ssl, int level,
  9434. const char *file, int line,
  9435. const char *text, const mbedtls_mpi *X )
  9436. {
  9437. char str[DEBUG_BUF_SIZE];
  9438. int j, k, zeros = 1;
  9439. size_t i, n, idx = 0;
  9440. if( ssl->conf == NULL || ssl->conf->f_dbg == NULL || X == NULL || level > debug_threshold )
  9441. return;
  9442. for( n = X->n - 1; n > 0; n-- )
  9443. if( X->p[n] != 0 )
  9444. break;
  9445. for( j = ( sizeof(mbedtls_mpi_uint) << 3 ) - 1; j >= 0; j-- )
  9446. if( ( ( X->p[n] >> j ) & 1 ) != 0 )
  9447. break;
  9448. mbedtls_snprintf( str + idx, sizeof( str ) - idx, "value of '%s' (%d bits) is:\n",
  9449. text, (int) ( ( n * ( sizeof(mbedtls_mpi_uint) << 3 ) ) + j + 1 ) );
  9450. debug_send_line( ssl, level, file, line, str );
  9451. idx = 0;
  9452. for( i = n + 1, j = 0; i > 0; i-- )
  9453. {
  9454. if( zeros && X->p[i - 1] == 0 )
  9455. continue;
  9456. for( k = sizeof( mbedtls_mpi_uint ) - 1; k >= 0; k-- )
  9457. {
  9458. if( zeros && ( ( X->p[i - 1] >> ( k << 3 ) ) & 0xFF ) == 0 )
  9459. continue;
  9460. else
  9461. zeros = 0;
  9462. if( j % 16 == 0 )
  9463. {
  9464. if( j > 0 )
  9465. {
  9466. mbedtls_snprintf( str + idx, sizeof( str ) - idx, "\n" );
  9467. debug_send_line( ssl, level, file, line, str );
  9468. idx = 0;
  9469. }
  9470. }
  9471. idx += mbedtls_snprintf( str + idx, sizeof( str ) - idx, " %02x", (unsigned int)
  9472. ( X->p[i - 1] >> ( k << 3 ) ) & 0xFF );
  9473. j++;
  9474. }
  9475. }
  9476. if( zeros == 1 )
  9477. idx += mbedtls_snprintf( str + idx, sizeof( str ) - idx, " 00" );
  9478. mbedtls_snprintf( str + idx, sizeof( str ) - idx, "\n" );
  9479. debug_send_line( ssl, level, file, line, str );
  9480. }
  9481. #endif /* MBEDTLS_BIGNUM_C */
  9482. #if defined(MBEDTLS_X509_CRT_PARSE_C)
  9483. static void debug_print_pk( const mbedtls_ssl_context *ssl, int level,
  9484. const char *file, int line,
  9485. const char *text, const mbedtls_pk_context *pk )
  9486. {
  9487. size_t i;
  9488. mbedtls_pk_debug_item items[MBEDTLS_PK_DEBUG_MAX_ITEMS];
  9489. char name[16];
  9490. memset( items, 0, sizeof( items ) );
  9491. if( mbedtls_pk_debug( pk, items ) != 0 )
  9492. {
  9493. debug_send_line( ssl, level, file, line,
  9494. "invalid PK context\n" );
  9495. return;
  9496. }
  9497. for( i = 0; i < MBEDTLS_PK_DEBUG_MAX_ITEMS; i++ )
  9498. {
  9499. if( items[i].type == MBEDTLS_PK_DEBUG_NONE )
  9500. return;
  9501. mbedtls_snprintf( name, sizeof( name ), "%s%s", text, items[i].name );
  9502. name[sizeof( name ) - 1] = '\0';
  9503. if( items[i].type == MBEDTLS_PK_DEBUG_MPI )
  9504. mbedtls_debug_print_mpi( ssl, level, file, line, name, items[i].value );
  9505. else
  9506. #if defined(MBEDTLS_ECP_C)
  9507. if( items[i].type == MBEDTLS_PK_DEBUG_ECP )
  9508. mbedtls_debug_print_ecp( ssl, level, file, line, name, items[i].value );
  9509. else
  9510. #endif
  9511. debug_send_line( ssl, level, file, line,
  9512. "should not happen\n" );
  9513. }
  9514. }
  9515. static void debug_print_line_by_line( const mbedtls_ssl_context *ssl, int level,
  9516. const char *file, int line, const char *text )
  9517. {
  9518. char str[DEBUG_BUF_SIZE];
  9519. const char *start, *cur;
  9520. start = text;
  9521. for( cur = text; *cur != '\0'; cur++ )
  9522. {
  9523. if( *cur == '\n' )
  9524. {
  9525. size_t len = cur - start + 1;
  9526. if( len > DEBUG_BUF_SIZE - 1 )
  9527. len = DEBUG_BUF_SIZE - 1;
  9528. memcpy( str, start, len );
  9529. str[len] = '\0';
  9530. debug_send_line( ssl, level, file, line, str );
  9531. start = cur + 1;
  9532. }
  9533. }
  9534. }
  9535. void mbedtls_debug_print_crt( const mbedtls_ssl_context *ssl, int level,
  9536. const char *file, int line,
  9537. const char *text, const mbedtls_x509_crt *crt )
  9538. {
  9539. char str[DEBUG_BUF_SIZE];
  9540. int i = 0;
  9541. if( ssl->conf == NULL || ssl->conf->f_dbg == NULL || crt == NULL || level > debug_threshold )
  9542. return;
  9543. while( crt != NULL )
  9544. {
  9545. char buf[1024];
  9546. mbedtls_snprintf( str, sizeof( str ), "%s #%d:\n", text, ++i );
  9547. debug_send_line( ssl, level, file, line, str );
  9548. mbedtls_x509_crt_info( buf, sizeof( buf ) - 1, "", crt );
  9549. debug_print_line_by_line( ssl, level, file, line, buf );
  9550. debug_print_pk( ssl, level, file, line, "crt->", &crt->pk );
  9551. crt = crt->next;
  9552. }
  9553. }
  9554. #endif /* MBEDTLS_X509_CRT_PARSE_C */
  9555. #endif /* MBEDTLS_DEBUG_C */
  9556. /********* Start of file library/des.c ************/
  9557. /*
  9558. * FIPS-46-3 compliant Triple-DES implementation
  9559. *
  9560. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  9561. * SPDX-License-Identifier: Apache-2.0
  9562. *
  9563. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  9564. * not use this file except in compliance with the License.
  9565. * You may obtain a copy of the License at
  9566. *
  9567. * http://www.apache.org/licenses/LICENSE-2.0
  9568. *
  9569. * Unless required by applicable law or agreed to in writing, software
  9570. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  9571. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  9572. * See the License for the specific language governing permissions and
  9573. * limitations under the License.
  9574. *
  9575. * This file is part of mbed TLS (https://tls.mbed.org)
  9576. */
  9577. /*
  9578. * DES, on which TDES is based, was originally designed by Horst Feistel
  9579. * at IBM in 1974, and was adopted as a standard by NIST (formerly NBS).
  9580. *
  9581. * http://csrc.nist.gov/publications/fips/fips46-3/fips46-3.pdf
  9582. */
  9583. #if !defined(MBEDTLS_CONFIG_FILE)
  9584. #else
  9585. #endif
  9586. #if defined(MBEDTLS_DES_C)
  9587. #include <string.h>
  9588. #if defined(MBEDTLS_SELF_TEST)
  9589. #if defined(MBEDTLS_PLATFORM_C)
  9590. #else
  9591. #include <stdio.h>
  9592. #define mbedtls_printf printf
  9593. #endif /* MBEDTLS_PLATFORM_C */
  9594. #endif /* MBEDTLS_SELF_TEST */
  9595. #if !defined(MBEDTLS_DES_ALT)
  9596. /* Implementation that should never be optimized out by the compiler */
  9597. static void des_zeroize( void *v, size_t n ) {
  9598. volatile unsigned char *p = v; while( n-- ) *p++ = 0;
  9599. }
  9600. /*
  9601. * 32-bit integer manipulation macros (big endian)
  9602. */
  9603. #ifndef GET_UINT32_BE
  9604. #define GET_UINT32_BE(n,b,i) \
  9605. { \
  9606. (n) = ( (uint32_t) (b)[(i) ] << 24 ) \
  9607. | ( (uint32_t) (b)[(i) + 1] << 16 ) \
  9608. | ( (uint32_t) (b)[(i) + 2] << 8 ) \
  9609. | ( (uint32_t) (b)[(i) + 3] ); \
  9610. }
  9611. #endif
  9612. #ifndef PUT_UINT32_BE
  9613. #define PUT_UINT32_BE(n,b,i) \
  9614. { \
  9615. (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
  9616. (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \
  9617. (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \
  9618. (b)[(i) + 3] = (unsigned char) ( (n) ); \
  9619. }
  9620. #endif
  9621. /*
  9622. * Expanded DES S-boxes
  9623. */
  9624. static const uint32_t SB1[64] =
  9625. {
  9626. 0x01010400, 0x00000000, 0x00010000, 0x01010404,
  9627. 0x01010004, 0x00010404, 0x00000004, 0x00010000,
  9628. 0x00000400, 0x01010400, 0x01010404, 0x00000400,
  9629. 0x01000404, 0x01010004, 0x01000000, 0x00000004,
  9630. 0x00000404, 0x01000400, 0x01000400, 0x00010400,
  9631. 0x00010400, 0x01010000, 0x01010000, 0x01000404,
  9632. 0x00010004, 0x01000004, 0x01000004, 0x00010004,
  9633. 0x00000000, 0x00000404, 0x00010404, 0x01000000,
  9634. 0x00010000, 0x01010404, 0x00000004, 0x01010000,
  9635. 0x01010400, 0x01000000, 0x01000000, 0x00000400,
  9636. 0x01010004, 0x00010000, 0x00010400, 0x01000004,
  9637. 0x00000400, 0x00000004, 0x01000404, 0x00010404,
  9638. 0x01010404, 0x00010004, 0x01010000, 0x01000404,
  9639. 0x01000004, 0x00000404, 0x00010404, 0x01010400,
  9640. 0x00000404, 0x01000400, 0x01000400, 0x00000000,
  9641. 0x00010004, 0x00010400, 0x00000000, 0x01010004
  9642. };
  9643. static const uint32_t SB2[64] =
  9644. {
  9645. 0x80108020, 0x80008000, 0x00008000, 0x00108020,
  9646. 0x00100000, 0x00000020, 0x80100020, 0x80008020,
  9647. 0x80000020, 0x80108020, 0x80108000, 0x80000000,
  9648. 0x80008000, 0x00100000, 0x00000020, 0x80100020,
  9649. 0x00108000, 0x00100020, 0x80008020, 0x00000000,
  9650. 0x80000000, 0x00008000, 0x00108020, 0x80100000,
  9651. 0x00100020, 0x80000020, 0x00000000, 0x00108000,
  9652. 0x00008020, 0x80108000, 0x80100000, 0x00008020,
  9653. 0x00000000, 0x00108020, 0x80100020, 0x00100000,
  9654. 0x80008020, 0x80100000, 0x80108000, 0x00008000,
  9655. 0x80100000, 0x80008000, 0x00000020, 0x80108020,
  9656. 0x00108020, 0x00000020, 0x00008000, 0x80000000,
  9657. 0x00008020, 0x80108000, 0x00100000, 0x80000020,
  9658. 0x00100020, 0x80008020, 0x80000020, 0x00100020,
  9659. 0x00108000, 0x00000000, 0x80008000, 0x00008020,
  9660. 0x80000000, 0x80100020, 0x80108020, 0x00108000
  9661. };
  9662. static const uint32_t SB3[64] =
  9663. {
  9664. 0x00000208, 0x08020200, 0x00000000, 0x08020008,
  9665. 0x08000200, 0x00000000, 0x00020208, 0x08000200,
  9666. 0x00020008, 0x08000008, 0x08000008, 0x00020000,
  9667. 0x08020208, 0x00020008, 0x08020000, 0x00000208,
  9668. 0x08000000, 0x00000008, 0x08020200, 0x00000200,
  9669. 0x00020200, 0x08020000, 0x08020008, 0x00020208,
  9670. 0x08000208, 0x00020200, 0x00020000, 0x08000208,
  9671. 0x00000008, 0x08020208, 0x00000200, 0x08000000,
  9672. 0x08020200, 0x08000000, 0x00020008, 0x00000208,
  9673. 0x00020000, 0x08020200, 0x08000200, 0x00000000,
  9674. 0x00000200, 0x00020008, 0x08020208, 0x08000200,
  9675. 0x08000008, 0x00000200, 0x00000000, 0x08020008,
  9676. 0x08000208, 0x00020000, 0x08000000, 0x08020208,
  9677. 0x00000008, 0x00020208, 0x00020200, 0x08000008,
  9678. 0x08020000, 0x08000208, 0x00000208, 0x08020000,
  9679. 0x00020208, 0x00000008, 0x08020008, 0x00020200
  9680. };
  9681. static const uint32_t SB4[64] =
  9682. {
  9683. 0x00802001, 0x00002081, 0x00002081, 0x00000080,
  9684. 0x00802080, 0x00800081, 0x00800001, 0x00002001,
  9685. 0x00000000, 0x00802000, 0x00802000, 0x00802081,
  9686. 0x00000081, 0x00000000, 0x00800080, 0x00800001,
  9687. 0x00000001, 0x00002000, 0x00800000, 0x00802001,
  9688. 0x00000080, 0x00800000, 0x00002001, 0x00002080,
  9689. 0x00800081, 0x00000001, 0x00002080, 0x00800080,
  9690. 0x00002000, 0x00802080, 0x00802081, 0x00000081,
  9691. 0x00800080, 0x00800001, 0x00802000, 0x00802081,
  9692. 0x00000081, 0x00000000, 0x00000000, 0x00802000,
  9693. 0x00002080, 0x00800080, 0x00800081, 0x00000001,
  9694. 0x00802001, 0x00002081, 0x00002081, 0x00000080,
  9695. 0x00802081, 0x00000081, 0x00000001, 0x00002000,
  9696. 0x00800001, 0x00002001, 0x00802080, 0x00800081,
  9697. 0x00002001, 0x00002080, 0x00800000, 0x00802001,
  9698. 0x00000080, 0x00800000, 0x00002000, 0x00802080
  9699. };
  9700. static const uint32_t SB5[64] =
  9701. {
  9702. 0x00000100, 0x02080100, 0x02080000, 0x42000100,
  9703. 0x00080000, 0x00000100, 0x40000000, 0x02080000,
  9704. 0x40080100, 0x00080000, 0x02000100, 0x40080100,
  9705. 0x42000100, 0x42080000, 0x00080100, 0x40000000,
  9706. 0x02000000, 0x40080000, 0x40080000, 0x00000000,
  9707. 0x40000100, 0x42080100, 0x42080100, 0x02000100,
  9708. 0x42080000, 0x40000100, 0x00000000, 0x42000000,
  9709. 0x02080100, 0x02000000, 0x42000000, 0x00080100,
  9710. 0x00080000, 0x42000100, 0x00000100, 0x02000000,
  9711. 0x40000000, 0x02080000, 0x42000100, 0x40080100,
  9712. 0x02000100, 0x40000000, 0x42080000, 0x02080100,
  9713. 0x40080100, 0x00000100, 0x02000000, 0x42080000,
  9714. 0x42080100, 0x00080100, 0x42000000, 0x42080100,
  9715. 0x02080000, 0x00000000, 0x40080000, 0x42000000,
  9716. 0x00080100, 0x02000100, 0x40000100, 0x00080000,
  9717. 0x00000000, 0x40080000, 0x02080100, 0x40000100
  9718. };
  9719. static const uint32_t SB6[64] =
  9720. {
  9721. 0x20000010, 0x20400000, 0x00004000, 0x20404010,
  9722. 0x20400000, 0x00000010, 0x20404010, 0x00400000,
  9723. 0x20004000, 0x00404010, 0x00400000, 0x20000010,
  9724. 0x00400010, 0x20004000, 0x20000000, 0x00004010,
  9725. 0x00000000, 0x00400010, 0x20004010, 0x00004000,
  9726. 0x00404000, 0x20004010, 0x00000010, 0x20400010,
  9727. 0x20400010, 0x00000000, 0x00404010, 0x20404000,
  9728. 0x00004010, 0x00404000, 0x20404000, 0x20000000,
  9729. 0x20004000, 0x00000010, 0x20400010, 0x00404000,
  9730. 0x20404010, 0x00400000, 0x00004010, 0x20000010,
  9731. 0x00400000, 0x20004000, 0x20000000, 0x00004010,
  9732. 0x20000010, 0x20404010, 0x00404000, 0x20400000,
  9733. 0x00404010, 0x20404000, 0x00000000, 0x20400010,
  9734. 0x00000010, 0x00004000, 0x20400000, 0x00404010,
  9735. 0x00004000, 0x00400010, 0x20004010, 0x00000000,
  9736. 0x20404000, 0x20000000, 0x00400010, 0x20004010
  9737. };
  9738. static const uint32_t SB7[64] =
  9739. {
  9740. 0x00200000, 0x04200002, 0x04000802, 0x00000000,
  9741. 0x00000800, 0x04000802, 0x00200802, 0x04200800,
  9742. 0x04200802, 0x00200000, 0x00000000, 0x04000002,
  9743. 0x00000002, 0x04000000, 0x04200002, 0x00000802,
  9744. 0x04000800, 0x00200802, 0x00200002, 0x04000800,
  9745. 0x04000002, 0x04200000, 0x04200800, 0x00200002,
  9746. 0x04200000, 0x00000800, 0x00000802, 0x04200802,
  9747. 0x00200800, 0x00000002, 0x04000000, 0x00200800,
  9748. 0x04000000, 0x00200800, 0x00200000, 0x04000802,
  9749. 0x04000802, 0x04200002, 0x04200002, 0x00000002,
  9750. 0x00200002, 0x04000000, 0x04000800, 0x00200000,
  9751. 0x04200800, 0x00000802, 0x00200802, 0x04200800,
  9752. 0x00000802, 0x04000002, 0x04200802, 0x04200000,
  9753. 0x00200800, 0x00000000, 0x00000002, 0x04200802,
  9754. 0x00000000, 0x00200802, 0x04200000, 0x00000800,
  9755. 0x04000002, 0x04000800, 0x00000800, 0x00200002
  9756. };
  9757. static const uint32_t SB8[64] =
  9758. {
  9759. 0x10001040, 0x00001000, 0x00040000, 0x10041040,
  9760. 0x10000000, 0x10001040, 0x00000040, 0x10000000,
  9761. 0x00040040, 0x10040000, 0x10041040, 0x00041000,
  9762. 0x10041000, 0x00041040, 0x00001000, 0x00000040,
  9763. 0x10040000, 0x10000040, 0x10001000, 0x00001040,
  9764. 0x00041000, 0x00040040, 0x10040040, 0x10041000,
  9765. 0x00001040, 0x00000000, 0x00000000, 0x10040040,
  9766. 0x10000040, 0x10001000, 0x00041040, 0x00040000,
  9767. 0x00041040, 0x00040000, 0x10041000, 0x00001000,
  9768. 0x00000040, 0x10040040, 0x00001000, 0x00041040,
  9769. 0x10001000, 0x00000040, 0x10000040, 0x10040000,
  9770. 0x10040040, 0x10000000, 0x00040000, 0x10001040,
  9771. 0x00000000, 0x10041040, 0x00040040, 0x10000040,
  9772. 0x10040000, 0x10001000, 0x10001040, 0x00000000,
  9773. 0x10041040, 0x00041000, 0x00041000, 0x00001040,
  9774. 0x00001040, 0x00040040, 0x10000000, 0x10041000
  9775. };
  9776. /*
  9777. * PC1: left and right halves bit-swap
  9778. */
  9779. static const uint32_t LHs[16] =
  9780. {
  9781. 0x00000000, 0x00000001, 0x00000100, 0x00000101,
  9782. 0x00010000, 0x00010001, 0x00010100, 0x00010101,
  9783. 0x01000000, 0x01000001, 0x01000100, 0x01000101,
  9784. 0x01010000, 0x01010001, 0x01010100, 0x01010101
  9785. };
  9786. static const uint32_t RHs[16] =
  9787. {
  9788. 0x00000000, 0x01000000, 0x00010000, 0x01010000,
  9789. 0x00000100, 0x01000100, 0x00010100, 0x01010100,
  9790. 0x00000001, 0x01000001, 0x00010001, 0x01010001,
  9791. 0x00000101, 0x01000101, 0x00010101, 0x01010101,
  9792. };
  9793. /*
  9794. * Initial Permutation macro
  9795. */
  9796. #define DES_IP(X,Y) \
  9797. { \
  9798. T = ((X >> 4) ^ Y) & 0x0F0F0F0F; Y ^= T; X ^= (T << 4); \
  9799. T = ((X >> 16) ^ Y) & 0x0000FFFF; Y ^= T; X ^= (T << 16); \
  9800. T = ((Y >> 2) ^ X) & 0x33333333; X ^= T; Y ^= (T << 2); \
  9801. T = ((Y >> 8) ^ X) & 0x00FF00FF; X ^= T; Y ^= (T << 8); \
  9802. Y = ((Y << 1) | (Y >> 31)) & 0xFFFFFFFF; \
  9803. T = (X ^ Y) & 0xAAAAAAAA; Y ^= T; X ^= T; \
  9804. X = ((X << 1) | (X >> 31)) & 0xFFFFFFFF; \
  9805. }
  9806. /*
  9807. * Final Permutation macro
  9808. */
  9809. #define DES_FP(X,Y) \
  9810. { \
  9811. X = ((X << 31) | (X >> 1)) & 0xFFFFFFFF; \
  9812. T = (X ^ Y) & 0xAAAAAAAA; X ^= T; Y ^= T; \
  9813. Y = ((Y << 31) | (Y >> 1)) & 0xFFFFFFFF; \
  9814. T = ((Y >> 8) ^ X) & 0x00FF00FF; X ^= T; Y ^= (T << 8); \
  9815. T = ((Y >> 2) ^ X) & 0x33333333; X ^= T; Y ^= (T << 2); \
  9816. T = ((X >> 16) ^ Y) & 0x0000FFFF; Y ^= T; X ^= (T << 16); \
  9817. T = ((X >> 4) ^ Y) & 0x0F0F0F0F; Y ^= T; X ^= (T << 4); \
  9818. }
  9819. /*
  9820. * DES round macro
  9821. */
  9822. #define DES_ROUND(X,Y) \
  9823. { \
  9824. T = *SK++ ^ X; \
  9825. Y ^= SB8[ (T ) & 0x3F ] ^ \
  9826. SB6[ (T >> 8) & 0x3F ] ^ \
  9827. SB4[ (T >> 16) & 0x3F ] ^ \
  9828. SB2[ (T >> 24) & 0x3F ]; \
  9829. \
  9830. T = *SK++ ^ ((X << 28) | (X >> 4)); \
  9831. Y ^= SB7[ (T ) & 0x3F ] ^ \
  9832. SB5[ (T >> 8) & 0x3F ] ^ \
  9833. SB3[ (T >> 16) & 0x3F ] ^ \
  9834. SB1[ (T >> 24) & 0x3F ]; \
  9835. }
  9836. #define SWAP(a,b) { uint32_t t = a; a = b; b = t; t = 0; }
  9837. void mbedtls_des_init( mbedtls_des_context *ctx )
  9838. {
  9839. memset( ctx, 0, sizeof( mbedtls_des_context ) );
  9840. }
  9841. void mbedtls_des_free( mbedtls_des_context *ctx )
  9842. {
  9843. if( ctx == NULL )
  9844. return;
  9845. des_zeroize( ctx, sizeof( mbedtls_des_context ) );
  9846. }
  9847. void mbedtls_des3_init( mbedtls_des3_context *ctx )
  9848. {
  9849. memset( ctx, 0, sizeof( mbedtls_des3_context ) );
  9850. }
  9851. void mbedtls_des3_free( mbedtls_des3_context *ctx )
  9852. {
  9853. if( ctx == NULL )
  9854. return;
  9855. des_zeroize( ctx, sizeof( mbedtls_des3_context ) );
  9856. }
  9857. static const unsigned char odd_parity_table[128] = { 1, 2, 4, 7, 8,
  9858. 11, 13, 14, 16, 19, 21, 22, 25, 26, 28, 31, 32, 35, 37, 38, 41, 42, 44,
  9859. 47, 49, 50, 52, 55, 56, 59, 61, 62, 64, 67, 69, 70, 73, 74, 76, 79, 81,
  9860. 82, 84, 87, 88, 91, 93, 94, 97, 98, 100, 103, 104, 107, 109, 110, 112,
  9861. 115, 117, 118, 121, 122, 124, 127, 128, 131, 133, 134, 137, 138, 140,
  9862. 143, 145, 146, 148, 151, 152, 155, 157, 158, 161, 162, 164, 167, 168,
  9863. 171, 173, 174, 176, 179, 181, 182, 185, 186, 188, 191, 193, 194, 196,
  9864. 199, 200, 203, 205, 206, 208, 211, 213, 214, 217, 218, 220, 223, 224,
  9865. 227, 229, 230, 233, 234, 236, 239, 241, 242, 244, 247, 248, 251, 253,
  9866. 254 };
  9867. void mbedtls_des_key_set_parity( unsigned char key[MBEDTLS_DES_KEY_SIZE] )
  9868. {
  9869. int i;
  9870. for( i = 0; i < MBEDTLS_DES_KEY_SIZE; i++ )
  9871. key[i] = odd_parity_table[key[i] / 2];
  9872. }
  9873. /*
  9874. * Check the given key's parity, returns 1 on failure, 0 on SUCCESS
  9875. */
  9876. int mbedtls_des_key_check_key_parity( const unsigned char key[MBEDTLS_DES_KEY_SIZE] )
  9877. {
  9878. int i;
  9879. for( i = 0; i < MBEDTLS_DES_KEY_SIZE; i++ )
  9880. if( key[i] != odd_parity_table[key[i] / 2] )
  9881. return( 1 );
  9882. return( 0 );
  9883. }
  9884. /*
  9885. * Table of weak and semi-weak keys
  9886. *
  9887. * Source: http://en.wikipedia.org/wiki/Weak_key
  9888. *
  9889. * Weak:
  9890. * Alternating ones + zeros (0x0101010101010101)
  9891. * Alternating 'F' + 'E' (0xFEFEFEFEFEFEFEFE)
  9892. * '0xE0E0E0E0F1F1F1F1'
  9893. * '0x1F1F1F1F0E0E0E0E'
  9894. *
  9895. * Semi-weak:
  9896. * 0x011F011F010E010E and 0x1F011F010E010E01
  9897. * 0x01E001E001F101F1 and 0xE001E001F101F101
  9898. * 0x01FE01FE01FE01FE and 0xFE01FE01FE01FE01
  9899. * 0x1FE01FE00EF10EF1 and 0xE01FE01FF10EF10E
  9900. * 0x1FFE1FFE0EFE0EFE and 0xFE1FFE1FFE0EFE0E
  9901. * 0xE0FEE0FEF1FEF1FE and 0xFEE0FEE0FEF1FEF1
  9902. *
  9903. */
  9904. #define WEAK_KEY_COUNT 16
  9905. static const unsigned char weak_key_table[WEAK_KEY_COUNT][MBEDTLS_DES_KEY_SIZE] =
  9906. {
  9907. { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
  9908. { 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE },
  9909. { 0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E },
  9910. { 0xE0, 0xE0, 0xE0, 0xE0, 0xF1, 0xF1, 0xF1, 0xF1 },
  9911. { 0x01, 0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E },
  9912. { 0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E, 0x01 },
  9913. { 0x01, 0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1 },
  9914. { 0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1, 0x01 },
  9915. { 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE },
  9916. { 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01 },
  9917. { 0x1F, 0xE0, 0x1F, 0xE0, 0x0E, 0xF1, 0x0E, 0xF1 },
  9918. { 0xE0, 0x1F, 0xE0, 0x1F, 0xF1, 0x0E, 0xF1, 0x0E },
  9919. { 0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E, 0xFE },
  9920. { 0xFE, 0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E },
  9921. { 0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1, 0xFE },
  9922. { 0xFE, 0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1 }
  9923. };
  9924. int mbedtls_des_key_check_weak( const unsigned char key[MBEDTLS_DES_KEY_SIZE] )
  9925. {
  9926. int i;
  9927. for( i = 0; i < WEAK_KEY_COUNT; i++ )
  9928. if( memcmp( weak_key_table[i], key, MBEDTLS_DES_KEY_SIZE) == 0 )
  9929. return( 1 );
  9930. return( 0 );
  9931. }
  9932. #if !defined(MBEDTLS_DES_SETKEY_ALT)
  9933. void mbedtls_des_setkey( uint32_t SK[32], const unsigned char key[MBEDTLS_DES_KEY_SIZE] )
  9934. {
  9935. int i;
  9936. uint32_t X, Y, T;
  9937. GET_UINT32_BE( X, key, 0 );
  9938. GET_UINT32_BE( Y, key, 4 );
  9939. /*
  9940. * Permuted Choice 1
  9941. */
  9942. T = ((Y >> 4) ^ X) & 0x0F0F0F0F; X ^= T; Y ^= (T << 4);
  9943. T = ((Y ) ^ X) & 0x10101010; X ^= T; Y ^= (T );
  9944. X = (LHs[ (X ) & 0xF] << 3) | (LHs[ (X >> 8) & 0xF ] << 2)
  9945. | (LHs[ (X >> 16) & 0xF] << 1) | (LHs[ (X >> 24) & 0xF ] )
  9946. | (LHs[ (X >> 5) & 0xF] << 7) | (LHs[ (X >> 13) & 0xF ] << 6)
  9947. | (LHs[ (X >> 21) & 0xF] << 5) | (LHs[ (X >> 29) & 0xF ] << 4);
  9948. Y = (RHs[ (Y >> 1) & 0xF] << 3) | (RHs[ (Y >> 9) & 0xF ] << 2)
  9949. | (RHs[ (Y >> 17) & 0xF] << 1) | (RHs[ (Y >> 25) & 0xF ] )
  9950. | (RHs[ (Y >> 4) & 0xF] << 7) | (RHs[ (Y >> 12) & 0xF ] << 6)
  9951. | (RHs[ (Y >> 20) & 0xF] << 5) | (RHs[ (Y >> 28) & 0xF ] << 4);
  9952. X &= 0x0FFFFFFF;
  9953. Y &= 0x0FFFFFFF;
  9954. /*
  9955. * calculate subkeys
  9956. */
  9957. for( i = 0; i < 16; i++ )
  9958. {
  9959. if( i < 2 || i == 8 || i == 15 )
  9960. {
  9961. X = ((X << 1) | (X >> 27)) & 0x0FFFFFFF;
  9962. Y = ((Y << 1) | (Y >> 27)) & 0x0FFFFFFF;
  9963. }
  9964. else
  9965. {
  9966. X = ((X << 2) | (X >> 26)) & 0x0FFFFFFF;
  9967. Y = ((Y << 2) | (Y >> 26)) & 0x0FFFFFFF;
  9968. }
  9969. *SK++ = ((X << 4) & 0x24000000) | ((X << 28) & 0x10000000)
  9970. | ((X << 14) & 0x08000000) | ((X << 18) & 0x02080000)
  9971. | ((X << 6) & 0x01000000) | ((X << 9) & 0x00200000)
  9972. | ((X >> 1) & 0x00100000) | ((X << 10) & 0x00040000)
  9973. | ((X << 2) & 0x00020000) | ((X >> 10) & 0x00010000)
  9974. | ((Y >> 13) & 0x00002000) | ((Y >> 4) & 0x00001000)
  9975. | ((Y << 6) & 0x00000800) | ((Y >> 1) & 0x00000400)
  9976. | ((Y >> 14) & 0x00000200) | ((Y ) & 0x00000100)
  9977. | ((Y >> 5) & 0x00000020) | ((Y >> 10) & 0x00000010)
  9978. | ((Y >> 3) & 0x00000008) | ((Y >> 18) & 0x00000004)
  9979. | ((Y >> 26) & 0x00000002) | ((Y >> 24) & 0x00000001);
  9980. *SK++ = ((X << 15) & 0x20000000) | ((X << 17) & 0x10000000)
  9981. | ((X << 10) & 0x08000000) | ((X << 22) & 0x04000000)
  9982. | ((X >> 2) & 0x02000000) | ((X << 1) & 0x01000000)
  9983. | ((X << 16) & 0x00200000) | ((X << 11) & 0x00100000)
  9984. | ((X << 3) & 0x00080000) | ((X >> 6) & 0x00040000)
  9985. | ((X << 15) & 0x00020000) | ((X >> 4) & 0x00010000)
  9986. | ((Y >> 2) & 0x00002000) | ((Y << 8) & 0x00001000)
  9987. | ((Y >> 14) & 0x00000808) | ((Y >> 9) & 0x00000400)
  9988. | ((Y ) & 0x00000200) | ((Y << 7) & 0x00000100)
  9989. | ((Y >> 7) & 0x00000020) | ((Y >> 3) & 0x00000011)
  9990. | ((Y << 2) & 0x00000004) | ((Y >> 21) & 0x00000002);
  9991. }
  9992. }
  9993. #endif /* !MBEDTLS_DES_SETKEY_ALT */
  9994. /*
  9995. * DES key schedule (56-bit, encryption)
  9996. */
  9997. int mbedtls_des_setkey_enc( mbedtls_des_context *ctx, const unsigned char key[MBEDTLS_DES_KEY_SIZE] )
  9998. {
  9999. mbedtls_des_setkey( ctx->sk, key );
  10000. return( 0 );
  10001. }
  10002. /*
  10003. * DES key schedule (56-bit, decryption)
  10004. */
  10005. int mbedtls_des_setkey_dec( mbedtls_des_context *ctx, const unsigned char key[MBEDTLS_DES_KEY_SIZE] )
  10006. {
  10007. int i;
  10008. mbedtls_des_setkey( ctx->sk, key );
  10009. for( i = 0; i < 16; i += 2 )
  10010. {
  10011. SWAP( ctx->sk[i ], ctx->sk[30 - i] );
  10012. SWAP( ctx->sk[i + 1], ctx->sk[31 - i] );
  10013. }
  10014. return( 0 );
  10015. }
  10016. static void des3_set2key( uint32_t esk[96],
  10017. uint32_t dsk[96],
  10018. const unsigned char key[MBEDTLS_DES_KEY_SIZE*2] )
  10019. {
  10020. int i;
  10021. mbedtls_des_setkey( esk, key );
  10022. mbedtls_des_setkey( dsk + 32, key + 8 );
  10023. for( i = 0; i < 32; i += 2 )
  10024. {
  10025. dsk[i ] = esk[30 - i];
  10026. dsk[i + 1] = esk[31 - i];
  10027. esk[i + 32] = dsk[62 - i];
  10028. esk[i + 33] = dsk[63 - i];
  10029. esk[i + 64] = esk[i ];
  10030. esk[i + 65] = esk[i + 1];
  10031. dsk[i + 64] = dsk[i ];
  10032. dsk[i + 65] = dsk[i + 1];
  10033. }
  10034. }
  10035. /*
  10036. * Triple-DES key schedule (112-bit, encryption)
  10037. */
  10038. int mbedtls_des3_set2key_enc( mbedtls_des3_context *ctx,
  10039. const unsigned char key[MBEDTLS_DES_KEY_SIZE * 2] )
  10040. {
  10041. uint32_t sk[96];
  10042. des3_set2key( ctx->sk, sk, key );
  10043. des_zeroize( sk, sizeof( sk ) );
  10044. return( 0 );
  10045. }
  10046. /*
  10047. * Triple-DES key schedule (112-bit, decryption)
  10048. */
  10049. int mbedtls_des3_set2key_dec( mbedtls_des3_context *ctx,
  10050. const unsigned char key[MBEDTLS_DES_KEY_SIZE * 2] )
  10051. {
  10052. uint32_t sk[96];
  10053. des3_set2key( sk, ctx->sk, key );
  10054. des_zeroize( sk, sizeof( sk ) );
  10055. return( 0 );
  10056. }
  10057. static void des3_set3key( uint32_t esk[96],
  10058. uint32_t dsk[96],
  10059. const unsigned char key[24] )
  10060. {
  10061. int i;
  10062. mbedtls_des_setkey( esk, key );
  10063. mbedtls_des_setkey( dsk + 32, key + 8 );
  10064. mbedtls_des_setkey( esk + 64, key + 16 );
  10065. for( i = 0; i < 32; i += 2 )
  10066. {
  10067. dsk[i ] = esk[94 - i];
  10068. dsk[i + 1] = esk[95 - i];
  10069. esk[i + 32] = dsk[62 - i];
  10070. esk[i + 33] = dsk[63 - i];
  10071. dsk[i + 64] = esk[30 - i];
  10072. dsk[i + 65] = esk[31 - i];
  10073. }
  10074. }
  10075. /*
  10076. * Triple-DES key schedule (168-bit, encryption)
  10077. */
  10078. int mbedtls_des3_set3key_enc( mbedtls_des3_context *ctx,
  10079. const unsigned char key[MBEDTLS_DES_KEY_SIZE * 3] )
  10080. {
  10081. uint32_t sk[96];
  10082. des3_set3key( ctx->sk, sk, key );
  10083. des_zeroize( sk, sizeof( sk ) );
  10084. return( 0 );
  10085. }
  10086. /*
  10087. * Triple-DES key schedule (168-bit, decryption)
  10088. */
  10089. int mbedtls_des3_set3key_dec( mbedtls_des3_context *ctx,
  10090. const unsigned char key[MBEDTLS_DES_KEY_SIZE * 3] )
  10091. {
  10092. uint32_t sk[96];
  10093. des3_set3key( sk, ctx->sk, key );
  10094. des_zeroize( sk, sizeof( sk ) );
  10095. return( 0 );
  10096. }
  10097. /*
  10098. * DES-ECB block encryption/decryption
  10099. */
  10100. #if !defined(MBEDTLS_DES_CRYPT_ECB_ALT)
  10101. int mbedtls_des_crypt_ecb( mbedtls_des_context *ctx,
  10102. const unsigned char input[8],
  10103. unsigned char output[8] )
  10104. {
  10105. int i;
  10106. uint32_t X, Y, T, *SK;
  10107. SK = ctx->sk;
  10108. GET_UINT32_BE( X, input, 0 );
  10109. GET_UINT32_BE( Y, input, 4 );
  10110. DES_IP( X, Y );
  10111. for( i = 0; i < 8; i++ )
  10112. {
  10113. DES_ROUND( Y, X );
  10114. DES_ROUND( X, Y );
  10115. }
  10116. DES_FP( Y, X );
  10117. PUT_UINT32_BE( Y, output, 0 );
  10118. PUT_UINT32_BE( X, output, 4 );
  10119. return( 0 );
  10120. }
  10121. #endif /* !MBEDTLS_DES_CRYPT_ECB_ALT */
  10122. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  10123. /*
  10124. * DES-CBC buffer encryption/decryption
  10125. */
  10126. int mbedtls_des_crypt_cbc( mbedtls_des_context *ctx,
  10127. int mode,
  10128. size_t length,
  10129. unsigned char iv[8],
  10130. const unsigned char *input,
  10131. unsigned char *output )
  10132. {
  10133. int i;
  10134. unsigned char temp[8];
  10135. if( length % 8 )
  10136. return( MBEDTLS_ERR_DES_INVALID_INPUT_LENGTH );
  10137. if( mode == MBEDTLS_DES_ENCRYPT )
  10138. {
  10139. while( length > 0 )
  10140. {
  10141. for( i = 0; i < 8; i++ )
  10142. output[i] = (unsigned char)( input[i] ^ iv[i] );
  10143. mbedtls_des_crypt_ecb( ctx, output, output );
  10144. memcpy( iv, output, 8 );
  10145. input += 8;
  10146. output += 8;
  10147. length -= 8;
  10148. }
  10149. }
  10150. else /* MBEDTLS_DES_DECRYPT */
  10151. {
  10152. while( length > 0 )
  10153. {
  10154. memcpy( temp, input, 8 );
  10155. mbedtls_des_crypt_ecb( ctx, input, output );
  10156. for( i = 0; i < 8; i++ )
  10157. output[i] = (unsigned char)( output[i] ^ iv[i] );
  10158. memcpy( iv, temp, 8 );
  10159. input += 8;
  10160. output += 8;
  10161. length -= 8;
  10162. }
  10163. }
  10164. return( 0 );
  10165. }
  10166. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  10167. /*
  10168. * 3DES-ECB block encryption/decryption
  10169. */
  10170. #if !defined(MBEDTLS_DES3_CRYPT_ECB_ALT)
  10171. int mbedtls_des3_crypt_ecb( mbedtls_des3_context *ctx,
  10172. const unsigned char input[8],
  10173. unsigned char output[8] )
  10174. {
  10175. int i;
  10176. uint32_t X, Y, T, *SK;
  10177. SK = ctx->sk;
  10178. GET_UINT32_BE( X, input, 0 );
  10179. GET_UINT32_BE( Y, input, 4 );
  10180. DES_IP( X, Y );
  10181. for( i = 0; i < 8; i++ )
  10182. {
  10183. DES_ROUND( Y, X );
  10184. DES_ROUND( X, Y );
  10185. }
  10186. for( i = 0; i < 8; i++ )
  10187. {
  10188. DES_ROUND( X, Y );
  10189. DES_ROUND( Y, X );
  10190. }
  10191. for( i = 0; i < 8; i++ )
  10192. {
  10193. DES_ROUND( Y, X );
  10194. DES_ROUND( X, Y );
  10195. }
  10196. DES_FP( Y, X );
  10197. PUT_UINT32_BE( Y, output, 0 );
  10198. PUT_UINT32_BE( X, output, 4 );
  10199. return( 0 );
  10200. }
  10201. #endif /* !MBEDTLS_DES3_CRYPT_ECB_ALT */
  10202. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  10203. /*
  10204. * 3DES-CBC buffer encryption/decryption
  10205. */
  10206. int mbedtls_des3_crypt_cbc( mbedtls_des3_context *ctx,
  10207. int mode,
  10208. size_t length,
  10209. unsigned char iv[8],
  10210. const unsigned char *input,
  10211. unsigned char *output )
  10212. {
  10213. int i;
  10214. unsigned char temp[8];
  10215. if( length % 8 )
  10216. return( MBEDTLS_ERR_DES_INVALID_INPUT_LENGTH );
  10217. if( mode == MBEDTLS_DES_ENCRYPT )
  10218. {
  10219. while( length > 0 )
  10220. {
  10221. for( i = 0; i < 8; i++ )
  10222. output[i] = (unsigned char)( input[i] ^ iv[i] );
  10223. mbedtls_des3_crypt_ecb( ctx, output, output );
  10224. memcpy( iv, output, 8 );
  10225. input += 8;
  10226. output += 8;
  10227. length -= 8;
  10228. }
  10229. }
  10230. else /* MBEDTLS_DES_DECRYPT */
  10231. {
  10232. while( length > 0 )
  10233. {
  10234. memcpy( temp, input, 8 );
  10235. mbedtls_des3_crypt_ecb( ctx, input, output );
  10236. for( i = 0; i < 8; i++ )
  10237. output[i] = (unsigned char)( output[i] ^ iv[i] );
  10238. memcpy( iv, temp, 8 );
  10239. input += 8;
  10240. output += 8;
  10241. length -= 8;
  10242. }
  10243. }
  10244. return( 0 );
  10245. }
  10246. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  10247. #endif /* !MBEDTLS_DES_ALT */
  10248. #if defined(MBEDTLS_SELF_TEST)
  10249. /*
  10250. * DES and 3DES test vectors from:
  10251. *
  10252. * http://csrc.nist.gov/groups/STM/cavp/documents/des/tripledes-vectors.zip
  10253. */
  10254. static const unsigned char des3_test_keys[24] =
  10255. {
  10256. 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
  10257. 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01,
  10258. 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23
  10259. };
  10260. static const unsigned char des3_test_buf[8] =
  10261. {
  10262. 0x4E, 0x6F, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74
  10263. };
  10264. static const unsigned char des3_test_ecb_dec[3][8] =
  10265. {
  10266. { 0xCD, 0xD6, 0x4F, 0x2F, 0x94, 0x27, 0xC1, 0x5D },
  10267. { 0x69, 0x96, 0xC8, 0xFA, 0x47, 0xA2, 0xAB, 0xEB },
  10268. { 0x83, 0x25, 0x39, 0x76, 0x44, 0x09, 0x1A, 0x0A }
  10269. };
  10270. static const unsigned char des3_test_ecb_enc[3][8] =
  10271. {
  10272. { 0x6A, 0x2A, 0x19, 0xF4, 0x1E, 0xCA, 0x85, 0x4B },
  10273. { 0x03, 0xE6, 0x9F, 0x5B, 0xFA, 0x58, 0xEB, 0x42 },
  10274. { 0xDD, 0x17, 0xE8, 0xB8, 0xB4, 0x37, 0xD2, 0x32 }
  10275. };
  10276. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  10277. static const unsigned char des3_test_iv[8] =
  10278. {
  10279. 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF,
  10280. };
  10281. static const unsigned char des3_test_cbc_dec[3][8] =
  10282. {
  10283. { 0x12, 0x9F, 0x40, 0xB9, 0xD2, 0x00, 0x56, 0xB3 },
  10284. { 0x47, 0x0E, 0xFC, 0x9A, 0x6B, 0x8E, 0xE3, 0x93 },
  10285. { 0xC5, 0xCE, 0xCF, 0x63, 0xEC, 0xEC, 0x51, 0x4C }
  10286. };
  10287. static const unsigned char des3_test_cbc_enc[3][8] =
  10288. {
  10289. { 0x54, 0xF1, 0x5A, 0xF6, 0xEB, 0xE3, 0xA4, 0xB4 },
  10290. { 0x35, 0x76, 0x11, 0x56, 0x5F, 0xA1, 0x8E, 0x4D },
  10291. { 0xCB, 0x19, 0x1F, 0x85, 0xD1, 0xED, 0x84, 0x39 }
  10292. };
  10293. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  10294. /*
  10295. * Checkup routine
  10296. */
  10297. int mbedtls_des_self_test( int verbose )
  10298. {
  10299. int i, j, u, v, ret = 0;
  10300. mbedtls_des_context ctx;
  10301. mbedtls_des3_context ctx3;
  10302. unsigned char buf[8];
  10303. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  10304. unsigned char prv[8];
  10305. unsigned char iv[8];
  10306. #endif
  10307. mbedtls_des_init( &ctx );
  10308. mbedtls_des3_init( &ctx3 );
  10309. /*
  10310. * ECB mode
  10311. */
  10312. for( i = 0; i < 6; i++ )
  10313. {
  10314. u = i >> 1;
  10315. v = i & 1;
  10316. if( verbose != 0 )
  10317. mbedtls_printf( " DES%c-ECB-%3d (%s): ",
  10318. ( u == 0 ) ? ' ' : '3', 56 + u * 56,
  10319. ( v == MBEDTLS_DES_DECRYPT ) ? "dec" : "enc" );
  10320. memcpy( buf, des3_test_buf, 8 );
  10321. switch( i )
  10322. {
  10323. case 0:
  10324. mbedtls_des_setkey_dec( &ctx, des3_test_keys );
  10325. break;
  10326. case 1:
  10327. mbedtls_des_setkey_enc( &ctx, des3_test_keys );
  10328. break;
  10329. case 2:
  10330. mbedtls_des3_set2key_dec( &ctx3, des3_test_keys );
  10331. break;
  10332. case 3:
  10333. mbedtls_des3_set2key_enc( &ctx3, des3_test_keys );
  10334. break;
  10335. case 4:
  10336. mbedtls_des3_set3key_dec( &ctx3, des3_test_keys );
  10337. break;
  10338. case 5:
  10339. mbedtls_des3_set3key_enc( &ctx3, des3_test_keys );
  10340. break;
  10341. default:
  10342. return( 1 );
  10343. }
  10344. for( j = 0; j < 10000; j++ )
  10345. {
  10346. if( u == 0 )
  10347. mbedtls_des_crypt_ecb( &ctx, buf, buf );
  10348. else
  10349. mbedtls_des3_crypt_ecb( &ctx3, buf, buf );
  10350. }
  10351. if( ( v == MBEDTLS_DES_DECRYPT &&
  10352. memcmp( buf, des3_test_ecb_dec[u], 8 ) != 0 ) ||
  10353. ( v != MBEDTLS_DES_DECRYPT &&
  10354. memcmp( buf, des3_test_ecb_enc[u], 8 ) != 0 ) )
  10355. {
  10356. if( verbose != 0 )
  10357. mbedtls_printf( "failed\n" );
  10358. ret = 1;
  10359. goto exit;
  10360. }
  10361. if( verbose != 0 )
  10362. mbedtls_printf( "passed\n" );
  10363. }
  10364. if( verbose != 0 )
  10365. mbedtls_printf( "\n" );
  10366. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  10367. /*
  10368. * CBC mode
  10369. */
  10370. for( i = 0; i < 6; i++ )
  10371. {
  10372. u = i >> 1;
  10373. v = i & 1;
  10374. if( verbose != 0 )
  10375. mbedtls_printf( " DES%c-CBC-%3d (%s): ",
  10376. ( u == 0 ) ? ' ' : '3', 56 + u * 56,
  10377. ( v == MBEDTLS_DES_DECRYPT ) ? "dec" : "enc" );
  10378. memcpy( iv, des3_test_iv, 8 );
  10379. memcpy( prv, des3_test_iv, 8 );
  10380. memcpy( buf, des3_test_buf, 8 );
  10381. switch( i )
  10382. {
  10383. case 0:
  10384. mbedtls_des_setkey_dec( &ctx, des3_test_keys );
  10385. break;
  10386. case 1:
  10387. mbedtls_des_setkey_enc( &ctx, des3_test_keys );
  10388. break;
  10389. case 2:
  10390. mbedtls_des3_set2key_dec( &ctx3, des3_test_keys );
  10391. break;
  10392. case 3:
  10393. mbedtls_des3_set2key_enc( &ctx3, des3_test_keys );
  10394. break;
  10395. case 4:
  10396. mbedtls_des3_set3key_dec( &ctx3, des3_test_keys );
  10397. break;
  10398. case 5:
  10399. mbedtls_des3_set3key_enc( &ctx3, des3_test_keys );
  10400. break;
  10401. default:
  10402. return( 1 );
  10403. }
  10404. if( v == MBEDTLS_DES_DECRYPT )
  10405. {
  10406. for( j = 0; j < 10000; j++ )
  10407. {
  10408. if( u == 0 )
  10409. mbedtls_des_crypt_cbc( &ctx, v, 8, iv, buf, buf );
  10410. else
  10411. mbedtls_des3_crypt_cbc( &ctx3, v, 8, iv, buf, buf );
  10412. }
  10413. }
  10414. else
  10415. {
  10416. for( j = 0; j < 10000; j++ )
  10417. {
  10418. unsigned char tmp[8];
  10419. if( u == 0 )
  10420. mbedtls_des_crypt_cbc( &ctx, v, 8, iv, buf, buf );
  10421. else
  10422. mbedtls_des3_crypt_cbc( &ctx3, v, 8, iv, buf, buf );
  10423. memcpy( tmp, prv, 8 );
  10424. memcpy( prv, buf, 8 );
  10425. memcpy( buf, tmp, 8 );
  10426. }
  10427. memcpy( buf, prv, 8 );
  10428. }
  10429. if( ( v == MBEDTLS_DES_DECRYPT &&
  10430. memcmp( buf, des3_test_cbc_dec[u], 8 ) != 0 ) ||
  10431. ( v != MBEDTLS_DES_DECRYPT &&
  10432. memcmp( buf, des3_test_cbc_enc[u], 8 ) != 0 ) )
  10433. {
  10434. if( verbose != 0 )
  10435. mbedtls_printf( "failed\n" );
  10436. ret = 1;
  10437. goto exit;
  10438. }
  10439. if( verbose != 0 )
  10440. mbedtls_printf( "passed\n" );
  10441. }
  10442. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  10443. if( verbose != 0 )
  10444. mbedtls_printf( "\n" );
  10445. exit:
  10446. mbedtls_des_free( &ctx );
  10447. mbedtls_des3_free( &ctx3 );
  10448. return( ret );
  10449. }
  10450. #endif /* MBEDTLS_SELF_TEST */
  10451. #endif /* MBEDTLS_DES_C */
  10452. /********* Start of file library/dhm.c ************/
  10453. /*
  10454. * Diffie-Hellman-Merkle key exchange
  10455. *
  10456. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  10457. * SPDX-License-Identifier: Apache-2.0
  10458. *
  10459. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  10460. * not use this file except in compliance with the License.
  10461. * You may obtain a copy of the License at
  10462. *
  10463. * http://www.apache.org/licenses/LICENSE-2.0
  10464. *
  10465. * Unless required by applicable law or agreed to in writing, software
  10466. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  10467. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10468. * See the License for the specific language governing permissions and
  10469. * limitations under the License.
  10470. *
  10471. * This file is part of mbed TLS (https://tls.mbed.org)
  10472. */
  10473. /*
  10474. * Reference:
  10475. *
  10476. * http://www.cacr.math.uwaterloo.ca/hac/ (chapter 12)
  10477. */
  10478. #if !defined(MBEDTLS_CONFIG_FILE)
  10479. #else
  10480. #endif
  10481. #if defined(MBEDTLS_DHM_C)
  10482. #include <string.h>
  10483. #if defined(MBEDTLS_PEM_PARSE_C)
  10484. #endif
  10485. #if defined(MBEDTLS_ASN1_PARSE_C)
  10486. #endif
  10487. #if defined(MBEDTLS_PLATFORM_C)
  10488. #else
  10489. #include <stdlib.h>
  10490. #include <stdio.h>
  10491. #define mbedtls_printf printf
  10492. #define mbedtls_calloc calloc
  10493. #define mbedtls_free free
  10494. #endif
  10495. /* Implementation that should never be optimized out by the compiler */
  10496. static void dhm_zeroize( void *v, size_t n ) {
  10497. volatile unsigned char *p = v; while( n-- ) *p++ = 0;
  10498. }
  10499. /*
  10500. * helper to validate the mbedtls_mpi size and import it
  10501. */
  10502. static int dhm_read_bignum( mbedtls_mpi *X,
  10503. unsigned char **p,
  10504. const unsigned char *end )
  10505. {
  10506. int ret, n;
  10507. if( end - *p < 2 )
  10508. return( MBEDTLS_ERR_DHM_BAD_INPUT_DATA );
  10509. n = ( (*p)[0] << 8 ) | (*p)[1];
  10510. (*p) += 2;
  10511. if( (int)( end - *p ) < n )
  10512. return( MBEDTLS_ERR_DHM_BAD_INPUT_DATA );
  10513. if( ( ret = mbedtls_mpi_read_binary( X, *p, n ) ) != 0 )
  10514. return( MBEDTLS_ERR_DHM_READ_PARAMS_FAILED + ret );
  10515. (*p) += n;
  10516. return( 0 );
  10517. }
  10518. /*
  10519. * Verify sanity of parameter with regards to P
  10520. *
  10521. * Parameter should be: 2 <= public_param <= P - 2
  10522. *
  10523. * For more information on the attack, see:
  10524. * http://www.cl.cam.ac.uk/~rja14/Papers/psandqs.pdf
  10525. * http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2005-2643
  10526. */
  10527. static int dhm_check_range( const mbedtls_mpi *param, const mbedtls_mpi *P )
  10528. {
  10529. mbedtls_mpi L, U;
  10530. int ret = MBEDTLS_ERR_DHM_BAD_INPUT_DATA;
  10531. mbedtls_mpi_init( &L ); mbedtls_mpi_init( &U );
  10532. MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &L, 2 ) );
  10533. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &U, P, 2 ) );
  10534. if( mbedtls_mpi_cmp_mpi( param, &L ) >= 0 &&
  10535. mbedtls_mpi_cmp_mpi( param, &U ) <= 0 )
  10536. {
  10537. ret = 0;
  10538. }
  10539. cleanup:
  10540. mbedtls_mpi_free( &L ); mbedtls_mpi_free( &U );
  10541. return( ret );
  10542. }
  10543. void mbedtls_dhm_init( mbedtls_dhm_context *ctx )
  10544. {
  10545. memset( ctx, 0, sizeof( mbedtls_dhm_context ) );
  10546. }
  10547. /*
  10548. * Parse the ServerKeyExchange parameters
  10549. */
  10550. int mbedtls_dhm_read_params( mbedtls_dhm_context *ctx,
  10551. unsigned char **p,
  10552. const unsigned char *end )
  10553. {
  10554. int ret;
  10555. if( ( ret = dhm_read_bignum( &ctx->P, p, end ) ) != 0 ||
  10556. ( ret = dhm_read_bignum( &ctx->G, p, end ) ) != 0 ||
  10557. ( ret = dhm_read_bignum( &ctx->GY, p, end ) ) != 0 )
  10558. return( ret );
  10559. if( ( ret = dhm_check_range( &ctx->GY, &ctx->P ) ) != 0 )
  10560. return( ret );
  10561. ctx->len = mbedtls_mpi_size( &ctx->P );
  10562. return( 0 );
  10563. }
  10564. /*
  10565. * Setup and write the ServerKeyExchange parameters
  10566. */
  10567. int mbedtls_dhm_make_params( mbedtls_dhm_context *ctx, int x_size,
  10568. unsigned char *output, size_t *olen,
  10569. int (*f_rng)(void *, unsigned char *, size_t),
  10570. void *p_rng )
  10571. {
  10572. int ret, count = 0;
  10573. size_t n1, n2, n3;
  10574. unsigned char *p;
  10575. if( mbedtls_mpi_cmp_int( &ctx->P, 0 ) == 0 )
  10576. return( MBEDTLS_ERR_DHM_BAD_INPUT_DATA );
  10577. /*
  10578. * Generate X as large as possible ( < P )
  10579. */
  10580. do
  10581. {
  10582. mbedtls_mpi_fill_random( &ctx->X, x_size, f_rng, p_rng );
  10583. while( mbedtls_mpi_cmp_mpi( &ctx->X, &ctx->P ) >= 0 )
  10584. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &ctx->X, 1 ) );
  10585. if( count++ > 10 )
  10586. return( MBEDTLS_ERR_DHM_MAKE_PARAMS_FAILED );
  10587. }
  10588. while( dhm_check_range( &ctx->X, &ctx->P ) != 0 );
  10589. /*
  10590. * Calculate GX = G^X mod P
  10591. */
  10592. MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &ctx->GX, &ctx->G, &ctx->X,
  10593. &ctx->P , &ctx->RP ) );
  10594. if( ( ret = dhm_check_range( &ctx->GX, &ctx->P ) ) != 0 )
  10595. return( ret );
  10596. /*
  10597. * export P, G, GX
  10598. */
  10599. #define DHM_MPI_EXPORT(X,n) \
  10600. MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( X, p + 2, n ) ); \
  10601. *p++ = (unsigned char)( n >> 8 ); \
  10602. *p++ = (unsigned char)( n ); p += n;
  10603. n1 = mbedtls_mpi_size( &ctx->P );
  10604. n2 = mbedtls_mpi_size( &ctx->G );
  10605. n3 = mbedtls_mpi_size( &ctx->GX );
  10606. p = output;
  10607. DHM_MPI_EXPORT( &ctx->P , n1 );
  10608. DHM_MPI_EXPORT( &ctx->G , n2 );
  10609. DHM_MPI_EXPORT( &ctx->GX, n3 );
  10610. *olen = p - output;
  10611. ctx->len = n1;
  10612. cleanup:
  10613. if( ret != 0 )
  10614. return( MBEDTLS_ERR_DHM_MAKE_PARAMS_FAILED + ret );
  10615. return( 0 );
  10616. }
  10617. /*
  10618. * Import the peer's public value G^Y
  10619. */
  10620. int mbedtls_dhm_read_public( mbedtls_dhm_context *ctx,
  10621. const unsigned char *input, size_t ilen )
  10622. {
  10623. int ret;
  10624. if( ctx == NULL || ilen < 1 || ilen > ctx->len )
  10625. return( MBEDTLS_ERR_DHM_BAD_INPUT_DATA );
  10626. if( ( ret = mbedtls_mpi_read_binary( &ctx->GY, input, ilen ) ) != 0 )
  10627. return( MBEDTLS_ERR_DHM_READ_PUBLIC_FAILED + ret );
  10628. return( 0 );
  10629. }
  10630. /*
  10631. * Create own private value X and export G^X
  10632. */
  10633. int mbedtls_dhm_make_public( mbedtls_dhm_context *ctx, int x_size,
  10634. unsigned char *output, size_t olen,
  10635. int (*f_rng)(void *, unsigned char *, size_t),
  10636. void *p_rng )
  10637. {
  10638. int ret, count = 0;
  10639. if( ctx == NULL || olen < 1 || olen > ctx->len )
  10640. return( MBEDTLS_ERR_DHM_BAD_INPUT_DATA );
  10641. if( mbedtls_mpi_cmp_int( &ctx->P, 0 ) == 0 )
  10642. return( MBEDTLS_ERR_DHM_BAD_INPUT_DATA );
  10643. /*
  10644. * generate X and calculate GX = G^X mod P
  10645. */
  10646. do
  10647. {
  10648. mbedtls_mpi_fill_random( &ctx->X, x_size, f_rng, p_rng );
  10649. while( mbedtls_mpi_cmp_mpi( &ctx->X, &ctx->P ) >= 0 )
  10650. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &ctx->X, 1 ) );
  10651. if( count++ > 10 )
  10652. return( MBEDTLS_ERR_DHM_MAKE_PUBLIC_FAILED );
  10653. }
  10654. while( dhm_check_range( &ctx->X, &ctx->P ) != 0 );
  10655. MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &ctx->GX, &ctx->G, &ctx->X,
  10656. &ctx->P , &ctx->RP ) );
  10657. if( ( ret = dhm_check_range( &ctx->GX, &ctx->P ) ) != 0 )
  10658. return( ret );
  10659. MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &ctx->GX, output, olen ) );
  10660. cleanup:
  10661. if( ret != 0 )
  10662. return( MBEDTLS_ERR_DHM_MAKE_PUBLIC_FAILED + ret );
  10663. return( 0 );
  10664. }
  10665. /*
  10666. * Use the blinding method and optimisation suggested in section 10 of:
  10667. * KOCHER, Paul C. Timing attacks on implementations of Diffie-Hellman, RSA,
  10668. * DSS, and other systems. In : Advances in Cryptology-CRYPTO'96. Springer
  10669. * Berlin Heidelberg, 1996. p. 104-113.
  10670. */
  10671. static int dhm_update_blinding( mbedtls_dhm_context *ctx,
  10672. int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
  10673. {
  10674. int ret, count;
  10675. /*
  10676. * Don't use any blinding the first time a particular X is used,
  10677. * but remember it to use blinding next time.
  10678. */
  10679. if( mbedtls_mpi_cmp_mpi( &ctx->X, &ctx->pX ) != 0 )
  10680. {
  10681. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &ctx->pX, &ctx->X ) );
  10682. MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &ctx->Vi, 1 ) );
  10683. MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &ctx->Vf, 1 ) );
  10684. return( 0 );
  10685. }
  10686. /*
  10687. * Ok, we need blinding. Can we re-use existing values?
  10688. * If yes, just update them by squaring them.
  10689. */
  10690. if( mbedtls_mpi_cmp_int( &ctx->Vi, 1 ) != 0 )
  10691. {
  10692. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &ctx->Vi, &ctx->Vi, &ctx->Vi ) );
  10693. MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &ctx->Vi, &ctx->Vi, &ctx->P ) );
  10694. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &ctx->Vf, &ctx->Vf, &ctx->Vf ) );
  10695. MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &ctx->Vf, &ctx->Vf, &ctx->P ) );
  10696. return( 0 );
  10697. }
  10698. /*
  10699. * We need to generate blinding values from scratch
  10700. */
  10701. /* Vi = random( 2, P-1 ) */
  10702. count = 0;
  10703. do
  10704. {
  10705. mbedtls_mpi_fill_random( &ctx->Vi, mbedtls_mpi_size( &ctx->P ), f_rng, p_rng );
  10706. while( mbedtls_mpi_cmp_mpi( &ctx->Vi, &ctx->P ) >= 0 )
  10707. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &ctx->Vi, 1 ) );
  10708. if( count++ > 10 )
  10709. return( MBEDTLS_ERR_MPI_NOT_ACCEPTABLE );
  10710. }
  10711. while( mbedtls_mpi_cmp_int( &ctx->Vi, 1 ) <= 0 );
  10712. /* Vf = Vi^-X mod P */
  10713. MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( &ctx->Vf, &ctx->Vi, &ctx->P ) );
  10714. MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &ctx->Vf, &ctx->Vf, &ctx->X, &ctx->P, &ctx->RP ) );
  10715. cleanup:
  10716. return( ret );
  10717. }
  10718. /*
  10719. * Derive and export the shared secret (G^Y)^X mod P
  10720. */
  10721. int mbedtls_dhm_calc_secret( mbedtls_dhm_context *ctx,
  10722. unsigned char *output, size_t output_size, size_t *olen,
  10723. int (*f_rng)(void *, unsigned char *, size_t),
  10724. void *p_rng )
  10725. {
  10726. int ret;
  10727. mbedtls_mpi GYb;
  10728. if( ctx == NULL || output_size < ctx->len )
  10729. return( MBEDTLS_ERR_DHM_BAD_INPUT_DATA );
  10730. if( ( ret = dhm_check_range( &ctx->GY, &ctx->P ) ) != 0 )
  10731. return( ret );
  10732. mbedtls_mpi_init( &GYb );
  10733. /* Blind peer's value */
  10734. if( f_rng != NULL )
  10735. {
  10736. MBEDTLS_MPI_CHK( dhm_update_blinding( ctx, f_rng, p_rng ) );
  10737. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &GYb, &ctx->GY, &ctx->Vi ) );
  10738. MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &GYb, &GYb, &ctx->P ) );
  10739. }
  10740. else
  10741. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &GYb, &ctx->GY ) );
  10742. /* Do modular exponentiation */
  10743. MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &ctx->K, &GYb, &ctx->X,
  10744. &ctx->P, &ctx->RP ) );
  10745. /* Unblind secret value */
  10746. if( f_rng != NULL )
  10747. {
  10748. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &ctx->K, &ctx->K, &ctx->Vf ) );
  10749. MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &ctx->K, &ctx->K, &ctx->P ) );
  10750. }
  10751. *olen = mbedtls_mpi_size( &ctx->K );
  10752. MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &ctx->K, output, *olen ) );
  10753. cleanup:
  10754. mbedtls_mpi_free( &GYb );
  10755. if( ret != 0 )
  10756. return( MBEDTLS_ERR_DHM_CALC_SECRET_FAILED + ret );
  10757. return( 0 );
  10758. }
  10759. /*
  10760. * Free the components of a DHM key
  10761. */
  10762. void mbedtls_dhm_free( mbedtls_dhm_context *ctx )
  10763. {
  10764. mbedtls_mpi_free( &ctx->pX); mbedtls_mpi_free( &ctx->Vf ); mbedtls_mpi_free( &ctx->Vi );
  10765. mbedtls_mpi_free( &ctx->RP ); mbedtls_mpi_free( &ctx->K ); mbedtls_mpi_free( &ctx->GY );
  10766. mbedtls_mpi_free( &ctx->GX ); mbedtls_mpi_free( &ctx->X ); mbedtls_mpi_free( &ctx->G );
  10767. mbedtls_mpi_free( &ctx->P );
  10768. dhm_zeroize( ctx, sizeof( mbedtls_dhm_context ) );
  10769. }
  10770. #if defined(MBEDTLS_ASN1_PARSE_C)
  10771. /*
  10772. * Parse DHM parameters
  10773. */
  10774. int mbedtls_dhm_parse_dhm( mbedtls_dhm_context *dhm, const unsigned char *dhmin,
  10775. size_t dhminlen )
  10776. {
  10777. int ret;
  10778. size_t len;
  10779. unsigned char *p, *end;
  10780. #if defined(MBEDTLS_PEM_PARSE_C)
  10781. mbedtls_pem_context pem;
  10782. mbedtls_pem_init( &pem );
  10783. /* Avoid calling mbedtls_pem_read_buffer() on non-null-terminated string */
  10784. if( dhminlen == 0 || dhmin[dhminlen - 1] != '\0' )
  10785. ret = MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT;
  10786. else
  10787. ret = mbedtls_pem_read_buffer( &pem,
  10788. "-----BEGIN DH PARAMETERS-----",
  10789. "-----END DH PARAMETERS-----",
  10790. dhmin, NULL, 0, &dhminlen );
  10791. if( ret == 0 )
  10792. {
  10793. /*
  10794. * Was PEM encoded
  10795. */
  10796. dhminlen = pem.buflen;
  10797. }
  10798. else if( ret != MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT )
  10799. goto exit;
  10800. p = ( ret == 0 ) ? pem.buf : (unsigned char *) dhmin;
  10801. #else
  10802. p = (unsigned char *) dhmin;
  10803. #endif /* MBEDTLS_PEM_PARSE_C */
  10804. end = p + dhminlen;
  10805. /*
  10806. * DHParams ::= SEQUENCE {
  10807. * prime INTEGER, -- P
  10808. * generator INTEGER, -- g
  10809. * privateValueLength INTEGER OPTIONAL
  10810. * }
  10811. */
  10812. if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,
  10813. MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )
  10814. {
  10815. ret = MBEDTLS_ERR_DHM_INVALID_FORMAT + ret;
  10816. goto exit;
  10817. }
  10818. end = p + len;
  10819. if( ( ret = mbedtls_asn1_get_mpi( &p, end, &dhm->P ) ) != 0 ||
  10820. ( ret = mbedtls_asn1_get_mpi( &p, end, &dhm->G ) ) != 0 )
  10821. {
  10822. ret = MBEDTLS_ERR_DHM_INVALID_FORMAT + ret;
  10823. goto exit;
  10824. }
  10825. if( p != end )
  10826. {
  10827. /* This might be the optional privateValueLength.
  10828. * If so, we can cleanly discard it */
  10829. mbedtls_mpi rec;
  10830. mbedtls_mpi_init( &rec );
  10831. ret = mbedtls_asn1_get_mpi( &p, end, &rec );
  10832. mbedtls_mpi_free( &rec );
  10833. if ( ret != 0 )
  10834. {
  10835. ret = MBEDTLS_ERR_DHM_INVALID_FORMAT + ret;
  10836. goto exit;
  10837. }
  10838. if ( p != end )
  10839. {
  10840. ret = MBEDTLS_ERR_DHM_INVALID_FORMAT +
  10841. MBEDTLS_ERR_ASN1_LENGTH_MISMATCH;
  10842. goto exit;
  10843. }
  10844. }
  10845. ret = 0;
  10846. dhm->len = mbedtls_mpi_size( &dhm->P );
  10847. exit:
  10848. #if defined(MBEDTLS_PEM_PARSE_C)
  10849. mbedtls_pem_free( &pem );
  10850. #endif
  10851. if( ret != 0 )
  10852. mbedtls_dhm_free( dhm );
  10853. return( ret );
  10854. }
  10855. #if defined(MBEDTLS_FS_IO)
  10856. /*
  10857. * Load all data from a file into a given buffer.
  10858. *
  10859. * The file is expected to contain either PEM or DER encoded data.
  10860. * A terminating null byte is always appended. It is included in the announced
  10861. * length only if the data looks like it is PEM encoded.
  10862. */
  10863. static int load_file( const char *path, unsigned char **buf, size_t *n )
  10864. {
  10865. FILE *f;
  10866. long size;
  10867. if( ( f = fopen( path, "rb" ) ) == NULL )
  10868. return( MBEDTLS_ERR_DHM_FILE_IO_ERROR );
  10869. fseek( f, 0, SEEK_END );
  10870. if( ( size = ftell( f ) ) == -1 )
  10871. {
  10872. fclose( f );
  10873. return( MBEDTLS_ERR_DHM_FILE_IO_ERROR );
  10874. }
  10875. fseek( f, 0, SEEK_SET );
  10876. *n = (size_t) size;
  10877. if( *n + 1 == 0 ||
  10878. ( *buf = mbedtls_calloc( 1, *n + 1 ) ) == NULL )
  10879. {
  10880. fclose( f );
  10881. return( MBEDTLS_ERR_DHM_ALLOC_FAILED );
  10882. }
  10883. if( fread( *buf, 1, *n, f ) != *n )
  10884. {
  10885. fclose( f );
  10886. mbedtls_free( *buf );
  10887. return( MBEDTLS_ERR_DHM_FILE_IO_ERROR );
  10888. }
  10889. fclose( f );
  10890. (*buf)[*n] = '\0';
  10891. if( strstr( (const char *) *buf, "-----BEGIN " ) != NULL )
  10892. ++*n;
  10893. return( 0 );
  10894. }
  10895. /*
  10896. * Load and parse DHM parameters
  10897. */
  10898. int mbedtls_dhm_parse_dhmfile( mbedtls_dhm_context *dhm, const char *path )
  10899. {
  10900. int ret;
  10901. size_t n;
  10902. unsigned char *buf;
  10903. if( ( ret = load_file( path, &buf, &n ) ) != 0 )
  10904. return( ret );
  10905. ret = mbedtls_dhm_parse_dhm( dhm, buf, n );
  10906. dhm_zeroize( buf, n );
  10907. mbedtls_free( buf );
  10908. return( ret );
  10909. }
  10910. #endif /* MBEDTLS_FS_IO */
  10911. #endif /* MBEDTLS_ASN1_PARSE_C */
  10912. #if defined(MBEDTLS_SELF_TEST)
  10913. static const char mbedtls_test_dhm_params[] =
  10914. "-----BEGIN DH PARAMETERS-----\r\n"
  10915. "MIGHAoGBAJ419DBEOgmQTzo5qXl5fQcN9TN455wkOL7052HzxxRVMyhYmwQcgJvh\r\n"
  10916. "1sa18fyfR9OiVEMYglOpkqVoGLN7qd5aQNNi5W7/C+VBdHTBJcGZJyyP5B3qcz32\r\n"
  10917. "9mLJKudlVudV0Qxk5qUJaPZ/xupz0NyoVpviuiBOI1gNi8ovSXWzAgEC\r\n"
  10918. "-----END DH PARAMETERS-----\r\n";
  10919. static const size_t mbedtls_test_dhm_params_len = sizeof( mbedtls_test_dhm_params );
  10920. /*
  10921. * Checkup routine
  10922. */
  10923. int mbedtls_dhm_self_test( int verbose )
  10924. {
  10925. int ret;
  10926. mbedtls_dhm_context dhm;
  10927. mbedtls_dhm_init( &dhm );
  10928. if( verbose != 0 )
  10929. mbedtls_printf( " DHM parameter load: " );
  10930. if( ( ret = mbedtls_dhm_parse_dhm( &dhm,
  10931. (const unsigned char *) mbedtls_test_dhm_params,
  10932. mbedtls_test_dhm_params_len ) ) != 0 )
  10933. {
  10934. if( verbose != 0 )
  10935. mbedtls_printf( "failed\n" );
  10936. ret = 1;
  10937. goto exit;
  10938. }
  10939. if( verbose != 0 )
  10940. mbedtls_printf( "passed\n\n" );
  10941. exit:
  10942. mbedtls_dhm_free( &dhm );
  10943. return( ret );
  10944. }
  10945. #endif /* MBEDTLS_SELF_TEST */
  10946. #endif /* MBEDTLS_DHM_C */
  10947. /********* Start of file library/ecdh.c ************/
  10948. /*
  10949. * Elliptic curve Diffie-Hellman
  10950. *
  10951. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  10952. * SPDX-License-Identifier: Apache-2.0
  10953. *
  10954. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  10955. * not use this file except in compliance with the License.
  10956. * You may obtain a copy of the License at
  10957. *
  10958. * http://www.apache.org/licenses/LICENSE-2.0
  10959. *
  10960. * Unless required by applicable law or agreed to in writing, software
  10961. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  10962. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10963. * See the License for the specific language governing permissions and
  10964. * limitations under the License.
  10965. *
  10966. * This file is part of mbed TLS (https://tls.mbed.org)
  10967. */
  10968. /*
  10969. * References:
  10970. *
  10971. * SEC1 http://www.secg.org/index.php?action=secg,docs_secg
  10972. * RFC 4492
  10973. */
  10974. #if !defined(MBEDTLS_CONFIG_FILE)
  10975. #else
  10976. #endif
  10977. #if defined(MBEDTLS_ECDH_C)
  10978. #include <string.h>
  10979. /*
  10980. * Generate public key: simple wrapper around mbedtls_ecp_gen_keypair
  10981. */
  10982. int mbedtls_ecdh_gen_public( mbedtls_ecp_group *grp, mbedtls_mpi *d, mbedtls_ecp_point *Q,
  10983. int (*f_rng)(void *, unsigned char *, size_t),
  10984. void *p_rng )
  10985. {
  10986. return mbedtls_ecp_gen_keypair( grp, d, Q, f_rng, p_rng );
  10987. }
  10988. /*
  10989. * Compute shared secret (SEC1 3.3.1)
  10990. */
  10991. int mbedtls_ecdh_compute_shared( mbedtls_ecp_group *grp, mbedtls_mpi *z,
  10992. const mbedtls_ecp_point *Q, const mbedtls_mpi *d,
  10993. int (*f_rng)(void *, unsigned char *, size_t),
  10994. void *p_rng )
  10995. {
  10996. int ret;
  10997. mbedtls_ecp_point P;
  10998. mbedtls_ecp_point_init( &P );
  10999. /*
  11000. * Make sure Q is a valid pubkey before using it
  11001. */
  11002. MBEDTLS_MPI_CHK( mbedtls_ecp_check_pubkey( grp, Q ) );
  11003. MBEDTLS_MPI_CHK( mbedtls_ecp_mul( grp, &P, d, Q, f_rng, p_rng ) );
  11004. if( mbedtls_ecp_is_zero( &P ) )
  11005. {
  11006. ret = MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
  11007. goto cleanup;
  11008. }
  11009. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( z, &P.X ) );
  11010. cleanup:
  11011. mbedtls_ecp_point_free( &P );
  11012. return( ret );
  11013. }
  11014. /*
  11015. * Initialize context
  11016. */
  11017. void mbedtls_ecdh_init( mbedtls_ecdh_context *ctx )
  11018. {
  11019. memset( ctx, 0, sizeof( mbedtls_ecdh_context ) );
  11020. }
  11021. /*
  11022. * Free context
  11023. */
  11024. void mbedtls_ecdh_free( mbedtls_ecdh_context *ctx )
  11025. {
  11026. if( ctx == NULL )
  11027. return;
  11028. mbedtls_ecp_group_free( &ctx->grp );
  11029. mbedtls_ecp_point_free( &ctx->Q );
  11030. mbedtls_ecp_point_free( &ctx->Qp );
  11031. mbedtls_ecp_point_free( &ctx->Vi );
  11032. mbedtls_ecp_point_free( &ctx->Vf );
  11033. mbedtls_mpi_free( &ctx->d );
  11034. mbedtls_mpi_free( &ctx->z );
  11035. mbedtls_mpi_free( &ctx->_d );
  11036. }
  11037. /*
  11038. * Setup and write the ServerKeyExhange parameters (RFC 4492)
  11039. * struct {
  11040. * ECParameters curve_params;
  11041. * ECPoint public;
  11042. * } ServerECDHParams;
  11043. */
  11044. int mbedtls_ecdh_make_params( mbedtls_ecdh_context *ctx, size_t *olen,
  11045. unsigned char *buf, size_t blen,
  11046. int (*f_rng)(void *, unsigned char *, size_t),
  11047. void *p_rng )
  11048. {
  11049. int ret;
  11050. size_t grp_len, pt_len;
  11051. if( ctx == NULL || ctx->grp.pbits == 0 )
  11052. return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );
  11053. if( ( ret = mbedtls_ecdh_gen_public( &ctx->grp, &ctx->d, &ctx->Q, f_rng, p_rng ) )
  11054. != 0 )
  11055. return( ret );
  11056. if( ( ret = mbedtls_ecp_tls_write_group( &ctx->grp, &grp_len, buf, blen ) )
  11057. != 0 )
  11058. return( ret );
  11059. buf += grp_len;
  11060. blen -= grp_len;
  11061. if( ( ret = mbedtls_ecp_tls_write_point( &ctx->grp, &ctx->Q, ctx->point_format,
  11062. &pt_len, buf, blen ) ) != 0 )
  11063. return( ret );
  11064. *olen = grp_len + pt_len;
  11065. return( 0 );
  11066. }
  11067. /*
  11068. * Read the ServerKeyExhange parameters (RFC 4492)
  11069. * struct {
  11070. * ECParameters curve_params;
  11071. * ECPoint public;
  11072. * } ServerECDHParams;
  11073. */
  11074. int mbedtls_ecdh_read_params( mbedtls_ecdh_context *ctx,
  11075. const unsigned char **buf, const unsigned char *end )
  11076. {
  11077. int ret;
  11078. if( ( ret = mbedtls_ecp_tls_read_group( &ctx->grp, buf, end - *buf ) ) != 0 )
  11079. return( ret );
  11080. if( ( ret = mbedtls_ecp_tls_read_point( &ctx->grp, &ctx->Qp, buf, end - *buf ) )
  11081. != 0 )
  11082. return( ret );
  11083. return( 0 );
  11084. }
  11085. /*
  11086. * Get parameters from a keypair
  11087. */
  11088. int mbedtls_ecdh_get_params( mbedtls_ecdh_context *ctx, const mbedtls_ecp_keypair *key,
  11089. mbedtls_ecdh_side side )
  11090. {
  11091. int ret;
  11092. if( ( ret = mbedtls_ecp_group_copy( &ctx->grp, &key->grp ) ) != 0 )
  11093. return( ret );
  11094. /* If it's not our key, just import the public part as Qp */
  11095. if( side == MBEDTLS_ECDH_THEIRS )
  11096. return( mbedtls_ecp_copy( &ctx->Qp, &key->Q ) );
  11097. /* Our key: import public (as Q) and private parts */
  11098. if( side != MBEDTLS_ECDH_OURS )
  11099. return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );
  11100. if( ( ret = mbedtls_ecp_copy( &ctx->Q, &key->Q ) ) != 0 ||
  11101. ( ret = mbedtls_mpi_copy( &ctx->d, &key->d ) ) != 0 )
  11102. return( ret );
  11103. return( 0 );
  11104. }
  11105. /*
  11106. * Setup and export the client public value
  11107. */
  11108. int mbedtls_ecdh_make_public( mbedtls_ecdh_context *ctx, size_t *olen,
  11109. unsigned char *buf, size_t blen,
  11110. int (*f_rng)(void *, unsigned char *, size_t),
  11111. void *p_rng )
  11112. {
  11113. int ret;
  11114. if( ctx == NULL || ctx->grp.pbits == 0 )
  11115. return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );
  11116. if( ( ret = mbedtls_ecdh_gen_public( &ctx->grp, &ctx->d, &ctx->Q, f_rng, p_rng ) )
  11117. != 0 )
  11118. return( ret );
  11119. return mbedtls_ecp_tls_write_point( &ctx->grp, &ctx->Q, ctx->point_format,
  11120. olen, buf, blen );
  11121. }
  11122. /*
  11123. * Parse and import the client's public value
  11124. */
  11125. int mbedtls_ecdh_read_public( mbedtls_ecdh_context *ctx,
  11126. const unsigned char *buf, size_t blen )
  11127. {
  11128. int ret;
  11129. const unsigned char *p = buf;
  11130. if( ctx == NULL )
  11131. return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );
  11132. if( ( ret = mbedtls_ecp_tls_read_point( &ctx->grp, &ctx->Qp, &p, blen ) ) != 0 )
  11133. return( ret );
  11134. if( (size_t)( p - buf ) != blen )
  11135. return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );
  11136. return( 0 );
  11137. }
  11138. /*
  11139. * Derive and export the shared secret
  11140. */
  11141. int mbedtls_ecdh_calc_secret( mbedtls_ecdh_context *ctx, size_t *olen,
  11142. unsigned char *buf, size_t blen,
  11143. int (*f_rng)(void *, unsigned char *, size_t),
  11144. void *p_rng )
  11145. {
  11146. int ret;
  11147. if( ctx == NULL )
  11148. return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );
  11149. if( ( ret = mbedtls_ecdh_compute_shared( &ctx->grp, &ctx->z, &ctx->Qp, &ctx->d,
  11150. f_rng, p_rng ) ) != 0 )
  11151. {
  11152. return( ret );
  11153. }
  11154. if( mbedtls_mpi_size( &ctx->z ) > blen )
  11155. return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );
  11156. *olen = ctx->grp.pbits / 8 + ( ( ctx->grp.pbits % 8 ) != 0 );
  11157. return mbedtls_mpi_write_binary( &ctx->z, buf, *olen );
  11158. }
  11159. #endif /* MBEDTLS_ECDH_C */
  11160. /********* Start of file library/ecdsa.c ************/
  11161. /*
  11162. * Elliptic curve DSA
  11163. *
  11164. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  11165. * SPDX-License-Identifier: Apache-2.0
  11166. *
  11167. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  11168. * not use this file except in compliance with the License.
  11169. * You may obtain a copy of the License at
  11170. *
  11171. * http://www.apache.org/licenses/LICENSE-2.0
  11172. *
  11173. * Unless required by applicable law or agreed to in writing, software
  11174. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  11175. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  11176. * See the License for the specific language governing permissions and
  11177. * limitations under the License.
  11178. *
  11179. * This file is part of mbed TLS (https://tls.mbed.org)
  11180. */
  11181. /*
  11182. * References:
  11183. *
  11184. * SEC1 http://www.secg.org/index.php?action=secg,docs_secg
  11185. */
  11186. #if !defined(MBEDTLS_CONFIG_FILE)
  11187. #else
  11188. #endif
  11189. #if defined(MBEDTLS_ECDSA_C)
  11190. #include <string.h>
  11191. #if defined(MBEDTLS_ECDSA_DETERMINISTIC)
  11192. #endif
  11193. /*
  11194. * Derive a suitable integer for group grp from a buffer of length len
  11195. * SEC1 4.1.3 step 5 aka SEC1 4.1.4 step 3
  11196. */
  11197. static int derive_mpi( const mbedtls_ecp_group *grp, mbedtls_mpi *x,
  11198. const unsigned char *buf, size_t blen )
  11199. {
  11200. int ret;
  11201. size_t n_size = ( grp->nbits + 7 ) / 8;
  11202. size_t use_size = blen > n_size ? n_size : blen;
  11203. MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( x, buf, use_size ) );
  11204. if( use_size * 8 > grp->nbits )
  11205. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( x, use_size * 8 - grp->nbits ) );
  11206. /* While at it, reduce modulo N */
  11207. if( mbedtls_mpi_cmp_mpi( x, &grp->N ) >= 0 )
  11208. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( x, x, &grp->N ) );
  11209. cleanup:
  11210. return( ret );
  11211. }
  11212. /*
  11213. * Compute ECDSA signature of a hashed message (SEC1 4.1.3)
  11214. * Obviously, compared to SEC1 4.1.3, we skip step 4 (hash message)
  11215. */
  11216. int mbedtls_ecdsa_sign( mbedtls_ecp_group *grp, mbedtls_mpi *r, mbedtls_mpi *s,
  11217. const mbedtls_mpi *d, const unsigned char *buf, size_t blen,
  11218. int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
  11219. {
  11220. int ret, key_tries, sign_tries, blind_tries;
  11221. mbedtls_ecp_point R;
  11222. mbedtls_mpi k, e, t;
  11223. /* Fail cleanly on curves such as Curve25519 that can't be used for ECDSA */
  11224. if( grp->N.p == NULL )
  11225. return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );
  11226. mbedtls_ecp_point_init( &R );
  11227. mbedtls_mpi_init( &k ); mbedtls_mpi_init( &e ); mbedtls_mpi_init( &t );
  11228. sign_tries = 0;
  11229. do
  11230. {
  11231. /*
  11232. * Steps 1-3: generate a suitable ephemeral keypair
  11233. * and set r = xR mod n
  11234. */
  11235. key_tries = 0;
  11236. do
  11237. {
  11238. MBEDTLS_MPI_CHK( mbedtls_ecp_gen_keypair( grp, &k, &R, f_rng, p_rng ) );
  11239. MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( r, &R.X, &grp->N ) );
  11240. if( key_tries++ > 10 )
  11241. {
  11242. ret = MBEDTLS_ERR_ECP_RANDOM_FAILED;
  11243. goto cleanup;
  11244. }
  11245. }
  11246. while( mbedtls_mpi_cmp_int( r, 0 ) == 0 );
  11247. /*
  11248. * Step 5: derive MPI from hashed message
  11249. */
  11250. MBEDTLS_MPI_CHK( derive_mpi( grp, &e, buf, blen ) );
  11251. /*
  11252. * Generate a random value to blind inv_mod in next step,
  11253. * avoiding a potential timing leak.
  11254. */
  11255. blind_tries = 0;
  11256. do
  11257. {
  11258. size_t n_size = ( grp->nbits + 7 ) / 8;
  11259. MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &t, n_size, f_rng, p_rng ) );
  11260. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &t, 8 * n_size - grp->nbits ) );
  11261. /* See mbedtls_ecp_gen_keypair() */
  11262. if( ++blind_tries > 30 )
  11263. return( MBEDTLS_ERR_ECP_RANDOM_FAILED );
  11264. }
  11265. while( mbedtls_mpi_cmp_int( &t, 1 ) < 0 ||
  11266. mbedtls_mpi_cmp_mpi( &t, &grp->N ) >= 0 );
  11267. /*
  11268. * Step 6: compute s = (e + r * d) / k = t (e + rd) / (kt) mod n
  11269. */
  11270. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( s, r, d ) );
  11271. MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &e, &e, s ) );
  11272. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &e, &e, &t ) );
  11273. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &k, &k, &t ) );
  11274. MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( s, &k, &grp->N ) );
  11275. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( s, s, &e ) );
  11276. MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( s, s, &grp->N ) );
  11277. if( sign_tries++ > 10 )
  11278. {
  11279. ret = MBEDTLS_ERR_ECP_RANDOM_FAILED;
  11280. goto cleanup;
  11281. }
  11282. }
  11283. while( mbedtls_mpi_cmp_int( s, 0 ) == 0 );
  11284. cleanup:
  11285. mbedtls_ecp_point_free( &R );
  11286. mbedtls_mpi_free( &k ); mbedtls_mpi_free( &e ); mbedtls_mpi_free( &t );
  11287. return( ret );
  11288. }
  11289. #if defined(MBEDTLS_ECDSA_DETERMINISTIC)
  11290. /*
  11291. * Deterministic signature wrapper
  11292. */
  11293. int mbedtls_ecdsa_sign_det( mbedtls_ecp_group *grp, mbedtls_mpi *r, mbedtls_mpi *s,
  11294. const mbedtls_mpi *d, const unsigned char *buf, size_t blen,
  11295. mbedtls_md_type_t md_alg )
  11296. {
  11297. int ret;
  11298. mbedtls_hmac_drbg_context rng_ctx;
  11299. unsigned char data[2 * MBEDTLS_ECP_MAX_BYTES];
  11300. size_t grp_len = ( grp->nbits + 7 ) / 8;
  11301. const mbedtls_md_info_t *md_info;
  11302. mbedtls_mpi h;
  11303. if( ( md_info = mbedtls_md_info_from_type( md_alg ) ) == NULL )
  11304. return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );
  11305. mbedtls_mpi_init( &h );
  11306. mbedtls_hmac_drbg_init( &rng_ctx );
  11307. /* Use private key and message hash (reduced) to initialize HMAC_DRBG */
  11308. MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( d, data, grp_len ) );
  11309. MBEDTLS_MPI_CHK( derive_mpi( grp, &h, buf, blen ) );
  11310. MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &h, data + grp_len, grp_len ) );
  11311. mbedtls_hmac_drbg_seed_buf( &rng_ctx, md_info, data, 2 * grp_len );
  11312. ret = mbedtls_ecdsa_sign( grp, r, s, d, buf, blen,
  11313. mbedtls_hmac_drbg_random, &rng_ctx );
  11314. cleanup:
  11315. mbedtls_hmac_drbg_free( &rng_ctx );
  11316. mbedtls_mpi_free( &h );
  11317. return( ret );
  11318. }
  11319. #endif /* MBEDTLS_ECDSA_DETERMINISTIC */
  11320. /*
  11321. * Verify ECDSA signature of hashed message (SEC1 4.1.4)
  11322. * Obviously, compared to SEC1 4.1.3, we skip step 2 (hash message)
  11323. */
  11324. int mbedtls_ecdsa_verify( mbedtls_ecp_group *grp,
  11325. const unsigned char *buf, size_t blen,
  11326. const mbedtls_ecp_point *Q, const mbedtls_mpi *r, const mbedtls_mpi *s)
  11327. {
  11328. int ret;
  11329. mbedtls_mpi e, s_inv, u1, u2;
  11330. mbedtls_ecp_point R;
  11331. mbedtls_ecp_point_init( &R );
  11332. mbedtls_mpi_init( &e ); mbedtls_mpi_init( &s_inv ); mbedtls_mpi_init( &u1 ); mbedtls_mpi_init( &u2 );
  11333. /* Fail cleanly on curves such as Curve25519 that can't be used for ECDSA */
  11334. if( grp->N.p == NULL )
  11335. return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );
  11336. /*
  11337. * Step 1: make sure r and s are in range 1..n-1
  11338. */
  11339. if( mbedtls_mpi_cmp_int( r, 1 ) < 0 || mbedtls_mpi_cmp_mpi( r, &grp->N ) >= 0 ||
  11340. mbedtls_mpi_cmp_int( s, 1 ) < 0 || mbedtls_mpi_cmp_mpi( s, &grp->N ) >= 0 )
  11341. {
  11342. ret = MBEDTLS_ERR_ECP_VERIFY_FAILED;
  11343. goto cleanup;
  11344. }
  11345. /*
  11346. * Additional precaution: make sure Q is valid
  11347. */
  11348. MBEDTLS_MPI_CHK( mbedtls_ecp_check_pubkey( grp, Q ) );
  11349. /*
  11350. * Step 3: derive MPI from hashed message
  11351. */
  11352. MBEDTLS_MPI_CHK( derive_mpi( grp, &e, buf, blen ) );
  11353. /*
  11354. * Step 4: u1 = e / s mod n, u2 = r / s mod n
  11355. */
  11356. MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( &s_inv, s, &grp->N ) );
  11357. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &u1, &e, &s_inv ) );
  11358. MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &u1, &u1, &grp->N ) );
  11359. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &u2, r, &s_inv ) );
  11360. MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &u2, &u2, &grp->N ) );
  11361. /*
  11362. * Step 5: R = u1 G + u2 Q
  11363. *
  11364. * Since we're not using any secret data, no need to pass a RNG to
  11365. * mbedtls_ecp_mul() for countermesures.
  11366. */
  11367. MBEDTLS_MPI_CHK( mbedtls_ecp_muladd( grp, &R, &u1, &grp->G, &u2, Q ) );
  11368. if( mbedtls_ecp_is_zero( &R ) )
  11369. {
  11370. ret = MBEDTLS_ERR_ECP_VERIFY_FAILED;
  11371. goto cleanup;
  11372. }
  11373. /*
  11374. * Step 6: convert xR to an integer (no-op)
  11375. * Step 7: reduce xR mod n (gives v)
  11376. */
  11377. MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &R.X, &R.X, &grp->N ) );
  11378. /*
  11379. * Step 8: check if v (that is, R.X) is equal to r
  11380. */
  11381. if( mbedtls_mpi_cmp_mpi( &R.X, r ) != 0 )
  11382. {
  11383. ret = MBEDTLS_ERR_ECP_VERIFY_FAILED;
  11384. goto cleanup;
  11385. }
  11386. cleanup:
  11387. mbedtls_ecp_point_free( &R );
  11388. mbedtls_mpi_free( &e ); mbedtls_mpi_free( &s_inv ); mbedtls_mpi_free( &u1 ); mbedtls_mpi_free( &u2 );
  11389. return( ret );
  11390. }
  11391. /*
  11392. * Convert a signature (given by context) to ASN.1
  11393. */
  11394. static int ecdsa_signature_to_asn1( const mbedtls_mpi *r, const mbedtls_mpi *s,
  11395. unsigned char *sig, size_t *slen )
  11396. {
  11397. int ret;
  11398. unsigned char buf[MBEDTLS_ECDSA_MAX_LEN];
  11399. unsigned char *p = buf + sizeof( buf );
  11400. size_t len = 0;
  11401. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_mpi( &p, buf, s ) );
  11402. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_mpi( &p, buf, r ) );
  11403. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &p, buf, len ) );
  11404. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &p, buf,
  11405. MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) );
  11406. memcpy( sig, p, len );
  11407. *slen = len;
  11408. return( 0 );
  11409. }
  11410. /*
  11411. * Compute and write signature
  11412. */
  11413. int mbedtls_ecdsa_write_signature( mbedtls_ecdsa_context *ctx, mbedtls_md_type_t md_alg,
  11414. const unsigned char *hash, size_t hlen,
  11415. unsigned char *sig, size_t *slen,
  11416. int (*f_rng)(void *, unsigned char *, size_t),
  11417. void *p_rng )
  11418. {
  11419. int ret;
  11420. mbedtls_mpi r, s;
  11421. mbedtls_mpi_init( &r );
  11422. mbedtls_mpi_init( &s );
  11423. #if defined(MBEDTLS_ECDSA_DETERMINISTIC)
  11424. (void) f_rng;
  11425. (void) p_rng;
  11426. MBEDTLS_MPI_CHK( mbedtls_ecdsa_sign_det( &ctx->grp, &r, &s, &ctx->d,
  11427. hash, hlen, md_alg ) );
  11428. #else
  11429. (void) md_alg;
  11430. MBEDTLS_MPI_CHK( mbedtls_ecdsa_sign( &ctx->grp, &r, &s, &ctx->d,
  11431. hash, hlen, f_rng, p_rng ) );
  11432. #endif
  11433. MBEDTLS_MPI_CHK( ecdsa_signature_to_asn1( &r, &s, sig, slen ) );
  11434. cleanup:
  11435. mbedtls_mpi_free( &r );
  11436. mbedtls_mpi_free( &s );
  11437. return( ret );
  11438. }
  11439. #if ! defined(MBEDTLS_DEPRECATED_REMOVED) && \
  11440. defined(MBEDTLS_ECDSA_DETERMINISTIC)
  11441. int mbedtls_ecdsa_write_signature_det( mbedtls_ecdsa_context *ctx,
  11442. const unsigned char *hash, size_t hlen,
  11443. unsigned char *sig, size_t *slen,
  11444. mbedtls_md_type_t md_alg )
  11445. {
  11446. return( mbedtls_ecdsa_write_signature( ctx, md_alg, hash, hlen, sig, slen,
  11447. NULL, NULL ) );
  11448. }
  11449. #endif
  11450. /*
  11451. * Read and check signature
  11452. */
  11453. int mbedtls_ecdsa_read_signature( mbedtls_ecdsa_context *ctx,
  11454. const unsigned char *hash, size_t hlen,
  11455. const unsigned char *sig, size_t slen )
  11456. {
  11457. int ret;
  11458. unsigned char *p = (unsigned char *) sig;
  11459. const unsigned char *end = sig + slen;
  11460. size_t len;
  11461. mbedtls_mpi r, s;
  11462. mbedtls_mpi_init( &r );
  11463. mbedtls_mpi_init( &s );
  11464. if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,
  11465. MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )
  11466. {
  11467. ret += MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
  11468. goto cleanup;
  11469. }
  11470. if( p + len != end )
  11471. {
  11472. ret = MBEDTLS_ERR_ECP_BAD_INPUT_DATA +
  11473. MBEDTLS_ERR_ASN1_LENGTH_MISMATCH;
  11474. goto cleanup;
  11475. }
  11476. if( ( ret = mbedtls_asn1_get_mpi( &p, end, &r ) ) != 0 ||
  11477. ( ret = mbedtls_asn1_get_mpi( &p, end, &s ) ) != 0 )
  11478. {
  11479. ret += MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
  11480. goto cleanup;
  11481. }
  11482. if( ( ret = mbedtls_ecdsa_verify( &ctx->grp, hash, hlen,
  11483. &ctx->Q, &r, &s ) ) != 0 )
  11484. goto cleanup;
  11485. if( p != end )
  11486. ret = MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH;
  11487. cleanup:
  11488. mbedtls_mpi_free( &r );
  11489. mbedtls_mpi_free( &s );
  11490. return( ret );
  11491. }
  11492. /*
  11493. * Generate key pair
  11494. */
  11495. int mbedtls_ecdsa_genkey( mbedtls_ecdsa_context *ctx, mbedtls_ecp_group_id gid,
  11496. int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
  11497. {
  11498. return( mbedtls_ecp_group_load( &ctx->grp, gid ) ||
  11499. mbedtls_ecp_gen_keypair( &ctx->grp, &ctx->d, &ctx->Q, f_rng, p_rng ) );
  11500. }
  11501. /*
  11502. * Set context from an mbedtls_ecp_keypair
  11503. */
  11504. int mbedtls_ecdsa_from_keypair( mbedtls_ecdsa_context *ctx, const mbedtls_ecp_keypair *key )
  11505. {
  11506. int ret;
  11507. if( ( ret = mbedtls_ecp_group_copy( &ctx->grp, &key->grp ) ) != 0 ||
  11508. ( ret = mbedtls_mpi_copy( &ctx->d, &key->d ) ) != 0 ||
  11509. ( ret = mbedtls_ecp_copy( &ctx->Q, &key->Q ) ) != 0 )
  11510. {
  11511. mbedtls_ecdsa_free( ctx );
  11512. }
  11513. return( ret );
  11514. }
  11515. /*
  11516. * Initialize context
  11517. */
  11518. void mbedtls_ecdsa_init( mbedtls_ecdsa_context *ctx )
  11519. {
  11520. mbedtls_ecp_keypair_init( ctx );
  11521. }
  11522. /*
  11523. * Free context
  11524. */
  11525. void mbedtls_ecdsa_free( mbedtls_ecdsa_context *ctx )
  11526. {
  11527. mbedtls_ecp_keypair_free( ctx );
  11528. }
  11529. #endif /* MBEDTLS_ECDSA_C */
  11530. /********* Start of file library/ecjpake.c ************/
  11531. /*
  11532. * Elliptic curve J-PAKE
  11533. *
  11534. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  11535. * SPDX-License-Identifier: Apache-2.0
  11536. *
  11537. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  11538. * not use this file except in compliance with the License.
  11539. * You may obtain a copy of the License at
  11540. *
  11541. * http://www.apache.org/licenses/LICENSE-2.0
  11542. *
  11543. * Unless required by applicable law or agreed to in writing, software
  11544. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  11545. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  11546. * See the License for the specific language governing permissions and
  11547. * limitations under the License.
  11548. *
  11549. * This file is part of mbed TLS (https://tls.mbed.org)
  11550. */
  11551. /*
  11552. * References in the code are to the Thread v1.0 Specification,
  11553. * available to members of the Thread Group http://threadgroup.org/
  11554. */
  11555. #if !defined(MBEDTLS_CONFIG_FILE)
  11556. #else
  11557. #endif
  11558. #if defined(MBEDTLS_ECJPAKE_C)
  11559. #include <string.h>
  11560. /*
  11561. * Convert a mbedtls_ecjpake_role to identifier string
  11562. */
  11563. static const char * const ecjpake_id[] = {
  11564. "client",
  11565. "server"
  11566. };
  11567. #define ID_MINE ( ecjpake_id[ ctx->role ] )
  11568. #define ID_PEER ( ecjpake_id[ 1 - ctx->role ] )
  11569. /*
  11570. * Initialize context
  11571. */
  11572. void mbedtls_ecjpake_init( mbedtls_ecjpake_context *ctx )
  11573. {
  11574. if( ctx == NULL )
  11575. return;
  11576. ctx->md_info = NULL;
  11577. mbedtls_ecp_group_init( &ctx->grp );
  11578. ctx->point_format = MBEDTLS_ECP_PF_UNCOMPRESSED;
  11579. mbedtls_ecp_point_init( &ctx->Xm1 );
  11580. mbedtls_ecp_point_init( &ctx->Xm2 );
  11581. mbedtls_ecp_point_init( &ctx->Xp1 );
  11582. mbedtls_ecp_point_init( &ctx->Xp2 );
  11583. mbedtls_ecp_point_init( &ctx->Xp );
  11584. mbedtls_mpi_init( &ctx->xm1 );
  11585. mbedtls_mpi_init( &ctx->xm2 );
  11586. mbedtls_mpi_init( &ctx->s );
  11587. }
  11588. /*
  11589. * Free context
  11590. */
  11591. void mbedtls_ecjpake_free( mbedtls_ecjpake_context *ctx )
  11592. {
  11593. if( ctx == NULL )
  11594. return;
  11595. ctx->md_info = NULL;
  11596. mbedtls_ecp_group_free( &ctx->grp );
  11597. mbedtls_ecp_point_free( &ctx->Xm1 );
  11598. mbedtls_ecp_point_free( &ctx->Xm2 );
  11599. mbedtls_ecp_point_free( &ctx->Xp1 );
  11600. mbedtls_ecp_point_free( &ctx->Xp2 );
  11601. mbedtls_ecp_point_free( &ctx->Xp );
  11602. mbedtls_mpi_free( &ctx->xm1 );
  11603. mbedtls_mpi_free( &ctx->xm2 );
  11604. mbedtls_mpi_free( &ctx->s );
  11605. }
  11606. /*
  11607. * Setup context
  11608. */
  11609. int mbedtls_ecjpake_setup( mbedtls_ecjpake_context *ctx,
  11610. mbedtls_ecjpake_role role,
  11611. mbedtls_md_type_t hash,
  11612. mbedtls_ecp_group_id curve,
  11613. const unsigned char *secret,
  11614. size_t len )
  11615. {
  11616. int ret;
  11617. ctx->role = role;
  11618. if( ( ctx->md_info = mbedtls_md_info_from_type( hash ) ) == NULL )
  11619. return( MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE );
  11620. MBEDTLS_MPI_CHK( mbedtls_ecp_group_load( &ctx->grp, curve ) );
  11621. MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &ctx->s, secret, len ) );
  11622. cleanup:
  11623. if( ret != 0 )
  11624. mbedtls_ecjpake_free( ctx );
  11625. return( ret );
  11626. }
  11627. /*
  11628. * Check if context is ready for use
  11629. */
  11630. int mbedtls_ecjpake_check( const mbedtls_ecjpake_context *ctx )
  11631. {
  11632. if( ctx->md_info == NULL ||
  11633. ctx->grp.id == MBEDTLS_ECP_DP_NONE ||
  11634. ctx->s.p == NULL )
  11635. {
  11636. return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );
  11637. }
  11638. return( 0 );
  11639. }
  11640. /*
  11641. * Write a point plus its length to a buffer
  11642. */
  11643. static int ecjpake_write_len_point( unsigned char **p,
  11644. const unsigned char *end,
  11645. const mbedtls_ecp_group *grp,
  11646. const int pf,
  11647. const mbedtls_ecp_point *P )
  11648. {
  11649. int ret;
  11650. size_t len;
  11651. /* Need at least 4 for length plus 1 for point */
  11652. if( end < *p || end - *p < 5 )
  11653. return( MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL );
  11654. ret = mbedtls_ecp_point_write_binary( grp, P, pf,
  11655. &len, *p + 4, end - ( *p + 4 ) );
  11656. if( ret != 0 )
  11657. return( ret );
  11658. (*p)[0] = (unsigned char)( ( len >> 24 ) & 0xFF );
  11659. (*p)[1] = (unsigned char)( ( len >> 16 ) & 0xFF );
  11660. (*p)[2] = (unsigned char)( ( len >> 8 ) & 0xFF );
  11661. (*p)[3] = (unsigned char)( ( len ) & 0xFF );
  11662. *p += 4 + len;
  11663. return( 0 );
  11664. }
  11665. /*
  11666. * Size of the temporary buffer for ecjpake_hash:
  11667. * 3 EC points plus their length, plus ID and its length (4 + 6 bytes)
  11668. */
  11669. #define ECJPAKE_HASH_BUF_LEN ( 3 * ( 4 + MBEDTLS_ECP_MAX_PT_LEN ) + 4 + 6 )
  11670. /*
  11671. * Compute hash for ZKP (7.4.2.2.2.1)
  11672. */
  11673. static int ecjpake_hash( const mbedtls_md_info_t *md_info,
  11674. const mbedtls_ecp_group *grp,
  11675. const int pf,
  11676. const mbedtls_ecp_point *G,
  11677. const mbedtls_ecp_point *V,
  11678. const mbedtls_ecp_point *X,
  11679. const char *id,
  11680. mbedtls_mpi *h )
  11681. {
  11682. int ret;
  11683. unsigned char buf[ECJPAKE_HASH_BUF_LEN];
  11684. unsigned char *p = buf;
  11685. const unsigned char *end = buf + sizeof( buf );
  11686. const size_t id_len = strlen( id );
  11687. unsigned char hash[MBEDTLS_MD_MAX_SIZE];
  11688. /* Write things to temporary buffer */
  11689. MBEDTLS_MPI_CHK( ecjpake_write_len_point( &p, end, grp, pf, G ) );
  11690. MBEDTLS_MPI_CHK( ecjpake_write_len_point( &p, end, grp, pf, V ) );
  11691. MBEDTLS_MPI_CHK( ecjpake_write_len_point( &p, end, grp, pf, X ) );
  11692. if( end - p < 4 )
  11693. return( MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL );
  11694. *p++ = (unsigned char)( ( id_len >> 24 ) & 0xFF );
  11695. *p++ = (unsigned char)( ( id_len >> 16 ) & 0xFF );
  11696. *p++ = (unsigned char)( ( id_len >> 8 ) & 0xFF );
  11697. *p++ = (unsigned char)( ( id_len ) & 0xFF );
  11698. if( end < p || (size_t)( end - p ) < id_len )
  11699. return( MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL );
  11700. memcpy( p, id, id_len );
  11701. p += id_len;
  11702. /* Compute hash */
  11703. mbedtls_md( md_info, buf, p - buf, hash );
  11704. /* Turn it into an integer mod n */
  11705. MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( h, hash,
  11706. mbedtls_md_get_size( md_info ) ) );
  11707. MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( h, h, &grp->N ) );
  11708. cleanup:
  11709. return( ret );
  11710. }
  11711. /*
  11712. * Parse a ECShnorrZKP (7.4.2.2.2) and verify it (7.4.2.3.3)
  11713. */
  11714. static int ecjpake_zkp_read( const mbedtls_md_info_t *md_info,
  11715. const mbedtls_ecp_group *grp,
  11716. const int pf,
  11717. const mbedtls_ecp_point *G,
  11718. const mbedtls_ecp_point *X,
  11719. const char *id,
  11720. const unsigned char **p,
  11721. const unsigned char *end )
  11722. {
  11723. int ret;
  11724. mbedtls_ecp_point V, VV;
  11725. mbedtls_mpi r, h;
  11726. size_t r_len;
  11727. mbedtls_ecp_point_init( &V );
  11728. mbedtls_ecp_point_init( &VV );
  11729. mbedtls_mpi_init( &r );
  11730. mbedtls_mpi_init( &h );
  11731. /*
  11732. * struct {
  11733. * ECPoint V;
  11734. * opaque r<1..2^8-1>;
  11735. * } ECSchnorrZKP;
  11736. */
  11737. if( end < *p )
  11738. return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );
  11739. MBEDTLS_MPI_CHK( mbedtls_ecp_tls_read_point( grp, &V, p, end - *p ) );
  11740. if( end < *p || (size_t)( end - *p ) < 1 )
  11741. {
  11742. ret = MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
  11743. goto cleanup;
  11744. }
  11745. r_len = *(*p)++;
  11746. if( end < *p || (size_t)( end - *p ) < r_len )
  11747. {
  11748. ret = MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
  11749. goto cleanup;
  11750. }
  11751. MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &r, *p, r_len ) );
  11752. *p += r_len;
  11753. /*
  11754. * Verification
  11755. */
  11756. MBEDTLS_MPI_CHK( ecjpake_hash( md_info, grp, pf, G, &V, X, id, &h ) );
  11757. MBEDTLS_MPI_CHK( mbedtls_ecp_muladd( (mbedtls_ecp_group *) grp,
  11758. &VV, &h, X, &r, G ) );
  11759. if( mbedtls_ecp_point_cmp( &VV, &V ) != 0 )
  11760. {
  11761. ret = MBEDTLS_ERR_ECP_VERIFY_FAILED;
  11762. goto cleanup;
  11763. }
  11764. cleanup:
  11765. mbedtls_ecp_point_free( &V );
  11766. mbedtls_ecp_point_free( &VV );
  11767. mbedtls_mpi_free( &r );
  11768. mbedtls_mpi_free( &h );
  11769. return( ret );
  11770. }
  11771. /*
  11772. * Generate ZKP (7.4.2.3.2) and write it as ECSchnorrZKP (7.4.2.2.2)
  11773. */
  11774. static int ecjpake_zkp_write( const mbedtls_md_info_t *md_info,
  11775. const mbedtls_ecp_group *grp,
  11776. const int pf,
  11777. const mbedtls_ecp_point *G,
  11778. const mbedtls_mpi *x,
  11779. const mbedtls_ecp_point *X,
  11780. const char *id,
  11781. unsigned char **p,
  11782. const unsigned char *end,
  11783. int (*f_rng)(void *, unsigned char *, size_t),
  11784. void *p_rng )
  11785. {
  11786. int ret;
  11787. mbedtls_ecp_point V;
  11788. mbedtls_mpi v;
  11789. mbedtls_mpi h; /* later recycled to hold r */
  11790. size_t len;
  11791. if( end < *p )
  11792. return( MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL );
  11793. mbedtls_ecp_point_init( &V );
  11794. mbedtls_mpi_init( &v );
  11795. mbedtls_mpi_init( &h );
  11796. /* Compute signature */
  11797. MBEDTLS_MPI_CHK( mbedtls_ecp_gen_keypair_base( (mbedtls_ecp_group *) grp,
  11798. G, &v, &V, f_rng, p_rng ) );
  11799. MBEDTLS_MPI_CHK( ecjpake_hash( md_info, grp, pf, G, &V, X, id, &h ) );
  11800. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &h, &h, x ) ); /* x*h */
  11801. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &h, &v, &h ) ); /* v - x*h */
  11802. MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &h, &h, &grp->N ) ); /* r */
  11803. /* Write it out */
  11804. MBEDTLS_MPI_CHK( mbedtls_ecp_tls_write_point( grp, &V,
  11805. pf, &len, *p, end - *p ) );
  11806. *p += len;
  11807. len = mbedtls_mpi_size( &h ); /* actually r */
  11808. if( end < *p || (size_t)( end - *p ) < 1 + len || len > 255 )
  11809. {
  11810. ret = MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL;
  11811. goto cleanup;
  11812. }
  11813. *(*p)++ = (unsigned char)( len & 0xFF );
  11814. MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &h, *p, len ) ); /* r */
  11815. *p += len;
  11816. cleanup:
  11817. mbedtls_ecp_point_free( &V );
  11818. mbedtls_mpi_free( &v );
  11819. mbedtls_mpi_free( &h );
  11820. return( ret );
  11821. }
  11822. /*
  11823. * Parse a ECJPAKEKeyKP (7.4.2.2.1) and check proof
  11824. * Output: verified public key X
  11825. */
  11826. static int ecjpake_kkp_read( const mbedtls_md_info_t *md_info,
  11827. const mbedtls_ecp_group *grp,
  11828. const int pf,
  11829. const mbedtls_ecp_point *G,
  11830. mbedtls_ecp_point *X,
  11831. const char *id,
  11832. const unsigned char **p,
  11833. const unsigned char *end )
  11834. {
  11835. int ret;
  11836. if( end < *p )
  11837. return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );
  11838. /*
  11839. * struct {
  11840. * ECPoint X;
  11841. * ECSchnorrZKP zkp;
  11842. * } ECJPAKEKeyKP;
  11843. */
  11844. MBEDTLS_MPI_CHK( mbedtls_ecp_tls_read_point( grp, X, p, end - *p ) );
  11845. if( mbedtls_ecp_is_zero( X ) )
  11846. {
  11847. ret = MBEDTLS_ERR_ECP_INVALID_KEY;
  11848. goto cleanup;
  11849. }
  11850. MBEDTLS_MPI_CHK( ecjpake_zkp_read( md_info, grp, pf, G, X, id, p, end ) );
  11851. cleanup:
  11852. return( ret );
  11853. }
  11854. /*
  11855. * Generate an ECJPAKEKeyKP
  11856. * Output: the serialized structure, plus private/public key pair
  11857. */
  11858. static int ecjpake_kkp_write( const mbedtls_md_info_t *md_info,
  11859. const mbedtls_ecp_group *grp,
  11860. const int pf,
  11861. const mbedtls_ecp_point *G,
  11862. mbedtls_mpi *x,
  11863. mbedtls_ecp_point *X,
  11864. const char *id,
  11865. unsigned char **p,
  11866. const unsigned char *end,
  11867. int (*f_rng)(void *, unsigned char *, size_t),
  11868. void *p_rng )
  11869. {
  11870. int ret;
  11871. size_t len;
  11872. if( end < *p )
  11873. return( MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL );
  11874. /* Generate key (7.4.2.3.1) and write it out */
  11875. MBEDTLS_MPI_CHK( mbedtls_ecp_gen_keypair_base( (mbedtls_ecp_group *) grp, G, x, X,
  11876. f_rng, p_rng ) );
  11877. MBEDTLS_MPI_CHK( mbedtls_ecp_tls_write_point( grp, X,
  11878. pf, &len, *p, end - *p ) );
  11879. *p += len;
  11880. /* Generate and write proof */
  11881. MBEDTLS_MPI_CHK( ecjpake_zkp_write( md_info, grp, pf, G, x, X, id,
  11882. p, end, f_rng, p_rng ) );
  11883. cleanup:
  11884. return( ret );
  11885. }
  11886. /*
  11887. * Read a ECJPAKEKeyKPPairList (7.4.2.3) and check proofs
  11888. * Ouputs: verified peer public keys Xa, Xb
  11889. */
  11890. static int ecjpake_kkpp_read( const mbedtls_md_info_t *md_info,
  11891. const mbedtls_ecp_group *grp,
  11892. const int pf,
  11893. const mbedtls_ecp_point *G,
  11894. mbedtls_ecp_point *Xa,
  11895. mbedtls_ecp_point *Xb,
  11896. const char *id,
  11897. const unsigned char *buf,
  11898. size_t len )
  11899. {
  11900. int ret;
  11901. const unsigned char *p = buf;
  11902. const unsigned char *end = buf + len;
  11903. /*
  11904. * struct {
  11905. * ECJPAKEKeyKP ecjpake_key_kp_pair_list[2];
  11906. * } ECJPAKEKeyKPPairList;
  11907. */
  11908. MBEDTLS_MPI_CHK( ecjpake_kkp_read( md_info, grp, pf, G, Xa, id, &p, end ) );
  11909. MBEDTLS_MPI_CHK( ecjpake_kkp_read( md_info, grp, pf, G, Xb, id, &p, end ) );
  11910. if( p != end )
  11911. ret = MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
  11912. cleanup:
  11913. return( ret );
  11914. }
  11915. /*
  11916. * Generate a ECJPAKEKeyKPPairList
  11917. * Outputs: the serialized structure, plus two private/public key pairs
  11918. */
  11919. static int ecjpake_kkpp_write( const mbedtls_md_info_t *md_info,
  11920. const mbedtls_ecp_group *grp,
  11921. const int pf,
  11922. const mbedtls_ecp_point *G,
  11923. mbedtls_mpi *xm1,
  11924. mbedtls_ecp_point *Xa,
  11925. mbedtls_mpi *xm2,
  11926. mbedtls_ecp_point *Xb,
  11927. const char *id,
  11928. unsigned char *buf,
  11929. size_t len,
  11930. size_t *olen,
  11931. int (*f_rng)(void *, unsigned char *, size_t),
  11932. void *p_rng )
  11933. {
  11934. int ret;
  11935. unsigned char *p = buf;
  11936. const unsigned char *end = buf + len;
  11937. MBEDTLS_MPI_CHK( ecjpake_kkp_write( md_info, grp, pf, G, xm1, Xa, id,
  11938. &p, end, f_rng, p_rng ) );
  11939. MBEDTLS_MPI_CHK( ecjpake_kkp_write( md_info, grp, pf, G, xm2, Xb, id,
  11940. &p, end, f_rng, p_rng ) );
  11941. *olen = p - buf;
  11942. cleanup:
  11943. return( ret );
  11944. }
  11945. /*
  11946. * Read and process the first round message
  11947. */
  11948. int mbedtls_ecjpake_read_round_one( mbedtls_ecjpake_context *ctx,
  11949. const unsigned char *buf,
  11950. size_t len )
  11951. {
  11952. return( ecjpake_kkpp_read( ctx->md_info, &ctx->grp, ctx->point_format,
  11953. &ctx->grp.G,
  11954. &ctx->Xp1, &ctx->Xp2, ID_PEER,
  11955. buf, len ) );
  11956. }
  11957. /*
  11958. * Generate and write the first round message
  11959. */
  11960. int mbedtls_ecjpake_write_round_one( mbedtls_ecjpake_context *ctx,
  11961. unsigned char *buf, size_t len, size_t *olen,
  11962. int (*f_rng)(void *, unsigned char *, size_t),
  11963. void *p_rng )
  11964. {
  11965. return( ecjpake_kkpp_write( ctx->md_info, &ctx->grp, ctx->point_format,
  11966. &ctx->grp.G,
  11967. &ctx->xm1, &ctx->Xm1, &ctx->xm2, &ctx->Xm2,
  11968. ID_MINE, buf, len, olen, f_rng, p_rng ) );
  11969. }
  11970. /*
  11971. * Compute the sum of three points R = A + B + C
  11972. */
  11973. static int ecjpake_ecp_add3( mbedtls_ecp_group *grp, mbedtls_ecp_point *R,
  11974. const mbedtls_ecp_point *A,
  11975. const mbedtls_ecp_point *B,
  11976. const mbedtls_ecp_point *C )
  11977. {
  11978. int ret;
  11979. mbedtls_mpi one;
  11980. mbedtls_mpi_init( &one );
  11981. MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &one, 1 ) );
  11982. MBEDTLS_MPI_CHK( mbedtls_ecp_muladd( grp, R, &one, A, &one, B ) );
  11983. MBEDTLS_MPI_CHK( mbedtls_ecp_muladd( grp, R, &one, R, &one, C ) );
  11984. cleanup:
  11985. mbedtls_mpi_free( &one );
  11986. return( ret );
  11987. }
  11988. /*
  11989. * Read and process second round message (C: 7.4.2.5, S: 7.4.2.6)
  11990. */
  11991. int mbedtls_ecjpake_read_round_two( mbedtls_ecjpake_context *ctx,
  11992. const unsigned char *buf,
  11993. size_t len )
  11994. {
  11995. int ret;
  11996. const unsigned char *p = buf;
  11997. const unsigned char *end = buf + len;
  11998. mbedtls_ecp_group grp;
  11999. mbedtls_ecp_point G; /* C: GB, S: GA */
  12000. mbedtls_ecp_group_init( &grp );
  12001. mbedtls_ecp_point_init( &G );
  12002. /*
  12003. * Server: GA = X3 + X4 + X1 (7.4.2.6.1)
  12004. * Client: GB = X1 + X2 + X3 (7.4.2.5.1)
  12005. * Unified: G = Xm1 + Xm2 + Xp1
  12006. * We need that before parsing in order to check Xp as we read it
  12007. */
  12008. MBEDTLS_MPI_CHK( ecjpake_ecp_add3( &ctx->grp, &G,
  12009. &ctx->Xm1, &ctx->Xm2, &ctx->Xp1 ) );
  12010. /*
  12011. * struct {
  12012. * ECParameters curve_params; // only client reading server msg
  12013. * ECJPAKEKeyKP ecjpake_key_kp;
  12014. * } Client/ServerECJPAKEParams;
  12015. */
  12016. if( ctx->role == MBEDTLS_ECJPAKE_CLIENT )
  12017. {
  12018. MBEDTLS_MPI_CHK( mbedtls_ecp_tls_read_group( &grp, &p, len ) );
  12019. if( grp.id != ctx->grp.id )
  12020. {
  12021. ret = MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE;
  12022. goto cleanup;
  12023. }
  12024. }
  12025. MBEDTLS_MPI_CHK( ecjpake_kkp_read( ctx->md_info, &ctx->grp,
  12026. ctx->point_format,
  12027. &G, &ctx->Xp, ID_PEER, &p, end ) );
  12028. if( p != end )
  12029. {
  12030. ret = MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
  12031. goto cleanup;
  12032. }
  12033. cleanup:
  12034. mbedtls_ecp_group_free( &grp );
  12035. mbedtls_ecp_point_free( &G );
  12036. return( ret );
  12037. }
  12038. /*
  12039. * Compute R = +/- X * S mod N, taking care not to leak S
  12040. */
  12041. static int ecjpake_mul_secret( mbedtls_mpi *R, int sign,
  12042. const mbedtls_mpi *X,
  12043. const mbedtls_mpi *S,
  12044. const mbedtls_mpi *N,
  12045. int (*f_rng)(void *, unsigned char *, size_t),
  12046. void *p_rng )
  12047. {
  12048. int ret;
  12049. mbedtls_mpi b; /* Blinding value, then s + N * blinding */
  12050. mbedtls_mpi_init( &b );
  12051. /* b = s + rnd-128-bit * N */
  12052. MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &b, 16, f_rng, p_rng ) );
  12053. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &b, &b, N ) );
  12054. MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &b, &b, S ) );
  12055. /* R = sign * X * b mod N */
  12056. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( R, X, &b ) );
  12057. R->s *= sign;
  12058. MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( R, R, N ) );
  12059. cleanup:
  12060. mbedtls_mpi_free( &b );
  12061. return( ret );
  12062. }
  12063. /*
  12064. * Generate and write the second round message (S: 7.4.2.5, C: 7.4.2.6)
  12065. */
  12066. int mbedtls_ecjpake_write_round_two( mbedtls_ecjpake_context *ctx,
  12067. unsigned char *buf, size_t len, size_t *olen,
  12068. int (*f_rng)(void *, unsigned char *, size_t),
  12069. void *p_rng )
  12070. {
  12071. int ret;
  12072. mbedtls_ecp_point G; /* C: GA, S: GB */
  12073. mbedtls_ecp_point Xm; /* C: Xc, S: Xs */
  12074. mbedtls_mpi xm; /* C: xc, S: xs */
  12075. unsigned char *p = buf;
  12076. const unsigned char *end = buf + len;
  12077. size_t ec_len;
  12078. mbedtls_ecp_point_init( &G );
  12079. mbedtls_ecp_point_init( &Xm );
  12080. mbedtls_mpi_init( &xm );
  12081. /*
  12082. * First generate private/public key pair (S: 7.4.2.5.1, C: 7.4.2.6.1)
  12083. *
  12084. * Client: GA = X1 + X3 + X4 | xs = x2 * s | Xc = xc * GA
  12085. * Server: GB = X3 + X1 + X2 | xs = x4 * s | Xs = xs * GB
  12086. * Unified: G = Xm1 + Xp1 + Xp2 | xm = xm2 * s | Xm = xm * G
  12087. */
  12088. MBEDTLS_MPI_CHK( ecjpake_ecp_add3( &ctx->grp, &G,
  12089. &ctx->Xp1, &ctx->Xp2, &ctx->Xm1 ) );
  12090. MBEDTLS_MPI_CHK( ecjpake_mul_secret( &xm, 1, &ctx->xm2, &ctx->s,
  12091. &ctx->grp.N, f_rng, p_rng ) );
  12092. MBEDTLS_MPI_CHK( mbedtls_ecp_mul( &ctx->grp, &Xm, &xm, &G, f_rng, p_rng ) );
  12093. /*
  12094. * Now write things out
  12095. *
  12096. * struct {
  12097. * ECParameters curve_params; // only server writing its message
  12098. * ECJPAKEKeyKP ecjpake_key_kp;
  12099. * } Client/ServerECJPAKEParams;
  12100. */
  12101. if( ctx->role == MBEDTLS_ECJPAKE_SERVER )
  12102. {
  12103. if( end < p )
  12104. {
  12105. ret = MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL;
  12106. goto cleanup;
  12107. }
  12108. MBEDTLS_MPI_CHK( mbedtls_ecp_tls_write_group( &ctx->grp, &ec_len,
  12109. p, end - p ) );
  12110. p += ec_len;
  12111. }
  12112. if( end < p )
  12113. {
  12114. ret = MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL;
  12115. goto cleanup;
  12116. }
  12117. MBEDTLS_MPI_CHK( mbedtls_ecp_tls_write_point( &ctx->grp, &Xm,
  12118. ctx->point_format, &ec_len, p, end - p ) );
  12119. p += ec_len;
  12120. MBEDTLS_MPI_CHK( ecjpake_zkp_write( ctx->md_info, &ctx->grp,
  12121. ctx->point_format,
  12122. &G, &xm, &Xm, ID_MINE,
  12123. &p, end, f_rng, p_rng ) );
  12124. *olen = p - buf;
  12125. cleanup:
  12126. mbedtls_ecp_point_free( &G );
  12127. mbedtls_ecp_point_free( &Xm );
  12128. mbedtls_mpi_free( &xm );
  12129. return( ret );
  12130. }
  12131. /*
  12132. * Derive PMS (7.4.2.7 / 7.4.2.8)
  12133. */
  12134. int mbedtls_ecjpake_derive_secret( mbedtls_ecjpake_context *ctx,
  12135. unsigned char *buf, size_t len, size_t *olen,
  12136. int (*f_rng)(void *, unsigned char *, size_t),
  12137. void *p_rng )
  12138. {
  12139. int ret;
  12140. mbedtls_ecp_point K;
  12141. mbedtls_mpi m_xm2_s, one;
  12142. unsigned char kx[MBEDTLS_ECP_MAX_BYTES];
  12143. size_t x_bytes;
  12144. *olen = mbedtls_md_get_size( ctx->md_info );
  12145. if( len < *olen )
  12146. return( MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL );
  12147. mbedtls_ecp_point_init( &K );
  12148. mbedtls_mpi_init( &m_xm2_s );
  12149. mbedtls_mpi_init( &one );
  12150. MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &one, 1 ) );
  12151. /*
  12152. * Client: K = ( Xs - X4 * x2 * s ) * x2
  12153. * Server: K = ( Xc - X2 * x4 * s ) * x4
  12154. * Unified: K = ( Xp - Xp2 * xm2 * s ) * xm2
  12155. */
  12156. MBEDTLS_MPI_CHK( ecjpake_mul_secret( &m_xm2_s, -1, &ctx->xm2, &ctx->s,
  12157. &ctx->grp.N, f_rng, p_rng ) );
  12158. MBEDTLS_MPI_CHK( mbedtls_ecp_muladd( &ctx->grp, &K,
  12159. &one, &ctx->Xp,
  12160. &m_xm2_s, &ctx->Xp2 ) );
  12161. MBEDTLS_MPI_CHK( mbedtls_ecp_mul( &ctx->grp, &K, &ctx->xm2, &K,
  12162. f_rng, p_rng ) );
  12163. /* PMS = SHA-256( K.X ) */
  12164. x_bytes = ( ctx->grp.pbits + 7 ) / 8;
  12165. MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &K.X, kx, x_bytes ) );
  12166. MBEDTLS_MPI_CHK( mbedtls_md( ctx->md_info, kx, x_bytes, buf ) );
  12167. cleanup:
  12168. mbedtls_ecp_point_free( &K );
  12169. mbedtls_mpi_free( &m_xm2_s );
  12170. mbedtls_mpi_free( &one );
  12171. return( ret );
  12172. }
  12173. #undef ID_MINE
  12174. #undef ID_PEER
  12175. #if defined(MBEDTLS_SELF_TEST)
  12176. #if defined(MBEDTLS_PLATFORM_C)
  12177. #else
  12178. #include <stdio.h>
  12179. #define mbedtls_printf printf
  12180. #endif
  12181. #if !defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) || \
  12182. !defined(MBEDTLS_SHA256_C)
  12183. int mbedtls_ecjpake_self_test( int verbose )
  12184. {
  12185. (void) verbose;
  12186. return( 0 );
  12187. }
  12188. #else
  12189. static const unsigned char ecjpake_test_password[] = {
  12190. 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x6a, 0x70, 0x61, 0x6b, 0x65, 0x74,
  12191. 0x65, 0x73, 0x74
  12192. };
  12193. static const unsigned char ecjpake_test_x1[] = {
  12194. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c,
  12195. 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
  12196. 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x21
  12197. };
  12198. static const unsigned char ecjpake_test_x2[] = {
  12199. 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c,
  12200. 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
  12201. 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x81
  12202. };
  12203. static const unsigned char ecjpake_test_x3[] = {
  12204. 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c,
  12205. 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
  12206. 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x81
  12207. };
  12208. static const unsigned char ecjpake_test_x4[] = {
  12209. 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc,
  12210. 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8,
  12211. 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe1
  12212. };
  12213. static const unsigned char ecjpake_test_cli_one[] = {
  12214. 0x41, 0x04, 0xac, 0xcf, 0x01, 0x06, 0xef, 0x85, 0x8f, 0xa2, 0xd9, 0x19,
  12215. 0x33, 0x13, 0x46, 0x80, 0x5a, 0x78, 0xb5, 0x8b, 0xba, 0xd0, 0xb8, 0x44,
  12216. 0xe5, 0xc7, 0x89, 0x28, 0x79, 0x14, 0x61, 0x87, 0xdd, 0x26, 0x66, 0xad,
  12217. 0xa7, 0x81, 0xbb, 0x7f, 0x11, 0x13, 0x72, 0x25, 0x1a, 0x89, 0x10, 0x62,
  12218. 0x1f, 0x63, 0x4d, 0xf1, 0x28, 0xac, 0x48, 0xe3, 0x81, 0xfd, 0x6e, 0xf9,
  12219. 0x06, 0x07, 0x31, 0xf6, 0x94, 0xa4, 0x41, 0x04, 0x1d, 0xd0, 0xbd, 0x5d,
  12220. 0x45, 0x66, 0xc9, 0xbe, 0xd9, 0xce, 0x7d, 0xe7, 0x01, 0xb5, 0xe8, 0x2e,
  12221. 0x08, 0xe8, 0x4b, 0x73, 0x04, 0x66, 0x01, 0x8a, 0xb9, 0x03, 0xc7, 0x9e,
  12222. 0xb9, 0x82, 0x17, 0x22, 0x36, 0xc0, 0xc1, 0x72, 0x8a, 0xe4, 0xbf, 0x73,
  12223. 0x61, 0x0d, 0x34, 0xde, 0x44, 0x24, 0x6e, 0xf3, 0xd9, 0xc0, 0x5a, 0x22,
  12224. 0x36, 0xfb, 0x66, 0xa6, 0x58, 0x3d, 0x74, 0x49, 0x30, 0x8b, 0xab, 0xce,
  12225. 0x20, 0x72, 0xfe, 0x16, 0x66, 0x29, 0x92, 0xe9, 0x23, 0x5c, 0x25, 0x00,
  12226. 0x2f, 0x11, 0xb1, 0x50, 0x87, 0xb8, 0x27, 0x38, 0xe0, 0x3c, 0x94, 0x5b,
  12227. 0xf7, 0xa2, 0x99, 0x5d, 0xda, 0x1e, 0x98, 0x34, 0x58, 0x41, 0x04, 0x7e,
  12228. 0xa6, 0xe3, 0xa4, 0x48, 0x70, 0x37, 0xa9, 0xe0, 0xdb, 0xd7, 0x92, 0x62,
  12229. 0xb2, 0xcc, 0x27, 0x3e, 0x77, 0x99, 0x30, 0xfc, 0x18, 0x40, 0x9a, 0xc5,
  12230. 0x36, 0x1c, 0x5f, 0xe6, 0x69, 0xd7, 0x02, 0xe1, 0x47, 0x79, 0x0a, 0xeb,
  12231. 0x4c, 0xe7, 0xfd, 0x65, 0x75, 0xab, 0x0f, 0x6c, 0x7f, 0xd1, 0xc3, 0x35,
  12232. 0x93, 0x9a, 0xa8, 0x63, 0xba, 0x37, 0xec, 0x91, 0xb7, 0xe3, 0x2b, 0xb0,
  12233. 0x13, 0xbb, 0x2b, 0x41, 0x04, 0xa4, 0x95, 0x58, 0xd3, 0x2e, 0xd1, 0xeb,
  12234. 0xfc, 0x18, 0x16, 0xaf, 0x4f, 0xf0, 0x9b, 0x55, 0xfc, 0xb4, 0xca, 0x47,
  12235. 0xb2, 0xa0, 0x2d, 0x1e, 0x7c, 0xaf, 0x11, 0x79, 0xea, 0x3f, 0xe1, 0x39,
  12236. 0x5b, 0x22, 0xb8, 0x61, 0x96, 0x40, 0x16, 0xfa, 0xba, 0xf7, 0x2c, 0x97,
  12237. 0x56, 0x95, 0xd9, 0x3d, 0x4d, 0xf0, 0xe5, 0x19, 0x7f, 0xe9, 0xf0, 0x40,
  12238. 0x63, 0x4e, 0xd5, 0x97, 0x64, 0x93, 0x77, 0x87, 0xbe, 0x20, 0xbc, 0x4d,
  12239. 0xee, 0xbb, 0xf9, 0xb8, 0xd6, 0x0a, 0x33, 0x5f, 0x04, 0x6c, 0xa3, 0xaa,
  12240. 0x94, 0x1e, 0x45, 0x86, 0x4c, 0x7c, 0xad, 0xef, 0x9c, 0xf7, 0x5b, 0x3d,
  12241. 0x8b, 0x01, 0x0e, 0x44, 0x3e, 0xf0
  12242. };
  12243. static const unsigned char ecjpake_test_srv_one[] = {
  12244. 0x41, 0x04, 0x7e, 0xa6, 0xe3, 0xa4, 0x48, 0x70, 0x37, 0xa9, 0xe0, 0xdb,
  12245. 0xd7, 0x92, 0x62, 0xb2, 0xcc, 0x27, 0x3e, 0x77, 0x99, 0x30, 0xfc, 0x18,
  12246. 0x40, 0x9a, 0xc5, 0x36, 0x1c, 0x5f, 0xe6, 0x69, 0xd7, 0x02, 0xe1, 0x47,
  12247. 0x79, 0x0a, 0xeb, 0x4c, 0xe7, 0xfd, 0x65, 0x75, 0xab, 0x0f, 0x6c, 0x7f,
  12248. 0xd1, 0xc3, 0x35, 0x93, 0x9a, 0xa8, 0x63, 0xba, 0x37, 0xec, 0x91, 0xb7,
  12249. 0xe3, 0x2b, 0xb0, 0x13, 0xbb, 0x2b, 0x41, 0x04, 0x09, 0xf8, 0x5b, 0x3d,
  12250. 0x20, 0xeb, 0xd7, 0x88, 0x5c, 0xe4, 0x64, 0xc0, 0x8d, 0x05, 0x6d, 0x64,
  12251. 0x28, 0xfe, 0x4d, 0xd9, 0x28, 0x7a, 0xa3, 0x65, 0xf1, 0x31, 0xf4, 0x36,
  12252. 0x0f, 0xf3, 0x86, 0xd8, 0x46, 0x89, 0x8b, 0xc4, 0xb4, 0x15, 0x83, 0xc2,
  12253. 0xa5, 0x19, 0x7f, 0x65, 0xd7, 0x87, 0x42, 0x74, 0x6c, 0x12, 0xa5, 0xec,
  12254. 0x0a, 0x4f, 0xfe, 0x2f, 0x27, 0x0a, 0x75, 0x0a, 0x1d, 0x8f, 0xb5, 0x16,
  12255. 0x20, 0x93, 0x4d, 0x74, 0xeb, 0x43, 0xe5, 0x4d, 0xf4, 0x24, 0xfd, 0x96,
  12256. 0x30, 0x6c, 0x01, 0x17, 0xbf, 0x13, 0x1a, 0xfa, 0xbf, 0x90, 0xa9, 0xd3,
  12257. 0x3d, 0x11, 0x98, 0xd9, 0x05, 0x19, 0x37, 0x35, 0x14, 0x41, 0x04, 0x19,
  12258. 0x0a, 0x07, 0x70, 0x0f, 0xfa, 0x4b, 0xe6, 0xae, 0x1d, 0x79, 0xee, 0x0f,
  12259. 0x06, 0xae, 0xb5, 0x44, 0xcd, 0x5a, 0xdd, 0xaa, 0xbe, 0xdf, 0x70, 0xf8,
  12260. 0x62, 0x33, 0x21, 0x33, 0x2c, 0x54, 0xf3, 0x55, 0xf0, 0xfb, 0xfe, 0xc7,
  12261. 0x83, 0xed, 0x35, 0x9e, 0x5d, 0x0b, 0xf7, 0x37, 0x7a, 0x0f, 0xc4, 0xea,
  12262. 0x7a, 0xce, 0x47, 0x3c, 0x9c, 0x11, 0x2b, 0x41, 0xcc, 0xd4, 0x1a, 0xc5,
  12263. 0x6a, 0x56, 0x12, 0x41, 0x04, 0x36, 0x0a, 0x1c, 0xea, 0x33, 0xfc, 0xe6,
  12264. 0x41, 0x15, 0x64, 0x58, 0xe0, 0xa4, 0xea, 0xc2, 0x19, 0xe9, 0x68, 0x31,
  12265. 0xe6, 0xae, 0xbc, 0x88, 0xb3, 0xf3, 0x75, 0x2f, 0x93, 0xa0, 0x28, 0x1d,
  12266. 0x1b, 0xf1, 0xfb, 0x10, 0x60, 0x51, 0xdb, 0x96, 0x94, 0xa8, 0xd6, 0xe8,
  12267. 0x62, 0xa5, 0xef, 0x13, 0x24, 0xa3, 0xd9, 0xe2, 0x78, 0x94, 0xf1, 0xee,
  12268. 0x4f, 0x7c, 0x59, 0x19, 0x99, 0x65, 0xa8, 0xdd, 0x4a, 0x20, 0x91, 0x84,
  12269. 0x7d, 0x2d, 0x22, 0xdf, 0x3e, 0xe5, 0x5f, 0xaa, 0x2a, 0x3f, 0xb3, 0x3f,
  12270. 0xd2, 0xd1, 0xe0, 0x55, 0xa0, 0x7a, 0x7c, 0x61, 0xec, 0xfb, 0x8d, 0x80,
  12271. 0xec, 0x00, 0xc2, 0xc9, 0xeb, 0x12
  12272. };
  12273. static const unsigned char ecjpake_test_srv_two[] = {
  12274. 0x03, 0x00, 0x17, 0x41, 0x04, 0x0f, 0xb2, 0x2b, 0x1d, 0x5d, 0x11, 0x23,
  12275. 0xe0, 0xef, 0x9f, 0xeb, 0x9d, 0x8a, 0x2e, 0x59, 0x0a, 0x1f, 0x4d, 0x7c,
  12276. 0xed, 0x2c, 0x2b, 0x06, 0x58, 0x6e, 0x8f, 0x2a, 0x16, 0xd4, 0xeb, 0x2f,
  12277. 0xda, 0x43, 0x28, 0xa2, 0x0b, 0x07, 0xd8, 0xfd, 0x66, 0x76, 0x54, 0xca,
  12278. 0x18, 0xc5, 0x4e, 0x32, 0xa3, 0x33, 0xa0, 0x84, 0x54, 0x51, 0xe9, 0x26,
  12279. 0xee, 0x88, 0x04, 0xfd, 0x7a, 0xf0, 0xaa, 0xa7, 0xa6, 0x41, 0x04, 0x55,
  12280. 0x16, 0xea, 0x3e, 0x54, 0xa0, 0xd5, 0xd8, 0xb2, 0xce, 0x78, 0x6b, 0x38,
  12281. 0xd3, 0x83, 0x37, 0x00, 0x29, 0xa5, 0xdb, 0xe4, 0x45, 0x9c, 0x9d, 0xd6,
  12282. 0x01, 0xb4, 0x08, 0xa2, 0x4a, 0xe6, 0x46, 0x5c, 0x8a, 0xc9, 0x05, 0xb9,
  12283. 0xeb, 0x03, 0xb5, 0xd3, 0x69, 0x1c, 0x13, 0x9e, 0xf8, 0x3f, 0x1c, 0xd4,
  12284. 0x20, 0x0f, 0x6c, 0x9c, 0xd4, 0xec, 0x39, 0x22, 0x18, 0xa5, 0x9e, 0xd2,
  12285. 0x43, 0xd3, 0xc8, 0x20, 0xff, 0x72, 0x4a, 0x9a, 0x70, 0xb8, 0x8c, 0xb8,
  12286. 0x6f, 0x20, 0xb4, 0x34, 0xc6, 0x86, 0x5a, 0xa1, 0xcd, 0x79, 0x06, 0xdd,
  12287. 0x7c, 0x9b, 0xce, 0x35, 0x25, 0xf5, 0x08, 0x27, 0x6f, 0x26, 0x83, 0x6c
  12288. };
  12289. static const unsigned char ecjpake_test_cli_two[] = {
  12290. 0x41, 0x04, 0x69, 0xd5, 0x4e, 0xe8, 0x5e, 0x90, 0xce, 0x3f, 0x12, 0x46,
  12291. 0x74, 0x2d, 0xe5, 0x07, 0xe9, 0x39, 0xe8, 0x1d, 0x1d, 0xc1, 0xc5, 0xcb,
  12292. 0x98, 0x8b, 0x58, 0xc3, 0x10, 0xc9, 0xfd, 0xd9, 0x52, 0x4d, 0x93, 0x72,
  12293. 0x0b, 0x45, 0x54, 0x1c, 0x83, 0xee, 0x88, 0x41, 0x19, 0x1d, 0xa7, 0xce,
  12294. 0xd8, 0x6e, 0x33, 0x12, 0xd4, 0x36, 0x23, 0xc1, 0xd6, 0x3e, 0x74, 0x98,
  12295. 0x9a, 0xba, 0x4a, 0xff, 0xd1, 0xee, 0x41, 0x04, 0x07, 0x7e, 0x8c, 0x31,
  12296. 0xe2, 0x0e, 0x6b, 0xed, 0xb7, 0x60, 0xc1, 0x35, 0x93, 0xe6, 0x9f, 0x15,
  12297. 0xbe, 0x85, 0xc2, 0x7d, 0x68, 0xcd, 0x09, 0xcc, 0xb8, 0xc4, 0x18, 0x36,
  12298. 0x08, 0x91, 0x7c, 0x5c, 0x3d, 0x40, 0x9f, 0xac, 0x39, 0xfe, 0xfe, 0xe8,
  12299. 0x2f, 0x72, 0x92, 0xd3, 0x6f, 0x0d, 0x23, 0xe0, 0x55, 0x91, 0x3f, 0x45,
  12300. 0xa5, 0x2b, 0x85, 0xdd, 0x8a, 0x20, 0x52, 0xe9, 0xe1, 0x29, 0xbb, 0x4d,
  12301. 0x20, 0x0f, 0x01, 0x1f, 0x19, 0x48, 0x35, 0x35, 0xa6, 0xe8, 0x9a, 0x58,
  12302. 0x0c, 0x9b, 0x00, 0x03, 0xba, 0xf2, 0x14, 0x62, 0xec, 0xe9, 0x1a, 0x82,
  12303. 0xcc, 0x38, 0xdb, 0xdc, 0xae, 0x60, 0xd9, 0xc5, 0x4c
  12304. };
  12305. static const unsigned char ecjpake_test_pms[] = {
  12306. 0xf3, 0xd4, 0x7f, 0x59, 0x98, 0x44, 0xdb, 0x92, 0xa5, 0x69, 0xbb, 0xe7,
  12307. 0x98, 0x1e, 0x39, 0xd9, 0x31, 0xfd, 0x74, 0x3b, 0xf2, 0x2e, 0x98, 0xf9,
  12308. 0xb4, 0x38, 0xf7, 0x19, 0xd3, 0xc4, 0xf3, 0x51
  12309. };
  12310. /* Load my private keys and generate the correponding public keys */
  12311. static int ecjpake_test_load( mbedtls_ecjpake_context *ctx,
  12312. const unsigned char *xm1, size_t len1,
  12313. const unsigned char *xm2, size_t len2 )
  12314. {
  12315. int ret;
  12316. MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &ctx->xm1, xm1, len1 ) );
  12317. MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &ctx->xm2, xm2, len2 ) );
  12318. MBEDTLS_MPI_CHK( mbedtls_ecp_mul( &ctx->grp, &ctx->Xm1, &ctx->xm1,
  12319. &ctx->grp.G, NULL, NULL ) );
  12320. MBEDTLS_MPI_CHK( mbedtls_ecp_mul( &ctx->grp, &ctx->Xm2, &ctx->xm2,
  12321. &ctx->grp.G, NULL, NULL ) );
  12322. cleanup:
  12323. return( ret );
  12324. }
  12325. /* For tests we don't need a secure RNG;
  12326. * use the LGC from Numerical Recipes for simplicity */
  12327. static int ecjpake_lgc( void *p, unsigned char *out, size_t len )
  12328. {
  12329. static uint32_t x = 42;
  12330. (void) p;
  12331. while( len > 0 )
  12332. {
  12333. size_t use_len = len > 4 ? 4 : len;
  12334. x = 1664525 * x + 1013904223;
  12335. memcpy( out, &x, use_len );
  12336. out += use_len;
  12337. len -= use_len;
  12338. }
  12339. return( 0 );
  12340. }
  12341. #define TEST_ASSERT( x ) \
  12342. do { \
  12343. if( x ) \
  12344. ret = 0; \
  12345. else \
  12346. { \
  12347. ret = 1; \
  12348. goto cleanup; \
  12349. } \
  12350. } while( 0 )
  12351. /*
  12352. * Checkup routine
  12353. */
  12354. int mbedtls_ecjpake_self_test( int verbose )
  12355. {
  12356. int ret;
  12357. mbedtls_ecjpake_context cli;
  12358. mbedtls_ecjpake_context srv;
  12359. unsigned char buf[512], pms[32];
  12360. size_t len, pmslen;
  12361. mbedtls_ecjpake_init( &cli );
  12362. mbedtls_ecjpake_init( &srv );
  12363. if( verbose != 0 )
  12364. mbedtls_printf( " ECJPAKE test #0 (setup): " );
  12365. TEST_ASSERT( mbedtls_ecjpake_setup( &cli, MBEDTLS_ECJPAKE_CLIENT,
  12366. MBEDTLS_MD_SHA256, MBEDTLS_ECP_DP_SECP256R1,
  12367. ecjpake_test_password,
  12368. sizeof( ecjpake_test_password ) ) == 0 );
  12369. TEST_ASSERT( mbedtls_ecjpake_setup( &srv, MBEDTLS_ECJPAKE_SERVER,
  12370. MBEDTLS_MD_SHA256, MBEDTLS_ECP_DP_SECP256R1,
  12371. ecjpake_test_password,
  12372. sizeof( ecjpake_test_password ) ) == 0 );
  12373. if( verbose != 0 )
  12374. mbedtls_printf( "passed\n" );
  12375. if( verbose != 0 )
  12376. mbedtls_printf( " ECJPAKE test #1 (random handshake): " );
  12377. TEST_ASSERT( mbedtls_ecjpake_write_round_one( &cli,
  12378. buf, sizeof( buf ), &len, ecjpake_lgc, NULL ) == 0 );
  12379. TEST_ASSERT( mbedtls_ecjpake_read_round_one( &srv, buf, len ) == 0 );
  12380. TEST_ASSERT( mbedtls_ecjpake_write_round_one( &srv,
  12381. buf, sizeof( buf ), &len, ecjpake_lgc, NULL ) == 0 );
  12382. TEST_ASSERT( mbedtls_ecjpake_read_round_one( &cli, buf, len ) == 0 );
  12383. TEST_ASSERT( mbedtls_ecjpake_write_round_two( &srv,
  12384. buf, sizeof( buf ), &len, ecjpake_lgc, NULL ) == 0 );
  12385. TEST_ASSERT( mbedtls_ecjpake_read_round_two( &cli, buf, len ) == 0 );
  12386. TEST_ASSERT( mbedtls_ecjpake_derive_secret( &cli,
  12387. pms, sizeof( pms ), &pmslen, ecjpake_lgc, NULL ) == 0 );
  12388. TEST_ASSERT( mbedtls_ecjpake_write_round_two( &cli,
  12389. buf, sizeof( buf ), &len, ecjpake_lgc, NULL ) == 0 );
  12390. TEST_ASSERT( mbedtls_ecjpake_read_round_two( &srv, buf, len ) == 0 );
  12391. TEST_ASSERT( mbedtls_ecjpake_derive_secret( &srv,
  12392. buf, sizeof( buf ), &len, ecjpake_lgc, NULL ) == 0 );
  12393. TEST_ASSERT( len == pmslen );
  12394. TEST_ASSERT( memcmp( buf, pms, len ) == 0 );
  12395. if( verbose != 0 )
  12396. mbedtls_printf( "passed\n" );
  12397. if( verbose != 0 )
  12398. mbedtls_printf( " ECJPAKE test #2 (reference handshake): " );
  12399. /* Simulate generation of round one */
  12400. MBEDTLS_MPI_CHK( ecjpake_test_load( &cli,
  12401. ecjpake_test_x1, sizeof( ecjpake_test_x1 ),
  12402. ecjpake_test_x2, sizeof( ecjpake_test_x2 ) ) );
  12403. MBEDTLS_MPI_CHK( ecjpake_test_load( &srv,
  12404. ecjpake_test_x3, sizeof( ecjpake_test_x3 ),
  12405. ecjpake_test_x4, sizeof( ecjpake_test_x4 ) ) );
  12406. /* Read round one */
  12407. TEST_ASSERT( mbedtls_ecjpake_read_round_one( &srv,
  12408. ecjpake_test_cli_one,
  12409. sizeof( ecjpake_test_cli_one ) ) == 0 );
  12410. TEST_ASSERT( mbedtls_ecjpake_read_round_one( &cli,
  12411. ecjpake_test_srv_one,
  12412. sizeof( ecjpake_test_srv_one ) ) == 0 );
  12413. /* Skip generation of round two, read round two */
  12414. TEST_ASSERT( mbedtls_ecjpake_read_round_two( &cli,
  12415. ecjpake_test_srv_two,
  12416. sizeof( ecjpake_test_srv_two ) ) == 0 );
  12417. TEST_ASSERT( mbedtls_ecjpake_read_round_two( &srv,
  12418. ecjpake_test_cli_two,
  12419. sizeof( ecjpake_test_cli_two ) ) == 0 );
  12420. /* Server derives PMS */
  12421. TEST_ASSERT( mbedtls_ecjpake_derive_secret( &srv,
  12422. buf, sizeof( buf ), &len, ecjpake_lgc, NULL ) == 0 );
  12423. TEST_ASSERT( len == sizeof( ecjpake_test_pms ) );
  12424. TEST_ASSERT( memcmp( buf, ecjpake_test_pms, len ) == 0 );
  12425. memset( buf, 0, len ); /* Avoid interferences with next step */
  12426. /* Client derives PMS */
  12427. TEST_ASSERT( mbedtls_ecjpake_derive_secret( &cli,
  12428. buf, sizeof( buf ), &len, ecjpake_lgc, NULL ) == 0 );
  12429. TEST_ASSERT( len == sizeof( ecjpake_test_pms ) );
  12430. TEST_ASSERT( memcmp( buf, ecjpake_test_pms, len ) == 0 );
  12431. if( verbose != 0 )
  12432. mbedtls_printf( "passed\n" );
  12433. cleanup:
  12434. mbedtls_ecjpake_free( &cli );
  12435. mbedtls_ecjpake_free( &srv );
  12436. if( ret != 0 )
  12437. {
  12438. if( verbose != 0 )
  12439. mbedtls_printf( "failed\n" );
  12440. ret = 1;
  12441. }
  12442. if( verbose != 0 )
  12443. mbedtls_printf( "\n" );
  12444. return( ret );
  12445. }
  12446. #undef TEST_ASSERT
  12447. #endif /* MBEDTLS_ECP_DP_SECP256R1_ENABLED && MBEDTLS_SHA256_C */
  12448. #endif /* MBEDTLS_SELF_TEST */
  12449. #endif /* MBEDTLS_ECJPAKE_C */
  12450. /********* Start of file library/ecp.c ************/
  12451. /*
  12452. * Elliptic curves over GF(p): generic functions
  12453. *
  12454. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  12455. * SPDX-License-Identifier: Apache-2.0
  12456. *
  12457. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  12458. * not use this file except in compliance with the License.
  12459. * You may obtain a copy of the License at
  12460. *
  12461. * http://www.apache.org/licenses/LICENSE-2.0
  12462. *
  12463. * Unless required by applicable law or agreed to in writing, software
  12464. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  12465. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12466. * See the License for the specific language governing permissions and
  12467. * limitations under the License.
  12468. *
  12469. * This file is part of mbed TLS (https://tls.mbed.org)
  12470. */
  12471. /*
  12472. * References:
  12473. *
  12474. * SEC1 http://www.secg.org/index.php?action=secg,docs_secg
  12475. * GECC = Guide to Elliptic Curve Cryptography - Hankerson, Menezes, Vanstone
  12476. * FIPS 186-3 http://csrc.nist.gov/publications/fips/fips186-3/fips_186-3.pdf
  12477. * RFC 4492 for the related TLS structures and constants
  12478. *
  12479. * [Curve25519] http://cr.yp.to/ecdh/curve25519-20060209.pdf
  12480. *
  12481. * [2] CORON, Jean-S'ebastien. Resistance against differential power analysis
  12482. * for elliptic curve cryptosystems. In : Cryptographic Hardware and
  12483. * Embedded Systems. Springer Berlin Heidelberg, 1999. p. 292-302.
  12484. * <http://link.springer.com/chapter/10.1007/3-540-48059-5_25>
  12485. *
  12486. * [3] HEDABOU, Mustapha, PINEL, Pierre, et B'EN'ETEAU, Lucien. A comb method to
  12487. * render ECC resistant against Side Channel Attacks. IACR Cryptology
  12488. * ePrint Archive, 2004, vol. 2004, p. 342.
  12489. * <http://eprint.iacr.org/2004/342.pdf>
  12490. */
  12491. #if !defined(MBEDTLS_CONFIG_FILE)
  12492. #else
  12493. #endif
  12494. #if defined(MBEDTLS_ECP_C)
  12495. #include <string.h>
  12496. #if defined(MBEDTLS_PLATFORM_C)
  12497. #else
  12498. #include <stdlib.h>
  12499. #include <stdio.h>
  12500. #define mbedtls_printf printf
  12501. #define mbedtls_calloc calloc
  12502. #define mbedtls_free free
  12503. #endif
  12504. #if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \
  12505. !defined(inline) && !defined(__cplusplus)
  12506. #define inline __inline
  12507. #endif
  12508. /* Implementation that should never be optimized out by the compiler */
  12509. static void ecp_zeroize( void *v, size_t n ) {
  12510. volatile unsigned char *p = v; while( n-- ) *p++ = 0;
  12511. }
  12512. #if defined(MBEDTLS_SELF_TEST)
  12513. /*
  12514. * Counts of point addition and doubling, and field multiplications.
  12515. * Used to test resistance of point multiplication to simple timing attacks.
  12516. */
  12517. static unsigned long add_count, dbl_count, mul_count;
  12518. #endif
  12519. #if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) || \
  12520. defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) || \
  12521. defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) || \
  12522. defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED) || \
  12523. defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED) || \
  12524. defined(MBEDTLS_ECP_DP_BP256R1_ENABLED) || \
  12525. defined(MBEDTLS_ECP_DP_BP384R1_ENABLED) || \
  12526. defined(MBEDTLS_ECP_DP_BP512R1_ENABLED) || \
  12527. defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) || \
  12528. defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) || \
  12529. defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED)
  12530. #define ECP_SHORTWEIERSTRASS
  12531. #endif
  12532. #if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED)
  12533. #define ECP_MONTGOMERY
  12534. #endif
  12535. /*
  12536. * Curve types: internal for now, might be exposed later
  12537. */
  12538. typedef enum
  12539. {
  12540. ECP_TYPE_NONE = 0,
  12541. ECP_TYPE_SHORT_WEIERSTRASS, /* y^2 = x^3 + a x + b */
  12542. ECP_TYPE_MONTGOMERY, /* y^2 = x^3 + a x^2 + x */
  12543. } ecp_curve_type;
  12544. /*
  12545. * List of supported curves:
  12546. * - internal ID
  12547. * - TLS NamedCurve ID (RFC 4492 sec. 5.1.1, RFC 7071 sec. 2)
  12548. * - size in bits
  12549. * - readable name
  12550. *
  12551. * Curves are listed in order: largest curves first, and for a given size,
  12552. * fastest curves first. This provides the default order for the SSL module.
  12553. *
  12554. * Reminder: update profiles in x509_crt.c when adding a new curves!
  12555. */
  12556. static const mbedtls_ecp_curve_info ecp_supported_curves[] =
  12557. {
  12558. #if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED)
  12559. { MBEDTLS_ECP_DP_SECP521R1, 25, 521, "secp521r1" },
  12560. #endif
  12561. #if defined(MBEDTLS_ECP_DP_BP512R1_ENABLED)
  12562. { MBEDTLS_ECP_DP_BP512R1, 28, 512, "brainpoolP512r1" },
  12563. #endif
  12564. #if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED)
  12565. { MBEDTLS_ECP_DP_SECP384R1, 24, 384, "secp384r1" },
  12566. #endif
  12567. #if defined(MBEDTLS_ECP_DP_BP384R1_ENABLED)
  12568. { MBEDTLS_ECP_DP_BP384R1, 27, 384, "brainpoolP384r1" },
  12569. #endif
  12570. #if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED)
  12571. { MBEDTLS_ECP_DP_SECP256R1, 23, 256, "secp256r1" },
  12572. #endif
  12573. #if defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED)
  12574. { MBEDTLS_ECP_DP_SECP256K1, 22, 256, "secp256k1" },
  12575. #endif
  12576. #if defined(MBEDTLS_ECP_DP_BP256R1_ENABLED)
  12577. { MBEDTLS_ECP_DP_BP256R1, 26, 256, "brainpoolP256r1" },
  12578. #endif
  12579. #if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED)
  12580. { MBEDTLS_ECP_DP_SECP224R1, 21, 224, "secp224r1" },
  12581. #endif
  12582. #if defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED)
  12583. { MBEDTLS_ECP_DP_SECP224K1, 20, 224, "secp224k1" },
  12584. #endif
  12585. #if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED)
  12586. { MBEDTLS_ECP_DP_SECP192R1, 19, 192, "secp192r1" },
  12587. #endif
  12588. #if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED)
  12589. { MBEDTLS_ECP_DP_SECP192K1, 18, 192, "secp192k1" },
  12590. #endif
  12591. { MBEDTLS_ECP_DP_NONE, 0, 0, NULL },
  12592. };
  12593. #define ECP_NB_CURVES sizeof( ecp_supported_curves ) / \
  12594. sizeof( ecp_supported_curves[0] )
  12595. static mbedtls_ecp_group_id ecp_supported_grp_id[ECP_NB_CURVES];
  12596. /*
  12597. * List of supported curves and associated info
  12598. */
  12599. const mbedtls_ecp_curve_info *mbedtls_ecp_curve_list( void )
  12600. {
  12601. return( ecp_supported_curves );
  12602. }
  12603. /*
  12604. * List of supported curves, group ID only
  12605. */
  12606. const mbedtls_ecp_group_id *mbedtls_ecp_grp_id_list( void )
  12607. {
  12608. static int init_done = 0;
  12609. if( ! init_done )
  12610. {
  12611. size_t i = 0;
  12612. const mbedtls_ecp_curve_info *curve_info;
  12613. for( curve_info = mbedtls_ecp_curve_list();
  12614. curve_info->grp_id != MBEDTLS_ECP_DP_NONE;
  12615. curve_info++ )
  12616. {
  12617. ecp_supported_grp_id[i++] = curve_info->grp_id;
  12618. }
  12619. ecp_supported_grp_id[i] = MBEDTLS_ECP_DP_NONE;
  12620. init_done = 1;
  12621. }
  12622. return( ecp_supported_grp_id );
  12623. }
  12624. /*
  12625. * Get the curve info for the internal identifier
  12626. */
  12627. const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_grp_id( mbedtls_ecp_group_id grp_id )
  12628. {
  12629. const mbedtls_ecp_curve_info *curve_info;
  12630. for( curve_info = mbedtls_ecp_curve_list();
  12631. curve_info->grp_id != MBEDTLS_ECP_DP_NONE;
  12632. curve_info++ )
  12633. {
  12634. if( curve_info->grp_id == grp_id )
  12635. return( curve_info );
  12636. }
  12637. return( NULL );
  12638. }
  12639. /*
  12640. * Get the curve info from the TLS identifier
  12641. */
  12642. const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_tls_id( uint16_t tls_id )
  12643. {
  12644. const mbedtls_ecp_curve_info *curve_info;
  12645. for( curve_info = mbedtls_ecp_curve_list();
  12646. curve_info->grp_id != MBEDTLS_ECP_DP_NONE;
  12647. curve_info++ )
  12648. {
  12649. if( curve_info->tls_id == tls_id )
  12650. return( curve_info );
  12651. }
  12652. return( NULL );
  12653. }
  12654. /*
  12655. * Get the curve info from the name
  12656. */
  12657. const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_name( const char *name )
  12658. {
  12659. const mbedtls_ecp_curve_info *curve_info;
  12660. for( curve_info = mbedtls_ecp_curve_list();
  12661. curve_info->grp_id != MBEDTLS_ECP_DP_NONE;
  12662. curve_info++ )
  12663. {
  12664. if( strcmp( curve_info->name, name ) == 0 )
  12665. return( curve_info );
  12666. }
  12667. return( NULL );
  12668. }
  12669. /*
  12670. * Get the type of a curve
  12671. */
  12672. static inline ecp_curve_type ecp_get_type( const mbedtls_ecp_group *grp )
  12673. {
  12674. if( grp->G.X.p == NULL )
  12675. return( ECP_TYPE_NONE );
  12676. if( grp->G.Y.p == NULL )
  12677. return( ECP_TYPE_MONTGOMERY );
  12678. else
  12679. return( ECP_TYPE_SHORT_WEIERSTRASS );
  12680. }
  12681. /*
  12682. * Initialize (the components of) a point
  12683. */
  12684. void mbedtls_ecp_point_init( mbedtls_ecp_point *pt )
  12685. {
  12686. if( pt == NULL )
  12687. return;
  12688. mbedtls_mpi_init( &pt->X );
  12689. mbedtls_mpi_init( &pt->Y );
  12690. mbedtls_mpi_init( &pt->Z );
  12691. }
  12692. /*
  12693. * Initialize (the components of) a group
  12694. */
  12695. void mbedtls_ecp_group_init( mbedtls_ecp_group *grp )
  12696. {
  12697. if( grp == NULL )
  12698. return;
  12699. memset( grp, 0, sizeof( mbedtls_ecp_group ) );
  12700. }
  12701. /*
  12702. * Initialize (the components of) a key pair
  12703. */
  12704. void mbedtls_ecp_keypair_init( mbedtls_ecp_keypair *key )
  12705. {
  12706. if( key == NULL )
  12707. return;
  12708. mbedtls_ecp_group_init( &key->grp );
  12709. mbedtls_mpi_init( &key->d );
  12710. mbedtls_ecp_point_init( &key->Q );
  12711. }
  12712. /*
  12713. * Unallocate (the components of) a point
  12714. */
  12715. void mbedtls_ecp_point_free( mbedtls_ecp_point *pt )
  12716. {
  12717. if( pt == NULL )
  12718. return;
  12719. mbedtls_mpi_free( &( pt->X ) );
  12720. mbedtls_mpi_free( &( pt->Y ) );
  12721. mbedtls_mpi_free( &( pt->Z ) );
  12722. }
  12723. /*
  12724. * Unallocate (the components of) a group
  12725. */
  12726. void mbedtls_ecp_group_free( mbedtls_ecp_group *grp )
  12727. {
  12728. size_t i;
  12729. if( grp == NULL )
  12730. return;
  12731. if( grp->h != 1 )
  12732. {
  12733. mbedtls_mpi_free( &grp->P );
  12734. mbedtls_mpi_free( &grp->A );
  12735. mbedtls_mpi_free( &grp->B );
  12736. mbedtls_ecp_point_free( &grp->G );
  12737. mbedtls_mpi_free( &grp->N );
  12738. }
  12739. if( grp->T != NULL )
  12740. {
  12741. for( i = 0; i < grp->T_size; i++ )
  12742. mbedtls_ecp_point_free( &grp->T[i] );
  12743. mbedtls_free( grp->T );
  12744. }
  12745. ecp_zeroize( grp, sizeof( mbedtls_ecp_group ) );
  12746. }
  12747. /*
  12748. * Unallocate (the components of) a key pair
  12749. */
  12750. void mbedtls_ecp_keypair_free( mbedtls_ecp_keypair *key )
  12751. {
  12752. if( key == NULL )
  12753. return;
  12754. mbedtls_ecp_group_free( &key->grp );
  12755. mbedtls_mpi_free( &key->d );
  12756. mbedtls_ecp_point_free( &key->Q );
  12757. }
  12758. /*
  12759. * Copy the contents of a point
  12760. */
  12761. int mbedtls_ecp_copy( mbedtls_ecp_point *P, const mbedtls_ecp_point *Q )
  12762. {
  12763. int ret;
  12764. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &P->X, &Q->X ) );
  12765. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &P->Y, &Q->Y ) );
  12766. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &P->Z, &Q->Z ) );
  12767. cleanup:
  12768. return( ret );
  12769. }
  12770. /*
  12771. * Copy the contents of a group object
  12772. */
  12773. int mbedtls_ecp_group_copy( mbedtls_ecp_group *dst, const mbedtls_ecp_group *src )
  12774. {
  12775. return mbedtls_ecp_group_load( dst, src->id );
  12776. }
  12777. /*
  12778. * Set point to zero
  12779. */
  12780. int mbedtls_ecp_set_zero( mbedtls_ecp_point *pt )
  12781. {
  12782. int ret;
  12783. MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &pt->X , 1 ) );
  12784. MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &pt->Y , 1 ) );
  12785. MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &pt->Z , 0 ) );
  12786. cleanup:
  12787. return( ret );
  12788. }
  12789. /*
  12790. * Tell if a point is zero
  12791. */
  12792. int mbedtls_ecp_is_zero( mbedtls_ecp_point *pt )
  12793. {
  12794. return( mbedtls_mpi_cmp_int( &pt->Z, 0 ) == 0 );
  12795. }
  12796. /*
  12797. * Compare two points lazyly
  12798. */
  12799. int mbedtls_ecp_point_cmp( const mbedtls_ecp_point *P,
  12800. const mbedtls_ecp_point *Q )
  12801. {
  12802. if( mbedtls_mpi_cmp_mpi( &P->X, &Q->X ) == 0 &&
  12803. mbedtls_mpi_cmp_mpi( &P->Y, &Q->Y ) == 0 &&
  12804. mbedtls_mpi_cmp_mpi( &P->Z, &Q->Z ) == 0 )
  12805. {
  12806. return( 0 );
  12807. }
  12808. return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );
  12809. }
  12810. /*
  12811. * Import a non-zero point from ASCII strings
  12812. */
  12813. int mbedtls_ecp_point_read_string( mbedtls_ecp_point *P, int radix,
  12814. const char *x, const char *y )
  12815. {
  12816. int ret;
  12817. MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &P->X, radix, x ) );
  12818. MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &P->Y, radix, y ) );
  12819. MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &P->Z, 1 ) );
  12820. cleanup:
  12821. return( ret );
  12822. }
  12823. /*
  12824. * Export a point into unsigned binary data (SEC1 2.3.3)
  12825. */
  12826. int mbedtls_ecp_point_write_binary( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *P,
  12827. int format, size_t *olen,
  12828. unsigned char *buf, size_t buflen )
  12829. {
  12830. int ret = 0;
  12831. size_t plen;
  12832. if( format != MBEDTLS_ECP_PF_UNCOMPRESSED &&
  12833. format != MBEDTLS_ECP_PF_COMPRESSED )
  12834. return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );
  12835. /*
  12836. * Common case: P == 0
  12837. */
  12838. if( mbedtls_mpi_cmp_int( &P->Z, 0 ) == 0 )
  12839. {
  12840. if( buflen < 1 )
  12841. return( MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL );
  12842. buf[0] = 0x00;
  12843. *olen = 1;
  12844. return( 0 );
  12845. }
  12846. plen = mbedtls_mpi_size( &grp->P );
  12847. if( format == MBEDTLS_ECP_PF_UNCOMPRESSED )
  12848. {
  12849. *olen = 2 * plen + 1;
  12850. if( buflen < *olen )
  12851. return( MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL );
  12852. buf[0] = 0x04;
  12853. MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &P->X, buf + 1, plen ) );
  12854. MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &P->Y, buf + 1 + plen, plen ) );
  12855. }
  12856. else if( format == MBEDTLS_ECP_PF_COMPRESSED )
  12857. {
  12858. *olen = plen + 1;
  12859. if( buflen < *olen )
  12860. return( MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL );
  12861. buf[0] = 0x02 + mbedtls_mpi_get_bit( &P->Y, 0 );
  12862. MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &P->X, buf + 1, plen ) );
  12863. }
  12864. cleanup:
  12865. return( ret );
  12866. }
  12867. /*
  12868. * Import a point from unsigned binary data (SEC1 2.3.4)
  12869. */
  12870. int mbedtls_ecp_point_read_binary( const mbedtls_ecp_group *grp, mbedtls_ecp_point *pt,
  12871. const unsigned char *buf, size_t ilen )
  12872. {
  12873. int ret;
  12874. size_t plen;
  12875. if( ilen < 1 )
  12876. return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );
  12877. if( buf[0] == 0x00 )
  12878. {
  12879. if( ilen == 1 )
  12880. return( mbedtls_ecp_set_zero( pt ) );
  12881. else
  12882. return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );
  12883. }
  12884. plen = mbedtls_mpi_size( &grp->P );
  12885. if( buf[0] != 0x04 )
  12886. return( MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE );
  12887. if( ilen != 2 * plen + 1 )
  12888. return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );
  12889. MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &pt->X, buf + 1, plen ) );
  12890. MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &pt->Y, buf + 1 + plen, plen ) );
  12891. MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &pt->Z, 1 ) );
  12892. cleanup:
  12893. return( ret );
  12894. }
  12895. /*
  12896. * Import a point from a TLS ECPoint record (RFC 4492)
  12897. * struct {
  12898. * opaque point <1..2^8-1>;
  12899. * } ECPoint;
  12900. */
  12901. int mbedtls_ecp_tls_read_point( const mbedtls_ecp_group *grp, mbedtls_ecp_point *pt,
  12902. const unsigned char **buf, size_t buf_len )
  12903. {
  12904. unsigned char data_len;
  12905. const unsigned char *buf_start;
  12906. /*
  12907. * We must have at least two bytes (1 for length, at least one for data)
  12908. */
  12909. if( buf_len < 2 )
  12910. return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );
  12911. data_len = *(*buf)++;
  12912. if( data_len < 1 || data_len > buf_len - 1 )
  12913. return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );
  12914. /*
  12915. * Save buffer start for read_binary and update buf
  12916. */
  12917. buf_start = *buf;
  12918. *buf += data_len;
  12919. return mbedtls_ecp_point_read_binary( grp, pt, buf_start, data_len );
  12920. }
  12921. /*
  12922. * Export a point as a TLS ECPoint record (RFC 4492)
  12923. * struct {
  12924. * opaque point <1..2^8-1>;
  12925. * } ECPoint;
  12926. */
  12927. int mbedtls_ecp_tls_write_point( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *pt,
  12928. int format, size_t *olen,
  12929. unsigned char *buf, size_t blen )
  12930. {
  12931. int ret;
  12932. /*
  12933. * buffer length must be at least one, for our length byte
  12934. */
  12935. if( blen < 1 )
  12936. return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );
  12937. if( ( ret = mbedtls_ecp_point_write_binary( grp, pt, format,
  12938. olen, buf + 1, blen - 1) ) != 0 )
  12939. return( ret );
  12940. /*
  12941. * write length to the first byte and update total length
  12942. */
  12943. buf[0] = (unsigned char) *olen;
  12944. ++*olen;
  12945. return( 0 );
  12946. }
  12947. /*
  12948. * Set a group from an ECParameters record (RFC 4492)
  12949. */
  12950. int mbedtls_ecp_tls_read_group( mbedtls_ecp_group *grp, const unsigned char **buf, size_t len )
  12951. {
  12952. uint16_t tls_id;
  12953. const mbedtls_ecp_curve_info *curve_info;
  12954. /*
  12955. * We expect at least three bytes (see below)
  12956. */
  12957. if( len < 3 )
  12958. return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );
  12959. /*
  12960. * First byte is curve_type; only named_curve is handled
  12961. */
  12962. if( *(*buf)++ != MBEDTLS_ECP_TLS_NAMED_CURVE )
  12963. return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );
  12964. /*
  12965. * Next two bytes are the namedcurve value
  12966. */
  12967. tls_id = *(*buf)++;
  12968. tls_id <<= 8;
  12969. tls_id |= *(*buf)++;
  12970. if( ( curve_info = mbedtls_ecp_curve_info_from_tls_id( tls_id ) ) == NULL )
  12971. return( MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE );
  12972. return mbedtls_ecp_group_load( grp, curve_info->grp_id );
  12973. }
  12974. /*
  12975. * Write the ECParameters record corresponding to a group (RFC 4492)
  12976. */
  12977. int mbedtls_ecp_tls_write_group( const mbedtls_ecp_group *grp, size_t *olen,
  12978. unsigned char *buf, size_t blen )
  12979. {
  12980. const mbedtls_ecp_curve_info *curve_info;
  12981. if( ( curve_info = mbedtls_ecp_curve_info_from_grp_id( grp->id ) ) == NULL )
  12982. return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );
  12983. /*
  12984. * We are going to write 3 bytes (see below)
  12985. */
  12986. *olen = 3;
  12987. if( blen < *olen )
  12988. return( MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL );
  12989. /*
  12990. * First byte is curve_type, always named_curve
  12991. */
  12992. *buf++ = MBEDTLS_ECP_TLS_NAMED_CURVE;
  12993. /*
  12994. * Next two bytes are the namedcurve value
  12995. */
  12996. buf[0] = curve_info->tls_id >> 8;
  12997. buf[1] = curve_info->tls_id & 0xFF;
  12998. return( 0 );
  12999. }
  13000. /*
  13001. * Wrapper around fast quasi-modp functions, with fall-back to mbedtls_mpi_mod_mpi.
  13002. * See the documentation of struct mbedtls_ecp_group.
  13003. *
  13004. * This function is in the critial loop for mbedtls_ecp_mul, so pay attention to perf.
  13005. */
  13006. static int ecp_modp( mbedtls_mpi *N, const mbedtls_ecp_group *grp )
  13007. {
  13008. int ret;
  13009. if( grp->modp == NULL )
  13010. return( mbedtls_mpi_mod_mpi( N, N, &grp->P ) );
  13011. /* N->s < 0 is a much faster test, which fails only if N is 0 */
  13012. if( ( N->s < 0 && mbedtls_mpi_cmp_int( N, 0 ) != 0 ) ||
  13013. mbedtls_mpi_bitlen( N ) > 2 * grp->pbits )
  13014. {
  13015. return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );
  13016. }
  13017. MBEDTLS_MPI_CHK( grp->modp( N ) );
  13018. /* N->s < 0 is a much faster test, which fails only if N is 0 */
  13019. while( N->s < 0 && mbedtls_mpi_cmp_int( N, 0 ) != 0 )
  13020. MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( N, N, &grp->P ) );
  13021. while( mbedtls_mpi_cmp_mpi( N, &grp->P ) >= 0 )
  13022. /* we known P, N and the result are positive */
  13023. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( N, N, &grp->P ) );
  13024. cleanup:
  13025. return( ret );
  13026. }
  13027. /*
  13028. * Fast mod-p functions expect their argument to be in the 0..p^2 range.
  13029. *
  13030. * In order to guarantee that, we need to ensure that operands of
  13031. * mbedtls_mpi_mul_mpi are in the 0..p range. So, after each operation we will
  13032. * bring the result back to this range.
  13033. *
  13034. * The following macros are shortcuts for doing that.
  13035. */
  13036. /*
  13037. * Reduce a mbedtls_mpi mod p in-place, general case, to use after mbedtls_mpi_mul_mpi
  13038. */
  13039. #if defined(MBEDTLS_SELF_TEST)
  13040. #define INC_MUL_COUNT mul_count++;
  13041. #else
  13042. #define INC_MUL_COUNT
  13043. #endif
  13044. #define MOD_MUL( N ) do { MBEDTLS_MPI_CHK( ecp_modp( &N, grp ) ); INC_MUL_COUNT } \
  13045. while( 0 )
  13046. /*
  13047. * Reduce a mbedtls_mpi mod p in-place, to use after mbedtls_mpi_sub_mpi
  13048. * N->s < 0 is a very fast test, which fails only if N is 0
  13049. */
  13050. #define MOD_SUB( N ) \
  13051. while( N.s < 0 && mbedtls_mpi_cmp_int( &N, 0 ) != 0 ) \
  13052. MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &N, &N, &grp->P ) )
  13053. /*
  13054. * Reduce a mbedtls_mpi mod p in-place, to use after mbedtls_mpi_add_mpi and mbedtls_mpi_mul_int.
  13055. * We known P, N and the result are positive, so sub_abs is correct, and
  13056. * a bit faster.
  13057. */
  13058. #define MOD_ADD( N ) \
  13059. while( mbedtls_mpi_cmp_mpi( &N, &grp->P ) >= 0 ) \
  13060. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( &N, &N, &grp->P ) )
  13061. #if defined(ECP_SHORTWEIERSTRASS)
  13062. /*
  13063. * For curves in short Weierstrass form, we do all the internal operations in
  13064. * Jacobian coordinates.
  13065. *
  13066. * For multiplication, we'll use a comb method with coutermeasueres against
  13067. * SPA, hence timing attacks.
  13068. */
  13069. /*
  13070. * Normalize jacobian coordinates so that Z == 0 || Z == 1 (GECC 3.2.1)
  13071. * Cost: 1N := 1I + 3M + 1S
  13072. */
  13073. static int ecp_normalize_jac( const mbedtls_ecp_group *grp, mbedtls_ecp_point *pt )
  13074. {
  13075. int ret;
  13076. mbedtls_mpi Zi, ZZi;
  13077. if( mbedtls_mpi_cmp_int( &pt->Z, 0 ) == 0 )
  13078. return( 0 );
  13079. mbedtls_mpi_init( &Zi ); mbedtls_mpi_init( &ZZi );
  13080. /*
  13081. * X = X / Z^2 mod p
  13082. */
  13083. MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( &Zi, &pt->Z, &grp->P ) );
  13084. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &ZZi, &Zi, &Zi ) ); MOD_MUL( ZZi );
  13085. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &pt->X, &pt->X, &ZZi ) ); MOD_MUL( pt->X );
  13086. /*
  13087. * Y = Y / Z^3 mod p
  13088. */
  13089. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &pt->Y, &pt->Y, &ZZi ) ); MOD_MUL( pt->Y );
  13090. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &pt->Y, &pt->Y, &Zi ) ); MOD_MUL( pt->Y );
  13091. /*
  13092. * Z = 1
  13093. */
  13094. MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &pt->Z, 1 ) );
  13095. cleanup:
  13096. mbedtls_mpi_free( &Zi ); mbedtls_mpi_free( &ZZi );
  13097. return( ret );
  13098. }
  13099. /*
  13100. * Normalize jacobian coordinates of an array of (pointers to) points,
  13101. * using Montgomery's trick to perform only one inversion mod P.
  13102. * (See for example Cohen's "A Course in Computational Algebraic Number
  13103. * Theory", Algorithm 10.3.4.)
  13104. *
  13105. * Warning: fails (returning an error) if one of the points is zero!
  13106. * This should never happen, see choice of w in ecp_mul_comb().
  13107. *
  13108. * Cost: 1N(t) := 1I + (6t - 3)M + 1S
  13109. */
  13110. static int ecp_normalize_jac_many( const mbedtls_ecp_group *grp,
  13111. mbedtls_ecp_point *T[], size_t t_len )
  13112. {
  13113. int ret;
  13114. size_t i;
  13115. mbedtls_mpi *c, u, Zi, ZZi;
  13116. if( t_len < 2 )
  13117. return( ecp_normalize_jac( grp, *T ) );
  13118. if( ( c = mbedtls_calloc( t_len, sizeof( mbedtls_mpi ) ) ) == NULL )
  13119. return( MBEDTLS_ERR_ECP_ALLOC_FAILED );
  13120. mbedtls_mpi_init( &u ); mbedtls_mpi_init( &Zi ); mbedtls_mpi_init( &ZZi );
  13121. /*
  13122. * c[i] = Z_0 * ... * Z_i
  13123. */
  13124. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &c[0], &T[0]->Z ) );
  13125. for( i = 1; i < t_len; i++ )
  13126. {
  13127. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &c[i], &c[i-1], &T[i]->Z ) );
  13128. MOD_MUL( c[i] );
  13129. }
  13130. /*
  13131. * u = 1 / (Z_0 * ... * Z_n) mod P
  13132. */
  13133. MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( &u, &c[t_len-1], &grp->P ) );
  13134. for( i = t_len - 1; ; i-- )
  13135. {
  13136. /*
  13137. * Zi = 1 / Z_i mod p
  13138. * u = 1 / (Z_0 * ... * Z_i) mod P
  13139. */
  13140. if( i == 0 ) {
  13141. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &Zi, &u ) );
  13142. }
  13143. else
  13144. {
  13145. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &Zi, &u, &c[i-1] ) ); MOD_MUL( Zi );
  13146. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &u, &u, &T[i]->Z ) ); MOD_MUL( u );
  13147. }
  13148. /*
  13149. * proceed as in normalize()
  13150. */
  13151. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &ZZi, &Zi, &Zi ) ); MOD_MUL( ZZi );
  13152. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T[i]->X, &T[i]->X, &ZZi ) ); MOD_MUL( T[i]->X );
  13153. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T[i]->Y, &T[i]->Y, &ZZi ) ); MOD_MUL( T[i]->Y );
  13154. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T[i]->Y, &T[i]->Y, &Zi ) ); MOD_MUL( T[i]->Y );
  13155. /*
  13156. * Post-precessing: reclaim some memory by shrinking coordinates
  13157. * - not storing Z (always 1)
  13158. * - shrinking other coordinates, but still keeping the same number of
  13159. * limbs as P, as otherwise it will too likely be regrown too fast.
  13160. */
  13161. MBEDTLS_MPI_CHK( mbedtls_mpi_shrink( &T[i]->X, grp->P.n ) );
  13162. MBEDTLS_MPI_CHK( mbedtls_mpi_shrink( &T[i]->Y, grp->P.n ) );
  13163. mbedtls_mpi_free( &T[i]->Z );
  13164. if( i == 0 )
  13165. break;
  13166. }
  13167. cleanup:
  13168. mbedtls_mpi_free( &u ); mbedtls_mpi_free( &Zi ); mbedtls_mpi_free( &ZZi );
  13169. for( i = 0; i < t_len; i++ )
  13170. mbedtls_mpi_free( &c[i] );
  13171. mbedtls_free( c );
  13172. return( ret );
  13173. }
  13174. /*
  13175. * Conditional point inversion: Q -> -Q = (Q.X, -Q.Y, Q.Z) without leak.
  13176. * "inv" must be 0 (don't invert) or 1 (invert) or the result will be invalid
  13177. */
  13178. static int ecp_safe_invert_jac( const mbedtls_ecp_group *grp,
  13179. mbedtls_ecp_point *Q,
  13180. unsigned char inv )
  13181. {
  13182. int ret;
  13183. unsigned char nonzero;
  13184. mbedtls_mpi mQY;
  13185. mbedtls_mpi_init( &mQY );
  13186. /* Use the fact that -Q.Y mod P = P - Q.Y unless Q.Y == 0 */
  13187. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &mQY, &grp->P, &Q->Y ) );
  13188. nonzero = mbedtls_mpi_cmp_int( &Q->Y, 0 ) != 0;
  13189. MBEDTLS_MPI_CHK( mbedtls_mpi_safe_cond_assign( &Q->Y, &mQY, inv & nonzero ) );
  13190. cleanup:
  13191. mbedtls_mpi_free( &mQY );
  13192. return( ret );
  13193. }
  13194. /*
  13195. * Point doubling R = 2 P, Jacobian coordinates
  13196. *
  13197. * Based on http://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian.html#doubling-dbl-1998-cmo-2 .
  13198. *
  13199. * We follow the variable naming fairly closely. The formula variations that trade a MUL for a SQR
  13200. * (plus a few ADDs) aren't useful as our bignum implementation doesn't distinguish squaring.
  13201. *
  13202. * Standard optimizations are applied when curve parameter A is one of { 0, -3 }.
  13203. *
  13204. * Cost: 1D := 3M + 4S (A == 0)
  13205. * 4M + 4S (A == -3)
  13206. * 3M + 6S + 1a otherwise
  13207. */
  13208. static int ecp_double_jac( const mbedtls_ecp_group *grp, mbedtls_ecp_point *R,
  13209. const mbedtls_ecp_point *P )
  13210. {
  13211. int ret;
  13212. mbedtls_mpi M, S, T, U;
  13213. #if defined(MBEDTLS_SELF_TEST)
  13214. dbl_count++;
  13215. #endif
  13216. mbedtls_mpi_init( &M ); mbedtls_mpi_init( &S ); mbedtls_mpi_init( &T ); mbedtls_mpi_init( &U );
  13217. /* Special case for A = -3 */
  13218. if( grp->A.p == NULL )
  13219. {
  13220. /* M = 3(X + Z^2)(X - Z^2) */
  13221. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &S, &P->Z, &P->Z ) ); MOD_MUL( S );
  13222. MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &T, &P->X, &S ) ); MOD_ADD( T );
  13223. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &U, &P->X, &S ) ); MOD_SUB( U );
  13224. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &S, &T, &U ) ); MOD_MUL( S );
  13225. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_int( &M, &S, 3 ) ); MOD_ADD( M );
  13226. }
  13227. else
  13228. {
  13229. /* M = 3.X^2 */
  13230. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &S, &P->X, &P->X ) ); MOD_MUL( S );
  13231. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_int( &M, &S, 3 ) ); MOD_ADD( M );
  13232. /* Optimize away for "koblitz" curves with A = 0 */
  13233. if( mbedtls_mpi_cmp_int( &grp->A, 0 ) != 0 )
  13234. {
  13235. /* M += A.Z^4 */
  13236. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &S, &P->Z, &P->Z ) ); MOD_MUL( S );
  13237. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T, &S, &S ) ); MOD_MUL( T );
  13238. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &S, &T, &grp->A ) ); MOD_MUL( S );
  13239. MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &M, &M, &S ) ); MOD_ADD( M );
  13240. }
  13241. }
  13242. /* S = 4.X.Y^2 */
  13243. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T, &P->Y, &P->Y ) ); MOD_MUL( T );
  13244. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &T, 1 ) ); MOD_ADD( T );
  13245. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &S, &P->X, &T ) ); MOD_MUL( S );
  13246. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &S, 1 ) ); MOD_ADD( S );
  13247. /* U = 8.Y^4 */
  13248. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &U, &T, &T ) ); MOD_MUL( U );
  13249. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &U, 1 ) ); MOD_ADD( U );
  13250. /* T = M^2 - 2.S */
  13251. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T, &M, &M ) ); MOD_MUL( T );
  13252. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &T, &T, &S ) ); MOD_SUB( T );
  13253. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &T, &T, &S ) ); MOD_SUB( T );
  13254. /* S = M(S - T) - U */
  13255. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &S, &S, &T ) ); MOD_SUB( S );
  13256. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &S, &S, &M ) ); MOD_MUL( S );
  13257. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &S, &S, &U ) ); MOD_SUB( S );
  13258. /* U = 2.Y.Z */
  13259. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &U, &P->Y, &P->Z ) ); MOD_MUL( U );
  13260. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &U, 1 ) ); MOD_ADD( U );
  13261. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &R->X, &T ) );
  13262. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &R->Y, &S ) );
  13263. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &R->Z, &U ) );
  13264. cleanup:
  13265. mbedtls_mpi_free( &M ); mbedtls_mpi_free( &S ); mbedtls_mpi_free( &T ); mbedtls_mpi_free( &U );
  13266. return( ret );
  13267. }
  13268. /*
  13269. * Addition: R = P + Q, mixed affine-Jacobian coordinates (GECC 3.22)
  13270. *
  13271. * The coordinates of Q must be normalized (= affine),
  13272. * but those of P don't need to. R is not normalized.
  13273. *
  13274. * Special cases: (1) P or Q is zero, (2) R is zero, (3) P == Q.
  13275. * None of these cases can happen as intermediate step in ecp_mul_comb():
  13276. * - at each step, P, Q and R are multiples of the base point, the factor
  13277. * being less than its order, so none of them is zero;
  13278. * - Q is an odd multiple of the base point, P an even multiple,
  13279. * due to the choice of precomputed points in the modified comb method.
  13280. * So branches for these cases do not leak secret information.
  13281. *
  13282. * We accept Q->Z being unset (saving memory in tables) as meaning 1.
  13283. *
  13284. * Cost: 1A := 8M + 3S
  13285. */
  13286. static int ecp_add_mixed( const mbedtls_ecp_group *grp, mbedtls_ecp_point *R,
  13287. const mbedtls_ecp_point *P, const mbedtls_ecp_point *Q )
  13288. {
  13289. int ret;
  13290. mbedtls_mpi T1, T2, T3, T4, X, Y, Z;
  13291. #if defined(MBEDTLS_SELF_TEST)
  13292. add_count++;
  13293. #endif
  13294. /*
  13295. * Trivial cases: P == 0 or Q == 0 (case 1)
  13296. */
  13297. if( mbedtls_mpi_cmp_int( &P->Z, 0 ) == 0 )
  13298. return( mbedtls_ecp_copy( R, Q ) );
  13299. if( Q->Z.p != NULL && mbedtls_mpi_cmp_int( &Q->Z, 0 ) == 0 )
  13300. return( mbedtls_ecp_copy( R, P ) );
  13301. /*
  13302. * Make sure Q coordinates are normalized
  13303. */
  13304. if( Q->Z.p != NULL && mbedtls_mpi_cmp_int( &Q->Z, 1 ) != 0 )
  13305. return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );
  13306. mbedtls_mpi_init( &T1 ); mbedtls_mpi_init( &T2 ); mbedtls_mpi_init( &T3 ); mbedtls_mpi_init( &T4 );
  13307. mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z );
  13308. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T1, &P->Z, &P->Z ) ); MOD_MUL( T1 );
  13309. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T2, &T1, &P->Z ) ); MOD_MUL( T2 );
  13310. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T1, &T1, &Q->X ) ); MOD_MUL( T1 );
  13311. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T2, &T2, &Q->Y ) ); MOD_MUL( T2 );
  13312. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &T1, &T1, &P->X ) ); MOD_SUB( T1 );
  13313. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &T2, &T2, &P->Y ) ); MOD_SUB( T2 );
  13314. /* Special cases (2) and (3) */
  13315. if( mbedtls_mpi_cmp_int( &T1, 0 ) == 0 )
  13316. {
  13317. if( mbedtls_mpi_cmp_int( &T2, 0 ) == 0 )
  13318. {
  13319. ret = ecp_double_jac( grp, R, P );
  13320. goto cleanup;
  13321. }
  13322. else
  13323. {
  13324. ret = mbedtls_ecp_set_zero( R );
  13325. goto cleanup;
  13326. }
  13327. }
  13328. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &Z, &P->Z, &T1 ) ); MOD_MUL( Z );
  13329. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T3, &T1, &T1 ) ); MOD_MUL( T3 );
  13330. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T4, &T3, &T1 ) ); MOD_MUL( T4 );
  13331. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T3, &T3, &P->X ) ); MOD_MUL( T3 );
  13332. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_int( &T1, &T3, 2 ) ); MOD_ADD( T1 );
  13333. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &X, &T2, &T2 ) ); MOD_MUL( X );
  13334. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &X, &X, &T1 ) ); MOD_SUB( X );
  13335. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &X, &X, &T4 ) ); MOD_SUB( X );
  13336. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &T3, &T3, &X ) ); MOD_SUB( T3 );
  13337. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T3, &T3, &T2 ) ); MOD_MUL( T3 );
  13338. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T4, &T4, &P->Y ) ); MOD_MUL( T4 );
  13339. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &Y, &T3, &T4 ) ); MOD_SUB( Y );
  13340. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &R->X, &X ) );
  13341. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &R->Y, &Y ) );
  13342. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &R->Z, &Z ) );
  13343. cleanup:
  13344. mbedtls_mpi_free( &T1 ); mbedtls_mpi_free( &T2 ); mbedtls_mpi_free( &T3 ); mbedtls_mpi_free( &T4 );
  13345. mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z );
  13346. return( ret );
  13347. }
  13348. /*
  13349. * Randomize jacobian coordinates:
  13350. * (X, Y, Z) -> (l^2 X, l^3 Y, l Z) for random l
  13351. * This is sort of the reverse operation of ecp_normalize_jac().
  13352. *
  13353. * This countermeasure was first suggested in [2].
  13354. */
  13355. static int ecp_randomize_jac( const mbedtls_ecp_group *grp, mbedtls_ecp_point *pt,
  13356. int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
  13357. {
  13358. int ret;
  13359. mbedtls_mpi l, ll;
  13360. size_t p_size = ( grp->pbits + 7 ) / 8;
  13361. int count = 0;
  13362. mbedtls_mpi_init( &l ); mbedtls_mpi_init( &ll );
  13363. /* Generate l such that 1 < l < p */
  13364. do
  13365. {
  13366. mbedtls_mpi_fill_random( &l, p_size, f_rng, p_rng );
  13367. while( mbedtls_mpi_cmp_mpi( &l, &grp->P ) >= 0 )
  13368. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &l, 1 ) );
  13369. if( count++ > 10 )
  13370. return( MBEDTLS_ERR_ECP_RANDOM_FAILED );
  13371. }
  13372. while( mbedtls_mpi_cmp_int( &l, 1 ) <= 0 );
  13373. /* Z = l * Z */
  13374. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &pt->Z, &pt->Z, &l ) ); MOD_MUL( pt->Z );
  13375. /* X = l^2 * X */
  13376. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &ll, &l, &l ) ); MOD_MUL( ll );
  13377. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &pt->X, &pt->X, &ll ) ); MOD_MUL( pt->X );
  13378. /* Y = l^3 * Y */
  13379. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &ll, &ll, &l ) ); MOD_MUL( ll );
  13380. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &pt->Y, &pt->Y, &ll ) ); MOD_MUL( pt->Y );
  13381. cleanup:
  13382. mbedtls_mpi_free( &l ); mbedtls_mpi_free( &ll );
  13383. return( ret );
  13384. }
  13385. /*
  13386. * Check and define parameters used by the comb method (see below for details)
  13387. */
  13388. #if MBEDTLS_ECP_WINDOW_SIZE < 2 || MBEDTLS_ECP_WINDOW_SIZE > 7
  13389. #error "MBEDTLS_ECP_WINDOW_SIZE out of bounds"
  13390. #endif
  13391. /* d = ceil( n / w ) */
  13392. #define COMB_MAX_D ( MBEDTLS_ECP_MAX_BITS + 1 ) / 2
  13393. /* number of precomputed points */
  13394. #define COMB_MAX_PRE ( 1 << ( MBEDTLS_ECP_WINDOW_SIZE - 1 ) )
  13395. /*
  13396. * Compute the representation of m that will be used with our comb method.
  13397. *
  13398. * The basic comb method is described in GECC 3.44 for example. We use a
  13399. * modified version that provides resistance to SPA by avoiding zero
  13400. * digits in the representation as in [3]. We modify the method further by
  13401. * requiring that all K_i be odd, which has the small cost that our
  13402. * representation uses one more K_i, due to carries.
  13403. *
  13404. * Also, for the sake of compactness, only the seven low-order bits of x[i]
  13405. * are used to represent K_i, and the msb of x[i] encodes the the sign (s_i in
  13406. * the paper): it is set if and only if if s_i == -1;
  13407. *
  13408. * Calling conventions:
  13409. * - x is an array of size d + 1
  13410. * - w is the size, ie number of teeth, of the comb, and must be between
  13411. * 2 and 7 (in practice, between 2 and MBEDTLS_ECP_WINDOW_SIZE)
  13412. * - m is the MPI, expected to be odd and such that bitlength(m) <= w * d
  13413. * (the result will be incorrect if these assumptions are not satisfied)
  13414. */
  13415. static void ecp_comb_fixed( unsigned char x[], size_t d,
  13416. unsigned char w, const mbedtls_mpi *m )
  13417. {
  13418. size_t i, j;
  13419. unsigned char c, cc, adjust;
  13420. memset( x, 0, d+1 );
  13421. /* First get the classical comb values (except for x_d = 0) */
  13422. for( i = 0; i < d; i++ )
  13423. for( j = 0; j < w; j++ )
  13424. x[i] |= mbedtls_mpi_get_bit( m, i + d * j ) << j;
  13425. /* Now make sure x_1 .. x_d are odd */
  13426. c = 0;
  13427. for( i = 1; i <= d; i++ )
  13428. {
  13429. /* Add carry and update it */
  13430. cc = x[i] & c;
  13431. x[i] = x[i] ^ c;
  13432. c = cc;
  13433. /* Adjust if needed, avoiding branches */
  13434. adjust = 1 - ( x[i] & 0x01 );
  13435. c |= x[i] & ( x[i-1] * adjust );
  13436. x[i] = x[i] ^ ( x[i-1] * adjust );
  13437. x[i-1] |= adjust << 7;
  13438. }
  13439. }
  13440. /*
  13441. * Precompute points for the comb method
  13442. *
  13443. * If i = i_{w-1} ... i_1 is the binary representation of i, then
  13444. * T[i] = i_{w-1} 2^{(w-1)d} P + ... + i_1 2^d P + P
  13445. *
  13446. * T must be able to hold 2^{w - 1} elements
  13447. *
  13448. * Cost: d(w-1) D + (2^{w-1} - 1) A + 1 N(w-1) + 1 N(2^{w-1} - 1)
  13449. */
  13450. static int ecp_precompute_comb( const mbedtls_ecp_group *grp,
  13451. mbedtls_ecp_point T[], const mbedtls_ecp_point *P,
  13452. unsigned char w, size_t d )
  13453. {
  13454. int ret;
  13455. unsigned char i, k;
  13456. size_t j;
  13457. mbedtls_ecp_point *cur, *TT[COMB_MAX_PRE - 1];
  13458. /*
  13459. * Set T[0] = P and
  13460. * T[2^{l-1}] = 2^{dl} P for l = 1 .. w-1 (this is not the final value)
  13461. */
  13462. MBEDTLS_MPI_CHK( mbedtls_ecp_copy( &T[0], P ) );
  13463. k = 0;
  13464. for( i = 1; i < ( 1U << ( w - 1 ) ); i <<= 1 )
  13465. {
  13466. cur = T + i;
  13467. MBEDTLS_MPI_CHK( mbedtls_ecp_copy( cur, T + ( i >> 1 ) ) );
  13468. for( j = 0; j < d; j++ )
  13469. MBEDTLS_MPI_CHK( ecp_double_jac( grp, cur, cur ) );
  13470. TT[k++] = cur;
  13471. }
  13472. MBEDTLS_MPI_CHK( ecp_normalize_jac_many( grp, TT, k ) );
  13473. /*
  13474. * Compute the remaining ones using the minimal number of additions
  13475. * Be careful to update T[2^l] only after using it!
  13476. */
  13477. k = 0;
  13478. for( i = 1; i < ( 1U << ( w - 1 ) ); i <<= 1 )
  13479. {
  13480. j = i;
  13481. while( j-- )
  13482. {
  13483. MBEDTLS_MPI_CHK( ecp_add_mixed( grp, &T[i + j], &T[j], &T[i] ) );
  13484. TT[k++] = &T[i + j];
  13485. }
  13486. }
  13487. MBEDTLS_MPI_CHK( ecp_normalize_jac_many( grp, TT, k ) );
  13488. cleanup:
  13489. return( ret );
  13490. }
  13491. /*
  13492. * Select precomputed point: R = sign(i) * T[ abs(i) / 2 ]
  13493. */
  13494. static int ecp_select_comb( const mbedtls_ecp_group *grp, mbedtls_ecp_point *R,
  13495. const mbedtls_ecp_point T[], unsigned char t_len,
  13496. unsigned char i )
  13497. {
  13498. int ret;
  13499. unsigned char ii, j;
  13500. /* Ignore the "sign" bit and scale down */
  13501. ii = ( i & 0x7Fu ) >> 1;
  13502. /* Read the whole table to thwart cache-based timing attacks */
  13503. for( j = 0; j < t_len; j++ )
  13504. {
  13505. MBEDTLS_MPI_CHK( mbedtls_mpi_safe_cond_assign( &R->X, &T[j].X, j == ii ) );
  13506. MBEDTLS_MPI_CHK( mbedtls_mpi_safe_cond_assign( &R->Y, &T[j].Y, j == ii ) );
  13507. }
  13508. /* Safely invert result if i is "negative" */
  13509. MBEDTLS_MPI_CHK( ecp_safe_invert_jac( grp, R, i >> 7 ) );
  13510. cleanup:
  13511. return( ret );
  13512. }
  13513. /*
  13514. * Core multiplication algorithm for the (modified) comb method.
  13515. * This part is actually common with the basic comb method (GECC 3.44)
  13516. *
  13517. * Cost: d A + d D + 1 R
  13518. */
  13519. static int ecp_mul_comb_core( const mbedtls_ecp_group *grp, mbedtls_ecp_point *R,
  13520. const mbedtls_ecp_point T[], unsigned char t_len,
  13521. const unsigned char x[], size_t d,
  13522. int (*f_rng)(void *, unsigned char *, size_t),
  13523. void *p_rng )
  13524. {
  13525. int ret;
  13526. mbedtls_ecp_point Txi;
  13527. size_t i;
  13528. mbedtls_ecp_point_init( &Txi );
  13529. /* Start with a non-zero point and randomize its coordinates */
  13530. i = d;
  13531. MBEDTLS_MPI_CHK( ecp_select_comb( grp, R, T, t_len, x[i] ) );
  13532. MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &R->Z, 1 ) );
  13533. if( f_rng != 0 )
  13534. MBEDTLS_MPI_CHK( ecp_randomize_jac( grp, R, f_rng, p_rng ) );
  13535. while( i-- != 0 )
  13536. {
  13537. MBEDTLS_MPI_CHK( ecp_double_jac( grp, R, R ) );
  13538. MBEDTLS_MPI_CHK( ecp_select_comb( grp, &Txi, T, t_len, x[i] ) );
  13539. MBEDTLS_MPI_CHK( ecp_add_mixed( grp, R, R, &Txi ) );
  13540. }
  13541. cleanup:
  13542. mbedtls_ecp_point_free( &Txi );
  13543. return( ret );
  13544. }
  13545. /*
  13546. * Multiplication using the comb method,
  13547. * for curves in short Weierstrass form
  13548. */
  13549. static int ecp_mul_comb( mbedtls_ecp_group *grp, mbedtls_ecp_point *R,
  13550. const mbedtls_mpi *m, const mbedtls_ecp_point *P,
  13551. int (*f_rng)(void *, unsigned char *, size_t),
  13552. void *p_rng )
  13553. {
  13554. int ret;
  13555. unsigned char w, m_is_odd, p_eq_g, pre_len, i;
  13556. size_t d;
  13557. unsigned char k[COMB_MAX_D + 1];
  13558. mbedtls_ecp_point *T;
  13559. mbedtls_mpi M, mm;
  13560. mbedtls_mpi_init( &M );
  13561. mbedtls_mpi_init( &mm );
  13562. /* we need N to be odd to trnaform m in an odd number, check now */
  13563. if( mbedtls_mpi_get_bit( &grp->N, 0 ) != 1 )
  13564. return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );
  13565. /*
  13566. * Minimize the number of multiplications, that is minimize
  13567. * 10 * d * w + 18 * 2^(w-1) + 11 * d + 7 * w, with d = ceil( nbits / w )
  13568. * (see costs of the various parts, with 1S = 1M)
  13569. */
  13570. w = grp->nbits >= 384 ? 5 : 4;
  13571. /*
  13572. * If P == G, pre-compute a bit more, since this may be re-used later.
  13573. * Just adding one avoids upping the cost of the first mul too much,
  13574. * and the memory cost too.
  13575. */
  13576. #if MBEDTLS_ECP_FIXED_POINT_OPTIM == 1
  13577. p_eq_g = ( mbedtls_mpi_cmp_mpi( &P->Y, &grp->G.Y ) == 0 &&
  13578. mbedtls_mpi_cmp_mpi( &P->X, &grp->G.X ) == 0 );
  13579. if( p_eq_g )
  13580. w++;
  13581. #else
  13582. p_eq_g = 0;
  13583. #endif
  13584. /*
  13585. * Make sure w is within bounds.
  13586. * (The last test is useful only for very small curves in the test suite.)
  13587. */
  13588. if( w > MBEDTLS_ECP_WINDOW_SIZE )
  13589. w = MBEDTLS_ECP_WINDOW_SIZE;
  13590. if( w >= grp->nbits )
  13591. w = 2;
  13592. /* Other sizes that depend on w */
  13593. pre_len = 1U << ( w - 1 );
  13594. d = ( grp->nbits + w - 1 ) / w;
  13595. /*
  13596. * Prepare precomputed points: if P == G we want to
  13597. * use grp->T if already initialized, or initialize it.
  13598. */
  13599. T = p_eq_g ? grp->T : NULL;
  13600. if( T == NULL )
  13601. {
  13602. T = mbedtls_calloc( pre_len, sizeof( mbedtls_ecp_point ) );
  13603. if( T == NULL )
  13604. {
  13605. ret = MBEDTLS_ERR_ECP_ALLOC_FAILED;
  13606. goto cleanup;
  13607. }
  13608. MBEDTLS_MPI_CHK( ecp_precompute_comb( grp, T, P, w, d ) );
  13609. if( p_eq_g )
  13610. {
  13611. grp->T = T;
  13612. grp->T_size = pre_len;
  13613. }
  13614. }
  13615. /*
  13616. * Make sure M is odd (M = m or M = N - m, since N is odd)
  13617. * using the fact that m * P = - (N - m) * P
  13618. */
  13619. m_is_odd = ( mbedtls_mpi_get_bit( m, 0 ) == 1 );
  13620. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &M, m ) );
  13621. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &mm, &grp->N, m ) );
  13622. MBEDTLS_MPI_CHK( mbedtls_mpi_safe_cond_assign( &M, &mm, ! m_is_odd ) );
  13623. /*
  13624. * Go for comb multiplication, R = M * P
  13625. */
  13626. ecp_comb_fixed( k, d, w, &M );
  13627. MBEDTLS_MPI_CHK( ecp_mul_comb_core( grp, R, T, pre_len, k, d, f_rng, p_rng ) );
  13628. /*
  13629. * Now get m * P from M * P and normalize it
  13630. */
  13631. MBEDTLS_MPI_CHK( ecp_safe_invert_jac( grp, R, ! m_is_odd ) );
  13632. MBEDTLS_MPI_CHK( ecp_normalize_jac( grp, R ) );
  13633. cleanup:
  13634. if( T != NULL && ! p_eq_g )
  13635. {
  13636. for( i = 0; i < pre_len; i++ )
  13637. mbedtls_ecp_point_free( &T[i] );
  13638. mbedtls_free( T );
  13639. }
  13640. mbedtls_mpi_free( &M );
  13641. mbedtls_mpi_free( &mm );
  13642. if( ret != 0 )
  13643. mbedtls_ecp_point_free( R );
  13644. return( ret );
  13645. }
  13646. #endif /* ECP_SHORTWEIERSTRASS */
  13647. #if defined(ECP_MONTGOMERY)
  13648. /*
  13649. * For Montgomery curves, we do all the internal arithmetic in projective
  13650. * coordinates. Import/export of points uses only the x coordinates, which is
  13651. * internaly represented as X / Z.
  13652. *
  13653. * For scalar multiplication, we'll use a Montgomery ladder.
  13654. */
  13655. /*
  13656. * Normalize Montgomery x/z coordinates: X = X/Z, Z = 1
  13657. * Cost: 1M + 1I
  13658. */
  13659. static int ecp_normalize_mxz( const mbedtls_ecp_group *grp, mbedtls_ecp_point *P )
  13660. {
  13661. int ret;
  13662. MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( &P->Z, &P->Z, &grp->P ) );
  13663. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &P->X, &P->X, &P->Z ) ); MOD_MUL( P->X );
  13664. MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &P->Z, 1 ) );
  13665. cleanup:
  13666. return( ret );
  13667. }
  13668. /*
  13669. * Randomize projective x/z coordinates:
  13670. * (X, Z) -> (l X, l Z) for random l
  13671. * This is sort of the reverse operation of ecp_normalize_mxz().
  13672. *
  13673. * This countermeasure was first suggested in [2].
  13674. * Cost: 2M
  13675. */
  13676. static int ecp_randomize_mxz( const mbedtls_ecp_group *grp, mbedtls_ecp_point *P,
  13677. int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
  13678. {
  13679. int ret;
  13680. mbedtls_mpi l;
  13681. size_t p_size = ( grp->pbits + 7 ) / 8;
  13682. int count = 0;
  13683. mbedtls_mpi_init( &l );
  13684. /* Generate l such that 1 < l < p */
  13685. do
  13686. {
  13687. mbedtls_mpi_fill_random( &l, p_size, f_rng, p_rng );
  13688. while( mbedtls_mpi_cmp_mpi( &l, &grp->P ) >= 0 )
  13689. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &l, 1 ) );
  13690. if( count++ > 10 )
  13691. return( MBEDTLS_ERR_ECP_RANDOM_FAILED );
  13692. }
  13693. while( mbedtls_mpi_cmp_int( &l, 1 ) <= 0 );
  13694. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &P->X, &P->X, &l ) ); MOD_MUL( P->X );
  13695. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &P->Z, &P->Z, &l ) ); MOD_MUL( P->Z );
  13696. cleanup:
  13697. mbedtls_mpi_free( &l );
  13698. return( ret );
  13699. }
  13700. /*
  13701. * Double-and-add: R = 2P, S = P + Q, with d = X(P - Q),
  13702. * for Montgomery curves in x/z coordinates.
  13703. *
  13704. * http://www.hyperelliptic.org/EFD/g1p/auto-code/montgom/xz/ladder/mladd-1987-m.op3
  13705. * with
  13706. * d = X1
  13707. * P = (X2, Z2)
  13708. * Q = (X3, Z3)
  13709. * R = (X4, Z4)
  13710. * S = (X5, Z5)
  13711. * and eliminating temporary variables tO, ..., t4.
  13712. *
  13713. * Cost: 5M + 4S
  13714. */
  13715. static int ecp_double_add_mxz( const mbedtls_ecp_group *grp,
  13716. mbedtls_ecp_point *R, mbedtls_ecp_point *S,
  13717. const mbedtls_ecp_point *P, const mbedtls_ecp_point *Q,
  13718. const mbedtls_mpi *d )
  13719. {
  13720. int ret;
  13721. mbedtls_mpi A, AA, B, BB, E, C, D, DA, CB;
  13722. mbedtls_mpi_init( &A ); mbedtls_mpi_init( &AA ); mbedtls_mpi_init( &B );
  13723. mbedtls_mpi_init( &BB ); mbedtls_mpi_init( &E ); mbedtls_mpi_init( &C );
  13724. mbedtls_mpi_init( &D ); mbedtls_mpi_init( &DA ); mbedtls_mpi_init( &CB );
  13725. MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &A, &P->X, &P->Z ) ); MOD_ADD( A );
  13726. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &AA, &A, &A ) ); MOD_MUL( AA );
  13727. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &B, &P->X, &P->Z ) ); MOD_SUB( B );
  13728. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &BB, &B, &B ) ); MOD_MUL( BB );
  13729. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &E, &AA, &BB ) ); MOD_SUB( E );
  13730. MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &C, &Q->X, &Q->Z ) ); MOD_ADD( C );
  13731. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &D, &Q->X, &Q->Z ) ); MOD_SUB( D );
  13732. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &DA, &D, &A ) ); MOD_MUL( DA );
  13733. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &CB, &C, &B ) ); MOD_MUL( CB );
  13734. MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &S->X, &DA, &CB ) ); MOD_MUL( S->X );
  13735. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &S->X, &S->X, &S->X ) ); MOD_MUL( S->X );
  13736. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &S->Z, &DA, &CB ) ); MOD_SUB( S->Z );
  13737. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &S->Z, &S->Z, &S->Z ) ); MOD_MUL( S->Z );
  13738. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &S->Z, d, &S->Z ) ); MOD_MUL( S->Z );
  13739. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &R->X, &AA, &BB ) ); MOD_MUL( R->X );
  13740. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &R->Z, &grp->A, &E ) ); MOD_MUL( R->Z );
  13741. MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &R->Z, &BB, &R->Z ) ); MOD_ADD( R->Z );
  13742. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &R->Z, &E, &R->Z ) ); MOD_MUL( R->Z );
  13743. cleanup:
  13744. mbedtls_mpi_free( &A ); mbedtls_mpi_free( &AA ); mbedtls_mpi_free( &B );
  13745. mbedtls_mpi_free( &BB ); mbedtls_mpi_free( &E ); mbedtls_mpi_free( &C );
  13746. mbedtls_mpi_free( &D ); mbedtls_mpi_free( &DA ); mbedtls_mpi_free( &CB );
  13747. return( ret );
  13748. }
  13749. /*
  13750. * Multiplication with Montgomery ladder in x/z coordinates,
  13751. * for curves in Montgomery form
  13752. */
  13753. static int ecp_mul_mxz( mbedtls_ecp_group *grp, mbedtls_ecp_point *R,
  13754. const mbedtls_mpi *m, const mbedtls_ecp_point *P,
  13755. int (*f_rng)(void *, unsigned char *, size_t),
  13756. void *p_rng )
  13757. {
  13758. int ret;
  13759. size_t i;
  13760. unsigned char b;
  13761. mbedtls_ecp_point RP;
  13762. mbedtls_mpi PX;
  13763. mbedtls_ecp_point_init( &RP ); mbedtls_mpi_init( &PX );
  13764. /* Save PX and read from P before writing to R, in case P == R */
  13765. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &PX, &P->X ) );
  13766. MBEDTLS_MPI_CHK( mbedtls_ecp_copy( &RP, P ) );
  13767. /* Set R to zero in modified x/z coordinates */
  13768. MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &R->X, 1 ) );
  13769. MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &R->Z, 0 ) );
  13770. mbedtls_mpi_free( &R->Y );
  13771. /* RP.X might be sligtly larger than P, so reduce it */
  13772. MOD_ADD( RP.X );
  13773. /* Randomize coordinates of the starting point */
  13774. if( f_rng != NULL )
  13775. MBEDTLS_MPI_CHK( ecp_randomize_mxz( grp, &RP, f_rng, p_rng ) );
  13776. /* Loop invariant: R = result so far, RP = R + P */
  13777. i = mbedtls_mpi_bitlen( m ); /* one past the (zero-based) most significant bit */
  13778. while( i-- > 0 )
  13779. {
  13780. b = mbedtls_mpi_get_bit( m, i );
  13781. /*
  13782. * if (b) R = 2R + P else R = 2R,
  13783. * which is:
  13784. * if (b) double_add( RP, R, RP, R )
  13785. * else double_add( R, RP, R, RP )
  13786. * but using safe conditional swaps to avoid leaks
  13787. */
  13788. MBEDTLS_MPI_CHK( mbedtls_mpi_safe_cond_swap( &R->X, &RP.X, b ) );
  13789. MBEDTLS_MPI_CHK( mbedtls_mpi_safe_cond_swap( &R->Z, &RP.Z, b ) );
  13790. MBEDTLS_MPI_CHK( ecp_double_add_mxz( grp, R, &RP, R, &RP, &PX ) );
  13791. MBEDTLS_MPI_CHK( mbedtls_mpi_safe_cond_swap( &R->X, &RP.X, b ) );
  13792. MBEDTLS_MPI_CHK( mbedtls_mpi_safe_cond_swap( &R->Z, &RP.Z, b ) );
  13793. }
  13794. MBEDTLS_MPI_CHK( ecp_normalize_mxz( grp, R ) );
  13795. cleanup:
  13796. mbedtls_ecp_point_free( &RP ); mbedtls_mpi_free( &PX );
  13797. return( ret );
  13798. }
  13799. #endif /* ECP_MONTGOMERY */
  13800. /*
  13801. * Multiplication R = m * P
  13802. */
  13803. int mbedtls_ecp_mul( mbedtls_ecp_group *grp, mbedtls_ecp_point *R,
  13804. const mbedtls_mpi *m, const mbedtls_ecp_point *P,
  13805. int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
  13806. {
  13807. int ret;
  13808. /* Common sanity checks */
  13809. if( mbedtls_mpi_cmp_int( &P->Z, 1 ) != 0 )
  13810. return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );
  13811. if( ( ret = mbedtls_ecp_check_privkey( grp, m ) ) != 0 ||
  13812. ( ret = mbedtls_ecp_check_pubkey( grp, P ) ) != 0 )
  13813. return( ret );
  13814. #if defined(ECP_MONTGOMERY)
  13815. if( ecp_get_type( grp ) == ECP_TYPE_MONTGOMERY )
  13816. return( ecp_mul_mxz( grp, R, m, P, f_rng, p_rng ) );
  13817. #endif
  13818. #if defined(ECP_SHORTWEIERSTRASS)
  13819. if( ecp_get_type( grp ) == ECP_TYPE_SHORT_WEIERSTRASS )
  13820. return( ecp_mul_comb( grp, R, m, P, f_rng, p_rng ) );
  13821. #endif
  13822. return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );
  13823. }
  13824. #if defined(ECP_SHORTWEIERSTRASS)
  13825. /*
  13826. * Check that an affine point is valid as a public key,
  13827. * short weierstrass curves (SEC1 3.2.3.1)
  13828. */
  13829. static int ecp_check_pubkey_sw( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *pt )
  13830. {
  13831. int ret;
  13832. mbedtls_mpi YY, RHS;
  13833. /* pt coordinates must be normalized for our checks */
  13834. if( mbedtls_mpi_cmp_int( &pt->X, 0 ) < 0 ||
  13835. mbedtls_mpi_cmp_int( &pt->Y, 0 ) < 0 ||
  13836. mbedtls_mpi_cmp_mpi( &pt->X, &grp->P ) >= 0 ||
  13837. mbedtls_mpi_cmp_mpi( &pt->Y, &grp->P ) >= 0 )
  13838. return( MBEDTLS_ERR_ECP_INVALID_KEY );
  13839. mbedtls_mpi_init( &YY ); mbedtls_mpi_init( &RHS );
  13840. /*
  13841. * YY = Y^2
  13842. * RHS = X (X^2 + A) + B = X^3 + A X + B
  13843. */
  13844. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &YY, &pt->Y, &pt->Y ) ); MOD_MUL( YY );
  13845. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &RHS, &pt->X, &pt->X ) ); MOD_MUL( RHS );
  13846. /* Special case for A = -3 */
  13847. if( grp->A.p == NULL )
  13848. {
  13849. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &RHS, &RHS, 3 ) ); MOD_SUB( RHS );
  13850. }
  13851. else
  13852. {
  13853. MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &RHS, &RHS, &grp->A ) ); MOD_ADD( RHS );
  13854. }
  13855. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &RHS, &RHS, &pt->X ) ); MOD_MUL( RHS );
  13856. MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &RHS, &RHS, &grp->B ) ); MOD_ADD( RHS );
  13857. if( mbedtls_mpi_cmp_mpi( &YY, &RHS ) != 0 )
  13858. ret = MBEDTLS_ERR_ECP_INVALID_KEY;
  13859. cleanup:
  13860. mbedtls_mpi_free( &YY ); mbedtls_mpi_free( &RHS );
  13861. return( ret );
  13862. }
  13863. #endif /* ECP_SHORTWEIERSTRASS */
  13864. /*
  13865. * R = m * P with shortcuts for m == 1 and m == -1
  13866. * NOT constant-time - ONLY for short Weierstrass!
  13867. */
  13868. static int mbedtls_ecp_mul_shortcuts( mbedtls_ecp_group *grp,
  13869. mbedtls_ecp_point *R,
  13870. const mbedtls_mpi *m,
  13871. const mbedtls_ecp_point *P )
  13872. {
  13873. int ret;
  13874. if( mbedtls_mpi_cmp_int( m, 1 ) == 0 )
  13875. {
  13876. MBEDTLS_MPI_CHK( mbedtls_ecp_copy( R, P ) );
  13877. }
  13878. else if( mbedtls_mpi_cmp_int( m, -1 ) == 0 )
  13879. {
  13880. MBEDTLS_MPI_CHK( mbedtls_ecp_copy( R, P ) );
  13881. if( mbedtls_mpi_cmp_int( &R->Y, 0 ) != 0 )
  13882. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &R->Y, &grp->P, &R->Y ) );
  13883. }
  13884. else
  13885. {
  13886. MBEDTLS_MPI_CHK( mbedtls_ecp_mul( grp, R, m, P, NULL, NULL ) );
  13887. }
  13888. cleanup:
  13889. return( ret );
  13890. }
  13891. /*
  13892. * Linear combination
  13893. * NOT constant-time
  13894. */
  13895. int mbedtls_ecp_muladd( mbedtls_ecp_group *grp, mbedtls_ecp_point *R,
  13896. const mbedtls_mpi *m, const mbedtls_ecp_point *P,
  13897. const mbedtls_mpi *n, const mbedtls_ecp_point *Q )
  13898. {
  13899. int ret;
  13900. mbedtls_ecp_point mP;
  13901. if( ecp_get_type( grp ) != ECP_TYPE_SHORT_WEIERSTRASS )
  13902. return( MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE );
  13903. mbedtls_ecp_point_init( &mP );
  13904. MBEDTLS_MPI_CHK( mbedtls_ecp_mul_shortcuts( grp, &mP, m, P ) );
  13905. MBEDTLS_MPI_CHK( mbedtls_ecp_mul_shortcuts( grp, R, n, Q ) );
  13906. MBEDTLS_MPI_CHK( ecp_add_mixed( grp, R, &mP, R ) );
  13907. MBEDTLS_MPI_CHK( ecp_normalize_jac( grp, R ) );
  13908. cleanup:
  13909. mbedtls_ecp_point_free( &mP );
  13910. return( ret );
  13911. }
  13912. #if defined(ECP_MONTGOMERY)
  13913. /*
  13914. * Check validity of a public key for Montgomery curves with x-only schemes
  13915. */
  13916. static int ecp_check_pubkey_mx( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *pt )
  13917. {
  13918. /* [Curve25519 p. 5] Just check X is the correct number of bytes */
  13919. if( mbedtls_mpi_size( &pt->X ) > ( grp->nbits + 7 ) / 8 )
  13920. return( MBEDTLS_ERR_ECP_INVALID_KEY );
  13921. return( 0 );
  13922. }
  13923. #endif /* ECP_MONTGOMERY */
  13924. /*
  13925. * Check that a point is valid as a public key
  13926. */
  13927. int mbedtls_ecp_check_pubkey( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *pt )
  13928. {
  13929. /* Must use affine coordinates */
  13930. if( mbedtls_mpi_cmp_int( &pt->Z, 1 ) != 0 )
  13931. return( MBEDTLS_ERR_ECP_INVALID_KEY );
  13932. #if defined(ECP_MONTGOMERY)
  13933. if( ecp_get_type( grp ) == ECP_TYPE_MONTGOMERY )
  13934. return( ecp_check_pubkey_mx( grp, pt ) );
  13935. #endif
  13936. #if defined(ECP_SHORTWEIERSTRASS)
  13937. if( ecp_get_type( grp ) == ECP_TYPE_SHORT_WEIERSTRASS )
  13938. return( ecp_check_pubkey_sw( grp, pt ) );
  13939. #endif
  13940. return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );
  13941. }
  13942. /*
  13943. * Check that an mbedtls_mpi is valid as a private key
  13944. */
  13945. int mbedtls_ecp_check_privkey( const mbedtls_ecp_group *grp, const mbedtls_mpi *d )
  13946. {
  13947. #if defined(ECP_MONTGOMERY)
  13948. if( ecp_get_type( grp ) == ECP_TYPE_MONTGOMERY )
  13949. {
  13950. /* see [Curve25519] page 5 */
  13951. if( mbedtls_mpi_get_bit( d, 0 ) != 0 ||
  13952. mbedtls_mpi_get_bit( d, 1 ) != 0 ||
  13953. mbedtls_mpi_get_bit( d, 2 ) != 0 ||
  13954. mbedtls_mpi_bitlen( d ) - 1 != grp->nbits ) /* mbedtls_mpi_bitlen is one-based! */
  13955. return( MBEDTLS_ERR_ECP_INVALID_KEY );
  13956. else
  13957. return( 0 );
  13958. }
  13959. #endif /* ECP_MONTGOMERY */
  13960. #if defined(ECP_SHORTWEIERSTRASS)
  13961. if( ecp_get_type( grp ) == ECP_TYPE_SHORT_WEIERSTRASS )
  13962. {
  13963. /* see SEC1 3.2 */
  13964. if( mbedtls_mpi_cmp_int( d, 1 ) < 0 ||
  13965. mbedtls_mpi_cmp_mpi( d, &grp->N ) >= 0 )
  13966. return( MBEDTLS_ERR_ECP_INVALID_KEY );
  13967. else
  13968. return( 0 );
  13969. }
  13970. #endif /* ECP_SHORTWEIERSTRASS */
  13971. return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );
  13972. }
  13973. /*
  13974. * Generate a keypair with configurable base point
  13975. */
  13976. int mbedtls_ecp_gen_keypair_base( mbedtls_ecp_group *grp,
  13977. const mbedtls_ecp_point *G,
  13978. mbedtls_mpi *d, mbedtls_ecp_point *Q,
  13979. int (*f_rng)(void *, unsigned char *, size_t),
  13980. void *p_rng )
  13981. {
  13982. int ret;
  13983. size_t n_size = ( grp->nbits + 7 ) / 8;
  13984. #if defined(ECP_MONTGOMERY)
  13985. if( ecp_get_type( grp ) == ECP_TYPE_MONTGOMERY )
  13986. {
  13987. /* [M225] page 5 */
  13988. size_t b;
  13989. MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( d, n_size, f_rng, p_rng ) );
  13990. /* Make sure the most significant bit is nbits */
  13991. b = mbedtls_mpi_bitlen( d ) - 1; /* mbedtls_mpi_bitlen is one-based */
  13992. if( b > grp->nbits )
  13993. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( d, b - grp->nbits ) );
  13994. else
  13995. MBEDTLS_MPI_CHK( mbedtls_mpi_set_bit( d, grp->nbits, 1 ) );
  13996. /* Make sure the last three bits are unset */
  13997. MBEDTLS_MPI_CHK( mbedtls_mpi_set_bit( d, 0, 0 ) );
  13998. MBEDTLS_MPI_CHK( mbedtls_mpi_set_bit( d, 1, 0 ) );
  13999. MBEDTLS_MPI_CHK( mbedtls_mpi_set_bit( d, 2, 0 ) );
  14000. }
  14001. else
  14002. #endif /* ECP_MONTGOMERY */
  14003. #if defined(ECP_SHORTWEIERSTRASS)
  14004. if( ecp_get_type( grp ) == ECP_TYPE_SHORT_WEIERSTRASS )
  14005. {
  14006. /* SEC1 3.2.1: Generate d such that 1 <= n < N */
  14007. int count = 0;
  14008. unsigned char rnd[MBEDTLS_ECP_MAX_BYTES];
  14009. /*
  14010. * Match the procedure given in RFC 6979 (deterministic ECDSA):
  14011. * - use the same byte ordering;
  14012. * - keep the leftmost nbits bits of the generated octet string;
  14013. * - try until result is in the desired range.
  14014. * This also avoids any biais, which is especially important for ECDSA.
  14015. */
  14016. do
  14017. {
  14018. MBEDTLS_MPI_CHK( f_rng( p_rng, rnd, n_size ) );
  14019. MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( d, rnd, n_size ) );
  14020. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( d, 8 * n_size - grp->nbits ) );
  14021. /*
  14022. * Each try has at worst a probability 1/2 of failing (the msb has
  14023. * a probability 1/2 of being 0, and then the result will be < N),
  14024. * so after 30 tries failure probability is a most 2**(-30).
  14025. *
  14026. * For most curves, 1 try is enough with overwhelming probability,
  14027. * since N starts with a lot of 1s in binary, but some curves
  14028. * such as secp224k1 are actually very close to the worst case.
  14029. */
  14030. if( ++count > 30 )
  14031. return( MBEDTLS_ERR_ECP_RANDOM_FAILED );
  14032. }
  14033. while( mbedtls_mpi_cmp_int( d, 1 ) < 0 ||
  14034. mbedtls_mpi_cmp_mpi( d, &grp->N ) >= 0 );
  14035. }
  14036. else
  14037. #endif /* ECP_SHORTWEIERSTRASS */
  14038. return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );
  14039. cleanup:
  14040. if( ret != 0 )
  14041. return( ret );
  14042. return( mbedtls_ecp_mul( grp, Q, d, G, f_rng, p_rng ) );
  14043. }
  14044. /*
  14045. * Generate key pair, wrapper for conventional base point
  14046. */
  14047. int mbedtls_ecp_gen_keypair( mbedtls_ecp_group *grp,
  14048. mbedtls_mpi *d, mbedtls_ecp_point *Q,
  14049. int (*f_rng)(void *, unsigned char *, size_t),
  14050. void *p_rng )
  14051. {
  14052. return( mbedtls_ecp_gen_keypair_base( grp, &grp->G, d, Q, f_rng, p_rng ) );
  14053. }
  14054. /*
  14055. * Generate a keypair, prettier wrapper
  14056. */
  14057. int mbedtls_ecp_gen_key( mbedtls_ecp_group_id grp_id, mbedtls_ecp_keypair *key,
  14058. int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
  14059. {
  14060. int ret;
  14061. if( ( ret = mbedtls_ecp_group_load( &key->grp, grp_id ) ) != 0 )
  14062. return( ret );
  14063. return( mbedtls_ecp_gen_keypair( &key->grp, &key->d, &key->Q, f_rng, p_rng ) );
  14064. }
  14065. /*
  14066. * Check a public-private key pair
  14067. */
  14068. int mbedtls_ecp_check_pub_priv( const mbedtls_ecp_keypair *pub, const mbedtls_ecp_keypair *prv )
  14069. {
  14070. int ret;
  14071. mbedtls_ecp_point Q;
  14072. mbedtls_ecp_group grp;
  14073. if( pub->grp.id == MBEDTLS_ECP_DP_NONE ||
  14074. pub->grp.id != prv->grp.id ||
  14075. mbedtls_mpi_cmp_mpi( &pub->Q.X, &prv->Q.X ) ||
  14076. mbedtls_mpi_cmp_mpi( &pub->Q.Y, &prv->Q.Y ) ||
  14077. mbedtls_mpi_cmp_mpi( &pub->Q.Z, &prv->Q.Z ) )
  14078. {
  14079. return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );
  14080. }
  14081. mbedtls_ecp_point_init( &Q );
  14082. mbedtls_ecp_group_init( &grp );
  14083. /* mbedtls_ecp_mul() needs a non-const group... */
  14084. mbedtls_ecp_group_copy( &grp, &prv->grp );
  14085. /* Also checks d is valid */
  14086. MBEDTLS_MPI_CHK( mbedtls_ecp_mul( &grp, &Q, &prv->d, &prv->grp.G, NULL, NULL ) );
  14087. if( mbedtls_mpi_cmp_mpi( &Q.X, &prv->Q.X ) ||
  14088. mbedtls_mpi_cmp_mpi( &Q.Y, &prv->Q.Y ) ||
  14089. mbedtls_mpi_cmp_mpi( &Q.Z, &prv->Q.Z ) )
  14090. {
  14091. ret = MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
  14092. goto cleanup;
  14093. }
  14094. cleanup:
  14095. mbedtls_ecp_point_free( &Q );
  14096. mbedtls_ecp_group_free( &grp );
  14097. return( ret );
  14098. }
  14099. #if defined(MBEDTLS_SELF_TEST)
  14100. /*
  14101. * Checkup routine
  14102. */
  14103. int mbedtls_ecp_self_test( int verbose )
  14104. {
  14105. int ret;
  14106. size_t i;
  14107. mbedtls_ecp_group grp;
  14108. mbedtls_ecp_point R, P;
  14109. mbedtls_mpi m;
  14110. unsigned long add_c_prev, dbl_c_prev, mul_c_prev;
  14111. /* exponents especially adapted for secp192r1 */
  14112. const char *exponents[] =
  14113. {
  14114. "000000000000000000000000000000000000000000000001", /* one */
  14115. "FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22830", /* N - 1 */
  14116. "5EA6F389A38B8BC81E767753B15AA5569E1782E30ABE7D25", /* random */
  14117. "400000000000000000000000000000000000000000000000", /* one and zeros */
  14118. "7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", /* all ones */
  14119. "555555555555555555555555555555555555555555555555", /* 101010... */
  14120. };
  14121. mbedtls_ecp_group_init( &grp );
  14122. mbedtls_ecp_point_init( &R );
  14123. mbedtls_ecp_point_init( &P );
  14124. mbedtls_mpi_init( &m );
  14125. /* Use secp192r1 if available, or any available curve */
  14126. #if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED)
  14127. MBEDTLS_MPI_CHK( mbedtls_ecp_group_load( &grp, MBEDTLS_ECP_DP_SECP192R1 ) );
  14128. #else
  14129. MBEDTLS_MPI_CHK( mbedtls_ecp_group_load( &grp, mbedtls_ecp_curve_list()->grp_id ) );
  14130. #endif
  14131. if( verbose != 0 )
  14132. mbedtls_printf( " ECP test #1 (constant op_count, base point G): " );
  14133. /* Do a dummy multiplication first to trigger precomputation */
  14134. MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &m, 2 ) );
  14135. MBEDTLS_MPI_CHK( mbedtls_ecp_mul( &grp, &P, &m, &grp.G, NULL, NULL ) );
  14136. add_count = 0;
  14137. dbl_count = 0;
  14138. mul_count = 0;
  14139. MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &m, 16, exponents[0] ) );
  14140. MBEDTLS_MPI_CHK( mbedtls_ecp_mul( &grp, &R, &m, &grp.G, NULL, NULL ) );
  14141. for( i = 1; i < sizeof( exponents ) / sizeof( exponents[0] ); i++ )
  14142. {
  14143. add_c_prev = add_count;
  14144. dbl_c_prev = dbl_count;
  14145. mul_c_prev = mul_count;
  14146. add_count = 0;
  14147. dbl_count = 0;
  14148. mul_count = 0;
  14149. MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &m, 16, exponents[i] ) );
  14150. MBEDTLS_MPI_CHK( mbedtls_ecp_mul( &grp, &R, &m, &grp.G, NULL, NULL ) );
  14151. if( add_count != add_c_prev ||
  14152. dbl_count != dbl_c_prev ||
  14153. mul_count != mul_c_prev )
  14154. {
  14155. if( verbose != 0 )
  14156. mbedtls_printf( "failed (%u)\n", (unsigned int) i );
  14157. ret = 1;
  14158. goto cleanup;
  14159. }
  14160. }
  14161. if( verbose != 0 )
  14162. mbedtls_printf( "passed\n" );
  14163. if( verbose != 0 )
  14164. mbedtls_printf( " ECP test #2 (constant op_count, other point): " );
  14165. /* We computed P = 2G last time, use it */
  14166. add_count = 0;
  14167. dbl_count = 0;
  14168. mul_count = 0;
  14169. MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &m, 16, exponents[0] ) );
  14170. MBEDTLS_MPI_CHK( mbedtls_ecp_mul( &grp, &R, &m, &P, NULL, NULL ) );
  14171. for( i = 1; i < sizeof( exponents ) / sizeof( exponents[0] ); i++ )
  14172. {
  14173. add_c_prev = add_count;
  14174. dbl_c_prev = dbl_count;
  14175. mul_c_prev = mul_count;
  14176. add_count = 0;
  14177. dbl_count = 0;
  14178. mul_count = 0;
  14179. MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &m, 16, exponents[i] ) );
  14180. MBEDTLS_MPI_CHK( mbedtls_ecp_mul( &grp, &R, &m, &P, NULL, NULL ) );
  14181. if( add_count != add_c_prev ||
  14182. dbl_count != dbl_c_prev ||
  14183. mul_count != mul_c_prev )
  14184. {
  14185. if( verbose != 0 )
  14186. mbedtls_printf( "failed (%u)\n", (unsigned int) i );
  14187. ret = 1;
  14188. goto cleanup;
  14189. }
  14190. }
  14191. if( verbose != 0 )
  14192. mbedtls_printf( "passed\n" );
  14193. cleanup:
  14194. if( ret < 0 && verbose != 0 )
  14195. mbedtls_printf( "Unexpected error, return code = %08X\n", ret );
  14196. mbedtls_ecp_group_free( &grp );
  14197. mbedtls_ecp_point_free( &R );
  14198. mbedtls_ecp_point_free( &P );
  14199. mbedtls_mpi_free( &m );
  14200. if( verbose != 0 )
  14201. mbedtls_printf( "\n" );
  14202. return( ret );
  14203. }
  14204. #endif /* MBEDTLS_SELF_TEST */
  14205. #endif /* MBEDTLS_ECP_C */
  14206. /********* Start of file library/ecp_curves.c ************/
  14207. /*
  14208. * Elliptic curves over GF(p): curve-specific data and functions
  14209. *
  14210. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  14211. * SPDX-License-Identifier: Apache-2.0
  14212. *
  14213. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  14214. * not use this file except in compliance with the License.
  14215. * You may obtain a copy of the License at
  14216. *
  14217. * http://www.apache.org/licenses/LICENSE-2.0
  14218. *
  14219. * Unless required by applicable law or agreed to in writing, software
  14220. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  14221. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14222. * See the License for the specific language governing permissions and
  14223. * limitations under the License.
  14224. *
  14225. * This file is part of mbed TLS (https://tls.mbed.org)
  14226. */
  14227. #if !defined(MBEDTLS_CONFIG_FILE)
  14228. #else
  14229. #endif
  14230. #if defined(MBEDTLS_ECP_C)
  14231. #include <string.h>
  14232. #if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \
  14233. !defined(inline) && !defined(__cplusplus)
  14234. #define inline __inline
  14235. #endif
  14236. /* Amalgamated Release Mappings */
  14237. #undef ADD
  14238. /*
  14239. * Conversion macros for embedded constants:
  14240. * build lists of mbedtls_mpi_uint's from lists of unsigned char's grouped by 8, 4 or 2
  14241. */
  14242. #if defined(MBEDTLS_HAVE_INT32)
  14243. #define BYTES_TO_T_UINT_4( a, b, c, d ) \
  14244. ( (mbedtls_mpi_uint) a << 0 ) | \
  14245. ( (mbedtls_mpi_uint) b << 8 ) | \
  14246. ( (mbedtls_mpi_uint) c << 16 ) | \
  14247. ( (mbedtls_mpi_uint) d << 24 )
  14248. #define BYTES_TO_T_UINT_2( a, b ) \
  14249. BYTES_TO_T_UINT_4( a, b, 0, 0 )
  14250. #define BYTES_TO_T_UINT_8( a, b, c, d, e, f, g, h ) \
  14251. BYTES_TO_T_UINT_4( a, b, c, d ), \
  14252. BYTES_TO_T_UINT_4( e, f, g, h )
  14253. #else /* 64-bits */
  14254. #define BYTES_TO_T_UINT_8( a, b, c, d, e, f, g, h ) \
  14255. ( (mbedtls_mpi_uint) a << 0 ) | \
  14256. ( (mbedtls_mpi_uint) b << 8 ) | \
  14257. ( (mbedtls_mpi_uint) c << 16 ) | \
  14258. ( (mbedtls_mpi_uint) d << 24 ) | \
  14259. ( (mbedtls_mpi_uint) e << 32 ) | \
  14260. ( (mbedtls_mpi_uint) f << 40 ) | \
  14261. ( (mbedtls_mpi_uint) g << 48 ) | \
  14262. ( (mbedtls_mpi_uint) h << 56 )
  14263. #define BYTES_TO_T_UINT_4( a, b, c, d ) \
  14264. BYTES_TO_T_UINT_8( a, b, c, d, 0, 0, 0, 0 )
  14265. #define BYTES_TO_T_UINT_2( a, b ) \
  14266. BYTES_TO_T_UINT_8( a, b, 0, 0, 0, 0, 0, 0 )
  14267. #endif /* bits in mbedtls_mpi_uint */
  14268. /*
  14269. * Note: the constants are in little-endian order
  14270. * to be directly usable in MPIs
  14271. */
  14272. /*
  14273. * Domain parameters for secp192r1
  14274. */
  14275. #if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED)
  14276. static const mbedtls_mpi_uint secp192r1_p[] = {
  14277. BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),
  14278. BYTES_TO_T_UINT_8( 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),
  14279. BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),
  14280. };
  14281. static const mbedtls_mpi_uint secp192r1_b[] = {
  14282. BYTES_TO_T_UINT_8( 0xB1, 0xB9, 0x46, 0xC1, 0xEC, 0xDE, 0xB8, 0xFE ),
  14283. BYTES_TO_T_UINT_8( 0x49, 0x30, 0x24, 0x72, 0xAB, 0xE9, 0xA7, 0x0F ),
  14284. BYTES_TO_T_UINT_8( 0xE7, 0x80, 0x9C, 0xE5, 0x19, 0x05, 0x21, 0x64 ),
  14285. };
  14286. static const mbedtls_mpi_uint secp192r1_gx[] = {
  14287. BYTES_TO_T_UINT_8( 0x12, 0x10, 0xFF, 0x82, 0xFD, 0x0A, 0xFF, 0xF4 ),
  14288. BYTES_TO_T_UINT_8( 0x00, 0x88, 0xA1, 0x43, 0xEB, 0x20, 0xBF, 0x7C ),
  14289. BYTES_TO_T_UINT_8( 0xF6, 0x90, 0x30, 0xB0, 0x0E, 0xA8, 0x8D, 0x18 ),
  14290. };
  14291. static const mbedtls_mpi_uint secp192r1_gy[] = {
  14292. BYTES_TO_T_UINT_8( 0x11, 0x48, 0x79, 0x1E, 0xA1, 0x77, 0xF9, 0x73 ),
  14293. BYTES_TO_T_UINT_8( 0xD5, 0xCD, 0x24, 0x6B, 0xED, 0x11, 0x10, 0x63 ),
  14294. BYTES_TO_T_UINT_8( 0x78, 0xDA, 0xC8, 0xFF, 0x95, 0x2B, 0x19, 0x07 ),
  14295. };
  14296. static const mbedtls_mpi_uint secp192r1_n[] = {
  14297. BYTES_TO_T_UINT_8( 0x31, 0x28, 0xD2, 0xB4, 0xB1, 0xC9, 0x6B, 0x14 ),
  14298. BYTES_TO_T_UINT_8( 0x36, 0xF8, 0xDE, 0x99, 0xFF, 0xFF, 0xFF, 0xFF ),
  14299. BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),
  14300. };
  14301. #endif /* MBEDTLS_ECP_DP_SECP192R1_ENABLED */
  14302. /*
  14303. * Domain parameters for secp224r1
  14304. */
  14305. #if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED)
  14306. static const mbedtls_mpi_uint secp224r1_p[] = {
  14307. BYTES_TO_T_UINT_8( 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ),
  14308. BYTES_TO_T_UINT_8( 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF ),
  14309. BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),
  14310. BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00 ),
  14311. };
  14312. static const mbedtls_mpi_uint secp224r1_b[] = {
  14313. BYTES_TO_T_UINT_8( 0xB4, 0xFF, 0x55, 0x23, 0x43, 0x39, 0x0B, 0x27 ),
  14314. BYTES_TO_T_UINT_8( 0xBA, 0xD8, 0xBF, 0xD7, 0xB7, 0xB0, 0x44, 0x50 ),
  14315. BYTES_TO_T_UINT_8( 0x56, 0x32, 0x41, 0xF5, 0xAB, 0xB3, 0x04, 0x0C ),
  14316. BYTES_TO_T_UINT_4( 0x85, 0x0A, 0x05, 0xB4 ),
  14317. };
  14318. static const mbedtls_mpi_uint secp224r1_gx[] = {
  14319. BYTES_TO_T_UINT_8( 0x21, 0x1D, 0x5C, 0x11, 0xD6, 0x80, 0x32, 0x34 ),
  14320. BYTES_TO_T_UINT_8( 0x22, 0x11, 0xC2, 0x56, 0xD3, 0xC1, 0x03, 0x4A ),
  14321. BYTES_TO_T_UINT_8( 0xB9, 0x90, 0x13, 0x32, 0x7F, 0xBF, 0xB4, 0x6B ),
  14322. BYTES_TO_T_UINT_4( 0xBD, 0x0C, 0x0E, 0xB7 ),
  14323. };
  14324. static const mbedtls_mpi_uint secp224r1_gy[] = {
  14325. BYTES_TO_T_UINT_8( 0x34, 0x7E, 0x00, 0x85, 0x99, 0x81, 0xD5, 0x44 ),
  14326. BYTES_TO_T_UINT_8( 0x64, 0x47, 0x07, 0x5A, 0xA0, 0x75, 0x43, 0xCD ),
  14327. BYTES_TO_T_UINT_8( 0xE6, 0xDF, 0x22, 0x4C, 0xFB, 0x23, 0xF7, 0xB5 ),
  14328. BYTES_TO_T_UINT_4( 0x88, 0x63, 0x37, 0xBD ),
  14329. };
  14330. static const mbedtls_mpi_uint secp224r1_n[] = {
  14331. BYTES_TO_T_UINT_8( 0x3D, 0x2A, 0x5C, 0x5C, 0x45, 0x29, 0xDD, 0x13 ),
  14332. BYTES_TO_T_UINT_8( 0x3E, 0xF0, 0xB8, 0xE0, 0xA2, 0x16, 0xFF, 0xFF ),
  14333. BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),
  14334. BYTES_TO_T_UINT_4( 0xFF, 0xFF, 0xFF, 0xFF ),
  14335. };
  14336. #endif /* MBEDTLS_ECP_DP_SECP224R1_ENABLED */
  14337. /*
  14338. * Domain parameters for secp256r1
  14339. */
  14340. #if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED)
  14341. static const mbedtls_mpi_uint secp256r1_p[] = {
  14342. BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),
  14343. BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00 ),
  14344. BYTES_TO_T_UINT_8( 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ),
  14345. BYTES_TO_T_UINT_8( 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF ),
  14346. };
  14347. static const mbedtls_mpi_uint secp256r1_b[] = {
  14348. BYTES_TO_T_UINT_8( 0x4B, 0x60, 0xD2, 0x27, 0x3E, 0x3C, 0xCE, 0x3B ),
  14349. BYTES_TO_T_UINT_8( 0xF6, 0xB0, 0x53, 0xCC, 0xB0, 0x06, 0x1D, 0x65 ),
  14350. BYTES_TO_T_UINT_8( 0xBC, 0x86, 0x98, 0x76, 0x55, 0xBD, 0xEB, 0xB3 ),
  14351. BYTES_TO_T_UINT_8( 0xE7, 0x93, 0x3A, 0xAA, 0xD8, 0x35, 0xC6, 0x5A ),
  14352. };
  14353. static const mbedtls_mpi_uint secp256r1_gx[] = {
  14354. BYTES_TO_T_UINT_8( 0x96, 0xC2, 0x98, 0xD8, 0x45, 0x39, 0xA1, 0xF4 ),
  14355. BYTES_TO_T_UINT_8( 0xA0, 0x33, 0xEB, 0x2D, 0x81, 0x7D, 0x03, 0x77 ),
  14356. BYTES_TO_T_UINT_8( 0xF2, 0x40, 0xA4, 0x63, 0xE5, 0xE6, 0xBC, 0xF8 ),
  14357. BYTES_TO_T_UINT_8( 0x47, 0x42, 0x2C, 0xE1, 0xF2, 0xD1, 0x17, 0x6B ),
  14358. };
  14359. static const mbedtls_mpi_uint secp256r1_gy[] = {
  14360. BYTES_TO_T_UINT_8( 0xF5, 0x51, 0xBF, 0x37, 0x68, 0x40, 0xB6, 0xCB ),
  14361. BYTES_TO_T_UINT_8( 0xCE, 0x5E, 0x31, 0x6B, 0x57, 0x33, 0xCE, 0x2B ),
  14362. BYTES_TO_T_UINT_8( 0x16, 0x9E, 0x0F, 0x7C, 0x4A, 0xEB, 0xE7, 0x8E ),
  14363. BYTES_TO_T_UINT_8( 0x9B, 0x7F, 0x1A, 0xFE, 0xE2, 0x42, 0xE3, 0x4F ),
  14364. };
  14365. static const mbedtls_mpi_uint secp256r1_n[] = {
  14366. BYTES_TO_T_UINT_8( 0x51, 0x25, 0x63, 0xFC, 0xC2, 0xCA, 0xB9, 0xF3 ),
  14367. BYTES_TO_T_UINT_8( 0x84, 0x9E, 0x17, 0xA7, 0xAD, 0xFA, 0xE6, 0xBC ),
  14368. BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),
  14369. BYTES_TO_T_UINT_8( 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF ),
  14370. };
  14371. #endif /* MBEDTLS_ECP_DP_SECP256R1_ENABLED */
  14372. /*
  14373. * Domain parameters for secp384r1
  14374. */
  14375. #if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED)
  14376. static const mbedtls_mpi_uint secp384r1_p[] = {
  14377. BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00 ),
  14378. BYTES_TO_T_UINT_8( 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF ),
  14379. BYTES_TO_T_UINT_8( 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),
  14380. BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),
  14381. BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),
  14382. BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),
  14383. };
  14384. static const mbedtls_mpi_uint secp384r1_b[] = {
  14385. BYTES_TO_T_UINT_8( 0xEF, 0x2A, 0xEC, 0xD3, 0xED, 0xC8, 0x85, 0x2A ),
  14386. BYTES_TO_T_UINT_8( 0x9D, 0xD1, 0x2E, 0x8A, 0x8D, 0x39, 0x56, 0xC6 ),
  14387. BYTES_TO_T_UINT_8( 0x5A, 0x87, 0x13, 0x50, 0x8F, 0x08, 0x14, 0x03 ),
  14388. BYTES_TO_T_UINT_8( 0x12, 0x41, 0x81, 0xFE, 0x6E, 0x9C, 0x1D, 0x18 ),
  14389. BYTES_TO_T_UINT_8( 0x19, 0x2D, 0xF8, 0xE3, 0x6B, 0x05, 0x8E, 0x98 ),
  14390. BYTES_TO_T_UINT_8( 0xE4, 0xE7, 0x3E, 0xE2, 0xA7, 0x2F, 0x31, 0xB3 ),
  14391. };
  14392. static const mbedtls_mpi_uint secp384r1_gx[] = {
  14393. BYTES_TO_T_UINT_8( 0xB7, 0x0A, 0x76, 0x72, 0x38, 0x5E, 0x54, 0x3A ),
  14394. BYTES_TO_T_UINT_8( 0x6C, 0x29, 0x55, 0xBF, 0x5D, 0xF2, 0x02, 0x55 ),
  14395. BYTES_TO_T_UINT_8( 0x38, 0x2A, 0x54, 0x82, 0xE0, 0x41, 0xF7, 0x59 ),
  14396. BYTES_TO_T_UINT_8( 0x98, 0x9B, 0xA7, 0x8B, 0x62, 0x3B, 0x1D, 0x6E ),
  14397. BYTES_TO_T_UINT_8( 0x74, 0xAD, 0x20, 0xF3, 0x1E, 0xC7, 0xB1, 0x8E ),
  14398. BYTES_TO_T_UINT_8( 0x37, 0x05, 0x8B, 0xBE, 0x22, 0xCA, 0x87, 0xAA ),
  14399. };
  14400. static const mbedtls_mpi_uint secp384r1_gy[] = {
  14401. BYTES_TO_T_UINT_8( 0x5F, 0x0E, 0xEA, 0x90, 0x7C, 0x1D, 0x43, 0x7A ),
  14402. BYTES_TO_T_UINT_8( 0x9D, 0x81, 0x7E, 0x1D, 0xCE, 0xB1, 0x60, 0x0A ),
  14403. BYTES_TO_T_UINT_8( 0xC0, 0xB8, 0xF0, 0xB5, 0x13, 0x31, 0xDA, 0xE9 ),
  14404. BYTES_TO_T_UINT_8( 0x7C, 0x14, 0x9A, 0x28, 0xBD, 0x1D, 0xF4, 0xF8 ),
  14405. BYTES_TO_T_UINT_8( 0x29, 0xDC, 0x92, 0x92, 0xBF, 0x98, 0x9E, 0x5D ),
  14406. BYTES_TO_T_UINT_8( 0x6F, 0x2C, 0x26, 0x96, 0x4A, 0xDE, 0x17, 0x36 ),
  14407. };
  14408. static const mbedtls_mpi_uint secp384r1_n[] = {
  14409. BYTES_TO_T_UINT_8( 0x73, 0x29, 0xC5, 0xCC, 0x6A, 0x19, 0xEC, 0xEC ),
  14410. BYTES_TO_T_UINT_8( 0x7A, 0xA7, 0xB0, 0x48, 0xB2, 0x0D, 0x1A, 0x58 ),
  14411. BYTES_TO_T_UINT_8( 0xDF, 0x2D, 0x37, 0xF4, 0x81, 0x4D, 0x63, 0xC7 ),
  14412. BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),
  14413. BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),
  14414. BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),
  14415. };
  14416. #endif /* MBEDTLS_ECP_DP_SECP384R1_ENABLED */
  14417. /*
  14418. * Domain parameters for secp521r1
  14419. */
  14420. #if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED)
  14421. static const mbedtls_mpi_uint secp521r1_p[] = {
  14422. BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),
  14423. BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),
  14424. BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),
  14425. BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),
  14426. BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),
  14427. BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),
  14428. BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),
  14429. BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),
  14430. BYTES_TO_T_UINT_2( 0xFF, 0x01 ),
  14431. };
  14432. static const mbedtls_mpi_uint secp521r1_b[] = {
  14433. BYTES_TO_T_UINT_8( 0x00, 0x3F, 0x50, 0x6B, 0xD4, 0x1F, 0x45, 0xEF ),
  14434. BYTES_TO_T_UINT_8( 0xF1, 0x34, 0x2C, 0x3D, 0x88, 0xDF, 0x73, 0x35 ),
  14435. BYTES_TO_T_UINT_8( 0x07, 0xBF, 0xB1, 0x3B, 0xBD, 0xC0, 0x52, 0x16 ),
  14436. BYTES_TO_T_UINT_8( 0x7B, 0x93, 0x7E, 0xEC, 0x51, 0x39, 0x19, 0x56 ),
  14437. BYTES_TO_T_UINT_8( 0xE1, 0x09, 0xF1, 0x8E, 0x91, 0x89, 0xB4, 0xB8 ),
  14438. BYTES_TO_T_UINT_8( 0xF3, 0x15, 0xB3, 0x99, 0x5B, 0x72, 0xDA, 0xA2 ),
  14439. BYTES_TO_T_UINT_8( 0xEE, 0x40, 0x85, 0xB6, 0xA0, 0x21, 0x9A, 0x92 ),
  14440. BYTES_TO_T_UINT_8( 0x1F, 0x9A, 0x1C, 0x8E, 0x61, 0xB9, 0x3E, 0x95 ),
  14441. BYTES_TO_T_UINT_2( 0x51, 0x00 ),
  14442. };
  14443. static const mbedtls_mpi_uint secp521r1_gx[] = {
  14444. BYTES_TO_T_UINT_8( 0x66, 0xBD, 0xE5, 0xC2, 0x31, 0x7E, 0x7E, 0xF9 ),
  14445. BYTES_TO_T_UINT_8( 0x9B, 0x42, 0x6A, 0x85, 0xC1, 0xB3, 0x48, 0x33 ),
  14446. BYTES_TO_T_UINT_8( 0xDE, 0xA8, 0xFF, 0xA2, 0x27, 0xC1, 0x1D, 0xFE ),
  14447. BYTES_TO_T_UINT_8( 0x28, 0x59, 0xE7, 0xEF, 0x77, 0x5E, 0x4B, 0xA1 ),
  14448. BYTES_TO_T_UINT_8( 0xBA, 0x3D, 0x4D, 0x6B, 0x60, 0xAF, 0x28, 0xF8 ),
  14449. BYTES_TO_T_UINT_8( 0x21, 0xB5, 0x3F, 0x05, 0x39, 0x81, 0x64, 0x9C ),
  14450. BYTES_TO_T_UINT_8( 0x42, 0xB4, 0x95, 0x23, 0x66, 0xCB, 0x3E, 0x9E ),
  14451. BYTES_TO_T_UINT_8( 0xCD, 0xE9, 0x04, 0x04, 0xB7, 0x06, 0x8E, 0x85 ),
  14452. BYTES_TO_T_UINT_2( 0xC6, 0x00 ),
  14453. };
  14454. static const mbedtls_mpi_uint secp521r1_gy[] = {
  14455. BYTES_TO_T_UINT_8( 0x50, 0x66, 0xD1, 0x9F, 0x76, 0x94, 0xBE, 0x88 ),
  14456. BYTES_TO_T_UINT_8( 0x40, 0xC2, 0x72, 0xA2, 0x86, 0x70, 0x3C, 0x35 ),
  14457. BYTES_TO_T_UINT_8( 0x61, 0x07, 0xAD, 0x3F, 0x01, 0xB9, 0x50, 0xC5 ),
  14458. BYTES_TO_T_UINT_8( 0x40, 0x26, 0xF4, 0x5E, 0x99, 0x72, 0xEE, 0x97 ),
  14459. BYTES_TO_T_UINT_8( 0x2C, 0x66, 0x3E, 0x27, 0x17, 0xBD, 0xAF, 0x17 ),
  14460. BYTES_TO_T_UINT_8( 0x68, 0x44, 0x9B, 0x57, 0x49, 0x44, 0xF5, 0x98 ),
  14461. BYTES_TO_T_UINT_8( 0xD9, 0x1B, 0x7D, 0x2C, 0xB4, 0x5F, 0x8A, 0x5C ),
  14462. BYTES_TO_T_UINT_8( 0x04, 0xC0, 0x3B, 0x9A, 0x78, 0x6A, 0x29, 0x39 ),
  14463. BYTES_TO_T_UINT_2( 0x18, 0x01 ),
  14464. };
  14465. static const mbedtls_mpi_uint secp521r1_n[] = {
  14466. BYTES_TO_T_UINT_8( 0x09, 0x64, 0x38, 0x91, 0x1E, 0xB7, 0x6F, 0xBB ),
  14467. BYTES_TO_T_UINT_8( 0xAE, 0x47, 0x9C, 0x89, 0xB8, 0xC9, 0xB5, 0x3B ),
  14468. BYTES_TO_T_UINT_8( 0xD0, 0xA5, 0x09, 0xF7, 0x48, 0x01, 0xCC, 0x7F ),
  14469. BYTES_TO_T_UINT_8( 0x6B, 0x96, 0x2F, 0xBF, 0x83, 0x87, 0x86, 0x51 ),
  14470. BYTES_TO_T_UINT_8( 0xFA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),
  14471. BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),
  14472. BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),
  14473. BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),
  14474. BYTES_TO_T_UINT_2( 0xFF, 0x01 ),
  14475. };
  14476. #endif /* MBEDTLS_ECP_DP_SECP521R1_ENABLED */
  14477. #if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED)
  14478. static const mbedtls_mpi_uint secp192k1_p[] = {
  14479. BYTES_TO_T_UINT_8( 0x37, 0xEE, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF ),
  14480. BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),
  14481. BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),
  14482. };
  14483. static const mbedtls_mpi_uint secp192k1_a[] = {
  14484. BYTES_TO_T_UINT_2( 0x00, 0x00 ),
  14485. };
  14486. static const mbedtls_mpi_uint secp192k1_b[] = {
  14487. BYTES_TO_T_UINT_2( 0x03, 0x00 ),
  14488. };
  14489. static const mbedtls_mpi_uint secp192k1_gx[] = {
  14490. BYTES_TO_T_UINT_8( 0x7D, 0x6C, 0xE0, 0xEA, 0xB1, 0xD1, 0xA5, 0x1D ),
  14491. BYTES_TO_T_UINT_8( 0x34, 0xF4, 0xB7, 0x80, 0x02, 0x7D, 0xB0, 0x26 ),
  14492. BYTES_TO_T_UINT_8( 0xAE, 0xE9, 0x57, 0xC0, 0x0E, 0xF1, 0x4F, 0xDB ),
  14493. };
  14494. static const mbedtls_mpi_uint secp192k1_gy[] = {
  14495. BYTES_TO_T_UINT_8( 0x9D, 0x2F, 0x5E, 0xD9, 0x88, 0xAA, 0x82, 0x40 ),
  14496. BYTES_TO_T_UINT_8( 0x34, 0x86, 0xBE, 0x15, 0xD0, 0x63, 0x41, 0x84 ),
  14497. BYTES_TO_T_UINT_8( 0xA7, 0x28, 0x56, 0x9C, 0x6D, 0x2F, 0x2F, 0x9B ),
  14498. };
  14499. static const mbedtls_mpi_uint secp192k1_n[] = {
  14500. BYTES_TO_T_UINT_8( 0x8D, 0xFD, 0xDE, 0x74, 0x6A, 0x46, 0x69, 0x0F ),
  14501. BYTES_TO_T_UINT_8( 0x17, 0xFC, 0xF2, 0x26, 0xFE, 0xFF, 0xFF, 0xFF ),
  14502. BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),
  14503. };
  14504. #endif /* MBEDTLS_ECP_DP_SECP192K1_ENABLED */
  14505. #if defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED)
  14506. static const mbedtls_mpi_uint secp224k1_p[] = {
  14507. BYTES_TO_T_UINT_8( 0x6D, 0xE5, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF ),
  14508. BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),
  14509. BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),
  14510. BYTES_TO_T_UINT_4( 0xFF, 0xFF, 0xFF, 0xFF ),
  14511. };
  14512. static const mbedtls_mpi_uint secp224k1_a[] = {
  14513. BYTES_TO_T_UINT_2( 0x00, 0x00 ),
  14514. };
  14515. static const mbedtls_mpi_uint secp224k1_b[] = {
  14516. BYTES_TO_T_UINT_2( 0x05, 0x00 ),
  14517. };
  14518. static const mbedtls_mpi_uint secp224k1_gx[] = {
  14519. BYTES_TO_T_UINT_8( 0x5C, 0xA4, 0xB7, 0xB6, 0x0E, 0x65, 0x7E, 0x0F ),
  14520. BYTES_TO_T_UINT_8( 0xA9, 0x75, 0x70, 0xE4, 0xE9, 0x67, 0xA4, 0x69 ),
  14521. BYTES_TO_T_UINT_8( 0xA1, 0x28, 0xFC, 0x30, 0xDF, 0x99, 0xF0, 0x4D ),
  14522. BYTES_TO_T_UINT_4( 0x33, 0x5B, 0x45, 0xA1 ),
  14523. };
  14524. static const mbedtls_mpi_uint secp224k1_gy[] = {
  14525. BYTES_TO_T_UINT_8( 0xA5, 0x61, 0x6D, 0x55, 0xDB, 0x4B, 0xCA, 0xE2 ),
  14526. BYTES_TO_T_UINT_8( 0x59, 0xBD, 0xB0, 0xC0, 0xF7, 0x19, 0xE3, 0xF7 ),
  14527. BYTES_TO_T_UINT_8( 0xD6, 0xFB, 0xCA, 0x82, 0x42, 0x34, 0xBA, 0x7F ),
  14528. BYTES_TO_T_UINT_4( 0xED, 0x9F, 0x08, 0x7E ),
  14529. };
  14530. static const mbedtls_mpi_uint secp224k1_n[] = {
  14531. BYTES_TO_T_UINT_8( 0xF7, 0xB1, 0x9F, 0x76, 0x71, 0xA9, 0xF0, 0xCA ),
  14532. BYTES_TO_T_UINT_8( 0x84, 0x61, 0xEC, 0xD2, 0xE8, 0xDC, 0x01, 0x00 ),
  14533. BYTES_TO_T_UINT_8( 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ),
  14534. BYTES_TO_T_UINT_8( 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 ),
  14535. };
  14536. #endif /* MBEDTLS_ECP_DP_SECP224K1_ENABLED */
  14537. #if defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED)
  14538. static const mbedtls_mpi_uint secp256k1_p[] = {
  14539. BYTES_TO_T_UINT_8( 0x2F, 0xFC, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF ),
  14540. BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),
  14541. BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),
  14542. BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),
  14543. };
  14544. static const mbedtls_mpi_uint secp256k1_a[] = {
  14545. BYTES_TO_T_UINT_2( 0x00, 0x00 ),
  14546. };
  14547. static const mbedtls_mpi_uint secp256k1_b[] = {
  14548. BYTES_TO_T_UINT_2( 0x07, 0x00 ),
  14549. };
  14550. static const mbedtls_mpi_uint secp256k1_gx[] = {
  14551. BYTES_TO_T_UINT_8( 0x98, 0x17, 0xF8, 0x16, 0x5B, 0x81, 0xF2, 0x59 ),
  14552. BYTES_TO_T_UINT_8( 0xD9, 0x28, 0xCE, 0x2D, 0xDB, 0xFC, 0x9B, 0x02 ),
  14553. BYTES_TO_T_UINT_8( 0x07, 0x0B, 0x87, 0xCE, 0x95, 0x62, 0xA0, 0x55 ),
  14554. BYTES_TO_T_UINT_8( 0xAC, 0xBB, 0xDC, 0xF9, 0x7E, 0x66, 0xBE, 0x79 ),
  14555. };
  14556. static const mbedtls_mpi_uint secp256k1_gy[] = {
  14557. BYTES_TO_T_UINT_8( 0xB8, 0xD4, 0x10, 0xFB, 0x8F, 0xD0, 0x47, 0x9C ),
  14558. BYTES_TO_T_UINT_8( 0x19, 0x54, 0x85, 0xA6, 0x48, 0xB4, 0x17, 0xFD ),
  14559. BYTES_TO_T_UINT_8( 0xA8, 0x08, 0x11, 0x0E, 0xFC, 0xFB, 0xA4, 0x5D ),
  14560. BYTES_TO_T_UINT_8( 0x65, 0xC4, 0xA3, 0x26, 0x77, 0xDA, 0x3A, 0x48 ),
  14561. };
  14562. static const mbedtls_mpi_uint secp256k1_n[] = {
  14563. BYTES_TO_T_UINT_8( 0x41, 0x41, 0x36, 0xD0, 0x8C, 0x5E, 0xD2, 0xBF ),
  14564. BYTES_TO_T_UINT_8( 0x3B, 0xA0, 0x48, 0xAF, 0xE6, 0xDC, 0xAE, 0xBA ),
  14565. BYTES_TO_T_UINT_8( 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),
  14566. BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),
  14567. };
  14568. #endif /* MBEDTLS_ECP_DP_SECP256K1_ENABLED */
  14569. /*
  14570. * Domain parameters for brainpoolP256r1 (RFC 5639 3.4)
  14571. */
  14572. #if defined(MBEDTLS_ECP_DP_BP256R1_ENABLED)
  14573. static const mbedtls_mpi_uint brainpoolP256r1_p[] = {
  14574. BYTES_TO_T_UINT_8( 0x77, 0x53, 0x6E, 0x1F, 0x1D, 0x48, 0x13, 0x20 ),
  14575. BYTES_TO_T_UINT_8( 0x28, 0x20, 0x26, 0xD5, 0x23, 0xF6, 0x3B, 0x6E ),
  14576. BYTES_TO_T_UINT_8( 0x72, 0x8D, 0x83, 0x9D, 0x90, 0x0A, 0x66, 0x3E ),
  14577. BYTES_TO_T_UINT_8( 0xBC, 0xA9, 0xEE, 0xA1, 0xDB, 0x57, 0xFB, 0xA9 ),
  14578. };
  14579. static const mbedtls_mpi_uint brainpoolP256r1_a[] = {
  14580. BYTES_TO_T_UINT_8( 0xD9, 0xB5, 0x30, 0xF3, 0x44, 0x4B, 0x4A, 0xE9 ),
  14581. BYTES_TO_T_UINT_8( 0x6C, 0x5C, 0xDC, 0x26, 0xC1, 0x55, 0x80, 0xFB ),
  14582. BYTES_TO_T_UINT_8( 0xE7, 0xFF, 0x7A, 0x41, 0x30, 0x75, 0xF6, 0xEE ),
  14583. BYTES_TO_T_UINT_8( 0x57, 0x30, 0x2C, 0xFC, 0x75, 0x09, 0x5A, 0x7D ),
  14584. };
  14585. static const mbedtls_mpi_uint brainpoolP256r1_b[] = {
  14586. BYTES_TO_T_UINT_8( 0xB6, 0x07, 0x8C, 0xFF, 0x18, 0xDC, 0xCC, 0x6B ),
  14587. BYTES_TO_T_UINT_8( 0xCE, 0xE1, 0xF7, 0x5C, 0x29, 0x16, 0x84, 0x95 ),
  14588. BYTES_TO_T_UINT_8( 0xBF, 0x7C, 0xD7, 0xBB, 0xD9, 0xB5, 0x30, 0xF3 ),
  14589. BYTES_TO_T_UINT_8( 0x44, 0x4B, 0x4A, 0xE9, 0x6C, 0x5C, 0xDC, 0x26 ),
  14590. };
  14591. static const mbedtls_mpi_uint brainpoolP256r1_gx[] = {
  14592. BYTES_TO_T_UINT_8( 0x62, 0x32, 0xCE, 0x9A, 0xBD, 0x53, 0x44, 0x3A ),
  14593. BYTES_TO_T_UINT_8( 0xC2, 0x23, 0xBD, 0xE3, 0xE1, 0x27, 0xDE, 0xB9 ),
  14594. BYTES_TO_T_UINT_8( 0xAF, 0xB7, 0x81, 0xFC, 0x2F, 0x48, 0x4B, 0x2C ),
  14595. BYTES_TO_T_UINT_8( 0xCB, 0x57, 0x7E, 0xCB, 0xB9, 0xAE, 0xD2, 0x8B ),
  14596. };
  14597. static const mbedtls_mpi_uint brainpoolP256r1_gy[] = {
  14598. BYTES_TO_T_UINT_8( 0x97, 0x69, 0x04, 0x2F, 0xC7, 0x54, 0x1D, 0x5C ),
  14599. BYTES_TO_T_UINT_8( 0x54, 0x8E, 0xED, 0x2D, 0x13, 0x45, 0x77, 0xC2 ),
  14600. BYTES_TO_T_UINT_8( 0xC9, 0x1D, 0x61, 0x14, 0x1A, 0x46, 0xF8, 0x97 ),
  14601. BYTES_TO_T_UINT_8( 0xFD, 0xC4, 0xDA, 0xC3, 0x35, 0xF8, 0x7E, 0x54 ),
  14602. };
  14603. static const mbedtls_mpi_uint brainpoolP256r1_n[] = {
  14604. BYTES_TO_T_UINT_8( 0xA7, 0x56, 0x48, 0x97, 0x82, 0x0E, 0x1E, 0x90 ),
  14605. BYTES_TO_T_UINT_8( 0xF7, 0xA6, 0x61, 0xB5, 0xA3, 0x7A, 0x39, 0x8C ),
  14606. BYTES_TO_T_UINT_8( 0x71, 0x8D, 0x83, 0x9D, 0x90, 0x0A, 0x66, 0x3E ),
  14607. BYTES_TO_T_UINT_8( 0xBC, 0xA9, 0xEE, 0xA1, 0xDB, 0x57, 0xFB, 0xA9 ),
  14608. };
  14609. #endif /* MBEDTLS_ECP_DP_BP256R1_ENABLED */
  14610. /*
  14611. * Domain parameters for brainpoolP384r1 (RFC 5639 3.6)
  14612. */
  14613. #if defined(MBEDTLS_ECP_DP_BP384R1_ENABLED)
  14614. static const mbedtls_mpi_uint brainpoolP384r1_p[] = {
  14615. BYTES_TO_T_UINT_8( 0x53, 0xEC, 0x07, 0x31, 0x13, 0x00, 0x47, 0x87 ),
  14616. BYTES_TO_T_UINT_8( 0x71, 0x1A, 0x1D, 0x90, 0x29, 0xA7, 0xD3, 0xAC ),
  14617. BYTES_TO_T_UINT_8( 0x23, 0x11, 0xB7, 0x7F, 0x19, 0xDA, 0xB1, 0x12 ),
  14618. BYTES_TO_T_UINT_8( 0xB4, 0x56, 0x54, 0xED, 0x09, 0x71, 0x2F, 0x15 ),
  14619. BYTES_TO_T_UINT_8( 0xDF, 0x41, 0xE6, 0x50, 0x7E, 0x6F, 0x5D, 0x0F ),
  14620. BYTES_TO_T_UINT_8( 0x28, 0x6D, 0x38, 0xA3, 0x82, 0x1E, 0xB9, 0x8C ),
  14621. };
  14622. static const mbedtls_mpi_uint brainpoolP384r1_a[] = {
  14623. BYTES_TO_T_UINT_8( 0x26, 0x28, 0xCE, 0x22, 0xDD, 0xC7, 0xA8, 0x04 ),
  14624. BYTES_TO_T_UINT_8( 0xEB, 0xD4, 0x3A, 0x50, 0x4A, 0x81, 0xA5, 0x8A ),
  14625. BYTES_TO_T_UINT_8( 0x0F, 0xF9, 0x91, 0xBA, 0xEF, 0x65, 0x91, 0x13 ),
  14626. BYTES_TO_T_UINT_8( 0x87, 0x27, 0xB2, 0x4F, 0x8E, 0xA2, 0xBE, 0xC2 ),
  14627. BYTES_TO_T_UINT_8( 0xA0, 0xAF, 0x05, 0xCE, 0x0A, 0x08, 0x72, 0x3C ),
  14628. BYTES_TO_T_UINT_8( 0x0C, 0x15, 0x8C, 0x3D, 0xC6, 0x82, 0xC3, 0x7B ),
  14629. };
  14630. static const mbedtls_mpi_uint brainpoolP384r1_b[] = {
  14631. BYTES_TO_T_UINT_8( 0x11, 0x4C, 0x50, 0xFA, 0x96, 0x86, 0xB7, 0x3A ),
  14632. BYTES_TO_T_UINT_8( 0x94, 0xC9, 0xDB, 0x95, 0x02, 0x39, 0xB4, 0x7C ),
  14633. BYTES_TO_T_UINT_8( 0xD5, 0x62, 0xEB, 0x3E, 0xA5, 0x0E, 0x88, 0x2E ),
  14634. BYTES_TO_T_UINT_8( 0xA6, 0xD2, 0xDC, 0x07, 0xE1, 0x7D, 0xB7, 0x2F ),
  14635. BYTES_TO_T_UINT_8( 0x7C, 0x44, 0xF0, 0x16, 0x54, 0xB5, 0x39, 0x8B ),
  14636. BYTES_TO_T_UINT_8( 0x26, 0x28, 0xCE, 0x22, 0xDD, 0xC7, 0xA8, 0x04 ),
  14637. };
  14638. static const mbedtls_mpi_uint brainpoolP384r1_gx[] = {
  14639. BYTES_TO_T_UINT_8( 0x1E, 0xAF, 0xD4, 0x47, 0xE2, 0xB2, 0x87, 0xEF ),
  14640. BYTES_TO_T_UINT_8( 0xAA, 0x46, 0xD6, 0x36, 0x34, 0xE0, 0x26, 0xE8 ),
  14641. BYTES_TO_T_UINT_8( 0xE8, 0x10, 0xBD, 0x0C, 0xFE, 0xCA, 0x7F, 0xDB ),
  14642. BYTES_TO_T_UINT_8( 0xE3, 0x4F, 0xF1, 0x7E, 0xE7, 0xA3, 0x47, 0x88 ),
  14643. BYTES_TO_T_UINT_8( 0x6B, 0x3F, 0xC1, 0xB7, 0x81, 0x3A, 0xA6, 0xA2 ),
  14644. BYTES_TO_T_UINT_8( 0xFF, 0x45, 0xCF, 0x68, 0xF0, 0x64, 0x1C, 0x1D ),
  14645. };
  14646. static const mbedtls_mpi_uint brainpoolP384r1_gy[] = {
  14647. BYTES_TO_T_UINT_8( 0x15, 0x53, 0x3C, 0x26, 0x41, 0x03, 0x82, 0x42 ),
  14648. BYTES_TO_T_UINT_8( 0x11, 0x81, 0x91, 0x77, 0x21, 0x46, 0x46, 0x0E ),
  14649. BYTES_TO_T_UINT_8( 0x28, 0x29, 0x91, 0xF9, 0x4F, 0x05, 0x9C, 0xE1 ),
  14650. BYTES_TO_T_UINT_8( 0x64, 0x58, 0xEC, 0xFE, 0x29, 0x0B, 0xB7, 0x62 ),
  14651. BYTES_TO_T_UINT_8( 0x52, 0xD5, 0xCF, 0x95, 0x8E, 0xEB, 0xB1, 0x5C ),
  14652. BYTES_TO_T_UINT_8( 0xA4, 0xC2, 0xF9, 0x20, 0x75, 0x1D, 0xBE, 0x8A ),
  14653. };
  14654. static const mbedtls_mpi_uint brainpoolP384r1_n[] = {
  14655. BYTES_TO_T_UINT_8( 0x65, 0x65, 0x04, 0xE9, 0x02, 0x32, 0x88, 0x3B ),
  14656. BYTES_TO_T_UINT_8( 0x10, 0xC3, 0x7F, 0x6B, 0xAF, 0xB6, 0x3A, 0xCF ),
  14657. BYTES_TO_T_UINT_8( 0xA7, 0x25, 0x04, 0xAC, 0x6C, 0x6E, 0x16, 0x1F ),
  14658. BYTES_TO_T_UINT_8( 0xB3, 0x56, 0x54, 0xED, 0x09, 0x71, 0x2F, 0x15 ),
  14659. BYTES_TO_T_UINT_8( 0xDF, 0x41, 0xE6, 0x50, 0x7E, 0x6F, 0x5D, 0x0F ),
  14660. BYTES_TO_T_UINT_8( 0x28, 0x6D, 0x38, 0xA3, 0x82, 0x1E, 0xB9, 0x8C ),
  14661. };
  14662. #endif /* MBEDTLS_ECP_DP_BP384R1_ENABLED */
  14663. /*
  14664. * Domain parameters for brainpoolP512r1 (RFC 5639 3.7)
  14665. */
  14666. #if defined(MBEDTLS_ECP_DP_BP512R1_ENABLED)
  14667. static const mbedtls_mpi_uint brainpoolP512r1_p[] = {
  14668. BYTES_TO_T_UINT_8( 0xF3, 0x48, 0x3A, 0x58, 0x56, 0x60, 0xAA, 0x28 ),
  14669. BYTES_TO_T_UINT_8( 0x85, 0xC6, 0x82, 0x2D, 0x2F, 0xFF, 0x81, 0x28 ),
  14670. BYTES_TO_T_UINT_8( 0xE6, 0x80, 0xA3, 0xE6, 0x2A, 0xA1, 0xCD, 0xAE ),
  14671. BYTES_TO_T_UINT_8( 0x42, 0x68, 0xC6, 0x9B, 0x00, 0x9B, 0x4D, 0x7D ),
  14672. BYTES_TO_T_UINT_8( 0x71, 0x08, 0x33, 0x70, 0xCA, 0x9C, 0x63, 0xD6 ),
  14673. BYTES_TO_T_UINT_8( 0x0E, 0xD2, 0xC9, 0xB3, 0xB3, 0x8D, 0x30, 0xCB ),
  14674. BYTES_TO_T_UINT_8( 0x07, 0xFC, 0xC9, 0x33, 0xAE, 0xE6, 0xD4, 0x3F ),
  14675. BYTES_TO_T_UINT_8( 0x8B, 0xC4, 0xE9, 0xDB, 0xB8, 0x9D, 0xDD, 0xAA ),
  14676. };
  14677. static const mbedtls_mpi_uint brainpoolP512r1_a[] = {
  14678. BYTES_TO_T_UINT_8( 0xCA, 0x94, 0xFC, 0x77, 0x4D, 0xAC, 0xC1, 0xE7 ),
  14679. BYTES_TO_T_UINT_8( 0xB9, 0xC7, 0xF2, 0x2B, 0xA7, 0x17, 0x11, 0x7F ),
  14680. BYTES_TO_T_UINT_8( 0xB5, 0xC8, 0x9A, 0x8B, 0xC9, 0xF1, 0x2E, 0x0A ),
  14681. BYTES_TO_T_UINT_8( 0xA1, 0x3A, 0x25, 0xA8, 0x5A, 0x5D, 0xED, 0x2D ),
  14682. BYTES_TO_T_UINT_8( 0xBC, 0x63, 0x98, 0xEA, 0xCA, 0x41, 0x34, 0xA8 ),
  14683. BYTES_TO_T_UINT_8( 0x10, 0x16, 0xF9, 0x3D, 0x8D, 0xDD, 0xCB, 0x94 ),
  14684. BYTES_TO_T_UINT_8( 0xC5, 0x4C, 0x23, 0xAC, 0x45, 0x71, 0x32, 0xE2 ),
  14685. BYTES_TO_T_UINT_8( 0x89, 0x3B, 0x60, 0x8B, 0x31, 0xA3, 0x30, 0x78 ),
  14686. };
  14687. static const mbedtls_mpi_uint brainpoolP512r1_b[] = {
  14688. BYTES_TO_T_UINT_8( 0x23, 0xF7, 0x16, 0x80, 0x63, 0xBD, 0x09, 0x28 ),
  14689. BYTES_TO_T_UINT_8( 0xDD, 0xE5, 0xBA, 0x5E, 0xB7, 0x50, 0x40, 0x98 ),
  14690. BYTES_TO_T_UINT_8( 0x67, 0x3E, 0x08, 0xDC, 0xCA, 0x94, 0xFC, 0x77 ),
  14691. BYTES_TO_T_UINT_8( 0x4D, 0xAC, 0xC1, 0xE7, 0xB9, 0xC7, 0xF2, 0x2B ),
  14692. BYTES_TO_T_UINT_8( 0xA7, 0x17, 0x11, 0x7F, 0xB5, 0xC8, 0x9A, 0x8B ),
  14693. BYTES_TO_T_UINT_8( 0xC9, 0xF1, 0x2E, 0x0A, 0xA1, 0x3A, 0x25, 0xA8 ),
  14694. BYTES_TO_T_UINT_8( 0x5A, 0x5D, 0xED, 0x2D, 0xBC, 0x63, 0x98, 0xEA ),
  14695. BYTES_TO_T_UINT_8( 0xCA, 0x41, 0x34, 0xA8, 0x10, 0x16, 0xF9, 0x3D ),
  14696. };
  14697. static const mbedtls_mpi_uint brainpoolP512r1_gx[] = {
  14698. BYTES_TO_T_UINT_8( 0x22, 0xF8, 0xB9, 0xBC, 0x09, 0x22, 0x35, 0x8B ),
  14699. BYTES_TO_T_UINT_8( 0x68, 0x5E, 0x6A, 0x40, 0x47, 0x50, 0x6D, 0x7C ),
  14700. BYTES_TO_T_UINT_8( 0x5F, 0x7D, 0xB9, 0x93, 0x7B, 0x68, 0xD1, 0x50 ),
  14701. BYTES_TO_T_UINT_8( 0x8D, 0xD4, 0xD0, 0xE2, 0x78, 0x1F, 0x3B, 0xFF ),
  14702. BYTES_TO_T_UINT_8( 0x8E, 0x09, 0xD0, 0xF4, 0xEE, 0x62, 0x3B, 0xB4 ),
  14703. BYTES_TO_T_UINT_8( 0xC1, 0x16, 0xD9, 0xB5, 0x70, 0x9F, 0xED, 0x85 ),
  14704. BYTES_TO_T_UINT_8( 0x93, 0x6A, 0x4C, 0x9C, 0x2E, 0x32, 0x21, 0x5A ),
  14705. BYTES_TO_T_UINT_8( 0x64, 0xD9, 0x2E, 0xD8, 0xBD, 0xE4, 0xAE, 0x81 ),
  14706. };
  14707. static const mbedtls_mpi_uint brainpoolP512r1_gy[] = {
  14708. BYTES_TO_T_UINT_8( 0x92, 0x08, 0xD8, 0x3A, 0x0F, 0x1E, 0xCD, 0x78 ),
  14709. BYTES_TO_T_UINT_8( 0x06, 0x54, 0xF0, 0xA8, 0x2F, 0x2B, 0xCA, 0xD1 ),
  14710. BYTES_TO_T_UINT_8( 0xAE, 0x63, 0x27, 0x8A, 0xD8, 0x4B, 0xCA, 0x5B ),
  14711. BYTES_TO_T_UINT_8( 0x5E, 0x48, 0x5F, 0x4A, 0x49, 0xDE, 0xDC, 0xB2 ),
  14712. BYTES_TO_T_UINT_8( 0x11, 0x81, 0x1F, 0x88, 0x5B, 0xC5, 0x00, 0xA0 ),
  14713. BYTES_TO_T_UINT_8( 0x1A, 0x7B, 0xA5, 0x24, 0x00, 0xF7, 0x09, 0xF2 ),
  14714. BYTES_TO_T_UINT_8( 0xFD, 0x22, 0x78, 0xCF, 0xA9, 0xBF, 0xEA, 0xC0 ),
  14715. BYTES_TO_T_UINT_8( 0xEC, 0x32, 0x63, 0x56, 0x5D, 0x38, 0xDE, 0x7D ),
  14716. };
  14717. static const mbedtls_mpi_uint brainpoolP512r1_n[] = {
  14718. BYTES_TO_T_UINT_8( 0x69, 0x00, 0xA9, 0x9C, 0x82, 0x96, 0x87, 0xB5 ),
  14719. BYTES_TO_T_UINT_8( 0xDD, 0xDA, 0x5D, 0x08, 0x81, 0xD3, 0xB1, 0x1D ),
  14720. BYTES_TO_T_UINT_8( 0x47, 0x10, 0xAC, 0x7F, 0x19, 0x61, 0x86, 0x41 ),
  14721. BYTES_TO_T_UINT_8( 0x19, 0x26, 0xA9, 0x4C, 0x41, 0x5C, 0x3E, 0x55 ),
  14722. BYTES_TO_T_UINT_8( 0x70, 0x08, 0x33, 0x70, 0xCA, 0x9C, 0x63, 0xD6 ),
  14723. BYTES_TO_T_UINT_8( 0x0E, 0xD2, 0xC9, 0xB3, 0xB3, 0x8D, 0x30, 0xCB ),
  14724. BYTES_TO_T_UINT_8( 0x07, 0xFC, 0xC9, 0x33, 0xAE, 0xE6, 0xD4, 0x3F ),
  14725. BYTES_TO_T_UINT_8( 0x8B, 0xC4, 0xE9, 0xDB, 0xB8, 0x9D, 0xDD, 0xAA ),
  14726. };
  14727. #endif /* MBEDTLS_ECP_DP_BP512R1_ENABLED */
  14728. /*
  14729. * Create an MPI from embedded constants
  14730. * (assumes len is an exact multiple of sizeof mbedtls_mpi_uint)
  14731. */
  14732. static inline void ecp_mpi_load( mbedtls_mpi *X, const mbedtls_mpi_uint *p, size_t len )
  14733. {
  14734. X->s = 1;
  14735. X->n = len / sizeof( mbedtls_mpi_uint );
  14736. X->p = (mbedtls_mpi_uint *) p;
  14737. }
  14738. /*
  14739. * Set an MPI to static value 1
  14740. */
  14741. static inline void ecp_mpi_set1( mbedtls_mpi *X )
  14742. {
  14743. static mbedtls_mpi_uint one[] = { 1 };
  14744. X->s = 1;
  14745. X->n = 1;
  14746. X->p = one;
  14747. }
  14748. /*
  14749. * Make group available from embedded constants
  14750. */
  14751. static int ecp_group_load( mbedtls_ecp_group *grp,
  14752. const mbedtls_mpi_uint *p, size_t plen,
  14753. const mbedtls_mpi_uint *a, size_t alen,
  14754. const mbedtls_mpi_uint *b, size_t blen,
  14755. const mbedtls_mpi_uint *gx, size_t gxlen,
  14756. const mbedtls_mpi_uint *gy, size_t gylen,
  14757. const mbedtls_mpi_uint *n, size_t nlen)
  14758. {
  14759. ecp_mpi_load( &grp->P, p, plen );
  14760. if( a != NULL )
  14761. ecp_mpi_load( &grp->A, a, alen );
  14762. ecp_mpi_load( &grp->B, b, blen );
  14763. ecp_mpi_load( &grp->N, n, nlen );
  14764. ecp_mpi_load( &grp->G.X, gx, gxlen );
  14765. ecp_mpi_load( &grp->G.Y, gy, gylen );
  14766. ecp_mpi_set1( &grp->G.Z );
  14767. grp->pbits = mbedtls_mpi_bitlen( &grp->P );
  14768. grp->nbits = mbedtls_mpi_bitlen( &grp->N );
  14769. grp->h = 1;
  14770. return( 0 );
  14771. }
  14772. #if defined(MBEDTLS_ECP_NIST_OPTIM)
  14773. /* Forward declarations */
  14774. #if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED)
  14775. static int ecp_mod_p192( mbedtls_mpi * );
  14776. #endif
  14777. #if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED)
  14778. static int ecp_mod_p224( mbedtls_mpi * );
  14779. #endif
  14780. #if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED)
  14781. static int ecp_mod_p256( mbedtls_mpi * );
  14782. #endif
  14783. #if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED)
  14784. static int ecp_mod_p384( mbedtls_mpi * );
  14785. #endif
  14786. #if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED)
  14787. static int ecp_mod_p521( mbedtls_mpi * );
  14788. #endif
  14789. #define NIST_MODP( P ) grp->modp = ecp_mod_ ## P;
  14790. #else
  14791. #define NIST_MODP( P )
  14792. #endif /* MBEDTLS_ECP_NIST_OPTIM */
  14793. /* Additional forward declarations */
  14794. #if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED)
  14795. static int ecp_mod_p255( mbedtls_mpi * );
  14796. #endif
  14797. #if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED)
  14798. static int ecp_mod_p192k1( mbedtls_mpi * );
  14799. #endif
  14800. #if defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED)
  14801. static int ecp_mod_p224k1( mbedtls_mpi * );
  14802. #endif
  14803. #if defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED)
  14804. static int ecp_mod_p256k1( mbedtls_mpi * );
  14805. #endif
  14806. #define LOAD_GROUP_A( G ) ecp_group_load( grp, \
  14807. G ## _p, sizeof( G ## _p ), \
  14808. G ## _a, sizeof( G ## _a ), \
  14809. G ## _b, sizeof( G ## _b ), \
  14810. G ## _gx, sizeof( G ## _gx ), \
  14811. G ## _gy, sizeof( G ## _gy ), \
  14812. G ## _n, sizeof( G ## _n ) )
  14813. #define LOAD_GROUP( G ) ecp_group_load( grp, \
  14814. G ## _p, sizeof( G ## _p ), \
  14815. NULL, 0, \
  14816. G ## _b, sizeof( G ## _b ), \
  14817. G ## _gx, sizeof( G ## _gx ), \
  14818. G ## _gy, sizeof( G ## _gy ), \
  14819. G ## _n, sizeof( G ## _n ) )
  14820. #if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED)
  14821. /*
  14822. * Specialized function for creating the Curve25519 group
  14823. */
  14824. static int ecp_use_curve25519( mbedtls_ecp_group *grp )
  14825. {
  14826. int ret;
  14827. /* Actually ( A + 2 ) / 4 */
  14828. MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &grp->A, 16, "01DB42" ) );
  14829. /* P = 2^255 - 19 */
  14830. MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &grp->P, 1 ) );
  14831. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &grp->P, 255 ) );
  14832. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &grp->P, &grp->P, 19 ) );
  14833. grp->pbits = mbedtls_mpi_bitlen( &grp->P );
  14834. /* Y intentionaly not set, since we use x/z coordinates.
  14835. * This is used as a marker to identify Montgomery curves! */
  14836. MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &grp->G.X, 9 ) );
  14837. MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &grp->G.Z, 1 ) );
  14838. mbedtls_mpi_free( &grp->G.Y );
  14839. /* Actually, the required msb for private keys */
  14840. grp->nbits = 254;
  14841. cleanup:
  14842. if( ret != 0 )
  14843. mbedtls_ecp_group_free( grp );
  14844. return( ret );
  14845. }
  14846. #endif /* MBEDTLS_ECP_DP_CURVE25519_ENABLED */
  14847. /*
  14848. * Set a group using well-known domain parameters
  14849. */
  14850. int mbedtls_ecp_group_load( mbedtls_ecp_group *grp, mbedtls_ecp_group_id id )
  14851. {
  14852. mbedtls_ecp_group_free( grp );
  14853. grp->id = id;
  14854. switch( id )
  14855. {
  14856. #if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED)
  14857. case MBEDTLS_ECP_DP_SECP192R1:
  14858. NIST_MODP( p192 );
  14859. return( LOAD_GROUP( secp192r1 ) );
  14860. #endif /* MBEDTLS_ECP_DP_SECP192R1_ENABLED */
  14861. #if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED)
  14862. case MBEDTLS_ECP_DP_SECP224R1:
  14863. NIST_MODP( p224 );
  14864. return( LOAD_GROUP( secp224r1 ) );
  14865. #endif /* MBEDTLS_ECP_DP_SECP224R1_ENABLED */
  14866. #if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED)
  14867. case MBEDTLS_ECP_DP_SECP256R1:
  14868. NIST_MODP( p256 );
  14869. return( LOAD_GROUP( secp256r1 ) );
  14870. #endif /* MBEDTLS_ECP_DP_SECP256R1_ENABLED */
  14871. #if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED)
  14872. case MBEDTLS_ECP_DP_SECP384R1:
  14873. NIST_MODP( p384 );
  14874. return( LOAD_GROUP( secp384r1 ) );
  14875. #endif /* MBEDTLS_ECP_DP_SECP384R1_ENABLED */
  14876. #if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED)
  14877. case MBEDTLS_ECP_DP_SECP521R1:
  14878. NIST_MODP( p521 );
  14879. return( LOAD_GROUP( secp521r1 ) );
  14880. #endif /* MBEDTLS_ECP_DP_SECP521R1_ENABLED */
  14881. #if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED)
  14882. case MBEDTLS_ECP_DP_SECP192K1:
  14883. grp->modp = ecp_mod_p192k1;
  14884. return( LOAD_GROUP_A( secp192k1 ) );
  14885. #endif /* MBEDTLS_ECP_DP_SECP192K1_ENABLED */
  14886. #if defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED)
  14887. case MBEDTLS_ECP_DP_SECP224K1:
  14888. grp->modp = ecp_mod_p224k1;
  14889. return( LOAD_GROUP_A( secp224k1 ) );
  14890. #endif /* MBEDTLS_ECP_DP_SECP224K1_ENABLED */
  14891. #if defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED)
  14892. case MBEDTLS_ECP_DP_SECP256K1:
  14893. grp->modp = ecp_mod_p256k1;
  14894. return( LOAD_GROUP_A( secp256k1 ) );
  14895. #endif /* MBEDTLS_ECP_DP_SECP256K1_ENABLED */
  14896. #if defined(MBEDTLS_ECP_DP_BP256R1_ENABLED)
  14897. case MBEDTLS_ECP_DP_BP256R1:
  14898. return( LOAD_GROUP_A( brainpoolP256r1 ) );
  14899. #endif /* MBEDTLS_ECP_DP_BP256R1_ENABLED */
  14900. #if defined(MBEDTLS_ECP_DP_BP384R1_ENABLED)
  14901. case MBEDTLS_ECP_DP_BP384R1:
  14902. return( LOAD_GROUP_A( brainpoolP384r1 ) );
  14903. #endif /* MBEDTLS_ECP_DP_BP384R1_ENABLED */
  14904. #if defined(MBEDTLS_ECP_DP_BP512R1_ENABLED)
  14905. case MBEDTLS_ECP_DP_BP512R1:
  14906. return( LOAD_GROUP_A( brainpoolP512r1 ) );
  14907. #endif /* MBEDTLS_ECP_DP_BP512R1_ENABLED */
  14908. #if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED)
  14909. case MBEDTLS_ECP_DP_CURVE25519:
  14910. grp->modp = ecp_mod_p255;
  14911. return( ecp_use_curve25519( grp ) );
  14912. #endif /* MBEDTLS_ECP_DP_CURVE25519_ENABLED */
  14913. default:
  14914. mbedtls_ecp_group_free( grp );
  14915. return( MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE );
  14916. }
  14917. }
  14918. #if defined(MBEDTLS_ECP_NIST_OPTIM)
  14919. /*
  14920. * Fast reduction modulo the primes used by the NIST curves.
  14921. *
  14922. * These functions are critical for speed, but not needed for correct
  14923. * operations. So, we make the choice to heavily rely on the internals of our
  14924. * bignum library, which creates a tight coupling between these functions and
  14925. * our MPI implementation. However, the coupling between the ECP module and
  14926. * MPI remains loose, since these functions can be deactivated at will.
  14927. */
  14928. #if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED)
  14929. /*
  14930. * Compared to the way things are presented in FIPS 186-3 D.2,
  14931. * we proceed in columns, from right (least significant chunk) to left,
  14932. * adding chunks to N in place, and keeping a carry for the next chunk.
  14933. * This avoids moving things around in memory, and uselessly adding zeros,
  14934. * compared to the more straightforward, line-oriented approach.
  14935. *
  14936. * For this prime we need to handle data in chunks of 64 bits.
  14937. * Since this is always a multiple of our basic mbedtls_mpi_uint, we can
  14938. * use a mbedtls_mpi_uint * to designate such a chunk, and small loops to handle it.
  14939. */
  14940. /* Add 64-bit chunks (dst += src) and update carry */
  14941. static inline void add64( mbedtls_mpi_uint *dst, mbedtls_mpi_uint *src, mbedtls_mpi_uint *carry )
  14942. {
  14943. unsigned char i;
  14944. mbedtls_mpi_uint c = 0;
  14945. for( i = 0; i < 8 / sizeof( mbedtls_mpi_uint ); i++, dst++, src++ )
  14946. {
  14947. *dst += c; c = ( *dst < c );
  14948. *dst += *src; c += ( *dst < *src );
  14949. }
  14950. *carry += c;
  14951. }
  14952. /* Add carry to a 64-bit chunk and update carry */
  14953. static inline void carry64( mbedtls_mpi_uint *dst, mbedtls_mpi_uint *carry )
  14954. {
  14955. unsigned char i;
  14956. for( i = 0; i < 8 / sizeof( mbedtls_mpi_uint ); i++, dst++ )
  14957. {
  14958. *dst += *carry;
  14959. *carry = ( *dst < *carry );
  14960. }
  14961. }
  14962. #define WIDTH 8 / sizeof( mbedtls_mpi_uint )
  14963. #define A( i ) N->p + i * WIDTH
  14964. #define ADD( i ) add64( p, A( i ), &c )
  14965. #define NEXT p += WIDTH; carry64( p, &c )
  14966. #define LAST p += WIDTH; *p = c; while( ++p < end ) *p = 0
  14967. /*
  14968. * Fast quasi-reduction modulo p192 (FIPS 186-3 D.2.1)
  14969. */
  14970. static int ecp_mod_p192( mbedtls_mpi *N )
  14971. {
  14972. int ret;
  14973. mbedtls_mpi_uint c = 0;
  14974. mbedtls_mpi_uint *p, *end;
  14975. /* Make sure we have enough blocks so that A(5) is legal */
  14976. MBEDTLS_MPI_CHK( mbedtls_mpi_grow( N, 6 * WIDTH ) );
  14977. p = N->p;
  14978. end = p + N->n;
  14979. ADD( 3 ); ADD( 5 ); NEXT; // A0 += A3 + A5
  14980. ADD( 3 ); ADD( 4 ); ADD( 5 ); NEXT; // A1 += A3 + A4 + A5
  14981. ADD( 4 ); ADD( 5 ); LAST; // A2 += A4 + A5
  14982. cleanup:
  14983. return( ret );
  14984. }
  14985. #undef WIDTH
  14986. #undef A
  14987. #undef ADD
  14988. #undef NEXT
  14989. #undef LAST
  14990. #endif /* MBEDTLS_ECP_DP_SECP192R1_ENABLED */
  14991. #if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) || \
  14992. defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) || \
  14993. defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED)
  14994. /*
  14995. * The reader is advised to first understand ecp_mod_p192() since the same
  14996. * general structure is used here, but with additional complications:
  14997. * (1) chunks of 32 bits, and (2) subtractions.
  14998. */
  14999. /*
  15000. * For these primes, we need to handle data in chunks of 32 bits.
  15001. * This makes it more complicated if we use 64 bits limbs in MPI,
  15002. * which prevents us from using a uniform access method as for p192.
  15003. *
  15004. * So, we define a mini abstraction layer to access 32 bit chunks,
  15005. * load them in 'cur' for work, and store them back from 'cur' when done.
  15006. *
  15007. * While at it, also define the size of N in terms of 32-bit chunks.
  15008. */
  15009. #define LOAD32 cur = A( i );
  15010. #if defined(MBEDTLS_HAVE_INT32) /* 32 bit */
  15011. #define MAX32 N->n
  15012. #define A( j ) N->p[j]
  15013. #define STORE32 N->p[i] = cur;
  15014. #else /* 64-bit */
  15015. #define MAX32 N->n * 2
  15016. #define A( j ) j % 2 ? (uint32_t)( N->p[j/2] >> 32 ) : (uint32_t)( N->p[j/2] )
  15017. #define STORE32 \
  15018. if( i % 2 ) { \
  15019. N->p[i/2] &= 0x00000000FFFFFFFF; \
  15020. N->p[i/2] |= ((mbedtls_mpi_uint) cur) << 32; \
  15021. } else { \
  15022. N->p[i/2] &= 0xFFFFFFFF00000000; \
  15023. N->p[i/2] |= (mbedtls_mpi_uint) cur; \
  15024. }
  15025. #endif /* sizeof( mbedtls_mpi_uint ) */
  15026. /*
  15027. * Helpers for addition and subtraction of chunks, with signed carry.
  15028. */
  15029. static inline void add32( uint32_t *dst, uint32_t src, signed char *carry )
  15030. {
  15031. *dst += src;
  15032. *carry += ( *dst < src );
  15033. }
  15034. static inline void sub32( uint32_t *dst, uint32_t src, signed char *carry )
  15035. {
  15036. *carry -= ( *dst < src );
  15037. *dst -= src;
  15038. }
  15039. #define ADD( j ) add32( &cur, A( j ), &c );
  15040. #define SUB( j ) sub32( &cur, A( j ), &c );
  15041. /*
  15042. * Helpers for the main 'loop'
  15043. * (see fix_negative for the motivation of C)
  15044. */
  15045. #define INIT( b ) \
  15046. int ret; \
  15047. signed char c = 0, cc; \
  15048. uint32_t cur; \
  15049. size_t i = 0, bits = b; \
  15050. mbedtls_mpi C; \
  15051. mbedtls_mpi_uint Cp[ b / 8 / sizeof( mbedtls_mpi_uint) + 1 ]; \
  15052. \
  15053. C.s = 1; \
  15054. C.n = b / 8 / sizeof( mbedtls_mpi_uint) + 1; \
  15055. C.p = Cp; \
  15056. memset( Cp, 0, C.n * sizeof( mbedtls_mpi_uint ) ); \
  15057. \
  15058. MBEDTLS_MPI_CHK( mbedtls_mpi_grow( N, b * 2 / 8 / sizeof( mbedtls_mpi_uint ) ) ); \
  15059. LOAD32;
  15060. #define NEXT \
  15061. STORE32; i++; LOAD32; \
  15062. cc = c; c = 0; \
  15063. if( cc < 0 ) \
  15064. sub32( &cur, -cc, &c ); \
  15065. else \
  15066. add32( &cur, cc, &c ); \
  15067. #define LAST \
  15068. STORE32; i++; \
  15069. cur = c > 0 ? c : 0; STORE32; \
  15070. cur = 0; while( ++i < MAX32 ) { STORE32; } \
  15071. if( c < 0 ) fix_negative( N, c, &C, bits );
  15072. /*
  15073. * If the result is negative, we get it in the form
  15074. * c * 2^(bits + 32) + N, with c negative and N positive shorter than 'bits'
  15075. */
  15076. static inline int fix_negative( mbedtls_mpi *N, signed char c, mbedtls_mpi *C, size_t bits )
  15077. {
  15078. int ret;
  15079. /* C = - c * 2^(bits + 32) */
  15080. #if !defined(MBEDTLS_HAVE_INT64)
  15081. ((void) bits);
  15082. #else
  15083. if( bits == 224 )
  15084. C->p[ C->n - 1 ] = ((mbedtls_mpi_uint) -c) << 32;
  15085. else
  15086. #endif
  15087. C->p[ C->n - 1 ] = (mbedtls_mpi_uint) -c;
  15088. /* N = - ( C - N ) */
  15089. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( N, C, N ) );
  15090. N->s = -1;
  15091. cleanup:
  15092. return( ret );
  15093. }
  15094. #if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED)
  15095. /*
  15096. * Fast quasi-reduction modulo p224 (FIPS 186-3 D.2.2)
  15097. */
  15098. static int ecp_mod_p224( mbedtls_mpi *N )
  15099. {
  15100. INIT( 224 );
  15101. SUB( 7 ); SUB( 11 ); NEXT; // A0 += -A7 - A11
  15102. SUB( 8 ); SUB( 12 ); NEXT; // A1 += -A8 - A12
  15103. SUB( 9 ); SUB( 13 ); NEXT; // A2 += -A9 - A13
  15104. SUB( 10 ); ADD( 7 ); ADD( 11 ); NEXT; // A3 += -A10 + A7 + A11
  15105. SUB( 11 ); ADD( 8 ); ADD( 12 ); NEXT; // A4 += -A11 + A8 + A12
  15106. SUB( 12 ); ADD( 9 ); ADD( 13 ); NEXT; // A5 += -A12 + A9 + A13
  15107. SUB( 13 ); ADD( 10 ); LAST; // A6 += -A13 + A10
  15108. cleanup:
  15109. return( ret );
  15110. }
  15111. #endif /* MBEDTLS_ECP_DP_SECP224R1_ENABLED */
  15112. #if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED)
  15113. /*
  15114. * Fast quasi-reduction modulo p256 (FIPS 186-3 D.2.3)
  15115. */
  15116. static int ecp_mod_p256( mbedtls_mpi *N )
  15117. {
  15118. INIT( 256 );
  15119. ADD( 8 ); ADD( 9 );
  15120. SUB( 11 ); SUB( 12 ); SUB( 13 ); SUB( 14 ); NEXT; // A0
  15121. ADD( 9 ); ADD( 10 );
  15122. SUB( 12 ); SUB( 13 ); SUB( 14 ); SUB( 15 ); NEXT; // A1
  15123. ADD( 10 ); ADD( 11 );
  15124. SUB( 13 ); SUB( 14 ); SUB( 15 ); NEXT; // A2
  15125. ADD( 11 ); ADD( 11 ); ADD( 12 ); ADD( 12 ); ADD( 13 );
  15126. SUB( 15 ); SUB( 8 ); SUB( 9 ); NEXT; // A3
  15127. ADD( 12 ); ADD( 12 ); ADD( 13 ); ADD( 13 ); ADD( 14 );
  15128. SUB( 9 ); SUB( 10 ); NEXT; // A4
  15129. ADD( 13 ); ADD( 13 ); ADD( 14 ); ADD( 14 ); ADD( 15 );
  15130. SUB( 10 ); SUB( 11 ); NEXT; // A5
  15131. ADD( 14 ); ADD( 14 ); ADD( 15 ); ADD( 15 ); ADD( 14 ); ADD( 13 );
  15132. SUB( 8 ); SUB( 9 ); NEXT; // A6
  15133. ADD( 15 ); ADD( 15 ); ADD( 15 ); ADD( 8 );
  15134. SUB( 10 ); SUB( 11 ); SUB( 12 ); SUB( 13 ); LAST; // A7
  15135. cleanup:
  15136. return( ret );
  15137. }
  15138. #endif /* MBEDTLS_ECP_DP_SECP256R1_ENABLED */
  15139. #if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED)
  15140. /*
  15141. * Fast quasi-reduction modulo p384 (FIPS 186-3 D.2.4)
  15142. */
  15143. static int ecp_mod_p384( mbedtls_mpi *N )
  15144. {
  15145. INIT( 384 );
  15146. ADD( 12 ); ADD( 21 ); ADD( 20 );
  15147. SUB( 23 ); NEXT; // A0
  15148. ADD( 13 ); ADD( 22 ); ADD( 23 );
  15149. SUB( 12 ); SUB( 20 ); NEXT; // A2
  15150. ADD( 14 ); ADD( 23 );
  15151. SUB( 13 ); SUB( 21 ); NEXT; // A2
  15152. ADD( 15 ); ADD( 12 ); ADD( 20 ); ADD( 21 );
  15153. SUB( 14 ); SUB( 22 ); SUB( 23 ); NEXT; // A3
  15154. ADD( 21 ); ADD( 21 ); ADD( 16 ); ADD( 13 ); ADD( 12 ); ADD( 20 ); ADD( 22 );
  15155. SUB( 15 ); SUB( 23 ); SUB( 23 ); NEXT; // A4
  15156. ADD( 22 ); ADD( 22 ); ADD( 17 ); ADD( 14 ); ADD( 13 ); ADD( 21 ); ADD( 23 );
  15157. SUB( 16 ); NEXT; // A5
  15158. ADD( 23 ); ADD( 23 ); ADD( 18 ); ADD( 15 ); ADD( 14 ); ADD( 22 );
  15159. SUB( 17 ); NEXT; // A6
  15160. ADD( 19 ); ADD( 16 ); ADD( 15 ); ADD( 23 );
  15161. SUB( 18 ); NEXT; // A7
  15162. ADD( 20 ); ADD( 17 ); ADD( 16 );
  15163. SUB( 19 ); NEXT; // A8
  15164. ADD( 21 ); ADD( 18 ); ADD( 17 );
  15165. SUB( 20 ); NEXT; // A9
  15166. ADD( 22 ); ADD( 19 ); ADD( 18 );
  15167. SUB( 21 ); NEXT; // A10
  15168. ADD( 23 ); ADD( 20 ); ADD( 19 );
  15169. SUB( 22 ); LAST; // A11
  15170. cleanup:
  15171. return( ret );
  15172. }
  15173. #endif /* MBEDTLS_ECP_DP_SECP384R1_ENABLED */
  15174. #undef A
  15175. #undef LOAD32
  15176. #undef STORE32
  15177. #undef MAX32
  15178. #undef INIT
  15179. #undef NEXT
  15180. #undef LAST
  15181. #endif /* MBEDTLS_ECP_DP_SECP224R1_ENABLED ||
  15182. MBEDTLS_ECP_DP_SECP256R1_ENABLED ||
  15183. MBEDTLS_ECP_DP_SECP384R1_ENABLED */
  15184. #if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED)
  15185. /*
  15186. * Here we have an actual Mersenne prime, so things are more straightforward.
  15187. * However, chunks are aligned on a 'weird' boundary (521 bits).
  15188. */
  15189. /* Size of p521 in terms of mbedtls_mpi_uint */
  15190. #define P521_WIDTH ( 521 / 8 / sizeof( mbedtls_mpi_uint ) + 1 )
  15191. /* Bits to keep in the most significant mbedtls_mpi_uint */
  15192. #define P521_MASK 0x01FF
  15193. /*
  15194. * Fast quasi-reduction modulo p521 (FIPS 186-3 D.2.5)
  15195. * Write N as A1 + 2^521 A0, return A0 + A1
  15196. */
  15197. static int ecp_mod_p521( mbedtls_mpi *N )
  15198. {
  15199. int ret;
  15200. size_t i;
  15201. mbedtls_mpi M;
  15202. mbedtls_mpi_uint Mp[P521_WIDTH + 1];
  15203. /* Worst case for the size of M is when mbedtls_mpi_uint is 16 bits:
  15204. * we need to hold bits 513 to 1056, which is 34 limbs, that is
  15205. * P521_WIDTH + 1. Otherwise P521_WIDTH is enough. */
  15206. if( N->n < P521_WIDTH )
  15207. return( 0 );
  15208. /* M = A1 */
  15209. M.s = 1;
  15210. M.n = N->n - ( P521_WIDTH - 1 );
  15211. if( M.n > P521_WIDTH + 1 )
  15212. M.n = P521_WIDTH + 1;
  15213. M.p = Mp;
  15214. memcpy( Mp, N->p + P521_WIDTH - 1, M.n * sizeof( mbedtls_mpi_uint ) );
  15215. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &M, 521 % ( 8 * sizeof( mbedtls_mpi_uint ) ) ) );
  15216. /* N = A0 */
  15217. N->p[P521_WIDTH - 1] &= P521_MASK;
  15218. for( i = P521_WIDTH; i < N->n; i++ )
  15219. N->p[i] = 0;
  15220. /* N = A0 + A1 */
  15221. MBEDTLS_MPI_CHK( mbedtls_mpi_add_abs( N, N, &M ) );
  15222. cleanup:
  15223. return( ret );
  15224. }
  15225. #undef P521_WIDTH
  15226. #undef P521_MASK
  15227. #endif /* MBEDTLS_ECP_DP_SECP521R1_ENABLED */
  15228. #endif /* MBEDTLS_ECP_NIST_OPTIM */
  15229. #if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED)
  15230. /* Size of p255 in terms of mbedtls_mpi_uint */
  15231. #define P255_WIDTH ( 255 / 8 / sizeof( mbedtls_mpi_uint ) + 1 )
  15232. /*
  15233. * Fast quasi-reduction modulo p255 = 2^255 - 19
  15234. * Write N as A0 + 2^255 A1, return A0 + 19 * A1
  15235. */
  15236. static int ecp_mod_p255( mbedtls_mpi *N )
  15237. {
  15238. int ret;
  15239. size_t i;
  15240. mbedtls_mpi M;
  15241. mbedtls_mpi_uint Mp[P255_WIDTH + 2];
  15242. if( N->n < P255_WIDTH )
  15243. return( 0 );
  15244. /* M = A1 */
  15245. M.s = 1;
  15246. M.n = N->n - ( P255_WIDTH - 1 );
  15247. if( M.n > P255_WIDTH + 1 )
  15248. M.n = P255_WIDTH + 1;
  15249. M.p = Mp;
  15250. memset( Mp, 0, sizeof Mp );
  15251. memcpy( Mp, N->p + P255_WIDTH - 1, M.n * sizeof( mbedtls_mpi_uint ) );
  15252. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &M, 255 % ( 8 * sizeof( mbedtls_mpi_uint ) ) ) );
  15253. M.n++; /* Make room for multiplication by 19 */
  15254. /* N = A0 */
  15255. MBEDTLS_MPI_CHK( mbedtls_mpi_set_bit( N, 255, 0 ) );
  15256. for( i = P255_WIDTH; i < N->n; i++ )
  15257. N->p[i] = 0;
  15258. /* N = A0 + 19 * A1 */
  15259. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_int( &M, &M, 19 ) );
  15260. MBEDTLS_MPI_CHK( mbedtls_mpi_add_abs( N, N, &M ) );
  15261. cleanup:
  15262. return( ret );
  15263. }
  15264. #endif /* MBEDTLS_ECP_DP_CURVE25519_ENABLED */
  15265. #if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) || \
  15266. defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) || \
  15267. defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED)
  15268. /*
  15269. * Fast quasi-reduction modulo P = 2^s - R,
  15270. * with R about 33 bits, used by the Koblitz curves.
  15271. *
  15272. * Write N as A0 + 2^224 A1, return A0 + R * A1.
  15273. * Actually do two passes, since R is big.
  15274. */
  15275. #define P_KOBLITZ_MAX ( 256 / 8 / sizeof( mbedtls_mpi_uint ) ) // Max limbs in P
  15276. #define P_KOBLITZ_R ( 8 / sizeof( mbedtls_mpi_uint ) ) // Limbs in R
  15277. static inline int ecp_mod_koblitz( mbedtls_mpi *N, mbedtls_mpi_uint *Rp, size_t p_limbs,
  15278. size_t adjust, size_t shift, mbedtls_mpi_uint mask )
  15279. {
  15280. int ret;
  15281. size_t i;
  15282. mbedtls_mpi M, R;
  15283. mbedtls_mpi_uint Mp[P_KOBLITZ_MAX + P_KOBLITZ_R];
  15284. if( N->n < p_limbs )
  15285. return( 0 );
  15286. /* Init R */
  15287. R.s = 1;
  15288. R.p = Rp;
  15289. R.n = P_KOBLITZ_R;
  15290. /* Common setup for M */
  15291. M.s = 1;
  15292. M.p = Mp;
  15293. /* M = A1 */
  15294. M.n = N->n - ( p_limbs - adjust );
  15295. if( M.n > p_limbs + adjust )
  15296. M.n = p_limbs + adjust;
  15297. memset( Mp, 0, sizeof Mp );
  15298. memcpy( Mp, N->p + p_limbs - adjust, M.n * sizeof( mbedtls_mpi_uint ) );
  15299. if( shift != 0 )
  15300. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &M, shift ) );
  15301. M.n += R.n - adjust; /* Make room for multiplication by R */
  15302. /* N = A0 */
  15303. if( mask != 0 )
  15304. N->p[p_limbs - 1] &= mask;
  15305. for( i = p_limbs; i < N->n; i++ )
  15306. N->p[i] = 0;
  15307. /* N = A0 + R * A1 */
  15308. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &M, &M, &R ) );
  15309. MBEDTLS_MPI_CHK( mbedtls_mpi_add_abs( N, N, &M ) );
  15310. /* Second pass */
  15311. /* M = A1 */
  15312. M.n = N->n - ( p_limbs - adjust );
  15313. if( M.n > p_limbs + adjust )
  15314. M.n = p_limbs + adjust;
  15315. memset( Mp, 0, sizeof Mp );
  15316. memcpy( Mp, N->p + p_limbs - adjust, M.n * sizeof( mbedtls_mpi_uint ) );
  15317. if( shift != 0 )
  15318. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &M, shift ) );
  15319. M.n += R.n - adjust; /* Make room for multiplication by R */
  15320. /* N = A0 */
  15321. if( mask != 0 )
  15322. N->p[p_limbs - 1] &= mask;
  15323. for( i = p_limbs; i < N->n; i++ )
  15324. N->p[i] = 0;
  15325. /* N = A0 + R * A1 */
  15326. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &M, &M, &R ) );
  15327. MBEDTLS_MPI_CHK( mbedtls_mpi_add_abs( N, N, &M ) );
  15328. cleanup:
  15329. return( ret );
  15330. }
  15331. #endif /* MBEDTLS_ECP_DP_SECP192K1_ENABLED) ||
  15332. MBEDTLS_ECP_DP_SECP224K1_ENABLED) ||
  15333. MBEDTLS_ECP_DP_SECP256K1_ENABLED) */
  15334. #if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED)
  15335. /*
  15336. * Fast quasi-reduction modulo p192k1 = 2^192 - R,
  15337. * with R = 2^32 + 2^12 + 2^8 + 2^7 + 2^6 + 2^3 + 1 = 0x0100001119
  15338. */
  15339. static int ecp_mod_p192k1( mbedtls_mpi *N )
  15340. {
  15341. static mbedtls_mpi_uint Rp[] = {
  15342. BYTES_TO_T_UINT_8( 0xC9, 0x11, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 ) };
  15343. return( ecp_mod_koblitz( N, Rp, 192 / 8 / sizeof( mbedtls_mpi_uint ), 0, 0, 0 ) );
  15344. }
  15345. #endif /* MBEDTLS_ECP_DP_SECP192K1_ENABLED */
  15346. #if defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED)
  15347. /*
  15348. * Fast quasi-reduction modulo p224k1 = 2^224 - R,
  15349. * with R = 2^32 + 2^12 + 2^11 + 2^9 + 2^7 + 2^4 + 2 + 1 = 0x0100001A93
  15350. */
  15351. static int ecp_mod_p224k1( mbedtls_mpi *N )
  15352. {
  15353. static mbedtls_mpi_uint Rp[] = {
  15354. BYTES_TO_T_UINT_8( 0x93, 0x1A, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 ) };
  15355. #if defined(MBEDTLS_HAVE_INT64)
  15356. return( ecp_mod_koblitz( N, Rp, 4, 1, 32, 0xFFFFFFFF ) );
  15357. #else
  15358. return( ecp_mod_koblitz( N, Rp, 224 / 8 / sizeof( mbedtls_mpi_uint ), 0, 0, 0 ) );
  15359. #endif
  15360. }
  15361. #endif /* MBEDTLS_ECP_DP_SECP224K1_ENABLED */
  15362. #if defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED)
  15363. /*
  15364. * Fast quasi-reduction modulo p256k1 = 2^256 - R,
  15365. * with R = 2^32 + 2^9 + 2^8 + 2^7 + 2^6 + 2^4 + 1 = 0x01000003D1
  15366. */
  15367. static int ecp_mod_p256k1( mbedtls_mpi *N )
  15368. {
  15369. static mbedtls_mpi_uint Rp[] = {
  15370. BYTES_TO_T_UINT_8( 0xD1, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 ) };
  15371. return( ecp_mod_koblitz( N, Rp, 256 / 8 / sizeof( mbedtls_mpi_uint ), 0, 0, 0 ) );
  15372. }
  15373. #endif /* MBEDTLS_ECP_DP_SECP256K1_ENABLED */
  15374. /* Amalgamated Release Mappings */
  15375. #undef ADD
  15376. #endif /* MBEDTLS_ECP_C */
  15377. /********* Start of file library/entropy.c ************/
  15378. /*
  15379. * Entropy accumulator implementation
  15380. *
  15381. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  15382. * SPDX-License-Identifier: Apache-2.0
  15383. *
  15384. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  15385. * not use this file except in compliance with the License.
  15386. * You may obtain a copy of the License at
  15387. *
  15388. * http://www.apache.org/licenses/LICENSE-2.0
  15389. *
  15390. * Unless required by applicable law or agreed to in writing, software
  15391. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  15392. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15393. * See the License for the specific language governing permissions and
  15394. * limitations under the License.
  15395. *
  15396. * This file is part of mbed TLS (https://tls.mbed.org)
  15397. */
  15398. #if !defined(MBEDTLS_CONFIG_FILE)
  15399. #else
  15400. #endif
  15401. #if defined(MBEDTLS_ENTROPY_C)
  15402. #include <string.h>
  15403. #if defined(MBEDTLS_FS_IO)
  15404. #include <stdio.h>
  15405. #endif
  15406. #if defined(MBEDTLS_SELF_TEST)
  15407. #if defined(MBEDTLS_PLATFORM_C)
  15408. #else
  15409. #include <stdio.h>
  15410. #define mbedtls_printf printf
  15411. #endif /* MBEDTLS_PLATFORM_C */
  15412. #endif /* MBEDTLS_SELF_TEST */
  15413. #if defined(MBEDTLS_HAVEGE_C)
  15414. #endif
  15415. /* Implementation that should never be optimized out by the compiler */
  15416. static void entropy_zeroize( void *v, size_t n ) {
  15417. volatile unsigned char *p = v; while( n-- ) *p++ = 0;
  15418. }
  15419. #define ENTROPY_MAX_LOOP 256 /**< Maximum amount to loop before error */
  15420. void mbedtls_entropy_init( mbedtls_entropy_context *ctx )
  15421. {
  15422. memset( ctx, 0, sizeof(mbedtls_entropy_context) );
  15423. #if defined(MBEDTLS_THREADING_C)
  15424. mbedtls_mutex_init( &ctx->mutex );
  15425. #endif
  15426. #if defined(MBEDTLS_ENTROPY_SHA512_ACCUMULATOR)
  15427. mbedtls_sha512_starts( &ctx->accumulator, 0 );
  15428. #else
  15429. mbedtls_sha256_starts( &ctx->accumulator, 0 );
  15430. #endif
  15431. #if defined(MBEDTLS_HAVEGE_C)
  15432. mbedtls_havege_init( &ctx->havege_data );
  15433. #endif
  15434. #if !defined(MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES)
  15435. #if !defined(MBEDTLS_NO_PLATFORM_ENTROPY)
  15436. mbedtls_entropy_add_source( ctx, mbedtls_platform_entropy_poll, NULL,
  15437. MBEDTLS_ENTROPY_MIN_PLATFORM,
  15438. MBEDTLS_ENTROPY_SOURCE_STRONG );
  15439. #endif
  15440. #if defined(MBEDTLS_TIMING_C)
  15441. mbedtls_entropy_add_source( ctx, mbedtls_hardclock_poll, NULL,
  15442. MBEDTLS_ENTROPY_MIN_HARDCLOCK,
  15443. MBEDTLS_ENTROPY_SOURCE_WEAK );
  15444. #endif
  15445. #if defined(MBEDTLS_HAVEGE_C)
  15446. mbedtls_entropy_add_source( ctx, mbedtls_havege_poll, &ctx->havege_data,
  15447. MBEDTLS_ENTROPY_MIN_HAVEGE,
  15448. MBEDTLS_ENTROPY_SOURCE_STRONG );
  15449. #endif
  15450. #if defined(MBEDTLS_ENTROPY_HARDWARE_ALT)
  15451. mbedtls_entropy_add_source( ctx, mbedtls_hardware_poll, NULL,
  15452. MBEDTLS_ENTROPY_MIN_HARDWARE,
  15453. MBEDTLS_ENTROPY_SOURCE_STRONG );
  15454. #endif
  15455. #endif /* MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES */
  15456. }
  15457. void mbedtls_entropy_free( mbedtls_entropy_context *ctx )
  15458. {
  15459. #if defined(MBEDTLS_HAVEGE_C)
  15460. mbedtls_havege_free( &ctx->havege_data );
  15461. #endif
  15462. #if defined(MBEDTLS_THREADING_C)
  15463. mbedtls_mutex_free( &ctx->mutex );
  15464. #endif
  15465. entropy_zeroize( ctx, sizeof( mbedtls_entropy_context ) );
  15466. }
  15467. int mbedtls_entropy_add_source( mbedtls_entropy_context *ctx,
  15468. mbedtls_entropy_f_source_ptr f_source, void *p_source,
  15469. size_t threshold, int strong )
  15470. {
  15471. int index, ret = 0;
  15472. #if defined(MBEDTLS_THREADING_C)
  15473. if( ( ret = mbedtls_mutex_lock( &ctx->mutex ) ) != 0 )
  15474. return( ret );
  15475. #endif
  15476. index = ctx->source_count;
  15477. if( index >= MBEDTLS_ENTROPY_MAX_SOURCES )
  15478. {
  15479. ret = MBEDTLS_ERR_ENTROPY_MAX_SOURCES;
  15480. goto exit;
  15481. }
  15482. ctx->source[index].f_source = f_source;
  15483. ctx->source[index].p_source = p_source;
  15484. ctx->source[index].threshold = threshold;
  15485. ctx->source[index].strong = strong;
  15486. ctx->source_count++;
  15487. exit:
  15488. #if defined(MBEDTLS_THREADING_C)
  15489. if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 )
  15490. return( MBEDTLS_ERR_THREADING_MUTEX_ERROR );
  15491. #endif
  15492. return( ret );
  15493. }
  15494. /*
  15495. * Entropy accumulator update
  15496. */
  15497. static int entropy_update( mbedtls_entropy_context *ctx, unsigned char source_id,
  15498. const unsigned char *data, size_t len )
  15499. {
  15500. unsigned char header[2];
  15501. unsigned char tmp[MBEDTLS_ENTROPY_BLOCK_SIZE];
  15502. size_t use_len = len;
  15503. const unsigned char *p = data;
  15504. if( use_len > MBEDTLS_ENTROPY_BLOCK_SIZE )
  15505. {
  15506. #if defined(MBEDTLS_ENTROPY_SHA512_ACCUMULATOR)
  15507. mbedtls_sha512( data, len, tmp, 0 );
  15508. #else
  15509. mbedtls_sha256( data, len, tmp, 0 );
  15510. #endif
  15511. p = tmp;
  15512. use_len = MBEDTLS_ENTROPY_BLOCK_SIZE;
  15513. }
  15514. header[0] = source_id;
  15515. header[1] = use_len & 0xFF;
  15516. #if defined(MBEDTLS_ENTROPY_SHA512_ACCUMULATOR)
  15517. mbedtls_sha512_update( &ctx->accumulator, header, 2 );
  15518. mbedtls_sha512_update( &ctx->accumulator, p, use_len );
  15519. #else
  15520. mbedtls_sha256_update( &ctx->accumulator, header, 2 );
  15521. mbedtls_sha256_update( &ctx->accumulator, p, use_len );
  15522. #endif
  15523. return( 0 );
  15524. }
  15525. int mbedtls_entropy_update_manual( mbedtls_entropy_context *ctx,
  15526. const unsigned char *data, size_t len )
  15527. {
  15528. int ret;
  15529. #if defined(MBEDTLS_THREADING_C)
  15530. if( ( ret = mbedtls_mutex_lock( &ctx->mutex ) ) != 0 )
  15531. return( ret );
  15532. #endif
  15533. ret = entropy_update( ctx, MBEDTLS_ENTROPY_SOURCE_MANUAL, data, len );
  15534. #if defined(MBEDTLS_THREADING_C)
  15535. if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 )
  15536. return( MBEDTLS_ERR_THREADING_MUTEX_ERROR );
  15537. #endif
  15538. return( ret );
  15539. }
  15540. /*
  15541. * Run through the different sources to add entropy to our accumulator
  15542. */
  15543. static int entropy_gather_internal( mbedtls_entropy_context *ctx )
  15544. {
  15545. int ret, i, have_one_strong = 0;
  15546. unsigned char buf[MBEDTLS_ENTROPY_MAX_GATHER];
  15547. size_t olen;
  15548. if( ctx->source_count == 0 )
  15549. return( MBEDTLS_ERR_ENTROPY_NO_SOURCES_DEFINED );
  15550. /*
  15551. * Run through our entropy sources
  15552. */
  15553. for( i = 0; i < ctx->source_count; i++ )
  15554. {
  15555. if( ctx->source[i].strong == MBEDTLS_ENTROPY_SOURCE_STRONG )
  15556. have_one_strong = 1;
  15557. olen = 0;
  15558. if( ( ret = ctx->source[i].f_source( ctx->source[i].p_source,
  15559. buf, MBEDTLS_ENTROPY_MAX_GATHER, &olen ) ) != 0 )
  15560. {
  15561. return( ret );
  15562. }
  15563. /*
  15564. * Add if we actually gathered something
  15565. */
  15566. if( olen > 0 )
  15567. {
  15568. entropy_update( ctx, (unsigned char) i, buf, olen );
  15569. ctx->source[i].size += olen;
  15570. }
  15571. }
  15572. if( have_one_strong == 0 )
  15573. return( MBEDTLS_ERR_ENTROPY_NO_STRONG_SOURCE );
  15574. return( 0 );
  15575. }
  15576. /*
  15577. * Thread-safe wrapper for entropy_gather_internal()
  15578. */
  15579. int mbedtls_entropy_gather( mbedtls_entropy_context *ctx )
  15580. {
  15581. int ret;
  15582. #if defined(MBEDTLS_THREADING_C)
  15583. if( ( ret = mbedtls_mutex_lock( &ctx->mutex ) ) != 0 )
  15584. return( ret );
  15585. #endif
  15586. ret = entropy_gather_internal( ctx );
  15587. #if defined(MBEDTLS_THREADING_C)
  15588. if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 )
  15589. return( MBEDTLS_ERR_THREADING_MUTEX_ERROR );
  15590. #endif
  15591. return( ret );
  15592. }
  15593. int mbedtls_entropy_func( void *data, unsigned char *output, size_t len )
  15594. {
  15595. int ret, count = 0, i, done;
  15596. mbedtls_entropy_context *ctx = (mbedtls_entropy_context *) data;
  15597. unsigned char buf[MBEDTLS_ENTROPY_BLOCK_SIZE];
  15598. if( len > MBEDTLS_ENTROPY_BLOCK_SIZE )
  15599. return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );
  15600. #if defined(MBEDTLS_THREADING_C)
  15601. if( ( ret = mbedtls_mutex_lock( &ctx->mutex ) ) != 0 )
  15602. return( ret );
  15603. #endif
  15604. /*
  15605. * Always gather extra entropy before a call
  15606. */
  15607. do
  15608. {
  15609. if( count++ > ENTROPY_MAX_LOOP )
  15610. {
  15611. ret = MBEDTLS_ERR_ENTROPY_SOURCE_FAILED;
  15612. goto exit;
  15613. }
  15614. if( ( ret = entropy_gather_internal( ctx ) ) != 0 )
  15615. goto exit;
  15616. done = 1;
  15617. for( i = 0; i < ctx->source_count; i++ )
  15618. if( ctx->source[i].size < ctx->source[i].threshold )
  15619. done = 0;
  15620. }
  15621. while( ! done );
  15622. memset( buf, 0, MBEDTLS_ENTROPY_BLOCK_SIZE );
  15623. #if defined(MBEDTLS_ENTROPY_SHA512_ACCUMULATOR)
  15624. mbedtls_sha512_finish( &ctx->accumulator, buf );
  15625. /*
  15626. * Reset accumulator and counters and recycle existing entropy
  15627. */
  15628. memset( &ctx->accumulator, 0, sizeof( mbedtls_sha512_context ) );
  15629. mbedtls_sha512_starts( &ctx->accumulator, 0 );
  15630. mbedtls_sha512_update( &ctx->accumulator, buf, MBEDTLS_ENTROPY_BLOCK_SIZE );
  15631. /*
  15632. * Perform second SHA-512 on entropy
  15633. */
  15634. mbedtls_sha512( buf, MBEDTLS_ENTROPY_BLOCK_SIZE, buf, 0 );
  15635. #else /* MBEDTLS_ENTROPY_SHA512_ACCUMULATOR */
  15636. mbedtls_sha256_finish( &ctx->accumulator, buf );
  15637. /*
  15638. * Reset accumulator and counters and recycle existing entropy
  15639. */
  15640. memset( &ctx->accumulator, 0, sizeof( mbedtls_sha256_context ) );
  15641. mbedtls_sha256_starts( &ctx->accumulator, 0 );
  15642. mbedtls_sha256_update( &ctx->accumulator, buf, MBEDTLS_ENTROPY_BLOCK_SIZE );
  15643. /*
  15644. * Perform second SHA-256 on entropy
  15645. */
  15646. mbedtls_sha256( buf, MBEDTLS_ENTROPY_BLOCK_SIZE, buf, 0 );
  15647. #endif /* MBEDTLS_ENTROPY_SHA512_ACCUMULATOR */
  15648. for( i = 0; i < ctx->source_count; i++ )
  15649. ctx->source[i].size = 0;
  15650. memcpy( output, buf, len );
  15651. ret = 0;
  15652. exit:
  15653. #if defined(MBEDTLS_THREADING_C)
  15654. if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 )
  15655. return( MBEDTLS_ERR_THREADING_MUTEX_ERROR );
  15656. #endif
  15657. return( ret );
  15658. }
  15659. #if defined(MBEDTLS_FS_IO)
  15660. int mbedtls_entropy_write_seed_file( mbedtls_entropy_context *ctx, const char *path )
  15661. {
  15662. int ret = MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR;
  15663. FILE *f;
  15664. unsigned char buf[MBEDTLS_ENTROPY_BLOCK_SIZE];
  15665. if( ( f = fopen( path, "wb" ) ) == NULL )
  15666. return( MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR );
  15667. if( ( ret = mbedtls_entropy_func( ctx, buf, MBEDTLS_ENTROPY_BLOCK_SIZE ) ) != 0 )
  15668. goto exit;
  15669. if( fwrite( buf, 1, MBEDTLS_ENTROPY_BLOCK_SIZE, f ) != MBEDTLS_ENTROPY_BLOCK_SIZE )
  15670. {
  15671. ret = MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR;
  15672. goto exit;
  15673. }
  15674. ret = 0;
  15675. exit:
  15676. fclose( f );
  15677. return( ret );
  15678. }
  15679. int mbedtls_entropy_update_seed_file( mbedtls_entropy_context *ctx, const char *path )
  15680. {
  15681. FILE *f;
  15682. size_t n;
  15683. unsigned char buf[ MBEDTLS_ENTROPY_MAX_SEED_SIZE ];
  15684. if( ( f = fopen( path, "rb" ) ) == NULL )
  15685. return( MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR );
  15686. fseek( f, 0, SEEK_END );
  15687. n = (size_t) ftell( f );
  15688. fseek( f, 0, SEEK_SET );
  15689. if( n > MBEDTLS_ENTROPY_MAX_SEED_SIZE )
  15690. n = MBEDTLS_ENTROPY_MAX_SEED_SIZE;
  15691. if( fread( buf, 1, n, f ) != n )
  15692. {
  15693. fclose( f );
  15694. return( MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR );
  15695. }
  15696. fclose( f );
  15697. mbedtls_entropy_update_manual( ctx, buf, n );
  15698. return( mbedtls_entropy_write_seed_file( ctx, path ) );
  15699. }
  15700. #endif /* MBEDTLS_FS_IO */
  15701. #if defined(MBEDTLS_SELF_TEST)
  15702. /*
  15703. * Dummy source function
  15704. */
  15705. static int entropy_dummy_source( void *data, unsigned char *output,
  15706. size_t len, size_t *olen )
  15707. {
  15708. ((void) data);
  15709. memset( output, 0x2a, len );
  15710. *olen = len;
  15711. return( 0 );
  15712. }
  15713. /*
  15714. * The actual entropy quality is hard to test, but we can at least
  15715. * test that the functions don't cause errors and write the correct
  15716. * amount of data to buffers.
  15717. */
  15718. int mbedtls_entropy_self_test( int verbose )
  15719. {
  15720. int ret = 0;
  15721. mbedtls_entropy_context ctx;
  15722. unsigned char buf[MBEDTLS_ENTROPY_BLOCK_SIZE] = { 0 };
  15723. unsigned char acc[MBEDTLS_ENTROPY_BLOCK_SIZE] = { 0 };
  15724. size_t i, j;
  15725. if( verbose != 0 )
  15726. mbedtls_printf( " ENTROPY test: " );
  15727. mbedtls_entropy_init( &ctx );
  15728. /* First do a gather to make sure we have default sources */
  15729. if( ( ret = mbedtls_entropy_gather( &ctx ) ) != 0 )
  15730. goto cleanup;
  15731. ret = mbedtls_entropy_add_source( &ctx, entropy_dummy_source, NULL, 16,
  15732. MBEDTLS_ENTROPY_SOURCE_WEAK );
  15733. if( ret != 0 )
  15734. goto cleanup;
  15735. if( ( ret = mbedtls_entropy_update_manual( &ctx, buf, sizeof buf ) ) != 0 )
  15736. goto cleanup;
  15737. /*
  15738. * To test that mbedtls_entropy_func writes correct number of bytes:
  15739. * - use the whole buffer and rely on ASan to detect overruns
  15740. * - collect entropy 8 times and OR the result in an accumulator:
  15741. * any byte should then be 0 with probably 2^(-64), so requiring
  15742. * each of the 32 or 64 bytes to be non-zero has a false failure rate
  15743. * of at most 2^(-58) which is acceptable.
  15744. */
  15745. for( i = 0; i < 8; i++ )
  15746. {
  15747. if( ( ret = mbedtls_entropy_func( &ctx, buf, sizeof( buf ) ) ) != 0 )
  15748. goto cleanup;
  15749. for( j = 0; j < sizeof( buf ); j++ )
  15750. acc[j] |= buf[j];
  15751. }
  15752. for( j = 0; j < sizeof( buf ); j++ )
  15753. {
  15754. if( acc[j] == 0 )
  15755. {
  15756. ret = 1;
  15757. goto cleanup;
  15758. }
  15759. }
  15760. cleanup:
  15761. mbedtls_entropy_free( &ctx );
  15762. if( verbose != 0 )
  15763. {
  15764. if( ret != 0 )
  15765. mbedtls_printf( "failed\n" );
  15766. else
  15767. mbedtls_printf( "passed\n" );
  15768. mbedtls_printf( "\n" );
  15769. }
  15770. return( ret != 0 );
  15771. }
  15772. #endif /* MBEDTLS_SELF_TEST */
  15773. #endif /* MBEDTLS_ENTROPY_C */
  15774. /********* Start of file library/entropy_poll.c ************/
  15775. /*
  15776. * Platform-specific and custom entropy polling functions
  15777. *
  15778. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  15779. * SPDX-License-Identifier: Apache-2.0
  15780. *
  15781. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  15782. * not use this file except in compliance with the License.
  15783. * You may obtain a copy of the License at
  15784. *
  15785. * http://www.apache.org/licenses/LICENSE-2.0
  15786. *
  15787. * Unless required by applicable law or agreed to in writing, software
  15788. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  15789. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15790. * See the License for the specific language governing permissions and
  15791. * limitations under the License.
  15792. *
  15793. * This file is part of mbed TLS (https://tls.mbed.org)
  15794. */
  15795. #if !defined(MBEDTLS_CONFIG_FILE)
  15796. #else
  15797. #endif
  15798. #if defined(MBEDTLS_ENTROPY_C)
  15799. #if defined(MBEDTLS_TIMING_C)
  15800. #include <string.h>
  15801. #endif
  15802. #if defined(MBEDTLS_HAVEGE_C)
  15803. #endif
  15804. #if !defined(MBEDTLS_NO_PLATFORM_ENTROPY)
  15805. #if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32)
  15806. #if !defined(_WIN32_WINNT)
  15807. #define _WIN32_WINNT 0x0400
  15808. #endif
  15809. #include <windows.h>
  15810. #include <wincrypt.h>
  15811. int mbedtls_platform_entropy_poll( void *data, unsigned char *output, size_t len,
  15812. size_t *olen )
  15813. {
  15814. HCRYPTPROV provider;
  15815. ((void) data);
  15816. *olen = 0;
  15817. if( CryptAcquireContext( &provider, NULL, NULL,
  15818. PROV_RSA_FULL, CRYPT_VERIFYCONTEXT ) == FALSE )
  15819. {
  15820. return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );
  15821. }
  15822. if( CryptGenRandom( provider, (DWORD) len, output ) == FALSE )
  15823. return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );
  15824. CryptReleaseContext( provider, 0 );
  15825. *olen = len;
  15826. return( 0 );
  15827. }
  15828. #else /* _WIN32 && !EFIX64 && !EFI32 */
  15829. /*
  15830. * Test for Linux getrandom() support.
  15831. * Since there is no wrapper in the libc yet, use the generic syscall wrapper
  15832. * available in GNU libc and compatible libc's (eg uClibc).
  15833. */
  15834. #if defined(__linux__) && defined(__GLIBC__)
  15835. #include <unistd.h>
  15836. #include <sys/syscall.h>
  15837. #if defined(SYS_getrandom)
  15838. #define HAVE_GETRANDOM
  15839. static int getrandom_wrapper( void *buf, size_t buflen, unsigned int flags )
  15840. {
  15841. /* MemSan cannot understand that the syscall writes to the buffer */
  15842. #if defined(__has_feature)
  15843. #if __has_feature(memory_sanitizer)
  15844. memset( buf, 0, buflen );
  15845. #endif
  15846. #endif
  15847. return( syscall( SYS_getrandom, buf, buflen, flags ) );
  15848. }
  15849. #include <sys/utsname.h>
  15850. /* Check if version is at least 3.17.0 */
  15851. static int check_version_3_17_plus( void )
  15852. {
  15853. int minor;
  15854. struct utsname un;
  15855. const char *ver;
  15856. /* Get version information */
  15857. uname(&un);
  15858. ver = un.release;
  15859. /* Check major version; assume a single digit */
  15860. if( ver[0] < '3' || ver[0] > '9' || ver [1] != '.' )
  15861. return( -1 );
  15862. if( ver[0] - '0' > 3 )
  15863. return( 0 );
  15864. /* Ok, so now we know major == 3, check minor.
  15865. * Assume 1 or 2 digits. */
  15866. if( ver[2] < '0' || ver[2] > '9' )
  15867. return( -1 );
  15868. minor = ver[2] - '0';
  15869. if( ver[3] >= '0' && ver[3] <= '9' )
  15870. minor = 10 * minor + ver[3] - '0';
  15871. else if( ver [3] != '.' )
  15872. return( -1 );
  15873. if( minor < 17 )
  15874. return( -1 );
  15875. return( 0 );
  15876. }
  15877. static int has_getrandom = -1;
  15878. #endif /* SYS_getrandom */
  15879. #endif /* __linux__ */
  15880. #include <stdio.h>
  15881. int mbedtls_platform_entropy_poll( void *data,
  15882. unsigned char *output, size_t len, size_t *olen )
  15883. {
  15884. FILE *file;
  15885. size_t read_len;
  15886. ((void) data);
  15887. #if defined(HAVE_GETRANDOM)
  15888. if( has_getrandom == -1 )
  15889. has_getrandom = ( check_version_3_17_plus() == 0 );
  15890. if( has_getrandom )
  15891. {
  15892. int ret;
  15893. if( ( ret = getrandom_wrapper( output, len, 0 ) ) < 0 )
  15894. return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );
  15895. *olen = ret;
  15896. return( 0 );
  15897. }
  15898. #endif /* HAVE_GETRANDOM */
  15899. *olen = 0;
  15900. file = fopen( "/dev/urandom", "rb" );
  15901. if( file == NULL )
  15902. return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );
  15903. read_len = fread( output, 1, len, file );
  15904. if( read_len != len )
  15905. {
  15906. fclose( file );
  15907. return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );
  15908. }
  15909. fclose( file );
  15910. *olen = len;
  15911. return( 0 );
  15912. }
  15913. #endif /* _WIN32 && !EFIX64 && !EFI32 */
  15914. #endif /* !MBEDTLS_NO_PLATFORM_ENTROPY */
  15915. #if defined(MBEDTLS_TIMING_C)
  15916. int mbedtls_hardclock_poll( void *data,
  15917. unsigned char *output, size_t len, size_t *olen )
  15918. {
  15919. unsigned long timer = mbedtls_timing_hardclock();
  15920. ((void) data);
  15921. *olen = 0;
  15922. if( len < sizeof(unsigned long) )
  15923. return( 0 );
  15924. memcpy( output, &timer, sizeof(unsigned long) );
  15925. *olen = sizeof(unsigned long);
  15926. return( 0 );
  15927. }
  15928. #endif /* MBEDTLS_TIMING_C */
  15929. #if defined(MBEDTLS_HAVEGE_C)
  15930. int mbedtls_havege_poll( void *data,
  15931. unsigned char *output, size_t len, size_t *olen )
  15932. {
  15933. mbedtls_havege_state *hs = (mbedtls_havege_state *) data;
  15934. *olen = 0;
  15935. if( mbedtls_havege_random( hs, output, len ) != 0 )
  15936. return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );
  15937. *olen = len;
  15938. return( 0 );
  15939. }
  15940. #endif /* MBEDTLS_HAVEGE_C */
  15941. #endif /* MBEDTLS_ENTROPY_C */
  15942. /********* Start of file library/error.c ************/
  15943. /*
  15944. * Error message information
  15945. *
  15946. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  15947. * SPDX-License-Identifier: Apache-2.0
  15948. *
  15949. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  15950. * not use this file except in compliance with the License.
  15951. * You may obtain a copy of the License at
  15952. *
  15953. * http://www.apache.org/licenses/LICENSE-2.0
  15954. *
  15955. * Unless required by applicable law or agreed to in writing, software
  15956. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  15957. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15958. * See the License for the specific language governing permissions and
  15959. * limitations under the License.
  15960. *
  15961. * This file is part of mbed TLS (https://tls.mbed.org)
  15962. */
  15963. #if !defined(MBEDTLS_CONFIG_FILE)
  15964. #else
  15965. #endif
  15966. #if defined(MBEDTLS_ERROR_C) || defined(MBEDTLS_ERROR_STRERROR_DUMMY)
  15967. #include <string.h>
  15968. #endif
  15969. #if defined(MBEDTLS_PLATFORM_C)
  15970. #else
  15971. #define mbedtls_snprintf snprintf
  15972. #endif
  15973. #if defined(MBEDTLS_ERROR_C)
  15974. #include <stdio.h>
  15975. #if defined(MBEDTLS_AES_C)
  15976. #endif
  15977. #if defined(MBEDTLS_BASE64_C)
  15978. #endif
  15979. #if defined(MBEDTLS_BIGNUM_C)
  15980. #endif
  15981. #if defined(MBEDTLS_BLOWFISH_C)
  15982. #endif
  15983. #if defined(MBEDTLS_CAMELLIA_C)
  15984. #endif
  15985. #if defined(MBEDTLS_CCM_C)
  15986. #endif
  15987. #if defined(MBEDTLS_CIPHER_C)
  15988. #endif
  15989. #if defined(MBEDTLS_CTR_DRBG_C)
  15990. #endif
  15991. #if defined(MBEDTLS_DES_C)
  15992. #endif
  15993. #if defined(MBEDTLS_DHM_C)
  15994. #endif
  15995. #if defined(MBEDTLS_ECP_C)
  15996. #endif
  15997. #if defined(MBEDTLS_ENTROPY_C)
  15998. #endif
  15999. #if defined(MBEDTLS_GCM_C)
  16000. #endif
  16001. #if defined(MBEDTLS_HMAC_DRBG_C)
  16002. #endif
  16003. #if defined(MBEDTLS_MD_C)
  16004. #endif
  16005. #if defined(MBEDTLS_NET_C)
  16006. #endif
  16007. #if defined(MBEDTLS_OID_C)
  16008. #endif
  16009. #if defined(MBEDTLS_PADLOCK_C)
  16010. #endif
  16011. #if defined(MBEDTLS_PEM_PARSE_C) || defined(MBEDTLS_PEM_WRITE_C)
  16012. #endif
  16013. #if defined(MBEDTLS_PK_C)
  16014. #endif
  16015. #if defined(MBEDTLS_PKCS12_C)
  16016. #endif
  16017. #if defined(MBEDTLS_PKCS5_C)
  16018. #endif
  16019. #if defined(MBEDTLS_RSA_C)
  16020. #endif
  16021. #if defined(MBEDTLS_SSL_TLS_C)
  16022. #endif
  16023. #if defined(MBEDTLS_THREADING_C)
  16024. #endif
  16025. #if defined(MBEDTLS_X509_USE_C) || defined(MBEDTLS_X509_CREATE_C)
  16026. #endif
  16027. #if defined(MBEDTLS_XTEA_C)
  16028. #endif
  16029. void mbedtls_strerror( int ret, char *buf, size_t buflen )
  16030. {
  16031. size_t len;
  16032. int use_ret;
  16033. if( buflen == 0 )
  16034. return;
  16035. memset( buf, 0x00, buflen );
  16036. if( ret < 0 )
  16037. ret = -ret;
  16038. if( ret & 0xFF80 )
  16039. {
  16040. use_ret = ret & 0xFF80;
  16041. // High level error codes
  16042. //
  16043. // BEGIN generated code
  16044. #if defined(MBEDTLS_CIPHER_C)
  16045. if( use_ret == -(MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE) )
  16046. mbedtls_snprintf( buf, buflen, "CIPHER - The selected feature is not available" );
  16047. if( use_ret == -(MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA) )
  16048. mbedtls_snprintf( buf, buflen, "CIPHER - Bad input parameters to function" );
  16049. if( use_ret == -(MBEDTLS_ERR_CIPHER_ALLOC_FAILED) )
  16050. mbedtls_snprintf( buf, buflen, "CIPHER - Failed to allocate memory" );
  16051. if( use_ret == -(MBEDTLS_ERR_CIPHER_INVALID_PADDING) )
  16052. mbedtls_snprintf( buf, buflen, "CIPHER - Input data contains invalid padding and is rejected" );
  16053. if( use_ret == -(MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED) )
  16054. mbedtls_snprintf( buf, buflen, "CIPHER - Decryption of block requires a full block" );
  16055. if( use_ret == -(MBEDTLS_ERR_CIPHER_AUTH_FAILED) )
  16056. mbedtls_snprintf( buf, buflen, "CIPHER - Authentication failed (for AEAD modes)" );
  16057. #endif /* MBEDTLS_CIPHER_C */
  16058. #if defined(MBEDTLS_DHM_C)
  16059. if( use_ret == -(MBEDTLS_ERR_DHM_BAD_INPUT_DATA) )
  16060. mbedtls_snprintf( buf, buflen, "DHM - Bad input parameters to function" );
  16061. if( use_ret == -(MBEDTLS_ERR_DHM_READ_PARAMS_FAILED) )
  16062. mbedtls_snprintf( buf, buflen, "DHM - Reading of the DHM parameters failed" );
  16063. if( use_ret == -(MBEDTLS_ERR_DHM_MAKE_PARAMS_FAILED) )
  16064. mbedtls_snprintf( buf, buflen, "DHM - Making of the DHM parameters failed" );
  16065. if( use_ret == -(MBEDTLS_ERR_DHM_READ_PUBLIC_FAILED) )
  16066. mbedtls_snprintf( buf, buflen, "DHM - Reading of the public values failed" );
  16067. if( use_ret == -(MBEDTLS_ERR_DHM_MAKE_PUBLIC_FAILED) )
  16068. mbedtls_snprintf( buf, buflen, "DHM - Making of the public value failed" );
  16069. if( use_ret == -(MBEDTLS_ERR_DHM_CALC_SECRET_FAILED) )
  16070. mbedtls_snprintf( buf, buflen, "DHM - Calculation of the DHM secret failed" );
  16071. if( use_ret == -(MBEDTLS_ERR_DHM_INVALID_FORMAT) )
  16072. mbedtls_snprintf( buf, buflen, "DHM - The ASN.1 data is not formatted correctly" );
  16073. if( use_ret == -(MBEDTLS_ERR_DHM_ALLOC_FAILED) )
  16074. mbedtls_snprintf( buf, buflen, "DHM - Allocation of memory failed" );
  16075. if( use_ret == -(MBEDTLS_ERR_DHM_FILE_IO_ERROR) )
  16076. mbedtls_snprintf( buf, buflen, "DHM - Read/write of file failed" );
  16077. #endif /* MBEDTLS_DHM_C */
  16078. #if defined(MBEDTLS_ECP_C)
  16079. if( use_ret == -(MBEDTLS_ERR_ECP_BAD_INPUT_DATA) )
  16080. mbedtls_snprintf( buf, buflen, "ECP - Bad input parameters to function" );
  16081. if( use_ret == -(MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL) )
  16082. mbedtls_snprintf( buf, buflen, "ECP - The buffer is too small to write to" );
  16083. if( use_ret == -(MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE) )
  16084. mbedtls_snprintf( buf, buflen, "ECP - Requested curve not available" );
  16085. if( use_ret == -(MBEDTLS_ERR_ECP_VERIFY_FAILED) )
  16086. mbedtls_snprintf( buf, buflen, "ECP - The signature is not valid" );
  16087. if( use_ret == -(MBEDTLS_ERR_ECP_ALLOC_FAILED) )
  16088. mbedtls_snprintf( buf, buflen, "ECP - Memory allocation failed" );
  16089. if( use_ret == -(MBEDTLS_ERR_ECP_RANDOM_FAILED) )
  16090. mbedtls_snprintf( buf, buflen, "ECP - Generation of random value, such as (ephemeral) key, failed" );
  16091. if( use_ret == -(MBEDTLS_ERR_ECP_INVALID_KEY) )
  16092. mbedtls_snprintf( buf, buflen, "ECP - Invalid private or public key" );
  16093. if( use_ret == -(MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH) )
  16094. mbedtls_snprintf( buf, buflen, "ECP - Signature is valid but shorter than the user-supplied length" );
  16095. #endif /* MBEDTLS_ECP_C */
  16096. #if defined(MBEDTLS_MD_C)
  16097. if( use_ret == -(MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE) )
  16098. mbedtls_snprintf( buf, buflen, "MD - The selected feature is not available" );
  16099. if( use_ret == -(MBEDTLS_ERR_MD_BAD_INPUT_DATA) )
  16100. mbedtls_snprintf( buf, buflen, "MD - Bad input parameters to function" );
  16101. if( use_ret == -(MBEDTLS_ERR_MD_ALLOC_FAILED) )
  16102. mbedtls_snprintf( buf, buflen, "MD - Failed to allocate memory" );
  16103. if( use_ret == -(MBEDTLS_ERR_MD_FILE_IO_ERROR) )
  16104. mbedtls_snprintf( buf, buflen, "MD - Opening or reading of file failed" );
  16105. #endif /* MBEDTLS_MD_C */
  16106. #if defined(MBEDTLS_PEM_PARSE_C) || defined(MBEDTLS_PEM_WRITE_C)
  16107. if( use_ret == -(MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT) )
  16108. mbedtls_snprintf( buf, buflen, "PEM - No PEM header or footer found" );
  16109. if( use_ret == -(MBEDTLS_ERR_PEM_INVALID_DATA) )
  16110. mbedtls_snprintf( buf, buflen, "PEM - PEM string is not as expected" );
  16111. if( use_ret == -(MBEDTLS_ERR_PEM_ALLOC_FAILED) )
  16112. mbedtls_snprintf( buf, buflen, "PEM - Failed to allocate memory" );
  16113. if( use_ret == -(MBEDTLS_ERR_PEM_INVALID_ENC_IV) )
  16114. mbedtls_snprintf( buf, buflen, "PEM - RSA IV is not in hex-format" );
  16115. if( use_ret == -(MBEDTLS_ERR_PEM_UNKNOWN_ENC_ALG) )
  16116. mbedtls_snprintf( buf, buflen, "PEM - Unsupported key encryption algorithm" );
  16117. if( use_ret == -(MBEDTLS_ERR_PEM_PASSWORD_REQUIRED) )
  16118. mbedtls_snprintf( buf, buflen, "PEM - Private key password can't be empty" );
  16119. if( use_ret == -(MBEDTLS_ERR_PEM_PASSWORD_MISMATCH) )
  16120. mbedtls_snprintf( buf, buflen, "PEM - Given private key password does not allow for correct decryption" );
  16121. if( use_ret == -(MBEDTLS_ERR_PEM_FEATURE_UNAVAILABLE) )
  16122. mbedtls_snprintf( buf, buflen, "PEM - Unavailable feature, e.g. hashing/encryption combination" );
  16123. if( use_ret == -(MBEDTLS_ERR_PEM_BAD_INPUT_DATA) )
  16124. mbedtls_snprintf( buf, buflen, "PEM - Bad input parameters to function" );
  16125. #endif /* MBEDTLS_PEM_PARSE_C || MBEDTLS_PEM_WRITE_C */
  16126. #if defined(MBEDTLS_PK_C)
  16127. if( use_ret == -(MBEDTLS_ERR_PK_ALLOC_FAILED) )
  16128. mbedtls_snprintf( buf, buflen, "PK - Memory allocation failed" );
  16129. if( use_ret == -(MBEDTLS_ERR_PK_TYPE_MISMATCH) )
  16130. mbedtls_snprintf( buf, buflen, "PK - Type mismatch, eg attempt to encrypt with an ECDSA key" );
  16131. if( use_ret == -(MBEDTLS_ERR_PK_BAD_INPUT_DATA) )
  16132. mbedtls_snprintf( buf, buflen, "PK - Bad input parameters to function" );
  16133. if( use_ret == -(MBEDTLS_ERR_PK_FILE_IO_ERROR) )
  16134. mbedtls_snprintf( buf, buflen, "PK - Read/write of file failed" );
  16135. if( use_ret == -(MBEDTLS_ERR_PK_KEY_INVALID_VERSION) )
  16136. mbedtls_snprintf( buf, buflen, "PK - Unsupported key version" );
  16137. if( use_ret == -(MBEDTLS_ERR_PK_KEY_INVALID_FORMAT) )
  16138. mbedtls_snprintf( buf, buflen, "PK - Invalid key tag or value" );
  16139. if( use_ret == -(MBEDTLS_ERR_PK_UNKNOWN_PK_ALG) )
  16140. mbedtls_snprintf( buf, buflen, "PK - Key algorithm is unsupported (only RSA and EC are supported)" );
  16141. if( use_ret == -(MBEDTLS_ERR_PK_PASSWORD_REQUIRED) )
  16142. mbedtls_snprintf( buf, buflen, "PK - Private key password can't be empty" );
  16143. if( use_ret == -(MBEDTLS_ERR_PK_PASSWORD_MISMATCH) )
  16144. mbedtls_snprintf( buf, buflen, "PK - Given private key password does not allow for correct decryption" );
  16145. if( use_ret == -(MBEDTLS_ERR_PK_INVALID_PUBKEY) )
  16146. mbedtls_snprintf( buf, buflen, "PK - The pubkey tag or value is invalid (only RSA and EC are supported)" );
  16147. if( use_ret == -(MBEDTLS_ERR_PK_INVALID_ALG) )
  16148. mbedtls_snprintf( buf, buflen, "PK - The algorithm tag or value is invalid" );
  16149. if( use_ret == -(MBEDTLS_ERR_PK_UNKNOWN_NAMED_CURVE) )
  16150. mbedtls_snprintf( buf, buflen, "PK - Elliptic curve is unsupported (only NIST curves are supported)" );
  16151. if( use_ret == -(MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE) )
  16152. mbedtls_snprintf( buf, buflen, "PK - Unavailable feature, e.g. RSA disabled for RSA key" );
  16153. if( use_ret == -(MBEDTLS_ERR_PK_SIG_LEN_MISMATCH) )
  16154. mbedtls_snprintf( buf, buflen, "PK - The signature is valid but its length is less than expected" );
  16155. #endif /* MBEDTLS_PK_C */
  16156. #if defined(MBEDTLS_PKCS12_C)
  16157. if( use_ret == -(MBEDTLS_ERR_PKCS12_BAD_INPUT_DATA) )
  16158. mbedtls_snprintf( buf, buflen, "PKCS12 - Bad input parameters to function" );
  16159. if( use_ret == -(MBEDTLS_ERR_PKCS12_FEATURE_UNAVAILABLE) )
  16160. mbedtls_snprintf( buf, buflen, "PKCS12 - Feature not available, e.g. unsupported encryption scheme" );
  16161. if( use_ret == -(MBEDTLS_ERR_PKCS12_PBE_INVALID_FORMAT) )
  16162. mbedtls_snprintf( buf, buflen, "PKCS12 - PBE ASN.1 data not as expected" );
  16163. if( use_ret == -(MBEDTLS_ERR_PKCS12_PASSWORD_MISMATCH) )
  16164. mbedtls_snprintf( buf, buflen, "PKCS12 - Given private key password does not allow for correct decryption" );
  16165. #endif /* MBEDTLS_PKCS12_C */
  16166. #if defined(MBEDTLS_PKCS5_C)
  16167. if( use_ret == -(MBEDTLS_ERR_PKCS5_BAD_INPUT_DATA) )
  16168. mbedtls_snprintf( buf, buflen, "PKCS5 - Bad input parameters to function" );
  16169. if( use_ret == -(MBEDTLS_ERR_PKCS5_INVALID_FORMAT) )
  16170. mbedtls_snprintf( buf, buflen, "PKCS5 - Unexpected ASN.1 data" );
  16171. if( use_ret == -(MBEDTLS_ERR_PKCS5_FEATURE_UNAVAILABLE) )
  16172. mbedtls_snprintf( buf, buflen, "PKCS5 - Requested encryption or digest alg not available" );
  16173. if( use_ret == -(MBEDTLS_ERR_PKCS5_PASSWORD_MISMATCH) )
  16174. mbedtls_snprintf( buf, buflen, "PKCS5 - Given private key password does not allow for correct decryption" );
  16175. #endif /* MBEDTLS_PKCS5_C */
  16176. #if defined(MBEDTLS_RSA_C)
  16177. if( use_ret == -(MBEDTLS_ERR_RSA_BAD_INPUT_DATA) )
  16178. mbedtls_snprintf( buf, buflen, "RSA - Bad input parameters to function" );
  16179. if( use_ret == -(MBEDTLS_ERR_RSA_INVALID_PADDING) )
  16180. mbedtls_snprintf( buf, buflen, "RSA - Input data contains invalid padding and is rejected" );
  16181. if( use_ret == -(MBEDTLS_ERR_RSA_KEY_GEN_FAILED) )
  16182. mbedtls_snprintf( buf, buflen, "RSA - Something failed during generation of a key" );
  16183. if( use_ret == -(MBEDTLS_ERR_RSA_KEY_CHECK_FAILED) )
  16184. mbedtls_snprintf( buf, buflen, "RSA - Key failed to pass the library's validity check" );
  16185. if( use_ret == -(MBEDTLS_ERR_RSA_PUBLIC_FAILED) )
  16186. mbedtls_snprintf( buf, buflen, "RSA - The public key operation failed" );
  16187. if( use_ret == -(MBEDTLS_ERR_RSA_PRIVATE_FAILED) )
  16188. mbedtls_snprintf( buf, buflen, "RSA - The private key operation failed" );
  16189. if( use_ret == -(MBEDTLS_ERR_RSA_VERIFY_FAILED) )
  16190. mbedtls_snprintf( buf, buflen, "RSA - The PKCS#1 verification failed" );
  16191. if( use_ret == -(MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE) )
  16192. mbedtls_snprintf( buf, buflen, "RSA - The output buffer for decryption is not large enough" );
  16193. if( use_ret == -(MBEDTLS_ERR_RSA_RNG_FAILED) )
  16194. mbedtls_snprintf( buf, buflen, "RSA - The random generator failed to generate non-zeros" );
  16195. #endif /* MBEDTLS_RSA_C */
  16196. #if defined(MBEDTLS_SSL_TLS_C)
  16197. if( use_ret == -(MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE) )
  16198. mbedtls_snprintf( buf, buflen, "SSL - The requested feature is not available" );
  16199. if( use_ret == -(MBEDTLS_ERR_SSL_BAD_INPUT_DATA) )
  16200. mbedtls_snprintf( buf, buflen, "SSL - Bad input parameters to function" );
  16201. if( use_ret == -(MBEDTLS_ERR_SSL_INVALID_MAC) )
  16202. mbedtls_snprintf( buf, buflen, "SSL - Verification of the message MAC failed" );
  16203. if( use_ret == -(MBEDTLS_ERR_SSL_INVALID_RECORD) )
  16204. mbedtls_snprintf( buf, buflen, "SSL - An invalid SSL record was received" );
  16205. if( use_ret == -(MBEDTLS_ERR_SSL_CONN_EOF) )
  16206. mbedtls_snprintf( buf, buflen, "SSL - The connection indicated an EOF" );
  16207. if( use_ret == -(MBEDTLS_ERR_SSL_UNKNOWN_CIPHER) )
  16208. mbedtls_snprintf( buf, buflen, "SSL - An unknown cipher was received" );
  16209. if( use_ret == -(MBEDTLS_ERR_SSL_NO_CIPHER_CHOSEN) )
  16210. mbedtls_snprintf( buf, buflen, "SSL - The server has no ciphersuites in common with the client" );
  16211. if( use_ret == -(MBEDTLS_ERR_SSL_NO_RNG) )
  16212. mbedtls_snprintf( buf, buflen, "SSL - No RNG was provided to the SSL module" );
  16213. if( use_ret == -(MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE) )
  16214. mbedtls_snprintf( buf, buflen, "SSL - No client certification received from the client, but required by the authentication mode" );
  16215. if( use_ret == -(MBEDTLS_ERR_SSL_CERTIFICATE_TOO_LARGE) )
  16216. mbedtls_snprintf( buf, buflen, "SSL - Our own certificate(s) is/are too large to send in an SSL message" );
  16217. if( use_ret == -(MBEDTLS_ERR_SSL_CERTIFICATE_REQUIRED) )
  16218. mbedtls_snprintf( buf, buflen, "SSL - The own certificate is not set, but needed by the server" );
  16219. if( use_ret == -(MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED) )
  16220. mbedtls_snprintf( buf, buflen, "SSL - The own private key or pre-shared key is not set, but needed" );
  16221. if( use_ret == -(MBEDTLS_ERR_SSL_CA_CHAIN_REQUIRED) )
  16222. mbedtls_snprintf( buf, buflen, "SSL - No CA Chain is set, but required to operate" );
  16223. if( use_ret == -(MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE) )
  16224. mbedtls_snprintf( buf, buflen, "SSL - An unexpected message was received from our peer" );
  16225. if( use_ret == -(MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE) )
  16226. {
  16227. mbedtls_snprintf( buf, buflen, "SSL - A fatal alert message was received from our peer" );
  16228. return;
  16229. }
  16230. if( use_ret == -(MBEDTLS_ERR_SSL_PEER_VERIFY_FAILED) )
  16231. mbedtls_snprintf( buf, buflen, "SSL - Verification of our peer failed" );
  16232. if( use_ret == -(MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY) )
  16233. mbedtls_snprintf( buf, buflen, "SSL - The peer notified us that the connection is going to be closed" );
  16234. if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO) )
  16235. mbedtls_snprintf( buf, buflen, "SSL - Processing of the ClientHello handshake message failed" );
  16236. if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO) )
  16237. mbedtls_snprintf( buf, buflen, "SSL - Processing of the ServerHello handshake message failed" );
  16238. if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE) )
  16239. mbedtls_snprintf( buf, buflen, "SSL - Processing of the Certificate handshake message failed" );
  16240. if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST) )
  16241. mbedtls_snprintf( buf, buflen, "SSL - Processing of the CertificateRequest handshake message failed" );
  16242. if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE) )
  16243. mbedtls_snprintf( buf, buflen, "SSL - Processing of the ServerKeyExchange handshake message failed" );
  16244. if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO_DONE) )
  16245. mbedtls_snprintf( buf, buflen, "SSL - Processing of the ServerHelloDone handshake message failed" );
  16246. if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE) )
  16247. mbedtls_snprintf( buf, buflen, "SSL - Processing of the ClientKeyExchange handshake message failed" );
  16248. if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP) )
  16249. mbedtls_snprintf( buf, buflen, "SSL - Processing of the ClientKeyExchange handshake message failed in DHM / ECDH Read Public" );
  16250. if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS) )
  16251. mbedtls_snprintf( buf, buflen, "SSL - Processing of the ClientKeyExchange handshake message failed in DHM / ECDH Calculate Secret" );
  16252. if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY) )
  16253. mbedtls_snprintf( buf, buflen, "SSL - Processing of the CertificateVerify handshake message failed" );
  16254. if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_CHANGE_CIPHER_SPEC) )
  16255. mbedtls_snprintf( buf, buflen, "SSL - Processing of the ChangeCipherSpec handshake message failed" );
  16256. if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_FINISHED) )
  16257. mbedtls_snprintf( buf, buflen, "SSL - Processing of the Finished handshake message failed" );
  16258. if( use_ret == -(MBEDTLS_ERR_SSL_ALLOC_FAILED) )
  16259. mbedtls_snprintf( buf, buflen, "SSL - Memory allocation failed" );
  16260. if( use_ret == -(MBEDTLS_ERR_SSL_HW_ACCEL_FAILED) )
  16261. mbedtls_snprintf( buf, buflen, "SSL - Hardware acceleration function returned with error" );
  16262. if( use_ret == -(MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH) )
  16263. mbedtls_snprintf( buf, buflen, "SSL - Hardware acceleration function skipped / left alone data" );
  16264. if( use_ret == -(MBEDTLS_ERR_SSL_COMPRESSION_FAILED) )
  16265. mbedtls_snprintf( buf, buflen, "SSL - Processing of the compression / decompression failed" );
  16266. if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION) )
  16267. mbedtls_snprintf( buf, buflen, "SSL - Handshake protocol not within min/max boundaries" );
  16268. if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_NEW_SESSION_TICKET) )
  16269. mbedtls_snprintf( buf, buflen, "SSL - Processing of the NewSessionTicket handshake message failed" );
  16270. if( use_ret == -(MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED) )
  16271. mbedtls_snprintf( buf, buflen, "SSL - Session ticket has expired" );
  16272. if( use_ret == -(MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH) )
  16273. mbedtls_snprintf( buf, buflen, "SSL - Public key type mismatch (eg, asked for RSA key exchange and presented EC key)" );
  16274. if( use_ret == -(MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY) )
  16275. mbedtls_snprintf( buf, buflen, "SSL - Unknown identity received (eg, PSK identity)" );
  16276. if( use_ret == -(MBEDTLS_ERR_SSL_INTERNAL_ERROR) )
  16277. mbedtls_snprintf( buf, buflen, "SSL - Internal error (eg, unexpected failure in lower-level module)" );
  16278. if( use_ret == -(MBEDTLS_ERR_SSL_COUNTER_WRAPPING) )
  16279. mbedtls_snprintf( buf, buflen, "SSL - A counter would wrap (eg, too many messages exchanged)" );
  16280. if( use_ret == -(MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO) )
  16281. mbedtls_snprintf( buf, buflen, "SSL - Unexpected message at ServerHello in renegotiation" );
  16282. if( use_ret == -(MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED) )
  16283. mbedtls_snprintf( buf, buflen, "SSL - DTLS client must retry for hello verification" );
  16284. if( use_ret == -(MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL) )
  16285. mbedtls_snprintf( buf, buflen, "SSL - A buffer is too small to receive or write a message" );
  16286. if( use_ret == -(MBEDTLS_ERR_SSL_NO_USABLE_CIPHERSUITE) )
  16287. mbedtls_snprintf( buf, buflen, "SSL - None of the common ciphersuites is usable (eg, no suitable certificate, see debug messages)" );
  16288. if( use_ret == -(MBEDTLS_ERR_SSL_WANT_READ) )
  16289. mbedtls_snprintf( buf, buflen, "SSL - Connection requires a read call" );
  16290. if( use_ret == -(MBEDTLS_ERR_SSL_WANT_WRITE) )
  16291. mbedtls_snprintf( buf, buflen, "SSL - Connection requires a write call" );
  16292. if( use_ret == -(MBEDTLS_ERR_SSL_TIMEOUT) )
  16293. mbedtls_snprintf( buf, buflen, "SSL - The operation timed out" );
  16294. if( use_ret == -(MBEDTLS_ERR_SSL_CLIENT_RECONNECT) )
  16295. mbedtls_snprintf( buf, buflen, "SSL - The client initiated a reconnect from the same port" );
  16296. if( use_ret == -(MBEDTLS_ERR_SSL_UNEXPECTED_RECORD) )
  16297. mbedtls_snprintf( buf, buflen, "SSL - Record header looks valid but is not expected" );
  16298. #endif /* MBEDTLS_SSL_TLS_C */
  16299. #if defined(MBEDTLS_X509_USE_C) || defined(MBEDTLS_X509_CREATE_C)
  16300. if( use_ret == -(MBEDTLS_ERR_X509_FEATURE_UNAVAILABLE) )
  16301. mbedtls_snprintf( buf, buflen, "X509 - Unavailable feature, e.g. RSA hashing/encryption combination" );
  16302. if( use_ret == -(MBEDTLS_ERR_X509_UNKNOWN_OID) )
  16303. mbedtls_snprintf( buf, buflen, "X509 - Requested OID is unknown" );
  16304. if( use_ret == -(MBEDTLS_ERR_X509_INVALID_FORMAT) )
  16305. mbedtls_snprintf( buf, buflen, "X509 - The CRT/CRL/CSR format is invalid, e.g. different type expected" );
  16306. if( use_ret == -(MBEDTLS_ERR_X509_INVALID_VERSION) )
  16307. mbedtls_snprintf( buf, buflen, "X509 - The CRT/CRL/CSR version element is invalid" );
  16308. if( use_ret == -(MBEDTLS_ERR_X509_INVALID_SERIAL) )
  16309. mbedtls_snprintf( buf, buflen, "X509 - The serial tag or value is invalid" );
  16310. if( use_ret == -(MBEDTLS_ERR_X509_INVALID_ALG) )
  16311. mbedtls_snprintf( buf, buflen, "X509 - The algorithm tag or value is invalid" );
  16312. if( use_ret == -(MBEDTLS_ERR_X509_INVALID_NAME) )
  16313. mbedtls_snprintf( buf, buflen, "X509 - The name tag or value is invalid" );
  16314. if( use_ret == -(MBEDTLS_ERR_X509_INVALID_DATE) )
  16315. mbedtls_snprintf( buf, buflen, "X509 - The date tag or value is invalid" );
  16316. if( use_ret == -(MBEDTLS_ERR_X509_INVALID_SIGNATURE) )
  16317. mbedtls_snprintf( buf, buflen, "X509 - The signature tag or value invalid" );
  16318. if( use_ret == -(MBEDTLS_ERR_X509_INVALID_EXTENSIONS) )
  16319. mbedtls_snprintf( buf, buflen, "X509 - The extension tag or value is invalid" );
  16320. if( use_ret == -(MBEDTLS_ERR_X509_UNKNOWN_VERSION) )
  16321. mbedtls_snprintf( buf, buflen, "X509 - CRT/CRL/CSR has an unsupported version number" );
  16322. if( use_ret == -(MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG) )
  16323. mbedtls_snprintf( buf, buflen, "X509 - Signature algorithm (oid) is unsupported" );
  16324. if( use_ret == -(MBEDTLS_ERR_X509_SIG_MISMATCH) )
  16325. mbedtls_snprintf( buf, buflen, "X509 - Signature algorithms do not match. (see \\c ::mbedtls_x509_crt sig_oid)" );
  16326. if( use_ret == -(MBEDTLS_ERR_X509_CERT_VERIFY_FAILED) )
  16327. mbedtls_snprintf( buf, buflen, "X509 - Certificate verification failed, e.g. CRL, CA or signature check failed" );
  16328. if( use_ret == -(MBEDTLS_ERR_X509_CERT_UNKNOWN_FORMAT) )
  16329. mbedtls_snprintf( buf, buflen, "X509 - Format not recognized as DER or PEM" );
  16330. if( use_ret == -(MBEDTLS_ERR_X509_BAD_INPUT_DATA) )
  16331. mbedtls_snprintf( buf, buflen, "X509 - Input invalid" );
  16332. if( use_ret == -(MBEDTLS_ERR_X509_ALLOC_FAILED) )
  16333. mbedtls_snprintf( buf, buflen, "X509 - Allocation of memory failed" );
  16334. if( use_ret == -(MBEDTLS_ERR_X509_FILE_IO_ERROR) )
  16335. mbedtls_snprintf( buf, buflen, "X509 - Read/write of file failed" );
  16336. if( use_ret == -(MBEDTLS_ERR_X509_BUFFER_TOO_SMALL) )
  16337. mbedtls_snprintf( buf, buflen, "X509 - Destination buffer is too small" );
  16338. #endif /* MBEDTLS_X509_USE_C || MBEDTLS_X509_CREATE_C */
  16339. // END generated code
  16340. if( strlen( buf ) == 0 )
  16341. mbedtls_snprintf( buf, buflen, "UNKNOWN ERROR CODE (%04X)", use_ret );
  16342. }
  16343. use_ret = ret & ~0xFF80;
  16344. if( use_ret == 0 )
  16345. return;
  16346. // If high level code is present, make a concatenation between both
  16347. // error strings.
  16348. //
  16349. len = strlen( buf );
  16350. if( len > 0 )
  16351. {
  16352. if( buflen - len < 5 )
  16353. return;
  16354. mbedtls_snprintf( buf + len, buflen - len, " : " );
  16355. buf += len + 3;
  16356. buflen -= len + 3;
  16357. }
  16358. // Low level error codes
  16359. //
  16360. // BEGIN generated code
  16361. #if defined(MBEDTLS_AES_C)
  16362. if( use_ret == -(MBEDTLS_ERR_AES_INVALID_KEY_LENGTH) )
  16363. mbedtls_snprintf( buf, buflen, "AES - Invalid key length" );
  16364. if( use_ret == -(MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH) )
  16365. mbedtls_snprintf( buf, buflen, "AES - Invalid data input length" );
  16366. #endif /* MBEDTLS_AES_C */
  16367. #if defined(MBEDTLS_ASN1_PARSE_C)
  16368. if( use_ret == -(MBEDTLS_ERR_ASN1_OUT_OF_DATA) )
  16369. mbedtls_snprintf( buf, buflen, "ASN1 - Out of data when parsing an ASN1 data structure" );
  16370. if( use_ret == -(MBEDTLS_ERR_ASN1_UNEXPECTED_TAG) )
  16371. mbedtls_snprintf( buf, buflen, "ASN1 - ASN1 tag was of an unexpected value" );
  16372. if( use_ret == -(MBEDTLS_ERR_ASN1_INVALID_LENGTH) )
  16373. mbedtls_snprintf( buf, buflen, "ASN1 - Error when trying to determine the length or invalid length" );
  16374. if( use_ret == -(MBEDTLS_ERR_ASN1_LENGTH_MISMATCH) )
  16375. mbedtls_snprintf( buf, buflen, "ASN1 - Actual length differs from expected length" );
  16376. if( use_ret == -(MBEDTLS_ERR_ASN1_INVALID_DATA) )
  16377. mbedtls_snprintf( buf, buflen, "ASN1 - Data is invalid. (not used)" );
  16378. if( use_ret == -(MBEDTLS_ERR_ASN1_ALLOC_FAILED) )
  16379. mbedtls_snprintf( buf, buflen, "ASN1 - Memory allocation failed" );
  16380. if( use_ret == -(MBEDTLS_ERR_ASN1_BUF_TOO_SMALL) )
  16381. mbedtls_snprintf( buf, buflen, "ASN1 - Buffer too small when writing ASN.1 data structure" );
  16382. #endif /* MBEDTLS_ASN1_PARSE_C */
  16383. #if defined(MBEDTLS_BASE64_C)
  16384. if( use_ret == -(MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL) )
  16385. mbedtls_snprintf( buf, buflen, "BASE64 - Output buffer too small" );
  16386. if( use_ret == -(MBEDTLS_ERR_BASE64_INVALID_CHARACTER) )
  16387. mbedtls_snprintf( buf, buflen, "BASE64 - Invalid character in input" );
  16388. #endif /* MBEDTLS_BASE64_C */
  16389. #if defined(MBEDTLS_BIGNUM_C)
  16390. if( use_ret == -(MBEDTLS_ERR_MPI_FILE_IO_ERROR) )
  16391. mbedtls_snprintf( buf, buflen, "BIGNUM - An error occurred while reading from or writing to a file" );
  16392. if( use_ret == -(MBEDTLS_ERR_MPI_BAD_INPUT_DATA) )
  16393. mbedtls_snprintf( buf, buflen, "BIGNUM - Bad input parameters to function" );
  16394. if( use_ret == -(MBEDTLS_ERR_MPI_INVALID_CHARACTER) )
  16395. mbedtls_snprintf( buf, buflen, "BIGNUM - There is an invalid character in the digit string" );
  16396. if( use_ret == -(MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL) )
  16397. mbedtls_snprintf( buf, buflen, "BIGNUM - The buffer is too small to write to" );
  16398. if( use_ret == -(MBEDTLS_ERR_MPI_NEGATIVE_VALUE) )
  16399. mbedtls_snprintf( buf, buflen, "BIGNUM - The input arguments are negative or result in illegal output" );
  16400. if( use_ret == -(MBEDTLS_ERR_MPI_DIVISION_BY_ZERO) )
  16401. mbedtls_snprintf( buf, buflen, "BIGNUM - The input argument for division is zero, which is not allowed" );
  16402. if( use_ret == -(MBEDTLS_ERR_MPI_NOT_ACCEPTABLE) )
  16403. mbedtls_snprintf( buf, buflen, "BIGNUM - The input arguments are not acceptable" );
  16404. if( use_ret == -(MBEDTLS_ERR_MPI_ALLOC_FAILED) )
  16405. mbedtls_snprintf( buf, buflen, "BIGNUM - Memory allocation failed" );
  16406. #endif /* MBEDTLS_BIGNUM_C */
  16407. #if defined(MBEDTLS_BLOWFISH_C)
  16408. if( use_ret == -(MBEDTLS_ERR_BLOWFISH_INVALID_KEY_LENGTH) )
  16409. mbedtls_snprintf( buf, buflen, "BLOWFISH - Invalid key length" );
  16410. if( use_ret == -(MBEDTLS_ERR_BLOWFISH_INVALID_INPUT_LENGTH) )
  16411. mbedtls_snprintf( buf, buflen, "BLOWFISH - Invalid data input length" );
  16412. #endif /* MBEDTLS_BLOWFISH_C */
  16413. #if defined(MBEDTLS_CAMELLIA_C)
  16414. if( use_ret == -(MBEDTLS_ERR_CAMELLIA_INVALID_KEY_LENGTH) )
  16415. mbedtls_snprintf( buf, buflen, "CAMELLIA - Invalid key length" );
  16416. if( use_ret == -(MBEDTLS_ERR_CAMELLIA_INVALID_INPUT_LENGTH) )
  16417. mbedtls_snprintf( buf, buflen, "CAMELLIA - Invalid data input length" );
  16418. #endif /* MBEDTLS_CAMELLIA_C */
  16419. #if defined(MBEDTLS_CCM_C)
  16420. if( use_ret == -(MBEDTLS_ERR_CCM_BAD_INPUT) )
  16421. mbedtls_snprintf( buf, buflen, "CCM - Bad input parameters to function" );
  16422. if( use_ret == -(MBEDTLS_ERR_CCM_AUTH_FAILED) )
  16423. mbedtls_snprintf( buf, buflen, "CCM - Authenticated decryption failed" );
  16424. #endif /* MBEDTLS_CCM_C */
  16425. #if defined(MBEDTLS_CTR_DRBG_C)
  16426. if( use_ret == -(MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED) )
  16427. mbedtls_snprintf( buf, buflen, "CTR_DRBG - The entropy source failed" );
  16428. if( use_ret == -(MBEDTLS_ERR_CTR_DRBG_REQUEST_TOO_BIG) )
  16429. mbedtls_snprintf( buf, buflen, "CTR_DRBG - Too many random requested in single call" );
  16430. if( use_ret == -(MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG) )
  16431. mbedtls_snprintf( buf, buflen, "CTR_DRBG - Input too large (Entropy + additional)" );
  16432. if( use_ret == -(MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR) )
  16433. mbedtls_snprintf( buf, buflen, "CTR_DRBG - Read/write error in file" );
  16434. #endif /* MBEDTLS_CTR_DRBG_C */
  16435. #if defined(MBEDTLS_DES_C)
  16436. if( use_ret == -(MBEDTLS_ERR_DES_INVALID_INPUT_LENGTH) )
  16437. mbedtls_snprintf( buf, buflen, "DES - The data input has an invalid length" );
  16438. #endif /* MBEDTLS_DES_C */
  16439. #if defined(MBEDTLS_ENTROPY_C)
  16440. if( use_ret == -(MBEDTLS_ERR_ENTROPY_SOURCE_FAILED) )
  16441. mbedtls_snprintf( buf, buflen, "ENTROPY - Critical entropy source failure" );
  16442. if( use_ret == -(MBEDTLS_ERR_ENTROPY_MAX_SOURCES) )
  16443. mbedtls_snprintf( buf, buflen, "ENTROPY - No more sources can be added" );
  16444. if( use_ret == -(MBEDTLS_ERR_ENTROPY_NO_SOURCES_DEFINED) )
  16445. mbedtls_snprintf( buf, buflen, "ENTROPY - No sources have been added to poll" );
  16446. if( use_ret == -(MBEDTLS_ERR_ENTROPY_NO_STRONG_SOURCE) )
  16447. mbedtls_snprintf( buf, buflen, "ENTROPY - No strong sources have been added to poll" );
  16448. if( use_ret == -(MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR) )
  16449. mbedtls_snprintf( buf, buflen, "ENTROPY - Read/write error in file" );
  16450. #endif /* MBEDTLS_ENTROPY_C */
  16451. #if defined(MBEDTLS_GCM_C)
  16452. if( use_ret == -(MBEDTLS_ERR_GCM_AUTH_FAILED) )
  16453. mbedtls_snprintf( buf, buflen, "GCM - Authenticated decryption failed" );
  16454. if( use_ret == -(MBEDTLS_ERR_GCM_BAD_INPUT) )
  16455. mbedtls_snprintf( buf, buflen, "GCM - Bad input parameters to function" );
  16456. #endif /* MBEDTLS_GCM_C */
  16457. #if defined(MBEDTLS_HMAC_DRBG_C)
  16458. if( use_ret == -(MBEDTLS_ERR_HMAC_DRBG_REQUEST_TOO_BIG) )
  16459. mbedtls_snprintf( buf, buflen, "HMAC_DRBG - Too many random requested in single call" );
  16460. if( use_ret == -(MBEDTLS_ERR_HMAC_DRBG_INPUT_TOO_BIG) )
  16461. mbedtls_snprintf( buf, buflen, "HMAC_DRBG - Input too large (Entropy + additional)" );
  16462. if( use_ret == -(MBEDTLS_ERR_HMAC_DRBG_FILE_IO_ERROR) )
  16463. mbedtls_snprintf( buf, buflen, "HMAC_DRBG - Read/write error in file" );
  16464. if( use_ret == -(MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED) )
  16465. mbedtls_snprintf( buf, buflen, "HMAC_DRBG - The entropy source failed" );
  16466. #endif /* MBEDTLS_HMAC_DRBG_C */
  16467. #if defined(MBEDTLS_NET_C)
  16468. if( use_ret == -(MBEDTLS_ERR_NET_SOCKET_FAILED) )
  16469. mbedtls_snprintf( buf, buflen, "NET - Failed to open a socket" );
  16470. if( use_ret == -(MBEDTLS_ERR_NET_CONNECT_FAILED) )
  16471. mbedtls_snprintf( buf, buflen, "NET - The connection to the given server / port failed" );
  16472. if( use_ret == -(MBEDTLS_ERR_NET_BIND_FAILED) )
  16473. mbedtls_snprintf( buf, buflen, "NET - Binding of the socket failed" );
  16474. if( use_ret == -(MBEDTLS_ERR_NET_LISTEN_FAILED) )
  16475. mbedtls_snprintf( buf, buflen, "NET - Could not listen on the socket" );
  16476. if( use_ret == -(MBEDTLS_ERR_NET_ACCEPT_FAILED) )
  16477. mbedtls_snprintf( buf, buflen, "NET - Could not accept the incoming connection" );
  16478. if( use_ret == -(MBEDTLS_ERR_NET_RECV_FAILED) )
  16479. mbedtls_snprintf( buf, buflen, "NET - Reading information from the socket failed" );
  16480. if( use_ret == -(MBEDTLS_ERR_NET_SEND_FAILED) )
  16481. mbedtls_snprintf( buf, buflen, "NET - Sending information through the socket failed" );
  16482. if( use_ret == -(MBEDTLS_ERR_NET_CONN_RESET) )
  16483. mbedtls_snprintf( buf, buflen, "NET - Connection was reset by peer" );
  16484. if( use_ret == -(MBEDTLS_ERR_NET_UNKNOWN_HOST) )
  16485. mbedtls_snprintf( buf, buflen, "NET - Failed to get an IP address for the given hostname" );
  16486. if( use_ret == -(MBEDTLS_ERR_NET_BUFFER_TOO_SMALL) )
  16487. mbedtls_snprintf( buf, buflen, "NET - Buffer is too small to hold the data" );
  16488. if( use_ret == -(MBEDTLS_ERR_NET_INVALID_CONTEXT) )
  16489. mbedtls_snprintf( buf, buflen, "NET - The context is invalid, eg because it was free()ed" );
  16490. #endif /* MBEDTLS_NET_C */
  16491. #if defined(MBEDTLS_OID_C)
  16492. if( use_ret == -(MBEDTLS_ERR_OID_NOT_FOUND) )
  16493. mbedtls_snprintf( buf, buflen, "OID - OID is not found" );
  16494. if( use_ret == -(MBEDTLS_ERR_OID_BUF_TOO_SMALL) )
  16495. mbedtls_snprintf( buf, buflen, "OID - output buffer is too small" );
  16496. #endif /* MBEDTLS_OID_C */
  16497. #if defined(MBEDTLS_PADLOCK_C)
  16498. if( use_ret == -(MBEDTLS_ERR_PADLOCK_DATA_MISALIGNED) )
  16499. mbedtls_snprintf( buf, buflen, "PADLOCK - Input data should be aligned" );
  16500. #endif /* MBEDTLS_PADLOCK_C */
  16501. #if defined(MBEDTLS_THREADING_C)
  16502. if( use_ret == -(MBEDTLS_ERR_THREADING_FEATURE_UNAVAILABLE) )
  16503. mbedtls_snprintf( buf, buflen, "THREADING - The selected feature is not available" );
  16504. if( use_ret == -(MBEDTLS_ERR_THREADING_BAD_INPUT_DATA) )
  16505. mbedtls_snprintf( buf, buflen, "THREADING - Bad input parameters to function" );
  16506. if( use_ret == -(MBEDTLS_ERR_THREADING_MUTEX_ERROR) )
  16507. mbedtls_snprintf( buf, buflen, "THREADING - Locking / unlocking / free failed with error code" );
  16508. #endif /* MBEDTLS_THREADING_C */
  16509. #if defined(MBEDTLS_XTEA_C)
  16510. if( use_ret == -(MBEDTLS_ERR_XTEA_INVALID_INPUT_LENGTH) )
  16511. mbedtls_snprintf( buf, buflen, "XTEA - The data input has an invalid length" );
  16512. #endif /* MBEDTLS_XTEA_C */
  16513. // END generated code
  16514. if( strlen( buf ) != 0 )
  16515. return;
  16516. mbedtls_snprintf( buf, buflen, "UNKNOWN ERROR CODE (%04X)", use_ret );
  16517. }
  16518. #else /* MBEDTLS_ERROR_C */
  16519. #if defined(MBEDTLS_ERROR_STRERROR_DUMMY)
  16520. /*
  16521. * Provide an non-function in case MBEDTLS_ERROR_C is not defined
  16522. */
  16523. void mbedtls_strerror( int ret, char *buf, size_t buflen )
  16524. {
  16525. ((void) ret);
  16526. if( buflen > 0 )
  16527. buf[0] = '\0';
  16528. }
  16529. #endif /* MBEDTLS_ERROR_STRERROR_DUMMY */
  16530. #endif /* MBEDTLS_ERROR_C */
  16531. /********* Start of file library/gcm.c ************/
  16532. /*
  16533. * NIST SP800-38D compliant GCM implementation
  16534. *
  16535. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  16536. * SPDX-License-Identifier: Apache-2.0
  16537. *
  16538. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  16539. * not use this file except in compliance with the License.
  16540. * You may obtain a copy of the License at
  16541. *
  16542. * http://www.apache.org/licenses/LICENSE-2.0
  16543. *
  16544. * Unless required by applicable law or agreed to in writing, software
  16545. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  16546. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  16547. * See the License for the specific language governing permissions and
  16548. * limitations under the License.
  16549. *
  16550. * This file is part of mbed TLS (https://tls.mbed.org)
  16551. */
  16552. /*
  16553. * http://csrc.nist.gov/publications/nistpubs/800-38D/SP-800-38D.pdf
  16554. *
  16555. * See also:
  16556. * [MGV] http://csrc.nist.gov/groups/ST/toolkit/BCM/documents/proposedmodes/gcm/gcm-revised-spec.pdf
  16557. *
  16558. * We use the algorithm described as Shoup's method with 4-bit tables in
  16559. * [MGV] 4.1, pp. 12-13, to enhance speed without using too much memory.
  16560. */
  16561. #if !defined(MBEDTLS_CONFIG_FILE)
  16562. #else
  16563. #endif
  16564. #if defined(MBEDTLS_GCM_C)
  16565. #include <string.h>
  16566. #if defined(MBEDTLS_AESNI_C)
  16567. #endif
  16568. #if defined(MBEDTLS_SELF_TEST) && defined(MBEDTLS_AES_C)
  16569. #if defined(MBEDTLS_PLATFORM_C)
  16570. #else
  16571. #include <stdio.h>
  16572. #define mbedtls_printf printf
  16573. #endif /* MBEDTLS_PLATFORM_C */
  16574. #endif /* MBEDTLS_SELF_TEST && MBEDTLS_AES_C */
  16575. /*
  16576. * 32-bit integer manipulation macros (big endian)
  16577. */
  16578. #ifndef GET_UINT32_BE
  16579. #define GET_UINT32_BE(n,b,i) \
  16580. { \
  16581. (n) = ( (uint32_t) (b)[(i) ] << 24 ) \
  16582. | ( (uint32_t) (b)[(i) + 1] << 16 ) \
  16583. | ( (uint32_t) (b)[(i) + 2] << 8 ) \
  16584. | ( (uint32_t) (b)[(i) + 3] ); \
  16585. }
  16586. #endif
  16587. #ifndef PUT_UINT32_BE
  16588. #define PUT_UINT32_BE(n,b,i) \
  16589. { \
  16590. (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
  16591. (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \
  16592. (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \
  16593. (b)[(i) + 3] = (unsigned char) ( (n) ); \
  16594. }
  16595. #endif
  16596. /* Implementation that should never be optimized out by the compiler */
  16597. static void gcm_zeroize( void *v, size_t n ) {
  16598. volatile unsigned char *p = v; while( n-- ) *p++ = 0;
  16599. }
  16600. /*
  16601. * Initialize a context
  16602. */
  16603. void mbedtls_gcm_init( mbedtls_gcm_context *ctx )
  16604. {
  16605. memset( ctx, 0, sizeof( mbedtls_gcm_context ) );
  16606. }
  16607. /*
  16608. * Precompute small multiples of H, that is set
  16609. * HH[i] || HL[i] = H times i,
  16610. * where i is seen as a field element as in [MGV], ie high-order bits
  16611. * correspond to low powers of P. The result is stored in the same way, that
  16612. * is the high-order bit of HH corresponds to P^0 and the low-order bit of HL
  16613. * corresponds to P^127.
  16614. */
  16615. static int gcm_gen_table( mbedtls_gcm_context *ctx )
  16616. {
  16617. int ret, i, j;
  16618. uint64_t hi, lo;
  16619. uint64_t vl, vh;
  16620. unsigned char h[16];
  16621. size_t olen = 0;
  16622. memset( h, 0, 16 );
  16623. if( ( ret = mbedtls_cipher_update( &ctx->cipher_ctx, h, 16, h, &olen ) ) != 0 )
  16624. return( ret );
  16625. /* pack h as two 64-bits ints, big-endian */
  16626. GET_UINT32_BE( hi, h, 0 );
  16627. GET_UINT32_BE( lo, h, 4 );
  16628. vh = (uint64_t) hi << 32 | lo;
  16629. GET_UINT32_BE( hi, h, 8 );
  16630. GET_UINT32_BE( lo, h, 12 );
  16631. vl = (uint64_t) hi << 32 | lo;
  16632. /* 8 = 1000 corresponds to 1 in GF(2^128) */
  16633. ctx->HL[8] = vl;
  16634. ctx->HH[8] = vh;
  16635. #if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
  16636. /* With CLMUL support, we need only h, not the rest of the table */
  16637. if( mbedtls_aesni_has_support( MBEDTLS_AESNI_CLMUL ) )
  16638. return( 0 );
  16639. #endif
  16640. /* 0 corresponds to 0 in GF(2^128) */
  16641. ctx->HH[0] = 0;
  16642. ctx->HL[0] = 0;
  16643. for( i = 4; i > 0; i >>= 1 )
  16644. {
  16645. uint32_t T = ( vl & 1 ) * 0xe1000000U;
  16646. vl = ( vh << 63 ) | ( vl >> 1 );
  16647. vh = ( vh >> 1 ) ^ ( (uint64_t) T << 32);
  16648. ctx->HL[i] = vl;
  16649. ctx->HH[i] = vh;
  16650. }
  16651. for( i = 2; i <= 8; i *= 2 )
  16652. {
  16653. uint64_t *HiL = ctx->HL + i, *HiH = ctx->HH + i;
  16654. vh = *HiH;
  16655. vl = *HiL;
  16656. for( j = 1; j < i; j++ )
  16657. {
  16658. HiH[j] = vh ^ ctx->HH[j];
  16659. HiL[j] = vl ^ ctx->HL[j];
  16660. }
  16661. }
  16662. return( 0 );
  16663. }
  16664. int mbedtls_gcm_setkey( mbedtls_gcm_context *ctx,
  16665. mbedtls_cipher_id_t cipher,
  16666. const unsigned char *key,
  16667. unsigned int keybits )
  16668. {
  16669. int ret;
  16670. const mbedtls_cipher_info_t *cipher_info;
  16671. cipher_info = mbedtls_cipher_info_from_values( cipher, keybits, MBEDTLS_MODE_ECB );
  16672. if( cipher_info == NULL )
  16673. return( MBEDTLS_ERR_GCM_BAD_INPUT );
  16674. if( cipher_info->block_size != 16 )
  16675. return( MBEDTLS_ERR_GCM_BAD_INPUT );
  16676. mbedtls_cipher_free( &ctx->cipher_ctx );
  16677. if( ( ret = mbedtls_cipher_setup( &ctx->cipher_ctx, cipher_info ) ) != 0 )
  16678. return( ret );
  16679. if( ( ret = mbedtls_cipher_setkey( &ctx->cipher_ctx, key, keybits,
  16680. MBEDTLS_ENCRYPT ) ) != 0 )
  16681. {
  16682. return( ret );
  16683. }
  16684. if( ( ret = gcm_gen_table( ctx ) ) != 0 )
  16685. return( ret );
  16686. return( 0 );
  16687. }
  16688. /*
  16689. * Shoup's method for multiplication use this table with
  16690. * last4[x] = x times P^128
  16691. * where x and last4[x] are seen as elements of GF(2^128) as in [MGV]
  16692. */
  16693. static const uint64_t last4[16] =
  16694. {
  16695. 0x0000, 0x1c20, 0x3840, 0x2460,
  16696. 0x7080, 0x6ca0, 0x48c0, 0x54e0,
  16697. 0xe100, 0xfd20, 0xd940, 0xc560,
  16698. 0x9180, 0x8da0, 0xa9c0, 0xb5e0
  16699. };
  16700. /*
  16701. * Sets output to x times H using the precomputed tables.
  16702. * x and output are seen as elements of GF(2^128) as in [MGV].
  16703. */
  16704. static void gcm_mult( mbedtls_gcm_context *ctx, const unsigned char x[16],
  16705. unsigned char output[16] )
  16706. {
  16707. int i = 0;
  16708. unsigned char lo, hi, rem;
  16709. uint64_t zh, zl;
  16710. #if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
  16711. if( mbedtls_aesni_has_support( MBEDTLS_AESNI_CLMUL ) ) {
  16712. unsigned char h[16];
  16713. PUT_UINT32_BE( ctx->HH[8] >> 32, h, 0 );
  16714. PUT_UINT32_BE( ctx->HH[8], h, 4 );
  16715. PUT_UINT32_BE( ctx->HL[8] >> 32, h, 8 );
  16716. PUT_UINT32_BE( ctx->HL[8], h, 12 );
  16717. mbedtls_aesni_gcm_mult( output, x, h );
  16718. return;
  16719. }
  16720. #endif /* MBEDTLS_AESNI_C && MBEDTLS_HAVE_X86_64 */
  16721. lo = x[15] & 0xf;
  16722. zh = ctx->HH[lo];
  16723. zl = ctx->HL[lo];
  16724. for( i = 15; i >= 0; i-- )
  16725. {
  16726. lo = x[i] & 0xf;
  16727. hi = x[i] >> 4;
  16728. if( i != 15 )
  16729. {
  16730. rem = (unsigned char) zl & 0xf;
  16731. zl = ( zh << 60 ) | ( zl >> 4 );
  16732. zh = ( zh >> 4 );
  16733. zh ^= (uint64_t) last4[rem] << 48;
  16734. zh ^= ctx->HH[lo];
  16735. zl ^= ctx->HL[lo];
  16736. }
  16737. rem = (unsigned char) zl & 0xf;
  16738. zl = ( zh << 60 ) | ( zl >> 4 );
  16739. zh = ( zh >> 4 );
  16740. zh ^= (uint64_t) last4[rem] << 48;
  16741. zh ^= ctx->HH[hi];
  16742. zl ^= ctx->HL[hi];
  16743. }
  16744. PUT_UINT32_BE( zh >> 32, output, 0 );
  16745. PUT_UINT32_BE( zh, output, 4 );
  16746. PUT_UINT32_BE( zl >> 32, output, 8 );
  16747. PUT_UINT32_BE( zl, output, 12 );
  16748. }
  16749. int mbedtls_gcm_starts( mbedtls_gcm_context *ctx,
  16750. int mode,
  16751. const unsigned char *iv,
  16752. size_t iv_len,
  16753. const unsigned char *add,
  16754. size_t add_len )
  16755. {
  16756. int ret;
  16757. unsigned char work_buf[16];
  16758. size_t i;
  16759. const unsigned char *p;
  16760. size_t use_len, olen = 0;
  16761. /* IV and AD are limited to 2^64 bits, so 2^61 bytes */
  16762. if( ( (uint64_t) iv_len ) >> 61 != 0 ||
  16763. ( (uint64_t) add_len ) >> 61 != 0 )
  16764. {
  16765. return( MBEDTLS_ERR_GCM_BAD_INPUT );
  16766. }
  16767. memset( ctx->y, 0x00, sizeof(ctx->y) );
  16768. memset( ctx->buf, 0x00, sizeof(ctx->buf) );
  16769. ctx->mode = mode;
  16770. ctx->len = 0;
  16771. ctx->add_len = 0;
  16772. if( iv_len == 12 )
  16773. {
  16774. memcpy( ctx->y, iv, iv_len );
  16775. ctx->y[15] = 1;
  16776. }
  16777. else
  16778. {
  16779. memset( work_buf, 0x00, 16 );
  16780. PUT_UINT32_BE( iv_len * 8, work_buf, 12 );
  16781. p = iv;
  16782. while( iv_len > 0 )
  16783. {
  16784. use_len = ( iv_len < 16 ) ? iv_len : 16;
  16785. for( i = 0; i < use_len; i++ )
  16786. ctx->y[i] ^= p[i];
  16787. gcm_mult( ctx, ctx->y, ctx->y );
  16788. iv_len -= use_len;
  16789. p += use_len;
  16790. }
  16791. for( i = 0; i < 16; i++ )
  16792. ctx->y[i] ^= work_buf[i];
  16793. gcm_mult( ctx, ctx->y, ctx->y );
  16794. }
  16795. if( ( ret = mbedtls_cipher_update( &ctx->cipher_ctx, ctx->y, 16, ctx->base_ectr,
  16796. &olen ) ) != 0 )
  16797. {
  16798. return( ret );
  16799. }
  16800. ctx->add_len = add_len;
  16801. p = add;
  16802. while( add_len > 0 )
  16803. {
  16804. use_len = ( add_len < 16 ) ? add_len : 16;
  16805. for( i = 0; i < use_len; i++ )
  16806. ctx->buf[i] ^= p[i];
  16807. gcm_mult( ctx, ctx->buf, ctx->buf );
  16808. add_len -= use_len;
  16809. p += use_len;
  16810. }
  16811. return( 0 );
  16812. }
  16813. int mbedtls_gcm_update( mbedtls_gcm_context *ctx,
  16814. size_t length,
  16815. const unsigned char *input,
  16816. unsigned char *output )
  16817. {
  16818. int ret;
  16819. unsigned char ectr[16];
  16820. size_t i;
  16821. const unsigned char *p;
  16822. unsigned char *out_p = output;
  16823. size_t use_len, olen = 0;
  16824. if( output > input && (size_t) ( output - input ) < length )
  16825. return( MBEDTLS_ERR_GCM_BAD_INPUT );
  16826. /* Total length is restricted to 2^39 - 256 bits, ie 2^36 - 2^5 bytes
  16827. * Also check for possible overflow */
  16828. if( ctx->len + length < ctx->len ||
  16829. (uint64_t) ctx->len + length > 0xFFFFFFFE0ull )
  16830. {
  16831. return( MBEDTLS_ERR_GCM_BAD_INPUT );
  16832. }
  16833. ctx->len += length;
  16834. p = input;
  16835. while( length > 0 )
  16836. {
  16837. use_len = ( length < 16 ) ? length : 16;
  16838. for( i = 16; i > 12; i-- )
  16839. if( ++ctx->y[i - 1] != 0 )
  16840. break;
  16841. if( ( ret = mbedtls_cipher_update( &ctx->cipher_ctx, ctx->y, 16, ectr,
  16842. &olen ) ) != 0 )
  16843. {
  16844. return( ret );
  16845. }
  16846. for( i = 0; i < use_len; i++ )
  16847. {
  16848. if( ctx->mode == MBEDTLS_GCM_DECRYPT )
  16849. ctx->buf[i] ^= p[i];
  16850. out_p[i] = ectr[i] ^ p[i];
  16851. if( ctx->mode == MBEDTLS_GCM_ENCRYPT )
  16852. ctx->buf[i] ^= out_p[i];
  16853. }
  16854. gcm_mult( ctx, ctx->buf, ctx->buf );
  16855. length -= use_len;
  16856. p += use_len;
  16857. out_p += use_len;
  16858. }
  16859. return( 0 );
  16860. }
  16861. int mbedtls_gcm_finish( mbedtls_gcm_context *ctx,
  16862. unsigned char *tag,
  16863. size_t tag_len )
  16864. {
  16865. unsigned char work_buf[16];
  16866. size_t i;
  16867. uint64_t orig_len = ctx->len * 8;
  16868. uint64_t orig_add_len = ctx->add_len * 8;
  16869. if( tag_len > 16 || tag_len < 4 )
  16870. return( MBEDTLS_ERR_GCM_BAD_INPUT );
  16871. if( tag_len != 0 )
  16872. memcpy( tag, ctx->base_ectr, tag_len );
  16873. if( orig_len || orig_add_len )
  16874. {
  16875. memset( work_buf, 0x00, 16 );
  16876. PUT_UINT32_BE( ( orig_add_len >> 32 ), work_buf, 0 );
  16877. PUT_UINT32_BE( ( orig_add_len ), work_buf, 4 );
  16878. PUT_UINT32_BE( ( orig_len >> 32 ), work_buf, 8 );
  16879. PUT_UINT32_BE( ( orig_len ), work_buf, 12 );
  16880. for( i = 0; i < 16; i++ )
  16881. ctx->buf[i] ^= work_buf[i];
  16882. gcm_mult( ctx, ctx->buf, ctx->buf );
  16883. for( i = 0; i < tag_len; i++ )
  16884. tag[i] ^= ctx->buf[i];
  16885. }
  16886. return( 0 );
  16887. }
  16888. int mbedtls_gcm_crypt_and_tag( mbedtls_gcm_context *ctx,
  16889. int mode,
  16890. size_t length,
  16891. const unsigned char *iv,
  16892. size_t iv_len,
  16893. const unsigned char *add,
  16894. size_t add_len,
  16895. const unsigned char *input,
  16896. unsigned char *output,
  16897. size_t tag_len,
  16898. unsigned char *tag )
  16899. {
  16900. int ret;
  16901. if( ( ret = mbedtls_gcm_starts( ctx, mode, iv, iv_len, add, add_len ) ) != 0 )
  16902. return( ret );
  16903. if( ( ret = mbedtls_gcm_update( ctx, length, input, output ) ) != 0 )
  16904. return( ret );
  16905. if( ( ret = mbedtls_gcm_finish( ctx, tag, tag_len ) ) != 0 )
  16906. return( ret );
  16907. return( 0 );
  16908. }
  16909. int mbedtls_gcm_auth_decrypt( mbedtls_gcm_context *ctx,
  16910. size_t length,
  16911. const unsigned char *iv,
  16912. size_t iv_len,
  16913. const unsigned char *add,
  16914. size_t add_len,
  16915. const unsigned char *tag,
  16916. size_t tag_len,
  16917. const unsigned char *input,
  16918. unsigned char *output )
  16919. {
  16920. int ret;
  16921. unsigned char check_tag[16];
  16922. size_t i;
  16923. int diff;
  16924. if( ( ret = mbedtls_gcm_crypt_and_tag( ctx, MBEDTLS_GCM_DECRYPT, length,
  16925. iv, iv_len, add, add_len,
  16926. input, output, tag_len, check_tag ) ) != 0 )
  16927. {
  16928. return( ret );
  16929. }
  16930. /* Check tag in "constant-time" */
  16931. for( diff = 0, i = 0; i < tag_len; i++ )
  16932. diff |= tag[i] ^ check_tag[i];
  16933. if( diff != 0 )
  16934. {
  16935. gcm_zeroize( output, length );
  16936. return( MBEDTLS_ERR_GCM_AUTH_FAILED );
  16937. }
  16938. return( 0 );
  16939. }
  16940. void mbedtls_gcm_free( mbedtls_gcm_context *ctx )
  16941. {
  16942. mbedtls_cipher_free( &ctx->cipher_ctx );
  16943. gcm_zeroize( ctx, sizeof( mbedtls_gcm_context ) );
  16944. }
  16945. #if defined(MBEDTLS_SELF_TEST) && defined(MBEDTLS_AES_C)
  16946. /*
  16947. * AES-GCM test vectors from:
  16948. *
  16949. * http://csrc.nist.gov/groups/STM/cavp/documents/mac/gcmtestvectors.zip
  16950. */
  16951. #define MAX_TESTS 6
  16952. static const int key_index[MAX_TESTS] =
  16953. { 0, 0, 1, 1, 1, 1 };
  16954. static const unsigned char key[MAX_TESTS][32] =
  16955. {
  16956. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  16957. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  16958. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  16959. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  16960. { 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c,
  16961. 0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08,
  16962. 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c,
  16963. 0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08 },
  16964. };
  16965. static const size_t iv_len[MAX_TESTS] =
  16966. { 12, 12, 12, 12, 8, 60 };
  16967. static const int iv_index[MAX_TESTS] =
  16968. { 0, 0, 1, 1, 1, 2 };
  16969. static const unsigned char iv[MAX_TESTS][64] =
  16970. {
  16971. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  16972. 0x00, 0x00, 0x00, 0x00 },
  16973. { 0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce, 0xdb, 0xad,
  16974. 0xde, 0xca, 0xf8, 0x88 },
  16975. { 0x93, 0x13, 0x22, 0x5d, 0xf8, 0x84, 0x06, 0xe5,
  16976. 0x55, 0x90, 0x9c, 0x5a, 0xff, 0x52, 0x69, 0xaa,
  16977. 0x6a, 0x7a, 0x95, 0x38, 0x53, 0x4f, 0x7d, 0xa1,
  16978. 0xe4, 0xc3, 0x03, 0xd2, 0xa3, 0x18, 0xa7, 0x28,
  16979. 0xc3, 0xc0, 0xc9, 0x51, 0x56, 0x80, 0x95, 0x39,
  16980. 0xfc, 0xf0, 0xe2, 0x42, 0x9a, 0x6b, 0x52, 0x54,
  16981. 0x16, 0xae, 0xdb, 0xf5, 0xa0, 0xde, 0x6a, 0x57,
  16982. 0xa6, 0x37, 0xb3, 0x9b },
  16983. };
  16984. static const size_t add_len[MAX_TESTS] =
  16985. { 0, 0, 0, 20, 20, 20 };
  16986. static const int add_index[MAX_TESTS] =
  16987. { 0, 0, 0, 1, 1, 1 };
  16988. static const unsigned char additional[MAX_TESTS][64] =
  16989. {
  16990. { 0x00 },
  16991. { 0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef,
  16992. 0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef,
  16993. 0xab, 0xad, 0xda, 0xd2 },
  16994. };
  16995. static const size_t pt_len[MAX_TESTS] =
  16996. { 0, 16, 64, 60, 60, 60 };
  16997. static const int pt_index[MAX_TESTS] =
  16998. { 0, 0, 1, 1, 1, 1 };
  16999. static const unsigned char pt[MAX_TESTS][64] =
  17000. {
  17001. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  17002. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  17003. { 0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5,
  17004. 0xa5, 0x59, 0x09, 0xc5, 0xaf, 0xf5, 0x26, 0x9a,
  17005. 0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda,
  17006. 0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31, 0x8a, 0x72,
  17007. 0x1c, 0x3c, 0x0c, 0x95, 0x95, 0x68, 0x09, 0x53,
  17008. 0x2f, 0xcf, 0x0e, 0x24, 0x49, 0xa6, 0xb5, 0x25,
  17009. 0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57,
  17010. 0xba, 0x63, 0x7b, 0x39, 0x1a, 0xaf, 0xd2, 0x55 },
  17011. };
  17012. static const unsigned char ct[MAX_TESTS * 3][64] =
  17013. {
  17014. { 0x00 },
  17015. { 0x03, 0x88, 0xda, 0xce, 0x60, 0xb6, 0xa3, 0x92,
  17016. 0xf3, 0x28, 0xc2, 0xb9, 0x71, 0xb2, 0xfe, 0x78 },
  17017. { 0x42, 0x83, 0x1e, 0xc2, 0x21, 0x77, 0x74, 0x24,
  17018. 0x4b, 0x72, 0x21, 0xb7, 0x84, 0xd0, 0xd4, 0x9c,
  17019. 0xe3, 0xaa, 0x21, 0x2f, 0x2c, 0x02, 0xa4, 0xe0,
  17020. 0x35, 0xc1, 0x7e, 0x23, 0x29, 0xac, 0xa1, 0x2e,
  17021. 0x21, 0xd5, 0x14, 0xb2, 0x54, 0x66, 0x93, 0x1c,
  17022. 0x7d, 0x8f, 0x6a, 0x5a, 0xac, 0x84, 0xaa, 0x05,
  17023. 0x1b, 0xa3, 0x0b, 0x39, 0x6a, 0x0a, 0xac, 0x97,
  17024. 0x3d, 0x58, 0xe0, 0x91, 0x47, 0x3f, 0x59, 0x85 },
  17025. { 0x42, 0x83, 0x1e, 0xc2, 0x21, 0x77, 0x74, 0x24,
  17026. 0x4b, 0x72, 0x21, 0xb7, 0x84, 0xd0, 0xd4, 0x9c,
  17027. 0xe3, 0xaa, 0x21, 0x2f, 0x2c, 0x02, 0xa4, 0xe0,
  17028. 0x35, 0xc1, 0x7e, 0x23, 0x29, 0xac, 0xa1, 0x2e,
  17029. 0x21, 0xd5, 0x14, 0xb2, 0x54, 0x66, 0x93, 0x1c,
  17030. 0x7d, 0x8f, 0x6a, 0x5a, 0xac, 0x84, 0xaa, 0x05,
  17031. 0x1b, 0xa3, 0x0b, 0x39, 0x6a, 0x0a, 0xac, 0x97,
  17032. 0x3d, 0x58, 0xe0, 0x91 },
  17033. { 0x61, 0x35, 0x3b, 0x4c, 0x28, 0x06, 0x93, 0x4a,
  17034. 0x77, 0x7f, 0xf5, 0x1f, 0xa2, 0x2a, 0x47, 0x55,
  17035. 0x69, 0x9b, 0x2a, 0x71, 0x4f, 0xcd, 0xc6, 0xf8,
  17036. 0x37, 0x66, 0xe5, 0xf9, 0x7b, 0x6c, 0x74, 0x23,
  17037. 0x73, 0x80, 0x69, 0x00, 0xe4, 0x9f, 0x24, 0xb2,
  17038. 0x2b, 0x09, 0x75, 0x44, 0xd4, 0x89, 0x6b, 0x42,
  17039. 0x49, 0x89, 0xb5, 0xe1, 0xeb, 0xac, 0x0f, 0x07,
  17040. 0xc2, 0x3f, 0x45, 0x98 },
  17041. { 0x8c, 0xe2, 0x49, 0x98, 0x62, 0x56, 0x15, 0xb6,
  17042. 0x03, 0xa0, 0x33, 0xac, 0xa1, 0x3f, 0xb8, 0x94,
  17043. 0xbe, 0x91, 0x12, 0xa5, 0xc3, 0xa2, 0x11, 0xa8,
  17044. 0xba, 0x26, 0x2a, 0x3c, 0xca, 0x7e, 0x2c, 0xa7,
  17045. 0x01, 0xe4, 0xa9, 0xa4, 0xfb, 0xa4, 0x3c, 0x90,
  17046. 0xcc, 0xdc, 0xb2, 0x81, 0xd4, 0x8c, 0x7c, 0x6f,
  17047. 0xd6, 0x28, 0x75, 0xd2, 0xac, 0xa4, 0x17, 0x03,
  17048. 0x4c, 0x34, 0xae, 0xe5 },
  17049. { 0x00 },
  17050. { 0x98, 0xe7, 0x24, 0x7c, 0x07, 0xf0, 0xfe, 0x41,
  17051. 0x1c, 0x26, 0x7e, 0x43, 0x84, 0xb0, 0xf6, 0x00 },
  17052. { 0x39, 0x80, 0xca, 0x0b, 0x3c, 0x00, 0xe8, 0x41,
  17053. 0xeb, 0x06, 0xfa, 0xc4, 0x87, 0x2a, 0x27, 0x57,
  17054. 0x85, 0x9e, 0x1c, 0xea, 0xa6, 0xef, 0xd9, 0x84,
  17055. 0x62, 0x85, 0x93, 0xb4, 0x0c, 0xa1, 0xe1, 0x9c,
  17056. 0x7d, 0x77, 0x3d, 0x00, 0xc1, 0x44, 0xc5, 0x25,
  17057. 0xac, 0x61, 0x9d, 0x18, 0xc8, 0x4a, 0x3f, 0x47,
  17058. 0x18, 0xe2, 0x44, 0x8b, 0x2f, 0xe3, 0x24, 0xd9,
  17059. 0xcc, 0xda, 0x27, 0x10, 0xac, 0xad, 0xe2, 0x56 },
  17060. { 0x39, 0x80, 0xca, 0x0b, 0x3c, 0x00, 0xe8, 0x41,
  17061. 0xeb, 0x06, 0xfa, 0xc4, 0x87, 0x2a, 0x27, 0x57,
  17062. 0x85, 0x9e, 0x1c, 0xea, 0xa6, 0xef, 0xd9, 0x84,
  17063. 0x62, 0x85, 0x93, 0xb4, 0x0c, 0xa1, 0xe1, 0x9c,
  17064. 0x7d, 0x77, 0x3d, 0x00, 0xc1, 0x44, 0xc5, 0x25,
  17065. 0xac, 0x61, 0x9d, 0x18, 0xc8, 0x4a, 0x3f, 0x47,
  17066. 0x18, 0xe2, 0x44, 0x8b, 0x2f, 0xe3, 0x24, 0xd9,
  17067. 0xcc, 0xda, 0x27, 0x10 },
  17068. { 0x0f, 0x10, 0xf5, 0x99, 0xae, 0x14, 0xa1, 0x54,
  17069. 0xed, 0x24, 0xb3, 0x6e, 0x25, 0x32, 0x4d, 0xb8,
  17070. 0xc5, 0x66, 0x63, 0x2e, 0xf2, 0xbb, 0xb3, 0x4f,
  17071. 0x83, 0x47, 0x28, 0x0f, 0xc4, 0x50, 0x70, 0x57,
  17072. 0xfd, 0xdc, 0x29, 0xdf, 0x9a, 0x47, 0x1f, 0x75,
  17073. 0xc6, 0x65, 0x41, 0xd4, 0xd4, 0xda, 0xd1, 0xc9,
  17074. 0xe9, 0x3a, 0x19, 0xa5, 0x8e, 0x8b, 0x47, 0x3f,
  17075. 0xa0, 0xf0, 0x62, 0xf7 },
  17076. { 0xd2, 0x7e, 0x88, 0x68, 0x1c, 0xe3, 0x24, 0x3c,
  17077. 0x48, 0x30, 0x16, 0x5a, 0x8f, 0xdc, 0xf9, 0xff,
  17078. 0x1d, 0xe9, 0xa1, 0xd8, 0xe6, 0xb4, 0x47, 0xef,
  17079. 0x6e, 0xf7, 0xb7, 0x98, 0x28, 0x66, 0x6e, 0x45,
  17080. 0x81, 0xe7, 0x90, 0x12, 0xaf, 0x34, 0xdd, 0xd9,
  17081. 0xe2, 0xf0, 0x37, 0x58, 0x9b, 0x29, 0x2d, 0xb3,
  17082. 0xe6, 0x7c, 0x03, 0x67, 0x45, 0xfa, 0x22, 0xe7,
  17083. 0xe9, 0xb7, 0x37, 0x3b },
  17084. { 0x00 },
  17085. { 0xce, 0xa7, 0x40, 0x3d, 0x4d, 0x60, 0x6b, 0x6e,
  17086. 0x07, 0x4e, 0xc5, 0xd3, 0xba, 0xf3, 0x9d, 0x18 },
  17087. { 0x52, 0x2d, 0xc1, 0xf0, 0x99, 0x56, 0x7d, 0x07,
  17088. 0xf4, 0x7f, 0x37, 0xa3, 0x2a, 0x84, 0x42, 0x7d,
  17089. 0x64, 0x3a, 0x8c, 0xdc, 0xbf, 0xe5, 0xc0, 0xc9,
  17090. 0x75, 0x98, 0xa2, 0xbd, 0x25, 0x55, 0xd1, 0xaa,
  17091. 0x8c, 0xb0, 0x8e, 0x48, 0x59, 0x0d, 0xbb, 0x3d,
  17092. 0xa7, 0xb0, 0x8b, 0x10, 0x56, 0x82, 0x88, 0x38,
  17093. 0xc5, 0xf6, 0x1e, 0x63, 0x93, 0xba, 0x7a, 0x0a,
  17094. 0xbc, 0xc9, 0xf6, 0x62, 0x89, 0x80, 0x15, 0xad },
  17095. { 0x52, 0x2d, 0xc1, 0xf0, 0x99, 0x56, 0x7d, 0x07,
  17096. 0xf4, 0x7f, 0x37, 0xa3, 0x2a, 0x84, 0x42, 0x7d,
  17097. 0x64, 0x3a, 0x8c, 0xdc, 0xbf, 0xe5, 0xc0, 0xc9,
  17098. 0x75, 0x98, 0xa2, 0xbd, 0x25, 0x55, 0xd1, 0xaa,
  17099. 0x8c, 0xb0, 0x8e, 0x48, 0x59, 0x0d, 0xbb, 0x3d,
  17100. 0xa7, 0xb0, 0x8b, 0x10, 0x56, 0x82, 0x88, 0x38,
  17101. 0xc5, 0xf6, 0x1e, 0x63, 0x93, 0xba, 0x7a, 0x0a,
  17102. 0xbc, 0xc9, 0xf6, 0x62 },
  17103. { 0xc3, 0x76, 0x2d, 0xf1, 0xca, 0x78, 0x7d, 0x32,
  17104. 0xae, 0x47, 0xc1, 0x3b, 0xf1, 0x98, 0x44, 0xcb,
  17105. 0xaf, 0x1a, 0xe1, 0x4d, 0x0b, 0x97, 0x6a, 0xfa,
  17106. 0xc5, 0x2f, 0xf7, 0xd7, 0x9b, 0xba, 0x9d, 0xe0,
  17107. 0xfe, 0xb5, 0x82, 0xd3, 0x39, 0x34, 0xa4, 0xf0,
  17108. 0x95, 0x4c, 0xc2, 0x36, 0x3b, 0xc7, 0x3f, 0x78,
  17109. 0x62, 0xac, 0x43, 0x0e, 0x64, 0xab, 0xe4, 0x99,
  17110. 0xf4, 0x7c, 0x9b, 0x1f },
  17111. { 0x5a, 0x8d, 0xef, 0x2f, 0x0c, 0x9e, 0x53, 0xf1,
  17112. 0xf7, 0x5d, 0x78, 0x53, 0x65, 0x9e, 0x2a, 0x20,
  17113. 0xee, 0xb2, 0xb2, 0x2a, 0xaf, 0xde, 0x64, 0x19,
  17114. 0xa0, 0x58, 0xab, 0x4f, 0x6f, 0x74, 0x6b, 0xf4,
  17115. 0x0f, 0xc0, 0xc3, 0xb7, 0x80, 0xf2, 0x44, 0x45,
  17116. 0x2d, 0xa3, 0xeb, 0xf1, 0xc5, 0xd8, 0x2c, 0xde,
  17117. 0xa2, 0x41, 0x89, 0x97, 0x20, 0x0e, 0xf8, 0x2e,
  17118. 0x44, 0xae, 0x7e, 0x3f },
  17119. };
  17120. static const unsigned char tag[MAX_TESTS * 3][16] =
  17121. {
  17122. { 0x58, 0xe2, 0xfc, 0xce, 0xfa, 0x7e, 0x30, 0x61,
  17123. 0x36, 0x7f, 0x1d, 0x57, 0xa4, 0xe7, 0x45, 0x5a },
  17124. { 0xab, 0x6e, 0x47, 0xd4, 0x2c, 0xec, 0x13, 0xbd,
  17125. 0xf5, 0x3a, 0x67, 0xb2, 0x12, 0x57, 0xbd, 0xdf },
  17126. { 0x4d, 0x5c, 0x2a, 0xf3, 0x27, 0xcd, 0x64, 0xa6,
  17127. 0x2c, 0xf3, 0x5a, 0xbd, 0x2b, 0xa6, 0xfa, 0xb4 },
  17128. { 0x5b, 0xc9, 0x4f, 0xbc, 0x32, 0x21, 0xa5, 0xdb,
  17129. 0x94, 0xfa, 0xe9, 0x5a, 0xe7, 0x12, 0x1a, 0x47 },
  17130. { 0x36, 0x12, 0xd2, 0xe7, 0x9e, 0x3b, 0x07, 0x85,
  17131. 0x56, 0x1b, 0xe1, 0x4a, 0xac, 0xa2, 0xfc, 0xcb },
  17132. { 0x61, 0x9c, 0xc5, 0xae, 0xff, 0xfe, 0x0b, 0xfa,
  17133. 0x46, 0x2a, 0xf4, 0x3c, 0x16, 0x99, 0xd0, 0x50 },
  17134. { 0xcd, 0x33, 0xb2, 0x8a, 0xc7, 0x73, 0xf7, 0x4b,
  17135. 0xa0, 0x0e, 0xd1, 0xf3, 0x12, 0x57, 0x24, 0x35 },
  17136. { 0x2f, 0xf5, 0x8d, 0x80, 0x03, 0x39, 0x27, 0xab,
  17137. 0x8e, 0xf4, 0xd4, 0x58, 0x75, 0x14, 0xf0, 0xfb },
  17138. { 0x99, 0x24, 0xa7, 0xc8, 0x58, 0x73, 0x36, 0xbf,
  17139. 0xb1, 0x18, 0x02, 0x4d, 0xb8, 0x67, 0x4a, 0x14 },
  17140. { 0x25, 0x19, 0x49, 0x8e, 0x80, 0xf1, 0x47, 0x8f,
  17141. 0x37, 0xba, 0x55, 0xbd, 0x6d, 0x27, 0x61, 0x8c },
  17142. { 0x65, 0xdc, 0xc5, 0x7f, 0xcf, 0x62, 0x3a, 0x24,
  17143. 0x09, 0x4f, 0xcc, 0xa4, 0x0d, 0x35, 0x33, 0xf8 },
  17144. { 0xdc, 0xf5, 0x66, 0xff, 0x29, 0x1c, 0x25, 0xbb,
  17145. 0xb8, 0x56, 0x8f, 0xc3, 0xd3, 0x76, 0xa6, 0xd9 },
  17146. { 0x53, 0x0f, 0x8a, 0xfb, 0xc7, 0x45, 0x36, 0xb9,
  17147. 0xa9, 0x63, 0xb4, 0xf1, 0xc4, 0xcb, 0x73, 0x8b },
  17148. { 0xd0, 0xd1, 0xc8, 0xa7, 0x99, 0x99, 0x6b, 0xf0,
  17149. 0x26, 0x5b, 0x98, 0xb5, 0xd4, 0x8a, 0xb9, 0x19 },
  17150. { 0xb0, 0x94, 0xda, 0xc5, 0xd9, 0x34, 0x71, 0xbd,
  17151. 0xec, 0x1a, 0x50, 0x22, 0x70, 0xe3, 0xcc, 0x6c },
  17152. { 0x76, 0xfc, 0x6e, 0xce, 0x0f, 0x4e, 0x17, 0x68,
  17153. 0xcd, 0xdf, 0x88, 0x53, 0xbb, 0x2d, 0x55, 0x1b },
  17154. { 0x3a, 0x33, 0x7d, 0xbf, 0x46, 0xa7, 0x92, 0xc4,
  17155. 0x5e, 0x45, 0x49, 0x13, 0xfe, 0x2e, 0xa8, 0xf2 },
  17156. { 0xa4, 0x4a, 0x82, 0x66, 0xee, 0x1c, 0x8e, 0xb0,
  17157. 0xc8, 0xb5, 0xd4, 0xcf, 0x5a, 0xe9, 0xf1, 0x9a },
  17158. };
  17159. int mbedtls_gcm_self_test( int verbose )
  17160. {
  17161. mbedtls_gcm_context ctx;
  17162. unsigned char buf[64];
  17163. unsigned char tag_buf[16];
  17164. int i, j, ret;
  17165. mbedtls_cipher_id_t cipher = MBEDTLS_CIPHER_ID_AES;
  17166. mbedtls_gcm_init( &ctx );
  17167. for( j = 0; j < 3; j++ )
  17168. {
  17169. int key_len = 128 + 64 * j;
  17170. for( i = 0; i < MAX_TESTS; i++ )
  17171. {
  17172. if( verbose != 0 )
  17173. mbedtls_printf( " AES-GCM-%3d #%d (%s): ",
  17174. key_len, i, "enc" );
  17175. mbedtls_gcm_setkey( &ctx, cipher, key[key_index[i]], key_len );
  17176. ret = mbedtls_gcm_crypt_and_tag( &ctx, MBEDTLS_GCM_ENCRYPT,
  17177. pt_len[i],
  17178. iv[iv_index[i]], iv_len[i],
  17179. additional[add_index[i]], add_len[i],
  17180. pt[pt_index[i]], buf, 16, tag_buf );
  17181. if( ret != 0 ||
  17182. memcmp( buf, ct[j * 6 + i], pt_len[i] ) != 0 ||
  17183. memcmp( tag_buf, tag[j * 6 + i], 16 ) != 0 )
  17184. {
  17185. if( verbose != 0 )
  17186. mbedtls_printf( "failed\n" );
  17187. return( 1 );
  17188. }
  17189. mbedtls_gcm_free( &ctx );
  17190. if( verbose != 0 )
  17191. mbedtls_printf( "passed\n" );
  17192. if( verbose != 0 )
  17193. mbedtls_printf( " AES-GCM-%3d #%d (%s): ",
  17194. key_len, i, "dec" );
  17195. mbedtls_gcm_setkey( &ctx, cipher, key[key_index[i]], key_len );
  17196. ret = mbedtls_gcm_crypt_and_tag( &ctx, MBEDTLS_GCM_DECRYPT,
  17197. pt_len[i],
  17198. iv[iv_index[i]], iv_len[i],
  17199. additional[add_index[i]], add_len[i],
  17200. ct[j * 6 + i], buf, 16, tag_buf );
  17201. if( ret != 0 ||
  17202. memcmp( buf, pt[pt_index[i]], pt_len[i] ) != 0 ||
  17203. memcmp( tag_buf, tag[j * 6 + i], 16 ) != 0 )
  17204. {
  17205. if( verbose != 0 )
  17206. mbedtls_printf( "failed\n" );
  17207. return( 1 );
  17208. }
  17209. mbedtls_gcm_free( &ctx );
  17210. if( verbose != 0 )
  17211. mbedtls_printf( "passed\n" );
  17212. if( verbose != 0 )
  17213. mbedtls_printf( " AES-GCM-%3d #%d split (%s): ",
  17214. key_len, i, "enc" );
  17215. mbedtls_gcm_setkey( &ctx, cipher, key[key_index[i]], key_len );
  17216. ret = mbedtls_gcm_starts( &ctx, MBEDTLS_GCM_ENCRYPT,
  17217. iv[iv_index[i]], iv_len[i],
  17218. additional[add_index[i]], add_len[i] );
  17219. if( ret != 0 )
  17220. {
  17221. if( verbose != 0 )
  17222. mbedtls_printf( "failed\n" );
  17223. return( 1 );
  17224. }
  17225. if( pt_len[i] > 32 )
  17226. {
  17227. size_t rest_len = pt_len[i] - 32;
  17228. ret = mbedtls_gcm_update( &ctx, 32, pt[pt_index[i]], buf );
  17229. if( ret != 0 )
  17230. {
  17231. if( verbose != 0 )
  17232. mbedtls_printf( "failed\n" );
  17233. return( 1 );
  17234. }
  17235. ret = mbedtls_gcm_update( &ctx, rest_len, pt[pt_index[i]] + 32,
  17236. buf + 32 );
  17237. if( ret != 0 )
  17238. {
  17239. if( verbose != 0 )
  17240. mbedtls_printf( "failed\n" );
  17241. return( 1 );
  17242. }
  17243. }
  17244. else
  17245. {
  17246. ret = mbedtls_gcm_update( &ctx, pt_len[i], pt[pt_index[i]], buf );
  17247. if( ret != 0 )
  17248. {
  17249. if( verbose != 0 )
  17250. mbedtls_printf( "failed\n" );
  17251. return( 1 );
  17252. }
  17253. }
  17254. ret = mbedtls_gcm_finish( &ctx, tag_buf, 16 );
  17255. if( ret != 0 ||
  17256. memcmp( buf, ct[j * 6 + i], pt_len[i] ) != 0 ||
  17257. memcmp( tag_buf, tag[j * 6 + i], 16 ) != 0 )
  17258. {
  17259. if( verbose != 0 )
  17260. mbedtls_printf( "failed\n" );
  17261. return( 1 );
  17262. }
  17263. mbedtls_gcm_free( &ctx );
  17264. if( verbose != 0 )
  17265. mbedtls_printf( "passed\n" );
  17266. if( verbose != 0 )
  17267. mbedtls_printf( " AES-GCM-%3d #%d split (%s): ",
  17268. key_len, i, "dec" );
  17269. mbedtls_gcm_setkey( &ctx, cipher, key[key_index[i]], key_len );
  17270. ret = mbedtls_gcm_starts( &ctx, MBEDTLS_GCM_DECRYPT,
  17271. iv[iv_index[i]], iv_len[i],
  17272. additional[add_index[i]], add_len[i] );
  17273. if( ret != 0 )
  17274. {
  17275. if( verbose != 0 )
  17276. mbedtls_printf( "failed\n" );
  17277. return( 1 );
  17278. }
  17279. if( pt_len[i] > 32 )
  17280. {
  17281. size_t rest_len = pt_len[i] - 32;
  17282. ret = mbedtls_gcm_update( &ctx, 32, ct[j * 6 + i], buf );
  17283. if( ret != 0 )
  17284. {
  17285. if( verbose != 0 )
  17286. mbedtls_printf( "failed\n" );
  17287. return( 1 );
  17288. }
  17289. ret = mbedtls_gcm_update( &ctx, rest_len, ct[j * 6 + i] + 32,
  17290. buf + 32 );
  17291. if( ret != 0 )
  17292. {
  17293. if( verbose != 0 )
  17294. mbedtls_printf( "failed\n" );
  17295. return( 1 );
  17296. }
  17297. }
  17298. else
  17299. {
  17300. ret = mbedtls_gcm_update( &ctx, pt_len[i], ct[j * 6 + i], buf );
  17301. if( ret != 0 )
  17302. {
  17303. if( verbose != 0 )
  17304. mbedtls_printf( "failed\n" );
  17305. return( 1 );
  17306. }
  17307. }
  17308. ret = mbedtls_gcm_finish( &ctx, tag_buf, 16 );
  17309. if( ret != 0 ||
  17310. memcmp( buf, pt[pt_index[i]], pt_len[i] ) != 0 ||
  17311. memcmp( tag_buf, tag[j * 6 + i], 16 ) != 0 )
  17312. {
  17313. if( verbose != 0 )
  17314. mbedtls_printf( "failed\n" );
  17315. return( 1 );
  17316. }
  17317. mbedtls_gcm_free( &ctx );
  17318. if( verbose != 0 )
  17319. mbedtls_printf( "passed\n" );
  17320. }
  17321. }
  17322. if( verbose != 0 )
  17323. mbedtls_printf( "\n" );
  17324. return( 0 );
  17325. }
  17326. #endif /* MBEDTLS_SELF_TEST && MBEDTLS_AES_C */
  17327. #endif /* MBEDTLS_GCM_C */
  17328. /********* Start of file library/havege.c ************/
  17329. /**
  17330. * \brief HAVEGE: HArdware Volatile Entropy Gathering and Expansion
  17331. *
  17332. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  17333. * SPDX-License-Identifier: Apache-2.0
  17334. *
  17335. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  17336. * not use this file except in compliance with the License.
  17337. * You may obtain a copy of the License at
  17338. *
  17339. * http://www.apache.org/licenses/LICENSE-2.0
  17340. *
  17341. * Unless required by applicable law or agreed to in writing, software
  17342. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  17343. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  17344. * See the License for the specific language governing permissions and
  17345. * limitations under the License.
  17346. *
  17347. * This file is part of mbed TLS (https://tls.mbed.org)
  17348. */
  17349. /*
  17350. * The HAVEGE RNG was designed by Andre Seznec in 2002.
  17351. *
  17352. * http://www.irisa.fr/caps/projects/hipsor/publi.php
  17353. *
  17354. * Contact: seznec(at)irisa_dot_fr - orocheco(at)irisa_dot_fr
  17355. */
  17356. #if !defined(MBEDTLS_CONFIG_FILE)
  17357. #else
  17358. #endif
  17359. #if defined(MBEDTLS_HAVEGE_C)
  17360. #include <string.h>
  17361. /* Implementation that should never be optimized out by the compiler */
  17362. static void havege_zeroize( void *v, size_t n ) {
  17363. volatile unsigned char *p = v; while( n-- ) *p++ = 0;
  17364. }
  17365. /* ------------------------------------------------------------------------
  17366. * On average, one iteration accesses two 8-word blocks in the havege WALK
  17367. * table, and generates 16 words in the RES array.
  17368. *
  17369. * The data read in the WALK table is updated and permuted after each use.
  17370. * The result of the hardware clock counter read is used for this update.
  17371. *
  17372. * 25 conditional tests are present. The conditional tests are grouped in
  17373. * two nested groups of 12 conditional tests and 1 test that controls the
  17374. * permutation; on average, there should be 6 tests executed and 3 of them
  17375. * should be mispredicted.
  17376. * ------------------------------------------------------------------------
  17377. */
  17378. #define SWAP(X,Y) { int *T = X; X = Y; Y = T; }
  17379. #define TST1_ENTER if( PTEST & 1 ) { PTEST ^= 3; PTEST >>= 1;
  17380. #define TST2_ENTER if( PTEST & 1 ) { PTEST ^= 3; PTEST >>= 1;
  17381. #define TST1_LEAVE U1++; }
  17382. #define TST2_LEAVE U2++; }
  17383. #define ONE_ITERATION \
  17384. \
  17385. PTEST = PT1 >> 20; \
  17386. \
  17387. TST1_ENTER TST1_ENTER TST1_ENTER TST1_ENTER \
  17388. TST1_ENTER TST1_ENTER TST1_ENTER TST1_ENTER \
  17389. TST1_ENTER TST1_ENTER TST1_ENTER TST1_ENTER \
  17390. \
  17391. TST1_LEAVE TST1_LEAVE TST1_LEAVE TST1_LEAVE \
  17392. TST1_LEAVE TST1_LEAVE TST1_LEAVE TST1_LEAVE \
  17393. TST1_LEAVE TST1_LEAVE TST1_LEAVE TST1_LEAVE \
  17394. \
  17395. PTX = (PT1 >> 18) & 7; \
  17396. PT1 &= 0x1FFF; \
  17397. PT2 &= 0x1FFF; \
  17398. CLK = (int) mbedtls_timing_hardclock(); \
  17399. \
  17400. i = 0; \
  17401. A = &WALK[PT1 ]; RES[i++] ^= *A; \
  17402. B = &WALK[PT2 ]; RES[i++] ^= *B; \
  17403. C = &WALK[PT1 ^ 1]; RES[i++] ^= *C; \
  17404. D = &WALK[PT2 ^ 4]; RES[i++] ^= *D; \
  17405. \
  17406. IN = (*A >> (1)) ^ (*A << (31)) ^ CLK; \
  17407. *A = (*B >> (2)) ^ (*B << (30)) ^ CLK; \
  17408. *B = IN ^ U1; \
  17409. *C = (*C >> (3)) ^ (*C << (29)) ^ CLK; \
  17410. *D = (*D >> (4)) ^ (*D << (28)) ^ CLK; \
  17411. \
  17412. A = &WALK[PT1 ^ 2]; RES[i++] ^= *A; \
  17413. B = &WALK[PT2 ^ 2]; RES[i++] ^= *B; \
  17414. C = &WALK[PT1 ^ 3]; RES[i++] ^= *C; \
  17415. D = &WALK[PT2 ^ 6]; RES[i++] ^= *D; \
  17416. \
  17417. if( PTEST & 1 ) SWAP( A, C ); \
  17418. \
  17419. IN = (*A >> (5)) ^ (*A << (27)) ^ CLK; \
  17420. *A = (*B >> (6)) ^ (*B << (26)) ^ CLK; \
  17421. *B = IN; CLK = (int) mbedtls_timing_hardclock(); \
  17422. *C = (*C >> (7)) ^ (*C << (25)) ^ CLK; \
  17423. *D = (*D >> (8)) ^ (*D << (24)) ^ CLK; \
  17424. \
  17425. A = &WALK[PT1 ^ 4]; \
  17426. B = &WALK[PT2 ^ 1]; \
  17427. \
  17428. PTEST = PT2 >> 1; \
  17429. \
  17430. PT2 = (RES[(i - 8) ^ PTY] ^ WALK[PT2 ^ PTY ^ 7]); \
  17431. PT2 = ((PT2 & 0x1FFF) & (~8)) ^ ((PT1 ^ 8) & 0x8); \
  17432. PTY = (PT2 >> 10) & 7; \
  17433. \
  17434. TST2_ENTER TST2_ENTER TST2_ENTER TST2_ENTER \
  17435. TST2_ENTER TST2_ENTER TST2_ENTER TST2_ENTER \
  17436. TST2_ENTER TST2_ENTER TST2_ENTER TST2_ENTER \
  17437. \
  17438. TST2_LEAVE TST2_LEAVE TST2_LEAVE TST2_LEAVE \
  17439. TST2_LEAVE TST2_LEAVE TST2_LEAVE TST2_LEAVE \
  17440. TST2_LEAVE TST2_LEAVE TST2_LEAVE TST2_LEAVE \
  17441. \
  17442. C = &WALK[PT1 ^ 5]; \
  17443. D = &WALK[PT2 ^ 5]; \
  17444. \
  17445. RES[i++] ^= *A; \
  17446. RES[i++] ^= *B; \
  17447. RES[i++] ^= *C; \
  17448. RES[i++] ^= *D; \
  17449. \
  17450. IN = (*A >> ( 9)) ^ (*A << (23)) ^ CLK; \
  17451. *A = (*B >> (10)) ^ (*B << (22)) ^ CLK; \
  17452. *B = IN ^ U2; \
  17453. *C = (*C >> (11)) ^ (*C << (21)) ^ CLK; \
  17454. *D = (*D >> (12)) ^ (*D << (20)) ^ CLK; \
  17455. \
  17456. A = &WALK[PT1 ^ 6]; RES[i++] ^= *A; \
  17457. B = &WALK[PT2 ^ 3]; RES[i++] ^= *B; \
  17458. C = &WALK[PT1 ^ 7]; RES[i++] ^= *C; \
  17459. D = &WALK[PT2 ^ 7]; RES[i++] ^= *D; \
  17460. \
  17461. IN = (*A >> (13)) ^ (*A << (19)) ^ CLK; \
  17462. *A = (*B >> (14)) ^ (*B << (18)) ^ CLK; \
  17463. *B = IN; \
  17464. *C = (*C >> (15)) ^ (*C << (17)) ^ CLK; \
  17465. *D = (*D >> (16)) ^ (*D << (16)) ^ CLK; \
  17466. \
  17467. PT1 = ( RES[( i - 8 ) ^ PTX] ^ \
  17468. WALK[PT1 ^ PTX ^ 7] ) & (~1); \
  17469. PT1 ^= (PT2 ^ 0x10) & 0x10; \
  17470. \
  17471. for( n++, i = 0; i < 16; i++ ) \
  17472. hs->pool[n % MBEDTLS_HAVEGE_COLLECT_SIZE] ^= RES[i];
  17473. /*
  17474. * Entropy gathering function
  17475. */
  17476. static void havege_fill( mbedtls_havege_state *hs )
  17477. {
  17478. int i, n = 0;
  17479. int U1, U2, *A, *B, *C, *D;
  17480. int PT1, PT2, *WALK, RES[16];
  17481. int PTX, PTY, CLK, PTEST, IN;
  17482. WALK = hs->WALK;
  17483. PT1 = hs->PT1;
  17484. PT2 = hs->PT2;
  17485. PTX = U1 = 0;
  17486. PTY = U2 = 0;
  17487. memset( RES, 0, sizeof( RES ) );
  17488. while( n < MBEDTLS_HAVEGE_COLLECT_SIZE * 4 )
  17489. {
  17490. ONE_ITERATION
  17491. ONE_ITERATION
  17492. ONE_ITERATION
  17493. ONE_ITERATION
  17494. }
  17495. hs->PT1 = PT1;
  17496. hs->PT2 = PT2;
  17497. hs->offset[0] = 0;
  17498. hs->offset[1] = MBEDTLS_HAVEGE_COLLECT_SIZE / 2;
  17499. }
  17500. /*
  17501. * HAVEGE initialization
  17502. */
  17503. void mbedtls_havege_init( mbedtls_havege_state *hs )
  17504. {
  17505. memset( hs, 0, sizeof( mbedtls_havege_state ) );
  17506. havege_fill( hs );
  17507. }
  17508. void mbedtls_havege_free( mbedtls_havege_state *hs )
  17509. {
  17510. if( hs == NULL )
  17511. return;
  17512. havege_zeroize( hs, sizeof( mbedtls_havege_state ) );
  17513. }
  17514. /*
  17515. * HAVEGE rand function
  17516. */
  17517. int mbedtls_havege_random( void *p_rng, unsigned char *buf, size_t len )
  17518. {
  17519. int val;
  17520. size_t use_len;
  17521. mbedtls_havege_state *hs = (mbedtls_havege_state *) p_rng;
  17522. unsigned char *p = buf;
  17523. while( len > 0 )
  17524. {
  17525. use_len = len;
  17526. if( use_len > sizeof(int) )
  17527. use_len = sizeof(int);
  17528. if( hs->offset[1] >= MBEDTLS_HAVEGE_COLLECT_SIZE )
  17529. havege_fill( hs );
  17530. val = hs->pool[hs->offset[0]++];
  17531. val ^= hs->pool[hs->offset[1]++];
  17532. memcpy( p, &val, use_len );
  17533. len -= use_len;
  17534. p += use_len;
  17535. }
  17536. return( 0 );
  17537. }
  17538. #endif /* MBEDTLS_HAVEGE_C */
  17539. /********* Start of file library/hmac_drbg.c ************/
  17540. /*
  17541. * HMAC_DRBG implementation (NIST SP 800-90)
  17542. *
  17543. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  17544. * SPDX-License-Identifier: Apache-2.0
  17545. *
  17546. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  17547. * not use this file except in compliance with the License.
  17548. * You may obtain a copy of the License at
  17549. *
  17550. * http://www.apache.org/licenses/LICENSE-2.0
  17551. *
  17552. * Unless required by applicable law or agreed to in writing, software
  17553. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  17554. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  17555. * See the License for the specific language governing permissions and
  17556. * limitations under the License.
  17557. *
  17558. * This file is part of mbed TLS (https://tls.mbed.org)
  17559. */
  17560. /*
  17561. * The NIST SP 800-90A DRBGs are described in the following publication.
  17562. * http://csrc.nist.gov/publications/nistpubs/800-90A/SP800-90A.pdf
  17563. * References below are based on rev. 1 (January 2012).
  17564. */
  17565. #if !defined(MBEDTLS_CONFIG_FILE)
  17566. #else
  17567. #endif
  17568. #if defined(MBEDTLS_HMAC_DRBG_C)
  17569. #include <string.h>
  17570. #if defined(MBEDTLS_FS_IO)
  17571. #include <stdio.h>
  17572. #endif
  17573. #if defined(MBEDTLS_SELF_TEST)
  17574. #if defined(MBEDTLS_PLATFORM_C)
  17575. #else
  17576. #include <stdio.h>
  17577. #define mbedtls_printf printf
  17578. #endif /* MBEDTLS_SELF_TEST */
  17579. #endif /* MBEDTLS_PLATFORM_C */
  17580. /* Implementation that should never be optimized out by the compiler */
  17581. static void hmac_zeroize( void *v, size_t n ) {
  17582. volatile unsigned char *p = v; while( n-- ) *p++ = 0;
  17583. }
  17584. /*
  17585. * HMAC_DRBG context initialization
  17586. */
  17587. void mbedtls_hmac_drbg_init( mbedtls_hmac_drbg_context *ctx )
  17588. {
  17589. memset( ctx, 0, sizeof( mbedtls_hmac_drbg_context ) );
  17590. #if defined(MBEDTLS_THREADING_C)
  17591. mbedtls_mutex_init( &ctx->mutex );
  17592. #endif
  17593. }
  17594. /*
  17595. * HMAC_DRBG update, using optional additional data (10.1.2.2)
  17596. */
  17597. void mbedtls_hmac_drbg_update( mbedtls_hmac_drbg_context *ctx,
  17598. const unsigned char *additional, size_t add_len )
  17599. {
  17600. size_t md_len = mbedtls_md_get_size( ctx->md_ctx.md_info );
  17601. unsigned char rounds = ( additional != NULL && add_len != 0 ) ? 2 : 1;
  17602. unsigned char sep[1];
  17603. unsigned char K[MBEDTLS_MD_MAX_SIZE];
  17604. for( sep[0] = 0; sep[0] < rounds; sep[0]++ )
  17605. {
  17606. /* Step 1 or 4 */
  17607. mbedtls_md_hmac_reset( &ctx->md_ctx );
  17608. mbedtls_md_hmac_update( &ctx->md_ctx, ctx->V, md_len );
  17609. mbedtls_md_hmac_update( &ctx->md_ctx, sep, 1 );
  17610. if( rounds == 2 )
  17611. mbedtls_md_hmac_update( &ctx->md_ctx, additional, add_len );
  17612. mbedtls_md_hmac_finish( &ctx->md_ctx, K );
  17613. /* Step 2 or 5 */
  17614. mbedtls_md_hmac_starts( &ctx->md_ctx, K, md_len );
  17615. mbedtls_md_hmac_update( &ctx->md_ctx, ctx->V, md_len );
  17616. mbedtls_md_hmac_finish( &ctx->md_ctx, ctx->V );
  17617. }
  17618. }
  17619. /*
  17620. * Simplified HMAC_DRBG initialisation (for use with deterministic ECDSA)
  17621. */
  17622. int mbedtls_hmac_drbg_seed_buf( mbedtls_hmac_drbg_context *ctx,
  17623. const mbedtls_md_info_t * md_info,
  17624. const unsigned char *data, size_t data_len )
  17625. {
  17626. int ret;
  17627. if( ( ret = mbedtls_md_setup( &ctx->md_ctx, md_info, 1 ) ) != 0 )
  17628. return( ret );
  17629. /*
  17630. * Set initial working state.
  17631. * Use the V memory location, which is currently all 0, to initialize the
  17632. * MD context with an all-zero key. Then set V to its initial value.
  17633. */
  17634. mbedtls_md_hmac_starts( &ctx->md_ctx, ctx->V, mbedtls_md_get_size( md_info ) );
  17635. memset( ctx->V, 0x01, mbedtls_md_get_size( md_info ) );
  17636. mbedtls_hmac_drbg_update( ctx, data, data_len );
  17637. return( 0 );
  17638. }
  17639. /*
  17640. * HMAC_DRBG reseeding: 10.1.2.4 (arabic) + 9.2 (Roman)
  17641. */
  17642. int mbedtls_hmac_drbg_reseed( mbedtls_hmac_drbg_context *ctx,
  17643. const unsigned char *additional, size_t len )
  17644. {
  17645. unsigned char seed[MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT];
  17646. size_t seedlen;
  17647. /* III. Check input length */
  17648. if( len > MBEDTLS_HMAC_DRBG_MAX_INPUT ||
  17649. ctx->entropy_len + len > MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT )
  17650. {
  17651. return( MBEDTLS_ERR_HMAC_DRBG_INPUT_TOO_BIG );
  17652. }
  17653. memset( seed, 0, MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT );
  17654. /* IV. Gather entropy_len bytes of entropy for the seed */
  17655. if( ctx->f_entropy( ctx->p_entropy, seed, ctx->entropy_len ) != 0 )
  17656. return( MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED );
  17657. seedlen = ctx->entropy_len;
  17658. /* 1. Concatenate entropy and additional data if any */
  17659. if( additional != NULL && len != 0 )
  17660. {
  17661. memcpy( seed + seedlen, additional, len );
  17662. seedlen += len;
  17663. }
  17664. /* 2. Update state */
  17665. mbedtls_hmac_drbg_update( ctx, seed, seedlen );
  17666. /* 3. Reset reseed_counter */
  17667. ctx->reseed_counter = 1;
  17668. /* 4. Done */
  17669. return( 0 );
  17670. }
  17671. /*
  17672. * HMAC_DRBG initialisation (10.1.2.3 + 9.1)
  17673. */
  17674. int mbedtls_hmac_drbg_seed( mbedtls_hmac_drbg_context *ctx,
  17675. const mbedtls_md_info_t * md_info,
  17676. int (*f_entropy)(void *, unsigned char *, size_t),
  17677. void *p_entropy,
  17678. const unsigned char *custom,
  17679. size_t len )
  17680. {
  17681. int ret;
  17682. size_t entropy_len, md_size;
  17683. if( ( ret = mbedtls_md_setup( &ctx->md_ctx, md_info, 1 ) ) != 0 )
  17684. return( ret );
  17685. md_size = mbedtls_md_get_size( md_info );
  17686. /*
  17687. * Set initial working state.
  17688. * Use the V memory location, which is currently all 0, to initialize the
  17689. * MD context with an all-zero key. Then set V to its initial value.
  17690. */
  17691. mbedtls_md_hmac_starts( &ctx->md_ctx, ctx->V, md_size );
  17692. memset( ctx->V, 0x01, md_size );
  17693. ctx->f_entropy = f_entropy;
  17694. ctx->p_entropy = p_entropy;
  17695. ctx->reseed_interval = MBEDTLS_HMAC_DRBG_RESEED_INTERVAL;
  17696. /*
  17697. * See SP800-57 5.6.1 (p. 65-66) for the security strength provided by
  17698. * each hash function, then according to SP800-90A rev1 10.1 table 2,
  17699. * min_entropy_len (in bits) is security_strength.
  17700. *
  17701. * (This also matches the sizes used in the NIST test vectors.)
  17702. */
  17703. entropy_len = md_size <= 20 ? 16 : /* 160-bits hash -> 128 bits */
  17704. md_size <= 28 ? 24 : /* 224-bits hash -> 192 bits */
  17705. 32; /* better (256+) -> 256 bits */
  17706. /*
  17707. * For initialisation, use more entropy to emulate a nonce
  17708. * (Again, matches test vectors.)
  17709. */
  17710. ctx->entropy_len = entropy_len * 3 / 2;
  17711. if( ( ret = mbedtls_hmac_drbg_reseed( ctx, custom, len ) ) != 0 )
  17712. return( ret );
  17713. ctx->entropy_len = entropy_len;
  17714. return( 0 );
  17715. }
  17716. /*
  17717. * Set prediction resistance
  17718. */
  17719. void mbedtls_hmac_drbg_set_prediction_resistance( mbedtls_hmac_drbg_context *ctx,
  17720. int resistance )
  17721. {
  17722. ctx->prediction_resistance = resistance;
  17723. }
  17724. /*
  17725. * Set entropy length grabbed for reseeds
  17726. */
  17727. void mbedtls_hmac_drbg_set_entropy_len( mbedtls_hmac_drbg_context *ctx, size_t len )
  17728. {
  17729. ctx->entropy_len = len;
  17730. }
  17731. /*
  17732. * Set reseed interval
  17733. */
  17734. void mbedtls_hmac_drbg_set_reseed_interval( mbedtls_hmac_drbg_context *ctx, int interval )
  17735. {
  17736. ctx->reseed_interval = interval;
  17737. }
  17738. /*
  17739. * HMAC_DRBG random function with optional additional data:
  17740. * 10.1.2.5 (arabic) + 9.3 (Roman)
  17741. */
  17742. int mbedtls_hmac_drbg_random_with_add( void *p_rng,
  17743. unsigned char *output, size_t out_len,
  17744. const unsigned char *additional, size_t add_len )
  17745. {
  17746. int ret;
  17747. mbedtls_hmac_drbg_context *ctx = (mbedtls_hmac_drbg_context *) p_rng;
  17748. size_t md_len = mbedtls_md_get_size( ctx->md_ctx.md_info );
  17749. size_t left = out_len;
  17750. unsigned char *out = output;
  17751. /* II. Check request length */
  17752. if( out_len > MBEDTLS_HMAC_DRBG_MAX_REQUEST )
  17753. return( MBEDTLS_ERR_HMAC_DRBG_REQUEST_TOO_BIG );
  17754. /* III. Check input length */
  17755. if( add_len > MBEDTLS_HMAC_DRBG_MAX_INPUT )
  17756. return( MBEDTLS_ERR_HMAC_DRBG_INPUT_TOO_BIG );
  17757. /* 1. (aka VII and IX) Check reseed counter and PR */
  17758. if( ctx->f_entropy != NULL && /* For no-reseeding instances */
  17759. ( ctx->prediction_resistance == MBEDTLS_HMAC_DRBG_PR_ON ||
  17760. ctx->reseed_counter > ctx->reseed_interval ) )
  17761. {
  17762. if( ( ret = mbedtls_hmac_drbg_reseed( ctx, additional, add_len ) ) != 0 )
  17763. return( ret );
  17764. add_len = 0; /* VII.4 */
  17765. }
  17766. /* 2. Use additional data if any */
  17767. if( additional != NULL && add_len != 0 )
  17768. mbedtls_hmac_drbg_update( ctx, additional, add_len );
  17769. /* 3, 4, 5. Generate bytes */
  17770. while( left != 0 )
  17771. {
  17772. size_t use_len = left > md_len ? md_len : left;
  17773. mbedtls_md_hmac_reset( &ctx->md_ctx );
  17774. mbedtls_md_hmac_update( &ctx->md_ctx, ctx->V, md_len );
  17775. mbedtls_md_hmac_finish( &ctx->md_ctx, ctx->V );
  17776. memcpy( out, ctx->V, use_len );
  17777. out += use_len;
  17778. left -= use_len;
  17779. }
  17780. /* 6. Update */
  17781. mbedtls_hmac_drbg_update( ctx, additional, add_len );
  17782. /* 7. Update reseed counter */
  17783. ctx->reseed_counter++;
  17784. /* 8. Done */
  17785. return( 0 );
  17786. }
  17787. /*
  17788. * HMAC_DRBG random function
  17789. */
  17790. int mbedtls_hmac_drbg_random( void *p_rng, unsigned char *output, size_t out_len )
  17791. {
  17792. int ret;
  17793. mbedtls_hmac_drbg_context *ctx = (mbedtls_hmac_drbg_context *) p_rng;
  17794. #if defined(MBEDTLS_THREADING_C)
  17795. if( ( ret = mbedtls_mutex_lock( &ctx->mutex ) ) != 0 )
  17796. return( ret );
  17797. #endif
  17798. ret = mbedtls_hmac_drbg_random_with_add( ctx, output, out_len, NULL, 0 );
  17799. #if defined(MBEDTLS_THREADING_C)
  17800. if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 )
  17801. return( MBEDTLS_ERR_THREADING_MUTEX_ERROR );
  17802. #endif
  17803. return( ret );
  17804. }
  17805. /*
  17806. * Free an HMAC_DRBG context
  17807. */
  17808. void mbedtls_hmac_drbg_free( mbedtls_hmac_drbg_context *ctx )
  17809. {
  17810. if( ctx == NULL )
  17811. return;
  17812. #if defined(MBEDTLS_THREADING_C)
  17813. mbedtls_mutex_free( &ctx->mutex );
  17814. #endif
  17815. mbedtls_md_free( &ctx->md_ctx );
  17816. hmac_zeroize( ctx, sizeof( mbedtls_hmac_drbg_context ) );
  17817. }
  17818. #if defined(MBEDTLS_FS_IO)
  17819. int mbedtls_hmac_drbg_write_seed_file( mbedtls_hmac_drbg_context *ctx, const char *path )
  17820. {
  17821. int ret;
  17822. FILE *f;
  17823. unsigned char buf[ MBEDTLS_HMAC_DRBG_MAX_INPUT ];
  17824. if( ( f = fopen( path, "wb" ) ) == NULL )
  17825. return( MBEDTLS_ERR_HMAC_DRBG_FILE_IO_ERROR );
  17826. if( ( ret = mbedtls_hmac_drbg_random( ctx, buf, sizeof( buf ) ) ) != 0 )
  17827. goto exit;
  17828. if( fwrite( buf, 1, sizeof( buf ), f ) != sizeof( buf ) )
  17829. {
  17830. ret = MBEDTLS_ERR_HMAC_DRBG_FILE_IO_ERROR;
  17831. goto exit;
  17832. }
  17833. ret = 0;
  17834. exit:
  17835. fclose( f );
  17836. return( ret );
  17837. }
  17838. int mbedtls_hmac_drbg_update_seed_file( mbedtls_hmac_drbg_context *ctx, const char *path )
  17839. {
  17840. FILE *f;
  17841. size_t n;
  17842. unsigned char buf[ MBEDTLS_HMAC_DRBG_MAX_INPUT ];
  17843. if( ( f = fopen( path, "rb" ) ) == NULL )
  17844. return( MBEDTLS_ERR_HMAC_DRBG_FILE_IO_ERROR );
  17845. fseek( f, 0, SEEK_END );
  17846. n = (size_t) ftell( f );
  17847. fseek( f, 0, SEEK_SET );
  17848. if( n > MBEDTLS_HMAC_DRBG_MAX_INPUT )
  17849. {
  17850. fclose( f );
  17851. return( MBEDTLS_ERR_HMAC_DRBG_INPUT_TOO_BIG );
  17852. }
  17853. if( fread( buf, 1, n, f ) != n )
  17854. {
  17855. fclose( f );
  17856. return( MBEDTLS_ERR_HMAC_DRBG_FILE_IO_ERROR );
  17857. }
  17858. fclose( f );
  17859. mbedtls_hmac_drbg_update( ctx, buf, n );
  17860. return( mbedtls_hmac_drbg_write_seed_file( ctx, path ) );
  17861. }
  17862. #endif /* MBEDTLS_FS_IO */
  17863. #if defined(MBEDTLS_SELF_TEST)
  17864. #if !defined(MBEDTLS_SHA1_C)
  17865. /* Dummy checkup routine */
  17866. int mbedtls_hmac_drbg_self_test( int verbose )
  17867. {
  17868. (void) verbose;
  17869. return( 0 );
  17870. }
  17871. #else
  17872. #define OUTPUT_LEN 80
  17873. /* From a NIST PR=true test vector */
  17874. static const unsigned char entropy_pr[] = {
  17875. 0xa0, 0xc9, 0xab, 0x58, 0xf1, 0xe2, 0xe5, 0xa4, 0xde, 0x3e, 0xbd, 0x4f,
  17876. 0xf7, 0x3e, 0x9c, 0x5b, 0x64, 0xef, 0xd8, 0xca, 0x02, 0x8c, 0xf8, 0x11,
  17877. 0x48, 0xa5, 0x84, 0xfe, 0x69, 0xab, 0x5a, 0xee, 0x42, 0xaa, 0x4d, 0x42,
  17878. 0x17, 0x60, 0x99, 0xd4, 0x5e, 0x13, 0x97, 0xdc, 0x40, 0x4d, 0x86, 0xa3,
  17879. 0x7b, 0xf5, 0x59, 0x54, 0x75, 0x69, 0x51, 0xe4 };
  17880. static const unsigned char result_pr[OUTPUT_LEN] = {
  17881. 0x9a, 0x00, 0xa2, 0xd0, 0x0e, 0xd5, 0x9b, 0xfe, 0x31, 0xec, 0xb1, 0x39,
  17882. 0x9b, 0x60, 0x81, 0x48, 0xd1, 0x96, 0x9d, 0x25, 0x0d, 0x3c, 0x1e, 0x94,
  17883. 0x10, 0x10, 0x98, 0x12, 0x93, 0x25, 0xca, 0xb8, 0xfc, 0xcc, 0x2d, 0x54,
  17884. 0x73, 0x19, 0x70, 0xc0, 0x10, 0x7a, 0xa4, 0x89, 0x25, 0x19, 0x95, 0x5e,
  17885. 0x4b, 0xc6, 0x00, 0x1d, 0x7f, 0x4e, 0x6a, 0x2b, 0xf8, 0xa3, 0x01, 0xab,
  17886. 0x46, 0x05, 0x5c, 0x09, 0xa6, 0x71, 0x88, 0xf1, 0xa7, 0x40, 0xee, 0xf3,
  17887. 0xe1, 0x5c, 0x02, 0x9b, 0x44, 0xaf, 0x03, 0x44 };
  17888. /* From a NIST PR=false test vector */
  17889. static const unsigned char entropy_nopr[] = {
  17890. 0x79, 0x34, 0x9b, 0xbf, 0x7c, 0xdd, 0xa5, 0x79, 0x95, 0x57, 0x86, 0x66,
  17891. 0x21, 0xc9, 0x13, 0x83, 0x11, 0x46, 0x73, 0x3a, 0xbf, 0x8c, 0x35, 0xc8,
  17892. 0xc7, 0x21, 0x5b, 0x5b, 0x96, 0xc4, 0x8e, 0x9b, 0x33, 0x8c, 0x74, 0xe3,
  17893. 0xe9, 0x9d, 0xfe, 0xdf };
  17894. static const unsigned char result_nopr[OUTPUT_LEN] = {
  17895. 0xc6, 0xa1, 0x6a, 0xb8, 0xd4, 0x20, 0x70, 0x6f, 0x0f, 0x34, 0xab, 0x7f,
  17896. 0xec, 0x5a, 0xdc, 0xa9, 0xd8, 0xca, 0x3a, 0x13, 0x3e, 0x15, 0x9c, 0xa6,
  17897. 0xac, 0x43, 0xc6, 0xf8, 0xa2, 0xbe, 0x22, 0x83, 0x4a, 0x4c, 0x0a, 0x0a,
  17898. 0xff, 0xb1, 0x0d, 0x71, 0x94, 0xf1, 0xc1, 0xa5, 0xcf, 0x73, 0x22, 0xec,
  17899. 0x1a, 0xe0, 0x96, 0x4e, 0xd4, 0xbf, 0x12, 0x27, 0x46, 0xe0, 0x87, 0xfd,
  17900. 0xb5, 0xb3, 0xe9, 0x1b, 0x34, 0x93, 0xd5, 0xbb, 0x98, 0xfa, 0xed, 0x49,
  17901. 0xe8, 0x5f, 0x13, 0x0f, 0xc8, 0xa4, 0x59, 0xb7 };
  17902. /* "Entropy" from buffer */
  17903. static size_t test_offset;
  17904. static int hmac_drbg_self_test_entropy( void *data,
  17905. unsigned char *buf, size_t len )
  17906. {
  17907. const unsigned char *p = data;
  17908. memcpy( buf, p + test_offset, len );
  17909. test_offset += len;
  17910. return( 0 );
  17911. }
  17912. #define CHK( c ) if( (c) != 0 ) \
  17913. { \
  17914. if( verbose != 0 ) \
  17915. mbedtls_printf( "failed\n" ); \
  17916. return( 1 ); \
  17917. }
  17918. /*
  17919. * Checkup routine for HMAC_DRBG with SHA-1
  17920. */
  17921. int mbedtls_hmac_drbg_self_test( int verbose )
  17922. {
  17923. mbedtls_hmac_drbg_context ctx;
  17924. unsigned char buf[OUTPUT_LEN];
  17925. const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type( MBEDTLS_MD_SHA1 );
  17926. mbedtls_hmac_drbg_init( &ctx );
  17927. /*
  17928. * PR = True
  17929. */
  17930. if( verbose != 0 )
  17931. mbedtls_printf( " HMAC_DRBG (PR = True) : " );
  17932. test_offset = 0;
  17933. CHK( mbedtls_hmac_drbg_seed( &ctx, md_info,
  17934. hmac_drbg_self_test_entropy, (void *) entropy_pr,
  17935. NULL, 0 ) );
  17936. mbedtls_hmac_drbg_set_prediction_resistance( &ctx, MBEDTLS_HMAC_DRBG_PR_ON );
  17937. CHK( mbedtls_hmac_drbg_random( &ctx, buf, OUTPUT_LEN ) );
  17938. CHK( mbedtls_hmac_drbg_random( &ctx, buf, OUTPUT_LEN ) );
  17939. CHK( memcmp( buf, result_pr, OUTPUT_LEN ) );
  17940. mbedtls_hmac_drbg_free( &ctx );
  17941. mbedtls_hmac_drbg_free( &ctx );
  17942. if( verbose != 0 )
  17943. mbedtls_printf( "passed\n" );
  17944. /*
  17945. * PR = False
  17946. */
  17947. if( verbose != 0 )
  17948. mbedtls_printf( " HMAC_DRBG (PR = False) : " );
  17949. mbedtls_hmac_drbg_init( &ctx );
  17950. test_offset = 0;
  17951. CHK( mbedtls_hmac_drbg_seed( &ctx, md_info,
  17952. hmac_drbg_self_test_entropy, (void *) entropy_nopr,
  17953. NULL, 0 ) );
  17954. CHK( mbedtls_hmac_drbg_reseed( &ctx, NULL, 0 ) );
  17955. CHK( mbedtls_hmac_drbg_random( &ctx, buf, OUTPUT_LEN ) );
  17956. CHK( mbedtls_hmac_drbg_random( &ctx, buf, OUTPUT_LEN ) );
  17957. CHK( memcmp( buf, result_nopr, OUTPUT_LEN ) );
  17958. mbedtls_hmac_drbg_free( &ctx );
  17959. mbedtls_hmac_drbg_free( &ctx );
  17960. if( verbose != 0 )
  17961. mbedtls_printf( "passed\n" );
  17962. if( verbose != 0 )
  17963. mbedtls_printf( "\n" );
  17964. return( 0 );
  17965. }
  17966. #endif /* MBEDTLS_SHA1_C */
  17967. #endif /* MBEDTLS_SELF_TEST */
  17968. #endif /* MBEDTLS_HMAC_DRBG_C */
  17969. /********* Start of file library/md.c ************/
  17970. /**
  17971. * \file mbedtls_md.c
  17972. *
  17973. * \brief Generic message digest wrapper for mbed TLS
  17974. *
  17975. * \author Adriaan de Jong <dejong@fox-it.com>
  17976. *
  17977. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  17978. * SPDX-License-Identifier: Apache-2.0
  17979. *
  17980. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  17981. * not use this file except in compliance with the License.
  17982. * You may obtain a copy of the License at
  17983. *
  17984. * http://www.apache.org/licenses/LICENSE-2.0
  17985. *
  17986. * Unless required by applicable law or agreed to in writing, software
  17987. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  17988. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  17989. * See the License for the specific language governing permissions and
  17990. * limitations under the License.
  17991. *
  17992. * This file is part of mbed TLS (https://tls.mbed.org)
  17993. */
  17994. #if !defined(MBEDTLS_CONFIG_FILE)
  17995. #else
  17996. #endif
  17997. #if defined(MBEDTLS_MD_C)
  17998. #if defined(MBEDTLS_PLATFORM_C)
  17999. #else
  18000. #include <stdlib.h>
  18001. #define mbedtls_calloc calloc
  18002. #define mbedtls_free free
  18003. #endif
  18004. #include <string.h>
  18005. #if defined(MBEDTLS_FS_IO)
  18006. #include <stdio.h>
  18007. #endif
  18008. /* Implementation that should never be optimized out by the compiler */
  18009. static void md_zeroize( void *v, size_t n ) {
  18010. volatile unsigned char *p = v; while( n-- ) *p++ = 0;
  18011. }
  18012. /*
  18013. * Reminder: update profiles in x509_crt.c when adding a new hash!
  18014. */
  18015. static const int supported_digests[] = {
  18016. #if defined(MBEDTLS_SHA512_C)
  18017. MBEDTLS_MD_SHA512,
  18018. MBEDTLS_MD_SHA384,
  18019. #endif
  18020. #if defined(MBEDTLS_SHA256_C)
  18021. MBEDTLS_MD_SHA256,
  18022. MBEDTLS_MD_SHA224,
  18023. #endif
  18024. #if defined(MBEDTLS_SHA1_C)
  18025. MBEDTLS_MD_SHA1,
  18026. #endif
  18027. #if defined(MBEDTLS_RIPEMD160_C)
  18028. MBEDTLS_MD_RIPEMD160,
  18029. #endif
  18030. #if defined(MBEDTLS_MD5_C)
  18031. MBEDTLS_MD_MD5,
  18032. #endif
  18033. #if defined(MBEDTLS_MD4_C)
  18034. MBEDTLS_MD_MD4,
  18035. #endif
  18036. #if defined(MBEDTLS_MD2_C)
  18037. MBEDTLS_MD_MD2,
  18038. #endif
  18039. MBEDTLS_MD_NONE
  18040. };
  18041. const int *mbedtls_md_list( void )
  18042. {
  18043. return( supported_digests );
  18044. }
  18045. const mbedtls_md_info_t *mbedtls_md_info_from_string( const char *md_name )
  18046. {
  18047. if( NULL == md_name )
  18048. return( NULL );
  18049. /* Get the appropriate digest information */
  18050. #if defined(MBEDTLS_MD2_C)
  18051. if( !strcmp( "MD2", md_name ) )
  18052. return mbedtls_md_info_from_type( MBEDTLS_MD_MD2 );
  18053. #endif
  18054. #if defined(MBEDTLS_MD4_C)
  18055. if( !strcmp( "MD4", md_name ) )
  18056. return mbedtls_md_info_from_type( MBEDTLS_MD_MD4 );
  18057. #endif
  18058. #if defined(MBEDTLS_MD5_C)
  18059. if( !strcmp( "MD5", md_name ) )
  18060. return mbedtls_md_info_from_type( MBEDTLS_MD_MD5 );
  18061. #endif
  18062. #if defined(MBEDTLS_RIPEMD160_C)
  18063. if( !strcmp( "RIPEMD160", md_name ) )
  18064. return mbedtls_md_info_from_type( MBEDTLS_MD_RIPEMD160 );
  18065. #endif
  18066. #if defined(MBEDTLS_SHA1_C)
  18067. if( !strcmp( "SHA1", md_name ) || !strcmp( "SHA", md_name ) )
  18068. return mbedtls_md_info_from_type( MBEDTLS_MD_SHA1 );
  18069. #endif
  18070. #if defined(MBEDTLS_SHA256_C)
  18071. if( !strcmp( "SHA224", md_name ) )
  18072. return mbedtls_md_info_from_type( MBEDTLS_MD_SHA224 );
  18073. if( !strcmp( "SHA256", md_name ) )
  18074. return mbedtls_md_info_from_type( MBEDTLS_MD_SHA256 );
  18075. #endif
  18076. #if defined(MBEDTLS_SHA512_C)
  18077. if( !strcmp( "SHA384", md_name ) )
  18078. return mbedtls_md_info_from_type( MBEDTLS_MD_SHA384 );
  18079. if( !strcmp( "SHA512", md_name ) )
  18080. return mbedtls_md_info_from_type( MBEDTLS_MD_SHA512 );
  18081. #endif
  18082. return( NULL );
  18083. }
  18084. const mbedtls_md_info_t *mbedtls_md_info_from_type( mbedtls_md_type_t md_type )
  18085. {
  18086. switch( md_type )
  18087. {
  18088. #if defined(MBEDTLS_MD2_C)
  18089. case MBEDTLS_MD_MD2:
  18090. return( &mbedtls_md2_info );
  18091. #endif
  18092. #if defined(MBEDTLS_MD4_C)
  18093. case MBEDTLS_MD_MD4:
  18094. return( &mbedtls_md4_info );
  18095. #endif
  18096. #if defined(MBEDTLS_MD5_C)
  18097. case MBEDTLS_MD_MD5:
  18098. return( &mbedtls_md5_info );
  18099. #endif
  18100. #if defined(MBEDTLS_RIPEMD160_C)
  18101. case MBEDTLS_MD_RIPEMD160:
  18102. return( &mbedtls_ripemd160_info );
  18103. #endif
  18104. #if defined(MBEDTLS_SHA1_C)
  18105. case MBEDTLS_MD_SHA1:
  18106. return( &mbedtls_sha1_info );
  18107. #endif
  18108. #if defined(MBEDTLS_SHA256_C)
  18109. case MBEDTLS_MD_SHA224:
  18110. return( &mbedtls_sha224_info );
  18111. case MBEDTLS_MD_SHA256:
  18112. return( &mbedtls_sha256_info );
  18113. #endif
  18114. #if defined(MBEDTLS_SHA512_C)
  18115. case MBEDTLS_MD_SHA384:
  18116. return( &mbedtls_sha384_info );
  18117. case MBEDTLS_MD_SHA512:
  18118. return( &mbedtls_sha512_info );
  18119. #endif
  18120. default:
  18121. return( NULL );
  18122. }
  18123. }
  18124. void mbedtls_md_init( mbedtls_md_context_t *ctx )
  18125. {
  18126. memset( ctx, 0, sizeof( mbedtls_md_context_t ) );
  18127. }
  18128. void mbedtls_md_free( mbedtls_md_context_t *ctx )
  18129. {
  18130. if( ctx == NULL || ctx->md_info == NULL )
  18131. return;
  18132. if( ctx->md_ctx != NULL )
  18133. ctx->md_info->ctx_free_func( ctx->md_ctx );
  18134. if( ctx->hmac_ctx != NULL )
  18135. {
  18136. md_zeroize( ctx->hmac_ctx, 2 * ctx->md_info->block_size );
  18137. mbedtls_free( ctx->hmac_ctx );
  18138. }
  18139. md_zeroize( ctx, sizeof( mbedtls_md_context_t ) );
  18140. }
  18141. int mbedtls_md_clone( mbedtls_md_context_t *dst,
  18142. const mbedtls_md_context_t *src )
  18143. {
  18144. if( dst == NULL || dst->md_info == NULL ||
  18145. src == NULL || src->md_info == NULL ||
  18146. dst->md_info != src->md_info )
  18147. {
  18148. return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
  18149. }
  18150. dst->md_info->clone_func( dst->md_ctx, src->md_ctx );
  18151. return( 0 );
  18152. }
  18153. #if ! defined(MBEDTLS_DEPRECATED_REMOVED)
  18154. int mbedtls_md_init_ctx( mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info )
  18155. {
  18156. return mbedtls_md_setup( ctx, md_info, 1 );
  18157. }
  18158. #endif
  18159. int mbedtls_md_setup( mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info, int hmac )
  18160. {
  18161. if( md_info == NULL || ctx == NULL )
  18162. return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
  18163. if( ( ctx->md_ctx = md_info->ctx_alloc_func() ) == NULL )
  18164. return( MBEDTLS_ERR_MD_ALLOC_FAILED );
  18165. if( hmac != 0 )
  18166. {
  18167. ctx->hmac_ctx = mbedtls_calloc( 2, md_info->block_size );
  18168. if( ctx->hmac_ctx == NULL )
  18169. {
  18170. md_info->ctx_free_func( ctx->md_ctx );
  18171. return( MBEDTLS_ERR_MD_ALLOC_FAILED );
  18172. }
  18173. }
  18174. ctx->md_info = md_info;
  18175. return( 0 );
  18176. }
  18177. int mbedtls_md_starts( mbedtls_md_context_t *ctx )
  18178. {
  18179. if( ctx == NULL || ctx->md_info == NULL )
  18180. return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
  18181. ctx->md_info->starts_func( ctx->md_ctx );
  18182. return( 0 );
  18183. }
  18184. int mbedtls_md_update( mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen )
  18185. {
  18186. if( ctx == NULL || ctx->md_info == NULL )
  18187. return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
  18188. ctx->md_info->update_func( ctx->md_ctx, input, ilen );
  18189. return( 0 );
  18190. }
  18191. int mbedtls_md_finish( mbedtls_md_context_t *ctx, unsigned char *output )
  18192. {
  18193. if( ctx == NULL || ctx->md_info == NULL )
  18194. return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
  18195. ctx->md_info->finish_func( ctx->md_ctx, output );
  18196. return( 0 );
  18197. }
  18198. int mbedtls_md( const mbedtls_md_info_t *md_info, const unsigned char *input, size_t ilen,
  18199. unsigned char *output )
  18200. {
  18201. if( md_info == NULL )
  18202. return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
  18203. md_info->digest_func( input, ilen, output );
  18204. return( 0 );
  18205. }
  18206. #if defined(MBEDTLS_FS_IO)
  18207. int mbedtls_md_file( const mbedtls_md_info_t *md_info, const char *path, unsigned char *output )
  18208. {
  18209. int ret;
  18210. FILE *f;
  18211. size_t n;
  18212. mbedtls_md_context_t ctx;
  18213. unsigned char buf[1024];
  18214. if( md_info == NULL )
  18215. return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
  18216. if( ( f = fopen( path, "rb" ) ) == NULL )
  18217. return( MBEDTLS_ERR_MD_FILE_IO_ERROR );
  18218. mbedtls_md_init( &ctx );
  18219. if( ( ret = mbedtls_md_setup( &ctx, md_info, 0 ) ) != 0 )
  18220. goto cleanup;
  18221. md_info->starts_func( ctx.md_ctx );
  18222. while( ( n = fread( buf, 1, sizeof( buf ), f ) ) > 0 )
  18223. md_info->update_func( ctx.md_ctx, buf, n );
  18224. if( ferror( f ) != 0 )
  18225. {
  18226. ret = MBEDTLS_ERR_MD_FILE_IO_ERROR;
  18227. goto cleanup;
  18228. }
  18229. md_info->finish_func( ctx.md_ctx, output );
  18230. cleanup:
  18231. fclose( f );
  18232. mbedtls_md_free( &ctx );
  18233. return( ret );
  18234. }
  18235. #endif /* MBEDTLS_FS_IO */
  18236. int mbedtls_md_hmac_starts( mbedtls_md_context_t *ctx, const unsigned char *key, size_t keylen )
  18237. {
  18238. unsigned char sum[MBEDTLS_MD_MAX_SIZE];
  18239. unsigned char *ipad, *opad;
  18240. size_t i;
  18241. if( ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL )
  18242. return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
  18243. if( keylen > (size_t) ctx->md_info->block_size )
  18244. {
  18245. ctx->md_info->starts_func( ctx->md_ctx );
  18246. ctx->md_info->update_func( ctx->md_ctx, key, keylen );
  18247. ctx->md_info->finish_func( ctx->md_ctx, sum );
  18248. keylen = ctx->md_info->size;
  18249. key = sum;
  18250. }
  18251. ipad = (unsigned char *) ctx->hmac_ctx;
  18252. opad = (unsigned char *) ctx->hmac_ctx + ctx->md_info->block_size;
  18253. memset( ipad, 0x36, ctx->md_info->block_size );
  18254. memset( opad, 0x5C, ctx->md_info->block_size );
  18255. for( i = 0; i < keylen; i++ )
  18256. {
  18257. ipad[i] = (unsigned char)( ipad[i] ^ key[i] );
  18258. opad[i] = (unsigned char)( opad[i] ^ key[i] );
  18259. }
  18260. md_zeroize( sum, sizeof( sum ) );
  18261. ctx->md_info->starts_func( ctx->md_ctx );
  18262. ctx->md_info->update_func( ctx->md_ctx, ipad, ctx->md_info->block_size );
  18263. return( 0 );
  18264. }
  18265. int mbedtls_md_hmac_update( mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen )
  18266. {
  18267. if( ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL )
  18268. return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
  18269. ctx->md_info->update_func( ctx->md_ctx, input, ilen );
  18270. return( 0 );
  18271. }
  18272. int mbedtls_md_hmac_finish( mbedtls_md_context_t *ctx, unsigned char *output )
  18273. {
  18274. unsigned char tmp[MBEDTLS_MD_MAX_SIZE];
  18275. unsigned char *opad;
  18276. if( ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL )
  18277. return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
  18278. opad = (unsigned char *) ctx->hmac_ctx + ctx->md_info->block_size;
  18279. ctx->md_info->finish_func( ctx->md_ctx, tmp );
  18280. ctx->md_info->starts_func( ctx->md_ctx );
  18281. ctx->md_info->update_func( ctx->md_ctx, opad, ctx->md_info->block_size );
  18282. ctx->md_info->update_func( ctx->md_ctx, tmp, ctx->md_info->size );
  18283. ctx->md_info->finish_func( ctx->md_ctx, output );
  18284. return( 0 );
  18285. }
  18286. int mbedtls_md_hmac_reset( mbedtls_md_context_t *ctx )
  18287. {
  18288. unsigned char *ipad;
  18289. if( ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL )
  18290. return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
  18291. ipad = (unsigned char *) ctx->hmac_ctx;
  18292. ctx->md_info->starts_func( ctx->md_ctx );
  18293. ctx->md_info->update_func( ctx->md_ctx, ipad, ctx->md_info->block_size );
  18294. return( 0 );
  18295. }
  18296. int mbedtls_md_hmac( const mbedtls_md_info_t *md_info, const unsigned char *key, size_t keylen,
  18297. const unsigned char *input, size_t ilen,
  18298. unsigned char *output )
  18299. {
  18300. mbedtls_md_context_t ctx;
  18301. int ret;
  18302. if( md_info == NULL )
  18303. return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
  18304. mbedtls_md_init( &ctx );
  18305. if( ( ret = mbedtls_md_setup( &ctx, md_info, 1 ) ) != 0 )
  18306. return( ret );
  18307. mbedtls_md_hmac_starts( &ctx, key, keylen );
  18308. mbedtls_md_hmac_update( &ctx, input, ilen );
  18309. mbedtls_md_hmac_finish( &ctx, output );
  18310. mbedtls_md_free( &ctx );
  18311. return( 0 );
  18312. }
  18313. int mbedtls_md_process( mbedtls_md_context_t *ctx, const unsigned char *data )
  18314. {
  18315. if( ctx == NULL || ctx->md_info == NULL )
  18316. return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
  18317. ctx->md_info->process_func( ctx->md_ctx, data );
  18318. return( 0 );
  18319. }
  18320. unsigned char mbedtls_md_get_size( const mbedtls_md_info_t *md_info )
  18321. {
  18322. if( md_info == NULL )
  18323. return( 0 );
  18324. return md_info->size;
  18325. }
  18326. mbedtls_md_type_t mbedtls_md_get_type( const mbedtls_md_info_t *md_info )
  18327. {
  18328. if( md_info == NULL )
  18329. return( MBEDTLS_MD_NONE );
  18330. return md_info->type;
  18331. }
  18332. const char *mbedtls_md_get_name( const mbedtls_md_info_t *md_info )
  18333. {
  18334. if( md_info == NULL )
  18335. return( NULL );
  18336. return md_info->name;
  18337. }
  18338. #endif /* MBEDTLS_MD_C */
  18339. /********* Start of file library/md2.c ************/
  18340. /*
  18341. * RFC 1115/1319 compliant MD2 implementation
  18342. *
  18343. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  18344. * SPDX-License-Identifier: Apache-2.0
  18345. *
  18346. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  18347. * not use this file except in compliance with the License.
  18348. * You may obtain a copy of the License at
  18349. *
  18350. * http://www.apache.org/licenses/LICENSE-2.0
  18351. *
  18352. * Unless required by applicable law or agreed to in writing, software
  18353. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  18354. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  18355. * See the License for the specific language governing permissions and
  18356. * limitations under the License.
  18357. *
  18358. * This file is part of mbed TLS (https://tls.mbed.org)
  18359. */
  18360. /*
  18361. * The MD2 algorithm was designed by Ron Rivest in 1989.
  18362. *
  18363. * http://www.ietf.org/rfc/rfc1115.txt
  18364. * http://www.ietf.org/rfc/rfc1319.txt
  18365. */
  18366. #if !defined(MBEDTLS_CONFIG_FILE)
  18367. #else
  18368. #endif
  18369. #if defined(MBEDTLS_MD2_C)
  18370. #include <string.h>
  18371. #if defined(MBEDTLS_SELF_TEST)
  18372. #if defined(MBEDTLS_PLATFORM_C)
  18373. #else
  18374. #include <stdio.h>
  18375. #define mbedtls_printf printf
  18376. #endif /* MBEDTLS_PLATFORM_C */
  18377. #endif /* MBEDTLS_SELF_TEST */
  18378. #if !defined(MBEDTLS_MD2_ALT)
  18379. /* Implementation that should never be optimized out by the compiler */
  18380. static void md2_zeroize( void *v, size_t n ) {
  18381. volatile unsigned char *p = v; while( n-- ) *p++ = 0;
  18382. }
  18383. static const unsigned char PI_SUBST[256] =
  18384. {
  18385. 0x29, 0x2E, 0x43, 0xC9, 0xA2, 0xD8, 0x7C, 0x01, 0x3D, 0x36,
  18386. 0x54, 0xA1, 0xEC, 0xF0, 0x06, 0x13, 0x62, 0xA7, 0x05, 0xF3,
  18387. 0xC0, 0xC7, 0x73, 0x8C, 0x98, 0x93, 0x2B, 0xD9, 0xBC, 0x4C,
  18388. 0x82, 0xCA, 0x1E, 0x9B, 0x57, 0x3C, 0xFD, 0xD4, 0xE0, 0x16,
  18389. 0x67, 0x42, 0x6F, 0x18, 0x8A, 0x17, 0xE5, 0x12, 0xBE, 0x4E,
  18390. 0xC4, 0xD6, 0xDA, 0x9E, 0xDE, 0x49, 0xA0, 0xFB, 0xF5, 0x8E,
  18391. 0xBB, 0x2F, 0xEE, 0x7A, 0xA9, 0x68, 0x79, 0x91, 0x15, 0xB2,
  18392. 0x07, 0x3F, 0x94, 0xC2, 0x10, 0x89, 0x0B, 0x22, 0x5F, 0x21,
  18393. 0x80, 0x7F, 0x5D, 0x9A, 0x5A, 0x90, 0x32, 0x27, 0x35, 0x3E,
  18394. 0xCC, 0xE7, 0xBF, 0xF7, 0x97, 0x03, 0xFF, 0x19, 0x30, 0xB3,
  18395. 0x48, 0xA5, 0xB5, 0xD1, 0xD7, 0x5E, 0x92, 0x2A, 0xAC, 0x56,
  18396. 0xAA, 0xC6, 0x4F, 0xB8, 0x38, 0xD2, 0x96, 0xA4, 0x7D, 0xB6,
  18397. 0x76, 0xFC, 0x6B, 0xE2, 0x9C, 0x74, 0x04, 0xF1, 0x45, 0x9D,
  18398. 0x70, 0x59, 0x64, 0x71, 0x87, 0x20, 0x86, 0x5B, 0xCF, 0x65,
  18399. 0xE6, 0x2D, 0xA8, 0x02, 0x1B, 0x60, 0x25, 0xAD, 0xAE, 0xB0,
  18400. 0xB9, 0xF6, 0x1C, 0x46, 0x61, 0x69, 0x34, 0x40, 0x7E, 0x0F,
  18401. 0x55, 0x47, 0xA3, 0x23, 0xDD, 0x51, 0xAF, 0x3A, 0xC3, 0x5C,
  18402. 0xF9, 0xCE, 0xBA, 0xC5, 0xEA, 0x26, 0x2C, 0x53, 0x0D, 0x6E,
  18403. 0x85, 0x28, 0x84, 0x09, 0xD3, 0xDF, 0xCD, 0xF4, 0x41, 0x81,
  18404. 0x4D, 0x52, 0x6A, 0xDC, 0x37, 0xC8, 0x6C, 0xC1, 0xAB, 0xFA,
  18405. 0x24, 0xE1, 0x7B, 0x08, 0x0C, 0xBD, 0xB1, 0x4A, 0x78, 0x88,
  18406. 0x95, 0x8B, 0xE3, 0x63, 0xE8, 0x6D, 0xE9, 0xCB, 0xD5, 0xFE,
  18407. 0x3B, 0x00, 0x1D, 0x39, 0xF2, 0xEF, 0xB7, 0x0E, 0x66, 0x58,
  18408. 0xD0, 0xE4, 0xA6, 0x77, 0x72, 0xF8, 0xEB, 0x75, 0x4B, 0x0A,
  18409. 0x31, 0x44, 0x50, 0xB4, 0x8F, 0xED, 0x1F, 0x1A, 0xDB, 0x99,
  18410. 0x8D, 0x33, 0x9F, 0x11, 0x83, 0x14
  18411. };
  18412. void mbedtls_md2_init( mbedtls_md2_context *ctx )
  18413. {
  18414. memset( ctx, 0, sizeof( mbedtls_md2_context ) );
  18415. }
  18416. void mbedtls_md2_free( mbedtls_md2_context *ctx )
  18417. {
  18418. if( ctx == NULL )
  18419. return;
  18420. md2_zeroize( ctx, sizeof( mbedtls_md2_context ) );
  18421. }
  18422. void mbedtls_md2_clone( mbedtls_md2_context *dst,
  18423. const mbedtls_md2_context *src )
  18424. {
  18425. *dst = *src;
  18426. }
  18427. /*
  18428. * MD2 context setup
  18429. */
  18430. void mbedtls_md2_starts( mbedtls_md2_context *ctx )
  18431. {
  18432. memset( ctx->cksum, 0, 16 );
  18433. memset( ctx->state, 0, 46 );
  18434. memset( ctx->buffer, 0, 16 );
  18435. ctx->left = 0;
  18436. }
  18437. #if !defined(MBEDTLS_MD2_PROCESS_ALT)
  18438. void mbedtls_md2_process( mbedtls_md2_context *ctx )
  18439. {
  18440. int i, j;
  18441. unsigned char t = 0;
  18442. for( i = 0; i < 16; i++ )
  18443. {
  18444. ctx->state[i + 16] = ctx->buffer[i];
  18445. ctx->state[i + 32] =
  18446. (unsigned char)( ctx->buffer[i] ^ ctx->state[i]);
  18447. }
  18448. for( i = 0; i < 18; i++ )
  18449. {
  18450. for( j = 0; j < 48; j++ )
  18451. {
  18452. ctx->state[j] = (unsigned char)
  18453. ( ctx->state[j] ^ PI_SUBST[t] );
  18454. t = ctx->state[j];
  18455. }
  18456. t = (unsigned char)( t + i );
  18457. }
  18458. t = ctx->cksum[15];
  18459. for( i = 0; i < 16; i++ )
  18460. {
  18461. ctx->cksum[i] = (unsigned char)
  18462. ( ctx->cksum[i] ^ PI_SUBST[ctx->buffer[i] ^ t] );
  18463. t = ctx->cksum[i];
  18464. }
  18465. }
  18466. #endif /* !MBEDTLS_MD2_PROCESS_ALT */
  18467. /*
  18468. * MD2 process buffer
  18469. */
  18470. void mbedtls_md2_update( mbedtls_md2_context *ctx, const unsigned char *input, size_t ilen )
  18471. {
  18472. size_t fill;
  18473. while( ilen > 0 )
  18474. {
  18475. if( ctx->left + ilen > 16 )
  18476. fill = 16 - ctx->left;
  18477. else
  18478. fill = ilen;
  18479. memcpy( ctx->buffer + ctx->left, input, fill );
  18480. ctx->left += fill;
  18481. input += fill;
  18482. ilen -= fill;
  18483. if( ctx->left == 16 )
  18484. {
  18485. ctx->left = 0;
  18486. mbedtls_md2_process( ctx );
  18487. }
  18488. }
  18489. }
  18490. /*
  18491. * MD2 final digest
  18492. */
  18493. void mbedtls_md2_finish( mbedtls_md2_context *ctx, unsigned char output[16] )
  18494. {
  18495. size_t i;
  18496. unsigned char x;
  18497. x = (unsigned char)( 16 - ctx->left );
  18498. for( i = ctx->left; i < 16; i++ )
  18499. ctx->buffer[i] = x;
  18500. mbedtls_md2_process( ctx );
  18501. memcpy( ctx->buffer, ctx->cksum, 16 );
  18502. mbedtls_md2_process( ctx );
  18503. memcpy( output, ctx->state, 16 );
  18504. }
  18505. #endif /* !MBEDTLS_MD2_ALT */
  18506. /*
  18507. * output = MD2( input buffer )
  18508. */
  18509. void mbedtls_md2( const unsigned char *input, size_t ilen, unsigned char output[16] )
  18510. {
  18511. mbedtls_md2_context ctx;
  18512. mbedtls_md2_init( &ctx );
  18513. mbedtls_md2_starts( &ctx );
  18514. mbedtls_md2_update( &ctx, input, ilen );
  18515. mbedtls_md2_finish( &ctx, output );
  18516. mbedtls_md2_free( &ctx );
  18517. }
  18518. #if defined(MBEDTLS_SELF_TEST)
  18519. /*
  18520. * RFC 1319 test vectors
  18521. */
  18522. static const char md2_test_str[7][81] =
  18523. {
  18524. { "" },
  18525. { "a" },
  18526. { "abc" },
  18527. { "message digest" },
  18528. { "abcdefghijklmnopqrstuvwxyz" },
  18529. { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" },
  18530. { "12345678901234567890123456789012345678901234567890123456789012" \
  18531. "345678901234567890" }
  18532. };
  18533. static const unsigned char md2_test_sum[7][16] =
  18534. {
  18535. { 0x83, 0x50, 0xE5, 0xA3, 0xE2, 0x4C, 0x15, 0x3D,
  18536. 0xF2, 0x27, 0x5C, 0x9F, 0x80, 0x69, 0x27, 0x73 },
  18537. { 0x32, 0xEC, 0x01, 0xEC, 0x4A, 0x6D, 0xAC, 0x72,
  18538. 0xC0, 0xAB, 0x96, 0xFB, 0x34, 0xC0, 0xB5, 0xD1 },
  18539. { 0xDA, 0x85, 0x3B, 0x0D, 0x3F, 0x88, 0xD9, 0x9B,
  18540. 0x30, 0x28, 0x3A, 0x69, 0xE6, 0xDE, 0xD6, 0xBB },
  18541. { 0xAB, 0x4F, 0x49, 0x6B, 0xFB, 0x2A, 0x53, 0x0B,
  18542. 0x21, 0x9F, 0xF3, 0x30, 0x31, 0xFE, 0x06, 0xB0 },
  18543. { 0x4E, 0x8D, 0xDF, 0xF3, 0x65, 0x02, 0x92, 0xAB,
  18544. 0x5A, 0x41, 0x08, 0xC3, 0xAA, 0x47, 0x94, 0x0B },
  18545. { 0xDA, 0x33, 0xDE, 0xF2, 0xA4, 0x2D, 0xF1, 0x39,
  18546. 0x75, 0x35, 0x28, 0x46, 0xC3, 0x03, 0x38, 0xCD },
  18547. { 0xD5, 0x97, 0x6F, 0x79, 0xD8, 0x3D, 0x3A, 0x0D,
  18548. 0xC9, 0x80, 0x6C, 0x3C, 0x66, 0xF3, 0xEF, 0xD8 }
  18549. };
  18550. /*
  18551. * Checkup routine
  18552. */
  18553. int mbedtls_md2_self_test( int verbose )
  18554. {
  18555. int i;
  18556. unsigned char md2sum[16];
  18557. for( i = 0; i < 7; i++ )
  18558. {
  18559. if( verbose != 0 )
  18560. mbedtls_printf( " MD2 test #%d: ", i + 1 );
  18561. mbedtls_md2( (unsigned char *) md2_test_str[i],
  18562. strlen( md2_test_str[i] ), md2sum );
  18563. if( memcmp( md2sum, md2_test_sum[i], 16 ) != 0 )
  18564. {
  18565. if( verbose != 0 )
  18566. mbedtls_printf( "failed\n" );
  18567. return( 1 );
  18568. }
  18569. if( verbose != 0 )
  18570. mbedtls_printf( "passed\n" );
  18571. }
  18572. if( verbose != 0 )
  18573. mbedtls_printf( "\n" );
  18574. return( 0 );
  18575. }
  18576. #endif /* MBEDTLS_SELF_TEST */
  18577. #endif /* MBEDTLS_MD2_C */
  18578. /********* Start of file library/md4.c ************/
  18579. /*
  18580. * RFC 1186/1320 compliant MD4 implementation
  18581. *
  18582. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  18583. * SPDX-License-Identifier: Apache-2.0
  18584. *
  18585. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  18586. * not use this file except in compliance with the License.
  18587. * You may obtain a copy of the License at
  18588. *
  18589. * http://www.apache.org/licenses/LICENSE-2.0
  18590. *
  18591. * Unless required by applicable law or agreed to in writing, software
  18592. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  18593. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  18594. * See the License for the specific language governing permissions and
  18595. * limitations under the License.
  18596. *
  18597. * This file is part of mbed TLS (https://tls.mbed.org)
  18598. */
  18599. /*
  18600. * The MD4 algorithm was designed by Ron Rivest in 1990.
  18601. *
  18602. * http://www.ietf.org/rfc/rfc1186.txt
  18603. * http://www.ietf.org/rfc/rfc1320.txt
  18604. */
  18605. #if !defined(MBEDTLS_CONFIG_FILE)
  18606. #else
  18607. #endif
  18608. #if defined(MBEDTLS_MD4_C)
  18609. #include <string.h>
  18610. #if defined(MBEDTLS_SELF_TEST)
  18611. #if defined(MBEDTLS_PLATFORM_C)
  18612. #else
  18613. #include <stdio.h>
  18614. #define mbedtls_printf printf
  18615. #endif /* MBEDTLS_PLATFORM_C */
  18616. #endif /* MBEDTLS_SELF_TEST */
  18617. #if !defined(MBEDTLS_MD4_ALT)
  18618. /* Implementation that should never be optimized out by the compiler */
  18619. static void md4_zeroize( void *v, size_t n ) {
  18620. volatile unsigned char *p = v; while( n-- ) *p++ = 0;
  18621. }
  18622. /*
  18623. * 32-bit integer manipulation macros (little endian)
  18624. */
  18625. #ifndef GET_UINT32_LE
  18626. #define GET_UINT32_LE(n,b,i) \
  18627. { \
  18628. (n) = ( (uint32_t) (b)[(i) ] ) \
  18629. | ( (uint32_t) (b)[(i) + 1] << 8 ) \
  18630. | ( (uint32_t) (b)[(i) + 2] << 16 ) \
  18631. | ( (uint32_t) (b)[(i) + 3] << 24 ); \
  18632. }
  18633. #endif
  18634. #ifndef PUT_UINT32_LE
  18635. #define PUT_UINT32_LE(n,b,i) \
  18636. { \
  18637. (b)[(i) ] = (unsigned char) ( ( (n) ) & 0xFF ); \
  18638. (b)[(i) + 1] = (unsigned char) ( ( (n) >> 8 ) & 0xFF ); \
  18639. (b)[(i) + 2] = (unsigned char) ( ( (n) >> 16 ) & 0xFF ); \
  18640. (b)[(i) + 3] = (unsigned char) ( ( (n) >> 24 ) & 0xFF ); \
  18641. }
  18642. #endif
  18643. void mbedtls_md4_init( mbedtls_md4_context *ctx )
  18644. {
  18645. memset( ctx, 0, sizeof( mbedtls_md4_context ) );
  18646. }
  18647. void mbedtls_md4_free( mbedtls_md4_context *ctx )
  18648. {
  18649. if( ctx == NULL )
  18650. return;
  18651. md4_zeroize( ctx, sizeof( mbedtls_md4_context ) );
  18652. }
  18653. void mbedtls_md4_clone( mbedtls_md4_context *dst,
  18654. const mbedtls_md4_context *src )
  18655. {
  18656. *dst = *src;
  18657. }
  18658. /*
  18659. * MD4 context setup
  18660. */
  18661. void mbedtls_md4_starts( mbedtls_md4_context *ctx )
  18662. {
  18663. ctx->total[0] = 0;
  18664. ctx->total[1] = 0;
  18665. ctx->state[0] = 0x67452301;
  18666. ctx->state[1] = 0xEFCDAB89;
  18667. ctx->state[2] = 0x98BADCFE;
  18668. ctx->state[3] = 0x10325476;
  18669. }
  18670. #if !defined(MBEDTLS_MD4_PROCESS_ALT)
  18671. void mbedtls_md4_process( mbedtls_md4_context *ctx, const unsigned char data[64] )
  18672. {
  18673. uint32_t X[16], A, B, C, D;
  18674. GET_UINT32_LE( X[ 0], data, 0 );
  18675. GET_UINT32_LE( X[ 1], data, 4 );
  18676. GET_UINT32_LE( X[ 2], data, 8 );
  18677. GET_UINT32_LE( X[ 3], data, 12 );
  18678. GET_UINT32_LE( X[ 4], data, 16 );
  18679. GET_UINT32_LE( X[ 5], data, 20 );
  18680. GET_UINT32_LE( X[ 6], data, 24 );
  18681. GET_UINT32_LE( X[ 7], data, 28 );
  18682. GET_UINT32_LE( X[ 8], data, 32 );
  18683. GET_UINT32_LE( X[ 9], data, 36 );
  18684. GET_UINT32_LE( X[10], data, 40 );
  18685. GET_UINT32_LE( X[11], data, 44 );
  18686. GET_UINT32_LE( X[12], data, 48 );
  18687. GET_UINT32_LE( X[13], data, 52 );
  18688. GET_UINT32_LE( X[14], data, 56 );
  18689. GET_UINT32_LE( X[15], data, 60 );
  18690. #define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n)))
  18691. A = ctx->state[0];
  18692. B = ctx->state[1];
  18693. C = ctx->state[2];
  18694. D = ctx->state[3];
  18695. #define F(x, y, z) ((x & y) | ((~x) & z))
  18696. #define P(a,b,c,d,x,s) { a += F(b,c,d) + x; a = S(a,s); }
  18697. P( A, B, C, D, X[ 0], 3 );
  18698. P( D, A, B, C, X[ 1], 7 );
  18699. P( C, D, A, B, X[ 2], 11 );
  18700. P( B, C, D, A, X[ 3], 19 );
  18701. P( A, B, C, D, X[ 4], 3 );
  18702. P( D, A, B, C, X[ 5], 7 );
  18703. P( C, D, A, B, X[ 6], 11 );
  18704. P( B, C, D, A, X[ 7], 19 );
  18705. P( A, B, C, D, X[ 8], 3 );
  18706. P( D, A, B, C, X[ 9], 7 );
  18707. P( C, D, A, B, X[10], 11 );
  18708. P( B, C, D, A, X[11], 19 );
  18709. P( A, B, C, D, X[12], 3 );
  18710. P( D, A, B, C, X[13], 7 );
  18711. P( C, D, A, B, X[14], 11 );
  18712. P( B, C, D, A, X[15], 19 );
  18713. #undef P
  18714. #undef F
  18715. #define F(x,y,z) ((x & y) | (x & z) | (y & z))
  18716. #define P(a,b,c,d,x,s) { a += F(b,c,d) + x + 0x5A827999; a = S(a,s); }
  18717. P( A, B, C, D, X[ 0], 3 );
  18718. P( D, A, B, C, X[ 4], 5 );
  18719. P( C, D, A, B, X[ 8], 9 );
  18720. P( B, C, D, A, X[12], 13 );
  18721. P( A, B, C, D, X[ 1], 3 );
  18722. P( D, A, B, C, X[ 5], 5 );
  18723. P( C, D, A, B, X[ 9], 9 );
  18724. P( B, C, D, A, X[13], 13 );
  18725. P( A, B, C, D, X[ 2], 3 );
  18726. P( D, A, B, C, X[ 6], 5 );
  18727. P( C, D, A, B, X[10], 9 );
  18728. P( B, C, D, A, X[14], 13 );
  18729. P( A, B, C, D, X[ 3], 3 );
  18730. P( D, A, B, C, X[ 7], 5 );
  18731. P( C, D, A, B, X[11], 9 );
  18732. P( B, C, D, A, X[15], 13 );
  18733. #undef P
  18734. #undef F
  18735. #define F(x,y,z) (x ^ y ^ z)
  18736. #define P(a,b,c,d,x,s) { a += F(b,c,d) + x + 0x6ED9EBA1; a = S(a,s); }
  18737. P( A, B, C, D, X[ 0], 3 );
  18738. P( D, A, B, C, X[ 8], 9 );
  18739. P( C, D, A, B, X[ 4], 11 );
  18740. P( B, C, D, A, X[12], 15 );
  18741. P( A, B, C, D, X[ 2], 3 );
  18742. P( D, A, B, C, X[10], 9 );
  18743. P( C, D, A, B, X[ 6], 11 );
  18744. P( B, C, D, A, X[14], 15 );
  18745. P( A, B, C, D, X[ 1], 3 );
  18746. P( D, A, B, C, X[ 9], 9 );
  18747. P( C, D, A, B, X[ 5], 11 );
  18748. P( B, C, D, A, X[13], 15 );
  18749. P( A, B, C, D, X[ 3], 3 );
  18750. P( D, A, B, C, X[11], 9 );
  18751. P( C, D, A, B, X[ 7], 11 );
  18752. P( B, C, D, A, X[15], 15 );
  18753. #undef F
  18754. #undef P
  18755. ctx->state[0] += A;
  18756. ctx->state[1] += B;
  18757. ctx->state[2] += C;
  18758. ctx->state[3] += D;
  18759. }
  18760. #endif /* !MBEDTLS_MD4_PROCESS_ALT */
  18761. /*
  18762. * MD4 process buffer
  18763. */
  18764. void mbedtls_md4_update( mbedtls_md4_context *ctx, const unsigned char *input, size_t ilen )
  18765. {
  18766. size_t fill;
  18767. uint32_t left;
  18768. if( ilen == 0 )
  18769. return;
  18770. left = ctx->total[0] & 0x3F;
  18771. fill = 64 - left;
  18772. ctx->total[0] += (uint32_t) ilen;
  18773. ctx->total[0] &= 0xFFFFFFFF;
  18774. if( ctx->total[0] < (uint32_t) ilen )
  18775. ctx->total[1]++;
  18776. if( left && ilen >= fill )
  18777. {
  18778. memcpy( (void *) (ctx->buffer + left),
  18779. (void *) input, fill );
  18780. mbedtls_md4_process( ctx, ctx->buffer );
  18781. input += fill;
  18782. ilen -= fill;
  18783. left = 0;
  18784. }
  18785. while( ilen >= 64 )
  18786. {
  18787. mbedtls_md4_process( ctx, input );
  18788. input += 64;
  18789. ilen -= 64;
  18790. }
  18791. if( ilen > 0 )
  18792. {
  18793. memcpy( (void *) (ctx->buffer + left),
  18794. (void *) input, ilen );
  18795. }
  18796. }
  18797. static const unsigned char md4_padding[64] =
  18798. {
  18799. 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  18800. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  18801. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  18802. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  18803. };
  18804. /*
  18805. * MD4 final digest
  18806. */
  18807. void mbedtls_md4_finish( mbedtls_md4_context *ctx, unsigned char output[16] )
  18808. {
  18809. uint32_t last, padn;
  18810. uint32_t high, low;
  18811. unsigned char msglen[8];
  18812. high = ( ctx->total[0] >> 29 )
  18813. | ( ctx->total[1] << 3 );
  18814. low = ( ctx->total[0] << 3 );
  18815. PUT_UINT32_LE( low, msglen, 0 );
  18816. PUT_UINT32_LE( high, msglen, 4 );
  18817. last = ctx->total[0] & 0x3F;
  18818. padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );
  18819. mbedtls_md4_update( ctx, (unsigned char *) md4_padding, padn );
  18820. mbedtls_md4_update( ctx, msglen, 8 );
  18821. PUT_UINT32_LE( ctx->state[0], output, 0 );
  18822. PUT_UINT32_LE( ctx->state[1], output, 4 );
  18823. PUT_UINT32_LE( ctx->state[2], output, 8 );
  18824. PUT_UINT32_LE( ctx->state[3], output, 12 );
  18825. }
  18826. #endif /* !MBEDTLS_MD4_ALT */
  18827. /*
  18828. * output = MD4( input buffer )
  18829. */
  18830. void mbedtls_md4( const unsigned char *input, size_t ilen, unsigned char output[16] )
  18831. {
  18832. mbedtls_md4_context ctx;
  18833. mbedtls_md4_init( &ctx );
  18834. mbedtls_md4_starts( &ctx );
  18835. mbedtls_md4_update( &ctx, input, ilen );
  18836. mbedtls_md4_finish( &ctx, output );
  18837. mbedtls_md4_free( &ctx );
  18838. }
  18839. #if defined(MBEDTLS_SELF_TEST)
  18840. /*
  18841. * RFC 1320 test vectors
  18842. */
  18843. static const char md4_test_str[7][81] =
  18844. {
  18845. { "" },
  18846. { "a" },
  18847. { "abc" },
  18848. { "message digest" },
  18849. { "abcdefghijklmnopqrstuvwxyz" },
  18850. { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" },
  18851. { "12345678901234567890123456789012345678901234567890123456789012" \
  18852. "345678901234567890" }
  18853. };
  18854. static const unsigned char md4_test_sum[7][16] =
  18855. {
  18856. { 0x31, 0xD6, 0xCF, 0xE0, 0xD1, 0x6A, 0xE9, 0x31,
  18857. 0xB7, 0x3C, 0x59, 0xD7, 0xE0, 0xC0, 0x89, 0xC0 },
  18858. { 0xBD, 0xE5, 0x2C, 0xB3, 0x1D, 0xE3, 0x3E, 0x46,
  18859. 0x24, 0x5E, 0x05, 0xFB, 0xDB, 0xD6, 0xFB, 0x24 },
  18860. { 0xA4, 0x48, 0x01, 0x7A, 0xAF, 0x21, 0xD8, 0x52,
  18861. 0x5F, 0xC1, 0x0A, 0xE8, 0x7A, 0xA6, 0x72, 0x9D },
  18862. { 0xD9, 0x13, 0x0A, 0x81, 0x64, 0x54, 0x9F, 0xE8,
  18863. 0x18, 0x87, 0x48, 0x06, 0xE1, 0xC7, 0x01, 0x4B },
  18864. { 0xD7, 0x9E, 0x1C, 0x30, 0x8A, 0xA5, 0xBB, 0xCD,
  18865. 0xEE, 0xA8, 0xED, 0x63, 0xDF, 0x41, 0x2D, 0xA9 },
  18866. { 0x04, 0x3F, 0x85, 0x82, 0xF2, 0x41, 0xDB, 0x35,
  18867. 0x1C, 0xE6, 0x27, 0xE1, 0x53, 0xE7, 0xF0, 0xE4 },
  18868. { 0xE3, 0x3B, 0x4D, 0xDC, 0x9C, 0x38, 0xF2, 0x19,
  18869. 0x9C, 0x3E, 0x7B, 0x16, 0x4F, 0xCC, 0x05, 0x36 }
  18870. };
  18871. /*
  18872. * Checkup routine
  18873. */
  18874. int mbedtls_md4_self_test( int verbose )
  18875. {
  18876. int i;
  18877. unsigned char md4sum[16];
  18878. for( i = 0; i < 7; i++ )
  18879. {
  18880. if( verbose != 0 )
  18881. mbedtls_printf( " MD4 test #%d: ", i + 1 );
  18882. mbedtls_md4( (unsigned char *) md4_test_str[i],
  18883. strlen( md4_test_str[i] ), md4sum );
  18884. if( memcmp( md4sum, md4_test_sum[i], 16 ) != 0 )
  18885. {
  18886. if( verbose != 0 )
  18887. mbedtls_printf( "failed\n" );
  18888. return( 1 );
  18889. }
  18890. if( verbose != 0 )
  18891. mbedtls_printf( "passed\n" );
  18892. }
  18893. if( verbose != 0 )
  18894. mbedtls_printf( "\n" );
  18895. return( 0 );
  18896. }
  18897. #endif /* MBEDTLS_SELF_TEST */
  18898. #endif /* MBEDTLS_MD4_C */
  18899. /********* Start of file library/md5.c ************/
  18900. /*
  18901. * RFC 1321 compliant MD5 implementation
  18902. *
  18903. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  18904. * SPDX-License-Identifier: Apache-2.0
  18905. *
  18906. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  18907. * not use this file except in compliance with the License.
  18908. * You may obtain a copy of the License at
  18909. *
  18910. * http://www.apache.org/licenses/LICENSE-2.0
  18911. *
  18912. * Unless required by applicable law or agreed to in writing, software
  18913. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  18914. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  18915. * See the License for the specific language governing permissions and
  18916. * limitations under the License.
  18917. *
  18918. * This file is part of mbed TLS (https://tls.mbed.org)
  18919. */
  18920. /*
  18921. * The MD5 algorithm was designed by Ron Rivest in 1991.
  18922. *
  18923. * http://www.ietf.org/rfc/rfc1321.txt
  18924. */
  18925. #if !defined(MBEDTLS_CONFIG_FILE)
  18926. #else
  18927. #endif
  18928. #if defined(MBEDTLS_MD5_C)
  18929. #include <string.h>
  18930. #if defined(MBEDTLS_SELF_TEST)
  18931. #if defined(MBEDTLS_PLATFORM_C)
  18932. #else
  18933. #include <stdio.h>
  18934. #define mbedtls_printf printf
  18935. #endif /* MBEDTLS_PLATFORM_C */
  18936. #endif /* MBEDTLS_SELF_TEST */
  18937. #if !defined(MBEDTLS_MD5_ALT)
  18938. /* Implementation that should never be optimized out by the compiler */
  18939. static void md5_zeroize( void *v, size_t n ) {
  18940. volatile unsigned char *p = v; while( n-- ) *p++ = 0;
  18941. }
  18942. /*
  18943. * 32-bit integer manipulation macros (little endian)
  18944. */
  18945. #ifndef GET_UINT32_LE
  18946. #define GET_UINT32_LE(n,b,i) \
  18947. { \
  18948. (n) = ( (uint32_t) (b)[(i) ] ) \
  18949. | ( (uint32_t) (b)[(i) + 1] << 8 ) \
  18950. | ( (uint32_t) (b)[(i) + 2] << 16 ) \
  18951. | ( (uint32_t) (b)[(i) + 3] << 24 ); \
  18952. }
  18953. #endif
  18954. #ifndef PUT_UINT32_LE
  18955. #define PUT_UINT32_LE(n,b,i) \
  18956. { \
  18957. (b)[(i) ] = (unsigned char) ( ( (n) ) & 0xFF ); \
  18958. (b)[(i) + 1] = (unsigned char) ( ( (n) >> 8 ) & 0xFF ); \
  18959. (b)[(i) + 2] = (unsigned char) ( ( (n) >> 16 ) & 0xFF ); \
  18960. (b)[(i) + 3] = (unsigned char) ( ( (n) >> 24 ) & 0xFF ); \
  18961. }
  18962. #endif
  18963. void mbedtls_md5_init( mbedtls_md5_context *ctx )
  18964. {
  18965. memset( ctx, 0, sizeof( mbedtls_md5_context ) );
  18966. }
  18967. void mbedtls_md5_free( mbedtls_md5_context *ctx )
  18968. {
  18969. if( ctx == NULL )
  18970. return;
  18971. md5_zeroize( ctx, sizeof( mbedtls_md5_context ) );
  18972. }
  18973. void mbedtls_md5_clone( mbedtls_md5_context *dst,
  18974. const mbedtls_md5_context *src )
  18975. {
  18976. *dst = *src;
  18977. }
  18978. /*
  18979. * MD5 context setup
  18980. */
  18981. void mbedtls_md5_starts( mbedtls_md5_context *ctx )
  18982. {
  18983. ctx->total[0] = 0;
  18984. ctx->total[1] = 0;
  18985. ctx->state[0] = 0x67452301;
  18986. ctx->state[1] = 0xEFCDAB89;
  18987. ctx->state[2] = 0x98BADCFE;
  18988. ctx->state[3] = 0x10325476;
  18989. }
  18990. #if !defined(MBEDTLS_MD5_PROCESS_ALT)
  18991. void mbedtls_md5_process( mbedtls_md5_context *ctx, const unsigned char data[64] )
  18992. {
  18993. uint32_t X[16], A, B, C, D;
  18994. GET_UINT32_LE( X[ 0], data, 0 );
  18995. GET_UINT32_LE( X[ 1], data, 4 );
  18996. GET_UINT32_LE( X[ 2], data, 8 );
  18997. GET_UINT32_LE( X[ 3], data, 12 );
  18998. GET_UINT32_LE( X[ 4], data, 16 );
  18999. GET_UINT32_LE( X[ 5], data, 20 );
  19000. GET_UINT32_LE( X[ 6], data, 24 );
  19001. GET_UINT32_LE( X[ 7], data, 28 );
  19002. GET_UINT32_LE( X[ 8], data, 32 );
  19003. GET_UINT32_LE( X[ 9], data, 36 );
  19004. GET_UINT32_LE( X[10], data, 40 );
  19005. GET_UINT32_LE( X[11], data, 44 );
  19006. GET_UINT32_LE( X[12], data, 48 );
  19007. GET_UINT32_LE( X[13], data, 52 );
  19008. GET_UINT32_LE( X[14], data, 56 );
  19009. GET_UINT32_LE( X[15], data, 60 );
  19010. #define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n)))
  19011. #define P(a,b,c,d,k,s,t) \
  19012. { \
  19013. a += F(b,c,d) + X[k] + t; a = S(a,s) + b; \
  19014. }
  19015. A = ctx->state[0];
  19016. B = ctx->state[1];
  19017. C = ctx->state[2];
  19018. D = ctx->state[3];
  19019. #define F(x,y,z) (z ^ (x & (y ^ z)))
  19020. P( A, B, C, D, 0, 7, 0xD76AA478 );
  19021. P( D, A, B, C, 1, 12, 0xE8C7B756 );
  19022. P( C, D, A, B, 2, 17, 0x242070DB );
  19023. P( B, C, D, A, 3, 22, 0xC1BDCEEE );
  19024. P( A, B, C, D, 4, 7, 0xF57C0FAF );
  19025. P( D, A, B, C, 5, 12, 0x4787C62A );
  19026. P( C, D, A, B, 6, 17, 0xA8304613 );
  19027. P( B, C, D, A, 7, 22, 0xFD469501 );
  19028. P( A, B, C, D, 8, 7, 0x698098D8 );
  19029. P( D, A, B, C, 9, 12, 0x8B44F7AF );
  19030. P( C, D, A, B, 10, 17, 0xFFFF5BB1 );
  19031. P( B, C, D, A, 11, 22, 0x895CD7BE );
  19032. P( A, B, C, D, 12, 7, 0x6B901122 );
  19033. P( D, A, B, C, 13, 12, 0xFD987193 );
  19034. P( C, D, A, B, 14, 17, 0xA679438E );
  19035. P( B, C, D, A, 15, 22, 0x49B40821 );
  19036. #undef F
  19037. #define F(x,y,z) (y ^ (z & (x ^ y)))
  19038. P( A, B, C, D, 1, 5, 0xF61E2562 );
  19039. P( D, A, B, C, 6, 9, 0xC040B340 );
  19040. P( C, D, A, B, 11, 14, 0x265E5A51 );
  19041. P( B, C, D, A, 0, 20, 0xE9B6C7AA );
  19042. P( A, B, C, D, 5, 5, 0xD62F105D );
  19043. P( D, A, B, C, 10, 9, 0x02441453 );
  19044. P( C, D, A, B, 15, 14, 0xD8A1E681 );
  19045. P( B, C, D, A, 4, 20, 0xE7D3FBC8 );
  19046. P( A, B, C, D, 9, 5, 0x21E1CDE6 );
  19047. P( D, A, B, C, 14, 9, 0xC33707D6 );
  19048. P( C, D, A, B, 3, 14, 0xF4D50D87 );
  19049. P( B, C, D, A, 8, 20, 0x455A14ED );
  19050. P( A, B, C, D, 13, 5, 0xA9E3E905 );
  19051. P( D, A, B, C, 2, 9, 0xFCEFA3F8 );
  19052. P( C, D, A, B, 7, 14, 0x676F02D9 );
  19053. P( B, C, D, A, 12, 20, 0x8D2A4C8A );
  19054. #undef F
  19055. #define F(x,y,z) (x ^ y ^ z)
  19056. P( A, B, C, D, 5, 4, 0xFFFA3942 );
  19057. P( D, A, B, C, 8, 11, 0x8771F681 );
  19058. P( C, D, A, B, 11, 16, 0x6D9D6122 );
  19059. P( B, C, D, A, 14, 23, 0xFDE5380C );
  19060. P( A, B, C, D, 1, 4, 0xA4BEEA44 );
  19061. P( D, A, B, C, 4, 11, 0x4BDECFA9 );
  19062. P( C, D, A, B, 7, 16, 0xF6BB4B60 );
  19063. P( B, C, D, A, 10, 23, 0xBEBFBC70 );
  19064. P( A, B, C, D, 13, 4, 0x289B7EC6 );
  19065. P( D, A, B, C, 0, 11, 0xEAA127FA );
  19066. P( C, D, A, B, 3, 16, 0xD4EF3085 );
  19067. P( B, C, D, A, 6, 23, 0x04881D05 );
  19068. P( A, B, C, D, 9, 4, 0xD9D4D039 );
  19069. P( D, A, B, C, 12, 11, 0xE6DB99E5 );
  19070. P( C, D, A, B, 15, 16, 0x1FA27CF8 );
  19071. P( B, C, D, A, 2, 23, 0xC4AC5665 );
  19072. #undef F
  19073. #define F(x,y,z) (y ^ (x | ~z))
  19074. P( A, B, C, D, 0, 6, 0xF4292244 );
  19075. P( D, A, B, C, 7, 10, 0x432AFF97 );
  19076. P( C, D, A, B, 14, 15, 0xAB9423A7 );
  19077. P( B, C, D, A, 5, 21, 0xFC93A039 );
  19078. P( A, B, C, D, 12, 6, 0x655B59C3 );
  19079. P( D, A, B, C, 3, 10, 0x8F0CCC92 );
  19080. P( C, D, A, B, 10, 15, 0xFFEFF47D );
  19081. P( B, C, D, A, 1, 21, 0x85845DD1 );
  19082. P( A, B, C, D, 8, 6, 0x6FA87E4F );
  19083. P( D, A, B, C, 15, 10, 0xFE2CE6E0 );
  19084. P( C, D, A, B, 6, 15, 0xA3014314 );
  19085. P( B, C, D, A, 13, 21, 0x4E0811A1 );
  19086. P( A, B, C, D, 4, 6, 0xF7537E82 );
  19087. P( D, A, B, C, 11, 10, 0xBD3AF235 );
  19088. P( C, D, A, B, 2, 15, 0x2AD7D2BB );
  19089. P( B, C, D, A, 9, 21, 0xEB86D391 );
  19090. #undef F
  19091. ctx->state[0] += A;
  19092. ctx->state[1] += B;
  19093. ctx->state[2] += C;
  19094. ctx->state[3] += D;
  19095. }
  19096. #endif /* !MBEDTLS_MD5_PROCESS_ALT */
  19097. /*
  19098. * MD5 process buffer
  19099. */
  19100. void mbedtls_md5_update( mbedtls_md5_context *ctx, const unsigned char *input, size_t ilen )
  19101. {
  19102. size_t fill;
  19103. uint32_t left;
  19104. if( ilen == 0 )
  19105. return;
  19106. left = ctx->total[0] & 0x3F;
  19107. fill = 64 - left;
  19108. ctx->total[0] += (uint32_t) ilen;
  19109. ctx->total[0] &= 0xFFFFFFFF;
  19110. if( ctx->total[0] < (uint32_t) ilen )
  19111. ctx->total[1]++;
  19112. if( left && ilen >= fill )
  19113. {
  19114. memcpy( (void *) (ctx->buffer + left), input, fill );
  19115. mbedtls_md5_process( ctx, ctx->buffer );
  19116. input += fill;
  19117. ilen -= fill;
  19118. left = 0;
  19119. }
  19120. while( ilen >= 64 )
  19121. {
  19122. mbedtls_md5_process( ctx, input );
  19123. input += 64;
  19124. ilen -= 64;
  19125. }
  19126. if( ilen > 0 )
  19127. {
  19128. memcpy( (void *) (ctx->buffer + left), input, ilen );
  19129. }
  19130. }
  19131. static const unsigned char md5_padding[64] =
  19132. {
  19133. 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  19134. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  19135. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  19136. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  19137. };
  19138. /*
  19139. * MD5 final digest
  19140. */
  19141. void mbedtls_md5_finish( mbedtls_md5_context *ctx, unsigned char output[16] )
  19142. {
  19143. uint32_t last, padn;
  19144. uint32_t high, low;
  19145. unsigned char msglen[8];
  19146. high = ( ctx->total[0] >> 29 )
  19147. | ( ctx->total[1] << 3 );
  19148. low = ( ctx->total[0] << 3 );
  19149. PUT_UINT32_LE( low, msglen, 0 );
  19150. PUT_UINT32_LE( high, msglen, 4 );
  19151. last = ctx->total[0] & 0x3F;
  19152. padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );
  19153. mbedtls_md5_update( ctx, md5_padding, padn );
  19154. mbedtls_md5_update( ctx, msglen, 8 );
  19155. PUT_UINT32_LE( ctx->state[0], output, 0 );
  19156. PUT_UINT32_LE( ctx->state[1], output, 4 );
  19157. PUT_UINT32_LE( ctx->state[2], output, 8 );
  19158. PUT_UINT32_LE( ctx->state[3], output, 12 );
  19159. }
  19160. #endif /* !MBEDTLS_MD5_ALT */
  19161. /*
  19162. * output = MD5( input buffer )
  19163. */
  19164. void mbedtls_md5( const unsigned char *input, size_t ilen, unsigned char output[16] )
  19165. {
  19166. mbedtls_md5_context ctx;
  19167. mbedtls_md5_init( &ctx );
  19168. mbedtls_md5_starts( &ctx );
  19169. mbedtls_md5_update( &ctx, input, ilen );
  19170. mbedtls_md5_finish( &ctx, output );
  19171. mbedtls_md5_free( &ctx );
  19172. }
  19173. #if defined(MBEDTLS_SELF_TEST)
  19174. /*
  19175. * RFC 1321 test vectors
  19176. */
  19177. static const unsigned char md5_test_buf[7][81] =
  19178. {
  19179. { "" },
  19180. { "a" },
  19181. { "abc" },
  19182. { "message digest" },
  19183. { "abcdefghijklmnopqrstuvwxyz" },
  19184. { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" },
  19185. { "12345678901234567890123456789012345678901234567890123456789012" \
  19186. "345678901234567890" }
  19187. };
  19188. static const int md5_test_buflen[7] =
  19189. {
  19190. 0, 1, 3, 14, 26, 62, 80
  19191. };
  19192. static const unsigned char md5_test_sum[7][16] =
  19193. {
  19194. { 0xD4, 0x1D, 0x8C, 0xD9, 0x8F, 0x00, 0xB2, 0x04,
  19195. 0xE9, 0x80, 0x09, 0x98, 0xEC, 0xF8, 0x42, 0x7E },
  19196. { 0x0C, 0xC1, 0x75, 0xB9, 0xC0, 0xF1, 0xB6, 0xA8,
  19197. 0x31, 0xC3, 0x99, 0xE2, 0x69, 0x77, 0x26, 0x61 },
  19198. { 0x90, 0x01, 0x50, 0x98, 0x3C, 0xD2, 0x4F, 0xB0,
  19199. 0xD6, 0x96, 0x3F, 0x7D, 0x28, 0xE1, 0x7F, 0x72 },
  19200. { 0xF9, 0x6B, 0x69, 0x7D, 0x7C, 0xB7, 0x93, 0x8D,
  19201. 0x52, 0x5A, 0x2F, 0x31, 0xAA, 0xF1, 0x61, 0xD0 },
  19202. { 0xC3, 0xFC, 0xD3, 0xD7, 0x61, 0x92, 0xE4, 0x00,
  19203. 0x7D, 0xFB, 0x49, 0x6C, 0xCA, 0x67, 0xE1, 0x3B },
  19204. { 0xD1, 0x74, 0xAB, 0x98, 0xD2, 0x77, 0xD9, 0xF5,
  19205. 0xA5, 0x61, 0x1C, 0x2C, 0x9F, 0x41, 0x9D, 0x9F },
  19206. { 0x57, 0xED, 0xF4, 0xA2, 0x2B, 0xE3, 0xC9, 0x55,
  19207. 0xAC, 0x49, 0xDA, 0x2E, 0x21, 0x07, 0xB6, 0x7A }
  19208. };
  19209. /*
  19210. * Checkup routine
  19211. */
  19212. int mbedtls_md5_self_test( int verbose )
  19213. {
  19214. int i;
  19215. unsigned char md5sum[16];
  19216. for( i = 0; i < 7; i++ )
  19217. {
  19218. if( verbose != 0 )
  19219. mbedtls_printf( " MD5 test #%d: ", i + 1 );
  19220. mbedtls_md5( md5_test_buf[i], md5_test_buflen[i], md5sum );
  19221. if( memcmp( md5sum, md5_test_sum[i], 16 ) != 0 )
  19222. {
  19223. if( verbose != 0 )
  19224. mbedtls_printf( "failed\n" );
  19225. return( 1 );
  19226. }
  19227. if( verbose != 0 )
  19228. mbedtls_printf( "passed\n" );
  19229. }
  19230. if( verbose != 0 )
  19231. mbedtls_printf( "\n" );
  19232. return( 0 );
  19233. }
  19234. #endif /* MBEDTLS_SELF_TEST */
  19235. /* Amalgamated Release Mappings */
  19236. #undef F
  19237. #undef P
  19238. #undef S
  19239. #endif /* MBEDTLS_MD5_C */
  19240. /********* Start of file library/md_wrap.c ************/
  19241. /**
  19242. * \file md_wrap.c
  19243. *
  19244. * \brief Generic message digest wrapper for mbed TLS
  19245. *
  19246. * \author Adriaan de Jong <dejong@fox-it.com>
  19247. *
  19248. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  19249. * SPDX-License-Identifier: Apache-2.0
  19250. *
  19251. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  19252. * not use this file except in compliance with the License.
  19253. * You may obtain a copy of the License at
  19254. *
  19255. * http://www.apache.org/licenses/LICENSE-2.0
  19256. *
  19257. * Unless required by applicable law or agreed to in writing, software
  19258. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  19259. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  19260. * See the License for the specific language governing permissions and
  19261. * limitations under the License.
  19262. *
  19263. * This file is part of mbed TLS (https://tls.mbed.org)
  19264. */
  19265. #if !defined(MBEDTLS_CONFIG_FILE)
  19266. #else
  19267. #endif
  19268. #if defined(MBEDTLS_MD_C)
  19269. #if defined(MBEDTLS_MD2_C)
  19270. #endif
  19271. #if defined(MBEDTLS_MD4_C)
  19272. #endif
  19273. #if defined(MBEDTLS_MD5_C)
  19274. #endif
  19275. #if defined(MBEDTLS_RIPEMD160_C)
  19276. #endif
  19277. #if defined(MBEDTLS_SHA1_C)
  19278. #endif
  19279. #if defined(MBEDTLS_SHA256_C)
  19280. #endif
  19281. #if defined(MBEDTLS_SHA512_C)
  19282. #endif
  19283. #if defined(MBEDTLS_PLATFORM_C)
  19284. #else
  19285. #include <stdlib.h>
  19286. #define mbedtls_calloc calloc
  19287. #define mbedtls_free free
  19288. #endif
  19289. #if defined(MBEDTLS_MD2_C)
  19290. static void md2_starts_wrap( void *ctx )
  19291. {
  19292. mbedtls_md2_starts( (mbedtls_md2_context *) ctx );
  19293. }
  19294. static void md2_update_wrap( void *ctx, const unsigned char *input,
  19295. size_t ilen )
  19296. {
  19297. mbedtls_md2_update( (mbedtls_md2_context *) ctx, input, ilen );
  19298. }
  19299. static void md2_finish_wrap( void *ctx, unsigned char *output )
  19300. {
  19301. mbedtls_md2_finish( (mbedtls_md2_context *) ctx, output );
  19302. }
  19303. static void *md2_ctx_alloc( void )
  19304. {
  19305. void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_md2_context ) );
  19306. if( ctx != NULL )
  19307. mbedtls_md2_init( (mbedtls_md2_context *) ctx );
  19308. return( ctx );
  19309. }
  19310. static void md2_ctx_free( void *ctx )
  19311. {
  19312. mbedtls_md2_free( (mbedtls_md2_context *) ctx );
  19313. mbedtls_free( ctx );
  19314. }
  19315. static void md2_clone_wrap( void *dst, const void *src )
  19316. {
  19317. mbedtls_md2_clone( (mbedtls_md2_context *) dst,
  19318. (const mbedtls_md2_context *) src );
  19319. }
  19320. static void md2_process_wrap( void *ctx, const unsigned char *data )
  19321. {
  19322. ((void) data);
  19323. mbedtls_md2_process( (mbedtls_md2_context *) ctx );
  19324. }
  19325. const mbedtls_md_info_t mbedtls_md2_info = {
  19326. MBEDTLS_MD_MD2,
  19327. "MD2",
  19328. 16,
  19329. 16,
  19330. md2_starts_wrap,
  19331. md2_update_wrap,
  19332. md2_finish_wrap,
  19333. mbedtls_md2,
  19334. md2_ctx_alloc,
  19335. md2_ctx_free,
  19336. md2_clone_wrap,
  19337. md2_process_wrap,
  19338. };
  19339. #endif /* MBEDTLS_MD2_C */
  19340. #if defined(MBEDTLS_MD4_C)
  19341. static void md4_starts_wrap( void *ctx )
  19342. {
  19343. mbedtls_md4_starts( (mbedtls_md4_context *) ctx );
  19344. }
  19345. static void md4_update_wrap( void *ctx, const unsigned char *input,
  19346. size_t ilen )
  19347. {
  19348. mbedtls_md4_update( (mbedtls_md4_context *) ctx, input, ilen );
  19349. }
  19350. static void md4_finish_wrap( void *ctx, unsigned char *output )
  19351. {
  19352. mbedtls_md4_finish( (mbedtls_md4_context *) ctx, output );
  19353. }
  19354. static void *md4_ctx_alloc( void )
  19355. {
  19356. void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_md4_context ) );
  19357. if( ctx != NULL )
  19358. mbedtls_md4_init( (mbedtls_md4_context *) ctx );
  19359. return( ctx );
  19360. }
  19361. static void md4_ctx_free( void *ctx )
  19362. {
  19363. mbedtls_md4_free( (mbedtls_md4_context *) ctx );
  19364. mbedtls_free( ctx );
  19365. }
  19366. static void md4_clone_wrap( void *dst, const void *src )
  19367. {
  19368. mbedtls_md4_clone( (mbedtls_md4_context *) dst,
  19369. (const mbedtls_md4_context *) src );
  19370. }
  19371. static void md4_process_wrap( void *ctx, const unsigned char *data )
  19372. {
  19373. mbedtls_md4_process( (mbedtls_md4_context *) ctx, data );
  19374. }
  19375. const mbedtls_md_info_t mbedtls_md4_info = {
  19376. MBEDTLS_MD_MD4,
  19377. "MD4",
  19378. 16,
  19379. 64,
  19380. md4_starts_wrap,
  19381. md4_update_wrap,
  19382. md4_finish_wrap,
  19383. mbedtls_md4,
  19384. md4_ctx_alloc,
  19385. md4_ctx_free,
  19386. md4_clone_wrap,
  19387. md4_process_wrap,
  19388. };
  19389. #endif /* MBEDTLS_MD4_C */
  19390. #if defined(MBEDTLS_MD5_C)
  19391. static void md5_starts_wrap( void *ctx )
  19392. {
  19393. mbedtls_md5_starts( (mbedtls_md5_context *) ctx );
  19394. }
  19395. static void md5_update_wrap( void *ctx, const unsigned char *input,
  19396. size_t ilen )
  19397. {
  19398. mbedtls_md5_update( (mbedtls_md5_context *) ctx, input, ilen );
  19399. }
  19400. static void md5_finish_wrap( void *ctx, unsigned char *output )
  19401. {
  19402. mbedtls_md5_finish( (mbedtls_md5_context *) ctx, output );
  19403. }
  19404. static void *md5_ctx_alloc( void )
  19405. {
  19406. void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_md5_context ) );
  19407. if( ctx != NULL )
  19408. mbedtls_md5_init( (mbedtls_md5_context *) ctx );
  19409. return( ctx );
  19410. }
  19411. static void md5_ctx_free( void *ctx )
  19412. {
  19413. mbedtls_md5_free( (mbedtls_md5_context *) ctx );
  19414. mbedtls_free( ctx );
  19415. }
  19416. static void md5_clone_wrap( void *dst, const void *src )
  19417. {
  19418. mbedtls_md5_clone( (mbedtls_md5_context *) dst,
  19419. (const mbedtls_md5_context *) src );
  19420. }
  19421. static void md5_process_wrap( void *ctx, const unsigned char *data )
  19422. {
  19423. mbedtls_md5_process( (mbedtls_md5_context *) ctx, data );
  19424. }
  19425. const mbedtls_md_info_t mbedtls_md5_info = {
  19426. MBEDTLS_MD_MD5,
  19427. "MD5",
  19428. 16,
  19429. 64,
  19430. md5_starts_wrap,
  19431. md5_update_wrap,
  19432. md5_finish_wrap,
  19433. mbedtls_md5,
  19434. md5_ctx_alloc,
  19435. md5_ctx_free,
  19436. md5_clone_wrap,
  19437. md5_process_wrap,
  19438. };
  19439. #endif /* MBEDTLS_MD5_C */
  19440. #if defined(MBEDTLS_RIPEMD160_C)
  19441. static void ripemd160_starts_wrap( void *ctx )
  19442. {
  19443. mbedtls_ripemd160_starts( (mbedtls_ripemd160_context *) ctx );
  19444. }
  19445. static void ripemd160_update_wrap( void *ctx, const unsigned char *input,
  19446. size_t ilen )
  19447. {
  19448. mbedtls_ripemd160_update( (mbedtls_ripemd160_context *) ctx, input, ilen );
  19449. }
  19450. static void ripemd160_finish_wrap( void *ctx, unsigned char *output )
  19451. {
  19452. mbedtls_ripemd160_finish( (mbedtls_ripemd160_context *) ctx, output );
  19453. }
  19454. static void *ripemd160_ctx_alloc( void )
  19455. {
  19456. void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_ripemd160_context ) );
  19457. if( ctx != NULL )
  19458. mbedtls_ripemd160_init( (mbedtls_ripemd160_context *) ctx );
  19459. return( ctx );
  19460. }
  19461. static void ripemd160_ctx_free( void *ctx )
  19462. {
  19463. mbedtls_ripemd160_free( (mbedtls_ripemd160_context *) ctx );
  19464. mbedtls_free( ctx );
  19465. }
  19466. static void ripemd160_clone_wrap( void *dst, const void *src )
  19467. {
  19468. mbedtls_ripemd160_clone( (mbedtls_ripemd160_context *) dst,
  19469. (const mbedtls_ripemd160_context *) src );
  19470. }
  19471. static void ripemd160_process_wrap( void *ctx, const unsigned char *data )
  19472. {
  19473. mbedtls_ripemd160_process( (mbedtls_ripemd160_context *) ctx, data );
  19474. }
  19475. const mbedtls_md_info_t mbedtls_ripemd160_info = {
  19476. MBEDTLS_MD_RIPEMD160,
  19477. "RIPEMD160",
  19478. 20,
  19479. 64,
  19480. ripemd160_starts_wrap,
  19481. ripemd160_update_wrap,
  19482. ripemd160_finish_wrap,
  19483. mbedtls_ripemd160,
  19484. ripemd160_ctx_alloc,
  19485. ripemd160_ctx_free,
  19486. ripemd160_clone_wrap,
  19487. ripemd160_process_wrap,
  19488. };
  19489. #endif /* MBEDTLS_RIPEMD160_C */
  19490. #if defined(MBEDTLS_SHA1_C)
  19491. static void sha1_starts_wrap( void *ctx )
  19492. {
  19493. mbedtls_sha1_starts( (mbedtls_sha1_context *) ctx );
  19494. }
  19495. static void sha1_update_wrap( void *ctx, const unsigned char *input,
  19496. size_t ilen )
  19497. {
  19498. mbedtls_sha1_update( (mbedtls_sha1_context *) ctx, input, ilen );
  19499. }
  19500. static void sha1_finish_wrap( void *ctx, unsigned char *output )
  19501. {
  19502. mbedtls_sha1_finish( (mbedtls_sha1_context *) ctx, output );
  19503. }
  19504. static void *sha1_ctx_alloc( void )
  19505. {
  19506. void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_sha1_context ) );
  19507. if( ctx != NULL )
  19508. mbedtls_sha1_init( (mbedtls_sha1_context *) ctx );
  19509. return( ctx );
  19510. }
  19511. static void sha1_clone_wrap( void *dst, const void *src )
  19512. {
  19513. mbedtls_sha1_clone( (mbedtls_sha1_context *) dst,
  19514. (const mbedtls_sha1_context *) src );
  19515. }
  19516. static void sha1_ctx_free( void *ctx )
  19517. {
  19518. mbedtls_sha1_free( (mbedtls_sha1_context *) ctx );
  19519. mbedtls_free( ctx );
  19520. }
  19521. static void sha1_process_wrap( void *ctx, const unsigned char *data )
  19522. {
  19523. mbedtls_sha1_process( (mbedtls_sha1_context *) ctx, data );
  19524. }
  19525. const mbedtls_md_info_t mbedtls_sha1_info = {
  19526. MBEDTLS_MD_SHA1,
  19527. "SHA1",
  19528. 20,
  19529. 64,
  19530. sha1_starts_wrap,
  19531. sha1_update_wrap,
  19532. sha1_finish_wrap,
  19533. mbedtls_sha1,
  19534. sha1_ctx_alloc,
  19535. sha1_ctx_free,
  19536. sha1_clone_wrap,
  19537. sha1_process_wrap,
  19538. };
  19539. #endif /* MBEDTLS_SHA1_C */
  19540. /*
  19541. * Wrappers for generic message digests
  19542. */
  19543. #if defined(MBEDTLS_SHA256_C)
  19544. static void sha224_starts_wrap( void *ctx )
  19545. {
  19546. mbedtls_sha256_starts( (mbedtls_sha256_context *) ctx, 1 );
  19547. }
  19548. static void sha224_update_wrap( void *ctx, const unsigned char *input,
  19549. size_t ilen )
  19550. {
  19551. mbedtls_sha256_update( (mbedtls_sha256_context *) ctx, input, ilen );
  19552. }
  19553. static void sha224_finish_wrap( void *ctx, unsigned char *output )
  19554. {
  19555. mbedtls_sha256_finish( (mbedtls_sha256_context *) ctx, output );
  19556. }
  19557. static void sha224_wrap( const unsigned char *input, size_t ilen,
  19558. unsigned char *output )
  19559. {
  19560. mbedtls_sha256( input, ilen, output, 1 );
  19561. }
  19562. static void *sha224_ctx_alloc( void )
  19563. {
  19564. void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_sha256_context ) );
  19565. if( ctx != NULL )
  19566. mbedtls_sha256_init( (mbedtls_sha256_context *) ctx );
  19567. return( ctx );
  19568. }
  19569. static void sha224_ctx_free( void *ctx )
  19570. {
  19571. mbedtls_sha256_free( (mbedtls_sha256_context *) ctx );
  19572. mbedtls_free( ctx );
  19573. }
  19574. static void sha224_clone_wrap( void *dst, const void *src )
  19575. {
  19576. mbedtls_sha256_clone( (mbedtls_sha256_context *) dst,
  19577. (const mbedtls_sha256_context *) src );
  19578. }
  19579. static void sha224_process_wrap( void *ctx, const unsigned char *data )
  19580. {
  19581. mbedtls_sha256_process( (mbedtls_sha256_context *) ctx, data );
  19582. }
  19583. const mbedtls_md_info_t mbedtls_sha224_info = {
  19584. MBEDTLS_MD_SHA224,
  19585. "SHA224",
  19586. 28,
  19587. 64,
  19588. sha224_starts_wrap,
  19589. sha224_update_wrap,
  19590. sha224_finish_wrap,
  19591. sha224_wrap,
  19592. sha224_ctx_alloc,
  19593. sha224_ctx_free,
  19594. sha224_clone_wrap,
  19595. sha224_process_wrap,
  19596. };
  19597. static void sha256_starts_wrap( void *ctx )
  19598. {
  19599. mbedtls_sha256_starts( (mbedtls_sha256_context *) ctx, 0 );
  19600. }
  19601. static void sha256_wrap( const unsigned char *input, size_t ilen,
  19602. unsigned char *output )
  19603. {
  19604. mbedtls_sha256( input, ilen, output, 0 );
  19605. }
  19606. const mbedtls_md_info_t mbedtls_sha256_info = {
  19607. MBEDTLS_MD_SHA256,
  19608. "SHA256",
  19609. 32,
  19610. 64,
  19611. sha256_starts_wrap,
  19612. sha224_update_wrap,
  19613. sha224_finish_wrap,
  19614. sha256_wrap,
  19615. sha224_ctx_alloc,
  19616. sha224_ctx_free,
  19617. sha224_clone_wrap,
  19618. sha224_process_wrap,
  19619. };
  19620. #endif /* MBEDTLS_SHA256_C */
  19621. #if defined(MBEDTLS_SHA512_C)
  19622. static void sha384_starts_wrap( void *ctx )
  19623. {
  19624. mbedtls_sha512_starts( (mbedtls_sha512_context *) ctx, 1 );
  19625. }
  19626. static void sha384_update_wrap( void *ctx, const unsigned char *input,
  19627. size_t ilen )
  19628. {
  19629. mbedtls_sha512_update( (mbedtls_sha512_context *) ctx, input, ilen );
  19630. }
  19631. static void sha384_finish_wrap( void *ctx, unsigned char *output )
  19632. {
  19633. mbedtls_sha512_finish( (mbedtls_sha512_context *) ctx, output );
  19634. }
  19635. static void sha384_wrap( const unsigned char *input, size_t ilen,
  19636. unsigned char *output )
  19637. {
  19638. mbedtls_sha512( input, ilen, output, 1 );
  19639. }
  19640. static void *sha384_ctx_alloc( void )
  19641. {
  19642. void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_sha512_context ) );
  19643. if( ctx != NULL )
  19644. mbedtls_sha512_init( (mbedtls_sha512_context *) ctx );
  19645. return( ctx );
  19646. }
  19647. static void sha384_ctx_free( void *ctx )
  19648. {
  19649. mbedtls_sha512_free( (mbedtls_sha512_context *) ctx );
  19650. mbedtls_free( ctx );
  19651. }
  19652. static void sha384_clone_wrap( void *dst, const void *src )
  19653. {
  19654. mbedtls_sha512_clone( (mbedtls_sha512_context *) dst,
  19655. (const mbedtls_sha512_context *) src );
  19656. }
  19657. static void sha384_process_wrap( void *ctx, const unsigned char *data )
  19658. {
  19659. mbedtls_sha512_process( (mbedtls_sha512_context *) ctx, data );
  19660. }
  19661. const mbedtls_md_info_t mbedtls_sha384_info = {
  19662. MBEDTLS_MD_SHA384,
  19663. "SHA384",
  19664. 48,
  19665. 128,
  19666. sha384_starts_wrap,
  19667. sha384_update_wrap,
  19668. sha384_finish_wrap,
  19669. sha384_wrap,
  19670. sha384_ctx_alloc,
  19671. sha384_ctx_free,
  19672. sha384_clone_wrap,
  19673. sha384_process_wrap,
  19674. };
  19675. static void sha512_starts_wrap( void *ctx )
  19676. {
  19677. mbedtls_sha512_starts( (mbedtls_sha512_context *) ctx, 0 );
  19678. }
  19679. static void sha512_wrap( const unsigned char *input, size_t ilen,
  19680. unsigned char *output )
  19681. {
  19682. mbedtls_sha512( input, ilen, output, 0 );
  19683. }
  19684. const mbedtls_md_info_t mbedtls_sha512_info = {
  19685. MBEDTLS_MD_SHA512,
  19686. "SHA512",
  19687. 64,
  19688. 128,
  19689. sha512_starts_wrap,
  19690. sha384_update_wrap,
  19691. sha384_finish_wrap,
  19692. sha512_wrap,
  19693. sha384_ctx_alloc,
  19694. sha384_ctx_free,
  19695. sha384_clone_wrap,
  19696. sha384_process_wrap,
  19697. };
  19698. #endif /* MBEDTLS_SHA512_C */
  19699. #endif /* MBEDTLS_MD_C */
  19700. /********* Start of file library/memory_buffer_alloc.c ************/
  19701. /*
  19702. * Buffer-based memory allocator
  19703. *
  19704. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  19705. * SPDX-License-Identifier: Apache-2.0
  19706. *
  19707. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  19708. * not use this file except in compliance with the License.
  19709. * You may obtain a copy of the License at
  19710. *
  19711. * http://www.apache.org/licenses/LICENSE-2.0
  19712. *
  19713. * Unless required by applicable law or agreed to in writing, software
  19714. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  19715. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  19716. * See the License for the specific language governing permissions and
  19717. * limitations under the License.
  19718. *
  19719. * This file is part of mbed TLS (https://tls.mbed.org)
  19720. */
  19721. #if !defined(MBEDTLS_CONFIG_FILE)
  19722. #else
  19723. #endif
  19724. #if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C)
  19725. /* No need for the header guard as MBEDTLS_MEMORY_BUFFER_ALLOC_C
  19726. is dependent upon MBEDTLS_PLATFORM_C */
  19727. #include <string.h>
  19728. #if defined(MBEDTLS_MEMORY_BACKTRACE)
  19729. #include <execinfo.h>
  19730. #endif
  19731. #if defined(MBEDTLS_THREADING_C)
  19732. #endif
  19733. /* Implementation that should never be optimized out by the compiler */
  19734. static void memory_zeroize( void *v, size_t n ) {
  19735. volatile unsigned char *p = v; while( n-- ) *p++ = 0;
  19736. }
  19737. #define MAGIC1 0xFF00AA55
  19738. #define MAGIC2 0xEE119966
  19739. #define MAX_BT 20
  19740. typedef struct _memory_header memory_header;
  19741. struct _memory_header
  19742. {
  19743. size_t magic1;
  19744. size_t size;
  19745. size_t alloc;
  19746. memory_header *prev;
  19747. memory_header *next;
  19748. memory_header *prev_free;
  19749. memory_header *next_free;
  19750. #if defined(MBEDTLS_MEMORY_BACKTRACE)
  19751. char **trace;
  19752. size_t trace_count;
  19753. #endif
  19754. size_t magic2;
  19755. };
  19756. typedef struct
  19757. {
  19758. unsigned char *buf;
  19759. size_t len;
  19760. memory_header *first;
  19761. memory_header *first_free;
  19762. int verify;
  19763. #if defined(MBEDTLS_MEMORY_DEBUG)
  19764. size_t alloc_count;
  19765. size_t free_count;
  19766. size_t total_used;
  19767. size_t maximum_used;
  19768. size_t header_count;
  19769. size_t maximum_header_count;
  19770. #endif
  19771. #if defined(MBEDTLS_THREADING_C)
  19772. mbedtls_threading_mutex_t mutex;
  19773. #endif
  19774. }
  19775. buffer_alloc_ctx;
  19776. static buffer_alloc_ctx heap;
  19777. #if defined(MBEDTLS_MEMORY_DEBUG)
  19778. static void debug_header( memory_header *hdr )
  19779. {
  19780. #if defined(MBEDTLS_MEMORY_BACKTRACE)
  19781. size_t i;
  19782. #endif
  19783. mbedtls_fprintf( stderr, "HDR: PTR(%10zu), PREV(%10zu), NEXT(%10zu), "
  19784. "ALLOC(%zu), SIZE(%10zu)\n",
  19785. (size_t) hdr, (size_t) hdr->prev, (size_t) hdr->next,
  19786. hdr->alloc, hdr->size );
  19787. mbedtls_fprintf( stderr, " FPREV(%10zu), FNEXT(%10zu)\n",
  19788. (size_t) hdr->prev_free, (size_t) hdr->next_free );
  19789. #if defined(MBEDTLS_MEMORY_BACKTRACE)
  19790. mbedtls_fprintf( stderr, "TRACE: \n" );
  19791. for( i = 0; i < hdr->trace_count; i++ )
  19792. mbedtls_fprintf( stderr, "%s\n", hdr->trace[i] );
  19793. mbedtls_fprintf( stderr, "\n" );
  19794. #endif
  19795. }
  19796. static void debug_chain()
  19797. {
  19798. memory_header *cur = heap.first;
  19799. mbedtls_fprintf( stderr, "\nBlock list\n" );
  19800. while( cur != NULL )
  19801. {
  19802. debug_header( cur );
  19803. cur = cur->next;
  19804. }
  19805. mbedtls_fprintf( stderr, "Free list\n" );
  19806. cur = heap.first_free;
  19807. while( cur != NULL )
  19808. {
  19809. debug_header( cur );
  19810. cur = cur->next_free;
  19811. }
  19812. }
  19813. #endif /* MBEDTLS_MEMORY_DEBUG */
  19814. static int verify_header( memory_header *hdr )
  19815. {
  19816. if( hdr->magic1 != MAGIC1 )
  19817. {
  19818. #if defined(MBEDTLS_MEMORY_DEBUG)
  19819. mbedtls_fprintf( stderr, "FATAL: MAGIC1 mismatch\n" );
  19820. #endif
  19821. return( 1 );
  19822. }
  19823. if( hdr->magic2 != MAGIC2 )
  19824. {
  19825. #if defined(MBEDTLS_MEMORY_DEBUG)
  19826. mbedtls_fprintf( stderr, "FATAL: MAGIC2 mismatch\n" );
  19827. #endif
  19828. return( 1 );
  19829. }
  19830. if( hdr->alloc > 1 )
  19831. {
  19832. #if defined(MBEDTLS_MEMORY_DEBUG)
  19833. mbedtls_fprintf( stderr, "FATAL: alloc has illegal value\n" );
  19834. #endif
  19835. return( 1 );
  19836. }
  19837. if( hdr->prev != NULL && hdr->prev == hdr->next )
  19838. {
  19839. #if defined(MBEDTLS_MEMORY_DEBUG)
  19840. mbedtls_fprintf( stderr, "FATAL: prev == next\n" );
  19841. #endif
  19842. return( 1 );
  19843. }
  19844. if( hdr->prev_free != NULL && hdr->prev_free == hdr->next_free )
  19845. {
  19846. #if defined(MBEDTLS_MEMORY_DEBUG)
  19847. mbedtls_fprintf( stderr, "FATAL: prev_free == next_free\n" );
  19848. #endif
  19849. return( 1 );
  19850. }
  19851. return( 0 );
  19852. }
  19853. static int verify_chain()
  19854. {
  19855. memory_header *prv = heap.first, *cur = heap.first->next;
  19856. if( verify_header( heap.first ) != 0 )
  19857. {
  19858. #if defined(MBEDTLS_MEMORY_DEBUG)
  19859. mbedtls_fprintf( stderr, "FATAL: verification of first header "
  19860. "failed\n" );
  19861. #endif
  19862. return( 1 );
  19863. }
  19864. if( heap.first->prev != NULL )
  19865. {
  19866. #if defined(MBEDTLS_MEMORY_DEBUG)
  19867. mbedtls_fprintf( stderr, "FATAL: verification failed: "
  19868. "first->prev != NULL\n" );
  19869. #endif
  19870. return( 1 );
  19871. }
  19872. while( cur != NULL )
  19873. {
  19874. if( verify_header( cur ) != 0 )
  19875. {
  19876. #if defined(MBEDTLS_MEMORY_DEBUG)
  19877. mbedtls_fprintf( stderr, "FATAL: verification of header "
  19878. "failed\n" );
  19879. #endif
  19880. return( 1 );
  19881. }
  19882. if( cur->prev != prv )
  19883. {
  19884. #if defined(MBEDTLS_MEMORY_DEBUG)
  19885. mbedtls_fprintf( stderr, "FATAL: verification failed: "
  19886. "cur->prev != prv\n" );
  19887. #endif
  19888. return( 1 );
  19889. }
  19890. prv = cur;
  19891. cur = cur->next;
  19892. }
  19893. return( 0 );
  19894. }
  19895. static void *buffer_alloc_calloc( size_t n, size_t size )
  19896. {
  19897. memory_header *new, *cur = heap.first_free;
  19898. unsigned char *p;
  19899. void *ret;
  19900. size_t original_len, len;
  19901. #if defined(MBEDTLS_MEMORY_BACKTRACE)
  19902. void *trace_buffer[MAX_BT];
  19903. size_t trace_cnt;
  19904. #endif
  19905. if( heap.buf == NULL || heap.first == NULL )
  19906. return( NULL );
  19907. original_len = len = n * size;
  19908. if( n != 0 && len / n != size )
  19909. return( NULL );
  19910. if( len % MBEDTLS_MEMORY_ALIGN_MULTIPLE )
  19911. {
  19912. len -= len % MBEDTLS_MEMORY_ALIGN_MULTIPLE;
  19913. len += MBEDTLS_MEMORY_ALIGN_MULTIPLE;
  19914. }
  19915. // Find block that fits
  19916. //
  19917. while( cur != NULL )
  19918. {
  19919. if( cur->size >= len )
  19920. break;
  19921. cur = cur->next_free;
  19922. }
  19923. if( cur == NULL )
  19924. return( NULL );
  19925. if( cur->alloc != 0 )
  19926. {
  19927. #if defined(MBEDTLS_MEMORY_DEBUG)
  19928. mbedtls_fprintf( stderr, "FATAL: block in free_list but allocated "
  19929. "data\n" );
  19930. #endif
  19931. mbedtls_exit( 1 );
  19932. }
  19933. #if defined(MBEDTLS_MEMORY_DEBUG)
  19934. heap.alloc_count++;
  19935. #endif
  19936. // Found location, split block if > memory_header + 4 room left
  19937. //
  19938. if( cur->size - len < sizeof(memory_header) +
  19939. MBEDTLS_MEMORY_ALIGN_MULTIPLE )
  19940. {
  19941. cur->alloc = 1;
  19942. // Remove from free_list
  19943. //
  19944. if( cur->prev_free != NULL )
  19945. cur->prev_free->next_free = cur->next_free;
  19946. else
  19947. heap.first_free = cur->next_free;
  19948. if( cur->next_free != NULL )
  19949. cur->next_free->prev_free = cur->prev_free;
  19950. cur->prev_free = NULL;
  19951. cur->next_free = NULL;
  19952. #if defined(MBEDTLS_MEMORY_DEBUG)
  19953. heap.total_used += cur->size;
  19954. if( heap.total_used > heap.maximum_used )
  19955. heap.maximum_used = heap.total_used;
  19956. #endif
  19957. #if defined(MBEDTLS_MEMORY_BACKTRACE)
  19958. trace_cnt = backtrace( trace_buffer, MAX_BT );
  19959. cur->trace = backtrace_symbols( trace_buffer, trace_cnt );
  19960. cur->trace_count = trace_cnt;
  19961. #endif
  19962. if( ( heap.verify & MBEDTLS_MEMORY_VERIFY_ALLOC ) && verify_chain() != 0 )
  19963. mbedtls_exit( 1 );
  19964. ret = (unsigned char *) cur + sizeof( memory_header );
  19965. memset( ret, 0, original_len );
  19966. return( ret );
  19967. }
  19968. p = ( (unsigned char *) cur ) + sizeof(memory_header) + len;
  19969. new = (memory_header *) p;
  19970. new->size = cur->size - len - sizeof(memory_header);
  19971. new->alloc = 0;
  19972. new->prev = cur;
  19973. new->next = cur->next;
  19974. #if defined(MBEDTLS_MEMORY_BACKTRACE)
  19975. new->trace = NULL;
  19976. new->trace_count = 0;
  19977. #endif
  19978. new->magic1 = MAGIC1;
  19979. new->magic2 = MAGIC2;
  19980. if( new->next != NULL )
  19981. new->next->prev = new;
  19982. // Replace cur with new in free_list
  19983. //
  19984. new->prev_free = cur->prev_free;
  19985. new->next_free = cur->next_free;
  19986. if( new->prev_free != NULL )
  19987. new->prev_free->next_free = new;
  19988. else
  19989. heap.first_free = new;
  19990. if( new->next_free != NULL )
  19991. new->next_free->prev_free = new;
  19992. cur->alloc = 1;
  19993. cur->size = len;
  19994. cur->next = new;
  19995. cur->prev_free = NULL;
  19996. cur->next_free = NULL;
  19997. #if defined(MBEDTLS_MEMORY_DEBUG)
  19998. heap.header_count++;
  19999. if( heap.header_count > heap.maximum_header_count )
  20000. heap.maximum_header_count = heap.header_count;
  20001. heap.total_used += cur->size;
  20002. if( heap.total_used > heap.maximum_used )
  20003. heap.maximum_used = heap.total_used;
  20004. #endif
  20005. #if defined(MBEDTLS_MEMORY_BACKTRACE)
  20006. trace_cnt = backtrace( trace_buffer, MAX_BT );
  20007. cur->trace = backtrace_symbols( trace_buffer, trace_cnt );
  20008. cur->trace_count = trace_cnt;
  20009. #endif
  20010. if( ( heap.verify & MBEDTLS_MEMORY_VERIFY_ALLOC ) && verify_chain() != 0 )
  20011. mbedtls_exit( 1 );
  20012. ret = (unsigned char *) cur + sizeof( memory_header );
  20013. memset( ret, 0, original_len );
  20014. return( ret );
  20015. }
  20016. static void buffer_alloc_free( void *ptr )
  20017. {
  20018. memory_header *hdr, *old = NULL;
  20019. unsigned char *p = (unsigned char *) ptr;
  20020. if( ptr == NULL || heap.buf == NULL || heap.first == NULL )
  20021. return;
  20022. if( p < heap.buf || p > heap.buf + heap.len )
  20023. {
  20024. #if defined(MBEDTLS_MEMORY_DEBUG)
  20025. mbedtls_fprintf( stderr, "FATAL: mbedtls_free() outside of managed "
  20026. "space\n" );
  20027. #endif
  20028. mbedtls_exit( 1 );
  20029. }
  20030. p -= sizeof(memory_header);
  20031. hdr = (memory_header *) p;
  20032. if( verify_header( hdr ) != 0 )
  20033. mbedtls_exit( 1 );
  20034. if( hdr->alloc != 1 )
  20035. {
  20036. #if defined(MBEDTLS_MEMORY_DEBUG)
  20037. mbedtls_fprintf( stderr, "FATAL: mbedtls_free() on unallocated "
  20038. "data\n" );
  20039. #endif
  20040. mbedtls_exit( 1 );
  20041. }
  20042. hdr->alloc = 0;
  20043. #if defined(MBEDTLS_MEMORY_DEBUG)
  20044. heap.free_count++;
  20045. heap.total_used -= hdr->size;
  20046. #endif
  20047. // Regroup with block before
  20048. //
  20049. if( hdr->prev != NULL && hdr->prev->alloc == 0 )
  20050. {
  20051. #if defined(MBEDTLS_MEMORY_DEBUG)
  20052. heap.header_count--;
  20053. #endif
  20054. hdr->prev->size += sizeof(memory_header) + hdr->size;
  20055. hdr->prev->next = hdr->next;
  20056. old = hdr;
  20057. hdr = hdr->prev;
  20058. if( hdr->next != NULL )
  20059. hdr->next->prev = hdr;
  20060. #if defined(MBEDTLS_MEMORY_BACKTRACE)
  20061. free( old->trace );
  20062. #endif
  20063. memset( old, 0, sizeof(memory_header) );
  20064. }
  20065. // Regroup with block after
  20066. //
  20067. if( hdr->next != NULL && hdr->next->alloc == 0 )
  20068. {
  20069. #if defined(MBEDTLS_MEMORY_DEBUG)
  20070. heap.header_count--;
  20071. #endif
  20072. hdr->size += sizeof(memory_header) + hdr->next->size;
  20073. old = hdr->next;
  20074. hdr->next = hdr->next->next;
  20075. if( hdr->prev_free != NULL || hdr->next_free != NULL )
  20076. {
  20077. if( hdr->prev_free != NULL )
  20078. hdr->prev_free->next_free = hdr->next_free;
  20079. else
  20080. heap.first_free = hdr->next_free;
  20081. if( hdr->next_free != NULL )
  20082. hdr->next_free->prev_free = hdr->prev_free;
  20083. }
  20084. hdr->prev_free = old->prev_free;
  20085. hdr->next_free = old->next_free;
  20086. if( hdr->prev_free != NULL )
  20087. hdr->prev_free->next_free = hdr;
  20088. else
  20089. heap.first_free = hdr;
  20090. if( hdr->next_free != NULL )
  20091. hdr->next_free->prev_free = hdr;
  20092. if( hdr->next != NULL )
  20093. hdr->next->prev = hdr;
  20094. #if defined(MBEDTLS_MEMORY_BACKTRACE)
  20095. free( old->trace );
  20096. #endif
  20097. memset( old, 0, sizeof(memory_header) );
  20098. }
  20099. // Prepend to free_list if we have not merged
  20100. // (Does not have to stay in same order as prev / next list)
  20101. //
  20102. if( old == NULL )
  20103. {
  20104. hdr->next_free = heap.first_free;
  20105. if( heap.first_free != NULL )
  20106. heap.first_free->prev_free = hdr;
  20107. heap.first_free = hdr;
  20108. }
  20109. #if defined(MBEDTLS_MEMORY_BACKTRACE)
  20110. hdr->trace = NULL;
  20111. hdr->trace_count = 0;
  20112. #endif
  20113. if( ( heap.verify & MBEDTLS_MEMORY_VERIFY_FREE ) && verify_chain() != 0 )
  20114. mbedtls_exit( 1 );
  20115. }
  20116. void mbedtls_memory_buffer_set_verify( int verify )
  20117. {
  20118. heap.verify = verify;
  20119. }
  20120. int mbedtls_memory_buffer_alloc_verify()
  20121. {
  20122. return verify_chain();
  20123. }
  20124. #if defined(MBEDTLS_MEMORY_DEBUG)
  20125. void mbedtls_memory_buffer_alloc_status()
  20126. {
  20127. mbedtls_fprintf( stderr,
  20128. "Current use: %zu blocks / %zu bytes, max: %zu blocks / "
  20129. "%zu bytes (total %zu bytes), alloc / free: %zu / %zu\n",
  20130. heap.header_count, heap.total_used,
  20131. heap.maximum_header_count, heap.maximum_used,
  20132. heap.maximum_header_count * sizeof( memory_header )
  20133. + heap.maximum_used,
  20134. heap.alloc_count, heap.free_count );
  20135. if( heap.first->next == NULL )
  20136. mbedtls_fprintf( stderr, "All memory de-allocated in stack buffer\n" );
  20137. else
  20138. {
  20139. mbedtls_fprintf( stderr, "Memory currently allocated:\n" );
  20140. debug_chain();
  20141. }
  20142. }
  20143. void mbedtls_memory_buffer_alloc_max_get( size_t *max_used, size_t *max_blocks )
  20144. {
  20145. *max_used = heap.maximum_used;
  20146. *max_blocks = heap.maximum_header_count;
  20147. }
  20148. void mbedtls_memory_buffer_alloc_max_reset( void )
  20149. {
  20150. heap.maximum_used = 0;
  20151. heap.maximum_header_count = 0;
  20152. }
  20153. void mbedtls_memory_buffer_alloc_cur_get( size_t *cur_used, size_t *cur_blocks )
  20154. {
  20155. *cur_used = heap.total_used;
  20156. *cur_blocks = heap.header_count;
  20157. }
  20158. #endif /* MBEDTLS_MEMORY_DEBUG */
  20159. #if defined(MBEDTLS_THREADING_C)
  20160. static void *buffer_alloc_calloc_mutexed( size_t n, size_t size )
  20161. {
  20162. void *buf;
  20163. if( mbedtls_mutex_lock( &heap.mutex ) != 0 )
  20164. return( NULL );
  20165. buf = buffer_alloc_calloc( n, size );
  20166. if( mbedtls_mutex_unlock( &heap.mutex ) )
  20167. return( NULL );
  20168. return( buf );
  20169. }
  20170. static void buffer_alloc_free_mutexed( void *ptr )
  20171. {
  20172. /* We have to good option here, but corrupting the heap seems
  20173. * worse than loosing memory. */
  20174. if( mbedtls_mutex_lock( &heap.mutex ) )
  20175. return;
  20176. buffer_alloc_free( ptr );
  20177. (void) mbedtls_mutex_unlock( &heap.mutex );
  20178. }
  20179. #endif /* MBEDTLS_THREADING_C */
  20180. void mbedtls_memory_buffer_alloc_init( unsigned char *buf, size_t len )
  20181. {
  20182. memset( &heap, 0, sizeof(buffer_alloc_ctx) );
  20183. memset( buf, 0, len );
  20184. #if defined(MBEDTLS_THREADING_C)
  20185. mbedtls_mutex_init( &heap.mutex );
  20186. mbedtls_platform_set_calloc_free( buffer_alloc_calloc_mutexed,
  20187. buffer_alloc_free_mutexed );
  20188. #else
  20189. mbedtls_platform_set_calloc_free( buffer_alloc_calloc, buffer_alloc_free );
  20190. #endif
  20191. if( (size_t) buf % MBEDTLS_MEMORY_ALIGN_MULTIPLE )
  20192. {
  20193. /* Adjust len first since buf is used in the computation */
  20194. len -= MBEDTLS_MEMORY_ALIGN_MULTIPLE
  20195. - (size_t) buf % MBEDTLS_MEMORY_ALIGN_MULTIPLE;
  20196. buf += MBEDTLS_MEMORY_ALIGN_MULTIPLE
  20197. - (size_t) buf % MBEDTLS_MEMORY_ALIGN_MULTIPLE;
  20198. }
  20199. heap.buf = buf;
  20200. heap.len = len;
  20201. heap.first = (memory_header *) buf;
  20202. heap.first->size = len - sizeof(memory_header);
  20203. heap.first->magic1 = MAGIC1;
  20204. heap.first->magic2 = MAGIC2;
  20205. heap.first_free = heap.first;
  20206. }
  20207. void mbedtls_memory_buffer_alloc_free()
  20208. {
  20209. #if defined(MBEDTLS_THREADING_C)
  20210. mbedtls_mutex_free( &heap.mutex );
  20211. #endif
  20212. memory_zeroize( &heap, sizeof(buffer_alloc_ctx) );
  20213. }
  20214. #if defined(MBEDTLS_SELF_TEST)
  20215. static int check_pointer( void *p )
  20216. {
  20217. if( p == NULL )
  20218. return( -1 );
  20219. if( (size_t) p % MBEDTLS_MEMORY_ALIGN_MULTIPLE != 0 )
  20220. return( -1 );
  20221. return( 0 );
  20222. }
  20223. static int check_all_free( )
  20224. {
  20225. if(
  20226. #if defined(MBEDTLS_MEMORY_DEBUG)
  20227. heap.total_used != 0 ||
  20228. #endif
  20229. heap.first != heap.first_free ||
  20230. (void *) heap.first != (void *) heap.buf )
  20231. {
  20232. return( -1 );
  20233. }
  20234. return( 0 );
  20235. }
  20236. #define TEST_ASSERT( condition ) \
  20237. if( ! (condition) ) \
  20238. { \
  20239. if( verbose != 0 ) \
  20240. mbedtls_printf( "failed\n" ); \
  20241. \
  20242. ret = 1; \
  20243. goto cleanup; \
  20244. }
  20245. int mbedtls_memory_buffer_alloc_self_test( int verbose )
  20246. {
  20247. unsigned char buf[1024];
  20248. unsigned char *p, *q, *r, *end;
  20249. int ret = 0;
  20250. if( verbose != 0 )
  20251. mbedtls_printf( " MBA test #1 (basic alloc-free cycle): " );
  20252. mbedtls_memory_buffer_alloc_init( buf, sizeof( buf ) );
  20253. p = mbedtls_calloc( 1, 1 );
  20254. q = mbedtls_calloc( 1, 128 );
  20255. r = mbedtls_calloc( 1, 16 );
  20256. TEST_ASSERT( check_pointer( p ) == 0 &&
  20257. check_pointer( q ) == 0 &&
  20258. check_pointer( r ) == 0 );
  20259. mbedtls_free( r );
  20260. mbedtls_free( q );
  20261. mbedtls_free( p );
  20262. TEST_ASSERT( check_all_free( ) == 0 );
  20263. /* Memorize end to compare with the next test */
  20264. end = heap.buf + heap.len;
  20265. mbedtls_memory_buffer_alloc_free( );
  20266. if( verbose != 0 )
  20267. mbedtls_printf( "passed\n" );
  20268. if( verbose != 0 )
  20269. mbedtls_printf( " MBA test #2 (buf not aligned): " );
  20270. mbedtls_memory_buffer_alloc_init( buf + 1, sizeof( buf ) - 1 );
  20271. TEST_ASSERT( heap.buf + heap.len == end );
  20272. p = mbedtls_calloc( 1, 1 );
  20273. q = mbedtls_calloc( 1, 128 );
  20274. r = mbedtls_calloc( 1, 16 );
  20275. TEST_ASSERT( check_pointer( p ) == 0 &&
  20276. check_pointer( q ) == 0 &&
  20277. check_pointer( r ) == 0 );
  20278. mbedtls_free( r );
  20279. mbedtls_free( q );
  20280. mbedtls_free( p );
  20281. TEST_ASSERT( check_all_free( ) == 0 );
  20282. mbedtls_memory_buffer_alloc_free( );
  20283. if( verbose != 0 )
  20284. mbedtls_printf( "passed\n" );
  20285. if( verbose != 0 )
  20286. mbedtls_printf( " MBA test #3 (full): " );
  20287. mbedtls_memory_buffer_alloc_init( buf, sizeof( buf ) );
  20288. p = mbedtls_calloc( 1, sizeof( buf ) - sizeof( memory_header ) );
  20289. TEST_ASSERT( check_pointer( p ) == 0 );
  20290. TEST_ASSERT( mbedtls_calloc( 1, 1 ) == NULL );
  20291. mbedtls_free( p );
  20292. p = mbedtls_calloc( 1, sizeof( buf ) - 2 * sizeof( memory_header ) - 16 );
  20293. q = mbedtls_calloc( 1, 16 );
  20294. TEST_ASSERT( check_pointer( p ) == 0 && check_pointer( q ) == 0 );
  20295. TEST_ASSERT( mbedtls_calloc( 1, 1 ) == NULL );
  20296. mbedtls_free( q );
  20297. TEST_ASSERT( mbedtls_calloc( 1, 17 ) == NULL );
  20298. mbedtls_free( p );
  20299. TEST_ASSERT( check_all_free( ) == 0 );
  20300. mbedtls_memory_buffer_alloc_free( );
  20301. if( verbose != 0 )
  20302. mbedtls_printf( "passed\n" );
  20303. cleanup:
  20304. mbedtls_memory_buffer_alloc_free( );
  20305. return( ret );
  20306. }
  20307. #endif /* MBEDTLS_SELF_TEST */
  20308. #endif /* MBEDTLS_MEMORY_BUFFER_ALLOC_C */
  20309. /********* Start of file library/net.c ************/
  20310. /*
  20311. * TCP/IP or UDP/IP networking functions
  20312. *
  20313. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  20314. * SPDX-License-Identifier: Apache-2.0
  20315. *
  20316. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  20317. * not use this file except in compliance with the License.
  20318. * You may obtain a copy of the License at
  20319. *
  20320. * http://www.apache.org/licenses/LICENSE-2.0
  20321. *
  20322. * Unless required by applicable law or agreed to in writing, software
  20323. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  20324. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  20325. * See the License for the specific language governing permissions and
  20326. * limitations under the License.
  20327. *
  20328. * This file is part of mbed TLS (https://tls.mbed.org)
  20329. */
  20330. #if !defined(MBEDTLS_CONFIG_FILE)
  20331. #else
  20332. #endif
  20333. #if defined(MBEDTLS_NET_C)
  20334. #include <string.h>
  20335. #if (defined(_WIN32) || defined(_WIN32_WCE)) && !defined(EFIX64) && \
  20336. !defined(EFI32)
  20337. #ifdef _WIN32_WINNT
  20338. #undef _WIN32_WINNT
  20339. #endif
  20340. /* Enables getaddrinfo() & Co */
  20341. #define _WIN32_WINNT 0x0501
  20342. #include <ws2tcpip.h>
  20343. #include <winsock2.h>
  20344. #include <windows.h>
  20345. #if defined(_MSC_VER)
  20346. #if defined(_WIN32_WCE)
  20347. #pragma comment( lib, "ws2.lib" )
  20348. #else
  20349. #pragma comment( lib, "ws2_32.lib" )
  20350. #endif
  20351. #endif /* _MSC_VER */
  20352. /* Amalgamated Release Mappings */
  20353. #undef read
  20354. #undef write
  20355. #undef close
  20356. #define read(fd,buf,len) recv(fd,(char*)buf,(int) len,0)
  20357. #define write(fd,buf,len) send(fd,(char*)buf,(int) len,0)
  20358. #define close(fd) closesocket(fd)
  20359. static int wsa_init_done = 0;
  20360. #else /* ( _WIN32 || _WIN32_WCE ) && !EFIX64 && !EFI32 */
  20361. #include <sys/types.h>
  20362. #include <sys/socket.h>
  20363. #include <netinet/in.h>
  20364. #include <arpa/inet.h>
  20365. #if !VXWORKS
  20366. #include <sys/time.h>
  20367. #endif
  20368. #include <unistd.h>
  20369. #include <signal.h>
  20370. #include <fcntl.h>
  20371. #include <netdb.h>
  20372. #include <errno.h>
  20373. #endif /* ( _WIN32 || _WIN32_WCE ) && !EFIX64 && !EFI32 */
  20374. /* Some MS functions want int and MSVC warns if we pass size_t,
  20375. * but the standard fucntions use socklen_t, so cast only for MSVC */
  20376. #if defined(_MSC_VER)
  20377. #define MSVC_INT_CAST (int)
  20378. #else
  20379. #define MSVC_INT_CAST
  20380. #endif
  20381. #include <stdlib.h>
  20382. #include <stdio.h>
  20383. #include <time.h>
  20384. #if !VXWORKS
  20385. #include <stdint.h>
  20386. #endif
  20387. /*
  20388. * Prepare for using the sockets interface
  20389. */
  20390. static int net_prepare( void )
  20391. {
  20392. #if ( defined(_WIN32) || defined(_WIN32_WCE) ) && !defined(EFIX64) && \
  20393. !defined(EFI32)
  20394. WSADATA wsaData;
  20395. if( wsa_init_done == 0 )
  20396. {
  20397. if( WSAStartup( MAKEWORD(2,0), &wsaData ) != 0 )
  20398. return( MBEDTLS_ERR_NET_SOCKET_FAILED );
  20399. wsa_init_done = 1;
  20400. }
  20401. #else
  20402. #if !defined(EFIX64) && !defined(EFI32)
  20403. signal( SIGPIPE, SIG_IGN );
  20404. #endif
  20405. #endif
  20406. return( 0 );
  20407. }
  20408. /*
  20409. * Initialize a context
  20410. */
  20411. void mbedtls_net_init( mbedtls_net_context *ctx )
  20412. {
  20413. ctx->fd = -1;
  20414. }
  20415. /*
  20416. * Initiate a TCP connection with host:port and the given protocol
  20417. */
  20418. int mbedtls_net_connect( mbedtls_net_context *ctx, const char *host, const char *port, int proto )
  20419. {
  20420. int ret;
  20421. struct addrinfo hints, *addr_list, *cur;
  20422. if( ( ret = net_prepare() ) != 0 )
  20423. return( ret );
  20424. /* Do name resolution with both IPv6 and IPv4 */
  20425. memset( &hints, 0, sizeof( hints ) );
  20426. hints.ai_family = AF_UNSPEC;
  20427. hints.ai_socktype = proto == MBEDTLS_NET_PROTO_UDP ? SOCK_DGRAM : SOCK_STREAM;
  20428. hints.ai_protocol = proto == MBEDTLS_NET_PROTO_UDP ? IPPROTO_UDP : IPPROTO_TCP;
  20429. if( getaddrinfo( host, port, &hints, &addr_list ) != 0 )
  20430. return( MBEDTLS_ERR_NET_UNKNOWN_HOST );
  20431. /* Try the sockaddrs until a connection succeeds */
  20432. ret = MBEDTLS_ERR_NET_UNKNOWN_HOST;
  20433. for( cur = addr_list; cur != NULL; cur = cur->ai_next )
  20434. {
  20435. ctx->fd = (int) socket( cur->ai_family, cur->ai_socktype,
  20436. cur->ai_protocol );
  20437. if( ctx->fd < 0 )
  20438. {
  20439. ret = MBEDTLS_ERR_NET_SOCKET_FAILED;
  20440. continue;
  20441. }
  20442. if( connect( ctx->fd, cur->ai_addr, MSVC_INT_CAST cur->ai_addrlen ) == 0 )
  20443. {
  20444. ret = 0;
  20445. break;
  20446. }
  20447. close( ctx->fd );
  20448. ret = MBEDTLS_ERR_NET_CONNECT_FAILED;
  20449. }
  20450. freeaddrinfo( addr_list );
  20451. return( ret );
  20452. }
  20453. /*
  20454. * Create a listening socket on bind_ip:port
  20455. */
  20456. int mbedtls_net_bind( mbedtls_net_context *ctx, const char *bind_ip, const char *port, int proto )
  20457. {
  20458. int n, ret;
  20459. struct addrinfo hints, *addr_list, *cur;
  20460. if( ( ret = net_prepare() ) != 0 )
  20461. return( ret );
  20462. /* Bind to IPv6 and/or IPv4, but only in the desired protocol */
  20463. memset( &hints, 0, sizeof( hints ) );
  20464. hints.ai_family = AF_UNSPEC;
  20465. hints.ai_socktype = proto == MBEDTLS_NET_PROTO_UDP ? SOCK_DGRAM : SOCK_STREAM;
  20466. hints.ai_protocol = proto == MBEDTLS_NET_PROTO_UDP ? IPPROTO_UDP : IPPROTO_TCP;
  20467. if( bind_ip == NULL )
  20468. hints.ai_flags = AI_PASSIVE;
  20469. if( getaddrinfo( bind_ip, port, &hints, &addr_list ) != 0 )
  20470. return( MBEDTLS_ERR_NET_UNKNOWN_HOST );
  20471. /* Try the sockaddrs until a binding succeeds */
  20472. ret = MBEDTLS_ERR_NET_UNKNOWN_HOST;
  20473. for( cur = addr_list; cur != NULL; cur = cur->ai_next )
  20474. {
  20475. ctx->fd = (int) socket( cur->ai_family, cur->ai_socktype,
  20476. cur->ai_protocol );
  20477. if( ctx->fd < 0 )
  20478. {
  20479. ret = MBEDTLS_ERR_NET_SOCKET_FAILED;
  20480. continue;
  20481. }
  20482. n = 1;
  20483. if( setsockopt( ctx->fd, SOL_SOCKET, SO_REUSEADDR,
  20484. #if VXWORKS
  20485. (char *) &n, sizeof( n ) ) != 0 )
  20486. #else
  20487. (const char *) &n, sizeof( n ) ) != 0 )
  20488. #endif
  20489. {
  20490. close( ctx->fd );
  20491. ret = MBEDTLS_ERR_NET_SOCKET_FAILED;
  20492. continue;
  20493. }
  20494. if( bind( ctx->fd, cur->ai_addr, MSVC_INT_CAST cur->ai_addrlen ) != 0 )
  20495. {
  20496. close( ctx->fd );
  20497. ret = MBEDTLS_ERR_NET_BIND_FAILED;
  20498. continue;
  20499. }
  20500. /* Listen only makes sense for TCP */
  20501. if( proto == MBEDTLS_NET_PROTO_TCP )
  20502. {
  20503. if( listen( ctx->fd, MBEDTLS_NET_LISTEN_BACKLOG ) != 0 )
  20504. {
  20505. close( ctx->fd );
  20506. ret = MBEDTLS_ERR_NET_LISTEN_FAILED;
  20507. continue;
  20508. }
  20509. }
  20510. /* I we ever get there, it's a success */
  20511. ret = 0;
  20512. break;
  20513. }
  20514. freeaddrinfo( addr_list );
  20515. return( ret );
  20516. }
  20517. #if ( defined(_WIN32) || defined(_WIN32_WCE) ) && !defined(EFIX64) && \
  20518. !defined(EFI32)
  20519. /*
  20520. * Check if the requested operation would be blocking on a non-blocking socket
  20521. * and thus 'failed' with a negative return value.
  20522. */
  20523. static int net_would_block( const mbedtls_net_context *ctx )
  20524. {
  20525. ((void) ctx);
  20526. return( WSAGetLastError() == WSAEWOULDBLOCK );
  20527. }
  20528. #else
  20529. /*
  20530. * Check if the requested operation would be blocking on a non-blocking socket
  20531. * and thus 'failed' with a negative return value.
  20532. *
  20533. * Note: on a blocking socket this function always returns 0!
  20534. */
  20535. static int net_would_block( const mbedtls_net_context *ctx )
  20536. {
  20537. /*
  20538. * Never return 'WOULD BLOCK' on a non-blocking socket
  20539. */
  20540. if( ( fcntl( ctx->fd, F_GETFL ) & O_NONBLOCK ) != O_NONBLOCK )
  20541. return( 0 );
  20542. switch( errno )
  20543. {
  20544. #if defined EAGAIN
  20545. case EAGAIN:
  20546. #endif
  20547. #if defined EWOULDBLOCK && EWOULDBLOCK != EAGAIN
  20548. case EWOULDBLOCK:
  20549. #endif
  20550. return( 1 );
  20551. }
  20552. return( 0 );
  20553. }
  20554. #endif /* ( _WIN32 || _WIN32_WCE ) && !EFIX64 && !EFI32 */
  20555. /*
  20556. * Accept a connection from a remote client
  20557. */
  20558. int mbedtls_net_accept( mbedtls_net_context *bind_ctx,
  20559. mbedtls_net_context *client_ctx,
  20560. void *client_ip, size_t buf_size, size_t *ip_len )
  20561. {
  20562. int ret;
  20563. int type;
  20564. struct sockaddr_storage client_addr;
  20565. #if defined(__socklen_t_defined) || defined(_SOCKLEN_T) || \
  20566. defined(_SOCKLEN_T_DECLARED) || defined(__DEFINED_socklen_t)
  20567. socklen_t n = (socklen_t) sizeof( client_addr );
  20568. socklen_t type_len = (socklen_t) sizeof( type );
  20569. #else
  20570. int n = (int) sizeof( client_addr );
  20571. int type_len = (int) sizeof( type );
  20572. #endif
  20573. /* Is this a TCP or UDP socket? */
  20574. if( getsockopt( bind_ctx->fd, SOL_SOCKET, SO_TYPE,
  20575. (void *) &type, &type_len ) != 0 ||
  20576. ( type != SOCK_STREAM && type != SOCK_DGRAM ) )
  20577. {
  20578. return( MBEDTLS_ERR_NET_ACCEPT_FAILED );
  20579. }
  20580. if( type == SOCK_STREAM )
  20581. {
  20582. /* TCP: actual accept() */
  20583. ret = client_ctx->fd = (int) accept( bind_ctx->fd,
  20584. (struct sockaddr *) &client_addr, &n );
  20585. }
  20586. else
  20587. {
  20588. /* UDP: wait for a message, but keep it in the queue */
  20589. char buf[1] = { 0 };
  20590. ret = (int) recvfrom( bind_ctx->fd, buf, sizeof( buf ), MSG_PEEK,
  20591. (struct sockaddr *) &client_addr, &n );
  20592. #if defined(_WIN32)
  20593. if( ret == SOCKET_ERROR &&
  20594. WSAGetLastError() == WSAEMSGSIZE )
  20595. {
  20596. /* We know buf is too small, thanks, just peeking here */
  20597. ret = 0;
  20598. }
  20599. #endif
  20600. }
  20601. if( ret < 0 )
  20602. {
  20603. if( net_would_block( bind_ctx ) != 0 )
  20604. return( MBEDTLS_ERR_SSL_WANT_READ );
  20605. return( MBEDTLS_ERR_NET_ACCEPT_FAILED );
  20606. }
  20607. /* UDP: hijack the listening socket to communicate with the client,
  20608. * then bind a new socket to accept new connections */
  20609. if( type != SOCK_STREAM )
  20610. {
  20611. struct sockaddr_storage local_addr;
  20612. int one = 1;
  20613. if( connect( bind_ctx->fd, (struct sockaddr *) &client_addr, n ) != 0 )
  20614. return( MBEDTLS_ERR_NET_ACCEPT_FAILED );
  20615. client_ctx->fd = bind_ctx->fd;
  20616. bind_ctx->fd = -1; /* In case we exit early */
  20617. n = sizeof( struct sockaddr_storage );
  20618. if( getsockname( client_ctx->fd,
  20619. (struct sockaddr *) &local_addr, &n ) != 0 ||
  20620. ( bind_ctx->fd = (int) socket( local_addr.ss_family,
  20621. SOCK_DGRAM, IPPROTO_UDP ) ) < 0 ||
  20622. #if VXWORKS
  20623. setsockopt( bind_ctx->fd, SOL_SOCKET, SO_REUSEADDR,
  20624. (char *) &one, sizeof( one ) ) != 0 )
  20625. #else
  20626. setsockopt( bind_ctx->fd, SOL_SOCKET, SO_REUSEADDR,
  20627. (const char *) &one, sizeof( one ) ) != 0 )
  20628. #endif
  20629. {
  20630. return( MBEDTLS_ERR_NET_SOCKET_FAILED );
  20631. }
  20632. if( bind( bind_ctx->fd, (struct sockaddr *) &local_addr, n ) != 0 )
  20633. {
  20634. return( MBEDTLS_ERR_NET_BIND_FAILED );
  20635. }
  20636. }
  20637. if( client_ip != NULL )
  20638. {
  20639. if( client_addr.ss_family == AF_INET )
  20640. {
  20641. struct sockaddr_in *addr4 = (struct sockaddr_in *) &client_addr;
  20642. *ip_len = sizeof( addr4->sin_addr.s_addr );
  20643. if( buf_size < *ip_len )
  20644. return( MBEDTLS_ERR_NET_BUFFER_TOO_SMALL );
  20645. memcpy( client_ip, &addr4->sin_addr.s_addr, *ip_len );
  20646. }
  20647. else
  20648. {
  20649. struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *) &client_addr;
  20650. *ip_len = sizeof( addr6->sin6_addr.s6_addr );
  20651. if( buf_size < *ip_len )
  20652. return( MBEDTLS_ERR_NET_BUFFER_TOO_SMALL );
  20653. memcpy( client_ip, &addr6->sin6_addr.s6_addr, *ip_len);
  20654. }
  20655. }
  20656. return( 0 );
  20657. }
  20658. /*
  20659. * Set the socket blocking or non-blocking
  20660. */
  20661. int mbedtls_net_set_block( mbedtls_net_context *ctx )
  20662. {
  20663. #if ( defined(_WIN32) || defined(_WIN32_WCE) ) && !defined(EFIX64) && \
  20664. !defined(EFI32)
  20665. u_long n = 0;
  20666. return( ioctlsocket( ctx->fd, FIONBIO, &n ) );
  20667. #else
  20668. return( fcntl( ctx->fd, F_SETFL, fcntl( ctx->fd, F_GETFL ) & ~O_NONBLOCK ) );
  20669. #endif
  20670. }
  20671. int mbedtls_net_set_nonblock( mbedtls_net_context *ctx )
  20672. {
  20673. #if ( defined(_WIN32) || defined(_WIN32_WCE) ) && !defined(EFIX64) && \
  20674. !defined(EFI32)
  20675. u_long n = 1;
  20676. return( ioctlsocket( ctx->fd, FIONBIO, &n ) );
  20677. #else
  20678. return( fcntl( ctx->fd, F_SETFL, fcntl( ctx->fd, F_GETFL ) | O_NONBLOCK ) );
  20679. #endif
  20680. }
  20681. /*
  20682. * Portable usleep helper
  20683. */
  20684. void mbedtls_net_usleep( unsigned long usec )
  20685. {
  20686. #if defined(_WIN32)
  20687. Sleep( ( usec + 999 ) / 1000 );
  20688. #else
  20689. struct timeval tv;
  20690. tv.tv_sec = usec / 1000000;
  20691. #if defined(__unix__) || defined(__unix) || \
  20692. ( defined(__APPLE__) && defined(__MACH__) )
  20693. tv.tv_usec = (suseconds_t) usec % 1000000;
  20694. #else
  20695. tv.tv_usec = usec % 1000000;
  20696. #endif
  20697. select( 0, NULL, NULL, NULL, &tv );
  20698. #endif
  20699. }
  20700. /*
  20701. * Read at most 'len' characters
  20702. */
  20703. int mbedtls_net_recv( void *ctx, unsigned char *buf, size_t len )
  20704. {
  20705. int ret;
  20706. int fd = ((mbedtls_net_context *) ctx)->fd;
  20707. if( fd < 0 )
  20708. return( MBEDTLS_ERR_NET_INVALID_CONTEXT );
  20709. ret = (int) read( fd, buf, len );
  20710. if( ret < 0 )
  20711. {
  20712. if( net_would_block( ctx ) != 0 )
  20713. return( MBEDTLS_ERR_SSL_WANT_READ );
  20714. #if ( defined(_WIN32) || defined(_WIN32_WCE) ) && !defined(EFIX64) && \
  20715. !defined(EFI32)
  20716. if( WSAGetLastError() == WSAECONNRESET )
  20717. return( MBEDTLS_ERR_NET_CONN_RESET );
  20718. #else
  20719. if( errno == EPIPE || errno == ECONNRESET )
  20720. return( MBEDTLS_ERR_NET_CONN_RESET );
  20721. if( errno == EINTR )
  20722. return( MBEDTLS_ERR_SSL_WANT_READ );
  20723. #endif
  20724. return( MBEDTLS_ERR_NET_RECV_FAILED );
  20725. }
  20726. return( ret );
  20727. }
  20728. /*
  20729. * Read at most 'len' characters, blocking for at most 'timeout' ms
  20730. */
  20731. int mbedtls_net_recv_timeout( void *ctx, unsigned char *buf, size_t len,
  20732. uint32_t timeout )
  20733. {
  20734. int ret;
  20735. struct timeval tv;
  20736. fd_set read_fds;
  20737. int fd = ((mbedtls_net_context *) ctx)->fd;
  20738. if( fd < 0 )
  20739. return( MBEDTLS_ERR_NET_INVALID_CONTEXT );
  20740. FD_ZERO( &read_fds );
  20741. FD_SET( fd, &read_fds );
  20742. tv.tv_sec = timeout / 1000;
  20743. tv.tv_usec = ( timeout % 1000 ) * 1000;
  20744. ret = select( fd + 1, &read_fds, NULL, NULL, timeout == 0 ? NULL : &tv );
  20745. /* Zero fds ready means we timed out */
  20746. if( ret == 0 )
  20747. return( MBEDTLS_ERR_SSL_TIMEOUT );
  20748. if( ret < 0 )
  20749. {
  20750. #if ( defined(_WIN32) || defined(_WIN32_WCE) ) && !defined(EFIX64) && \
  20751. !defined(EFI32)
  20752. if( WSAGetLastError() == WSAEINTR )
  20753. return( MBEDTLS_ERR_SSL_WANT_READ );
  20754. #else
  20755. if( errno == EINTR )
  20756. return( MBEDTLS_ERR_SSL_WANT_READ );
  20757. #endif
  20758. return( MBEDTLS_ERR_NET_RECV_FAILED );
  20759. }
  20760. /* This call will not block */
  20761. return( mbedtls_net_recv( ctx, buf, len ) );
  20762. }
  20763. /*
  20764. * Write at most 'len' characters
  20765. */
  20766. int mbedtls_net_send( void *ctx, const unsigned char *buf, size_t len )
  20767. {
  20768. int ret;
  20769. int fd = ((mbedtls_net_context *) ctx)->fd;
  20770. if( fd < 0 )
  20771. return( MBEDTLS_ERR_NET_INVALID_CONTEXT );
  20772. #if VXWORKS
  20773. ret = (int) write( fd, (char*) buf, len );
  20774. #else
  20775. ret = (int) write( fd, buf, len );
  20776. #endif
  20777. if( ret < 0 )
  20778. {
  20779. if( net_would_block( ctx ) != 0 )
  20780. return( MBEDTLS_ERR_SSL_WANT_WRITE );
  20781. #if ( defined(_WIN32) || defined(_WIN32_WCE) ) && !defined(EFIX64) && \
  20782. !defined(EFI32)
  20783. if( WSAGetLastError() == WSAECONNRESET )
  20784. return( MBEDTLS_ERR_NET_CONN_RESET );
  20785. #else
  20786. if( errno == EPIPE || errno == ECONNRESET )
  20787. return( MBEDTLS_ERR_NET_CONN_RESET );
  20788. if( errno == EINTR )
  20789. return( MBEDTLS_ERR_SSL_WANT_WRITE );
  20790. #endif
  20791. return( MBEDTLS_ERR_NET_SEND_FAILED );
  20792. }
  20793. return( ret );
  20794. }
  20795. /*
  20796. * Gracefully close the connection
  20797. */
  20798. void mbedtls_net_free( mbedtls_net_context *ctx )
  20799. {
  20800. if( ctx->fd == -1 )
  20801. return;
  20802. shutdown( ctx->fd, 2 );
  20803. close( ctx->fd );
  20804. ctx->fd = -1;
  20805. }
  20806. #if (defined(_WIN32) || defined(_WIN32_WCE)) && !defined(EFIX64) && !defined(EFI32)
  20807. /* Amalgamated Release Mappings */
  20808. #undef read
  20809. #undef write
  20810. #undef close
  20811. #define read _read
  20812. #define write _write
  20813. #define close _close
  20814. #endif
  20815. #endif /* MBEDTLS_NET_C */
  20816. /********* Start of file library/oid.c ************/
  20817. /**
  20818. * \file oid.c
  20819. *
  20820. * \brief Object Identifier (OID) database
  20821. *
  20822. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  20823. * SPDX-License-Identifier: Apache-2.0
  20824. *
  20825. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  20826. * not use this file except in compliance with the License.
  20827. * You may obtain a copy of the License at
  20828. *
  20829. * http://www.apache.org/licenses/LICENSE-2.0
  20830. *
  20831. * Unless required by applicable law or agreed to in writing, software
  20832. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  20833. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  20834. * See the License for the specific language governing permissions and
  20835. * limitations under the License.
  20836. *
  20837. * This file is part of mbed TLS (https://tls.mbed.org)
  20838. */
  20839. #if !defined(MBEDTLS_CONFIG_FILE)
  20840. #else
  20841. #endif
  20842. #if defined(MBEDTLS_OID_C)
  20843. #include <stdio.h>
  20844. #include <string.h>
  20845. #if defined(MBEDTLS_PLATFORM_C)
  20846. #else
  20847. #define mbedtls_snprintf snprintf
  20848. #endif
  20849. #if defined(MBEDTLS_X509_USE_C) || defined(MBEDTLS_X509_CREATE_C)
  20850. #endif
  20851. /*
  20852. * Macro to automatically add the size of #define'd OIDs
  20853. */
  20854. #define ADD_LEN(s) s, MBEDTLS_OID_SIZE(s)
  20855. /*
  20856. * Macro to generate an internal function for oid_XXX_from_asn1() (used by
  20857. * the other functions)
  20858. */
  20859. #define FN_OID_TYPED_FROM_ASN1( TYPE_T, NAME, LIST ) \
  20860. static const TYPE_T * oid_ ## NAME ## _from_asn1( const mbedtls_asn1_buf *oid ) \
  20861. { \
  20862. const TYPE_T *p = LIST; \
  20863. const mbedtls_oid_descriptor_t *cur = (const mbedtls_oid_descriptor_t *) p; \
  20864. if( p == NULL || oid == NULL ) return( NULL ); \
  20865. while( cur->asn1 != NULL ) { \
  20866. if( cur->asn1_len == oid->len && \
  20867. memcmp( cur->asn1, oid->p, oid->len ) == 0 ) { \
  20868. return( p ); \
  20869. } \
  20870. p++; \
  20871. cur = (const mbedtls_oid_descriptor_t *) p; \
  20872. } \
  20873. return( NULL ); \
  20874. }
  20875. /*
  20876. * Macro to generate a function for retrieving a single attribute from the
  20877. * descriptor of an mbedtls_oid_descriptor_t wrapper.
  20878. */
  20879. #define FN_OID_GET_DESCRIPTOR_ATTR1(FN_NAME, TYPE_T, TYPE_NAME, ATTR1_TYPE, ATTR1) \
  20880. int FN_NAME( const mbedtls_asn1_buf *oid, ATTR1_TYPE * ATTR1 ) \
  20881. { \
  20882. const TYPE_T *data = oid_ ## TYPE_NAME ## _from_asn1( oid ); \
  20883. if( data == NULL ) return( MBEDTLS_ERR_OID_NOT_FOUND ); \
  20884. *ATTR1 = data->descriptor.ATTR1; \
  20885. return( 0 ); \
  20886. }
  20887. /*
  20888. * Macro to generate a function for retrieving a single attribute from an
  20889. * mbedtls_oid_descriptor_t wrapper.
  20890. */
  20891. #define FN_OID_GET_ATTR1(FN_NAME, TYPE_T, TYPE_NAME, ATTR1_TYPE, ATTR1) \
  20892. int FN_NAME( const mbedtls_asn1_buf *oid, ATTR1_TYPE * ATTR1 ) \
  20893. { \
  20894. const TYPE_T *data = oid_ ## TYPE_NAME ## _from_asn1( oid ); \
  20895. if( data == NULL ) return( MBEDTLS_ERR_OID_NOT_FOUND ); \
  20896. *ATTR1 = data->ATTR1; \
  20897. return( 0 ); \
  20898. }
  20899. /*
  20900. * Macro to generate a function for retrieving two attributes from an
  20901. * mbedtls_oid_descriptor_t wrapper.
  20902. */
  20903. #define FN_OID_GET_ATTR2(FN_NAME, TYPE_T, TYPE_NAME, ATTR1_TYPE, ATTR1, \
  20904. ATTR2_TYPE, ATTR2) \
  20905. int FN_NAME( const mbedtls_asn1_buf *oid, ATTR1_TYPE * ATTR1, ATTR2_TYPE * ATTR2 ) \
  20906. { \
  20907. const TYPE_T *data = oid_ ## TYPE_NAME ## _from_asn1( oid ); \
  20908. if( data == NULL ) return( MBEDTLS_ERR_OID_NOT_FOUND ); \
  20909. *ATTR1 = data->ATTR1; \
  20910. *ATTR2 = data->ATTR2; \
  20911. return( 0 ); \
  20912. }
  20913. /*
  20914. * Macro to generate a function for retrieving the OID based on a single
  20915. * attribute from a mbedtls_oid_descriptor_t wrapper.
  20916. */
  20917. #define FN_OID_GET_OID_BY_ATTR1(FN_NAME, TYPE_T, LIST, ATTR1_TYPE, ATTR1) \
  20918. int FN_NAME( ATTR1_TYPE ATTR1, const char **oid, size_t *olen ) \
  20919. { \
  20920. const TYPE_T *cur = LIST; \
  20921. while( cur->descriptor.asn1 != NULL ) { \
  20922. if( cur->ATTR1 == ATTR1 ) { \
  20923. *oid = cur->descriptor.asn1; \
  20924. *olen = cur->descriptor.asn1_len; \
  20925. return( 0 ); \
  20926. } \
  20927. cur++; \
  20928. } \
  20929. return( MBEDTLS_ERR_OID_NOT_FOUND ); \
  20930. }
  20931. /*
  20932. * Macro to generate a function for retrieving the OID based on two
  20933. * attributes from a mbedtls_oid_descriptor_t wrapper.
  20934. */
  20935. #define FN_OID_GET_OID_BY_ATTR2(FN_NAME, TYPE_T, LIST, ATTR1_TYPE, ATTR1, \
  20936. ATTR2_TYPE, ATTR2) \
  20937. int FN_NAME( ATTR1_TYPE ATTR1, ATTR2_TYPE ATTR2, const char **oid , \
  20938. size_t *olen ) \
  20939. { \
  20940. const TYPE_T *cur = LIST; \
  20941. while( cur->descriptor.asn1 != NULL ) { \
  20942. if( cur->ATTR1 == ATTR1 && cur->ATTR2 == ATTR2 ) { \
  20943. *oid = cur->descriptor.asn1; \
  20944. *olen = cur->descriptor.asn1_len; \
  20945. return( 0 ); \
  20946. } \
  20947. cur++; \
  20948. } \
  20949. return( MBEDTLS_ERR_OID_NOT_FOUND ); \
  20950. }
  20951. /*
  20952. * For X520 attribute types
  20953. */
  20954. typedef struct {
  20955. mbedtls_oid_descriptor_t descriptor;
  20956. const char *short_name;
  20957. } oid_x520_attr_t;
  20958. static const oid_x520_attr_t oid_x520_attr_type[] =
  20959. {
  20960. {
  20961. { ADD_LEN( MBEDTLS_OID_AT_CN ), "id-at-commonName", "Common Name" },
  20962. "CN",
  20963. },
  20964. {
  20965. { ADD_LEN( MBEDTLS_OID_AT_COUNTRY ), "id-at-countryName", "Country" },
  20966. "C",
  20967. },
  20968. {
  20969. { ADD_LEN( MBEDTLS_OID_AT_LOCALITY ), "id-at-locality", "Locality" },
  20970. "L",
  20971. },
  20972. {
  20973. { ADD_LEN( MBEDTLS_OID_AT_STATE ), "id-at-state", "State" },
  20974. "ST",
  20975. },
  20976. {
  20977. { ADD_LEN( MBEDTLS_OID_AT_ORGANIZATION ),"id-at-organizationName", "Organization" },
  20978. "O",
  20979. },
  20980. {
  20981. { ADD_LEN( MBEDTLS_OID_AT_ORG_UNIT ), "id-at-organizationalUnitName", "Org Unit" },
  20982. "OU",
  20983. },
  20984. {
  20985. { ADD_LEN( MBEDTLS_OID_PKCS9_EMAIL ), "emailAddress", "E-mail address" },
  20986. "emailAddress",
  20987. },
  20988. {
  20989. { ADD_LEN( MBEDTLS_OID_AT_SERIAL_NUMBER ),"id-at-serialNumber", "Serial number" },
  20990. "serialNumber",
  20991. },
  20992. {
  20993. { ADD_LEN( MBEDTLS_OID_AT_POSTAL_ADDRESS ),"id-at-postalAddress", "Postal address" },
  20994. "postalAddress",
  20995. },
  20996. {
  20997. { ADD_LEN( MBEDTLS_OID_AT_POSTAL_CODE ), "id-at-postalCode", "Postal code" },
  20998. "postalCode",
  20999. },
  21000. {
  21001. { ADD_LEN( MBEDTLS_OID_AT_SUR_NAME ), "id-at-surName", "Surname" },
  21002. "SN",
  21003. },
  21004. {
  21005. { ADD_LEN( MBEDTLS_OID_AT_GIVEN_NAME ), "id-at-givenName", "Given name" },
  21006. "GN",
  21007. },
  21008. {
  21009. { ADD_LEN( MBEDTLS_OID_AT_INITIALS ), "id-at-initials", "Initials" },
  21010. "initials",
  21011. },
  21012. {
  21013. { ADD_LEN( MBEDTLS_OID_AT_GENERATION_QUALIFIER ), "id-at-generationQualifier", "Generation qualifier" },
  21014. "generationQualifier",
  21015. },
  21016. {
  21017. { ADD_LEN( MBEDTLS_OID_AT_TITLE ), "id-at-title", "Title" },
  21018. "title",
  21019. },
  21020. {
  21021. { ADD_LEN( MBEDTLS_OID_AT_DN_QUALIFIER ),"id-at-dnQualifier", "Distinguished Name qualifier" },
  21022. "dnQualifier",
  21023. },
  21024. {
  21025. { ADD_LEN( MBEDTLS_OID_AT_PSEUDONYM ), "id-at-pseudonym", "Pseudonym" },
  21026. "pseudonym",
  21027. },
  21028. {
  21029. { ADD_LEN( MBEDTLS_OID_DOMAIN_COMPONENT ), "id-domainComponent", "Domain component" },
  21030. "DC",
  21031. },
  21032. {
  21033. { ADD_LEN( MBEDTLS_OID_AT_UNIQUE_IDENTIFIER ), "id-at-uniqueIdentifier", "Unique Identifier" },
  21034. "uniqueIdentifier",
  21035. },
  21036. {
  21037. { NULL, 0, NULL, NULL },
  21038. NULL,
  21039. }
  21040. };
  21041. FN_OID_TYPED_FROM_ASN1(oid_x520_attr_t, x520_attr, oid_x520_attr_type)
  21042. FN_OID_GET_ATTR1(mbedtls_oid_get_attr_short_name, oid_x520_attr_t, x520_attr, const char *, short_name)
  21043. #if defined(MBEDTLS_X509_USE_C) || defined(MBEDTLS_X509_CREATE_C)
  21044. /*
  21045. * For X509 extensions
  21046. */
  21047. typedef struct {
  21048. mbedtls_oid_descriptor_t descriptor;
  21049. int ext_type;
  21050. } oid_x509_ext_t;
  21051. static const oid_x509_ext_t oid_x509_ext[] =
  21052. {
  21053. {
  21054. { ADD_LEN( MBEDTLS_OID_BASIC_CONSTRAINTS ), "id-ce-basicConstraints", "Basic Constraints" },
  21055. MBEDTLS_X509_EXT_BASIC_CONSTRAINTS,
  21056. },
  21057. {
  21058. { ADD_LEN( MBEDTLS_OID_KEY_USAGE ), "id-ce-keyUsage", "Key Usage" },
  21059. MBEDTLS_X509_EXT_KEY_USAGE,
  21060. },
  21061. {
  21062. { ADD_LEN( MBEDTLS_OID_EXTENDED_KEY_USAGE ), "id-ce-extKeyUsage", "Extended Key Usage" },
  21063. MBEDTLS_X509_EXT_EXTENDED_KEY_USAGE,
  21064. },
  21065. {
  21066. { ADD_LEN( MBEDTLS_OID_SUBJECT_ALT_NAME ), "id-ce-subjectAltName", "Subject Alt Name" },
  21067. MBEDTLS_X509_EXT_SUBJECT_ALT_NAME,
  21068. },
  21069. {
  21070. { ADD_LEN( MBEDTLS_OID_NS_CERT_TYPE ), "id-netscape-certtype", "Netscape Certificate Type" },
  21071. MBEDTLS_X509_EXT_NS_CERT_TYPE,
  21072. },
  21073. {
  21074. { NULL, 0, NULL, NULL },
  21075. 0,
  21076. },
  21077. };
  21078. FN_OID_TYPED_FROM_ASN1(oid_x509_ext_t, x509_ext, oid_x509_ext)
  21079. FN_OID_GET_ATTR1(mbedtls_oid_get_x509_ext_type, oid_x509_ext_t, x509_ext, int, ext_type)
  21080. static const mbedtls_oid_descriptor_t oid_ext_key_usage[] =
  21081. {
  21082. { ADD_LEN( MBEDTLS_OID_SERVER_AUTH ), "id-kp-serverAuth", "TLS Web Server Authentication" },
  21083. { ADD_LEN( MBEDTLS_OID_CLIENT_AUTH ), "id-kp-clientAuth", "TLS Web Client Authentication" },
  21084. { ADD_LEN( MBEDTLS_OID_CODE_SIGNING ), "id-kp-codeSigning", "Code Signing" },
  21085. { ADD_LEN( MBEDTLS_OID_EMAIL_PROTECTION ), "id-kp-emailProtection", "E-mail Protection" },
  21086. { ADD_LEN( MBEDTLS_OID_TIME_STAMPING ), "id-kp-timeStamping", "Time Stamping" },
  21087. { ADD_LEN( MBEDTLS_OID_OCSP_SIGNING ), "id-kp-OCSPSigning", "OCSP Signing" },
  21088. { NULL, 0, NULL, NULL },
  21089. };
  21090. FN_OID_TYPED_FROM_ASN1(mbedtls_oid_descriptor_t, ext_key_usage, oid_ext_key_usage)
  21091. FN_OID_GET_ATTR1(mbedtls_oid_get_extended_key_usage, mbedtls_oid_descriptor_t, ext_key_usage, const char *, description)
  21092. #endif /* MBEDTLS_X509_USE_C || MBEDTLS_X509_CREATE_C */
  21093. #if defined(MBEDTLS_MD_C)
  21094. /*
  21095. * For SignatureAlgorithmIdentifier
  21096. */
  21097. typedef struct {
  21098. mbedtls_oid_descriptor_t descriptor;
  21099. mbedtls_md_type_t md_alg;
  21100. mbedtls_pk_type_t pk_alg;
  21101. } oid_sig_alg_t;
  21102. static const oid_sig_alg_t oid_sig_alg[] =
  21103. {
  21104. {
  21105. { ADD_LEN( MBEDTLS_OID_PKCS1_MD2 ), "md2WithRSAEncryption", "RSA with MD2" },
  21106. MBEDTLS_MD_MD2, MBEDTLS_PK_RSA,
  21107. },
  21108. {
  21109. { ADD_LEN( MBEDTLS_OID_PKCS1_MD4 ), "md4WithRSAEncryption", "RSA with MD4" },
  21110. MBEDTLS_MD_MD4, MBEDTLS_PK_RSA,
  21111. },
  21112. {
  21113. { ADD_LEN( MBEDTLS_OID_PKCS1_MD5 ), "md5WithRSAEncryption", "RSA with MD5" },
  21114. MBEDTLS_MD_MD5, MBEDTLS_PK_RSA,
  21115. },
  21116. {
  21117. { ADD_LEN( MBEDTLS_OID_PKCS1_SHA1 ), "sha-1WithRSAEncryption", "RSA with SHA1" },
  21118. MBEDTLS_MD_SHA1, MBEDTLS_PK_RSA,
  21119. },
  21120. {
  21121. { ADD_LEN( MBEDTLS_OID_PKCS1_SHA224 ), "sha224WithRSAEncryption", "RSA with SHA-224" },
  21122. MBEDTLS_MD_SHA224, MBEDTLS_PK_RSA,
  21123. },
  21124. {
  21125. { ADD_LEN( MBEDTLS_OID_PKCS1_SHA256 ), "sha256WithRSAEncryption", "RSA with SHA-256" },
  21126. MBEDTLS_MD_SHA256, MBEDTLS_PK_RSA,
  21127. },
  21128. {
  21129. { ADD_LEN( MBEDTLS_OID_PKCS1_SHA384 ), "sha384WithRSAEncryption", "RSA with SHA-384" },
  21130. MBEDTLS_MD_SHA384, MBEDTLS_PK_RSA,
  21131. },
  21132. {
  21133. { ADD_LEN( MBEDTLS_OID_PKCS1_SHA512 ), "sha512WithRSAEncryption", "RSA with SHA-512" },
  21134. MBEDTLS_MD_SHA512, MBEDTLS_PK_RSA,
  21135. },
  21136. {
  21137. { ADD_LEN( MBEDTLS_OID_RSA_SHA_OBS ), "sha-1WithRSAEncryption", "RSA with SHA1" },
  21138. MBEDTLS_MD_SHA1, MBEDTLS_PK_RSA,
  21139. },
  21140. {
  21141. { ADD_LEN( MBEDTLS_OID_ECDSA_SHA1 ), "ecdsa-with-SHA1", "ECDSA with SHA1" },
  21142. MBEDTLS_MD_SHA1, MBEDTLS_PK_ECDSA,
  21143. },
  21144. {
  21145. { ADD_LEN( MBEDTLS_OID_ECDSA_SHA224 ), "ecdsa-with-SHA224", "ECDSA with SHA224" },
  21146. MBEDTLS_MD_SHA224, MBEDTLS_PK_ECDSA,
  21147. },
  21148. {
  21149. { ADD_LEN( MBEDTLS_OID_ECDSA_SHA256 ), "ecdsa-with-SHA256", "ECDSA with SHA256" },
  21150. MBEDTLS_MD_SHA256, MBEDTLS_PK_ECDSA,
  21151. },
  21152. {
  21153. { ADD_LEN( MBEDTLS_OID_ECDSA_SHA384 ), "ecdsa-with-SHA384", "ECDSA with SHA384" },
  21154. MBEDTLS_MD_SHA384, MBEDTLS_PK_ECDSA,
  21155. },
  21156. {
  21157. { ADD_LEN( MBEDTLS_OID_ECDSA_SHA512 ), "ecdsa-with-SHA512", "ECDSA with SHA512" },
  21158. MBEDTLS_MD_SHA512, MBEDTLS_PK_ECDSA,
  21159. },
  21160. {
  21161. { ADD_LEN( MBEDTLS_OID_RSASSA_PSS ), "RSASSA-PSS", "RSASSA-PSS" },
  21162. MBEDTLS_MD_NONE, MBEDTLS_PK_RSASSA_PSS,
  21163. },
  21164. {
  21165. { NULL, 0, NULL, NULL },
  21166. MBEDTLS_MD_NONE, MBEDTLS_PK_NONE,
  21167. },
  21168. };
  21169. FN_OID_TYPED_FROM_ASN1(oid_sig_alg_t, sig_alg, oid_sig_alg)
  21170. FN_OID_GET_DESCRIPTOR_ATTR1(mbedtls_oid_get_sig_alg_desc, oid_sig_alg_t, sig_alg, const char *, description)
  21171. FN_OID_GET_ATTR2(mbedtls_oid_get_sig_alg, oid_sig_alg_t, sig_alg, mbedtls_md_type_t, md_alg, mbedtls_pk_type_t, pk_alg)
  21172. FN_OID_GET_OID_BY_ATTR2(mbedtls_oid_get_oid_by_sig_alg, oid_sig_alg_t, oid_sig_alg, mbedtls_pk_type_t, pk_alg, mbedtls_md_type_t, md_alg)
  21173. #endif /* MBEDTLS_MD_C */
  21174. /*
  21175. * For PublicKeyInfo (PKCS1, RFC 5480)
  21176. */
  21177. typedef struct {
  21178. mbedtls_oid_descriptor_t descriptor;
  21179. mbedtls_pk_type_t pk_alg;
  21180. } oid_pk_alg_t;
  21181. static const oid_pk_alg_t oid_pk_alg[] =
  21182. {
  21183. {
  21184. { ADD_LEN( MBEDTLS_OID_PKCS1_RSA ), "rsaEncryption", "RSA" },
  21185. MBEDTLS_PK_RSA,
  21186. },
  21187. {
  21188. { ADD_LEN( MBEDTLS_OID_EC_ALG_UNRESTRICTED ), "id-ecPublicKey", "Generic EC key" },
  21189. MBEDTLS_PK_ECKEY,
  21190. },
  21191. {
  21192. { ADD_LEN( MBEDTLS_OID_EC_ALG_ECDH ), "id-ecDH", "EC key for ECDH" },
  21193. MBEDTLS_PK_ECKEY_DH,
  21194. },
  21195. {
  21196. { NULL, 0, NULL, NULL },
  21197. MBEDTLS_PK_NONE,
  21198. },
  21199. };
  21200. FN_OID_TYPED_FROM_ASN1(oid_pk_alg_t, pk_alg, oid_pk_alg)
  21201. FN_OID_GET_ATTR1(mbedtls_oid_get_pk_alg, oid_pk_alg_t, pk_alg, mbedtls_pk_type_t, pk_alg)
  21202. FN_OID_GET_OID_BY_ATTR1(mbedtls_oid_get_oid_by_pk_alg, oid_pk_alg_t, oid_pk_alg, mbedtls_pk_type_t, pk_alg)
  21203. #if defined(MBEDTLS_ECP_C)
  21204. /*
  21205. * For namedCurve (RFC 5480)
  21206. */
  21207. typedef struct {
  21208. mbedtls_oid_descriptor_t descriptor;
  21209. mbedtls_ecp_group_id grp_id;
  21210. } oid_ecp_grp_t;
  21211. static const oid_ecp_grp_t oid_ecp_grp[] =
  21212. {
  21213. {
  21214. { ADD_LEN( MBEDTLS_OID_EC_GRP_SECP192R1 ), "secp192r1", "secp192r1" },
  21215. MBEDTLS_ECP_DP_SECP192R1,
  21216. },
  21217. {
  21218. { ADD_LEN( MBEDTLS_OID_EC_GRP_SECP224R1 ), "secp224r1", "secp224r1" },
  21219. MBEDTLS_ECP_DP_SECP224R1,
  21220. },
  21221. {
  21222. { ADD_LEN( MBEDTLS_OID_EC_GRP_SECP256R1 ), "secp256r1", "secp256r1" },
  21223. MBEDTLS_ECP_DP_SECP256R1,
  21224. },
  21225. {
  21226. { ADD_LEN( MBEDTLS_OID_EC_GRP_SECP384R1 ), "secp384r1", "secp384r1" },
  21227. MBEDTLS_ECP_DP_SECP384R1,
  21228. },
  21229. {
  21230. { ADD_LEN( MBEDTLS_OID_EC_GRP_SECP521R1 ), "secp521r1", "secp521r1" },
  21231. MBEDTLS_ECP_DP_SECP521R1,
  21232. },
  21233. {
  21234. { ADD_LEN( MBEDTLS_OID_EC_GRP_SECP192K1 ), "secp192k1", "secp192k1" },
  21235. MBEDTLS_ECP_DP_SECP192K1,
  21236. },
  21237. {
  21238. { ADD_LEN( MBEDTLS_OID_EC_GRP_SECP224K1 ), "secp224k1", "secp224k1" },
  21239. MBEDTLS_ECP_DP_SECP224K1,
  21240. },
  21241. {
  21242. { ADD_LEN( MBEDTLS_OID_EC_GRP_SECP256K1 ), "secp256k1", "secp256k1" },
  21243. MBEDTLS_ECP_DP_SECP256K1,
  21244. },
  21245. {
  21246. { ADD_LEN( MBEDTLS_OID_EC_GRP_BP256R1 ), "brainpoolP256r1","brainpool256r1" },
  21247. MBEDTLS_ECP_DP_BP256R1,
  21248. },
  21249. {
  21250. { ADD_LEN( MBEDTLS_OID_EC_GRP_BP384R1 ), "brainpoolP384r1","brainpool384r1" },
  21251. MBEDTLS_ECP_DP_BP384R1,
  21252. },
  21253. {
  21254. { ADD_LEN( MBEDTLS_OID_EC_GRP_BP512R1 ), "brainpoolP512r1","brainpool512r1" },
  21255. MBEDTLS_ECP_DP_BP512R1,
  21256. },
  21257. {
  21258. { NULL, 0, NULL, NULL },
  21259. MBEDTLS_ECP_DP_NONE,
  21260. },
  21261. };
  21262. FN_OID_TYPED_FROM_ASN1(oid_ecp_grp_t, grp_id, oid_ecp_grp)
  21263. FN_OID_GET_ATTR1(mbedtls_oid_get_ec_grp, oid_ecp_grp_t, grp_id, mbedtls_ecp_group_id, grp_id)
  21264. FN_OID_GET_OID_BY_ATTR1(mbedtls_oid_get_oid_by_ec_grp, oid_ecp_grp_t, oid_ecp_grp, mbedtls_ecp_group_id, grp_id)
  21265. #endif /* MBEDTLS_ECP_C */
  21266. #if defined(MBEDTLS_CIPHER_C)
  21267. /*
  21268. * For PKCS#5 PBES2 encryption algorithm
  21269. */
  21270. typedef struct {
  21271. mbedtls_oid_descriptor_t descriptor;
  21272. mbedtls_cipher_type_t cipher_alg;
  21273. } oid_cipher_alg_t;
  21274. static const oid_cipher_alg_t oid_cipher_alg[] =
  21275. {
  21276. {
  21277. { ADD_LEN( MBEDTLS_OID_DES_CBC ), "desCBC", "DES-CBC" },
  21278. MBEDTLS_CIPHER_DES_CBC,
  21279. },
  21280. {
  21281. { ADD_LEN( MBEDTLS_OID_DES_EDE3_CBC ), "des-ede3-cbc", "DES-EDE3-CBC" },
  21282. MBEDTLS_CIPHER_DES_EDE3_CBC,
  21283. },
  21284. {
  21285. { NULL, 0, NULL, NULL },
  21286. MBEDTLS_CIPHER_NONE,
  21287. },
  21288. };
  21289. FN_OID_TYPED_FROM_ASN1(oid_cipher_alg_t, cipher_alg, oid_cipher_alg)
  21290. FN_OID_GET_ATTR1(mbedtls_oid_get_cipher_alg, oid_cipher_alg_t, cipher_alg, mbedtls_cipher_type_t, cipher_alg)
  21291. #endif /* MBEDTLS_CIPHER_C */
  21292. #if defined(MBEDTLS_MD_C)
  21293. /*
  21294. * For digestAlgorithm
  21295. */
  21296. typedef struct {
  21297. mbedtls_oid_descriptor_t descriptor;
  21298. mbedtls_md_type_t md_alg;
  21299. } oid_md_alg_t;
  21300. static const oid_md_alg_t oid_md_alg[] =
  21301. {
  21302. {
  21303. { ADD_LEN( MBEDTLS_OID_DIGEST_ALG_MD2 ), "id-md2", "MD2" },
  21304. MBEDTLS_MD_MD2,
  21305. },
  21306. {
  21307. { ADD_LEN( MBEDTLS_OID_DIGEST_ALG_MD4 ), "id-md4", "MD4" },
  21308. MBEDTLS_MD_MD4,
  21309. },
  21310. {
  21311. { ADD_LEN( MBEDTLS_OID_DIGEST_ALG_MD5 ), "id-md5", "MD5" },
  21312. MBEDTLS_MD_MD5,
  21313. },
  21314. {
  21315. { ADD_LEN( MBEDTLS_OID_DIGEST_ALG_SHA1 ), "id-sha1", "SHA-1" },
  21316. MBEDTLS_MD_SHA1,
  21317. },
  21318. {
  21319. { ADD_LEN( MBEDTLS_OID_DIGEST_ALG_SHA224 ), "id-sha224", "SHA-224" },
  21320. MBEDTLS_MD_SHA224,
  21321. },
  21322. {
  21323. { ADD_LEN( MBEDTLS_OID_DIGEST_ALG_SHA256 ), "id-sha256", "SHA-256" },
  21324. MBEDTLS_MD_SHA256,
  21325. },
  21326. {
  21327. { ADD_LEN( MBEDTLS_OID_DIGEST_ALG_SHA384 ), "id-sha384", "SHA-384" },
  21328. MBEDTLS_MD_SHA384,
  21329. },
  21330. {
  21331. { ADD_LEN( MBEDTLS_OID_DIGEST_ALG_SHA512 ), "id-sha512", "SHA-512" },
  21332. MBEDTLS_MD_SHA512,
  21333. },
  21334. {
  21335. { NULL, 0, NULL, NULL },
  21336. MBEDTLS_MD_NONE,
  21337. },
  21338. };
  21339. FN_OID_TYPED_FROM_ASN1(oid_md_alg_t, md_alg, oid_md_alg)
  21340. FN_OID_GET_ATTR1(mbedtls_oid_get_md_alg, oid_md_alg_t, md_alg, mbedtls_md_type_t, md_alg)
  21341. FN_OID_GET_OID_BY_ATTR1(mbedtls_oid_get_oid_by_md, oid_md_alg_t, oid_md_alg, mbedtls_md_type_t, md_alg)
  21342. #endif /* MBEDTLS_MD_C */
  21343. #if defined(MBEDTLS_PKCS12_C)
  21344. /*
  21345. * For PKCS#12 PBEs
  21346. */
  21347. typedef struct {
  21348. mbedtls_oid_descriptor_t descriptor;
  21349. mbedtls_md_type_t md_alg;
  21350. mbedtls_cipher_type_t cipher_alg;
  21351. } oid_pkcs12_pbe_alg_t;
  21352. static const oid_pkcs12_pbe_alg_t oid_pkcs12_pbe_alg[] =
  21353. {
  21354. {
  21355. { ADD_LEN( MBEDTLS_OID_PKCS12_PBE_SHA1_DES3_EDE_CBC ), "pbeWithSHAAnd3-KeyTripleDES-CBC", "PBE with SHA1 and 3-Key 3DES" },
  21356. MBEDTLS_MD_SHA1, MBEDTLS_CIPHER_DES_EDE3_CBC,
  21357. },
  21358. {
  21359. { ADD_LEN( MBEDTLS_OID_PKCS12_PBE_SHA1_DES2_EDE_CBC ), "pbeWithSHAAnd2-KeyTripleDES-CBC", "PBE with SHA1 and 2-Key 3DES" },
  21360. MBEDTLS_MD_SHA1, MBEDTLS_CIPHER_DES_EDE_CBC,
  21361. },
  21362. {
  21363. { NULL, 0, NULL, NULL },
  21364. MBEDTLS_MD_NONE, MBEDTLS_CIPHER_NONE,
  21365. },
  21366. };
  21367. FN_OID_TYPED_FROM_ASN1(oid_pkcs12_pbe_alg_t, pkcs12_pbe_alg, oid_pkcs12_pbe_alg)
  21368. FN_OID_GET_ATTR2(mbedtls_oid_get_pkcs12_pbe_alg, oid_pkcs12_pbe_alg_t, pkcs12_pbe_alg, mbedtls_md_type_t, md_alg, mbedtls_cipher_type_t, cipher_alg)
  21369. #endif /* MBEDTLS_PKCS12_C */
  21370. #define OID_SAFE_SNPRINTF \
  21371. do { \
  21372. if( ret < 0 || (size_t) ret >= n ) \
  21373. return( MBEDTLS_ERR_OID_BUF_TOO_SMALL ); \
  21374. \
  21375. n -= (size_t) ret; \
  21376. p += (size_t) ret; \
  21377. } while( 0 )
  21378. /* Return the x.y.z.... style numeric string for the given OID */
  21379. int mbedtls_oid_get_numeric_string( char *buf, size_t size,
  21380. const mbedtls_asn1_buf *oid )
  21381. {
  21382. int ret;
  21383. size_t i, n;
  21384. unsigned int value;
  21385. char *p;
  21386. p = buf;
  21387. n = size;
  21388. /* First byte contains first two dots */
  21389. if( oid->len > 0 )
  21390. {
  21391. ret = mbedtls_snprintf( p, n, "%d.%d", oid->p[0] / 40, oid->p[0] % 40 );
  21392. OID_SAFE_SNPRINTF;
  21393. }
  21394. value = 0;
  21395. for( i = 1; i < oid->len; i++ )
  21396. {
  21397. /* Prevent overflow in value. */
  21398. if( ( ( value << 7 ) >> 7 ) != value )
  21399. return( MBEDTLS_ERR_OID_BUF_TOO_SMALL );
  21400. value <<= 7;
  21401. value += oid->p[i] & 0x7F;
  21402. if( !( oid->p[i] & 0x80 ) )
  21403. {
  21404. /* Last byte */
  21405. ret = mbedtls_snprintf( p, n, ".%d", value );
  21406. OID_SAFE_SNPRINTF;
  21407. value = 0;
  21408. }
  21409. }
  21410. return( (int) ( size - n ) );
  21411. }
  21412. /* Amalgamated Release Mappings */
  21413. #undef SAFE_SNPRINTF
  21414. #endif /* MBEDTLS_OID_C */
  21415. /********* Start of file library/padlock.c ************/
  21416. /*
  21417. * VIA PadLock support functions
  21418. *
  21419. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  21420. * SPDX-License-Identifier: Apache-2.0
  21421. *
  21422. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  21423. * not use this file except in compliance with the License.
  21424. * You may obtain a copy of the License at
  21425. *
  21426. * http://www.apache.org/licenses/LICENSE-2.0
  21427. *
  21428. * Unless required by applicable law or agreed to in writing, software
  21429. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  21430. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  21431. * See the License for the specific language governing permissions and
  21432. * limitations under the License.
  21433. *
  21434. * This file is part of mbed TLS (https://tls.mbed.org)
  21435. */
  21436. /*
  21437. * This implementation is based on the VIA PadLock Programming Guide:
  21438. *
  21439. * http://www.via.com.tw/en/downloads/whitepapers/initiatives/padlock/
  21440. * programming_guide.pdf
  21441. */
  21442. #if !defined(MBEDTLS_CONFIG_FILE)
  21443. #else
  21444. #endif
  21445. #if defined(MBEDTLS_PADLOCK_C)
  21446. #include <string.h>
  21447. #ifndef asm
  21448. #define asm __asm
  21449. #endif
  21450. #if defined(MBEDTLS_HAVE_X86)
  21451. /*
  21452. * PadLock detection routine
  21453. */
  21454. int mbedtls_padlock_has_support( int feature )
  21455. {
  21456. static int flags = -1;
  21457. int ebx = 0, edx = 0;
  21458. if( flags == -1 )
  21459. {
  21460. asm( "movl %%ebx, %0 \n\t"
  21461. "movl $0xC0000000, %%eax \n\t"
  21462. "cpuid \n\t"
  21463. "cmpl $0xC0000001, %%eax \n\t"
  21464. "movl $0, %%edx \n\t"
  21465. "jb unsupported \n\t"
  21466. "movl $0xC0000001, %%eax \n\t"
  21467. "cpuid \n\t"
  21468. "unsupported: \n\t"
  21469. "movl %%edx, %1 \n\t"
  21470. "movl %2, %%ebx \n\t"
  21471. : "=m" (ebx), "=m" (edx)
  21472. : "m" (ebx)
  21473. : "eax", "ecx", "edx" );
  21474. flags = edx;
  21475. }
  21476. return( flags & feature );
  21477. }
  21478. /*
  21479. * PadLock AES-ECB block en(de)cryption
  21480. */
  21481. int mbedtls_padlock_xcryptecb( mbedtls_aes_context *ctx,
  21482. int mode,
  21483. const unsigned char input[16],
  21484. unsigned char output[16] )
  21485. {
  21486. int ebx = 0;
  21487. uint32_t *rk;
  21488. uint32_t *blk;
  21489. uint32_t *ctrl;
  21490. unsigned char buf[256];
  21491. rk = ctx->rk;
  21492. blk = MBEDTLS_PADLOCK_ALIGN16( buf );
  21493. memcpy( blk, input, 16 );
  21494. ctrl = blk + 4;
  21495. *ctrl = 0x80 | ctx->nr | ( ( ctx->nr + ( mode^1 ) - 10 ) << 9 );
  21496. asm( "pushfl \n\t"
  21497. "popfl \n\t"
  21498. "movl %%ebx, %0 \n\t"
  21499. "movl $1, %%ecx \n\t"
  21500. "movl %2, %%edx \n\t"
  21501. "movl %3, %%ebx \n\t"
  21502. "movl %4, %%esi \n\t"
  21503. "movl %4, %%edi \n\t"
  21504. ".byte 0xf3,0x0f,0xa7,0xc8 \n\t"
  21505. "movl %1, %%ebx \n\t"
  21506. : "=m" (ebx)
  21507. : "m" (ebx), "m" (ctrl), "m" (rk), "m" (blk)
  21508. : "memory", "ecx", "edx", "esi", "edi" );
  21509. memcpy( output, blk, 16 );
  21510. return( 0 );
  21511. }
  21512. /*
  21513. * PadLock AES-CBC buffer en(de)cryption
  21514. */
  21515. int mbedtls_padlock_xcryptcbc( mbedtls_aes_context *ctx,
  21516. int mode,
  21517. size_t length,
  21518. unsigned char iv[16],
  21519. const unsigned char *input,
  21520. unsigned char *output )
  21521. {
  21522. int ebx = 0;
  21523. size_t count;
  21524. uint32_t *rk;
  21525. uint32_t *iw;
  21526. uint32_t *ctrl;
  21527. unsigned char buf[256];
  21528. if( ( (long) input & 15 ) != 0 ||
  21529. ( (long) output & 15 ) != 0 )
  21530. return( MBEDTLS_ERR_PADLOCK_DATA_MISALIGNED );
  21531. rk = ctx->rk;
  21532. iw = MBEDTLS_PADLOCK_ALIGN16( buf );
  21533. memcpy( iw, iv, 16 );
  21534. ctrl = iw + 4;
  21535. *ctrl = 0x80 | ctx->nr | ( ( ctx->nr + ( mode ^ 1 ) - 10 ) << 9 );
  21536. count = ( length + 15 ) >> 4;
  21537. asm( "pushfl \n\t"
  21538. "popfl \n\t"
  21539. "movl %%ebx, %0 \n\t"
  21540. "movl %2, %%ecx \n\t"
  21541. "movl %3, %%edx \n\t"
  21542. "movl %4, %%ebx \n\t"
  21543. "movl %5, %%esi \n\t"
  21544. "movl %6, %%edi \n\t"
  21545. "movl %7, %%eax \n\t"
  21546. ".byte 0xf3,0x0f,0xa7,0xd0 \n\t"
  21547. "movl %1, %%ebx \n\t"
  21548. : "=m" (ebx)
  21549. : "m" (ebx), "m" (count), "m" (ctrl),
  21550. "m" (rk), "m" (input), "m" (output), "m" (iw)
  21551. : "memory", "eax", "ecx", "edx", "esi", "edi" );
  21552. memcpy( iv, iw, 16 );
  21553. return( 0 );
  21554. }
  21555. #endif /* MBEDTLS_HAVE_X86 */
  21556. #endif /* MBEDTLS_PADLOCK_C */
  21557. /********* Start of file library/pem.c ************/
  21558. /*
  21559. * Privacy Enhanced Mail (PEM) decoding
  21560. *
  21561. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  21562. * SPDX-License-Identifier: Apache-2.0
  21563. *
  21564. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  21565. * not use this file except in compliance with the License.
  21566. * You may obtain a copy of the License at
  21567. *
  21568. * http://www.apache.org/licenses/LICENSE-2.0
  21569. *
  21570. * Unless required by applicable law or agreed to in writing, software
  21571. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  21572. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  21573. * See the License for the specific language governing permissions and
  21574. * limitations under the License.
  21575. *
  21576. * This file is part of mbed TLS (https://tls.mbed.org)
  21577. */
  21578. #if !defined(MBEDTLS_CONFIG_FILE)
  21579. #else
  21580. #endif
  21581. #if defined(MBEDTLS_PEM_PARSE_C) || defined(MBEDTLS_PEM_WRITE_C)
  21582. #include <string.h>
  21583. #if defined(MBEDTLS_PLATFORM_C)
  21584. #else
  21585. #include <stdlib.h>
  21586. #define mbedtls_calloc calloc
  21587. #define mbedtls_free free
  21588. #endif
  21589. /* Implementation that should never be optimized out by the compiler */
  21590. static void pem_zeroize( void *v, size_t n ) {
  21591. volatile unsigned char *p = v; while( n-- ) *p++ = 0;
  21592. }
  21593. #if defined(MBEDTLS_PEM_PARSE_C)
  21594. void mbedtls_pem_init( mbedtls_pem_context *ctx )
  21595. {
  21596. memset( ctx, 0, sizeof( mbedtls_pem_context ) );
  21597. }
  21598. #if defined(MBEDTLS_MD5_C) && defined(MBEDTLS_CIPHER_MODE_CBC) && \
  21599. ( defined(MBEDTLS_DES_C) || defined(MBEDTLS_AES_C) )
  21600. /*
  21601. * Read a 16-byte hex string and convert it to binary
  21602. */
  21603. static int pem_get_iv( const unsigned char *s, unsigned char *iv,
  21604. size_t iv_len )
  21605. {
  21606. size_t i, j, k;
  21607. memset( iv, 0, iv_len );
  21608. for( i = 0; i < iv_len * 2; i++, s++ )
  21609. {
  21610. if( *s >= '0' && *s <= '9' ) j = *s - '0'; else
  21611. if( *s >= 'A' && *s <= 'F' ) j = *s - '7'; else
  21612. if( *s >= 'a' && *s <= 'f' ) j = *s - 'W'; else
  21613. return( MBEDTLS_ERR_PEM_INVALID_ENC_IV );
  21614. k = ( ( i & 1 ) != 0 ) ? j : j << 4;
  21615. iv[i >> 1] = (unsigned char)( iv[i >> 1] | k );
  21616. }
  21617. return( 0 );
  21618. }
  21619. static void pem_pbkdf1( unsigned char *key, size_t keylen,
  21620. unsigned char *iv,
  21621. const unsigned char *pwd, size_t pwdlen )
  21622. {
  21623. mbedtls_md5_context md5_ctx;
  21624. unsigned char md5sum[16];
  21625. size_t use_len;
  21626. mbedtls_md5_init( &md5_ctx );
  21627. /*
  21628. * key[ 0..15] = MD5(pwd || IV)
  21629. */
  21630. mbedtls_md5_starts( &md5_ctx );
  21631. mbedtls_md5_update( &md5_ctx, pwd, pwdlen );
  21632. mbedtls_md5_update( &md5_ctx, iv, 8 );
  21633. mbedtls_md5_finish( &md5_ctx, md5sum );
  21634. if( keylen <= 16 )
  21635. {
  21636. memcpy( key, md5sum, keylen );
  21637. mbedtls_md5_free( &md5_ctx );
  21638. pem_zeroize( md5sum, 16 );
  21639. return;
  21640. }
  21641. memcpy( key, md5sum, 16 );
  21642. /*
  21643. * key[16..23] = MD5(key[ 0..15] || pwd || IV])
  21644. */
  21645. mbedtls_md5_starts( &md5_ctx );
  21646. mbedtls_md5_update( &md5_ctx, md5sum, 16 );
  21647. mbedtls_md5_update( &md5_ctx, pwd, pwdlen );
  21648. mbedtls_md5_update( &md5_ctx, iv, 8 );
  21649. mbedtls_md5_finish( &md5_ctx, md5sum );
  21650. use_len = 16;
  21651. if( keylen < 32 )
  21652. use_len = keylen - 16;
  21653. memcpy( key + 16, md5sum, use_len );
  21654. mbedtls_md5_free( &md5_ctx );
  21655. pem_zeroize( md5sum, 16 );
  21656. }
  21657. #if defined(MBEDTLS_DES_C)
  21658. /*
  21659. * Decrypt with DES-CBC, using PBKDF1 for key derivation
  21660. */
  21661. static void pem_des_decrypt( unsigned char des_iv[8],
  21662. unsigned char *buf, size_t buflen,
  21663. const unsigned char *pwd, size_t pwdlen )
  21664. {
  21665. mbedtls_des_context des_ctx;
  21666. unsigned char des_key[8];
  21667. mbedtls_des_init( &des_ctx );
  21668. pem_pbkdf1( des_key, 8, des_iv, pwd, pwdlen );
  21669. mbedtls_des_setkey_dec( &des_ctx, des_key );
  21670. mbedtls_des_crypt_cbc( &des_ctx, MBEDTLS_DES_DECRYPT, buflen,
  21671. des_iv, buf, buf );
  21672. mbedtls_des_free( &des_ctx );
  21673. pem_zeroize( des_key, 8 );
  21674. }
  21675. /*
  21676. * Decrypt with 3DES-CBC, using PBKDF1 for key derivation
  21677. */
  21678. static void pem_des3_decrypt( unsigned char des3_iv[8],
  21679. unsigned char *buf, size_t buflen,
  21680. const unsigned char *pwd, size_t pwdlen )
  21681. {
  21682. mbedtls_des3_context des3_ctx;
  21683. unsigned char des3_key[24];
  21684. mbedtls_des3_init( &des3_ctx );
  21685. pem_pbkdf1( des3_key, 24, des3_iv, pwd, pwdlen );
  21686. mbedtls_des3_set3key_dec( &des3_ctx, des3_key );
  21687. mbedtls_des3_crypt_cbc( &des3_ctx, MBEDTLS_DES_DECRYPT, buflen,
  21688. des3_iv, buf, buf );
  21689. mbedtls_des3_free( &des3_ctx );
  21690. pem_zeroize( des3_key, 24 );
  21691. }
  21692. #endif /* MBEDTLS_DES_C */
  21693. #if defined(MBEDTLS_AES_C)
  21694. /*
  21695. * Decrypt with AES-XXX-CBC, using PBKDF1 for key derivation
  21696. */
  21697. static void pem_aes_decrypt( unsigned char aes_iv[16], unsigned int keylen,
  21698. unsigned char *buf, size_t buflen,
  21699. const unsigned char *pwd, size_t pwdlen )
  21700. {
  21701. mbedtls_aes_context aes_ctx;
  21702. unsigned char aes_key[32];
  21703. mbedtls_aes_init( &aes_ctx );
  21704. pem_pbkdf1( aes_key, keylen, aes_iv, pwd, pwdlen );
  21705. mbedtls_aes_setkey_dec( &aes_ctx, aes_key, keylen * 8 );
  21706. mbedtls_aes_crypt_cbc( &aes_ctx, MBEDTLS_AES_DECRYPT, buflen,
  21707. aes_iv, buf, buf );
  21708. mbedtls_aes_free( &aes_ctx );
  21709. pem_zeroize( aes_key, keylen );
  21710. }
  21711. #endif /* MBEDTLS_AES_C */
  21712. #endif /* MBEDTLS_MD5_C && MBEDTLS_CIPHER_MODE_CBC &&
  21713. ( MBEDTLS_AES_C || MBEDTLS_DES_C ) */
  21714. int mbedtls_pem_read_buffer( mbedtls_pem_context *ctx, const char *header, const char *footer,
  21715. const unsigned char *data, const unsigned char *pwd,
  21716. size_t pwdlen, size_t *use_len )
  21717. {
  21718. int ret, enc;
  21719. size_t len;
  21720. unsigned char *buf;
  21721. const unsigned char *s1, *s2, *end;
  21722. #if defined(MBEDTLS_MD5_C) && defined(MBEDTLS_CIPHER_MODE_CBC) && \
  21723. ( defined(MBEDTLS_DES_C) || defined(MBEDTLS_AES_C) )
  21724. unsigned char pem_iv[16];
  21725. mbedtls_cipher_type_t enc_alg = MBEDTLS_CIPHER_NONE;
  21726. #else
  21727. ((void) pwd);
  21728. ((void) pwdlen);
  21729. #endif /* MBEDTLS_MD5_C && MBEDTLS_CIPHER_MODE_CBC &&
  21730. ( MBEDTLS_AES_C || MBEDTLS_DES_C ) */
  21731. if( ctx == NULL )
  21732. return( MBEDTLS_ERR_PEM_BAD_INPUT_DATA );
  21733. s1 = (unsigned char *) strstr( (const char *) data, header );
  21734. if( s1 == NULL )
  21735. return( MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT );
  21736. s2 = (unsigned char *) strstr( (const char *) data, footer );
  21737. if( s2 == NULL || s2 <= s1 )
  21738. return( MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT );
  21739. s1 += strlen( header );
  21740. if( *s1 == ' ' ) s1++;
  21741. if( *s1 == '\r' ) s1++;
  21742. if( *s1 == '\n' ) s1++;
  21743. else return( MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT );
  21744. end = s2;
  21745. end += strlen( footer );
  21746. if( *end == ' ' ) end++;
  21747. if( *end == '\r' ) end++;
  21748. if( *end == '\n' ) end++;
  21749. *use_len = end - data;
  21750. enc = 0;
  21751. if( memcmp( s1, "Proc-Type: 4,ENCRYPTED", 22 ) == 0 )
  21752. {
  21753. #if defined(MBEDTLS_MD5_C) && defined(MBEDTLS_CIPHER_MODE_CBC) && \
  21754. ( defined(MBEDTLS_DES_C) || defined(MBEDTLS_AES_C) )
  21755. enc++;
  21756. s1 += 22;
  21757. if( *s1 == '\r' ) s1++;
  21758. if( *s1 == '\n' ) s1++;
  21759. else return( MBEDTLS_ERR_PEM_INVALID_DATA );
  21760. #if defined(MBEDTLS_DES_C)
  21761. if( memcmp( s1, "DEK-Info: DES-EDE3-CBC,", 23 ) == 0 )
  21762. {
  21763. enc_alg = MBEDTLS_CIPHER_DES_EDE3_CBC;
  21764. s1 += 23;
  21765. if( pem_get_iv( s1, pem_iv, 8 ) != 0 )
  21766. return( MBEDTLS_ERR_PEM_INVALID_ENC_IV );
  21767. s1 += 16;
  21768. }
  21769. else if( memcmp( s1, "DEK-Info: DES-CBC,", 18 ) == 0 )
  21770. {
  21771. enc_alg = MBEDTLS_CIPHER_DES_CBC;
  21772. s1 += 18;
  21773. if( pem_get_iv( s1, pem_iv, 8) != 0 )
  21774. return( MBEDTLS_ERR_PEM_INVALID_ENC_IV );
  21775. s1 += 16;
  21776. }
  21777. #endif /* MBEDTLS_DES_C */
  21778. #if defined(MBEDTLS_AES_C)
  21779. if( memcmp( s1, "DEK-Info: AES-", 14 ) == 0 )
  21780. {
  21781. if( memcmp( s1, "DEK-Info: AES-128-CBC,", 22 ) == 0 )
  21782. enc_alg = MBEDTLS_CIPHER_AES_128_CBC;
  21783. else if( memcmp( s1, "DEK-Info: AES-192-CBC,", 22 ) == 0 )
  21784. enc_alg = MBEDTLS_CIPHER_AES_192_CBC;
  21785. else if( memcmp( s1, "DEK-Info: AES-256-CBC,", 22 ) == 0 )
  21786. enc_alg = MBEDTLS_CIPHER_AES_256_CBC;
  21787. else
  21788. return( MBEDTLS_ERR_PEM_UNKNOWN_ENC_ALG );
  21789. s1 += 22;
  21790. if( pem_get_iv( s1, pem_iv, 16 ) != 0 )
  21791. return( MBEDTLS_ERR_PEM_INVALID_ENC_IV );
  21792. s1 += 32;
  21793. }
  21794. #endif /* MBEDTLS_AES_C */
  21795. if( enc_alg == MBEDTLS_CIPHER_NONE )
  21796. return( MBEDTLS_ERR_PEM_UNKNOWN_ENC_ALG );
  21797. if( *s1 == '\r' ) s1++;
  21798. if( *s1 == '\n' ) s1++;
  21799. else return( MBEDTLS_ERR_PEM_INVALID_DATA );
  21800. #else
  21801. return( MBEDTLS_ERR_PEM_FEATURE_UNAVAILABLE );
  21802. #endif /* MBEDTLS_MD5_C && MBEDTLS_CIPHER_MODE_CBC &&
  21803. ( MBEDTLS_AES_C || MBEDTLS_DES_C ) */
  21804. }
  21805. if( s1 == s2 )
  21806. return( MBEDTLS_ERR_PEM_INVALID_DATA );
  21807. ret = mbedtls_base64_decode( NULL, 0, &len, s1, s2 - s1 );
  21808. if( ret == MBEDTLS_ERR_BASE64_INVALID_CHARACTER )
  21809. return( MBEDTLS_ERR_PEM_INVALID_DATA + ret );
  21810. if( ( buf = mbedtls_calloc( 1, len ) ) == NULL )
  21811. return( MBEDTLS_ERR_PEM_ALLOC_FAILED );
  21812. if( ( ret = mbedtls_base64_decode( buf, len, &len, s1, s2 - s1 ) ) != 0 )
  21813. {
  21814. mbedtls_free( buf );
  21815. return( MBEDTLS_ERR_PEM_INVALID_DATA + ret );
  21816. }
  21817. if( enc != 0 )
  21818. {
  21819. #if defined(MBEDTLS_MD5_C) && defined(MBEDTLS_CIPHER_MODE_CBC) && \
  21820. ( defined(MBEDTLS_DES_C) || defined(MBEDTLS_AES_C) )
  21821. if( pwd == NULL )
  21822. {
  21823. mbedtls_free( buf );
  21824. return( MBEDTLS_ERR_PEM_PASSWORD_REQUIRED );
  21825. }
  21826. #if defined(MBEDTLS_DES_C)
  21827. if( enc_alg == MBEDTLS_CIPHER_DES_EDE3_CBC )
  21828. pem_des3_decrypt( pem_iv, buf, len, pwd, pwdlen );
  21829. else if( enc_alg == MBEDTLS_CIPHER_DES_CBC )
  21830. pem_des_decrypt( pem_iv, buf, len, pwd, pwdlen );
  21831. #endif /* MBEDTLS_DES_C */
  21832. #if defined(MBEDTLS_AES_C)
  21833. if( enc_alg == MBEDTLS_CIPHER_AES_128_CBC )
  21834. pem_aes_decrypt( pem_iv, 16, buf, len, pwd, pwdlen );
  21835. else if( enc_alg == MBEDTLS_CIPHER_AES_192_CBC )
  21836. pem_aes_decrypt( pem_iv, 24, buf, len, pwd, pwdlen );
  21837. else if( enc_alg == MBEDTLS_CIPHER_AES_256_CBC )
  21838. pem_aes_decrypt( pem_iv, 32, buf, len, pwd, pwdlen );
  21839. #endif /* MBEDTLS_AES_C */
  21840. /*
  21841. * The result will be ASN.1 starting with a SEQUENCE tag, with 1 to 3
  21842. * length bytes (allow 4 to be sure) in all known use cases.
  21843. *
  21844. * Use that as heurisitic to try detecting password mismatchs.
  21845. */
  21846. if( len <= 2 || buf[0] != 0x30 || buf[1] > 0x83 )
  21847. {
  21848. mbedtls_free( buf );
  21849. return( MBEDTLS_ERR_PEM_PASSWORD_MISMATCH );
  21850. }
  21851. #else
  21852. mbedtls_free( buf );
  21853. return( MBEDTLS_ERR_PEM_FEATURE_UNAVAILABLE );
  21854. #endif /* MBEDTLS_MD5_C && MBEDTLS_CIPHER_MODE_CBC &&
  21855. ( MBEDTLS_AES_C || MBEDTLS_DES_C ) */
  21856. }
  21857. ctx->buf = buf;
  21858. ctx->buflen = len;
  21859. return( 0 );
  21860. }
  21861. void mbedtls_pem_free( mbedtls_pem_context *ctx )
  21862. {
  21863. mbedtls_free( ctx->buf );
  21864. mbedtls_free( ctx->info );
  21865. pem_zeroize( ctx, sizeof( mbedtls_pem_context ) );
  21866. }
  21867. #endif /* MBEDTLS_PEM_PARSE_C */
  21868. #if defined(MBEDTLS_PEM_WRITE_C)
  21869. int mbedtls_pem_write_buffer( const char *header, const char *footer,
  21870. const unsigned char *der_data, size_t der_len,
  21871. unsigned char *buf, size_t buf_len, size_t *olen )
  21872. {
  21873. int ret;
  21874. unsigned char *encode_buf, *c, *p = buf;
  21875. size_t len = 0, use_len, add_len = 0;
  21876. mbedtls_base64_encode( NULL, 0, &use_len, der_data, der_len );
  21877. add_len = strlen( header ) + strlen( footer ) + ( use_len / 64 ) + 1;
  21878. if( use_len + add_len > buf_len )
  21879. {
  21880. *olen = use_len + add_len;
  21881. return( MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL );
  21882. }
  21883. if( ( encode_buf = mbedtls_calloc( 1, use_len ) ) == NULL )
  21884. return( MBEDTLS_ERR_PEM_ALLOC_FAILED );
  21885. if( ( ret = mbedtls_base64_encode( encode_buf, use_len, &use_len, der_data,
  21886. der_len ) ) != 0 )
  21887. {
  21888. mbedtls_free( encode_buf );
  21889. return( ret );
  21890. }
  21891. memcpy( p, header, strlen( header ) );
  21892. p += strlen( header );
  21893. c = encode_buf;
  21894. while( use_len )
  21895. {
  21896. len = ( use_len > 64 ) ? 64 : use_len;
  21897. memcpy( p, c, len );
  21898. use_len -= len;
  21899. p += len;
  21900. c += len;
  21901. *p++ = '\n';
  21902. }
  21903. memcpy( p, footer, strlen( footer ) );
  21904. p += strlen( footer );
  21905. *p++ = '\0';
  21906. *olen = p - buf;
  21907. mbedtls_free( encode_buf );
  21908. return( 0 );
  21909. }
  21910. #endif /* MBEDTLS_PEM_WRITE_C */
  21911. #endif /* MBEDTLS_PEM_PARSE_C || MBEDTLS_PEM_WRITE_C */
  21912. /********* Start of file library/pk.c ************/
  21913. /*
  21914. * Public Key abstraction layer
  21915. *
  21916. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  21917. * SPDX-License-Identifier: Apache-2.0
  21918. *
  21919. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  21920. * not use this file except in compliance with the License.
  21921. * You may obtain a copy of the License at
  21922. *
  21923. * http://www.apache.org/licenses/LICENSE-2.0
  21924. *
  21925. * Unless required by applicable law or agreed to in writing, software
  21926. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  21927. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  21928. * See the License for the specific language governing permissions and
  21929. * limitations under the License.
  21930. *
  21931. * This file is part of mbed TLS (https://tls.mbed.org)
  21932. */
  21933. #if !defined(MBEDTLS_CONFIG_FILE)
  21934. #else
  21935. #endif
  21936. #if defined(MBEDTLS_PK_C)
  21937. #if defined(MBEDTLS_RSA_C)
  21938. #endif
  21939. #if defined(MBEDTLS_ECP_C)
  21940. #endif
  21941. #if defined(MBEDTLS_ECDSA_C)
  21942. #endif
  21943. /* Implementation that should never be optimized out by the compiler */
  21944. static void pk_zeroize( void *v, size_t n ) {
  21945. volatile unsigned char *p = v; while( n-- ) *p++ = 0;
  21946. }
  21947. /*
  21948. * Initialise a mbedtls_pk_context
  21949. */
  21950. void mbedtls_pk_init( mbedtls_pk_context *ctx )
  21951. {
  21952. if( ctx == NULL )
  21953. return;
  21954. ctx->pk_info = NULL;
  21955. ctx->pk_ctx = NULL;
  21956. }
  21957. /*
  21958. * Free (the components of) a mbedtls_pk_context
  21959. */
  21960. void mbedtls_pk_free( mbedtls_pk_context *ctx )
  21961. {
  21962. if( ctx == NULL || ctx->pk_info == NULL )
  21963. return;
  21964. ctx->pk_info->ctx_free_func( ctx->pk_ctx );
  21965. pk_zeroize( ctx, sizeof( mbedtls_pk_context ) );
  21966. }
  21967. /*
  21968. * Get pk_info structure from type
  21969. */
  21970. const mbedtls_pk_info_t * mbedtls_pk_info_from_type( mbedtls_pk_type_t pk_type )
  21971. {
  21972. switch( pk_type ) {
  21973. #if defined(MBEDTLS_RSA_C)
  21974. case MBEDTLS_PK_RSA:
  21975. return( &mbedtls_rsa_info );
  21976. #endif
  21977. #if defined(MBEDTLS_ECP_C)
  21978. case MBEDTLS_PK_ECKEY:
  21979. return( &mbedtls_eckey_info );
  21980. case MBEDTLS_PK_ECKEY_DH:
  21981. return( &mbedtls_eckeydh_info );
  21982. #endif
  21983. #if defined(MBEDTLS_ECDSA_C)
  21984. case MBEDTLS_PK_ECDSA:
  21985. return( &mbedtls_ecdsa_info );
  21986. #endif
  21987. /* MBEDTLS_PK_RSA_ALT omitted on purpose */
  21988. default:
  21989. return( NULL );
  21990. }
  21991. }
  21992. /*
  21993. * Initialise context
  21994. */
  21995. int mbedtls_pk_setup( mbedtls_pk_context *ctx, const mbedtls_pk_info_t *info )
  21996. {
  21997. if( ctx == NULL || info == NULL || ctx->pk_info != NULL )
  21998. return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );
  21999. if( ( ctx->pk_ctx = info->ctx_alloc_func() ) == NULL )
  22000. return( MBEDTLS_ERR_PK_ALLOC_FAILED );
  22001. ctx->pk_info = info;
  22002. return( 0 );
  22003. }
  22004. #if defined(MBEDTLS_PK_RSA_ALT_SUPPORT)
  22005. /*
  22006. * Initialize an RSA-alt context
  22007. */
  22008. int mbedtls_pk_setup_rsa_alt( mbedtls_pk_context *ctx, void * key,
  22009. mbedtls_pk_rsa_alt_decrypt_func decrypt_func,
  22010. mbedtls_pk_rsa_alt_sign_func sign_func,
  22011. mbedtls_pk_rsa_alt_key_len_func key_len_func )
  22012. {
  22013. mbedtls_rsa_alt_context *rsa_alt;
  22014. const mbedtls_pk_info_t *info = &mbedtls_rsa_alt_info;
  22015. if( ctx == NULL || ctx->pk_info != NULL )
  22016. return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );
  22017. if( ( ctx->pk_ctx = info->ctx_alloc_func() ) == NULL )
  22018. return( MBEDTLS_ERR_PK_ALLOC_FAILED );
  22019. ctx->pk_info = info;
  22020. rsa_alt = (mbedtls_rsa_alt_context *) ctx->pk_ctx;
  22021. rsa_alt->key = key;
  22022. rsa_alt->decrypt_func = decrypt_func;
  22023. rsa_alt->sign_func = sign_func;
  22024. rsa_alt->key_len_func = key_len_func;
  22025. return( 0 );
  22026. }
  22027. #endif /* MBEDTLS_PK_RSA_ALT_SUPPORT */
  22028. /*
  22029. * Tell if a PK can do the operations of the given type
  22030. */
  22031. int mbedtls_pk_can_do( const mbedtls_pk_context *ctx, mbedtls_pk_type_t type )
  22032. {
  22033. /* null or NONE context can't do anything */
  22034. if( ctx == NULL || ctx->pk_info == NULL )
  22035. return( 0 );
  22036. return( ctx->pk_info->can_do( type ) );
  22037. }
  22038. /*
  22039. * Helper for mbedtls_pk_sign and mbedtls_pk_verify
  22040. */
  22041. static inline int pk_hashlen_helper( mbedtls_md_type_t md_alg, size_t *hash_len )
  22042. {
  22043. const mbedtls_md_info_t *md_info;
  22044. if( *hash_len != 0 )
  22045. return( 0 );
  22046. if( ( md_info = mbedtls_md_info_from_type( md_alg ) ) == NULL )
  22047. return( -1 );
  22048. *hash_len = mbedtls_md_get_size( md_info );
  22049. return( 0 );
  22050. }
  22051. /*
  22052. * Verify a signature
  22053. */
  22054. int mbedtls_pk_verify( mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg,
  22055. const unsigned char *hash, size_t hash_len,
  22056. const unsigned char *sig, size_t sig_len )
  22057. {
  22058. if( ctx == NULL || ctx->pk_info == NULL ||
  22059. pk_hashlen_helper( md_alg, &hash_len ) != 0 )
  22060. return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );
  22061. if( ctx->pk_info->verify_func == NULL )
  22062. return( MBEDTLS_ERR_PK_TYPE_MISMATCH );
  22063. return( ctx->pk_info->verify_func( ctx->pk_ctx, md_alg, hash, hash_len,
  22064. sig, sig_len ) );
  22065. }
  22066. /*
  22067. * Verify a signature with options
  22068. */
  22069. int mbedtls_pk_verify_ext( mbedtls_pk_type_t type, const void *options,
  22070. mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg,
  22071. const unsigned char *hash, size_t hash_len,
  22072. const unsigned char *sig, size_t sig_len )
  22073. {
  22074. if( ctx == NULL || ctx->pk_info == NULL )
  22075. return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );
  22076. if( ! mbedtls_pk_can_do( ctx, type ) )
  22077. return( MBEDTLS_ERR_PK_TYPE_MISMATCH );
  22078. if( type == MBEDTLS_PK_RSASSA_PSS )
  22079. {
  22080. #if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_PKCS1_V21)
  22081. int ret;
  22082. const mbedtls_pk_rsassa_pss_options *pss_opts;
  22083. if( options == NULL )
  22084. return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );
  22085. pss_opts = (const mbedtls_pk_rsassa_pss_options *) options;
  22086. if( sig_len < mbedtls_pk_get_len( ctx ) )
  22087. return( MBEDTLS_ERR_RSA_VERIFY_FAILED );
  22088. ret = mbedtls_rsa_rsassa_pss_verify_ext( mbedtls_pk_rsa( *ctx ),
  22089. NULL, NULL, MBEDTLS_RSA_PUBLIC,
  22090. md_alg, (unsigned int) hash_len, hash,
  22091. pss_opts->mgf1_hash_id,
  22092. pss_opts->expected_salt_len,
  22093. sig );
  22094. if( ret != 0 )
  22095. return( ret );
  22096. if( sig_len > mbedtls_pk_get_len( ctx ) )
  22097. return( MBEDTLS_ERR_PK_SIG_LEN_MISMATCH );
  22098. return( 0 );
  22099. #else
  22100. return( MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE );
  22101. #endif
  22102. }
  22103. /* General case: no options */
  22104. if( options != NULL )
  22105. return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );
  22106. return( mbedtls_pk_verify( ctx, md_alg, hash, hash_len, sig, sig_len ) );
  22107. }
  22108. /*
  22109. * Make a signature
  22110. */
  22111. int mbedtls_pk_sign( mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg,
  22112. const unsigned char *hash, size_t hash_len,
  22113. unsigned char *sig, size_t *sig_len,
  22114. int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
  22115. {
  22116. if( ctx == NULL || ctx->pk_info == NULL ||
  22117. pk_hashlen_helper( md_alg, &hash_len ) != 0 )
  22118. return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );
  22119. if( ctx->pk_info->sign_func == NULL )
  22120. return( MBEDTLS_ERR_PK_TYPE_MISMATCH );
  22121. return( ctx->pk_info->sign_func( ctx->pk_ctx, md_alg, hash, hash_len,
  22122. sig, sig_len, f_rng, p_rng ) );
  22123. }
  22124. /*
  22125. * Decrypt message
  22126. */
  22127. int mbedtls_pk_decrypt( mbedtls_pk_context *ctx,
  22128. const unsigned char *input, size_t ilen,
  22129. unsigned char *output, size_t *olen, size_t osize,
  22130. int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
  22131. {
  22132. if( ctx == NULL || ctx->pk_info == NULL )
  22133. return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );
  22134. if( ctx->pk_info->decrypt_func == NULL )
  22135. return( MBEDTLS_ERR_PK_TYPE_MISMATCH );
  22136. return( ctx->pk_info->decrypt_func( ctx->pk_ctx, input, ilen,
  22137. output, olen, osize, f_rng, p_rng ) );
  22138. }
  22139. /*
  22140. * Encrypt message
  22141. */
  22142. int mbedtls_pk_encrypt( mbedtls_pk_context *ctx,
  22143. const unsigned char *input, size_t ilen,
  22144. unsigned char *output, size_t *olen, size_t osize,
  22145. int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
  22146. {
  22147. if( ctx == NULL || ctx->pk_info == NULL )
  22148. return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );
  22149. if( ctx->pk_info->encrypt_func == NULL )
  22150. return( MBEDTLS_ERR_PK_TYPE_MISMATCH );
  22151. return( ctx->pk_info->encrypt_func( ctx->pk_ctx, input, ilen,
  22152. output, olen, osize, f_rng, p_rng ) );
  22153. }
  22154. /*
  22155. * Check public-private key pair
  22156. */
  22157. int mbedtls_pk_check_pair( const mbedtls_pk_context *pub, const mbedtls_pk_context *prv )
  22158. {
  22159. if( pub == NULL || pub->pk_info == NULL ||
  22160. prv == NULL || prv->pk_info == NULL ||
  22161. prv->pk_info->check_pair_func == NULL )
  22162. {
  22163. return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );
  22164. }
  22165. if( prv->pk_info->type == MBEDTLS_PK_RSA_ALT )
  22166. {
  22167. if( pub->pk_info->type != MBEDTLS_PK_RSA )
  22168. return( MBEDTLS_ERR_PK_TYPE_MISMATCH );
  22169. }
  22170. else
  22171. {
  22172. if( pub->pk_info != prv->pk_info )
  22173. return( MBEDTLS_ERR_PK_TYPE_MISMATCH );
  22174. }
  22175. return( prv->pk_info->check_pair_func( pub->pk_ctx, prv->pk_ctx ) );
  22176. }
  22177. /*
  22178. * Get key size in bits
  22179. */
  22180. size_t mbedtls_pk_get_bitlen( const mbedtls_pk_context *ctx )
  22181. {
  22182. if( ctx == NULL || ctx->pk_info == NULL )
  22183. return( 0 );
  22184. return( ctx->pk_info->get_bitlen( ctx->pk_ctx ) );
  22185. }
  22186. /*
  22187. * Export debug information
  22188. */
  22189. int mbedtls_pk_debug( const mbedtls_pk_context *ctx, mbedtls_pk_debug_item *items )
  22190. {
  22191. if( ctx == NULL || ctx->pk_info == NULL )
  22192. return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );
  22193. if( ctx->pk_info->debug_func == NULL )
  22194. return( MBEDTLS_ERR_PK_TYPE_MISMATCH );
  22195. ctx->pk_info->debug_func( ctx->pk_ctx, items );
  22196. return( 0 );
  22197. }
  22198. /*
  22199. * Access the PK type name
  22200. */
  22201. const char *mbedtls_pk_get_name( const mbedtls_pk_context *ctx )
  22202. {
  22203. if( ctx == NULL || ctx->pk_info == NULL )
  22204. return( "invalid PK" );
  22205. return( ctx->pk_info->name );
  22206. }
  22207. /*
  22208. * Access the PK type
  22209. */
  22210. mbedtls_pk_type_t mbedtls_pk_get_type( const mbedtls_pk_context *ctx )
  22211. {
  22212. if( ctx == NULL || ctx->pk_info == NULL )
  22213. return( MBEDTLS_PK_NONE );
  22214. return( ctx->pk_info->type );
  22215. }
  22216. #endif /* MBEDTLS_PK_C */
  22217. /********* Start of file library/pk_wrap.c ************/
  22218. /*
  22219. * Public Key abstraction layer: wrapper functions
  22220. *
  22221. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  22222. * SPDX-License-Identifier: Apache-2.0
  22223. *
  22224. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  22225. * not use this file except in compliance with the License.
  22226. * You may obtain a copy of the License at
  22227. *
  22228. * http://www.apache.org/licenses/LICENSE-2.0
  22229. *
  22230. * Unless required by applicable law or agreed to in writing, software
  22231. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  22232. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  22233. * See the License for the specific language governing permissions and
  22234. * limitations under the License.
  22235. *
  22236. * This file is part of mbed TLS (https://tls.mbed.org)
  22237. */
  22238. #if !defined(MBEDTLS_CONFIG_FILE)
  22239. #else
  22240. #endif
  22241. #if defined(MBEDTLS_PK_C)
  22242. /* Even if RSA not activated, for the sake of RSA-alt */
  22243. #include <string.h>
  22244. #if defined(MBEDTLS_ECP_C)
  22245. #endif
  22246. #if defined(MBEDTLS_ECDSA_C)
  22247. #endif
  22248. #if defined(MBEDTLS_PLATFORM_C)
  22249. #else
  22250. #include <stdlib.h>
  22251. #define mbedtls_calloc calloc
  22252. #define mbedtls_free free
  22253. #endif
  22254. #if defined(MBEDTLS_PK_RSA_ALT_SUPPORT)
  22255. /* Implementation that should never be optimized out by the compiler */
  22256. static void pk_wrap_zeroize( void *v, size_t n ) {
  22257. volatile unsigned char *p = v; while( n-- ) *p++ = 0;
  22258. }
  22259. #endif
  22260. #if defined(MBEDTLS_RSA_C)
  22261. static int rsa_can_do( mbedtls_pk_type_t type )
  22262. {
  22263. return( type == MBEDTLS_PK_RSA ||
  22264. type == MBEDTLS_PK_RSASSA_PSS );
  22265. }
  22266. static size_t rsa_get_bitlen( const void *ctx )
  22267. {
  22268. return( 8 * ((const mbedtls_rsa_context *) ctx)->len );
  22269. }
  22270. static int rsa_verify_wrap( void *ctx, mbedtls_md_type_t md_alg,
  22271. const unsigned char *hash, size_t hash_len,
  22272. const unsigned char *sig, size_t sig_len )
  22273. {
  22274. int ret;
  22275. if( sig_len < ((mbedtls_rsa_context *) ctx)->len )
  22276. return( MBEDTLS_ERR_RSA_VERIFY_FAILED );
  22277. if( ( ret = mbedtls_rsa_pkcs1_verify( (mbedtls_rsa_context *) ctx, NULL, NULL,
  22278. MBEDTLS_RSA_PUBLIC, md_alg,
  22279. (unsigned int) hash_len, hash, sig ) ) != 0 )
  22280. return( ret );
  22281. if( sig_len > ((mbedtls_rsa_context *) ctx)->len )
  22282. return( MBEDTLS_ERR_PK_SIG_LEN_MISMATCH );
  22283. return( 0 );
  22284. }
  22285. static int rsa_sign_wrap( void *ctx, mbedtls_md_type_t md_alg,
  22286. const unsigned char *hash, size_t hash_len,
  22287. unsigned char *sig, size_t *sig_len,
  22288. int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
  22289. {
  22290. *sig_len = ((mbedtls_rsa_context *) ctx)->len;
  22291. return( mbedtls_rsa_pkcs1_sign( (mbedtls_rsa_context *) ctx, f_rng, p_rng, MBEDTLS_RSA_PRIVATE,
  22292. md_alg, (unsigned int) hash_len, hash, sig ) );
  22293. }
  22294. static int rsa_decrypt_wrap( void *ctx,
  22295. const unsigned char *input, size_t ilen,
  22296. unsigned char *output, size_t *olen, size_t osize,
  22297. int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
  22298. {
  22299. if( ilen != ((mbedtls_rsa_context *) ctx)->len )
  22300. return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  22301. return( mbedtls_rsa_pkcs1_decrypt( (mbedtls_rsa_context *) ctx, f_rng, p_rng,
  22302. MBEDTLS_RSA_PRIVATE, olen, input, output, osize ) );
  22303. }
  22304. static int rsa_encrypt_wrap( void *ctx,
  22305. const unsigned char *input, size_t ilen,
  22306. unsigned char *output, size_t *olen, size_t osize,
  22307. int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
  22308. {
  22309. *olen = ((mbedtls_rsa_context *) ctx)->len;
  22310. if( *olen > osize )
  22311. return( MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE );
  22312. return( mbedtls_rsa_pkcs1_encrypt( (mbedtls_rsa_context *) ctx,
  22313. f_rng, p_rng, MBEDTLS_RSA_PUBLIC, ilen, input, output ) );
  22314. }
  22315. static int rsa_check_pair_wrap( const void *pub, const void *prv )
  22316. {
  22317. return( mbedtls_rsa_check_pub_priv( (const mbedtls_rsa_context *) pub,
  22318. (const mbedtls_rsa_context *) prv ) );
  22319. }
  22320. static void *rsa_alloc_wrap( void )
  22321. {
  22322. void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_rsa_context ) );
  22323. if( ctx != NULL )
  22324. mbedtls_rsa_init( (mbedtls_rsa_context *) ctx, 0, 0 );
  22325. return( ctx );
  22326. }
  22327. static void rsa_free_wrap( void *ctx )
  22328. {
  22329. mbedtls_rsa_free( (mbedtls_rsa_context *) ctx );
  22330. mbedtls_free( ctx );
  22331. }
  22332. static void rsa_debug( const void *ctx, mbedtls_pk_debug_item *items )
  22333. {
  22334. items->type = MBEDTLS_PK_DEBUG_MPI;
  22335. items->name = "rsa.N";
  22336. items->value = &( ((mbedtls_rsa_context *) ctx)->N );
  22337. items++;
  22338. items->type = MBEDTLS_PK_DEBUG_MPI;
  22339. items->name = "rsa.E";
  22340. items->value = &( ((mbedtls_rsa_context *) ctx)->E );
  22341. }
  22342. const mbedtls_pk_info_t mbedtls_rsa_info = {
  22343. MBEDTLS_PK_RSA,
  22344. "RSA",
  22345. rsa_get_bitlen,
  22346. rsa_can_do,
  22347. rsa_verify_wrap,
  22348. rsa_sign_wrap,
  22349. rsa_decrypt_wrap,
  22350. rsa_encrypt_wrap,
  22351. rsa_check_pair_wrap,
  22352. rsa_alloc_wrap,
  22353. rsa_free_wrap,
  22354. rsa_debug,
  22355. };
  22356. #endif /* MBEDTLS_RSA_C */
  22357. #if defined(MBEDTLS_ECP_C)
  22358. /*
  22359. * Generic EC key
  22360. */
  22361. static int eckey_can_do( mbedtls_pk_type_t type )
  22362. {
  22363. return( type == MBEDTLS_PK_ECKEY ||
  22364. type == MBEDTLS_PK_ECKEY_DH ||
  22365. type == MBEDTLS_PK_ECDSA );
  22366. }
  22367. static size_t eckey_get_bitlen( const void *ctx )
  22368. {
  22369. return( ((mbedtls_ecp_keypair *) ctx)->grp.pbits );
  22370. }
  22371. #if defined(MBEDTLS_ECDSA_C)
  22372. /* Forward declarations */
  22373. static int ecdsa_verify_wrap( void *ctx, mbedtls_md_type_t md_alg,
  22374. const unsigned char *hash, size_t hash_len,
  22375. const unsigned char *sig, size_t sig_len );
  22376. static int ecdsa_sign_wrap( void *ctx, mbedtls_md_type_t md_alg,
  22377. const unsigned char *hash, size_t hash_len,
  22378. unsigned char *sig, size_t *sig_len,
  22379. int (*f_rng)(void *, unsigned char *, size_t), void *p_rng );
  22380. static int eckey_verify_wrap( void *ctx, mbedtls_md_type_t md_alg,
  22381. const unsigned char *hash, size_t hash_len,
  22382. const unsigned char *sig, size_t sig_len )
  22383. {
  22384. int ret;
  22385. mbedtls_ecdsa_context ecdsa;
  22386. mbedtls_ecdsa_init( &ecdsa );
  22387. if( ( ret = mbedtls_ecdsa_from_keypair( &ecdsa, ctx ) ) == 0 )
  22388. ret = ecdsa_verify_wrap( &ecdsa, md_alg, hash, hash_len, sig, sig_len );
  22389. mbedtls_ecdsa_free( &ecdsa );
  22390. return( ret );
  22391. }
  22392. static int eckey_sign_wrap( void *ctx, mbedtls_md_type_t md_alg,
  22393. const unsigned char *hash, size_t hash_len,
  22394. unsigned char *sig, size_t *sig_len,
  22395. int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
  22396. {
  22397. int ret;
  22398. mbedtls_ecdsa_context ecdsa;
  22399. mbedtls_ecdsa_init( &ecdsa );
  22400. if( ( ret = mbedtls_ecdsa_from_keypair( &ecdsa, ctx ) ) == 0 )
  22401. ret = ecdsa_sign_wrap( &ecdsa, md_alg, hash, hash_len, sig, sig_len,
  22402. f_rng, p_rng );
  22403. mbedtls_ecdsa_free( &ecdsa );
  22404. return( ret );
  22405. }
  22406. #endif /* MBEDTLS_ECDSA_C */
  22407. static int eckey_check_pair( const void *pub, const void *prv )
  22408. {
  22409. return( mbedtls_ecp_check_pub_priv( (const mbedtls_ecp_keypair *) pub,
  22410. (const mbedtls_ecp_keypair *) prv ) );
  22411. }
  22412. static void *eckey_alloc_wrap( void )
  22413. {
  22414. void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_ecp_keypair ) );
  22415. if( ctx != NULL )
  22416. mbedtls_ecp_keypair_init( ctx );
  22417. return( ctx );
  22418. }
  22419. static void eckey_free_wrap( void *ctx )
  22420. {
  22421. mbedtls_ecp_keypair_free( (mbedtls_ecp_keypair *) ctx );
  22422. mbedtls_free( ctx );
  22423. }
  22424. static void eckey_debug( const void *ctx, mbedtls_pk_debug_item *items )
  22425. {
  22426. items->type = MBEDTLS_PK_DEBUG_ECP;
  22427. items->name = "eckey.Q";
  22428. items->value = &( ((mbedtls_ecp_keypair *) ctx)->Q );
  22429. }
  22430. const mbedtls_pk_info_t mbedtls_eckey_info = {
  22431. MBEDTLS_PK_ECKEY,
  22432. "EC",
  22433. eckey_get_bitlen,
  22434. eckey_can_do,
  22435. #if defined(MBEDTLS_ECDSA_C)
  22436. eckey_verify_wrap,
  22437. eckey_sign_wrap,
  22438. #else
  22439. NULL,
  22440. NULL,
  22441. #endif
  22442. NULL,
  22443. NULL,
  22444. eckey_check_pair,
  22445. eckey_alloc_wrap,
  22446. eckey_free_wrap,
  22447. eckey_debug,
  22448. };
  22449. /*
  22450. * EC key restricted to ECDH
  22451. */
  22452. static int eckeydh_can_do( mbedtls_pk_type_t type )
  22453. {
  22454. return( type == MBEDTLS_PK_ECKEY ||
  22455. type == MBEDTLS_PK_ECKEY_DH );
  22456. }
  22457. const mbedtls_pk_info_t mbedtls_eckeydh_info = {
  22458. MBEDTLS_PK_ECKEY_DH,
  22459. "EC_DH",
  22460. eckey_get_bitlen, /* Same underlying key structure */
  22461. eckeydh_can_do,
  22462. NULL,
  22463. NULL,
  22464. NULL,
  22465. NULL,
  22466. eckey_check_pair,
  22467. eckey_alloc_wrap, /* Same underlying key structure */
  22468. eckey_free_wrap, /* Same underlying key structure */
  22469. eckey_debug, /* Same underlying key structure */
  22470. };
  22471. #endif /* MBEDTLS_ECP_C */
  22472. #if defined(MBEDTLS_ECDSA_C)
  22473. static int ecdsa_can_do( mbedtls_pk_type_t type )
  22474. {
  22475. return( type == MBEDTLS_PK_ECDSA );
  22476. }
  22477. static int ecdsa_verify_wrap( void *ctx, mbedtls_md_type_t md_alg,
  22478. const unsigned char *hash, size_t hash_len,
  22479. const unsigned char *sig, size_t sig_len )
  22480. {
  22481. int ret;
  22482. ((void) md_alg);
  22483. ret = mbedtls_ecdsa_read_signature( (mbedtls_ecdsa_context *) ctx,
  22484. hash, hash_len, sig, sig_len );
  22485. if( ret == MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH )
  22486. return( MBEDTLS_ERR_PK_SIG_LEN_MISMATCH );
  22487. return( ret );
  22488. }
  22489. static int ecdsa_sign_wrap( void *ctx, mbedtls_md_type_t md_alg,
  22490. const unsigned char *hash, size_t hash_len,
  22491. unsigned char *sig, size_t *sig_len,
  22492. int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
  22493. {
  22494. return( mbedtls_ecdsa_write_signature( (mbedtls_ecdsa_context *) ctx,
  22495. md_alg, hash, hash_len, sig, sig_len, f_rng, p_rng ) );
  22496. }
  22497. static void *ecdsa_alloc_wrap( void )
  22498. {
  22499. void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_ecdsa_context ) );
  22500. if( ctx != NULL )
  22501. mbedtls_ecdsa_init( (mbedtls_ecdsa_context *) ctx );
  22502. return( ctx );
  22503. }
  22504. static void ecdsa_free_wrap( void *ctx )
  22505. {
  22506. mbedtls_ecdsa_free( (mbedtls_ecdsa_context *) ctx );
  22507. mbedtls_free( ctx );
  22508. }
  22509. const mbedtls_pk_info_t mbedtls_ecdsa_info = {
  22510. MBEDTLS_PK_ECDSA,
  22511. "ECDSA",
  22512. eckey_get_bitlen, /* Compatible key structures */
  22513. ecdsa_can_do,
  22514. ecdsa_verify_wrap,
  22515. ecdsa_sign_wrap,
  22516. NULL,
  22517. NULL,
  22518. eckey_check_pair, /* Compatible key structures */
  22519. ecdsa_alloc_wrap,
  22520. ecdsa_free_wrap,
  22521. eckey_debug, /* Compatible key structures */
  22522. };
  22523. #endif /* MBEDTLS_ECDSA_C */
  22524. #if defined(MBEDTLS_PK_RSA_ALT_SUPPORT)
  22525. /*
  22526. * Support for alternative RSA-private implementations
  22527. */
  22528. static int rsa_alt_can_do( mbedtls_pk_type_t type )
  22529. {
  22530. return( type == MBEDTLS_PK_RSA );
  22531. }
  22532. static size_t rsa_alt_get_bitlen( const void *ctx )
  22533. {
  22534. const mbedtls_rsa_alt_context *rsa_alt = (const mbedtls_rsa_alt_context *) ctx;
  22535. return( 8 * rsa_alt->key_len_func( rsa_alt->key ) );
  22536. }
  22537. static int rsa_alt_sign_wrap( void *ctx, mbedtls_md_type_t md_alg,
  22538. const unsigned char *hash, size_t hash_len,
  22539. unsigned char *sig, size_t *sig_len,
  22540. int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
  22541. {
  22542. mbedtls_rsa_alt_context *rsa_alt = (mbedtls_rsa_alt_context *) ctx;
  22543. *sig_len = rsa_alt->key_len_func( rsa_alt->key );
  22544. return( rsa_alt->sign_func( rsa_alt->key, f_rng, p_rng, MBEDTLS_RSA_PRIVATE,
  22545. md_alg, (unsigned int) hash_len, hash, sig ) );
  22546. }
  22547. static int rsa_alt_decrypt_wrap( void *ctx,
  22548. const unsigned char *input, size_t ilen,
  22549. unsigned char *output, size_t *olen, size_t osize,
  22550. int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
  22551. {
  22552. mbedtls_rsa_alt_context *rsa_alt = (mbedtls_rsa_alt_context *) ctx;
  22553. ((void) f_rng);
  22554. ((void) p_rng);
  22555. if( ilen != rsa_alt->key_len_func( rsa_alt->key ) )
  22556. return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  22557. return( rsa_alt->decrypt_func( rsa_alt->key,
  22558. MBEDTLS_RSA_PRIVATE, olen, input, output, osize ) );
  22559. }
  22560. #if defined(MBEDTLS_RSA_C)
  22561. static int rsa_alt_check_pair( const void *pub, const void *prv )
  22562. {
  22563. unsigned char sig[MBEDTLS_MPI_MAX_SIZE];
  22564. unsigned char hash[32];
  22565. size_t sig_len = 0;
  22566. int ret;
  22567. if( rsa_alt_get_bitlen( prv ) != rsa_get_bitlen( pub ) )
  22568. return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED );
  22569. memset( hash, 0x2a, sizeof( hash ) );
  22570. if( ( ret = rsa_alt_sign_wrap( (void *) prv, MBEDTLS_MD_NONE,
  22571. hash, sizeof( hash ),
  22572. sig, &sig_len, NULL, NULL ) ) != 0 )
  22573. {
  22574. return( ret );
  22575. }
  22576. if( rsa_verify_wrap( (void *) pub, MBEDTLS_MD_NONE,
  22577. hash, sizeof( hash ), sig, sig_len ) != 0 )
  22578. {
  22579. return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED );
  22580. }
  22581. return( 0 );
  22582. }
  22583. #endif /* MBEDTLS_RSA_C */
  22584. static void *rsa_alt_alloc_wrap( void )
  22585. {
  22586. void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_rsa_alt_context ) );
  22587. if( ctx != NULL )
  22588. memset( ctx, 0, sizeof( mbedtls_rsa_alt_context ) );
  22589. return( ctx );
  22590. }
  22591. static void rsa_alt_free_wrap( void *ctx )
  22592. {
  22593. pk_wrap_zeroize( ctx, sizeof( mbedtls_rsa_alt_context ) );
  22594. mbedtls_free( ctx );
  22595. }
  22596. const mbedtls_pk_info_t mbedtls_rsa_alt_info = {
  22597. MBEDTLS_PK_RSA_ALT,
  22598. "RSA-alt",
  22599. rsa_alt_get_bitlen,
  22600. rsa_alt_can_do,
  22601. NULL,
  22602. rsa_alt_sign_wrap,
  22603. rsa_alt_decrypt_wrap,
  22604. NULL,
  22605. #if defined(MBEDTLS_RSA_C)
  22606. rsa_alt_check_pair,
  22607. #else
  22608. NULL,
  22609. #endif
  22610. rsa_alt_alloc_wrap,
  22611. rsa_alt_free_wrap,
  22612. NULL,
  22613. };
  22614. #endif /* MBEDTLS_PK_RSA_ALT_SUPPORT */
  22615. #endif /* MBEDTLS_PK_C */
  22616. /********* Start of file library/pkcs11.c ************/
  22617. /**
  22618. * \file pkcs11.c
  22619. *
  22620. * \brief Wrapper for PKCS#11 library libpkcs11-helper
  22621. *
  22622. * \author Adriaan de Jong <dejong@fox-it.com>
  22623. *
  22624. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  22625. * SPDX-License-Identifier: Apache-2.0
  22626. *
  22627. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  22628. * not use this file except in compliance with the License.
  22629. * You may obtain a copy of the License at
  22630. *
  22631. * http://www.apache.org/licenses/LICENSE-2.0
  22632. *
  22633. * Unless required by applicable law or agreed to in writing, software
  22634. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  22635. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  22636. * See the License for the specific language governing permissions and
  22637. * limitations under the License.
  22638. *
  22639. * This file is part of mbed TLS (https://tls.mbed.org)
  22640. */
  22641. #if defined(MBEDTLS_PKCS11_C)
  22642. #if defined(MBEDTLS_PLATFORM_C)
  22643. #else
  22644. #include <stdlib.h>
  22645. #define mbedtls_calloc calloc
  22646. #define mbedtls_free free
  22647. #endif
  22648. #include <string.h>
  22649. void mbedtls_pkcs11_init( mbedtls_pkcs11_context *ctx )
  22650. {
  22651. memset( ctx, 0, sizeof( mbedtls_pkcs11_context ) );
  22652. }
  22653. int mbedtls_pkcs11_x509_cert_bind( mbedtls_x509_crt *cert, pkcs11h_certificate_t pkcs11_cert )
  22654. {
  22655. int ret = 1;
  22656. unsigned char *cert_blob = NULL;
  22657. size_t cert_blob_size = 0;
  22658. if( cert == NULL )
  22659. {
  22660. ret = 2;
  22661. goto cleanup;
  22662. }
  22663. if( pkcs11h_certificate_getCertificateBlob( pkcs11_cert, NULL,
  22664. &cert_blob_size ) != CKR_OK )
  22665. {
  22666. ret = 3;
  22667. goto cleanup;
  22668. }
  22669. cert_blob = mbedtls_calloc( 1, cert_blob_size );
  22670. if( NULL == cert_blob )
  22671. {
  22672. ret = 4;
  22673. goto cleanup;
  22674. }
  22675. if( pkcs11h_certificate_getCertificateBlob( pkcs11_cert, cert_blob,
  22676. &cert_blob_size ) != CKR_OK )
  22677. {
  22678. ret = 5;
  22679. goto cleanup;
  22680. }
  22681. if( 0 != mbedtls_x509_crt_parse( cert, cert_blob, cert_blob_size ) )
  22682. {
  22683. ret = 6;
  22684. goto cleanup;
  22685. }
  22686. ret = 0;
  22687. cleanup:
  22688. if( NULL != cert_blob )
  22689. mbedtls_free( cert_blob );
  22690. return( ret );
  22691. }
  22692. int mbedtls_pkcs11_priv_key_bind( mbedtls_pkcs11_context *priv_key,
  22693. pkcs11h_certificate_t pkcs11_cert )
  22694. {
  22695. int ret = 1;
  22696. mbedtls_x509_crt cert;
  22697. mbedtls_x509_crt_init( &cert );
  22698. if( priv_key == NULL )
  22699. goto cleanup;
  22700. if( 0 != mbedtls_pkcs11_x509_cert_bind( &cert, pkcs11_cert ) )
  22701. goto cleanup;
  22702. priv_key->len = mbedtls_pk_get_len( &cert.pk );
  22703. priv_key->pkcs11h_cert = pkcs11_cert;
  22704. ret = 0;
  22705. cleanup:
  22706. mbedtls_x509_crt_free( &cert );
  22707. return( ret );
  22708. }
  22709. void mbedtls_pkcs11_priv_key_free( mbedtls_pkcs11_context *priv_key )
  22710. {
  22711. if( NULL != priv_key )
  22712. pkcs11h_certificate_freeCertificate( priv_key->pkcs11h_cert );
  22713. }
  22714. int mbedtls_pkcs11_decrypt( mbedtls_pkcs11_context *ctx,
  22715. int mode, size_t *olen,
  22716. const unsigned char *input,
  22717. unsigned char *output,
  22718. size_t output_max_len )
  22719. {
  22720. size_t input_len, output_len;
  22721. if( NULL == ctx )
  22722. return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  22723. if( MBEDTLS_RSA_PRIVATE != mode )
  22724. return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  22725. output_len = input_len = ctx->len;
  22726. if( input_len < 16 || input_len > output_max_len )
  22727. return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  22728. /* Determine size of output buffer */
  22729. if( pkcs11h_certificate_decryptAny( ctx->pkcs11h_cert, CKM_RSA_PKCS, input,
  22730. input_len, NULL, &output_len ) != CKR_OK )
  22731. {
  22732. return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  22733. }
  22734. if( output_len > output_max_len )
  22735. return( MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE );
  22736. if( pkcs11h_certificate_decryptAny( ctx->pkcs11h_cert, CKM_RSA_PKCS, input,
  22737. input_len, output, &output_len ) != CKR_OK )
  22738. {
  22739. return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  22740. }
  22741. *olen = output_len;
  22742. return( 0 );
  22743. }
  22744. int mbedtls_pkcs11_sign( mbedtls_pkcs11_context *ctx,
  22745. int mode,
  22746. mbedtls_md_type_t md_alg,
  22747. unsigned int hashlen,
  22748. const unsigned char *hash,
  22749. unsigned char *sig )
  22750. {
  22751. size_t sig_len = 0, asn_len = 0, oid_size = 0;
  22752. unsigned char *p = sig;
  22753. const char *oid;
  22754. if( NULL == ctx )
  22755. return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  22756. if( MBEDTLS_RSA_PRIVATE != mode )
  22757. return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  22758. if( md_alg != MBEDTLS_MD_NONE )
  22759. {
  22760. const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type( md_alg );
  22761. if( md_info == NULL )
  22762. return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  22763. if( mbedtls_oid_get_oid_by_md( md_alg, &oid, &oid_size ) != 0 )
  22764. return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  22765. hashlen = mbedtls_md_get_size( md_info );
  22766. asn_len = 10 + oid_size;
  22767. }
  22768. sig_len = ctx->len;
  22769. if( hashlen > sig_len || asn_len > sig_len ||
  22770. hashlen + asn_len > sig_len )
  22771. {
  22772. return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  22773. }
  22774. if( md_alg != MBEDTLS_MD_NONE )
  22775. {
  22776. /*
  22777. * DigestInfo ::= SEQUENCE {
  22778. * digestAlgorithm DigestAlgorithmIdentifier,
  22779. * digest Digest }
  22780. *
  22781. * DigestAlgorithmIdentifier ::= AlgorithmIdentifier
  22782. *
  22783. * Digest ::= OCTET STRING
  22784. */
  22785. *p++ = MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED;
  22786. *p++ = (unsigned char) ( 0x08 + oid_size + hashlen );
  22787. *p++ = MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED;
  22788. *p++ = (unsigned char) ( 0x04 + oid_size );
  22789. *p++ = MBEDTLS_ASN1_OID;
  22790. *p++ = oid_size & 0xFF;
  22791. memcpy( p, oid, oid_size );
  22792. p += oid_size;
  22793. *p++ = MBEDTLS_ASN1_NULL;
  22794. *p++ = 0x00;
  22795. *p++ = MBEDTLS_ASN1_OCTET_STRING;
  22796. *p++ = hashlen;
  22797. }
  22798. memcpy( p, hash, hashlen );
  22799. if( pkcs11h_certificate_signAny( ctx->pkcs11h_cert, CKM_RSA_PKCS, sig,
  22800. asn_len + hashlen, sig, &sig_len ) != CKR_OK )
  22801. {
  22802. return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  22803. }
  22804. return( 0 );
  22805. }
  22806. #endif /* defined(MBEDTLS_PKCS11_C) */
  22807. /********* Start of file library/pkcs12.c ************/
  22808. /*
  22809. * PKCS#12 Personal Information Exchange Syntax
  22810. *
  22811. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  22812. * SPDX-License-Identifier: Apache-2.0
  22813. *
  22814. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  22815. * not use this file except in compliance with the License.
  22816. * You may obtain a copy of the License at
  22817. *
  22818. * http://www.apache.org/licenses/LICENSE-2.0
  22819. *
  22820. * Unless required by applicable law or agreed to in writing, software
  22821. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  22822. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  22823. * See the License for the specific language governing permissions and
  22824. * limitations under the License.
  22825. *
  22826. * This file is part of mbed TLS (https://tls.mbed.org)
  22827. */
  22828. /*
  22829. * The PKCS #12 Personal Information Exchange Syntax Standard v1.1
  22830. *
  22831. * http://www.rsa.com/rsalabs/pkcs/files/h11301-wp-pkcs-12v1-1-personal-information-exchange-syntax.pdf
  22832. * ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-12/pkcs-12v1-1.asn
  22833. */
  22834. #if !defined(MBEDTLS_CONFIG_FILE)
  22835. #else
  22836. #endif
  22837. #if defined(MBEDTLS_PKCS12_C)
  22838. #include <string.h>
  22839. #if defined(MBEDTLS_ARC4_C)
  22840. #endif
  22841. #if defined(MBEDTLS_DES_C)
  22842. #endif
  22843. /* Implementation that should never be optimized out by the compiler */
  22844. static void pkcs_zeroize( void *v, size_t n ) {
  22845. volatile unsigned char *p = v; while( n-- ) *p++ = 0;
  22846. }
  22847. static int pkcs12_parse_pbe_params( mbedtls_asn1_buf *params,
  22848. mbedtls_asn1_buf *salt, int *iterations )
  22849. {
  22850. int ret;
  22851. unsigned char **p = &params->p;
  22852. const unsigned char *end = params->p + params->len;
  22853. /*
  22854. * pkcs-12PbeParams ::= SEQUENCE {
  22855. * salt OCTET STRING,
  22856. * iterations INTEGER
  22857. * }
  22858. *
  22859. */
  22860. if( params->tag != ( MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) )
  22861. return( MBEDTLS_ERR_PKCS12_PBE_INVALID_FORMAT +
  22862. MBEDTLS_ERR_ASN1_UNEXPECTED_TAG );
  22863. if( ( ret = mbedtls_asn1_get_tag( p, end, &salt->len, MBEDTLS_ASN1_OCTET_STRING ) ) != 0 )
  22864. return( MBEDTLS_ERR_PKCS12_PBE_INVALID_FORMAT + ret );
  22865. salt->p = *p;
  22866. *p += salt->len;
  22867. if( ( ret = mbedtls_asn1_get_int( p, end, iterations ) ) != 0 )
  22868. return( MBEDTLS_ERR_PKCS12_PBE_INVALID_FORMAT + ret );
  22869. if( *p != end )
  22870. return( MBEDTLS_ERR_PKCS12_PBE_INVALID_FORMAT +
  22871. MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
  22872. return( 0 );
  22873. }
  22874. #define PKCS12_MAX_PWDLEN 128
  22875. static int pkcs12_pbe_derive_key_iv( mbedtls_asn1_buf *pbe_params, mbedtls_md_type_t md_type,
  22876. const unsigned char *pwd, size_t pwdlen,
  22877. unsigned char *key, size_t keylen,
  22878. unsigned char *iv, size_t ivlen )
  22879. {
  22880. int ret, iterations;
  22881. mbedtls_asn1_buf salt;
  22882. size_t i;
  22883. unsigned char unipwd[PKCS12_MAX_PWDLEN * 2 + 2];
  22884. if( pwdlen > PKCS12_MAX_PWDLEN )
  22885. return( MBEDTLS_ERR_PKCS12_BAD_INPUT_DATA );
  22886. memset( &salt, 0, sizeof(mbedtls_asn1_buf) );
  22887. memset( &unipwd, 0, sizeof(unipwd) );
  22888. if( ( ret = pkcs12_parse_pbe_params( pbe_params, &salt,
  22889. &iterations ) ) != 0 )
  22890. return( ret );
  22891. for( i = 0; i < pwdlen; i++ )
  22892. unipwd[i * 2 + 1] = pwd[i];
  22893. if( ( ret = mbedtls_pkcs12_derivation( key, keylen, unipwd, pwdlen * 2 + 2,
  22894. salt.p, salt.len, md_type,
  22895. MBEDTLS_PKCS12_DERIVE_KEY, iterations ) ) != 0 )
  22896. {
  22897. return( ret );
  22898. }
  22899. if( iv == NULL || ivlen == 0 )
  22900. return( 0 );
  22901. if( ( ret = mbedtls_pkcs12_derivation( iv, ivlen, unipwd, pwdlen * 2 + 2,
  22902. salt.p, salt.len, md_type,
  22903. MBEDTLS_PKCS12_DERIVE_IV, iterations ) ) != 0 )
  22904. {
  22905. return( ret );
  22906. }
  22907. return( 0 );
  22908. }
  22909. #undef PKCS12_MAX_PWDLEN
  22910. int mbedtls_pkcs12_pbe_sha1_rc4_128( mbedtls_asn1_buf *pbe_params, int mode,
  22911. const unsigned char *pwd, size_t pwdlen,
  22912. const unsigned char *data, size_t len,
  22913. unsigned char *output )
  22914. {
  22915. #if !defined(MBEDTLS_ARC4_C)
  22916. ((void) pbe_params);
  22917. ((void) mode);
  22918. ((void) pwd);
  22919. ((void) pwdlen);
  22920. ((void) data);
  22921. ((void) len);
  22922. ((void) output);
  22923. return( MBEDTLS_ERR_PKCS12_FEATURE_UNAVAILABLE );
  22924. #else
  22925. int ret;
  22926. unsigned char key[16];
  22927. mbedtls_arc4_context ctx;
  22928. ((void) mode);
  22929. mbedtls_arc4_init( &ctx );
  22930. if( ( ret = pkcs12_pbe_derive_key_iv( pbe_params, MBEDTLS_MD_SHA1,
  22931. pwd, pwdlen,
  22932. key, 16, NULL, 0 ) ) != 0 )
  22933. {
  22934. return( ret );
  22935. }
  22936. mbedtls_arc4_setup( &ctx, key, 16 );
  22937. if( ( ret = mbedtls_arc4_crypt( &ctx, len, data, output ) ) != 0 )
  22938. goto exit;
  22939. exit:
  22940. pkcs_zeroize( key, sizeof( key ) );
  22941. mbedtls_arc4_free( &ctx );
  22942. return( ret );
  22943. #endif /* MBEDTLS_ARC4_C */
  22944. }
  22945. int mbedtls_pkcs12_pbe( mbedtls_asn1_buf *pbe_params, int mode,
  22946. mbedtls_cipher_type_t cipher_type, mbedtls_md_type_t md_type,
  22947. const unsigned char *pwd, size_t pwdlen,
  22948. const unsigned char *data, size_t len,
  22949. unsigned char *output )
  22950. {
  22951. int ret, keylen = 0;
  22952. unsigned char key[32];
  22953. unsigned char iv[16];
  22954. const mbedtls_cipher_info_t *cipher_info;
  22955. mbedtls_cipher_context_t cipher_ctx;
  22956. size_t olen = 0;
  22957. cipher_info = mbedtls_cipher_info_from_type( cipher_type );
  22958. if( cipher_info == NULL )
  22959. return( MBEDTLS_ERR_PKCS12_FEATURE_UNAVAILABLE );
  22960. keylen = cipher_info->key_bitlen / 8;
  22961. if( ( ret = pkcs12_pbe_derive_key_iv( pbe_params, md_type, pwd, pwdlen,
  22962. key, keylen,
  22963. iv, cipher_info->iv_size ) ) != 0 )
  22964. {
  22965. return( ret );
  22966. }
  22967. mbedtls_cipher_init( &cipher_ctx );
  22968. if( ( ret = mbedtls_cipher_setup( &cipher_ctx, cipher_info ) ) != 0 )
  22969. goto exit;
  22970. if( ( ret = mbedtls_cipher_setkey( &cipher_ctx, key, 8 * keylen, (mbedtls_operation_t) mode ) ) != 0 )
  22971. goto exit;
  22972. if( ( ret = mbedtls_cipher_set_iv( &cipher_ctx, iv, cipher_info->iv_size ) ) != 0 )
  22973. goto exit;
  22974. if( ( ret = mbedtls_cipher_reset( &cipher_ctx ) ) != 0 )
  22975. goto exit;
  22976. if( ( ret = mbedtls_cipher_update( &cipher_ctx, data, len,
  22977. output, &olen ) ) != 0 )
  22978. {
  22979. goto exit;
  22980. }
  22981. if( ( ret = mbedtls_cipher_finish( &cipher_ctx, output + olen, &olen ) ) != 0 )
  22982. ret = MBEDTLS_ERR_PKCS12_PASSWORD_MISMATCH;
  22983. exit:
  22984. pkcs_zeroize( key, sizeof( key ) );
  22985. pkcs_zeroize( iv, sizeof( iv ) );
  22986. mbedtls_cipher_free( &cipher_ctx );
  22987. return( ret );
  22988. }
  22989. static void pkcs12_fill_buffer( unsigned char *data, size_t data_len,
  22990. const unsigned char *filler, size_t fill_len )
  22991. {
  22992. unsigned char *p = data;
  22993. size_t use_len;
  22994. while( data_len > 0 )
  22995. {
  22996. use_len = ( data_len > fill_len ) ? fill_len : data_len;
  22997. memcpy( p, filler, use_len );
  22998. p += use_len;
  22999. data_len -= use_len;
  23000. }
  23001. }
  23002. int mbedtls_pkcs12_derivation( unsigned char *data, size_t datalen,
  23003. const unsigned char *pwd, size_t pwdlen,
  23004. const unsigned char *salt, size_t saltlen,
  23005. mbedtls_md_type_t md_type, int id, int iterations )
  23006. {
  23007. int ret;
  23008. unsigned int j;
  23009. unsigned char diversifier[128];
  23010. unsigned char salt_block[128], pwd_block[128], hash_block[128];
  23011. unsigned char hash_output[MBEDTLS_MD_MAX_SIZE];
  23012. unsigned char *p;
  23013. unsigned char c;
  23014. size_t hlen, use_len, v, i;
  23015. const mbedtls_md_info_t *md_info;
  23016. mbedtls_md_context_t md_ctx;
  23017. // This version only allows max of 64 bytes of password or salt
  23018. if( datalen > 128 || pwdlen > 64 || saltlen > 64 )
  23019. return( MBEDTLS_ERR_PKCS12_BAD_INPUT_DATA );
  23020. md_info = mbedtls_md_info_from_type( md_type );
  23021. if( md_info == NULL )
  23022. return( MBEDTLS_ERR_PKCS12_FEATURE_UNAVAILABLE );
  23023. mbedtls_md_init( &md_ctx );
  23024. if( ( ret = mbedtls_md_setup( &md_ctx, md_info, 0 ) ) != 0 )
  23025. return( ret );
  23026. hlen = mbedtls_md_get_size( md_info );
  23027. if( hlen <= 32 )
  23028. v = 64;
  23029. else
  23030. v = 128;
  23031. memset( diversifier, (unsigned char) id, v );
  23032. pkcs12_fill_buffer( salt_block, v, salt, saltlen );
  23033. pkcs12_fill_buffer( pwd_block, v, pwd, pwdlen );
  23034. p = data;
  23035. while( datalen > 0 )
  23036. {
  23037. // Calculate hash( diversifier || salt_block || pwd_block )
  23038. if( ( ret = mbedtls_md_starts( &md_ctx ) ) != 0 )
  23039. goto exit;
  23040. if( ( ret = mbedtls_md_update( &md_ctx, diversifier, v ) ) != 0 )
  23041. goto exit;
  23042. if( ( ret = mbedtls_md_update( &md_ctx, salt_block, v ) ) != 0 )
  23043. goto exit;
  23044. if( ( ret = mbedtls_md_update( &md_ctx, pwd_block, v ) ) != 0 )
  23045. goto exit;
  23046. if( ( ret = mbedtls_md_finish( &md_ctx, hash_output ) ) != 0 )
  23047. goto exit;
  23048. // Perform remaining ( iterations - 1 ) recursive hash calculations
  23049. for( i = 1; i < (size_t) iterations; i++ )
  23050. {
  23051. if( ( ret = mbedtls_md( md_info, hash_output, hlen, hash_output ) ) != 0 )
  23052. goto exit;
  23053. }
  23054. use_len = ( datalen > hlen ) ? hlen : datalen;
  23055. memcpy( p, hash_output, use_len );
  23056. datalen -= use_len;
  23057. p += use_len;
  23058. if( datalen == 0 )
  23059. break;
  23060. // Concatenating copies of hash_output into hash_block (B)
  23061. pkcs12_fill_buffer( hash_block, v, hash_output, hlen );
  23062. // B += 1
  23063. for( i = v; i > 0; i-- )
  23064. if( ++hash_block[i - 1] != 0 )
  23065. break;
  23066. // salt_block += B
  23067. c = 0;
  23068. for( i = v; i > 0; i-- )
  23069. {
  23070. j = salt_block[i - 1] + hash_block[i - 1] + c;
  23071. c = (unsigned char) (j >> 8);
  23072. salt_block[i - 1] = j & 0xFF;
  23073. }
  23074. // pwd_block += B
  23075. c = 0;
  23076. for( i = v; i > 0; i-- )
  23077. {
  23078. j = pwd_block[i - 1] + hash_block[i - 1] + c;
  23079. c = (unsigned char) (j >> 8);
  23080. pwd_block[i - 1] = j & 0xFF;
  23081. }
  23082. }
  23083. ret = 0;
  23084. exit:
  23085. pkcs_zeroize( salt_block, sizeof( salt_block ) );
  23086. pkcs_zeroize( pwd_block, sizeof( pwd_block ) );
  23087. pkcs_zeroize( hash_block, sizeof( hash_block ) );
  23088. pkcs_zeroize( hash_output, sizeof( hash_output ) );
  23089. mbedtls_md_free( &md_ctx );
  23090. return( ret );
  23091. }
  23092. #endif /* MBEDTLS_PKCS12_C */
  23093. /********* Start of file library/pkcs5.c ************/
  23094. /**
  23095. * \file pkcs5.c
  23096. *
  23097. * \brief PKCS#5 functions
  23098. *
  23099. * \author Mathias Olsson <mathias@kompetensum.com>
  23100. *
  23101. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  23102. * SPDX-License-Identifier: Apache-2.0
  23103. *
  23104. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  23105. * not use this file except in compliance with the License.
  23106. * You may obtain a copy of the License at
  23107. *
  23108. * http://www.apache.org/licenses/LICENSE-2.0
  23109. *
  23110. * Unless required by applicable law or agreed to in writing, software
  23111. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  23112. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  23113. * See the License for the specific language governing permissions and
  23114. * limitations under the License.
  23115. *
  23116. * This file is part of mbed TLS (https://tls.mbed.org)
  23117. */
  23118. /*
  23119. * PKCS#5 includes PBKDF2 and more
  23120. *
  23121. * http://tools.ietf.org/html/rfc2898 (Specification)
  23122. * http://tools.ietf.org/html/rfc6070 (Test vectors)
  23123. */
  23124. #if !defined(MBEDTLS_CONFIG_FILE)
  23125. #else
  23126. #endif
  23127. #if defined(MBEDTLS_PKCS5_C)
  23128. #include <string.h>
  23129. #if defined(MBEDTLS_PLATFORM_C)
  23130. #else
  23131. #include <stdio.h>
  23132. #define mbedtls_printf printf
  23133. #endif
  23134. static int pkcs5_parse_pbkdf2_params( const mbedtls_asn1_buf *params,
  23135. mbedtls_asn1_buf *salt, int *iterations,
  23136. int *keylen, mbedtls_md_type_t *md_type )
  23137. {
  23138. int ret;
  23139. mbedtls_asn1_buf prf_alg_oid;
  23140. unsigned char *p = params->p;
  23141. const unsigned char *end = params->p + params->len;
  23142. if( params->tag != ( MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) )
  23143. return( MBEDTLS_ERR_PKCS5_INVALID_FORMAT +
  23144. MBEDTLS_ERR_ASN1_UNEXPECTED_TAG );
  23145. /*
  23146. * PBKDF2-params ::= SEQUENCE {
  23147. * salt OCTET STRING,
  23148. * iterationCount INTEGER,
  23149. * keyLength INTEGER OPTIONAL
  23150. * prf AlgorithmIdentifier DEFAULT algid-hmacWithSHA1
  23151. * }
  23152. *
  23153. */
  23154. if( ( ret = mbedtls_asn1_get_tag( &p, end, &salt->len, MBEDTLS_ASN1_OCTET_STRING ) ) != 0 )
  23155. return( MBEDTLS_ERR_PKCS5_INVALID_FORMAT + ret );
  23156. salt->p = p;
  23157. p += salt->len;
  23158. if( ( ret = mbedtls_asn1_get_int( &p, end, iterations ) ) != 0 )
  23159. return( MBEDTLS_ERR_PKCS5_INVALID_FORMAT + ret );
  23160. if( p == end )
  23161. return( 0 );
  23162. if( ( ret = mbedtls_asn1_get_int( &p, end, keylen ) ) != 0 )
  23163. {
  23164. if( ret != MBEDTLS_ERR_ASN1_UNEXPECTED_TAG )
  23165. return( MBEDTLS_ERR_PKCS5_INVALID_FORMAT + ret );
  23166. }
  23167. if( p == end )
  23168. return( 0 );
  23169. if( ( ret = mbedtls_asn1_get_alg_null( &p, end, &prf_alg_oid ) ) != 0 )
  23170. return( MBEDTLS_ERR_PKCS5_INVALID_FORMAT + ret );
  23171. if( MBEDTLS_OID_CMP( MBEDTLS_OID_HMAC_SHA1, &prf_alg_oid ) != 0 )
  23172. return( MBEDTLS_ERR_PKCS5_FEATURE_UNAVAILABLE );
  23173. *md_type = MBEDTLS_MD_SHA1;
  23174. if( p != end )
  23175. return( MBEDTLS_ERR_PKCS5_INVALID_FORMAT +
  23176. MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
  23177. return( 0 );
  23178. }
  23179. int mbedtls_pkcs5_pbes2( const mbedtls_asn1_buf *pbe_params, int mode,
  23180. const unsigned char *pwd, size_t pwdlen,
  23181. const unsigned char *data, size_t datalen,
  23182. unsigned char *output )
  23183. {
  23184. int ret, iterations = 0, keylen = 0;
  23185. unsigned char *p, *end;
  23186. mbedtls_asn1_buf kdf_alg_oid, enc_scheme_oid, kdf_alg_params, enc_scheme_params;
  23187. mbedtls_asn1_buf salt;
  23188. mbedtls_md_type_t md_type = MBEDTLS_MD_SHA1;
  23189. unsigned char key[32], iv[32];
  23190. size_t olen = 0;
  23191. const mbedtls_md_info_t *md_info;
  23192. const mbedtls_cipher_info_t *cipher_info;
  23193. mbedtls_md_context_t md_ctx;
  23194. mbedtls_cipher_type_t cipher_alg;
  23195. mbedtls_cipher_context_t cipher_ctx;
  23196. p = pbe_params->p;
  23197. end = p + pbe_params->len;
  23198. /*
  23199. * PBES2-params ::= SEQUENCE {
  23200. * keyDerivationFunc AlgorithmIdentifier {{PBES2-KDFs}},
  23201. * encryptionScheme AlgorithmIdentifier {{PBES2-Encs}}
  23202. * }
  23203. */
  23204. if( pbe_params->tag != ( MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) )
  23205. return( MBEDTLS_ERR_PKCS5_INVALID_FORMAT +
  23206. MBEDTLS_ERR_ASN1_UNEXPECTED_TAG );
  23207. if( ( ret = mbedtls_asn1_get_alg( &p, end, &kdf_alg_oid, &kdf_alg_params ) ) != 0 )
  23208. return( MBEDTLS_ERR_PKCS5_INVALID_FORMAT + ret );
  23209. // Only PBKDF2 supported at the moment
  23210. //
  23211. if( MBEDTLS_OID_CMP( MBEDTLS_OID_PKCS5_PBKDF2, &kdf_alg_oid ) != 0 )
  23212. return( MBEDTLS_ERR_PKCS5_FEATURE_UNAVAILABLE );
  23213. if( ( ret = pkcs5_parse_pbkdf2_params( &kdf_alg_params,
  23214. &salt, &iterations, &keylen,
  23215. &md_type ) ) != 0 )
  23216. {
  23217. return( ret );
  23218. }
  23219. md_info = mbedtls_md_info_from_type( md_type );
  23220. if( md_info == NULL )
  23221. return( MBEDTLS_ERR_PKCS5_FEATURE_UNAVAILABLE );
  23222. if( ( ret = mbedtls_asn1_get_alg( &p, end, &enc_scheme_oid,
  23223. &enc_scheme_params ) ) != 0 )
  23224. {
  23225. return( MBEDTLS_ERR_PKCS5_INVALID_FORMAT + ret );
  23226. }
  23227. if( mbedtls_oid_get_cipher_alg( &enc_scheme_oid, &cipher_alg ) != 0 )
  23228. return( MBEDTLS_ERR_PKCS5_FEATURE_UNAVAILABLE );
  23229. cipher_info = mbedtls_cipher_info_from_type( cipher_alg );
  23230. if( cipher_info == NULL )
  23231. return( MBEDTLS_ERR_PKCS5_FEATURE_UNAVAILABLE );
  23232. /*
  23233. * The value of keylen from pkcs5_parse_pbkdf2_params() is ignored
  23234. * since it is optional and we don't know if it was set or not
  23235. */
  23236. keylen = cipher_info->key_bitlen / 8;
  23237. if( enc_scheme_params.tag != MBEDTLS_ASN1_OCTET_STRING ||
  23238. enc_scheme_params.len != cipher_info->iv_size )
  23239. {
  23240. return( MBEDTLS_ERR_PKCS5_INVALID_FORMAT );
  23241. }
  23242. mbedtls_md_init( &md_ctx );
  23243. mbedtls_cipher_init( &cipher_ctx );
  23244. memcpy( iv, enc_scheme_params.p, enc_scheme_params.len );
  23245. if( ( ret = mbedtls_md_setup( &md_ctx, md_info, 1 ) ) != 0 )
  23246. goto exit;
  23247. if( ( ret = mbedtls_pkcs5_pbkdf2_hmac( &md_ctx, pwd, pwdlen, salt.p, salt.len,
  23248. iterations, keylen, key ) ) != 0 )
  23249. {
  23250. goto exit;
  23251. }
  23252. if( ( ret = mbedtls_cipher_setup( &cipher_ctx, cipher_info ) ) != 0 )
  23253. goto exit;
  23254. if( ( ret = mbedtls_cipher_setkey( &cipher_ctx, key, 8 * keylen, (mbedtls_operation_t) mode ) ) != 0 )
  23255. goto exit;
  23256. if( ( ret = mbedtls_cipher_crypt( &cipher_ctx, iv, enc_scheme_params.len,
  23257. data, datalen, output, &olen ) ) != 0 )
  23258. ret = MBEDTLS_ERR_PKCS5_PASSWORD_MISMATCH;
  23259. exit:
  23260. mbedtls_md_free( &md_ctx );
  23261. mbedtls_cipher_free( &cipher_ctx );
  23262. return( ret );
  23263. }
  23264. int mbedtls_pkcs5_pbkdf2_hmac( mbedtls_md_context_t *ctx, const unsigned char *password,
  23265. size_t plen, const unsigned char *salt, size_t slen,
  23266. unsigned int iteration_count,
  23267. uint32_t key_length, unsigned char *output )
  23268. {
  23269. int ret, j;
  23270. unsigned int i;
  23271. unsigned char md1[MBEDTLS_MD_MAX_SIZE];
  23272. unsigned char work[MBEDTLS_MD_MAX_SIZE];
  23273. unsigned char md_size = mbedtls_md_get_size( ctx->md_info );
  23274. size_t use_len;
  23275. unsigned char *out_p = output;
  23276. unsigned char counter[4];
  23277. memset( counter, 0, 4 );
  23278. counter[3] = 1;
  23279. if( iteration_count > 0xFFFFFFFF )
  23280. return( MBEDTLS_ERR_PKCS5_BAD_INPUT_DATA );
  23281. while( key_length )
  23282. {
  23283. // U1 ends up in work
  23284. //
  23285. if( ( ret = mbedtls_md_hmac_starts( ctx, password, plen ) ) != 0 )
  23286. return( ret );
  23287. if( ( ret = mbedtls_md_hmac_update( ctx, salt, slen ) ) != 0 )
  23288. return( ret );
  23289. if( ( ret = mbedtls_md_hmac_update( ctx, counter, 4 ) ) != 0 )
  23290. return( ret );
  23291. if( ( ret = mbedtls_md_hmac_finish( ctx, work ) ) != 0 )
  23292. return( ret );
  23293. memcpy( md1, work, md_size );
  23294. for( i = 1; i < iteration_count; i++ )
  23295. {
  23296. // U2 ends up in md1
  23297. //
  23298. if( ( ret = mbedtls_md_hmac_starts( ctx, password, plen ) ) != 0 )
  23299. return( ret );
  23300. if( ( ret = mbedtls_md_hmac_update( ctx, md1, md_size ) ) != 0 )
  23301. return( ret );
  23302. if( ( ret = mbedtls_md_hmac_finish( ctx, md1 ) ) != 0 )
  23303. return( ret );
  23304. // U1 xor U2
  23305. //
  23306. for( j = 0; j < md_size; j++ )
  23307. work[j] ^= md1[j];
  23308. }
  23309. use_len = ( key_length < md_size ) ? key_length : md_size;
  23310. memcpy( out_p, work, use_len );
  23311. key_length -= (uint32_t) use_len;
  23312. out_p += use_len;
  23313. for( i = 4; i > 0; i-- )
  23314. if( ++counter[i - 1] != 0 )
  23315. break;
  23316. }
  23317. return( 0 );
  23318. }
  23319. #if defined(MBEDTLS_SELF_TEST)
  23320. #if !defined(MBEDTLS_SHA1_C)
  23321. int mbedtls_pkcs5_self_test( int verbose )
  23322. {
  23323. if( verbose != 0 )
  23324. mbedtls_printf( " PBKDF2 (SHA1): skipped\n\n" );
  23325. return( 0 );
  23326. }
  23327. #else
  23328. #define MAX_TESTS 6
  23329. static const size_t plen[MAX_TESTS] =
  23330. { 8, 8, 8, 24, 9 };
  23331. static const unsigned char password[MAX_TESTS][32] =
  23332. {
  23333. "password",
  23334. "password",
  23335. "password",
  23336. "passwordPASSWORDpassword",
  23337. "pass\0word",
  23338. };
  23339. static const size_t slen[MAX_TESTS] =
  23340. { 4, 4, 4, 36, 5 };
  23341. static const unsigned char salt[MAX_TESTS][40] =
  23342. {
  23343. "salt",
  23344. "salt",
  23345. "salt",
  23346. "saltSALTsaltSALTsaltSALTsaltSALTsalt",
  23347. "sa\0lt",
  23348. };
  23349. static const uint32_t it_cnt[MAX_TESTS] =
  23350. { 1, 2, 4096, 4096, 4096 };
  23351. static const uint32_t key_len[MAX_TESTS] =
  23352. { 20, 20, 20, 25, 16 };
  23353. static const unsigned char result_key[MAX_TESTS][32] =
  23354. {
  23355. { 0x0c, 0x60, 0xc8, 0x0f, 0x96, 0x1f, 0x0e, 0x71,
  23356. 0xf3, 0xa9, 0xb5, 0x24, 0xaf, 0x60, 0x12, 0x06,
  23357. 0x2f, 0xe0, 0x37, 0xa6 },
  23358. { 0xea, 0x6c, 0x01, 0x4d, 0xc7, 0x2d, 0x6f, 0x8c,
  23359. 0xcd, 0x1e, 0xd9, 0x2a, 0xce, 0x1d, 0x41, 0xf0,
  23360. 0xd8, 0xde, 0x89, 0x57 },
  23361. { 0x4b, 0x00, 0x79, 0x01, 0xb7, 0x65, 0x48, 0x9a,
  23362. 0xbe, 0xad, 0x49, 0xd9, 0x26, 0xf7, 0x21, 0xd0,
  23363. 0x65, 0xa4, 0x29, 0xc1 },
  23364. { 0x3d, 0x2e, 0xec, 0x4f, 0xe4, 0x1c, 0x84, 0x9b,
  23365. 0x80, 0xc8, 0xd8, 0x36, 0x62, 0xc0, 0xe4, 0x4a,
  23366. 0x8b, 0x29, 0x1a, 0x96, 0x4c, 0xf2, 0xf0, 0x70,
  23367. 0x38 },
  23368. { 0x56, 0xfa, 0x6a, 0xa7, 0x55, 0x48, 0x09, 0x9d,
  23369. 0xcc, 0x37, 0xd7, 0xf0, 0x34, 0x25, 0xe0, 0xc3 },
  23370. };
  23371. int mbedtls_pkcs5_self_test( int verbose )
  23372. {
  23373. mbedtls_md_context_t sha1_ctx;
  23374. const mbedtls_md_info_t *info_sha1;
  23375. int ret, i;
  23376. unsigned char key[64];
  23377. mbedtls_md_init( &sha1_ctx );
  23378. info_sha1 = mbedtls_md_info_from_type( MBEDTLS_MD_SHA1 );
  23379. if( info_sha1 == NULL )
  23380. {
  23381. ret = 1;
  23382. goto exit;
  23383. }
  23384. if( ( ret = mbedtls_md_setup( &sha1_ctx, info_sha1, 1 ) ) != 0 )
  23385. {
  23386. ret = 1;
  23387. goto exit;
  23388. }
  23389. for( i = 0; i < MAX_TESTS; i++ )
  23390. {
  23391. if( verbose != 0 )
  23392. mbedtls_printf( " PBKDF2 (SHA1) #%d: ", i );
  23393. ret = mbedtls_pkcs5_pbkdf2_hmac( &sha1_ctx, password[i], plen[i], salt[i],
  23394. slen[i], it_cnt[i], key_len[i], key );
  23395. if( ret != 0 ||
  23396. memcmp( result_key[i], key, key_len[i] ) != 0 )
  23397. {
  23398. if( verbose != 0 )
  23399. mbedtls_printf( "failed\n" );
  23400. ret = 1;
  23401. goto exit;
  23402. }
  23403. if( verbose != 0 )
  23404. mbedtls_printf( "passed\n" );
  23405. }
  23406. mbedtls_printf( "\n" );
  23407. exit:
  23408. mbedtls_md_free( &sha1_ctx );
  23409. return( ret );
  23410. }
  23411. #endif /* MBEDTLS_SHA1_C */
  23412. #endif /* MBEDTLS_SELF_TEST */
  23413. #endif /* MBEDTLS_PKCS5_C */
  23414. /********* Start of file library/pkparse.c ************/
  23415. /*
  23416. * Public Key layer for parsing key files and structures
  23417. *
  23418. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  23419. * SPDX-License-Identifier: Apache-2.0
  23420. *
  23421. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  23422. * not use this file except in compliance with the License.
  23423. * You may obtain a copy of the License at
  23424. *
  23425. * http://www.apache.org/licenses/LICENSE-2.0
  23426. *
  23427. * Unless required by applicable law or agreed to in writing, software
  23428. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  23429. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  23430. * See the License for the specific language governing permissions and
  23431. * limitations under the License.
  23432. *
  23433. * This file is part of mbed TLS (https://tls.mbed.org)
  23434. */
  23435. #if !defined(MBEDTLS_CONFIG_FILE)
  23436. #else
  23437. #endif
  23438. #if defined(MBEDTLS_PK_PARSE_C)
  23439. #include <string.h>
  23440. #if defined(MBEDTLS_RSA_C)
  23441. #endif
  23442. #if defined(MBEDTLS_ECP_C)
  23443. #endif
  23444. #if defined(MBEDTLS_ECDSA_C)
  23445. #endif
  23446. #if defined(MBEDTLS_PEM_PARSE_C)
  23447. #endif
  23448. #if defined(MBEDTLS_PKCS5_C)
  23449. #endif
  23450. #if defined(MBEDTLS_PKCS12_C)
  23451. #endif
  23452. #if defined(MBEDTLS_PLATFORM_C)
  23453. #else
  23454. #include <stdlib.h>
  23455. #define mbedtls_calloc calloc
  23456. #define mbedtls_free free
  23457. #endif
  23458. #if defined(MBEDTLS_FS_IO)
  23459. /* Implementation that should never be optimized out by the compiler */
  23460. static void pkparse_zeroize( void *v, size_t n ) {
  23461. volatile unsigned char *p = v; while( n-- ) *p++ = 0;
  23462. }
  23463. /*
  23464. * Load all data from a file into a given buffer.
  23465. *
  23466. * The file is expected to contain either PEM or DER encoded data.
  23467. * A terminating null byte is always appended. It is included in the announced
  23468. * length only if the data looks like it is PEM encoded.
  23469. */
  23470. int mbedtls_pk_load_file( const char *path, unsigned char **buf, size_t *n )
  23471. {
  23472. FILE *f;
  23473. long size;
  23474. if( ( f = fopen( path, "rb" ) ) == NULL )
  23475. return( MBEDTLS_ERR_PK_FILE_IO_ERROR );
  23476. fseek( f, 0, SEEK_END );
  23477. if( ( size = ftell( f ) ) == -1 )
  23478. {
  23479. fclose( f );
  23480. return( MBEDTLS_ERR_PK_FILE_IO_ERROR );
  23481. }
  23482. fseek( f, 0, SEEK_SET );
  23483. *n = (size_t) size;
  23484. if( *n + 1 == 0 ||
  23485. ( *buf = mbedtls_calloc( 1, *n + 1 ) ) == NULL )
  23486. {
  23487. fclose( f );
  23488. return( MBEDTLS_ERR_PK_ALLOC_FAILED );
  23489. }
  23490. if( fread( *buf, 1, *n, f ) != *n )
  23491. {
  23492. fclose( f );
  23493. mbedtls_free( *buf );
  23494. return( MBEDTLS_ERR_PK_FILE_IO_ERROR );
  23495. }
  23496. fclose( f );
  23497. (*buf)[*n] = '\0';
  23498. if( strstr( (const char *) *buf, "-----BEGIN " ) != NULL )
  23499. ++*n;
  23500. return( 0 );
  23501. }
  23502. /*
  23503. * Load and parse a private key
  23504. */
  23505. int mbedtls_pk_parse_keyfile( mbedtls_pk_context *ctx,
  23506. const char *path, const char *pwd )
  23507. {
  23508. int ret;
  23509. size_t n;
  23510. unsigned char *buf;
  23511. if( ( ret = mbedtls_pk_load_file( path, &buf, &n ) ) != 0 )
  23512. return( ret );
  23513. if( pwd == NULL )
  23514. ret = mbedtls_pk_parse_key( ctx, buf, n, NULL, 0 );
  23515. else
  23516. ret = mbedtls_pk_parse_key( ctx, buf, n,
  23517. (const unsigned char *) pwd, strlen( pwd ) );
  23518. pkparse_zeroize( buf, n );
  23519. mbedtls_free( buf );
  23520. return( ret );
  23521. }
  23522. /*
  23523. * Load and parse a public key
  23524. */
  23525. int mbedtls_pk_parse_public_keyfile( mbedtls_pk_context *ctx, const char *path )
  23526. {
  23527. int ret;
  23528. size_t n;
  23529. unsigned char *buf;
  23530. if( ( ret = mbedtls_pk_load_file( path, &buf, &n ) ) != 0 )
  23531. return( ret );
  23532. ret = mbedtls_pk_parse_public_key( ctx, buf, n );
  23533. pkparse_zeroize( buf, n );
  23534. mbedtls_free( buf );
  23535. return( ret );
  23536. }
  23537. #endif /* MBEDTLS_FS_IO */
  23538. #if defined(MBEDTLS_ECP_C)
  23539. /* Minimally parse an ECParameters buffer to and mbedtls_asn1_buf
  23540. *
  23541. * ECParameters ::= CHOICE {
  23542. * namedCurve OBJECT IDENTIFIER
  23543. * specifiedCurve SpecifiedECDomain -- = SEQUENCE { ... }
  23544. * -- implicitCurve NULL
  23545. * }
  23546. */
  23547. static int pk_get_ecparams( unsigned char **p, const unsigned char *end,
  23548. mbedtls_asn1_buf *params )
  23549. {
  23550. int ret;
  23551. /* Tag may be either OID or SEQUENCE */
  23552. params->tag = **p;
  23553. if( params->tag != MBEDTLS_ASN1_OID
  23554. #if defined(MBEDTLS_PK_PARSE_EC_EXTENDED)
  23555. && params->tag != ( MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE )
  23556. #endif
  23557. )
  23558. {
  23559. return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT +
  23560. MBEDTLS_ERR_ASN1_UNEXPECTED_TAG );
  23561. }
  23562. if( ( ret = mbedtls_asn1_get_tag( p, end, &params->len, params->tag ) ) != 0 )
  23563. {
  23564. return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );
  23565. }
  23566. params->p = *p;
  23567. *p += params->len;
  23568. if( *p != end )
  23569. return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT +
  23570. MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
  23571. return( 0 );
  23572. }
  23573. #if defined(MBEDTLS_PK_PARSE_EC_EXTENDED)
  23574. /*
  23575. * Parse a SpecifiedECDomain (SEC 1 C.2) and (mostly) fill the group with it.
  23576. * WARNING: the resulting group should only be used with
  23577. * pk_group_id_from_specified(), since its base point may not be set correctly
  23578. * if it was encoded compressed.
  23579. *
  23580. * SpecifiedECDomain ::= SEQUENCE {
  23581. * version SpecifiedECDomainVersion(ecdpVer1 | ecdpVer2 | ecdpVer3, ...),
  23582. * fieldID FieldID {{FieldTypes}},
  23583. * curve Curve,
  23584. * base ECPoint,
  23585. * order INTEGER,
  23586. * cofactor INTEGER OPTIONAL,
  23587. * hash HashAlgorithm OPTIONAL,
  23588. * ...
  23589. * }
  23590. *
  23591. * We only support prime-field as field type, and ignore hash and cofactor.
  23592. */
  23593. static int pk_group_from_specified( const mbedtls_asn1_buf *params, mbedtls_ecp_group *grp )
  23594. {
  23595. int ret;
  23596. unsigned char *p = params->p;
  23597. const unsigned char * const end = params->p + params->len;
  23598. const unsigned char *end_field, *end_curve;
  23599. size_t len;
  23600. int ver;
  23601. /* SpecifiedECDomainVersion ::= INTEGER { 1, 2, 3 } */
  23602. if( ( ret = mbedtls_asn1_get_int( &p, end, &ver ) ) != 0 )
  23603. return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );
  23604. if( ver < 1 || ver > 3 )
  23605. return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT );
  23606. /*
  23607. * FieldID { FIELD-ID:IOSet } ::= SEQUENCE { -- Finite field
  23608. * fieldType FIELD-ID.&id({IOSet}),
  23609. * parameters FIELD-ID.&Type({IOSet}{@fieldType})
  23610. * }
  23611. */
  23612. if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,
  23613. MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )
  23614. return( ret );
  23615. end_field = p + len;
  23616. /*
  23617. * FIELD-ID ::= TYPE-IDENTIFIER
  23618. * FieldTypes FIELD-ID ::= {
  23619. * { Prime-p IDENTIFIED BY prime-field } |
  23620. * { Characteristic-two IDENTIFIED BY characteristic-two-field }
  23621. * }
  23622. * prime-field OBJECT IDENTIFIER ::= { id-fieldType 1 }
  23623. */
  23624. if( ( ret = mbedtls_asn1_get_tag( &p, end_field, &len, MBEDTLS_ASN1_OID ) ) != 0 )
  23625. return( ret );
  23626. if( len != MBEDTLS_OID_SIZE( MBEDTLS_OID_ANSI_X9_62_PRIME_FIELD ) ||
  23627. memcmp( p, MBEDTLS_OID_ANSI_X9_62_PRIME_FIELD, len ) != 0 )
  23628. {
  23629. return( MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE );
  23630. }
  23631. p += len;
  23632. /* Prime-p ::= INTEGER -- Field of size p. */
  23633. if( ( ret = mbedtls_asn1_get_mpi( &p, end_field, &grp->P ) ) != 0 )
  23634. return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );
  23635. grp->pbits = mbedtls_mpi_bitlen( &grp->P );
  23636. if( p != end_field )
  23637. return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT +
  23638. MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
  23639. /*
  23640. * Curve ::= SEQUENCE {
  23641. * a FieldElement,
  23642. * b FieldElement,
  23643. * seed BIT STRING OPTIONAL
  23644. * -- Shall be present if used in SpecifiedECDomain
  23645. * -- with version equal to ecdpVer2 or ecdpVer3
  23646. * }
  23647. */
  23648. if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,
  23649. MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )
  23650. return( ret );
  23651. end_curve = p + len;
  23652. /*
  23653. * FieldElement ::= OCTET STRING
  23654. * containing an integer in the case of a prime field
  23655. */
  23656. if( ( ret = mbedtls_asn1_get_tag( &p, end_curve, &len, MBEDTLS_ASN1_OCTET_STRING ) ) != 0 ||
  23657. ( ret = mbedtls_mpi_read_binary( &grp->A, p, len ) ) != 0 )
  23658. {
  23659. return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );
  23660. }
  23661. p += len;
  23662. if( ( ret = mbedtls_asn1_get_tag( &p, end_curve, &len, MBEDTLS_ASN1_OCTET_STRING ) ) != 0 ||
  23663. ( ret = mbedtls_mpi_read_binary( &grp->B, p, len ) ) != 0 )
  23664. {
  23665. return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );
  23666. }
  23667. p += len;
  23668. /* Ignore seed BIT STRING OPTIONAL */
  23669. if( ( ret = mbedtls_asn1_get_tag( &p, end_curve, &len, MBEDTLS_ASN1_BIT_STRING ) ) == 0 )
  23670. p += len;
  23671. if( p != end_curve )
  23672. return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT +
  23673. MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
  23674. /*
  23675. * ECPoint ::= OCTET STRING
  23676. */
  23677. if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_OCTET_STRING ) ) != 0 )
  23678. return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );
  23679. if( ( ret = mbedtls_ecp_point_read_binary( grp, &grp->G,
  23680. ( const unsigned char *) p, len ) ) != 0 )
  23681. {
  23682. /*
  23683. * If we can't read the point because it's compressed, cheat by
  23684. * reading only the X coordinate and the parity bit of Y.
  23685. */
  23686. if( ret != MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE ||
  23687. ( p[0] != 0x02 && p[0] != 0x03 ) ||
  23688. len != mbedtls_mpi_size( &grp->P ) + 1 ||
  23689. mbedtls_mpi_read_binary( &grp->G.X, p + 1, len - 1 ) != 0 ||
  23690. mbedtls_mpi_lset( &grp->G.Y, p[0] - 2 ) != 0 ||
  23691. mbedtls_mpi_lset( &grp->G.Z, 1 ) != 0 )
  23692. {
  23693. return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT );
  23694. }
  23695. }
  23696. p += len;
  23697. /*
  23698. * order INTEGER
  23699. */
  23700. if( ( ret = mbedtls_asn1_get_mpi( &p, end, &grp->N ) ) != 0 )
  23701. return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );
  23702. grp->nbits = mbedtls_mpi_bitlen( &grp->N );
  23703. /*
  23704. * Allow optional elements by purposefully not enforcing p == end here.
  23705. */
  23706. return( 0 );
  23707. }
  23708. /*
  23709. * Find the group id associated with an (almost filled) group as generated by
  23710. * pk_group_from_specified(), or return an error if unknown.
  23711. */
  23712. static int pk_group_id_from_group( const mbedtls_ecp_group *grp, mbedtls_ecp_group_id *grp_id )
  23713. {
  23714. int ret = 0;
  23715. mbedtls_ecp_group ref;
  23716. const mbedtls_ecp_group_id *id;
  23717. mbedtls_ecp_group_init( &ref );
  23718. for( id = mbedtls_ecp_grp_id_list(); *id != MBEDTLS_ECP_DP_NONE; id++ )
  23719. {
  23720. /* Load the group associated to that id */
  23721. mbedtls_ecp_group_free( &ref );
  23722. MBEDTLS_MPI_CHK( mbedtls_ecp_group_load( &ref, *id ) );
  23723. /* Compare to the group we were given, starting with easy tests */
  23724. if( grp->pbits == ref.pbits && grp->nbits == ref.nbits &&
  23725. mbedtls_mpi_cmp_mpi( &grp->P, &ref.P ) == 0 &&
  23726. mbedtls_mpi_cmp_mpi( &grp->A, &ref.A ) == 0 &&
  23727. mbedtls_mpi_cmp_mpi( &grp->B, &ref.B ) == 0 &&
  23728. mbedtls_mpi_cmp_mpi( &grp->N, &ref.N ) == 0 &&
  23729. mbedtls_mpi_cmp_mpi( &grp->G.X, &ref.G.X ) == 0 &&
  23730. mbedtls_mpi_cmp_mpi( &grp->G.Z, &ref.G.Z ) == 0 &&
  23731. /* For Y we may only know the parity bit, so compare only that */
  23732. mbedtls_mpi_get_bit( &grp->G.Y, 0 ) == mbedtls_mpi_get_bit( &ref.G.Y, 0 ) )
  23733. {
  23734. break;
  23735. }
  23736. }
  23737. cleanup:
  23738. mbedtls_ecp_group_free( &ref );
  23739. *grp_id = *id;
  23740. if( ret == 0 && *id == MBEDTLS_ECP_DP_NONE )
  23741. ret = MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE;
  23742. return( ret );
  23743. }
  23744. /*
  23745. * Parse a SpecifiedECDomain (SEC 1 C.2) and find the associated group ID
  23746. */
  23747. static int pk_group_id_from_specified( const mbedtls_asn1_buf *params,
  23748. mbedtls_ecp_group_id *grp_id )
  23749. {
  23750. int ret;
  23751. mbedtls_ecp_group grp;
  23752. mbedtls_ecp_group_init( &grp );
  23753. if( ( ret = pk_group_from_specified( params, &grp ) ) != 0 )
  23754. goto cleanup;
  23755. ret = pk_group_id_from_group( &grp, grp_id );
  23756. cleanup:
  23757. mbedtls_ecp_group_free( &grp );
  23758. return( ret );
  23759. }
  23760. #endif /* MBEDTLS_PK_PARSE_EC_EXTENDED */
  23761. /*
  23762. * Use EC parameters to initialise an EC group
  23763. *
  23764. * ECParameters ::= CHOICE {
  23765. * namedCurve OBJECT IDENTIFIER
  23766. * specifiedCurve SpecifiedECDomain -- = SEQUENCE { ... }
  23767. * -- implicitCurve NULL
  23768. */
  23769. static int pk_use_ecparams( const mbedtls_asn1_buf *params, mbedtls_ecp_group *grp )
  23770. {
  23771. int ret;
  23772. mbedtls_ecp_group_id grp_id;
  23773. if( params->tag == MBEDTLS_ASN1_OID )
  23774. {
  23775. if( mbedtls_oid_get_ec_grp( params, &grp_id ) != 0 )
  23776. return( MBEDTLS_ERR_PK_UNKNOWN_NAMED_CURVE );
  23777. }
  23778. else
  23779. {
  23780. #if defined(MBEDTLS_PK_PARSE_EC_EXTENDED)
  23781. if( ( ret = pk_group_id_from_specified( params, &grp_id ) ) != 0 )
  23782. return( ret );
  23783. #else
  23784. return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT );
  23785. #endif
  23786. }
  23787. /*
  23788. * grp may already be initilialized; if so, make sure IDs match
  23789. */
  23790. if( grp->id != MBEDTLS_ECP_DP_NONE && grp->id != grp_id )
  23791. return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT );
  23792. if( ( ret = mbedtls_ecp_group_load( grp, grp_id ) ) != 0 )
  23793. return( ret );
  23794. return( 0 );
  23795. }
  23796. /*
  23797. * EC public key is an EC point
  23798. *
  23799. * The caller is responsible for clearing the structure upon failure if
  23800. * desired. Take care to pass along the possible ECP_FEATURE_UNAVAILABLE
  23801. * return code of mbedtls_ecp_point_read_binary() and leave p in a usable state.
  23802. */
  23803. static int pk_get_ecpubkey( unsigned char **p, const unsigned char *end,
  23804. mbedtls_ecp_keypair *key )
  23805. {
  23806. int ret;
  23807. if( ( ret = mbedtls_ecp_point_read_binary( &key->grp, &key->Q,
  23808. (const unsigned char *) *p, end - *p ) ) == 0 )
  23809. {
  23810. ret = mbedtls_ecp_check_pubkey( &key->grp, &key->Q );
  23811. }
  23812. /*
  23813. * We know mbedtls_ecp_point_read_binary consumed all bytes or failed
  23814. */
  23815. *p = (unsigned char *) end;
  23816. return( ret );
  23817. }
  23818. #endif /* MBEDTLS_ECP_C */
  23819. #if defined(MBEDTLS_RSA_C)
  23820. /*
  23821. * RSAPublicKey ::= SEQUENCE {
  23822. * modulus INTEGER, -- n
  23823. * publicExponent INTEGER -- e
  23824. * }
  23825. */
  23826. static int pk_get_rsapubkey( unsigned char **p,
  23827. const unsigned char *end,
  23828. mbedtls_rsa_context *rsa )
  23829. {
  23830. int ret;
  23831. size_t len;
  23832. if( ( ret = mbedtls_asn1_get_tag( p, end, &len,
  23833. MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )
  23834. return( MBEDTLS_ERR_PK_INVALID_PUBKEY + ret );
  23835. if( *p + len != end )
  23836. return( MBEDTLS_ERR_PK_INVALID_PUBKEY +
  23837. MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
  23838. if( ( ret = mbedtls_asn1_get_mpi( p, end, &rsa->N ) ) != 0 ||
  23839. ( ret = mbedtls_asn1_get_mpi( p, end, &rsa->E ) ) != 0 )
  23840. return( MBEDTLS_ERR_PK_INVALID_PUBKEY + ret );
  23841. if( *p != end )
  23842. return( MBEDTLS_ERR_PK_INVALID_PUBKEY +
  23843. MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
  23844. if( ( ret = mbedtls_rsa_check_pubkey( rsa ) ) != 0 )
  23845. return( MBEDTLS_ERR_PK_INVALID_PUBKEY );
  23846. rsa->len = mbedtls_mpi_size( &rsa->N );
  23847. return( 0 );
  23848. }
  23849. #endif /* MBEDTLS_RSA_C */
  23850. /* Get a PK algorithm identifier
  23851. *
  23852. * AlgorithmIdentifier ::= SEQUENCE {
  23853. * algorithm OBJECT IDENTIFIER,
  23854. * parameters ANY DEFINED BY algorithm OPTIONAL }
  23855. */
  23856. static int pk_get_pk_alg( unsigned char **p,
  23857. const unsigned char *end,
  23858. mbedtls_pk_type_t *pk_alg, mbedtls_asn1_buf *params )
  23859. {
  23860. int ret;
  23861. mbedtls_asn1_buf alg_oid;
  23862. memset( params, 0, sizeof(mbedtls_asn1_buf) );
  23863. if( ( ret = mbedtls_asn1_get_alg( p, end, &alg_oid, params ) ) != 0 )
  23864. return( MBEDTLS_ERR_PK_INVALID_ALG + ret );
  23865. if( mbedtls_oid_get_pk_alg( &alg_oid, pk_alg ) != 0 )
  23866. return( MBEDTLS_ERR_PK_UNKNOWN_PK_ALG );
  23867. /*
  23868. * No parameters with RSA (only for EC)
  23869. */
  23870. if( *pk_alg == MBEDTLS_PK_RSA &&
  23871. ( ( params->tag != MBEDTLS_ASN1_NULL && params->tag != 0 ) ||
  23872. params->len != 0 ) )
  23873. {
  23874. return( MBEDTLS_ERR_PK_INVALID_ALG );
  23875. }
  23876. return( 0 );
  23877. }
  23878. /*
  23879. * SubjectPublicKeyInfo ::= SEQUENCE {
  23880. * algorithm AlgorithmIdentifier,
  23881. * subjectPublicKey BIT STRING }
  23882. */
  23883. int mbedtls_pk_parse_subpubkey( unsigned char **p, const unsigned char *end,
  23884. mbedtls_pk_context *pk )
  23885. {
  23886. int ret;
  23887. size_t len;
  23888. mbedtls_asn1_buf alg_params;
  23889. mbedtls_pk_type_t pk_alg = MBEDTLS_PK_NONE;
  23890. const mbedtls_pk_info_t *pk_info;
  23891. if( ( ret = mbedtls_asn1_get_tag( p, end, &len,
  23892. MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )
  23893. {
  23894. return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );
  23895. }
  23896. end = *p + len;
  23897. if( ( ret = pk_get_pk_alg( p, end, &pk_alg, &alg_params ) ) != 0 )
  23898. return( ret );
  23899. if( ( ret = mbedtls_asn1_get_bitstring_null( p, end, &len ) ) != 0 )
  23900. return( MBEDTLS_ERR_PK_INVALID_PUBKEY + ret );
  23901. if( *p + len != end )
  23902. return( MBEDTLS_ERR_PK_INVALID_PUBKEY +
  23903. MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
  23904. if( ( pk_info = mbedtls_pk_info_from_type( pk_alg ) ) == NULL )
  23905. return( MBEDTLS_ERR_PK_UNKNOWN_PK_ALG );
  23906. if( ( ret = mbedtls_pk_setup( pk, pk_info ) ) != 0 )
  23907. return( ret );
  23908. #if defined(MBEDTLS_RSA_C)
  23909. if( pk_alg == MBEDTLS_PK_RSA )
  23910. {
  23911. ret = pk_get_rsapubkey( p, end, mbedtls_pk_rsa( *pk ) );
  23912. } else
  23913. #endif /* MBEDTLS_RSA_C */
  23914. #if defined(MBEDTLS_ECP_C)
  23915. if( pk_alg == MBEDTLS_PK_ECKEY_DH || pk_alg == MBEDTLS_PK_ECKEY )
  23916. {
  23917. ret = pk_use_ecparams( &alg_params, &mbedtls_pk_ec( *pk )->grp );
  23918. if( ret == 0 )
  23919. ret = pk_get_ecpubkey( p, end, mbedtls_pk_ec( *pk ) );
  23920. } else
  23921. #endif /* MBEDTLS_ECP_C */
  23922. ret = MBEDTLS_ERR_PK_UNKNOWN_PK_ALG;
  23923. if( ret == 0 && *p != end )
  23924. ret = MBEDTLS_ERR_PK_INVALID_PUBKEY
  23925. MBEDTLS_ERR_ASN1_LENGTH_MISMATCH;
  23926. if( ret != 0 )
  23927. mbedtls_pk_free( pk );
  23928. return( ret );
  23929. }
  23930. #if defined(MBEDTLS_RSA_C)
  23931. /*
  23932. * Parse a PKCS#1 encoded private RSA key
  23933. */
  23934. static int pk_parse_key_pkcs1_der( mbedtls_rsa_context *rsa,
  23935. const unsigned char *key,
  23936. size_t keylen )
  23937. {
  23938. int ret;
  23939. size_t len;
  23940. unsigned char *p, *end;
  23941. p = (unsigned char *) key;
  23942. end = p + keylen;
  23943. /*
  23944. * This function parses the RSAPrivateKey (PKCS#1)
  23945. *
  23946. * RSAPrivateKey ::= SEQUENCE {
  23947. * version Version,
  23948. * modulus INTEGER, -- n
  23949. * publicExponent INTEGER, -- e
  23950. * privateExponent INTEGER, -- d
  23951. * prime1 INTEGER, -- p
  23952. * prime2 INTEGER, -- q
  23953. * exponent1 INTEGER, -- d mod (p-1)
  23954. * exponent2 INTEGER, -- d mod (q-1)
  23955. * coefficient INTEGER, -- (inverse of q) mod p
  23956. * otherPrimeInfos OtherPrimeInfos OPTIONAL
  23957. * }
  23958. */
  23959. if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,
  23960. MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )
  23961. {
  23962. return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );
  23963. }
  23964. end = p + len;
  23965. if( ( ret = mbedtls_asn1_get_int( &p, end, &rsa->ver ) ) != 0 )
  23966. {
  23967. return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );
  23968. }
  23969. if( rsa->ver != 0 )
  23970. {
  23971. return( MBEDTLS_ERR_PK_KEY_INVALID_VERSION );
  23972. }
  23973. if( ( ret = mbedtls_asn1_get_mpi( &p, end, &rsa->N ) ) != 0 ||
  23974. ( ret = mbedtls_asn1_get_mpi( &p, end, &rsa->E ) ) != 0 ||
  23975. ( ret = mbedtls_asn1_get_mpi( &p, end, &rsa->D ) ) != 0 ||
  23976. ( ret = mbedtls_asn1_get_mpi( &p, end, &rsa->P ) ) != 0 ||
  23977. ( ret = mbedtls_asn1_get_mpi( &p, end, &rsa->Q ) ) != 0 ||
  23978. ( ret = mbedtls_asn1_get_mpi( &p, end, &rsa->DP ) ) != 0 ||
  23979. ( ret = mbedtls_asn1_get_mpi( &p, end, &rsa->DQ ) ) != 0 ||
  23980. ( ret = mbedtls_asn1_get_mpi( &p, end, &rsa->QP ) ) != 0 )
  23981. {
  23982. mbedtls_rsa_free( rsa );
  23983. return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );
  23984. }
  23985. rsa->len = mbedtls_mpi_size( &rsa->N );
  23986. if( p != end )
  23987. {
  23988. mbedtls_rsa_free( rsa );
  23989. return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT +
  23990. MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
  23991. }
  23992. if( ( ret = mbedtls_rsa_check_privkey( rsa ) ) != 0 )
  23993. {
  23994. mbedtls_rsa_free( rsa );
  23995. return( ret );
  23996. }
  23997. return( 0 );
  23998. }
  23999. #endif /* MBEDTLS_RSA_C */
  24000. #if defined(MBEDTLS_ECP_C)
  24001. /*
  24002. * Parse a SEC1 encoded private EC key
  24003. */
  24004. static int pk_parse_key_sec1_der( mbedtls_ecp_keypair *eck,
  24005. const unsigned char *key,
  24006. size_t keylen )
  24007. {
  24008. int ret;
  24009. int version, pubkey_done;
  24010. size_t len;
  24011. mbedtls_asn1_buf params;
  24012. unsigned char *p = (unsigned char *) key;
  24013. unsigned char *end = p + keylen;
  24014. unsigned char *end2;
  24015. /*
  24016. * RFC 5915, or SEC1 Appendix C.4
  24017. *
  24018. * ECPrivateKey ::= SEQUENCE {
  24019. * version INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1),
  24020. * privateKey OCTET STRING,
  24021. * parameters [0] ECParameters {{ NamedCurve }} OPTIONAL,
  24022. * publicKey [1] BIT STRING OPTIONAL
  24023. * }
  24024. */
  24025. if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,
  24026. MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )
  24027. {
  24028. return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );
  24029. }
  24030. end = p + len;
  24031. if( ( ret = mbedtls_asn1_get_int( &p, end, &version ) ) != 0 )
  24032. return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );
  24033. if( version != 1 )
  24034. return( MBEDTLS_ERR_PK_KEY_INVALID_VERSION );
  24035. if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_OCTET_STRING ) ) != 0 )
  24036. return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );
  24037. if( ( ret = mbedtls_mpi_read_binary( &eck->d, p, len ) ) != 0 )
  24038. {
  24039. mbedtls_ecp_keypair_free( eck );
  24040. return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );
  24041. }
  24042. p += len;
  24043. pubkey_done = 0;
  24044. if( p != end )
  24045. {
  24046. /*
  24047. * Is 'parameters' present?
  24048. */
  24049. if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,
  24050. MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | 0 ) ) == 0 )
  24051. {
  24052. if( ( ret = pk_get_ecparams( &p, p + len, &params) ) != 0 ||
  24053. ( ret = pk_use_ecparams( &params, &eck->grp ) ) != 0 )
  24054. {
  24055. mbedtls_ecp_keypair_free( eck );
  24056. return( ret );
  24057. }
  24058. }
  24059. else if( ret != MBEDTLS_ERR_ASN1_UNEXPECTED_TAG )
  24060. {
  24061. mbedtls_ecp_keypair_free( eck );
  24062. return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );
  24063. }
  24064. /*
  24065. * Is 'publickey' present? If not, or if we can't read it (eg because it
  24066. * is compressed), create it from the private key.
  24067. */
  24068. if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,
  24069. MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | 1 ) ) == 0 )
  24070. {
  24071. end2 = p + len;
  24072. if( ( ret = mbedtls_asn1_get_bitstring_null( &p, end2, &len ) ) != 0 )
  24073. return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );
  24074. if( p + len != end2 )
  24075. return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT +
  24076. MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
  24077. if( ( ret = pk_get_ecpubkey( &p, end2, eck ) ) == 0 )
  24078. pubkey_done = 1;
  24079. else
  24080. {
  24081. /*
  24082. * The only acceptable failure mode of pk_get_ecpubkey() above
  24083. * is if the point format is not recognized.
  24084. */
  24085. if( ret != MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE )
  24086. return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT );
  24087. }
  24088. }
  24089. else if( ret != MBEDTLS_ERR_ASN1_UNEXPECTED_TAG )
  24090. {
  24091. mbedtls_ecp_keypair_free( eck );
  24092. return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );
  24093. }
  24094. }
  24095. if( ! pubkey_done &&
  24096. ( ret = mbedtls_ecp_mul( &eck->grp, &eck->Q, &eck->d, &eck->grp.G,
  24097. NULL, NULL ) ) != 0 )
  24098. {
  24099. mbedtls_ecp_keypair_free( eck );
  24100. return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );
  24101. }
  24102. if( ( ret = mbedtls_ecp_check_privkey( &eck->grp, &eck->d ) ) != 0 )
  24103. {
  24104. mbedtls_ecp_keypair_free( eck );
  24105. return( ret );
  24106. }
  24107. return( 0 );
  24108. }
  24109. #endif /* MBEDTLS_ECP_C */
  24110. /*
  24111. * Parse an unencrypted PKCS#8 encoded private key
  24112. */
  24113. static int pk_parse_key_pkcs8_unencrypted_der(
  24114. mbedtls_pk_context *pk,
  24115. const unsigned char* key,
  24116. size_t keylen )
  24117. {
  24118. int ret, version;
  24119. size_t len;
  24120. mbedtls_asn1_buf params;
  24121. unsigned char *p = (unsigned char *) key;
  24122. unsigned char *end = p + keylen;
  24123. mbedtls_pk_type_t pk_alg = MBEDTLS_PK_NONE;
  24124. const mbedtls_pk_info_t *pk_info;
  24125. /*
  24126. * This function parses the PrivatKeyInfo object (PKCS#8 v1.2 = RFC 5208)
  24127. *
  24128. * PrivateKeyInfo ::= SEQUENCE {
  24129. * version Version,
  24130. * privateKeyAlgorithm PrivateKeyAlgorithmIdentifier,
  24131. * privateKey PrivateKey,
  24132. * attributes [0] IMPLICIT Attributes OPTIONAL }
  24133. *
  24134. * Version ::= INTEGER
  24135. * PrivateKeyAlgorithmIdentifier ::= AlgorithmIdentifier
  24136. * PrivateKey ::= OCTET STRING
  24137. *
  24138. * The PrivateKey OCTET STRING is a SEC1 ECPrivateKey
  24139. */
  24140. if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,
  24141. MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )
  24142. {
  24143. return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );
  24144. }
  24145. end = p + len;
  24146. if( ( ret = mbedtls_asn1_get_int( &p, end, &version ) ) != 0 )
  24147. return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );
  24148. if( version != 0 )
  24149. return( MBEDTLS_ERR_PK_KEY_INVALID_VERSION + ret );
  24150. if( ( ret = pk_get_pk_alg( &p, end, &pk_alg, &params ) ) != 0 )
  24151. return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );
  24152. if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_OCTET_STRING ) ) != 0 )
  24153. return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );
  24154. if( len < 1 )
  24155. return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT +
  24156. MBEDTLS_ERR_ASN1_OUT_OF_DATA );
  24157. if( ( pk_info = mbedtls_pk_info_from_type( pk_alg ) ) == NULL )
  24158. return( MBEDTLS_ERR_PK_UNKNOWN_PK_ALG );
  24159. if( ( ret = mbedtls_pk_setup( pk, pk_info ) ) != 0 )
  24160. return( ret );
  24161. #if defined(MBEDTLS_RSA_C)
  24162. if( pk_alg == MBEDTLS_PK_RSA )
  24163. {
  24164. if( ( ret = pk_parse_key_pkcs1_der( mbedtls_pk_rsa( *pk ), p, len ) ) != 0 )
  24165. {
  24166. mbedtls_pk_free( pk );
  24167. return( ret );
  24168. }
  24169. } else
  24170. #endif /* MBEDTLS_RSA_C */
  24171. #if defined(MBEDTLS_ECP_C)
  24172. if( pk_alg == MBEDTLS_PK_ECKEY || pk_alg == MBEDTLS_PK_ECKEY_DH )
  24173. {
  24174. if( ( ret = pk_use_ecparams( &params, &mbedtls_pk_ec( *pk )->grp ) ) != 0 ||
  24175. ( ret = pk_parse_key_sec1_der( mbedtls_pk_ec( *pk ), p, len ) ) != 0 )
  24176. {
  24177. mbedtls_pk_free( pk );
  24178. return( ret );
  24179. }
  24180. } else
  24181. #endif /* MBEDTLS_ECP_C */
  24182. return( MBEDTLS_ERR_PK_UNKNOWN_PK_ALG );
  24183. return( 0 );
  24184. }
  24185. /*
  24186. * Parse an encrypted PKCS#8 encoded private key
  24187. */
  24188. #if defined(MBEDTLS_PKCS12_C) || defined(MBEDTLS_PKCS5_C)
  24189. static int pk_parse_key_pkcs8_encrypted_der(
  24190. mbedtls_pk_context *pk,
  24191. const unsigned char *key, size_t keylen,
  24192. const unsigned char *pwd, size_t pwdlen )
  24193. {
  24194. int ret, decrypted = 0;
  24195. size_t len;
  24196. unsigned char buf[2048];
  24197. unsigned char *p, *end;
  24198. mbedtls_asn1_buf pbe_alg_oid, pbe_params;
  24199. #if defined(MBEDTLS_PKCS12_C)
  24200. mbedtls_cipher_type_t cipher_alg;
  24201. mbedtls_md_type_t md_alg;
  24202. #endif
  24203. memset( buf, 0, sizeof( buf ) );
  24204. p = (unsigned char *) key;
  24205. end = p + keylen;
  24206. if( pwdlen == 0 )
  24207. return( MBEDTLS_ERR_PK_PASSWORD_REQUIRED );
  24208. /*
  24209. * This function parses the EncryptedPrivatKeyInfo object (PKCS#8)
  24210. *
  24211. * EncryptedPrivateKeyInfo ::= SEQUENCE {
  24212. * encryptionAlgorithm EncryptionAlgorithmIdentifier,
  24213. * encryptedData EncryptedData
  24214. * }
  24215. *
  24216. * EncryptionAlgorithmIdentifier ::= AlgorithmIdentifier
  24217. *
  24218. * EncryptedData ::= OCTET STRING
  24219. *
  24220. * The EncryptedData OCTET STRING is a PKCS#8 PrivateKeyInfo
  24221. */
  24222. if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,
  24223. MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )
  24224. {
  24225. return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );
  24226. }
  24227. end = p + len;
  24228. if( ( ret = mbedtls_asn1_get_alg( &p, end, &pbe_alg_oid, &pbe_params ) ) != 0 )
  24229. return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );
  24230. if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_OCTET_STRING ) ) != 0 )
  24231. return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );
  24232. if( len > sizeof( buf ) )
  24233. return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );
  24234. /*
  24235. * Decrypt EncryptedData with appropriate PDE
  24236. */
  24237. #if defined(MBEDTLS_PKCS12_C)
  24238. if( mbedtls_oid_get_pkcs12_pbe_alg( &pbe_alg_oid, &md_alg, &cipher_alg ) == 0 )
  24239. {
  24240. if( ( ret = mbedtls_pkcs12_pbe( &pbe_params, MBEDTLS_PKCS12_PBE_DECRYPT,
  24241. cipher_alg, md_alg,
  24242. pwd, pwdlen, p, len, buf ) ) != 0 )
  24243. {
  24244. if( ret == MBEDTLS_ERR_PKCS12_PASSWORD_MISMATCH )
  24245. return( MBEDTLS_ERR_PK_PASSWORD_MISMATCH );
  24246. return( ret );
  24247. }
  24248. decrypted = 1;
  24249. }
  24250. else if( MBEDTLS_OID_CMP( MBEDTLS_OID_PKCS12_PBE_SHA1_RC4_128, &pbe_alg_oid ) == 0 )
  24251. {
  24252. if( ( ret = mbedtls_pkcs12_pbe_sha1_rc4_128( &pbe_params,
  24253. MBEDTLS_PKCS12_PBE_DECRYPT,
  24254. pwd, pwdlen,
  24255. p, len, buf ) ) != 0 )
  24256. {
  24257. return( ret );
  24258. }
  24259. // Best guess for password mismatch when using RC4. If first tag is
  24260. // not MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE
  24261. //
  24262. if( *buf != ( MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) )
  24263. return( MBEDTLS_ERR_PK_PASSWORD_MISMATCH );
  24264. decrypted = 1;
  24265. }
  24266. else
  24267. #endif /* MBEDTLS_PKCS12_C */
  24268. #if defined(MBEDTLS_PKCS5_C)
  24269. if( MBEDTLS_OID_CMP( MBEDTLS_OID_PKCS5_PBES2, &pbe_alg_oid ) == 0 )
  24270. {
  24271. if( ( ret = mbedtls_pkcs5_pbes2( &pbe_params, MBEDTLS_PKCS5_DECRYPT, pwd, pwdlen,
  24272. p, len, buf ) ) != 0 )
  24273. {
  24274. if( ret == MBEDTLS_ERR_PKCS5_PASSWORD_MISMATCH )
  24275. return( MBEDTLS_ERR_PK_PASSWORD_MISMATCH );
  24276. return( ret );
  24277. }
  24278. decrypted = 1;
  24279. }
  24280. else
  24281. #endif /* MBEDTLS_PKCS5_C */
  24282. {
  24283. ((void) pwd);
  24284. }
  24285. if( decrypted == 0 )
  24286. return( MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE );
  24287. return( pk_parse_key_pkcs8_unencrypted_der( pk, buf, len ) );
  24288. }
  24289. #endif /* MBEDTLS_PKCS12_C || MBEDTLS_PKCS5_C */
  24290. /*
  24291. * Parse a private key
  24292. */
  24293. int mbedtls_pk_parse_key( mbedtls_pk_context *pk,
  24294. const unsigned char *key, size_t keylen,
  24295. const unsigned char *pwd, size_t pwdlen )
  24296. {
  24297. int ret;
  24298. const mbedtls_pk_info_t *pk_info;
  24299. #if defined(MBEDTLS_PEM_PARSE_C)
  24300. size_t len;
  24301. mbedtls_pem_context pem;
  24302. mbedtls_pem_init( &pem );
  24303. #if defined(MBEDTLS_RSA_C)
  24304. /* Avoid calling mbedtls_pem_read_buffer() on non-null-terminated string */
  24305. if( keylen == 0 || key[keylen - 1] != '\0' )
  24306. ret = MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT;
  24307. else
  24308. ret = mbedtls_pem_read_buffer( &pem,
  24309. "-----BEGIN RSA PRIVATE KEY-----",
  24310. "-----END RSA PRIVATE KEY-----",
  24311. key, pwd, pwdlen, &len );
  24312. if( ret == 0 )
  24313. {
  24314. if( ( pk_info = mbedtls_pk_info_from_type( MBEDTLS_PK_RSA ) ) == NULL )
  24315. return( MBEDTLS_ERR_PK_UNKNOWN_PK_ALG );
  24316. if( ( ret = mbedtls_pk_setup( pk, pk_info ) ) != 0 ||
  24317. ( ret = pk_parse_key_pkcs1_der( mbedtls_pk_rsa( *pk ),
  24318. pem.buf, pem.buflen ) ) != 0 )
  24319. {
  24320. mbedtls_pk_free( pk );
  24321. }
  24322. mbedtls_pem_free( &pem );
  24323. return( ret );
  24324. }
  24325. else if( ret == MBEDTLS_ERR_PEM_PASSWORD_MISMATCH )
  24326. return( MBEDTLS_ERR_PK_PASSWORD_MISMATCH );
  24327. else if( ret == MBEDTLS_ERR_PEM_PASSWORD_REQUIRED )
  24328. return( MBEDTLS_ERR_PK_PASSWORD_REQUIRED );
  24329. else if( ret != MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT )
  24330. return( ret );
  24331. #endif /* MBEDTLS_RSA_C */
  24332. #if defined(MBEDTLS_ECP_C)
  24333. /* Avoid calling mbedtls_pem_read_buffer() on non-null-terminated string */
  24334. if( keylen == 0 || key[keylen - 1] != '\0' )
  24335. ret = MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT;
  24336. else
  24337. ret = mbedtls_pem_read_buffer( &pem,
  24338. "-----BEGIN EC PRIVATE KEY-----",
  24339. "-----END EC PRIVATE KEY-----",
  24340. key, pwd, pwdlen, &len );
  24341. if( ret == 0 )
  24342. {
  24343. if( ( pk_info = mbedtls_pk_info_from_type( MBEDTLS_PK_ECKEY ) ) == NULL )
  24344. return( MBEDTLS_ERR_PK_UNKNOWN_PK_ALG );
  24345. if( ( ret = mbedtls_pk_setup( pk, pk_info ) ) != 0 ||
  24346. ( ret = pk_parse_key_sec1_der( mbedtls_pk_ec( *pk ),
  24347. pem.buf, pem.buflen ) ) != 0 )
  24348. {
  24349. mbedtls_pk_free( pk );
  24350. }
  24351. mbedtls_pem_free( &pem );
  24352. return( ret );
  24353. }
  24354. else if( ret == MBEDTLS_ERR_PEM_PASSWORD_MISMATCH )
  24355. return( MBEDTLS_ERR_PK_PASSWORD_MISMATCH );
  24356. else if( ret == MBEDTLS_ERR_PEM_PASSWORD_REQUIRED )
  24357. return( MBEDTLS_ERR_PK_PASSWORD_REQUIRED );
  24358. else if( ret != MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT )
  24359. return( ret );
  24360. #endif /* MBEDTLS_ECP_C */
  24361. /* Avoid calling mbedtls_pem_read_buffer() on non-null-terminated string */
  24362. if( keylen == 0 || key[keylen - 1] != '\0' )
  24363. ret = MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT;
  24364. else
  24365. ret = mbedtls_pem_read_buffer( &pem,
  24366. "-----BEGIN PRIVATE KEY-----",
  24367. "-----END PRIVATE KEY-----",
  24368. key, NULL, 0, &len );
  24369. if( ret == 0 )
  24370. {
  24371. if( ( ret = pk_parse_key_pkcs8_unencrypted_der( pk,
  24372. pem.buf, pem.buflen ) ) != 0 )
  24373. {
  24374. mbedtls_pk_free( pk );
  24375. }
  24376. mbedtls_pem_free( &pem );
  24377. return( ret );
  24378. }
  24379. else if( ret != MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT )
  24380. return( ret );
  24381. #if defined(MBEDTLS_PKCS12_C) || defined(MBEDTLS_PKCS5_C)
  24382. /* Avoid calling mbedtls_pem_read_buffer() on non-null-terminated string */
  24383. if( keylen == 0 || key[keylen - 1] != '\0' )
  24384. ret = MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT;
  24385. else
  24386. ret = mbedtls_pem_read_buffer( &pem,
  24387. "-----BEGIN ENCRYPTED PRIVATE KEY-----",
  24388. "-----END ENCRYPTED PRIVATE KEY-----",
  24389. key, NULL, 0, &len );
  24390. if( ret == 0 )
  24391. {
  24392. if( ( ret = pk_parse_key_pkcs8_encrypted_der( pk,
  24393. pem.buf, pem.buflen,
  24394. pwd, pwdlen ) ) != 0 )
  24395. {
  24396. mbedtls_pk_free( pk );
  24397. }
  24398. mbedtls_pem_free( &pem );
  24399. return( ret );
  24400. }
  24401. else if( ret != MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT )
  24402. return( ret );
  24403. #endif /* MBEDTLS_PKCS12_C || MBEDTLS_PKCS5_C */
  24404. #else
  24405. ((void) ret);
  24406. ((void) pwd);
  24407. ((void) pwdlen);
  24408. #endif /* MBEDTLS_PEM_PARSE_C */
  24409. /*
  24410. * At this point we only know it's not a PEM formatted key. Could be any
  24411. * of the known DER encoded private key formats
  24412. *
  24413. * We try the different DER format parsers to see if one passes without
  24414. * error
  24415. */
  24416. #if defined(MBEDTLS_PKCS12_C) || defined(MBEDTLS_PKCS5_C)
  24417. if( ( ret = pk_parse_key_pkcs8_encrypted_der( pk, key, keylen,
  24418. pwd, pwdlen ) ) == 0 )
  24419. {
  24420. return( 0 );
  24421. }
  24422. mbedtls_pk_free( pk );
  24423. if( ret == MBEDTLS_ERR_PK_PASSWORD_MISMATCH )
  24424. {
  24425. return( ret );
  24426. }
  24427. #endif /* MBEDTLS_PKCS12_C || MBEDTLS_PKCS5_C */
  24428. if( ( ret = pk_parse_key_pkcs8_unencrypted_der( pk, key, keylen ) ) == 0 )
  24429. return( 0 );
  24430. mbedtls_pk_free( pk );
  24431. #if defined(MBEDTLS_RSA_C)
  24432. if( ( pk_info = mbedtls_pk_info_from_type( MBEDTLS_PK_RSA ) ) == NULL )
  24433. return( MBEDTLS_ERR_PK_UNKNOWN_PK_ALG );
  24434. if( ( ret = mbedtls_pk_setup( pk, pk_info ) ) != 0 ||
  24435. ( ret = pk_parse_key_pkcs1_der( mbedtls_pk_rsa( *pk ), key, keylen ) ) == 0 )
  24436. {
  24437. return( 0 );
  24438. }
  24439. mbedtls_pk_free( pk );
  24440. #endif /* MBEDTLS_RSA_C */
  24441. #if defined(MBEDTLS_ECP_C)
  24442. if( ( pk_info = mbedtls_pk_info_from_type( MBEDTLS_PK_ECKEY ) ) == NULL )
  24443. return( MBEDTLS_ERR_PK_UNKNOWN_PK_ALG );
  24444. if( ( ret = mbedtls_pk_setup( pk, pk_info ) ) != 0 ||
  24445. ( ret = pk_parse_key_sec1_der( mbedtls_pk_ec( *pk ), key, keylen ) ) == 0 )
  24446. {
  24447. return( 0 );
  24448. }
  24449. mbedtls_pk_free( pk );
  24450. #endif /* MBEDTLS_ECP_C */
  24451. return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT );
  24452. }
  24453. /*
  24454. * Parse a public key
  24455. */
  24456. int mbedtls_pk_parse_public_key( mbedtls_pk_context *ctx,
  24457. const unsigned char *key, size_t keylen )
  24458. {
  24459. int ret;
  24460. unsigned char *p;
  24461. #if defined(MBEDTLS_PEM_PARSE_C)
  24462. size_t len;
  24463. mbedtls_pem_context pem;
  24464. mbedtls_pem_init( &pem );
  24465. /* Avoid calling mbedtls_pem_read_buffer() on non-null-terminated string */
  24466. if( keylen == 0 || key[keylen - 1] != '\0' )
  24467. ret = MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT;
  24468. else
  24469. ret = mbedtls_pem_read_buffer( &pem,
  24470. "-----BEGIN PUBLIC KEY-----",
  24471. "-----END PUBLIC KEY-----",
  24472. key, NULL, 0, &len );
  24473. if( ret == 0 )
  24474. {
  24475. /*
  24476. * Was PEM encoded
  24477. */
  24478. key = pem.buf;
  24479. keylen = pem.buflen;
  24480. }
  24481. else if( ret != MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT )
  24482. {
  24483. mbedtls_pem_free( &pem );
  24484. return( ret );
  24485. }
  24486. #endif /* MBEDTLS_PEM_PARSE_C */
  24487. p = (unsigned char *) key;
  24488. ret = mbedtls_pk_parse_subpubkey( &p, p + keylen, ctx );
  24489. #if defined(MBEDTLS_PEM_PARSE_C)
  24490. mbedtls_pem_free( &pem );
  24491. #endif
  24492. return( ret );
  24493. }
  24494. #endif /* MBEDTLS_PK_PARSE_C */
  24495. /********* Start of file library/pkwrite.c ************/
  24496. /*
  24497. * Public Key layer for writing key files and structures
  24498. *
  24499. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  24500. * SPDX-License-Identifier: Apache-2.0
  24501. *
  24502. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  24503. * not use this file except in compliance with the License.
  24504. * You may obtain a copy of the License at
  24505. *
  24506. * http://www.apache.org/licenses/LICENSE-2.0
  24507. *
  24508. * Unless required by applicable law or agreed to in writing, software
  24509. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  24510. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  24511. * See the License for the specific language governing permissions and
  24512. * limitations under the License.
  24513. *
  24514. * This file is part of mbed TLS (https://tls.mbed.org)
  24515. */
  24516. #if !defined(MBEDTLS_CONFIG_FILE)
  24517. #else
  24518. #endif
  24519. #if defined(MBEDTLS_PK_WRITE_C)
  24520. #include <string.h>
  24521. #if defined(MBEDTLS_RSA_C)
  24522. #endif
  24523. #if defined(MBEDTLS_ECP_C)
  24524. #endif
  24525. #if defined(MBEDTLS_ECDSA_C)
  24526. #endif
  24527. #if defined(MBEDTLS_PEM_WRITE_C)
  24528. #endif
  24529. #if defined(MBEDTLS_PLATFORM_C)
  24530. #else
  24531. #include <stdlib.h>
  24532. #define mbedtls_calloc calloc
  24533. #define mbedtls_free free
  24534. #endif
  24535. #if defined(MBEDTLS_RSA_C)
  24536. /*
  24537. * RSAPublicKey ::= SEQUENCE {
  24538. * modulus INTEGER, -- n
  24539. * publicExponent INTEGER -- e
  24540. * }
  24541. */
  24542. static int pk_write_rsa_pubkey( unsigned char **p, unsigned char *start,
  24543. mbedtls_rsa_context *rsa )
  24544. {
  24545. int ret;
  24546. size_t len = 0;
  24547. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_mpi( p, start, &rsa->E ) );
  24548. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_mpi( p, start, &rsa->N ) );
  24549. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) );
  24550. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_CONSTRUCTED |
  24551. MBEDTLS_ASN1_SEQUENCE ) );
  24552. return( (int) len );
  24553. }
  24554. #endif /* MBEDTLS_RSA_C */
  24555. #if defined(MBEDTLS_ECP_C)
  24556. /*
  24557. * EC public key is an EC point
  24558. */
  24559. static int pk_write_ec_pubkey( unsigned char **p, unsigned char *start,
  24560. mbedtls_ecp_keypair *ec )
  24561. {
  24562. int ret;
  24563. size_t len = 0;
  24564. unsigned char buf[MBEDTLS_ECP_MAX_PT_LEN];
  24565. if( ( ret = mbedtls_ecp_point_write_binary( &ec->grp, &ec->Q,
  24566. MBEDTLS_ECP_PF_UNCOMPRESSED,
  24567. &len, buf, sizeof( buf ) ) ) != 0 )
  24568. {
  24569. return( ret );
  24570. }
  24571. if( *p < start || (size_t)( *p - start ) < len )
  24572. return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );
  24573. *p -= len;
  24574. memcpy( *p, buf, len );
  24575. return( (int) len );
  24576. }
  24577. /*
  24578. * ECParameters ::= CHOICE {
  24579. * namedCurve OBJECT IDENTIFIER
  24580. * }
  24581. */
  24582. static int pk_write_ec_param( unsigned char **p, unsigned char *start,
  24583. mbedtls_ecp_keypair *ec )
  24584. {
  24585. int ret;
  24586. size_t len = 0;
  24587. const char *oid;
  24588. size_t oid_len;
  24589. if( ( ret = mbedtls_oid_get_oid_by_ec_grp( ec->grp.id, &oid, &oid_len ) ) != 0 )
  24590. return( ret );
  24591. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_oid( p, start, oid, oid_len ) );
  24592. return( (int) len );
  24593. }
  24594. #endif /* MBEDTLS_ECP_C */
  24595. int mbedtls_pk_write_pubkey( unsigned char **p, unsigned char *start,
  24596. const mbedtls_pk_context *key )
  24597. {
  24598. int ret;
  24599. size_t len = 0;
  24600. #if defined(MBEDTLS_RSA_C)
  24601. if( mbedtls_pk_get_type( key ) == MBEDTLS_PK_RSA )
  24602. MBEDTLS_ASN1_CHK_ADD( len, pk_write_rsa_pubkey( p, start, mbedtls_pk_rsa( *key ) ) );
  24603. else
  24604. #endif
  24605. #if defined(MBEDTLS_ECP_C)
  24606. if( mbedtls_pk_get_type( key ) == MBEDTLS_PK_ECKEY )
  24607. MBEDTLS_ASN1_CHK_ADD( len, pk_write_ec_pubkey( p, start, mbedtls_pk_ec( *key ) ) );
  24608. else
  24609. #endif
  24610. return( MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE );
  24611. return( (int) len );
  24612. }
  24613. int mbedtls_pk_write_pubkey_der( mbedtls_pk_context *key, unsigned char *buf, size_t size )
  24614. {
  24615. int ret;
  24616. unsigned char *c;
  24617. size_t len = 0, par_len = 0, oid_len;
  24618. const char *oid;
  24619. c = buf + size;
  24620. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_pk_write_pubkey( &c, buf, key ) );
  24621. if( c - buf < 1 )
  24622. return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );
  24623. /*
  24624. * SubjectPublicKeyInfo ::= SEQUENCE {
  24625. * algorithm AlgorithmIdentifier,
  24626. * subjectPublicKey BIT STRING }
  24627. */
  24628. *--c = 0;
  24629. len += 1;
  24630. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, buf, len ) );
  24631. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, buf, MBEDTLS_ASN1_BIT_STRING ) );
  24632. if( ( ret = mbedtls_oid_get_oid_by_pk_alg( mbedtls_pk_get_type( key ),
  24633. &oid, &oid_len ) ) != 0 )
  24634. {
  24635. return( ret );
  24636. }
  24637. #if defined(MBEDTLS_ECP_C)
  24638. if( mbedtls_pk_get_type( key ) == MBEDTLS_PK_ECKEY )
  24639. {
  24640. MBEDTLS_ASN1_CHK_ADD( par_len, pk_write_ec_param( &c, buf, mbedtls_pk_ec( *key ) ) );
  24641. }
  24642. #endif
  24643. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_algorithm_identifier( &c, buf, oid, oid_len,
  24644. par_len ) );
  24645. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, buf, len ) );
  24646. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, buf, MBEDTLS_ASN1_CONSTRUCTED |
  24647. MBEDTLS_ASN1_SEQUENCE ) );
  24648. return( (int) len );
  24649. }
  24650. int mbedtls_pk_write_key_der( mbedtls_pk_context *key, unsigned char *buf, size_t size )
  24651. {
  24652. int ret;
  24653. unsigned char *c = buf + size;
  24654. size_t len = 0;
  24655. #if defined(MBEDTLS_RSA_C)
  24656. if( mbedtls_pk_get_type( key ) == MBEDTLS_PK_RSA )
  24657. {
  24658. mbedtls_rsa_context *rsa = mbedtls_pk_rsa( *key );
  24659. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_mpi( &c, buf, &rsa->QP ) );
  24660. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_mpi( &c, buf, &rsa->DQ ) );
  24661. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_mpi( &c, buf, &rsa->DP ) );
  24662. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_mpi( &c, buf, &rsa->Q ) );
  24663. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_mpi( &c, buf, &rsa->P ) );
  24664. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_mpi( &c, buf, &rsa->D ) );
  24665. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_mpi( &c, buf, &rsa->E ) );
  24666. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_mpi( &c, buf, &rsa->N ) );
  24667. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_int( &c, buf, 0 ) );
  24668. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, buf, len ) );
  24669. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, buf, MBEDTLS_ASN1_CONSTRUCTED |
  24670. MBEDTLS_ASN1_SEQUENCE ) );
  24671. }
  24672. else
  24673. #endif /* MBEDTLS_RSA_C */
  24674. #if defined(MBEDTLS_ECP_C)
  24675. if( mbedtls_pk_get_type( key ) == MBEDTLS_PK_ECKEY )
  24676. {
  24677. mbedtls_ecp_keypair *ec = mbedtls_pk_ec( *key );
  24678. size_t pub_len = 0, par_len = 0;
  24679. /*
  24680. * RFC 5915, or SEC1 Appendix C.4
  24681. *
  24682. * ECPrivateKey ::= SEQUENCE {
  24683. * version INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1),
  24684. * privateKey OCTET STRING,
  24685. * parameters [0] ECParameters {{ NamedCurve }} OPTIONAL,
  24686. * publicKey [1] BIT STRING OPTIONAL
  24687. * }
  24688. */
  24689. /* publicKey */
  24690. MBEDTLS_ASN1_CHK_ADD( pub_len, pk_write_ec_pubkey( &c, buf, ec ) );
  24691. if( c - buf < 1 )
  24692. return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );
  24693. *--c = 0;
  24694. pub_len += 1;
  24695. MBEDTLS_ASN1_CHK_ADD( pub_len, mbedtls_asn1_write_len( &c, buf, pub_len ) );
  24696. MBEDTLS_ASN1_CHK_ADD( pub_len, mbedtls_asn1_write_tag( &c, buf, MBEDTLS_ASN1_BIT_STRING ) );
  24697. MBEDTLS_ASN1_CHK_ADD( pub_len, mbedtls_asn1_write_len( &c, buf, pub_len ) );
  24698. MBEDTLS_ASN1_CHK_ADD( pub_len, mbedtls_asn1_write_tag( &c, buf,
  24699. MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | 1 ) );
  24700. len += pub_len;
  24701. /* parameters */
  24702. MBEDTLS_ASN1_CHK_ADD( par_len, pk_write_ec_param( &c, buf, ec ) );
  24703. MBEDTLS_ASN1_CHK_ADD( par_len, mbedtls_asn1_write_len( &c, buf, par_len ) );
  24704. MBEDTLS_ASN1_CHK_ADD( par_len, mbedtls_asn1_write_tag( &c, buf,
  24705. MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | 0 ) );
  24706. len += par_len;
  24707. /* privateKey: write as MPI then fix tag */
  24708. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_mpi( &c, buf, &ec->d ) );
  24709. *c = MBEDTLS_ASN1_OCTET_STRING;
  24710. /* version */
  24711. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_int( &c, buf, 1 ) );
  24712. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, buf, len ) );
  24713. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, buf, MBEDTLS_ASN1_CONSTRUCTED |
  24714. MBEDTLS_ASN1_SEQUENCE ) );
  24715. }
  24716. else
  24717. #endif /* MBEDTLS_ECP_C */
  24718. return( MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE );
  24719. return( (int) len );
  24720. }
  24721. #if defined(MBEDTLS_PEM_WRITE_C)
  24722. #define PEM_BEGIN_PUBLIC_KEY "-----BEGIN PUBLIC KEY-----\n"
  24723. #define PEM_END_PUBLIC_KEY "-----END PUBLIC KEY-----\n"
  24724. #define PEM_BEGIN_PRIVATE_KEY_RSA "-----BEGIN RSA PRIVATE KEY-----\n"
  24725. #define PEM_END_PRIVATE_KEY_RSA "-----END RSA PRIVATE KEY-----\n"
  24726. #define PEM_BEGIN_PRIVATE_KEY_EC "-----BEGIN EC PRIVATE KEY-----\n"
  24727. #define PEM_END_PRIVATE_KEY_EC "-----END EC PRIVATE KEY-----\n"
  24728. /*
  24729. * Max sizes of key per types. Shown as tag + len (+ content).
  24730. */
  24731. #if defined(MBEDTLS_RSA_C)
  24732. /*
  24733. * RSA public keys:
  24734. * SubjectPublicKeyInfo ::= SEQUENCE { 1 + 3
  24735. * algorithm AlgorithmIdentifier, 1 + 1 (sequence)
  24736. * + 1 + 1 + 9 (rsa oid)
  24737. * + 1 + 1 (params null)
  24738. * subjectPublicKey BIT STRING } 1 + 3 + (1 + below)
  24739. * RSAPublicKey ::= SEQUENCE { 1 + 3
  24740. * modulus INTEGER, -- n 1 + 3 + MPI_MAX + 1
  24741. * publicExponent INTEGER -- e 1 + 3 + MPI_MAX + 1
  24742. * }
  24743. */
  24744. #define RSA_PUB_DER_MAX_BYTES 38 + 2 * MBEDTLS_MPI_MAX_SIZE
  24745. /*
  24746. * RSA private keys:
  24747. * RSAPrivateKey ::= SEQUENCE { 1 + 3
  24748. * version Version, 1 + 1 + 1
  24749. * modulus INTEGER, 1 + 3 + MPI_MAX + 1
  24750. * publicExponent INTEGER, 1 + 3 + MPI_MAX + 1
  24751. * privateExponent INTEGER, 1 + 3 + MPI_MAX + 1
  24752. * prime1 INTEGER, 1 + 3 + MPI_MAX / 2 + 1
  24753. * prime2 INTEGER, 1 + 3 + MPI_MAX / 2 + 1
  24754. * exponent1 INTEGER, 1 + 3 + MPI_MAX / 2 + 1
  24755. * exponent2 INTEGER, 1 + 3 + MPI_MAX / 2 + 1
  24756. * coefficient INTEGER, 1 + 3 + MPI_MAX / 2 + 1
  24757. * otherPrimeInfos OtherPrimeInfos OPTIONAL 0 (not supported)
  24758. * }
  24759. */
  24760. #define MPI_MAX_SIZE_2 MBEDTLS_MPI_MAX_SIZE / 2 + \
  24761. MBEDTLS_MPI_MAX_SIZE % 2
  24762. #define RSA_PRV_DER_MAX_BYTES 47 + 3 * MBEDTLS_MPI_MAX_SIZE \
  24763. + 5 * MPI_MAX_SIZE_2
  24764. #else /* MBEDTLS_RSA_C */
  24765. #define RSA_PUB_DER_MAX_BYTES 0
  24766. #define RSA_PRV_DER_MAX_BYTES 0
  24767. #endif /* MBEDTLS_RSA_C */
  24768. #if defined(MBEDTLS_ECP_C)
  24769. /*
  24770. * EC public keys:
  24771. * SubjectPublicKeyInfo ::= SEQUENCE { 1 + 2
  24772. * algorithm AlgorithmIdentifier, 1 + 1 (sequence)
  24773. * + 1 + 1 + 7 (ec oid)
  24774. * + 1 + 1 + 9 (namedCurve oid)
  24775. * subjectPublicKey BIT STRING 1 + 2 + 1 [1]
  24776. * + 1 (point format) [1]
  24777. * + 2 * ECP_MAX (coords) [1]
  24778. * }
  24779. */
  24780. #define ECP_PUB_DER_MAX_BYTES 30 + 2 * MBEDTLS_ECP_MAX_BYTES
  24781. /*
  24782. * EC private keys:
  24783. * ECPrivateKey ::= SEQUENCE { 1 + 2
  24784. * version INTEGER , 1 + 1 + 1
  24785. * privateKey OCTET STRING, 1 + 1 + ECP_MAX
  24786. * parameters [0] ECParameters OPTIONAL, 1 + 1 + (1 + 1 + 9)
  24787. * publicKey [1] BIT STRING OPTIONAL 1 + 2 + [1] above
  24788. * }
  24789. */
  24790. #define ECP_PRV_DER_MAX_BYTES 29 + 3 * MBEDTLS_ECP_MAX_BYTES
  24791. #else /* MBEDTLS_ECP_C */
  24792. #define ECP_PUB_DER_MAX_BYTES 0
  24793. #define ECP_PRV_DER_MAX_BYTES 0
  24794. #endif /* MBEDTLS_ECP_C */
  24795. #define PUB_DER_MAX_BYTES RSA_PUB_DER_MAX_BYTES > ECP_PUB_DER_MAX_BYTES ? \
  24796. RSA_PUB_DER_MAX_BYTES : ECP_PUB_DER_MAX_BYTES
  24797. #define PRV_DER_MAX_BYTES RSA_PRV_DER_MAX_BYTES > ECP_PRV_DER_MAX_BYTES ? \
  24798. RSA_PRV_DER_MAX_BYTES : ECP_PRV_DER_MAX_BYTES
  24799. int mbedtls_pk_write_pubkey_pem( mbedtls_pk_context *key, unsigned char *buf, size_t size )
  24800. {
  24801. int ret;
  24802. unsigned char output_buf[PUB_DER_MAX_BYTES];
  24803. size_t olen = 0;
  24804. if( ( ret = mbedtls_pk_write_pubkey_der( key, output_buf,
  24805. sizeof(output_buf) ) ) < 0 )
  24806. {
  24807. return( ret );
  24808. }
  24809. if( ( ret = mbedtls_pem_write_buffer( PEM_BEGIN_PUBLIC_KEY, PEM_END_PUBLIC_KEY,
  24810. output_buf + sizeof(output_buf) - ret,
  24811. ret, buf, size, &olen ) ) != 0 )
  24812. {
  24813. return( ret );
  24814. }
  24815. return( 0 );
  24816. }
  24817. int mbedtls_pk_write_key_pem( mbedtls_pk_context *key, unsigned char *buf, size_t size )
  24818. {
  24819. int ret;
  24820. unsigned char output_buf[PRV_DER_MAX_BYTES];
  24821. const char *begin, *end;
  24822. size_t olen = 0;
  24823. if( ( ret = mbedtls_pk_write_key_der( key, output_buf, sizeof(output_buf) ) ) < 0 )
  24824. return( ret );
  24825. #if defined(MBEDTLS_RSA_C)
  24826. if( mbedtls_pk_get_type( key ) == MBEDTLS_PK_RSA )
  24827. {
  24828. begin = PEM_BEGIN_PRIVATE_KEY_RSA;
  24829. end = PEM_END_PRIVATE_KEY_RSA;
  24830. }
  24831. else
  24832. #endif
  24833. #if defined(MBEDTLS_ECP_C)
  24834. if( mbedtls_pk_get_type( key ) == MBEDTLS_PK_ECKEY )
  24835. {
  24836. begin = PEM_BEGIN_PRIVATE_KEY_EC;
  24837. end = PEM_END_PRIVATE_KEY_EC;
  24838. }
  24839. else
  24840. #endif
  24841. return( MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE );
  24842. if( ( ret = mbedtls_pem_write_buffer( begin, end,
  24843. output_buf + sizeof(output_buf) - ret,
  24844. ret, buf, size, &olen ) ) != 0 )
  24845. {
  24846. return( ret );
  24847. }
  24848. return( 0 );
  24849. }
  24850. #endif /* MBEDTLS_PEM_WRITE_C */
  24851. #endif /* MBEDTLS_PK_WRITE_C */
  24852. /********* Start of file library/platform.c ************/
  24853. /*
  24854. * Platform abstraction layer
  24855. *
  24856. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  24857. * SPDX-License-Identifier: Apache-2.0
  24858. *
  24859. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  24860. * not use this file except in compliance with the License.
  24861. * You may obtain a copy of the License at
  24862. *
  24863. * http://www.apache.org/licenses/LICENSE-2.0
  24864. *
  24865. * Unless required by applicable law or agreed to in writing, software
  24866. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  24867. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  24868. * See the License for the specific language governing permissions and
  24869. * limitations under the License.
  24870. *
  24871. * This file is part of mbed TLS (https://tls.mbed.org)
  24872. */
  24873. #if !defined(MBEDTLS_CONFIG_FILE)
  24874. #else
  24875. #endif
  24876. #if defined(MBEDTLS_PLATFORM_C)
  24877. #if defined(MBEDTLS_PLATFORM_MEMORY)
  24878. #if !defined(MBEDTLS_PLATFORM_STD_CALLOC)
  24879. static void *platform_calloc_uninit( size_t n, size_t size )
  24880. {
  24881. ((void) n);
  24882. ((void) size);
  24883. return( NULL );
  24884. }
  24885. #define MBEDTLS_PLATFORM_STD_CALLOC platform_calloc_uninit
  24886. #endif /* !MBEDTLS_PLATFORM_STD_CALLOC */
  24887. #if !defined(MBEDTLS_PLATFORM_STD_FREE)
  24888. static void platform_free_uninit( void *ptr )
  24889. {
  24890. ((void) ptr);
  24891. }
  24892. #define MBEDTLS_PLATFORM_STD_FREE platform_free_uninit
  24893. #endif /* !MBEDTLS_PLATFORM_STD_FREE */
  24894. void * (*mbedtls_calloc)( size_t, size_t ) = MBEDTLS_PLATFORM_STD_CALLOC;
  24895. void (*mbedtls_free)( void * ) = MBEDTLS_PLATFORM_STD_FREE;
  24896. int mbedtls_platform_set_calloc_free( void * (*calloc_func)( size_t, size_t ),
  24897. void (*free_func)( void * ) )
  24898. {
  24899. mbedtls_calloc = calloc_func;
  24900. mbedtls_free = free_func;
  24901. return( 0 );
  24902. }
  24903. #endif /* MBEDTLS_PLATFORM_MEMORY */
  24904. #if defined(_WIN32)
  24905. #include <stdarg.h>
  24906. int mbedtls_platform_win32_snprintf( char *s, size_t n, const char *fmt, ... )
  24907. {
  24908. int ret;
  24909. va_list argp;
  24910. /* Avoid calling the invalid parameter handler by checking ourselves */
  24911. if( s == NULL || n == 0 || fmt == NULL )
  24912. return( -1 );
  24913. va_start( argp, fmt );
  24914. #if defined(_TRUNCATE)
  24915. ret = _vsnprintf_s( s, n, _TRUNCATE, fmt, argp );
  24916. #else
  24917. ret = _vsnprintf( s, n, fmt, argp );
  24918. if( ret < 0 || (size_t) ret == n )
  24919. {
  24920. s[n-1] = '\0';
  24921. ret = -1;
  24922. }
  24923. #endif
  24924. va_end( argp );
  24925. return( ret );
  24926. }
  24927. #endif
  24928. #if defined(MBEDTLS_PLATFORM_SNPRINTF_ALT)
  24929. #if !defined(MBEDTLS_PLATFORM_STD_SNPRINTF)
  24930. /*
  24931. * Make dummy function to prevent NULL pointer dereferences
  24932. */
  24933. static int platform_snprintf_uninit( char * s, size_t n,
  24934. const char * format, ... )
  24935. {
  24936. ((void) s);
  24937. ((void) n);
  24938. ((void) format);
  24939. return( 0 );
  24940. }
  24941. #define MBEDTLS_PLATFORM_STD_SNPRINTF platform_snprintf_uninit
  24942. #endif /* !MBEDTLS_PLATFORM_STD_SNPRINTF */
  24943. int (*mbedtls_snprintf)( char * s, size_t n,
  24944. const char * format,
  24945. ... ) = MBEDTLS_PLATFORM_STD_SNPRINTF;
  24946. int mbedtls_platform_set_snprintf( int (*snprintf_func)( char * s, size_t n,
  24947. const char * format,
  24948. ... ) )
  24949. {
  24950. mbedtls_snprintf = snprintf_func;
  24951. return( 0 );
  24952. }
  24953. #endif /* MBEDTLS_PLATFORM_SNPRINTF_ALT */
  24954. #if defined(MBEDTLS_PLATFORM_PRINTF_ALT)
  24955. #if !defined(MBEDTLS_PLATFORM_STD_PRINTF)
  24956. /*
  24957. * Make dummy function to prevent NULL pointer dereferences
  24958. */
  24959. static int platform_printf_uninit( const char *format, ... )
  24960. {
  24961. ((void) format);
  24962. return( 0 );
  24963. }
  24964. #define MBEDTLS_PLATFORM_STD_PRINTF platform_printf_uninit
  24965. #endif /* !MBEDTLS_PLATFORM_STD_PRINTF */
  24966. int (*mbedtls_printf)( const char *, ... ) = MBEDTLS_PLATFORM_STD_PRINTF;
  24967. int mbedtls_platform_set_printf( int (*printf_func)( const char *, ... ) )
  24968. {
  24969. mbedtls_printf = printf_func;
  24970. return( 0 );
  24971. }
  24972. #endif /* MBEDTLS_PLATFORM_PRINTF_ALT */
  24973. #if defined(MBEDTLS_PLATFORM_FPRINTF_ALT)
  24974. #if !defined(MBEDTLS_PLATFORM_STD_FPRINTF)
  24975. /*
  24976. * Make dummy function to prevent NULL pointer dereferences
  24977. */
  24978. static int platform_fprintf_uninit( FILE *stream, const char *format, ... )
  24979. {
  24980. ((void) stream);
  24981. ((void) format);
  24982. return( 0 );
  24983. }
  24984. #define MBEDTLS_PLATFORM_STD_FPRINTF platform_fprintf_uninit
  24985. #endif /* !MBEDTLS_PLATFORM_STD_FPRINTF */
  24986. int (*mbedtls_fprintf)( FILE *, const char *, ... ) =
  24987. MBEDTLS_PLATFORM_STD_FPRINTF;
  24988. int mbedtls_platform_set_fprintf( int (*fprintf_func)( FILE *, const char *, ... ) )
  24989. {
  24990. mbedtls_fprintf = fprintf_func;
  24991. return( 0 );
  24992. }
  24993. #endif /* MBEDTLS_PLATFORM_FPRINTF_ALT */
  24994. #if defined(MBEDTLS_PLATFORM_EXIT_ALT)
  24995. #if !defined(MBEDTLS_PLATFORM_STD_EXIT)
  24996. /*
  24997. * Make dummy function to prevent NULL pointer dereferences
  24998. */
  24999. static void platform_exit_uninit( int status )
  25000. {
  25001. ((void) status);
  25002. }
  25003. #define MBEDTLS_PLATFORM_STD_EXIT platform_exit_uninit
  25004. #endif /* !MBEDTLS_PLATFORM_STD_EXIT */
  25005. void (*mbedtls_exit)( int status ) = MBEDTLS_PLATFORM_STD_EXIT;
  25006. int mbedtls_platform_set_exit( void (*exit_func)( int status ) )
  25007. {
  25008. mbedtls_exit = exit_func;
  25009. return( 0 );
  25010. }
  25011. #endif /* MBEDTLS_PLATFORM_EXIT_ALT */
  25012. #endif /* MBEDTLS_PLATFORM_C */
  25013. /********* Start of file library/ripemd160.c ************/
  25014. /*
  25015. * RIPE MD-160 implementation
  25016. *
  25017. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  25018. * SPDX-License-Identifier: Apache-2.0
  25019. *
  25020. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  25021. * not use this file except in compliance with the License.
  25022. * You may obtain a copy of the License at
  25023. *
  25024. * http://www.apache.org/licenses/LICENSE-2.0
  25025. *
  25026. * Unless required by applicable law or agreed to in writing, software
  25027. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  25028. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  25029. * See the License for the specific language governing permissions and
  25030. * limitations under the License.
  25031. *
  25032. * This file is part of mbed TLS (https://tls.mbed.org)
  25033. */
  25034. /*
  25035. * The RIPEMD-160 algorithm was designed by RIPE in 1996
  25036. * http://homes.esat.kuleuven.be/~bosselae/mbedtls_ripemd160.html
  25037. * http://ehash.iaik.tugraz.at/wiki/RIPEMD-160
  25038. */
  25039. #if !defined(MBEDTLS_CONFIG_FILE)
  25040. #else
  25041. #endif
  25042. #if defined(MBEDTLS_RIPEMD160_C)
  25043. #include <string.h>
  25044. #if defined(MBEDTLS_SELF_TEST)
  25045. #if defined(MBEDTLS_PLATFORM_C)
  25046. #else
  25047. #include <stdio.h>
  25048. #define mbedtls_printf printf
  25049. #endif /* MBEDTLS_PLATFORM_C */
  25050. #endif /* MBEDTLS_SELF_TEST */
  25051. /*
  25052. * 32-bit integer manipulation macros (little endian)
  25053. */
  25054. #ifndef GET_UINT32_LE
  25055. #define GET_UINT32_LE(n,b,i) \
  25056. { \
  25057. (n) = ( (uint32_t) (b)[(i) ] ) \
  25058. | ( (uint32_t) (b)[(i) + 1] << 8 ) \
  25059. | ( (uint32_t) (b)[(i) + 2] << 16 ) \
  25060. | ( (uint32_t) (b)[(i) + 3] << 24 ); \
  25061. }
  25062. #endif
  25063. #ifndef PUT_UINT32_LE
  25064. #define PUT_UINT32_LE(n,b,i) \
  25065. { \
  25066. (b)[(i) ] = (unsigned char) ( ( (n) ) & 0xFF ); \
  25067. (b)[(i) + 1] = (unsigned char) ( ( (n) >> 8 ) & 0xFF ); \
  25068. (b)[(i) + 2] = (unsigned char) ( ( (n) >> 16 ) & 0xFF ); \
  25069. (b)[(i) + 3] = (unsigned char) ( ( (n) >> 24 ) & 0xFF ); \
  25070. }
  25071. #endif
  25072. /* Implementation that should never be optimized out by the compiler */
  25073. static void ripemd_zeroize( void *v, size_t n ) {
  25074. volatile unsigned char *p = v; while( n-- ) *p++ = 0;
  25075. }
  25076. void mbedtls_ripemd160_init( mbedtls_ripemd160_context *ctx )
  25077. {
  25078. memset( ctx, 0, sizeof( mbedtls_ripemd160_context ) );
  25079. }
  25080. void mbedtls_ripemd160_free( mbedtls_ripemd160_context *ctx )
  25081. {
  25082. if( ctx == NULL )
  25083. return;
  25084. ripemd_zeroize( ctx, sizeof( mbedtls_ripemd160_context ) );
  25085. }
  25086. void mbedtls_ripemd160_clone( mbedtls_ripemd160_context *dst,
  25087. const mbedtls_ripemd160_context *src )
  25088. {
  25089. *dst = *src;
  25090. }
  25091. /*
  25092. * RIPEMD-160 context setup
  25093. */
  25094. void mbedtls_ripemd160_starts( mbedtls_ripemd160_context *ctx )
  25095. {
  25096. ctx->total[0] = 0;
  25097. ctx->total[1] = 0;
  25098. ctx->state[0] = 0x67452301;
  25099. ctx->state[1] = 0xEFCDAB89;
  25100. ctx->state[2] = 0x98BADCFE;
  25101. ctx->state[3] = 0x10325476;
  25102. ctx->state[4] = 0xC3D2E1F0;
  25103. }
  25104. #if !defined(MBEDTLS_RIPEMD160_PROCESS_ALT)
  25105. /*
  25106. * Process one block
  25107. */
  25108. void mbedtls_ripemd160_process( mbedtls_ripemd160_context *ctx, const unsigned char data[64] )
  25109. {
  25110. uint32_t A, B, C, D, E, Ap, Bp, Cp, Dp, Ep, X[16];
  25111. GET_UINT32_LE( X[ 0], data, 0 );
  25112. GET_UINT32_LE( X[ 1], data, 4 );
  25113. GET_UINT32_LE( X[ 2], data, 8 );
  25114. GET_UINT32_LE( X[ 3], data, 12 );
  25115. GET_UINT32_LE( X[ 4], data, 16 );
  25116. GET_UINT32_LE( X[ 5], data, 20 );
  25117. GET_UINT32_LE( X[ 6], data, 24 );
  25118. GET_UINT32_LE( X[ 7], data, 28 );
  25119. GET_UINT32_LE( X[ 8], data, 32 );
  25120. GET_UINT32_LE( X[ 9], data, 36 );
  25121. GET_UINT32_LE( X[10], data, 40 );
  25122. GET_UINT32_LE( X[11], data, 44 );
  25123. GET_UINT32_LE( X[12], data, 48 );
  25124. GET_UINT32_LE( X[13], data, 52 );
  25125. GET_UINT32_LE( X[14], data, 56 );
  25126. GET_UINT32_LE( X[15], data, 60 );
  25127. A = Ap = ctx->state[0];
  25128. B = Bp = ctx->state[1];
  25129. C = Cp = ctx->state[2];
  25130. D = Dp = ctx->state[3];
  25131. E = Ep = ctx->state[4];
  25132. #define F1( x, y, z ) ( x ^ y ^ z )
  25133. #define F2( x, y, z ) ( ( x & y ) | ( ~x & z ) )
  25134. #define F3( x, y, z ) ( ( x | ~y ) ^ z )
  25135. #define F4( x, y, z ) ( ( x & z ) | ( y & ~z ) )
  25136. #define F5( x, y, z ) ( x ^ ( y | ~z ) )
  25137. #define S( x, n ) ( ( x << n ) | ( x >> (32 - n) ) )
  25138. #define P( a, b, c, d, e, r, s, f, k ) \
  25139. a += f( b, c, d ) + X[r] + k; \
  25140. a = S( a, s ) + e; \
  25141. c = S( c, 10 );
  25142. #define P2( a, b, c, d, e, r, s, rp, sp ) \
  25143. P( a, b, c, d, e, r, s, F, K ); \
  25144. P( a ## p, b ## p, c ## p, d ## p, e ## p, rp, sp, Fp, Kp );
  25145. #define F F1
  25146. #define K 0x00000000
  25147. #define Fp F5
  25148. #define Kp 0x50A28BE6
  25149. P2( A, B, C, D, E, 0, 11, 5, 8 );
  25150. P2( E, A, B, C, D, 1, 14, 14, 9 );
  25151. P2( D, E, A, B, C, 2, 15, 7, 9 );
  25152. P2( C, D, E, A, B, 3, 12, 0, 11 );
  25153. P2( B, C, D, E, A, 4, 5, 9, 13 );
  25154. P2( A, B, C, D, E, 5, 8, 2, 15 );
  25155. P2( E, A, B, C, D, 6, 7, 11, 15 );
  25156. P2( D, E, A, B, C, 7, 9, 4, 5 );
  25157. P2( C, D, E, A, B, 8, 11, 13, 7 );
  25158. P2( B, C, D, E, A, 9, 13, 6, 7 );
  25159. P2( A, B, C, D, E, 10, 14, 15, 8 );
  25160. P2( E, A, B, C, D, 11, 15, 8, 11 );
  25161. P2( D, E, A, B, C, 12, 6, 1, 14 );
  25162. P2( C, D, E, A, B, 13, 7, 10, 14 );
  25163. P2( B, C, D, E, A, 14, 9, 3, 12 );
  25164. P2( A, B, C, D, E, 15, 8, 12, 6 );
  25165. #undef F
  25166. #undef K
  25167. #undef Fp
  25168. #undef Kp
  25169. #define F F2
  25170. #define K 0x5A827999
  25171. #define Fp F4
  25172. #define Kp 0x5C4DD124
  25173. P2( E, A, B, C, D, 7, 7, 6, 9 );
  25174. P2( D, E, A, B, C, 4, 6, 11, 13 );
  25175. P2( C, D, E, A, B, 13, 8, 3, 15 );
  25176. P2( B, C, D, E, A, 1, 13, 7, 7 );
  25177. P2( A, B, C, D, E, 10, 11, 0, 12 );
  25178. P2( E, A, B, C, D, 6, 9, 13, 8 );
  25179. P2( D, E, A, B, C, 15, 7, 5, 9 );
  25180. P2( C, D, E, A, B, 3, 15, 10, 11 );
  25181. P2( B, C, D, E, A, 12, 7, 14, 7 );
  25182. P2( A, B, C, D, E, 0, 12, 15, 7 );
  25183. P2( E, A, B, C, D, 9, 15, 8, 12 );
  25184. P2( D, E, A, B, C, 5, 9, 12, 7 );
  25185. P2( C, D, E, A, B, 2, 11, 4, 6 );
  25186. P2( B, C, D, E, A, 14, 7, 9, 15 );
  25187. P2( A, B, C, D, E, 11, 13, 1, 13 );
  25188. P2( E, A, B, C, D, 8, 12, 2, 11 );
  25189. #undef F
  25190. #undef K
  25191. #undef Fp
  25192. #undef Kp
  25193. #define F F3
  25194. #define K 0x6ED9EBA1
  25195. #define Fp F3
  25196. #define Kp 0x6D703EF3
  25197. P2( D, E, A, B, C, 3, 11, 15, 9 );
  25198. P2( C, D, E, A, B, 10, 13, 5, 7 );
  25199. P2( B, C, D, E, A, 14, 6, 1, 15 );
  25200. P2( A, B, C, D, E, 4, 7, 3, 11 );
  25201. P2( E, A, B, C, D, 9, 14, 7, 8 );
  25202. P2( D, E, A, B, C, 15, 9, 14, 6 );
  25203. P2( C, D, E, A, B, 8, 13, 6, 6 );
  25204. P2( B, C, D, E, A, 1, 15, 9, 14 );
  25205. P2( A, B, C, D, E, 2, 14, 11, 12 );
  25206. P2( E, A, B, C, D, 7, 8, 8, 13 );
  25207. P2( D, E, A, B, C, 0, 13, 12, 5 );
  25208. P2( C, D, E, A, B, 6, 6, 2, 14 );
  25209. P2( B, C, D, E, A, 13, 5, 10, 13 );
  25210. P2( A, B, C, D, E, 11, 12, 0, 13 );
  25211. P2( E, A, B, C, D, 5, 7, 4, 7 );
  25212. P2( D, E, A, B, C, 12, 5, 13, 5 );
  25213. #undef F
  25214. #undef K
  25215. #undef Fp
  25216. #undef Kp
  25217. #define F F4
  25218. #define K 0x8F1BBCDC
  25219. #define Fp F2
  25220. #define Kp 0x7A6D76E9
  25221. P2( C, D, E, A, B, 1, 11, 8, 15 );
  25222. P2( B, C, D, E, A, 9, 12, 6, 5 );
  25223. P2( A, B, C, D, E, 11, 14, 4, 8 );
  25224. P2( E, A, B, C, D, 10, 15, 1, 11 );
  25225. P2( D, E, A, B, C, 0, 14, 3, 14 );
  25226. P2( C, D, E, A, B, 8, 15, 11, 14 );
  25227. P2( B, C, D, E, A, 12, 9, 15, 6 );
  25228. P2( A, B, C, D, E, 4, 8, 0, 14 );
  25229. P2( E, A, B, C, D, 13, 9, 5, 6 );
  25230. P2( D, E, A, B, C, 3, 14, 12, 9 );
  25231. P2( C, D, E, A, B, 7, 5, 2, 12 );
  25232. P2( B, C, D, E, A, 15, 6, 13, 9 );
  25233. P2( A, B, C, D, E, 14, 8, 9, 12 );
  25234. P2( E, A, B, C, D, 5, 6, 7, 5 );
  25235. P2( D, E, A, B, C, 6, 5, 10, 15 );
  25236. P2( C, D, E, A, B, 2, 12, 14, 8 );
  25237. #undef F
  25238. #undef K
  25239. #undef Fp
  25240. #undef Kp
  25241. #define F F5
  25242. #define K 0xA953FD4E
  25243. #define Fp F1
  25244. #define Kp 0x00000000
  25245. P2( B, C, D, E, A, 4, 9, 12, 8 );
  25246. P2( A, B, C, D, E, 0, 15, 15, 5 );
  25247. P2( E, A, B, C, D, 5, 5, 10, 12 );
  25248. P2( D, E, A, B, C, 9, 11, 4, 9 );
  25249. P2( C, D, E, A, B, 7, 6, 1, 12 );
  25250. P2( B, C, D, E, A, 12, 8, 5, 5 );
  25251. P2( A, B, C, D, E, 2, 13, 8, 14 );
  25252. P2( E, A, B, C, D, 10, 12, 7, 6 );
  25253. P2( D, E, A, B, C, 14, 5, 6, 8 );
  25254. P2( C, D, E, A, B, 1, 12, 2, 13 );
  25255. P2( B, C, D, E, A, 3, 13, 13, 6 );
  25256. P2( A, B, C, D, E, 8, 14, 14, 5 );
  25257. P2( E, A, B, C, D, 11, 11, 0, 15 );
  25258. P2( D, E, A, B, C, 6, 8, 3, 13 );
  25259. P2( C, D, E, A, B, 15, 5, 9, 11 );
  25260. P2( B, C, D, E, A, 13, 6, 11, 11 );
  25261. #undef F
  25262. #undef K
  25263. #undef Fp
  25264. #undef Kp
  25265. C = ctx->state[1] + C + Dp;
  25266. ctx->state[1] = ctx->state[2] + D + Ep;
  25267. ctx->state[2] = ctx->state[3] + E + Ap;
  25268. ctx->state[3] = ctx->state[4] + A + Bp;
  25269. ctx->state[4] = ctx->state[0] + B + Cp;
  25270. ctx->state[0] = C;
  25271. }
  25272. #endif /* !MBEDTLS_RIPEMD160_PROCESS_ALT */
  25273. /*
  25274. * RIPEMD-160 process buffer
  25275. */
  25276. void mbedtls_ripemd160_update( mbedtls_ripemd160_context *ctx,
  25277. const unsigned char *input, size_t ilen )
  25278. {
  25279. size_t fill;
  25280. uint32_t left;
  25281. if( ilen == 0 )
  25282. return;
  25283. left = ctx->total[0] & 0x3F;
  25284. fill = 64 - left;
  25285. ctx->total[0] += (uint32_t) ilen;
  25286. ctx->total[0] &= 0xFFFFFFFF;
  25287. if( ctx->total[0] < (uint32_t) ilen )
  25288. ctx->total[1]++;
  25289. if( left && ilen >= fill )
  25290. {
  25291. memcpy( (void *) (ctx->buffer + left), input, fill );
  25292. mbedtls_ripemd160_process( ctx, ctx->buffer );
  25293. input += fill;
  25294. ilen -= fill;
  25295. left = 0;
  25296. }
  25297. while( ilen >= 64 )
  25298. {
  25299. mbedtls_ripemd160_process( ctx, input );
  25300. input += 64;
  25301. ilen -= 64;
  25302. }
  25303. if( ilen > 0 )
  25304. {
  25305. memcpy( (void *) (ctx->buffer + left), input, ilen );
  25306. }
  25307. }
  25308. static const unsigned char ripemd160_padding[64] =
  25309. {
  25310. 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  25311. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  25312. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  25313. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  25314. };
  25315. /*
  25316. * RIPEMD-160 final digest
  25317. */
  25318. void mbedtls_ripemd160_finish( mbedtls_ripemd160_context *ctx, unsigned char output[20] )
  25319. {
  25320. uint32_t last, padn;
  25321. uint32_t high, low;
  25322. unsigned char msglen[8];
  25323. high = ( ctx->total[0] >> 29 )
  25324. | ( ctx->total[1] << 3 );
  25325. low = ( ctx->total[0] << 3 );
  25326. PUT_UINT32_LE( low, msglen, 0 );
  25327. PUT_UINT32_LE( high, msglen, 4 );
  25328. last = ctx->total[0] & 0x3F;
  25329. padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );
  25330. mbedtls_ripemd160_update( ctx, ripemd160_padding, padn );
  25331. mbedtls_ripemd160_update( ctx, msglen, 8 );
  25332. PUT_UINT32_LE( ctx->state[0], output, 0 );
  25333. PUT_UINT32_LE( ctx->state[1], output, 4 );
  25334. PUT_UINT32_LE( ctx->state[2], output, 8 );
  25335. PUT_UINT32_LE( ctx->state[3], output, 12 );
  25336. PUT_UINT32_LE( ctx->state[4], output, 16 );
  25337. }
  25338. /*
  25339. * output = RIPEMD-160( input buffer )
  25340. */
  25341. void mbedtls_ripemd160( const unsigned char *input, size_t ilen,
  25342. unsigned char output[20] )
  25343. {
  25344. mbedtls_ripemd160_context ctx;
  25345. mbedtls_ripemd160_init( &ctx );
  25346. mbedtls_ripemd160_starts( &ctx );
  25347. mbedtls_ripemd160_update( &ctx, input, ilen );
  25348. mbedtls_ripemd160_finish( &ctx, output );
  25349. mbedtls_ripemd160_free( &ctx );
  25350. }
  25351. #if defined(MBEDTLS_SELF_TEST)
  25352. /*
  25353. * Test vectors from the RIPEMD-160 paper and
  25354. * http://homes.esat.kuleuven.be/~bosselae/mbedtls_ripemd160.html#HMAC
  25355. */
  25356. #define TESTS 8
  25357. #define KEYS 2
  25358. static const char *ripemd160_test_input[TESTS] =
  25359. {
  25360. "",
  25361. "a",
  25362. "abc",
  25363. "message digest",
  25364. "abcdefghijklmnopqrstuvwxyz",
  25365. "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
  25366. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
  25367. "1234567890123456789012345678901234567890"
  25368. "1234567890123456789012345678901234567890",
  25369. };
  25370. static const unsigned char ripemd160_test_md[TESTS][20] =
  25371. {
  25372. { 0x9c, 0x11, 0x85, 0xa5, 0xc5, 0xe9, 0xfc, 0x54, 0x61, 0x28,
  25373. 0x08, 0x97, 0x7e, 0xe8, 0xf5, 0x48, 0xb2, 0x25, 0x8d, 0x31 },
  25374. { 0x0b, 0xdc, 0x9d, 0x2d, 0x25, 0x6b, 0x3e, 0xe9, 0xda, 0xae,
  25375. 0x34, 0x7b, 0xe6, 0xf4, 0xdc, 0x83, 0x5a, 0x46, 0x7f, 0xfe },
  25376. { 0x8e, 0xb2, 0x08, 0xf7, 0xe0, 0x5d, 0x98, 0x7a, 0x9b, 0x04,
  25377. 0x4a, 0x8e, 0x98, 0xc6, 0xb0, 0x87, 0xf1, 0x5a, 0x0b, 0xfc },
  25378. { 0x5d, 0x06, 0x89, 0xef, 0x49, 0xd2, 0xfa, 0xe5, 0x72, 0xb8,
  25379. 0x81, 0xb1, 0x23, 0xa8, 0x5f, 0xfa, 0x21, 0x59, 0x5f, 0x36 },
  25380. { 0xf7, 0x1c, 0x27, 0x10, 0x9c, 0x69, 0x2c, 0x1b, 0x56, 0xbb,
  25381. 0xdc, 0xeb, 0x5b, 0x9d, 0x28, 0x65, 0xb3, 0x70, 0x8d, 0xbc },
  25382. { 0x12, 0xa0, 0x53, 0x38, 0x4a, 0x9c, 0x0c, 0x88, 0xe4, 0x05,
  25383. 0xa0, 0x6c, 0x27, 0xdc, 0xf4, 0x9a, 0xda, 0x62, 0xeb, 0x2b },
  25384. { 0xb0, 0xe2, 0x0b, 0x6e, 0x31, 0x16, 0x64, 0x02, 0x86, 0xed,
  25385. 0x3a, 0x87, 0xa5, 0x71, 0x30, 0x79, 0xb2, 0x1f, 0x51, 0x89 },
  25386. { 0x9b, 0x75, 0x2e, 0x45, 0x57, 0x3d, 0x4b, 0x39, 0xf4, 0xdb,
  25387. 0xd3, 0x32, 0x3c, 0xab, 0x82, 0xbf, 0x63, 0x32, 0x6b, 0xfb },
  25388. };
  25389. /*
  25390. * Checkup routine
  25391. */
  25392. int mbedtls_ripemd160_self_test( int verbose )
  25393. {
  25394. int i;
  25395. unsigned char output[20];
  25396. memset( output, 0, sizeof output );
  25397. for( i = 0; i < TESTS; i++ )
  25398. {
  25399. if( verbose != 0 )
  25400. mbedtls_printf( " RIPEMD-160 test #%d: ", i + 1 );
  25401. mbedtls_ripemd160( (const unsigned char *) ripemd160_test_input[i],
  25402. strlen( ripemd160_test_input[i] ),
  25403. output );
  25404. if( memcmp( output, ripemd160_test_md[i], 20 ) != 0 )
  25405. {
  25406. if( verbose != 0 )
  25407. mbedtls_printf( "failed\n" );
  25408. return( 1 );
  25409. }
  25410. if( verbose != 0 )
  25411. mbedtls_printf( "passed\n" );
  25412. }
  25413. return( 0 );
  25414. }
  25415. #endif /* MBEDTLS_SELF_TEST */
  25416. /* Amalgamated Release Mappings */
  25417. #undef F
  25418. #undef K
  25419. #undef F1
  25420. #undef F2
  25421. #undef F3
  25422. #undef F4
  25423. #undef F5
  25424. #undef P
  25425. #undef S
  25426. #endif /* MBEDTLS_RIPEMD160_C */
  25427. /********* Start of file library/rsa.c ************/
  25428. /*
  25429. * The RSA public-key cryptosystem
  25430. *
  25431. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  25432. * SPDX-License-Identifier: Apache-2.0
  25433. *
  25434. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  25435. * not use this file except in compliance with the License.
  25436. * You may obtain a copy of the License at
  25437. *
  25438. * http://www.apache.org/licenses/LICENSE-2.0
  25439. *
  25440. * Unless required by applicable law or agreed to in writing, software
  25441. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  25442. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  25443. * See the License for the specific language governing permissions and
  25444. * limitations under the License.
  25445. *
  25446. * This file is part of mbed TLS (https://tls.mbed.org)
  25447. */
  25448. /*
  25449. * RSA was designed by Ron Rivest, Adi Shamir and Len Adleman.
  25450. *
  25451. * http://theory.lcs.mit.edu/~rivest/rsapaper.pdf
  25452. * http://www.cacr.math.uwaterloo.ca/hac/about/chap8.pdf
  25453. */
  25454. #if !defined(MBEDTLS_CONFIG_FILE)
  25455. #else
  25456. #endif
  25457. #if defined(MBEDTLS_RSA_C)
  25458. #include <string.h>
  25459. #if defined(MBEDTLS_PKCS1_V21)
  25460. #endif
  25461. #if defined(MBEDTLS_PKCS1_V15) && !defined(__OpenBSD__)
  25462. #include <stdlib.h>
  25463. #endif
  25464. #if defined(MBEDTLS_PLATFORM_C)
  25465. #else
  25466. #include <stdio.h>
  25467. #define mbedtls_printf printf
  25468. #define mbedtls_calloc calloc
  25469. #define mbedtls_free free
  25470. #endif
  25471. /*
  25472. * Initialize an RSA context
  25473. */
  25474. void mbedtls_rsa_init( mbedtls_rsa_context *ctx,
  25475. int padding,
  25476. int hash_id )
  25477. {
  25478. memset( ctx, 0, sizeof( mbedtls_rsa_context ) );
  25479. mbedtls_rsa_set_padding( ctx, padding, hash_id );
  25480. #if defined(MBEDTLS_THREADING_C)
  25481. mbedtls_mutex_init( &ctx->mutex );
  25482. #endif
  25483. }
  25484. /*
  25485. * Set padding for an existing RSA context
  25486. */
  25487. void mbedtls_rsa_set_padding( mbedtls_rsa_context *ctx, int padding, int hash_id )
  25488. {
  25489. ctx->padding = padding;
  25490. ctx->hash_id = hash_id;
  25491. }
  25492. #if defined(MBEDTLS_GENPRIME)
  25493. /*
  25494. * Generate an RSA keypair
  25495. */
  25496. int mbedtls_rsa_gen_key( mbedtls_rsa_context *ctx,
  25497. int (*f_rng)(void *, unsigned char *, size_t),
  25498. void *p_rng,
  25499. unsigned int nbits, int exponent )
  25500. {
  25501. int ret;
  25502. mbedtls_mpi P1, Q1, H, G;
  25503. if( f_rng == NULL || nbits < 128 || exponent < 3 )
  25504. return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  25505. mbedtls_mpi_init( &P1 ); mbedtls_mpi_init( &Q1 ); mbedtls_mpi_init( &H ); mbedtls_mpi_init( &G );
  25506. /*
  25507. * find primes P and Q with Q < P so that:
  25508. * GCD( E, (P-1)*(Q-1) ) == 1
  25509. */
  25510. MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &ctx->E, exponent ) );
  25511. do
  25512. {
  25513. MBEDTLS_MPI_CHK( mbedtls_mpi_gen_prime( &ctx->P, ( nbits + 1 ) >> 1, 0,
  25514. f_rng, p_rng ) );
  25515. MBEDTLS_MPI_CHK( mbedtls_mpi_gen_prime( &ctx->Q, ( nbits + 1 ) >> 1, 0,
  25516. f_rng, p_rng ) );
  25517. if( mbedtls_mpi_cmp_mpi( &ctx->P, &ctx->Q ) < 0 )
  25518. mbedtls_mpi_swap( &ctx->P, &ctx->Q );
  25519. if( mbedtls_mpi_cmp_mpi( &ctx->P, &ctx->Q ) == 0 )
  25520. continue;
  25521. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &ctx->N, &ctx->P, &ctx->Q ) );
  25522. if( mbedtls_mpi_bitlen( &ctx->N ) != nbits )
  25523. continue;
  25524. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &P1, &ctx->P, 1 ) );
  25525. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &Q1, &ctx->Q, 1 ) );
  25526. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &H, &P1, &Q1 ) );
  25527. MBEDTLS_MPI_CHK( mbedtls_mpi_gcd( &G, &ctx->E, &H ) );
  25528. }
  25529. while( mbedtls_mpi_cmp_int( &G, 1 ) != 0 );
  25530. /*
  25531. * D = E^-1 mod ((P-1)*(Q-1))
  25532. * DP = D mod (P - 1)
  25533. * DQ = D mod (Q - 1)
  25534. * QP = Q^-1 mod P
  25535. */
  25536. MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( &ctx->D , &ctx->E, &H ) );
  25537. MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &ctx->DP, &ctx->D, &P1 ) );
  25538. MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &ctx->DQ, &ctx->D, &Q1 ) );
  25539. MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( &ctx->QP, &ctx->Q, &ctx->P ) );
  25540. ctx->len = ( mbedtls_mpi_bitlen( &ctx->N ) + 7 ) >> 3;
  25541. cleanup:
  25542. mbedtls_mpi_free( &P1 ); mbedtls_mpi_free( &Q1 ); mbedtls_mpi_free( &H ); mbedtls_mpi_free( &G );
  25543. if( ret != 0 )
  25544. {
  25545. mbedtls_rsa_free( ctx );
  25546. return( MBEDTLS_ERR_RSA_KEY_GEN_FAILED + ret );
  25547. }
  25548. return( 0 );
  25549. }
  25550. #endif /* MBEDTLS_GENPRIME */
  25551. /*
  25552. * Check a public RSA key
  25553. */
  25554. int mbedtls_rsa_check_pubkey( const mbedtls_rsa_context *ctx )
  25555. {
  25556. if( !ctx->N.p || !ctx->E.p )
  25557. return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED );
  25558. if( ( ctx->N.p[0] & 1 ) == 0 ||
  25559. ( ctx->E.p[0] & 1 ) == 0 )
  25560. return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED );
  25561. if( mbedtls_mpi_bitlen( &ctx->N ) < 128 ||
  25562. mbedtls_mpi_bitlen( &ctx->N ) > MBEDTLS_MPI_MAX_BITS )
  25563. return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED );
  25564. if( mbedtls_mpi_bitlen( &ctx->E ) < 2 ||
  25565. mbedtls_mpi_cmp_mpi( &ctx->E, &ctx->N ) >= 0 )
  25566. return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED );
  25567. return( 0 );
  25568. }
  25569. /*
  25570. * Check a private RSA key
  25571. */
  25572. int mbedtls_rsa_check_privkey( const mbedtls_rsa_context *ctx )
  25573. {
  25574. int ret;
  25575. mbedtls_mpi PQ, DE, P1, Q1, H, I, G, G2, L1, L2, DP, DQ, QP;
  25576. if( ( ret = mbedtls_rsa_check_pubkey( ctx ) ) != 0 )
  25577. return( ret );
  25578. if( !ctx->P.p || !ctx->Q.p || !ctx->D.p )
  25579. return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED );
  25580. mbedtls_mpi_init( &PQ ); mbedtls_mpi_init( &DE ); mbedtls_mpi_init( &P1 ); mbedtls_mpi_init( &Q1 );
  25581. mbedtls_mpi_init( &H ); mbedtls_mpi_init( &I ); mbedtls_mpi_init( &G ); mbedtls_mpi_init( &G2 );
  25582. mbedtls_mpi_init( &L1 ); mbedtls_mpi_init( &L2 ); mbedtls_mpi_init( &DP ); mbedtls_mpi_init( &DQ );
  25583. mbedtls_mpi_init( &QP );
  25584. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &PQ, &ctx->P, &ctx->Q ) );
  25585. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &DE, &ctx->D, &ctx->E ) );
  25586. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &P1, &ctx->P, 1 ) );
  25587. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &Q1, &ctx->Q, 1 ) );
  25588. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &H, &P1, &Q1 ) );
  25589. MBEDTLS_MPI_CHK( mbedtls_mpi_gcd( &G, &ctx->E, &H ) );
  25590. MBEDTLS_MPI_CHK( mbedtls_mpi_gcd( &G2, &P1, &Q1 ) );
  25591. MBEDTLS_MPI_CHK( mbedtls_mpi_div_mpi( &L1, &L2, &H, &G2 ) );
  25592. MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &I, &DE, &L1 ) );
  25593. MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &DP, &ctx->D, &P1 ) );
  25594. MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &DQ, &ctx->D, &Q1 ) );
  25595. MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( &QP, &ctx->Q, &ctx->P ) );
  25596. /*
  25597. * Check for a valid PKCS1v2 private key
  25598. */
  25599. if( mbedtls_mpi_cmp_mpi( &PQ, &ctx->N ) != 0 ||
  25600. mbedtls_mpi_cmp_mpi( &DP, &ctx->DP ) != 0 ||
  25601. mbedtls_mpi_cmp_mpi( &DQ, &ctx->DQ ) != 0 ||
  25602. mbedtls_mpi_cmp_mpi( &QP, &ctx->QP ) != 0 ||
  25603. mbedtls_mpi_cmp_int( &L2, 0 ) != 0 ||
  25604. mbedtls_mpi_cmp_int( &I, 1 ) != 0 ||
  25605. mbedtls_mpi_cmp_int( &G, 1 ) != 0 )
  25606. {
  25607. ret = MBEDTLS_ERR_RSA_KEY_CHECK_FAILED;
  25608. }
  25609. cleanup:
  25610. mbedtls_mpi_free( &PQ ); mbedtls_mpi_free( &DE ); mbedtls_mpi_free( &P1 ); mbedtls_mpi_free( &Q1 );
  25611. mbedtls_mpi_free( &H ); mbedtls_mpi_free( &I ); mbedtls_mpi_free( &G ); mbedtls_mpi_free( &G2 );
  25612. mbedtls_mpi_free( &L1 ); mbedtls_mpi_free( &L2 ); mbedtls_mpi_free( &DP ); mbedtls_mpi_free( &DQ );
  25613. mbedtls_mpi_free( &QP );
  25614. if( ret == MBEDTLS_ERR_RSA_KEY_CHECK_FAILED )
  25615. return( ret );
  25616. if( ret != 0 )
  25617. return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED + ret );
  25618. return( 0 );
  25619. }
  25620. /*
  25621. * Check if contexts holding a public and private key match
  25622. */
  25623. int mbedtls_rsa_check_pub_priv( const mbedtls_rsa_context *pub, const mbedtls_rsa_context *prv )
  25624. {
  25625. if( mbedtls_rsa_check_pubkey( pub ) != 0 ||
  25626. mbedtls_rsa_check_privkey( prv ) != 0 )
  25627. {
  25628. return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED );
  25629. }
  25630. if( mbedtls_mpi_cmp_mpi( &pub->N, &prv->N ) != 0 ||
  25631. mbedtls_mpi_cmp_mpi( &pub->E, &prv->E ) != 0 )
  25632. {
  25633. return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED );
  25634. }
  25635. return( 0 );
  25636. }
  25637. /*
  25638. * Do an RSA public key operation
  25639. */
  25640. int mbedtls_rsa_public( mbedtls_rsa_context *ctx,
  25641. const unsigned char *input,
  25642. unsigned char *output )
  25643. {
  25644. int ret;
  25645. size_t olen;
  25646. mbedtls_mpi T;
  25647. mbedtls_mpi_init( &T );
  25648. #if defined(MBEDTLS_THREADING_C)
  25649. if( ( ret = mbedtls_mutex_lock( &ctx->mutex ) ) != 0 )
  25650. return( ret );
  25651. #endif
  25652. MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &T, input, ctx->len ) );
  25653. if( mbedtls_mpi_cmp_mpi( &T, &ctx->N ) >= 0 )
  25654. {
  25655. ret = MBEDTLS_ERR_MPI_BAD_INPUT_DATA;
  25656. goto cleanup;
  25657. }
  25658. olen = ctx->len;
  25659. MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &T, &T, &ctx->E, &ctx->N, &ctx->RN ) );
  25660. MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &T, output, olen ) );
  25661. cleanup:
  25662. #if defined(MBEDTLS_THREADING_C)
  25663. if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 )
  25664. return( MBEDTLS_ERR_THREADING_MUTEX_ERROR );
  25665. #endif
  25666. mbedtls_mpi_free( &T );
  25667. if( ret != 0 )
  25668. return( MBEDTLS_ERR_RSA_PUBLIC_FAILED + ret );
  25669. return( 0 );
  25670. }
  25671. /*
  25672. * Generate or update blinding values, see section 10 of:
  25673. * KOCHER, Paul C. Timing attacks on implementations of Diffie-Hellman, RSA,
  25674. * DSS, and other systems. In : Advances in Cryptology-CRYPTO'96. Springer
  25675. * Berlin Heidelberg, 1996. p. 104-113.
  25676. */
  25677. static int rsa_prepare_blinding( mbedtls_rsa_context *ctx,
  25678. int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
  25679. {
  25680. int ret, count = 0;
  25681. if( ctx->Vf.p != NULL )
  25682. {
  25683. /* We already have blinding values, just update them by squaring */
  25684. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &ctx->Vi, &ctx->Vi, &ctx->Vi ) );
  25685. MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &ctx->Vi, &ctx->Vi, &ctx->N ) );
  25686. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &ctx->Vf, &ctx->Vf, &ctx->Vf ) );
  25687. MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &ctx->Vf, &ctx->Vf, &ctx->N ) );
  25688. goto cleanup;
  25689. }
  25690. /* Unblinding value: Vf = random number, invertible mod N */
  25691. do {
  25692. if( count++ > 10 )
  25693. return( MBEDTLS_ERR_RSA_RNG_FAILED );
  25694. MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &ctx->Vf, ctx->len - 1, f_rng, p_rng ) );
  25695. MBEDTLS_MPI_CHK( mbedtls_mpi_gcd( &ctx->Vi, &ctx->Vf, &ctx->N ) );
  25696. } while( mbedtls_mpi_cmp_int( &ctx->Vi, 1 ) != 0 );
  25697. /* Blinding value: Vi = Vf^(-e) mod N */
  25698. MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( &ctx->Vi, &ctx->Vf, &ctx->N ) );
  25699. MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &ctx->Vi, &ctx->Vi, &ctx->E, &ctx->N, &ctx->RN ) );
  25700. cleanup:
  25701. return( ret );
  25702. }
  25703. /*
  25704. * Do an RSA private key operation
  25705. */
  25706. int mbedtls_rsa_private( mbedtls_rsa_context *ctx,
  25707. int (*f_rng)(void *, unsigned char *, size_t),
  25708. void *p_rng,
  25709. const unsigned char *input,
  25710. unsigned char *output )
  25711. {
  25712. int ret;
  25713. size_t olen;
  25714. mbedtls_mpi T, T1, T2;
  25715. /* Make sure we have private key info, prevent possible misuse */
  25716. if( ctx->P.p == NULL || ctx->Q.p == NULL || ctx->D.p == NULL )
  25717. return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  25718. mbedtls_mpi_init( &T ); mbedtls_mpi_init( &T1 ); mbedtls_mpi_init( &T2 );
  25719. #if defined(MBEDTLS_THREADING_C)
  25720. if( ( ret = mbedtls_mutex_lock( &ctx->mutex ) ) != 0 )
  25721. return( ret );
  25722. #endif
  25723. MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &T, input, ctx->len ) );
  25724. if( mbedtls_mpi_cmp_mpi( &T, &ctx->N ) >= 0 )
  25725. {
  25726. ret = MBEDTLS_ERR_MPI_BAD_INPUT_DATA;
  25727. goto cleanup;
  25728. }
  25729. if( f_rng != NULL )
  25730. {
  25731. /*
  25732. * Blinding
  25733. * T = T * Vi mod N
  25734. */
  25735. MBEDTLS_MPI_CHK( rsa_prepare_blinding( ctx, f_rng, p_rng ) );
  25736. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T, &T, &ctx->Vi ) );
  25737. MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &T, &T, &ctx->N ) );
  25738. }
  25739. #if defined(MBEDTLS_RSA_NO_CRT)
  25740. MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &T, &T, &ctx->D, &ctx->N, &ctx->RN ) );
  25741. #else
  25742. /*
  25743. * faster decryption using the CRT
  25744. *
  25745. * T1 = input ^ dP mod P
  25746. * T2 = input ^ dQ mod Q
  25747. */
  25748. MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &T1, &T, &ctx->DP, &ctx->P, &ctx->RP ) );
  25749. MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &T2, &T, &ctx->DQ, &ctx->Q, &ctx->RQ ) );
  25750. /*
  25751. * T = (T1 - T2) * (Q^-1 mod P) mod P
  25752. */
  25753. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &T, &T1, &T2 ) );
  25754. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T1, &T, &ctx->QP ) );
  25755. MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &T, &T1, &ctx->P ) );
  25756. /*
  25757. * T = T2 + T * Q
  25758. */
  25759. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T1, &T, &ctx->Q ) );
  25760. MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &T, &T2, &T1 ) );
  25761. #endif /* MBEDTLS_RSA_NO_CRT */
  25762. if( f_rng != NULL )
  25763. {
  25764. /*
  25765. * Unblind
  25766. * T = T * Vf mod N
  25767. */
  25768. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T, &T, &ctx->Vf ) );
  25769. MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &T, &T, &ctx->N ) );
  25770. }
  25771. olen = ctx->len;
  25772. MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &T, output, olen ) );
  25773. cleanup:
  25774. #if defined(MBEDTLS_THREADING_C)
  25775. if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 )
  25776. return( MBEDTLS_ERR_THREADING_MUTEX_ERROR );
  25777. #endif
  25778. mbedtls_mpi_free( &T ); mbedtls_mpi_free( &T1 ); mbedtls_mpi_free( &T2 );
  25779. if( ret != 0 )
  25780. return( MBEDTLS_ERR_RSA_PRIVATE_FAILED + ret );
  25781. return( 0 );
  25782. }
  25783. #if defined(MBEDTLS_PKCS1_V21)
  25784. /**
  25785. * Generate and apply the MGF1 operation (from PKCS#1 v2.1) to a buffer.
  25786. *
  25787. * \param dst buffer to mask
  25788. * \param dlen length of destination buffer
  25789. * \param src source of the mask generation
  25790. * \param slen length of the source buffer
  25791. * \param md_ctx message digest context to use
  25792. */
  25793. static void mgf_mask( unsigned char *dst, size_t dlen, unsigned char *src,
  25794. size_t slen, mbedtls_md_context_t *md_ctx )
  25795. {
  25796. unsigned char mask[MBEDTLS_MD_MAX_SIZE];
  25797. unsigned char counter[4];
  25798. unsigned char *p;
  25799. unsigned int hlen;
  25800. size_t i, use_len;
  25801. memset( mask, 0, MBEDTLS_MD_MAX_SIZE );
  25802. memset( counter, 0, 4 );
  25803. hlen = mbedtls_md_get_size( md_ctx->md_info );
  25804. // Generate and apply dbMask
  25805. //
  25806. p = dst;
  25807. while( dlen > 0 )
  25808. {
  25809. use_len = hlen;
  25810. if( dlen < hlen )
  25811. use_len = dlen;
  25812. mbedtls_md_starts( md_ctx );
  25813. mbedtls_md_update( md_ctx, src, slen );
  25814. mbedtls_md_update( md_ctx, counter, 4 );
  25815. mbedtls_md_finish( md_ctx, mask );
  25816. for( i = 0; i < use_len; ++i )
  25817. *p++ ^= mask[i];
  25818. counter[3]++;
  25819. dlen -= use_len;
  25820. }
  25821. }
  25822. #endif /* MBEDTLS_PKCS1_V21 */
  25823. #if defined(MBEDTLS_PKCS1_V21)
  25824. /*
  25825. * Implementation of the PKCS#1 v2.1 RSAES-OAEP-ENCRYPT function
  25826. */
  25827. int mbedtls_rsa_rsaes_oaep_encrypt( mbedtls_rsa_context *ctx,
  25828. int (*f_rng)(void *, unsigned char *, size_t),
  25829. void *p_rng,
  25830. int mode,
  25831. const unsigned char *label, size_t label_len,
  25832. size_t ilen,
  25833. const unsigned char *input,
  25834. unsigned char *output )
  25835. {
  25836. size_t olen;
  25837. int ret;
  25838. unsigned char *p = output;
  25839. unsigned int hlen;
  25840. const mbedtls_md_info_t *md_info;
  25841. mbedtls_md_context_t md_ctx;
  25842. if( mode == MBEDTLS_RSA_PRIVATE && ctx->padding != MBEDTLS_RSA_PKCS_V21 )
  25843. return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  25844. if( f_rng == NULL )
  25845. return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  25846. md_info = mbedtls_md_info_from_type( (mbedtls_md_type_t) ctx->hash_id );
  25847. if( md_info == NULL )
  25848. return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  25849. olen = ctx->len;
  25850. hlen = mbedtls_md_get_size( md_info );
  25851. if( olen < ilen + 2 * hlen + 2 )
  25852. return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  25853. memset( output, 0, olen );
  25854. *p++ = 0;
  25855. // Generate a random octet string seed
  25856. //
  25857. if( ( ret = f_rng( p_rng, p, hlen ) ) != 0 )
  25858. return( MBEDTLS_ERR_RSA_RNG_FAILED + ret );
  25859. p += hlen;
  25860. // Construct DB
  25861. //
  25862. mbedtls_md( md_info, label, label_len, p );
  25863. p += hlen;
  25864. p += olen - 2 * hlen - 2 - ilen;
  25865. *p++ = 1;
  25866. memcpy( p, input, ilen );
  25867. mbedtls_md_init( &md_ctx );
  25868. mbedtls_md_setup( &md_ctx, md_info, 0 );
  25869. // maskedDB: Apply dbMask to DB
  25870. //
  25871. mgf_mask( output + hlen + 1, olen - hlen - 1, output + 1, hlen,
  25872. &md_ctx );
  25873. // maskedSeed: Apply seedMask to seed
  25874. //
  25875. mgf_mask( output + 1, hlen, output + hlen + 1, olen - hlen - 1,
  25876. &md_ctx );
  25877. mbedtls_md_free( &md_ctx );
  25878. return( ( mode == MBEDTLS_RSA_PUBLIC )
  25879. ? mbedtls_rsa_public( ctx, output, output )
  25880. : mbedtls_rsa_private( ctx, f_rng, p_rng, output, output ) );
  25881. }
  25882. #endif /* MBEDTLS_PKCS1_V21 */
  25883. #if defined(MBEDTLS_PKCS1_V15)
  25884. /*
  25885. * Implementation of the PKCS#1 v2.1 RSAES-PKCS1-V1_5-ENCRYPT function
  25886. */
  25887. int mbedtls_rsa_rsaes_pkcs1_v15_encrypt( mbedtls_rsa_context *ctx,
  25888. int (*f_rng)(void *, unsigned char *, size_t),
  25889. void *p_rng,
  25890. int mode, size_t ilen,
  25891. const unsigned char *input,
  25892. unsigned char *output )
  25893. {
  25894. size_t nb_pad, olen;
  25895. int ret;
  25896. unsigned char *p = output;
  25897. if( mode == MBEDTLS_RSA_PRIVATE && ctx->padding != MBEDTLS_RSA_PKCS_V15 )
  25898. return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  25899. if( f_rng == NULL )
  25900. return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  25901. olen = ctx->len;
  25902. if( olen < ilen + 11 )
  25903. return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  25904. nb_pad = olen - 3 - ilen;
  25905. *p++ = 0;
  25906. if( mode == MBEDTLS_RSA_PUBLIC )
  25907. {
  25908. *p++ = MBEDTLS_RSA_CRYPT;
  25909. while( nb_pad-- > 0 )
  25910. {
  25911. int rng_dl = 100;
  25912. do {
  25913. ret = f_rng( p_rng, p, 1 );
  25914. } while( *p == 0 && --rng_dl && ret == 0 );
  25915. // Check if RNG failed to generate data
  25916. //
  25917. if( rng_dl == 0 || ret != 0 )
  25918. return( MBEDTLS_ERR_RSA_RNG_FAILED + ret );
  25919. p++;
  25920. }
  25921. }
  25922. else
  25923. {
  25924. *p++ = MBEDTLS_RSA_SIGN;
  25925. while( nb_pad-- > 0 )
  25926. *p++ = 0xFF;
  25927. }
  25928. *p++ = 0;
  25929. memcpy( p, input, ilen );
  25930. return( ( mode == MBEDTLS_RSA_PUBLIC )
  25931. ? mbedtls_rsa_public( ctx, output, output )
  25932. : mbedtls_rsa_private( ctx, f_rng, p_rng, output, output ) );
  25933. }
  25934. #endif /* MBEDTLS_PKCS1_V15 */
  25935. /*
  25936. * Add the message padding, then do an RSA operation
  25937. */
  25938. int mbedtls_rsa_pkcs1_encrypt( mbedtls_rsa_context *ctx,
  25939. int (*f_rng)(void *, unsigned char *, size_t),
  25940. void *p_rng,
  25941. int mode, size_t ilen,
  25942. const unsigned char *input,
  25943. unsigned char *output )
  25944. {
  25945. switch( ctx->padding )
  25946. {
  25947. #if defined(MBEDTLS_PKCS1_V15)
  25948. case MBEDTLS_RSA_PKCS_V15:
  25949. return mbedtls_rsa_rsaes_pkcs1_v15_encrypt( ctx, f_rng, p_rng, mode, ilen,
  25950. input, output );
  25951. #endif
  25952. #if defined(MBEDTLS_PKCS1_V21)
  25953. case MBEDTLS_RSA_PKCS_V21:
  25954. return mbedtls_rsa_rsaes_oaep_encrypt( ctx, f_rng, p_rng, mode, NULL, 0,
  25955. ilen, input, output );
  25956. #endif
  25957. default:
  25958. return( MBEDTLS_ERR_RSA_INVALID_PADDING );
  25959. }
  25960. }
  25961. #if defined(MBEDTLS_PKCS1_V21)
  25962. /*
  25963. * Implementation of the PKCS#1 v2.1 RSAES-OAEP-DECRYPT function
  25964. */
  25965. int mbedtls_rsa_rsaes_oaep_decrypt( mbedtls_rsa_context *ctx,
  25966. int (*f_rng)(void *, unsigned char *, size_t),
  25967. void *p_rng,
  25968. int mode,
  25969. const unsigned char *label, size_t label_len,
  25970. size_t *olen,
  25971. const unsigned char *input,
  25972. unsigned char *output,
  25973. size_t output_max_len )
  25974. {
  25975. int ret;
  25976. size_t ilen, i, pad_len;
  25977. unsigned char *p, bad, pad_done;
  25978. unsigned char buf[MBEDTLS_MPI_MAX_SIZE];
  25979. unsigned char lhash[MBEDTLS_MD_MAX_SIZE];
  25980. unsigned int hlen;
  25981. const mbedtls_md_info_t *md_info;
  25982. mbedtls_md_context_t md_ctx;
  25983. /*
  25984. * Parameters sanity checks
  25985. */
  25986. if( mode == MBEDTLS_RSA_PRIVATE && ctx->padding != MBEDTLS_RSA_PKCS_V21 )
  25987. return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  25988. ilen = ctx->len;
  25989. if( ilen < 16 || ilen > sizeof( buf ) )
  25990. return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  25991. md_info = mbedtls_md_info_from_type( (mbedtls_md_type_t) ctx->hash_id );
  25992. if( md_info == NULL )
  25993. return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  25994. /*
  25995. * RSA operation
  25996. */
  25997. ret = ( mode == MBEDTLS_RSA_PUBLIC )
  25998. ? mbedtls_rsa_public( ctx, input, buf )
  25999. : mbedtls_rsa_private( ctx, f_rng, p_rng, input, buf );
  26000. if( ret != 0 )
  26001. return( ret );
  26002. /*
  26003. * Unmask data and generate lHash
  26004. */
  26005. hlen = mbedtls_md_get_size( md_info );
  26006. mbedtls_md_init( &md_ctx );
  26007. mbedtls_md_setup( &md_ctx, md_info, 0 );
  26008. /* Generate lHash */
  26009. mbedtls_md( md_info, label, label_len, lhash );
  26010. /* seed: Apply seedMask to maskedSeed */
  26011. mgf_mask( buf + 1, hlen, buf + hlen + 1, ilen - hlen - 1,
  26012. &md_ctx );
  26013. /* DB: Apply dbMask to maskedDB */
  26014. mgf_mask( buf + hlen + 1, ilen - hlen - 1, buf + 1, hlen,
  26015. &md_ctx );
  26016. mbedtls_md_free( &md_ctx );
  26017. /*
  26018. * Check contents, in "constant-time"
  26019. */
  26020. p = buf;
  26021. bad = 0;
  26022. bad |= *p++; /* First byte must be 0 */
  26023. p += hlen; /* Skip seed */
  26024. /* Check lHash */
  26025. for( i = 0; i < hlen; i++ )
  26026. bad |= lhash[i] ^ *p++;
  26027. /* Get zero-padding len, but always read till end of buffer
  26028. * (minus one, for the 01 byte) */
  26029. pad_len = 0;
  26030. pad_done = 0;
  26031. for( i = 0; i < ilen - 2 * hlen - 2; i++ )
  26032. {
  26033. pad_done |= p[i];
  26034. pad_len += ((pad_done | (unsigned char)-pad_done) >> 7) ^ 1;
  26035. }
  26036. p += pad_len;
  26037. bad |= *p++ ^ 0x01;
  26038. /*
  26039. * The only information "leaked" is whether the padding was correct or not
  26040. * (eg, no data is copied if it was not correct). This meets the
  26041. * recommendations in PKCS#1 v2.2: an opponent cannot distinguish between
  26042. * the different error conditions.
  26043. */
  26044. if( bad != 0 )
  26045. return( MBEDTLS_ERR_RSA_INVALID_PADDING );
  26046. if( ilen - ( p - buf ) > output_max_len )
  26047. return( MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE );
  26048. *olen = ilen - (p - buf);
  26049. memcpy( output, p, *olen );
  26050. return( 0 );
  26051. }
  26052. #endif /* MBEDTLS_PKCS1_V21 */
  26053. #if defined(MBEDTLS_PKCS1_V15)
  26054. /*
  26055. * Implementation of the PKCS#1 v2.1 RSAES-PKCS1-V1_5-DECRYPT function
  26056. */
  26057. int mbedtls_rsa_rsaes_pkcs1_v15_decrypt( mbedtls_rsa_context *ctx,
  26058. int (*f_rng)(void *, unsigned char *, size_t),
  26059. void *p_rng,
  26060. int mode, size_t *olen,
  26061. const unsigned char *input,
  26062. unsigned char *output,
  26063. size_t output_max_len)
  26064. {
  26065. int ret;
  26066. size_t ilen, pad_count = 0, i;
  26067. unsigned char *p, bad, pad_done = 0;
  26068. unsigned char buf[MBEDTLS_MPI_MAX_SIZE];
  26069. if( mode == MBEDTLS_RSA_PRIVATE && ctx->padding != MBEDTLS_RSA_PKCS_V15 )
  26070. return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  26071. ilen = ctx->len;
  26072. if( ilen < 16 || ilen > sizeof( buf ) )
  26073. return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  26074. ret = ( mode == MBEDTLS_RSA_PUBLIC )
  26075. ? mbedtls_rsa_public( ctx, input, buf )
  26076. : mbedtls_rsa_private( ctx, f_rng, p_rng, input, buf );
  26077. if( ret != 0 )
  26078. return( ret );
  26079. p = buf;
  26080. bad = 0;
  26081. /*
  26082. * Check and get padding len in "constant-time"
  26083. */
  26084. bad |= *p++; /* First byte must be 0 */
  26085. /* This test does not depend on secret data */
  26086. if( mode == MBEDTLS_RSA_PRIVATE )
  26087. {
  26088. bad |= *p++ ^ MBEDTLS_RSA_CRYPT;
  26089. /* Get padding len, but always read till end of buffer
  26090. * (minus one, for the 00 byte) */
  26091. for( i = 0; i < ilen - 3; i++ )
  26092. {
  26093. pad_done |= ((p[i] | (unsigned char)-p[i]) >> 7) ^ 1;
  26094. pad_count += ((pad_done | (unsigned char)-pad_done) >> 7) ^ 1;
  26095. }
  26096. p += pad_count;
  26097. bad |= *p++; /* Must be zero */
  26098. }
  26099. else
  26100. {
  26101. bad |= *p++ ^ MBEDTLS_RSA_SIGN;
  26102. /* Get padding len, but always read till end of buffer
  26103. * (minus one, for the 00 byte) */
  26104. for( i = 0; i < ilen - 3; i++ )
  26105. {
  26106. pad_done |= ( p[i] != 0xFF );
  26107. pad_count += ( pad_done == 0 );
  26108. }
  26109. p += pad_count;
  26110. bad |= *p++; /* Must be zero */
  26111. }
  26112. if( bad )
  26113. return( MBEDTLS_ERR_RSA_INVALID_PADDING );
  26114. if( ilen - ( p - buf ) > output_max_len )
  26115. return( MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE );
  26116. *olen = ilen - (p - buf);
  26117. memcpy( output, p, *olen );
  26118. return( 0 );
  26119. }
  26120. #endif /* MBEDTLS_PKCS1_V15 */
  26121. /*
  26122. * Do an RSA operation, then remove the message padding
  26123. */
  26124. int mbedtls_rsa_pkcs1_decrypt( mbedtls_rsa_context *ctx,
  26125. int (*f_rng)(void *, unsigned char *, size_t),
  26126. void *p_rng,
  26127. int mode, size_t *olen,
  26128. const unsigned char *input,
  26129. unsigned char *output,
  26130. size_t output_max_len)
  26131. {
  26132. switch( ctx->padding )
  26133. {
  26134. #if defined(MBEDTLS_PKCS1_V15)
  26135. case MBEDTLS_RSA_PKCS_V15:
  26136. return mbedtls_rsa_rsaes_pkcs1_v15_decrypt( ctx, f_rng, p_rng, mode, olen,
  26137. input, output, output_max_len );
  26138. #endif
  26139. #if defined(MBEDTLS_PKCS1_V21)
  26140. case MBEDTLS_RSA_PKCS_V21:
  26141. return mbedtls_rsa_rsaes_oaep_decrypt( ctx, f_rng, p_rng, mode, NULL, 0,
  26142. olen, input, output,
  26143. output_max_len );
  26144. #endif
  26145. default:
  26146. return( MBEDTLS_ERR_RSA_INVALID_PADDING );
  26147. }
  26148. }
  26149. #if defined(MBEDTLS_PKCS1_V21)
  26150. /*
  26151. * Implementation of the PKCS#1 v2.1 RSASSA-PSS-SIGN function
  26152. */
  26153. int mbedtls_rsa_rsassa_pss_sign( mbedtls_rsa_context *ctx,
  26154. int (*f_rng)(void *, unsigned char *, size_t),
  26155. void *p_rng,
  26156. int mode,
  26157. mbedtls_md_type_t md_alg,
  26158. unsigned int hashlen,
  26159. const unsigned char *hash,
  26160. unsigned char *sig )
  26161. {
  26162. size_t olen;
  26163. unsigned char *p = sig;
  26164. unsigned char salt[MBEDTLS_MD_MAX_SIZE];
  26165. unsigned int slen, hlen, offset = 0;
  26166. int ret;
  26167. size_t msb;
  26168. const mbedtls_md_info_t *md_info;
  26169. mbedtls_md_context_t md_ctx;
  26170. if( mode == MBEDTLS_RSA_PRIVATE && ctx->padding != MBEDTLS_RSA_PKCS_V21 )
  26171. return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  26172. if( f_rng == NULL )
  26173. return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  26174. olen = ctx->len;
  26175. if( md_alg != MBEDTLS_MD_NONE )
  26176. {
  26177. // Gather length of hash to sign
  26178. //
  26179. md_info = mbedtls_md_info_from_type( md_alg );
  26180. if( md_info == NULL )
  26181. return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  26182. hashlen = mbedtls_md_get_size( md_info );
  26183. }
  26184. md_info = mbedtls_md_info_from_type( (mbedtls_md_type_t) ctx->hash_id );
  26185. if( md_info == NULL )
  26186. return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  26187. hlen = mbedtls_md_get_size( md_info );
  26188. slen = hlen;
  26189. if( olen < hlen + slen + 2 )
  26190. return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  26191. memset( sig, 0, olen );
  26192. // Generate salt of length slen
  26193. //
  26194. if( ( ret = f_rng( p_rng, salt, slen ) ) != 0 )
  26195. return( MBEDTLS_ERR_RSA_RNG_FAILED + ret );
  26196. // Note: EMSA-PSS encoding is over the length of N - 1 bits
  26197. //
  26198. msb = mbedtls_mpi_bitlen( &ctx->N ) - 1;
  26199. p += olen - hlen * 2 - 2;
  26200. *p++ = 0x01;
  26201. memcpy( p, salt, slen );
  26202. p += slen;
  26203. mbedtls_md_init( &md_ctx );
  26204. mbedtls_md_setup( &md_ctx, md_info, 0 );
  26205. // Generate H = Hash( M' )
  26206. //
  26207. mbedtls_md_starts( &md_ctx );
  26208. mbedtls_md_update( &md_ctx, p, 8 );
  26209. mbedtls_md_update( &md_ctx, hash, hashlen );
  26210. mbedtls_md_update( &md_ctx, salt, slen );
  26211. mbedtls_md_finish( &md_ctx, p );
  26212. // Compensate for boundary condition when applying mask
  26213. //
  26214. if( msb % 8 == 0 )
  26215. offset = 1;
  26216. // maskedDB: Apply dbMask to DB
  26217. //
  26218. mgf_mask( sig + offset, olen - hlen - 1 - offset, p, hlen, &md_ctx );
  26219. mbedtls_md_free( &md_ctx );
  26220. msb = mbedtls_mpi_bitlen( &ctx->N ) - 1;
  26221. sig[0] &= 0xFF >> ( olen * 8 - msb );
  26222. p += hlen;
  26223. *p++ = 0xBC;
  26224. return( ( mode == MBEDTLS_RSA_PUBLIC )
  26225. ? mbedtls_rsa_public( ctx, sig, sig )
  26226. : mbedtls_rsa_private( ctx, f_rng, p_rng, sig, sig ) );
  26227. }
  26228. #endif /* MBEDTLS_PKCS1_V21 */
  26229. #if defined(MBEDTLS_PKCS1_V15)
  26230. /*
  26231. * Implementation of the PKCS#1 v2.1 RSASSA-PKCS1-V1_5-SIGN function
  26232. */
  26233. /*
  26234. * Do an RSA operation to sign the message digest
  26235. */
  26236. int mbedtls_rsa_rsassa_pkcs1_v15_sign( mbedtls_rsa_context *ctx,
  26237. int (*f_rng)(void *, unsigned char *, size_t),
  26238. void *p_rng,
  26239. int mode,
  26240. mbedtls_md_type_t md_alg,
  26241. unsigned int hashlen,
  26242. const unsigned char *hash,
  26243. unsigned char *sig )
  26244. {
  26245. size_t nb_pad, olen, oid_size = 0;
  26246. unsigned char *p = sig;
  26247. const char *oid = NULL;
  26248. unsigned char *sig_try = NULL, *verif = NULL;
  26249. size_t i;
  26250. unsigned char diff;
  26251. volatile unsigned char diff_no_optimize;
  26252. int ret;
  26253. if( mode == MBEDTLS_RSA_PRIVATE && ctx->padding != MBEDTLS_RSA_PKCS_V15 )
  26254. return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  26255. olen = ctx->len;
  26256. nb_pad = olen - 3;
  26257. if( md_alg != MBEDTLS_MD_NONE )
  26258. {
  26259. const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type( md_alg );
  26260. if( md_info == NULL )
  26261. return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  26262. if( mbedtls_oid_get_oid_by_md( md_alg, &oid, &oid_size ) != 0 )
  26263. return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  26264. nb_pad -= 10 + oid_size;
  26265. hashlen = mbedtls_md_get_size( md_info );
  26266. }
  26267. nb_pad -= hashlen;
  26268. if( ( nb_pad < 8 ) || ( nb_pad > olen ) )
  26269. return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  26270. *p++ = 0;
  26271. *p++ = MBEDTLS_RSA_SIGN;
  26272. memset( p, 0xFF, nb_pad );
  26273. p += nb_pad;
  26274. *p++ = 0;
  26275. if( md_alg == MBEDTLS_MD_NONE )
  26276. {
  26277. memcpy( p, hash, hashlen );
  26278. }
  26279. else
  26280. {
  26281. /*
  26282. * DigestInfo ::= SEQUENCE {
  26283. * digestAlgorithm DigestAlgorithmIdentifier,
  26284. * digest Digest }
  26285. *
  26286. * DigestAlgorithmIdentifier ::= AlgorithmIdentifier
  26287. *
  26288. * Digest ::= OCTET STRING
  26289. */
  26290. *p++ = MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED;
  26291. *p++ = (unsigned char) ( 0x08 + oid_size + hashlen );
  26292. *p++ = MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED;
  26293. *p++ = (unsigned char) ( 0x04 + oid_size );
  26294. *p++ = MBEDTLS_ASN1_OID;
  26295. *p++ = oid_size & 0xFF;
  26296. memcpy( p, oid, oid_size );
  26297. p += oid_size;
  26298. *p++ = MBEDTLS_ASN1_NULL;
  26299. *p++ = 0x00;
  26300. *p++ = MBEDTLS_ASN1_OCTET_STRING;
  26301. *p++ = hashlen;
  26302. memcpy( p, hash, hashlen );
  26303. }
  26304. if( mode == MBEDTLS_RSA_PUBLIC )
  26305. return( mbedtls_rsa_public( ctx, sig, sig ) );
  26306. /*
  26307. * In order to prevent Lenstra's attack, make the signature in a
  26308. * temporary buffer and check it before returning it.
  26309. */
  26310. sig_try = mbedtls_calloc( 1, ctx->len );
  26311. if( sig_try == NULL )
  26312. return( MBEDTLS_ERR_MPI_ALLOC_FAILED );
  26313. verif = mbedtls_calloc( 1, ctx->len );
  26314. if( verif == NULL )
  26315. {
  26316. mbedtls_free( sig_try );
  26317. return( MBEDTLS_ERR_MPI_ALLOC_FAILED );
  26318. }
  26319. MBEDTLS_MPI_CHK( mbedtls_rsa_private( ctx, f_rng, p_rng, sig, sig_try ) );
  26320. MBEDTLS_MPI_CHK( mbedtls_rsa_public( ctx, sig_try, verif ) );
  26321. /* Compare in constant time just in case */
  26322. for( diff = 0, i = 0; i < ctx->len; i++ )
  26323. diff |= verif[i] ^ sig[i];
  26324. diff_no_optimize = diff;
  26325. if( diff_no_optimize != 0 )
  26326. {
  26327. ret = MBEDTLS_ERR_RSA_PRIVATE_FAILED;
  26328. goto cleanup;
  26329. }
  26330. memcpy( sig, sig_try, ctx->len );
  26331. cleanup:
  26332. mbedtls_free( sig_try );
  26333. mbedtls_free( verif );
  26334. return( ret );
  26335. }
  26336. #endif /* MBEDTLS_PKCS1_V15 */
  26337. /*
  26338. * Do an RSA operation to sign the message digest
  26339. */
  26340. int mbedtls_rsa_pkcs1_sign( mbedtls_rsa_context *ctx,
  26341. int (*f_rng)(void *, unsigned char *, size_t),
  26342. void *p_rng,
  26343. int mode,
  26344. mbedtls_md_type_t md_alg,
  26345. unsigned int hashlen,
  26346. const unsigned char *hash,
  26347. unsigned char *sig )
  26348. {
  26349. switch( ctx->padding )
  26350. {
  26351. #if defined(MBEDTLS_PKCS1_V15)
  26352. case MBEDTLS_RSA_PKCS_V15:
  26353. return mbedtls_rsa_rsassa_pkcs1_v15_sign( ctx, f_rng, p_rng, mode, md_alg,
  26354. hashlen, hash, sig );
  26355. #endif
  26356. #if defined(MBEDTLS_PKCS1_V21)
  26357. case MBEDTLS_RSA_PKCS_V21:
  26358. return mbedtls_rsa_rsassa_pss_sign( ctx, f_rng, p_rng, mode, md_alg,
  26359. hashlen, hash, sig );
  26360. #endif
  26361. default:
  26362. return( MBEDTLS_ERR_RSA_INVALID_PADDING );
  26363. }
  26364. }
  26365. #if defined(MBEDTLS_PKCS1_V21)
  26366. /*
  26367. * Implementation of the PKCS#1 v2.1 RSASSA-PSS-VERIFY function
  26368. */
  26369. int mbedtls_rsa_rsassa_pss_verify_ext( mbedtls_rsa_context *ctx,
  26370. int (*f_rng)(void *, unsigned char *, size_t),
  26371. void *p_rng,
  26372. int mode,
  26373. mbedtls_md_type_t md_alg,
  26374. unsigned int hashlen,
  26375. const unsigned char *hash,
  26376. mbedtls_md_type_t mgf1_hash_id,
  26377. int expected_salt_len,
  26378. const unsigned char *sig )
  26379. {
  26380. int ret;
  26381. size_t siglen;
  26382. unsigned char *p;
  26383. unsigned char buf[MBEDTLS_MPI_MAX_SIZE];
  26384. unsigned char result[MBEDTLS_MD_MAX_SIZE];
  26385. unsigned char zeros[8];
  26386. unsigned int hlen;
  26387. size_t slen, msb;
  26388. const mbedtls_md_info_t *md_info;
  26389. mbedtls_md_context_t md_ctx;
  26390. if( mode == MBEDTLS_RSA_PRIVATE && ctx->padding != MBEDTLS_RSA_PKCS_V21 )
  26391. return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  26392. siglen = ctx->len;
  26393. if( siglen < 16 || siglen > sizeof( buf ) )
  26394. return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  26395. ret = ( mode == MBEDTLS_RSA_PUBLIC )
  26396. ? mbedtls_rsa_public( ctx, sig, buf )
  26397. : mbedtls_rsa_private( ctx, f_rng, p_rng, sig, buf );
  26398. if( ret != 0 )
  26399. return( ret );
  26400. p = buf;
  26401. if( buf[siglen - 1] != 0xBC )
  26402. return( MBEDTLS_ERR_RSA_INVALID_PADDING );
  26403. if( md_alg != MBEDTLS_MD_NONE )
  26404. {
  26405. // Gather length of hash to sign
  26406. //
  26407. md_info = mbedtls_md_info_from_type( md_alg );
  26408. if( md_info == NULL )
  26409. return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  26410. hashlen = mbedtls_md_get_size( md_info );
  26411. }
  26412. md_info = mbedtls_md_info_from_type( mgf1_hash_id );
  26413. if( md_info == NULL )
  26414. return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  26415. hlen = mbedtls_md_get_size( md_info );
  26416. slen = siglen - hlen - 1; /* Currently length of salt + padding */
  26417. memset( zeros, 0, 8 );
  26418. // Note: EMSA-PSS verification is over the length of N - 1 bits
  26419. //
  26420. msb = mbedtls_mpi_bitlen( &ctx->N ) - 1;
  26421. // Compensate for boundary condition when applying mask
  26422. //
  26423. if( msb % 8 == 0 )
  26424. {
  26425. p++;
  26426. siglen -= 1;
  26427. }
  26428. if( buf[0] >> ( 8 - siglen * 8 + msb ) )
  26429. return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  26430. mbedtls_md_init( &md_ctx );
  26431. mbedtls_md_setup( &md_ctx, md_info, 0 );
  26432. mgf_mask( p, siglen - hlen - 1, p + siglen - hlen - 1, hlen, &md_ctx );
  26433. buf[0] &= 0xFF >> ( siglen * 8 - msb );
  26434. while( p < buf + siglen && *p == 0 )
  26435. p++;
  26436. if( p == buf + siglen ||
  26437. *p++ != 0x01 )
  26438. {
  26439. mbedtls_md_free( &md_ctx );
  26440. return( MBEDTLS_ERR_RSA_INVALID_PADDING );
  26441. }
  26442. /* Actual salt len */
  26443. slen -= p - buf;
  26444. if( expected_salt_len != MBEDTLS_RSA_SALT_LEN_ANY &&
  26445. slen != (size_t) expected_salt_len )
  26446. {
  26447. mbedtls_md_free( &md_ctx );
  26448. return( MBEDTLS_ERR_RSA_INVALID_PADDING );
  26449. }
  26450. // Generate H = Hash( M' )
  26451. //
  26452. mbedtls_md_starts( &md_ctx );
  26453. mbedtls_md_update( &md_ctx, zeros, 8 );
  26454. mbedtls_md_update( &md_ctx, hash, hashlen );
  26455. mbedtls_md_update( &md_ctx, p, slen );
  26456. mbedtls_md_finish( &md_ctx, result );
  26457. mbedtls_md_free( &md_ctx );
  26458. if( memcmp( p + slen, result, hlen ) == 0 )
  26459. return( 0 );
  26460. else
  26461. return( MBEDTLS_ERR_RSA_VERIFY_FAILED );
  26462. }
  26463. /*
  26464. * Simplified PKCS#1 v2.1 RSASSA-PSS-VERIFY function
  26465. */
  26466. int mbedtls_rsa_rsassa_pss_verify( mbedtls_rsa_context *ctx,
  26467. int (*f_rng)(void *, unsigned char *, size_t),
  26468. void *p_rng,
  26469. int mode,
  26470. mbedtls_md_type_t md_alg,
  26471. unsigned int hashlen,
  26472. const unsigned char *hash,
  26473. const unsigned char *sig )
  26474. {
  26475. mbedtls_md_type_t mgf1_hash_id = ( ctx->hash_id != MBEDTLS_MD_NONE )
  26476. ? (mbedtls_md_type_t) ctx->hash_id
  26477. : md_alg;
  26478. return( mbedtls_rsa_rsassa_pss_verify_ext( ctx, f_rng, p_rng, mode,
  26479. md_alg, hashlen, hash,
  26480. mgf1_hash_id, MBEDTLS_RSA_SALT_LEN_ANY,
  26481. sig ) );
  26482. }
  26483. #endif /* MBEDTLS_PKCS1_V21 */
  26484. #if defined(MBEDTLS_PKCS1_V15)
  26485. /*
  26486. * Implementation of the PKCS#1 v2.1 RSASSA-PKCS1-v1_5-VERIFY function
  26487. */
  26488. int mbedtls_rsa_rsassa_pkcs1_v15_verify( mbedtls_rsa_context *ctx,
  26489. int (*f_rng)(void *, unsigned char *, size_t),
  26490. void *p_rng,
  26491. int mode,
  26492. mbedtls_md_type_t md_alg,
  26493. unsigned int hashlen,
  26494. const unsigned char *hash,
  26495. const unsigned char *sig )
  26496. {
  26497. int ret;
  26498. size_t len, siglen, asn1_len;
  26499. unsigned char *p, *end;
  26500. unsigned char buf[MBEDTLS_MPI_MAX_SIZE];
  26501. mbedtls_md_type_t msg_md_alg;
  26502. const mbedtls_md_info_t *md_info;
  26503. mbedtls_asn1_buf oid;
  26504. if( mode == MBEDTLS_RSA_PRIVATE && ctx->padding != MBEDTLS_RSA_PKCS_V15 )
  26505. return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  26506. siglen = ctx->len;
  26507. if( siglen < 16 || siglen > sizeof( buf ) )
  26508. return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  26509. ret = ( mode == MBEDTLS_RSA_PUBLIC )
  26510. ? mbedtls_rsa_public( ctx, sig, buf )
  26511. : mbedtls_rsa_private( ctx, f_rng, p_rng, sig, buf );
  26512. if( ret != 0 )
  26513. return( ret );
  26514. p = buf;
  26515. if( *p++ != 0 || *p++ != MBEDTLS_RSA_SIGN )
  26516. return( MBEDTLS_ERR_RSA_INVALID_PADDING );
  26517. while( *p != 0 )
  26518. {
  26519. if( p >= buf + siglen - 1 || *p != 0xFF )
  26520. return( MBEDTLS_ERR_RSA_INVALID_PADDING );
  26521. p++;
  26522. }
  26523. p++;
  26524. len = siglen - ( p - buf );
  26525. if( len == hashlen && md_alg == MBEDTLS_MD_NONE )
  26526. {
  26527. if( memcmp( p, hash, hashlen ) == 0 )
  26528. return( 0 );
  26529. else
  26530. return( MBEDTLS_ERR_RSA_VERIFY_FAILED );
  26531. }
  26532. md_info = mbedtls_md_info_from_type( md_alg );
  26533. if( md_info == NULL )
  26534. return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  26535. hashlen = mbedtls_md_get_size( md_info );
  26536. end = p + len;
  26537. // Parse the ASN.1 structure inside the PKCS#1 v1.5 structure
  26538. //
  26539. if( ( ret = mbedtls_asn1_get_tag( &p, end, &asn1_len,
  26540. MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )
  26541. return( MBEDTLS_ERR_RSA_VERIFY_FAILED );
  26542. if( asn1_len + 2 != len )
  26543. return( MBEDTLS_ERR_RSA_VERIFY_FAILED );
  26544. if( ( ret = mbedtls_asn1_get_tag( &p, end, &asn1_len,
  26545. MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )
  26546. return( MBEDTLS_ERR_RSA_VERIFY_FAILED );
  26547. if( asn1_len + 6 + hashlen != len )
  26548. return( MBEDTLS_ERR_RSA_VERIFY_FAILED );
  26549. if( ( ret = mbedtls_asn1_get_tag( &p, end, &oid.len, MBEDTLS_ASN1_OID ) ) != 0 )
  26550. return( MBEDTLS_ERR_RSA_VERIFY_FAILED );
  26551. oid.p = p;
  26552. p += oid.len;
  26553. if( mbedtls_oid_get_md_alg( &oid, &msg_md_alg ) != 0 )
  26554. return( MBEDTLS_ERR_RSA_VERIFY_FAILED );
  26555. if( md_alg != msg_md_alg )
  26556. return( MBEDTLS_ERR_RSA_VERIFY_FAILED );
  26557. /*
  26558. * assume the algorithm parameters must be NULL
  26559. */
  26560. if( ( ret = mbedtls_asn1_get_tag( &p, end, &asn1_len, MBEDTLS_ASN1_NULL ) ) != 0 )
  26561. return( MBEDTLS_ERR_RSA_VERIFY_FAILED );
  26562. if( ( ret = mbedtls_asn1_get_tag( &p, end, &asn1_len, MBEDTLS_ASN1_OCTET_STRING ) ) != 0 )
  26563. return( MBEDTLS_ERR_RSA_VERIFY_FAILED );
  26564. if( asn1_len != hashlen )
  26565. return( MBEDTLS_ERR_RSA_VERIFY_FAILED );
  26566. if( memcmp( p, hash, hashlen ) != 0 )
  26567. return( MBEDTLS_ERR_RSA_VERIFY_FAILED );
  26568. p += hashlen;
  26569. if( p != end )
  26570. return( MBEDTLS_ERR_RSA_VERIFY_FAILED );
  26571. return( 0 );
  26572. }
  26573. #endif /* MBEDTLS_PKCS1_V15 */
  26574. /*
  26575. * Do an RSA operation and check the message digest
  26576. */
  26577. int mbedtls_rsa_pkcs1_verify( mbedtls_rsa_context *ctx,
  26578. int (*f_rng)(void *, unsigned char *, size_t),
  26579. void *p_rng,
  26580. int mode,
  26581. mbedtls_md_type_t md_alg,
  26582. unsigned int hashlen,
  26583. const unsigned char *hash,
  26584. const unsigned char *sig )
  26585. {
  26586. switch( ctx->padding )
  26587. {
  26588. #if defined(MBEDTLS_PKCS1_V15)
  26589. case MBEDTLS_RSA_PKCS_V15:
  26590. return mbedtls_rsa_rsassa_pkcs1_v15_verify( ctx, f_rng, p_rng, mode, md_alg,
  26591. hashlen, hash, sig );
  26592. #endif
  26593. #if defined(MBEDTLS_PKCS1_V21)
  26594. case MBEDTLS_RSA_PKCS_V21:
  26595. return mbedtls_rsa_rsassa_pss_verify( ctx, f_rng, p_rng, mode, md_alg,
  26596. hashlen, hash, sig );
  26597. #endif
  26598. default:
  26599. return( MBEDTLS_ERR_RSA_INVALID_PADDING );
  26600. }
  26601. }
  26602. /*
  26603. * Copy the components of an RSA key
  26604. */
  26605. int mbedtls_rsa_copy( mbedtls_rsa_context *dst, const mbedtls_rsa_context *src )
  26606. {
  26607. int ret;
  26608. dst->ver = src->ver;
  26609. dst->len = src->len;
  26610. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->N, &src->N ) );
  26611. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->E, &src->E ) );
  26612. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->D, &src->D ) );
  26613. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->P, &src->P ) );
  26614. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->Q, &src->Q ) );
  26615. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->DP, &src->DP ) );
  26616. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->DQ, &src->DQ ) );
  26617. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->QP, &src->QP ) );
  26618. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->RN, &src->RN ) );
  26619. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->RP, &src->RP ) );
  26620. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->RQ, &src->RQ ) );
  26621. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->Vi, &src->Vi ) );
  26622. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->Vf, &src->Vf ) );
  26623. dst->padding = src->padding;
  26624. dst->hash_id = src->hash_id;
  26625. cleanup:
  26626. if( ret != 0 )
  26627. mbedtls_rsa_free( dst );
  26628. return( ret );
  26629. }
  26630. /*
  26631. * Free the components of an RSA key
  26632. */
  26633. void mbedtls_rsa_free( mbedtls_rsa_context *ctx )
  26634. {
  26635. mbedtls_mpi_free( &ctx->Vi ); mbedtls_mpi_free( &ctx->Vf );
  26636. mbedtls_mpi_free( &ctx->RQ ); mbedtls_mpi_free( &ctx->RP ); mbedtls_mpi_free( &ctx->RN );
  26637. mbedtls_mpi_free( &ctx->QP ); mbedtls_mpi_free( &ctx->DQ ); mbedtls_mpi_free( &ctx->DP );
  26638. mbedtls_mpi_free( &ctx->Q ); mbedtls_mpi_free( &ctx->P ); mbedtls_mpi_free( &ctx->D );
  26639. mbedtls_mpi_free( &ctx->E ); mbedtls_mpi_free( &ctx->N );
  26640. #if defined(MBEDTLS_THREADING_C)
  26641. mbedtls_mutex_free( &ctx->mutex );
  26642. #endif
  26643. }
  26644. #if defined(MBEDTLS_SELF_TEST)
  26645. /*
  26646. * Example RSA-1024 keypair, for test purposes
  26647. */
  26648. #define KEY_LEN 128
  26649. #define RSA_N "9292758453063D803DD603D5E777D788" \
  26650. "8ED1D5BF35786190FA2F23EBC0848AEA" \
  26651. "DDA92CA6C3D80B32C4D109BE0F36D6AE" \
  26652. "7130B9CED7ACDF54CFC7555AC14EEBAB" \
  26653. "93A89813FBF3C4F8066D2D800F7C38A8" \
  26654. "1AE31942917403FF4946B0A83D3D3E05" \
  26655. "EE57C6F5F5606FB5D4BC6CD34EE0801A" \
  26656. "5E94BB77B07507233A0BC7BAC8F90F79"
  26657. #define RSA_E "10001"
  26658. #define RSA_D "24BF6185468786FDD303083D25E64EFC" \
  26659. "66CA472BC44D253102F8B4A9D3BFA750" \
  26660. "91386C0077937FE33FA3252D28855837" \
  26661. "AE1B484A8A9A45F7EE8C0C634F99E8CD" \
  26662. "DF79C5CE07EE72C7F123142198164234" \
  26663. "CABB724CF78B8173B9F880FC86322407" \
  26664. "AF1FEDFDDE2BEB674CA15F3E81A1521E" \
  26665. "071513A1E85B5DFA031F21ECAE91A34D"
  26666. #define RSA_P "C36D0EB7FCD285223CFB5AABA5BDA3D8" \
  26667. "2C01CAD19EA484A87EA4377637E75500" \
  26668. "FCB2005C5C7DD6EC4AC023CDA285D796" \
  26669. "C3D9E75E1EFC42488BB4F1D13AC30A57"
  26670. #define RSA_Q "C000DF51A7C77AE8D7C7370C1FF55B69" \
  26671. "E211C2B9E5DB1ED0BF61D0D9899620F4" \
  26672. "910E4168387E3C30AA1E00C339A79508" \
  26673. "8452DD96A9A5EA5D9DCA68DA636032AF"
  26674. #define RSA_DP "C1ACF567564274FB07A0BBAD5D26E298" \
  26675. "3C94D22288ACD763FD8E5600ED4A702D" \
  26676. "F84198A5F06C2E72236AE490C93F07F8" \
  26677. "3CC559CD27BC2D1CA488811730BB5725"
  26678. #define RSA_DQ "4959CBF6F8FEF750AEE6977C155579C7" \
  26679. "D8AAEA56749EA28623272E4F7D0592AF" \
  26680. "7C1F1313CAC9471B5C523BFE592F517B" \
  26681. "407A1BD76C164B93DA2D32A383E58357"
  26682. #define RSA_QP "9AE7FBC99546432DF71896FC239EADAE" \
  26683. "F38D18D2B2F0E2DD275AA977E2BF4411" \
  26684. "F5A3B2A5D33605AEBBCCBA7FEB9F2D2F" \
  26685. "A74206CEC169D74BF5A8C50D6F48EA08"
  26686. #define PT_LEN 24
  26687. #define RSA_PT "\xAA\xBB\xCC\x03\x02\x01\x00\xFF\xFF\xFF\xFF\xFF" \
  26688. "\x11\x22\x33\x0A\x0B\x0C\xCC\xDD\xDD\xDD\xDD\xDD"
  26689. #if defined(MBEDTLS_PKCS1_V15)
  26690. static int myrand( void *rng_state, unsigned char *output, size_t len )
  26691. {
  26692. #if !defined(__OpenBSD__)
  26693. size_t i;
  26694. if( rng_state != NULL )
  26695. rng_state = NULL;
  26696. for( i = 0; i < len; ++i )
  26697. output[i] = rand();
  26698. #else
  26699. if( rng_state != NULL )
  26700. rng_state = NULL;
  26701. arc4random_buf( output, len );
  26702. #endif /* !OpenBSD */
  26703. return( 0 );
  26704. }
  26705. #endif /* MBEDTLS_PKCS1_V15 */
  26706. /*
  26707. * Checkup routine
  26708. */
  26709. int mbedtls_rsa_self_test( int verbose )
  26710. {
  26711. int ret = 0;
  26712. #if defined(MBEDTLS_PKCS1_V15)
  26713. size_t len;
  26714. mbedtls_rsa_context rsa;
  26715. unsigned char rsa_plaintext[PT_LEN];
  26716. unsigned char rsa_decrypted[PT_LEN];
  26717. unsigned char rsa_ciphertext[KEY_LEN];
  26718. #if defined(MBEDTLS_SHA1_C)
  26719. unsigned char sha1sum[20];
  26720. #endif
  26721. mbedtls_rsa_init( &rsa, MBEDTLS_RSA_PKCS_V15, 0 );
  26722. rsa.len = KEY_LEN;
  26723. MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &rsa.N , 16, RSA_N ) );
  26724. MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &rsa.E , 16, RSA_E ) );
  26725. MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &rsa.D , 16, RSA_D ) );
  26726. MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &rsa.P , 16, RSA_P ) );
  26727. MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &rsa.Q , 16, RSA_Q ) );
  26728. MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &rsa.DP, 16, RSA_DP ) );
  26729. MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &rsa.DQ, 16, RSA_DQ ) );
  26730. MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &rsa.QP, 16, RSA_QP ) );
  26731. if( verbose != 0 )
  26732. mbedtls_printf( " RSA key validation: " );
  26733. if( mbedtls_rsa_check_pubkey( &rsa ) != 0 ||
  26734. mbedtls_rsa_check_privkey( &rsa ) != 0 )
  26735. {
  26736. if( verbose != 0 )
  26737. mbedtls_printf( "failed\n" );
  26738. return( 1 );
  26739. }
  26740. if( verbose != 0 )
  26741. mbedtls_printf( "passed\n PKCS#1 encryption : " );
  26742. memcpy( rsa_plaintext, RSA_PT, PT_LEN );
  26743. if( mbedtls_rsa_pkcs1_encrypt( &rsa, myrand, NULL, MBEDTLS_RSA_PUBLIC, PT_LEN,
  26744. rsa_plaintext, rsa_ciphertext ) != 0 )
  26745. {
  26746. if( verbose != 0 )
  26747. mbedtls_printf( "failed\n" );
  26748. return( 1 );
  26749. }
  26750. if( verbose != 0 )
  26751. mbedtls_printf( "passed\n PKCS#1 decryption : " );
  26752. if( mbedtls_rsa_pkcs1_decrypt( &rsa, myrand, NULL, MBEDTLS_RSA_PRIVATE, &len,
  26753. rsa_ciphertext, rsa_decrypted,
  26754. sizeof(rsa_decrypted) ) != 0 )
  26755. {
  26756. if( verbose != 0 )
  26757. mbedtls_printf( "failed\n" );
  26758. return( 1 );
  26759. }
  26760. if( memcmp( rsa_decrypted, rsa_plaintext, len ) != 0 )
  26761. {
  26762. if( verbose != 0 )
  26763. mbedtls_printf( "failed\n" );
  26764. return( 1 );
  26765. }
  26766. if( verbose != 0 )
  26767. mbedtls_printf( "passed\n" );
  26768. #if defined(MBEDTLS_SHA1_C)
  26769. if( verbose != 0 )
  26770. mbedtls_printf( "PKCS#1 data sign : " );
  26771. mbedtls_sha1( rsa_plaintext, PT_LEN, sha1sum );
  26772. if( mbedtls_rsa_pkcs1_sign( &rsa, myrand, NULL, MBEDTLS_RSA_PRIVATE, MBEDTLS_MD_SHA1, 0,
  26773. sha1sum, rsa_ciphertext ) != 0 )
  26774. {
  26775. if( verbose != 0 )
  26776. mbedtls_printf( "failed\n" );
  26777. return( 1 );
  26778. }
  26779. if( verbose != 0 )
  26780. mbedtls_printf( "passed\n PKCS#1 sig. verify: " );
  26781. if( mbedtls_rsa_pkcs1_verify( &rsa, NULL, NULL, MBEDTLS_RSA_PUBLIC, MBEDTLS_MD_SHA1, 0,
  26782. sha1sum, rsa_ciphertext ) != 0 )
  26783. {
  26784. if( verbose != 0 )
  26785. mbedtls_printf( "failed\n" );
  26786. return( 1 );
  26787. }
  26788. if( verbose != 0 )
  26789. mbedtls_printf( "passed\n" );
  26790. #endif /* MBEDTLS_SHA1_C */
  26791. if( verbose != 0 )
  26792. mbedtls_printf( "\n" );
  26793. cleanup:
  26794. mbedtls_rsa_free( &rsa );
  26795. #else /* MBEDTLS_PKCS1_V15 */
  26796. ((void) verbose);
  26797. #endif /* MBEDTLS_PKCS1_V15 */
  26798. return( ret );
  26799. }
  26800. #endif /* MBEDTLS_SELF_TEST */
  26801. #endif /* MBEDTLS_RSA_C */
  26802. /********* Start of file library/sha1.c ************/
  26803. /*
  26804. * FIPS-180-1 compliant SHA-1 implementation
  26805. *
  26806. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  26807. * SPDX-License-Identifier: Apache-2.0
  26808. *
  26809. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  26810. * not use this file except in compliance with the License.
  26811. * You may obtain a copy of the License at
  26812. *
  26813. * http://www.apache.org/licenses/LICENSE-2.0
  26814. *
  26815. * Unless required by applicable law or agreed to in writing, software
  26816. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  26817. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  26818. * See the License for the specific language governing permissions and
  26819. * limitations under the License.
  26820. *
  26821. * This file is part of mbed TLS (https://tls.mbed.org)
  26822. */
  26823. /*
  26824. * The SHA-1 standard was published by NIST in 1993.
  26825. *
  26826. * http://www.itl.nist.gov/fipspubs/fip180-1.htm
  26827. */
  26828. #if !defined(MBEDTLS_CONFIG_FILE)
  26829. #else
  26830. #endif
  26831. #if defined(MBEDTLS_SHA1_C)
  26832. #include <string.h>
  26833. #if defined(MBEDTLS_SELF_TEST)
  26834. #if defined(MBEDTLS_PLATFORM_C)
  26835. #else
  26836. #include <stdio.h>
  26837. #define mbedtls_printf printf
  26838. #endif /* MBEDTLS_PLATFORM_C */
  26839. #endif /* MBEDTLS_SELF_TEST */
  26840. #if !defined(MBEDTLS_SHA1_ALT)
  26841. /* Implementation that should never be optimized out by the compiler */
  26842. static void sha1_zeroize( void *v, size_t n ) {
  26843. volatile unsigned char *p = v; while( n-- ) *p++ = 0;
  26844. }
  26845. /*
  26846. * 32-bit integer manipulation macros (big endian)
  26847. */
  26848. #ifndef GET_UINT32_BE
  26849. #define GET_UINT32_BE(n,b,i) \
  26850. { \
  26851. (n) = ( (uint32_t) (b)[(i) ] << 24 ) \
  26852. | ( (uint32_t) (b)[(i) + 1] << 16 ) \
  26853. | ( (uint32_t) (b)[(i) + 2] << 8 ) \
  26854. | ( (uint32_t) (b)[(i) + 3] ); \
  26855. }
  26856. #endif
  26857. #ifndef PUT_UINT32_BE
  26858. #define PUT_UINT32_BE(n,b,i) \
  26859. { \
  26860. (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
  26861. (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \
  26862. (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \
  26863. (b)[(i) + 3] = (unsigned char) ( (n) ); \
  26864. }
  26865. #endif
  26866. void mbedtls_sha1_init( mbedtls_sha1_context *ctx )
  26867. {
  26868. memset( ctx, 0, sizeof( mbedtls_sha1_context ) );
  26869. }
  26870. void mbedtls_sha1_free( mbedtls_sha1_context *ctx )
  26871. {
  26872. if( ctx == NULL )
  26873. return;
  26874. sha1_zeroize( ctx, sizeof( mbedtls_sha1_context ) );
  26875. }
  26876. void mbedtls_sha1_clone( mbedtls_sha1_context *dst,
  26877. const mbedtls_sha1_context *src )
  26878. {
  26879. *dst = *src;
  26880. }
  26881. /*
  26882. * SHA-1 context setup
  26883. */
  26884. void mbedtls_sha1_starts( mbedtls_sha1_context *ctx )
  26885. {
  26886. ctx->total[0] = 0;
  26887. ctx->total[1] = 0;
  26888. ctx->state[0] = 0x67452301;
  26889. ctx->state[1] = 0xEFCDAB89;
  26890. ctx->state[2] = 0x98BADCFE;
  26891. ctx->state[3] = 0x10325476;
  26892. ctx->state[4] = 0xC3D2E1F0;
  26893. }
  26894. #if !defined(MBEDTLS_SHA1_PROCESS_ALT)
  26895. void mbedtls_sha1_process( mbedtls_sha1_context *ctx, const unsigned char data[64] )
  26896. {
  26897. uint32_t temp, W[16], A, B, C, D, E;
  26898. GET_UINT32_BE( W[ 0], data, 0 );
  26899. GET_UINT32_BE( W[ 1], data, 4 );
  26900. GET_UINT32_BE( W[ 2], data, 8 );
  26901. GET_UINT32_BE( W[ 3], data, 12 );
  26902. GET_UINT32_BE( W[ 4], data, 16 );
  26903. GET_UINT32_BE( W[ 5], data, 20 );
  26904. GET_UINT32_BE( W[ 6], data, 24 );
  26905. GET_UINT32_BE( W[ 7], data, 28 );
  26906. GET_UINT32_BE( W[ 8], data, 32 );
  26907. GET_UINT32_BE( W[ 9], data, 36 );
  26908. GET_UINT32_BE( W[10], data, 40 );
  26909. GET_UINT32_BE( W[11], data, 44 );
  26910. GET_UINT32_BE( W[12], data, 48 );
  26911. GET_UINT32_BE( W[13], data, 52 );
  26912. GET_UINT32_BE( W[14], data, 56 );
  26913. GET_UINT32_BE( W[15], data, 60 );
  26914. #define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n)))
  26915. #define R(t) \
  26916. ( \
  26917. temp = W[( t - 3 ) & 0x0F] ^ W[( t - 8 ) & 0x0F] ^ \
  26918. W[( t - 14 ) & 0x0F] ^ W[ t & 0x0F], \
  26919. ( W[t & 0x0F] = S(temp,1) ) \
  26920. )
  26921. #define P(a,b,c,d,e,x) \
  26922. { \
  26923. e += S(a,5) + F(b,c,d) + K + x; b = S(b,30); \
  26924. }
  26925. A = ctx->state[0];
  26926. B = ctx->state[1];
  26927. C = ctx->state[2];
  26928. D = ctx->state[3];
  26929. E = ctx->state[4];
  26930. #define F(x,y,z) (z ^ (x & (y ^ z)))
  26931. #define K 0x5A827999
  26932. P( A, B, C, D, E, W[0] );
  26933. P( E, A, B, C, D, W[1] );
  26934. P( D, E, A, B, C, W[2] );
  26935. P( C, D, E, A, B, W[3] );
  26936. P( B, C, D, E, A, W[4] );
  26937. P( A, B, C, D, E, W[5] );
  26938. P( E, A, B, C, D, W[6] );
  26939. P( D, E, A, B, C, W[7] );
  26940. P( C, D, E, A, B, W[8] );
  26941. P( B, C, D, E, A, W[9] );
  26942. P( A, B, C, D, E, W[10] );
  26943. P( E, A, B, C, D, W[11] );
  26944. P( D, E, A, B, C, W[12] );
  26945. P( C, D, E, A, B, W[13] );
  26946. P( B, C, D, E, A, W[14] );
  26947. P( A, B, C, D, E, W[15] );
  26948. P( E, A, B, C, D, R(16) );
  26949. P( D, E, A, B, C, R(17) );
  26950. P( C, D, E, A, B, R(18) );
  26951. P( B, C, D, E, A, R(19) );
  26952. #undef K
  26953. #undef F
  26954. #define F(x,y,z) (x ^ y ^ z)
  26955. #define K 0x6ED9EBA1
  26956. P( A, B, C, D, E, R(20) );
  26957. P( E, A, B, C, D, R(21) );
  26958. P( D, E, A, B, C, R(22) );
  26959. P( C, D, E, A, B, R(23) );
  26960. P( B, C, D, E, A, R(24) );
  26961. P( A, B, C, D, E, R(25) );
  26962. P( E, A, B, C, D, R(26) );
  26963. P( D, E, A, B, C, R(27) );
  26964. P( C, D, E, A, B, R(28) );
  26965. P( B, C, D, E, A, R(29) );
  26966. P( A, B, C, D, E, R(30) );
  26967. P( E, A, B, C, D, R(31) );
  26968. P( D, E, A, B, C, R(32) );
  26969. P( C, D, E, A, B, R(33) );
  26970. P( B, C, D, E, A, R(34) );
  26971. P( A, B, C, D, E, R(35) );
  26972. P( E, A, B, C, D, R(36) );
  26973. P( D, E, A, B, C, R(37) );
  26974. P( C, D, E, A, B, R(38) );
  26975. P( B, C, D, E, A, R(39) );
  26976. #undef K
  26977. #undef F
  26978. #define F(x,y,z) ((x & y) | (z & (x | y)))
  26979. #define K 0x8F1BBCDC
  26980. P( A, B, C, D, E, R(40) );
  26981. P( E, A, B, C, D, R(41) );
  26982. P( D, E, A, B, C, R(42) );
  26983. P( C, D, E, A, B, R(43) );
  26984. P( B, C, D, E, A, R(44) );
  26985. P( A, B, C, D, E, R(45) );
  26986. P( E, A, B, C, D, R(46) );
  26987. P( D, E, A, B, C, R(47) );
  26988. P( C, D, E, A, B, R(48) );
  26989. P( B, C, D, E, A, R(49) );
  26990. P( A, B, C, D, E, R(50) );
  26991. P( E, A, B, C, D, R(51) );
  26992. P( D, E, A, B, C, R(52) );
  26993. P( C, D, E, A, B, R(53) );
  26994. P( B, C, D, E, A, R(54) );
  26995. P( A, B, C, D, E, R(55) );
  26996. P( E, A, B, C, D, R(56) );
  26997. P( D, E, A, B, C, R(57) );
  26998. P( C, D, E, A, B, R(58) );
  26999. P( B, C, D, E, A, R(59) );
  27000. #undef K
  27001. #undef F
  27002. #define F(x,y,z) (x ^ y ^ z)
  27003. #define K 0xCA62C1D6
  27004. P( A, B, C, D, E, R(60) );
  27005. P( E, A, B, C, D, R(61) );
  27006. P( D, E, A, B, C, R(62) );
  27007. P( C, D, E, A, B, R(63) );
  27008. P( B, C, D, E, A, R(64) );
  27009. P( A, B, C, D, E, R(65) );
  27010. P( E, A, B, C, D, R(66) );
  27011. P( D, E, A, B, C, R(67) );
  27012. P( C, D, E, A, B, R(68) );
  27013. P( B, C, D, E, A, R(69) );
  27014. P( A, B, C, D, E, R(70) );
  27015. P( E, A, B, C, D, R(71) );
  27016. P( D, E, A, B, C, R(72) );
  27017. P( C, D, E, A, B, R(73) );
  27018. P( B, C, D, E, A, R(74) );
  27019. P( A, B, C, D, E, R(75) );
  27020. P( E, A, B, C, D, R(76) );
  27021. P( D, E, A, B, C, R(77) );
  27022. P( C, D, E, A, B, R(78) );
  27023. P( B, C, D, E, A, R(79) );
  27024. #undef K
  27025. #undef F
  27026. ctx->state[0] += A;
  27027. ctx->state[1] += B;
  27028. ctx->state[2] += C;
  27029. ctx->state[3] += D;
  27030. ctx->state[4] += E;
  27031. }
  27032. #endif /* !MBEDTLS_SHA1_PROCESS_ALT */
  27033. /*
  27034. * SHA-1 process buffer
  27035. */
  27036. void mbedtls_sha1_update( mbedtls_sha1_context *ctx, const unsigned char *input, size_t ilen )
  27037. {
  27038. size_t fill;
  27039. uint32_t left;
  27040. if( ilen == 0 )
  27041. return;
  27042. left = ctx->total[0] & 0x3F;
  27043. fill = 64 - left;
  27044. ctx->total[0] += (uint32_t) ilen;
  27045. ctx->total[0] &= 0xFFFFFFFF;
  27046. if( ctx->total[0] < (uint32_t) ilen )
  27047. ctx->total[1]++;
  27048. if( left && ilen >= fill )
  27049. {
  27050. memcpy( (void *) (ctx->buffer + left), input, fill );
  27051. mbedtls_sha1_process( ctx, ctx->buffer );
  27052. input += fill;
  27053. ilen -= fill;
  27054. left = 0;
  27055. }
  27056. while( ilen >= 64 )
  27057. {
  27058. mbedtls_sha1_process( ctx, input );
  27059. input += 64;
  27060. ilen -= 64;
  27061. }
  27062. if( ilen > 0 )
  27063. memcpy( (void *) (ctx->buffer + left), input, ilen );
  27064. }
  27065. static const unsigned char sha1_padding[64] =
  27066. {
  27067. 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  27068. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  27069. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  27070. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  27071. };
  27072. /*
  27073. * SHA-1 final digest
  27074. */
  27075. void mbedtls_sha1_finish( mbedtls_sha1_context *ctx, unsigned char output[20] )
  27076. {
  27077. uint32_t last, padn;
  27078. uint32_t high, low;
  27079. unsigned char msglen[8];
  27080. high = ( ctx->total[0] >> 29 )
  27081. | ( ctx->total[1] << 3 );
  27082. low = ( ctx->total[0] << 3 );
  27083. PUT_UINT32_BE( high, msglen, 0 );
  27084. PUT_UINT32_BE( low, msglen, 4 );
  27085. last = ctx->total[0] & 0x3F;
  27086. padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );
  27087. mbedtls_sha1_update( ctx, sha1_padding, padn );
  27088. mbedtls_sha1_update( ctx, msglen, 8 );
  27089. PUT_UINT32_BE( ctx->state[0], output, 0 );
  27090. PUT_UINT32_BE( ctx->state[1], output, 4 );
  27091. PUT_UINT32_BE( ctx->state[2], output, 8 );
  27092. PUT_UINT32_BE( ctx->state[3], output, 12 );
  27093. PUT_UINT32_BE( ctx->state[4], output, 16 );
  27094. }
  27095. #endif /* !MBEDTLS_SHA1_ALT */
  27096. /*
  27097. * output = SHA-1( input buffer )
  27098. */
  27099. void mbedtls_sha1( const unsigned char *input, size_t ilen, unsigned char output[20] )
  27100. {
  27101. mbedtls_sha1_context ctx;
  27102. mbedtls_sha1_init( &ctx );
  27103. mbedtls_sha1_starts( &ctx );
  27104. mbedtls_sha1_update( &ctx, input, ilen );
  27105. mbedtls_sha1_finish( &ctx, output );
  27106. mbedtls_sha1_free( &ctx );
  27107. }
  27108. #if defined(MBEDTLS_SELF_TEST)
  27109. /*
  27110. * FIPS-180-1 test vectors
  27111. */
  27112. static const unsigned char sha1_test_buf[3][57] =
  27113. {
  27114. { "abc" },
  27115. { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" },
  27116. { "" }
  27117. };
  27118. static const int sha1_test_buflen[3] =
  27119. {
  27120. 3, 56, 1000
  27121. };
  27122. static const unsigned char sha1_test_sum[3][20] =
  27123. {
  27124. { 0xA9, 0x99, 0x3E, 0x36, 0x47, 0x06, 0x81, 0x6A, 0xBA, 0x3E,
  27125. 0x25, 0x71, 0x78, 0x50, 0xC2, 0x6C, 0x9C, 0xD0, 0xD8, 0x9D },
  27126. { 0x84, 0x98, 0x3E, 0x44, 0x1C, 0x3B, 0xD2, 0x6E, 0xBA, 0xAE,
  27127. 0x4A, 0xA1, 0xF9, 0x51, 0x29, 0xE5, 0xE5, 0x46, 0x70, 0xF1 },
  27128. { 0x34, 0xAA, 0x97, 0x3C, 0xD4, 0xC4, 0xDA, 0xA4, 0xF6, 0x1E,
  27129. 0xEB, 0x2B, 0xDB, 0xAD, 0x27, 0x31, 0x65, 0x34, 0x01, 0x6F }
  27130. };
  27131. /*
  27132. * Checkup routine
  27133. */
  27134. int mbedtls_sha1_self_test( int verbose )
  27135. {
  27136. int i, j, buflen, ret = 0;
  27137. unsigned char buf[1024];
  27138. unsigned char sha1sum[20];
  27139. mbedtls_sha1_context ctx;
  27140. mbedtls_sha1_init( &ctx );
  27141. /*
  27142. * SHA-1
  27143. */
  27144. for( i = 0; i < 3; i++ )
  27145. {
  27146. if( verbose != 0 )
  27147. mbedtls_printf( " SHA-1 test #%d: ", i + 1 );
  27148. mbedtls_sha1_starts( &ctx );
  27149. if( i == 2 )
  27150. {
  27151. memset( buf, 'a', buflen = 1000 );
  27152. for( j = 0; j < 1000; j++ )
  27153. mbedtls_sha1_update( &ctx, buf, buflen );
  27154. }
  27155. else
  27156. mbedtls_sha1_update( &ctx, sha1_test_buf[i],
  27157. sha1_test_buflen[i] );
  27158. mbedtls_sha1_finish( &ctx, sha1sum );
  27159. if( memcmp( sha1sum, sha1_test_sum[i], 20 ) != 0 )
  27160. {
  27161. if( verbose != 0 )
  27162. mbedtls_printf( "failed\n" );
  27163. ret = 1;
  27164. goto exit;
  27165. }
  27166. if( verbose != 0 )
  27167. mbedtls_printf( "passed\n" );
  27168. }
  27169. if( verbose != 0 )
  27170. mbedtls_printf( "\n" );
  27171. exit:
  27172. mbedtls_sha1_free( &ctx );
  27173. return( ret );
  27174. }
  27175. #endif /* MBEDTLS_SELF_TEST */
  27176. /* Amalgamated Release Mappings */
  27177. #undef F
  27178. #undef P
  27179. #undef R
  27180. #undef S
  27181. #endif /* MBEDTLS_SHA1_C */
  27182. /********* Start of file library/sha256.c ************/
  27183. /*
  27184. * FIPS-180-2 compliant SHA-256 implementation
  27185. *
  27186. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  27187. * SPDX-License-Identifier: Apache-2.0
  27188. *
  27189. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  27190. * not use this file except in compliance with the License.
  27191. * You may obtain a copy of the License at
  27192. *
  27193. * http://www.apache.org/licenses/LICENSE-2.0
  27194. *
  27195. * Unless required by applicable law or agreed to in writing, software
  27196. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  27197. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  27198. * See the License for the specific language governing permissions and
  27199. * limitations under the License.
  27200. *
  27201. * This file is part of mbed TLS (https://tls.mbed.org)
  27202. */
  27203. /*
  27204. * The SHA-256 Secure Hash Standard was published by NIST in 2002.
  27205. *
  27206. * http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf
  27207. */
  27208. #if !defined(MBEDTLS_CONFIG_FILE)
  27209. #else
  27210. #endif
  27211. #if defined(MBEDTLS_SHA256_C)
  27212. #include <string.h>
  27213. #if defined(MBEDTLS_SELF_TEST)
  27214. #if defined(MBEDTLS_PLATFORM_C)
  27215. #else
  27216. #include <stdio.h>
  27217. #define mbedtls_printf printf
  27218. #endif /* MBEDTLS_PLATFORM_C */
  27219. #endif /* MBEDTLS_SELF_TEST */
  27220. #if !defined(MBEDTLS_SHA256_ALT)
  27221. /* Implementation that should never be optimized out by the compiler */
  27222. static void sha256_zeroize( void *v, size_t n ) {
  27223. volatile unsigned char *p = v; while( n-- ) *p++ = 0;
  27224. }
  27225. /*
  27226. * 32-bit integer manipulation macros (big endian)
  27227. */
  27228. #ifndef GET_UINT32_BE
  27229. #define GET_UINT32_BE(n,b,i) \
  27230. do { \
  27231. (n) = ( (uint32_t) (b)[(i) ] << 24 ) \
  27232. | ( (uint32_t) (b)[(i) + 1] << 16 ) \
  27233. | ( (uint32_t) (b)[(i) + 2] << 8 ) \
  27234. | ( (uint32_t) (b)[(i) + 3] ); \
  27235. } while( 0 )
  27236. #endif
  27237. #ifndef PUT_UINT32_BE
  27238. #define PUT_UINT32_BE(n,b,i) \
  27239. do { \
  27240. (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
  27241. (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \
  27242. (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \
  27243. (b)[(i) + 3] = (unsigned char) ( (n) ); \
  27244. } while( 0 )
  27245. #endif
  27246. void mbedtls_sha256_init( mbedtls_sha256_context *ctx )
  27247. {
  27248. memset( ctx, 0, sizeof( mbedtls_sha256_context ) );
  27249. }
  27250. void mbedtls_sha256_free( mbedtls_sha256_context *ctx )
  27251. {
  27252. if( ctx == NULL )
  27253. return;
  27254. sha256_zeroize( ctx, sizeof( mbedtls_sha256_context ) );
  27255. }
  27256. void mbedtls_sha256_clone( mbedtls_sha256_context *dst,
  27257. const mbedtls_sha256_context *src )
  27258. {
  27259. *dst = *src;
  27260. }
  27261. /*
  27262. * SHA-256 context setup
  27263. */
  27264. void mbedtls_sha256_starts( mbedtls_sha256_context *ctx, int is224 )
  27265. {
  27266. ctx->total[0] = 0;
  27267. ctx->total[1] = 0;
  27268. if( is224 == 0 )
  27269. {
  27270. /* SHA-256 */
  27271. ctx->state[0] = 0x6A09E667;
  27272. ctx->state[1] = 0xBB67AE85;
  27273. ctx->state[2] = 0x3C6EF372;
  27274. ctx->state[3] = 0xA54FF53A;
  27275. ctx->state[4] = 0x510E527F;
  27276. ctx->state[5] = 0x9B05688C;
  27277. ctx->state[6] = 0x1F83D9AB;
  27278. ctx->state[7] = 0x5BE0CD19;
  27279. }
  27280. else
  27281. {
  27282. /* SHA-224 */
  27283. ctx->state[0] = 0xC1059ED8;
  27284. ctx->state[1] = 0x367CD507;
  27285. ctx->state[2] = 0x3070DD17;
  27286. ctx->state[3] = 0xF70E5939;
  27287. ctx->state[4] = 0xFFC00B31;
  27288. ctx->state[5] = 0x68581511;
  27289. ctx->state[6] = 0x64F98FA7;
  27290. ctx->state[7] = 0xBEFA4FA4;
  27291. }
  27292. ctx->is224 = is224;
  27293. }
  27294. #if !defined(MBEDTLS_SHA256_PROCESS_ALT)
  27295. /* Amalgamated Release Mappings */
  27296. #define K K256
  27297. static const uint32_t K[] =
  27298. {
  27299. 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5,
  27300. 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,
  27301. 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3,
  27302. 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,
  27303. 0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC,
  27304. 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,
  27305. 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7,
  27306. 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,
  27307. 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13,
  27308. 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,
  27309. 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3,
  27310. 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,
  27311. 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5,
  27312. 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,
  27313. 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208,
  27314. 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2,
  27315. };
  27316. #define SHR(x,n) ((x & 0xFFFFFFFF) >> n)
  27317. #define ROTR(x,n) (SHR(x,n) | (x << (32 - n)))
  27318. #define S0(x) (ROTR(x, 7) ^ ROTR(x,18) ^ SHR(x, 3))
  27319. #define S1(x) (ROTR(x,17) ^ ROTR(x,19) ^ SHR(x,10))
  27320. #define S2(x) (ROTR(x, 2) ^ ROTR(x,13) ^ ROTR(x,22))
  27321. #define S3(x) (ROTR(x, 6) ^ ROTR(x,11) ^ ROTR(x,25))
  27322. #define F0(x,y,z) ((x & y) | (z & (x | y)))
  27323. #define F1(x,y,z) (z ^ (x & (y ^ z)))
  27324. #define R(t) \
  27325. ( \
  27326. W[t] = S1(W[t - 2]) + W[t - 7] + \
  27327. S0(W[t - 15]) + W[t - 16] \
  27328. )
  27329. #define P(a,b,c,d,e,f,g,h,x,K) \
  27330. { \
  27331. temp1 = h + S3(e) + F1(e,f,g) + K + x; \
  27332. temp2 = S2(a) + F0(a,b,c); \
  27333. d += temp1; h = temp1 + temp2; \
  27334. }
  27335. void mbedtls_sha256_process( mbedtls_sha256_context *ctx, const unsigned char data[64] )
  27336. {
  27337. uint32_t temp1, temp2, W[64];
  27338. uint32_t A[8];
  27339. unsigned int i;
  27340. for( i = 0; i < 8; i++ )
  27341. A[i] = ctx->state[i];
  27342. #if defined(MBEDTLS_SHA256_SMALLER)
  27343. for( i = 0; i < 64; i++ )
  27344. {
  27345. if( i < 16 )
  27346. GET_UINT32_BE( W[i], data, 4 * i );
  27347. else
  27348. R( i );
  27349. P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], W[i], K[i] );
  27350. temp1 = A[7]; A[7] = A[6]; A[6] = A[5]; A[5] = A[4]; A[4] = A[3];
  27351. A[3] = A[2]; A[2] = A[1]; A[1] = A[0]; A[0] = temp1;
  27352. }
  27353. #else /* MBEDTLS_SHA256_SMALLER */
  27354. for( i = 0; i < 16; i++ )
  27355. GET_UINT32_BE( W[i], data, 4 * i );
  27356. for( i = 0; i < 16; i += 8 )
  27357. {
  27358. P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], W[i+0], K[i+0] );
  27359. P( A[7], A[0], A[1], A[2], A[3], A[4], A[5], A[6], W[i+1], K[i+1] );
  27360. P( A[6], A[7], A[0], A[1], A[2], A[3], A[4], A[5], W[i+2], K[i+2] );
  27361. P( A[5], A[6], A[7], A[0], A[1], A[2], A[3], A[4], W[i+3], K[i+3] );
  27362. P( A[4], A[5], A[6], A[7], A[0], A[1], A[2], A[3], W[i+4], K[i+4] );
  27363. P( A[3], A[4], A[5], A[6], A[7], A[0], A[1], A[2], W[i+5], K[i+5] );
  27364. P( A[2], A[3], A[4], A[5], A[6], A[7], A[0], A[1], W[i+6], K[i+6] );
  27365. P( A[1], A[2], A[3], A[4], A[5], A[6], A[7], A[0], W[i+7], K[i+7] );
  27366. }
  27367. for( i = 16; i < 64; i += 8 )
  27368. {
  27369. P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], R(i+0), K[i+0] );
  27370. P( A[7], A[0], A[1], A[2], A[3], A[4], A[5], A[6], R(i+1), K[i+1] );
  27371. P( A[6], A[7], A[0], A[1], A[2], A[3], A[4], A[5], R(i+2), K[i+2] );
  27372. P( A[5], A[6], A[7], A[0], A[1], A[2], A[3], A[4], R(i+3), K[i+3] );
  27373. P( A[4], A[5], A[6], A[7], A[0], A[1], A[2], A[3], R(i+4), K[i+4] );
  27374. P( A[3], A[4], A[5], A[6], A[7], A[0], A[1], A[2], R(i+5), K[i+5] );
  27375. P( A[2], A[3], A[4], A[5], A[6], A[7], A[0], A[1], R(i+6), K[i+6] );
  27376. P( A[1], A[2], A[3], A[4], A[5], A[6], A[7], A[0], R(i+7), K[i+7] );
  27377. }
  27378. #endif /* MBEDTLS_SHA256_SMALLER */
  27379. for( i = 0; i < 8; i++ )
  27380. ctx->state[i] += A[i];
  27381. }
  27382. #endif /* !MBEDTLS_SHA256_PROCESS_ALT */
  27383. /*
  27384. * SHA-256 process buffer
  27385. */
  27386. void mbedtls_sha256_update( mbedtls_sha256_context *ctx, const unsigned char *input,
  27387. size_t ilen )
  27388. {
  27389. size_t fill;
  27390. uint32_t left;
  27391. if( ilen == 0 )
  27392. return;
  27393. left = ctx->total[0] & 0x3F;
  27394. fill = 64 - left;
  27395. ctx->total[0] += (uint32_t) ilen;
  27396. ctx->total[0] &= 0xFFFFFFFF;
  27397. if( ctx->total[0] < (uint32_t) ilen )
  27398. ctx->total[1]++;
  27399. if( left && ilen >= fill )
  27400. {
  27401. memcpy( (void *) (ctx->buffer + left), input, fill );
  27402. mbedtls_sha256_process( ctx, ctx->buffer );
  27403. input += fill;
  27404. ilen -= fill;
  27405. left = 0;
  27406. }
  27407. while( ilen >= 64 )
  27408. {
  27409. mbedtls_sha256_process( ctx, input );
  27410. input += 64;
  27411. ilen -= 64;
  27412. }
  27413. if( ilen > 0 )
  27414. memcpy( (void *) (ctx->buffer + left), input, ilen );
  27415. }
  27416. static const unsigned char sha256_padding[64] =
  27417. {
  27418. 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  27419. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  27420. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  27421. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  27422. };
  27423. /*
  27424. * SHA-256 final digest
  27425. */
  27426. void mbedtls_sha256_finish( mbedtls_sha256_context *ctx, unsigned char output[32] )
  27427. {
  27428. uint32_t last, padn;
  27429. uint32_t high, low;
  27430. unsigned char msglen[8];
  27431. high = ( ctx->total[0] >> 29 )
  27432. | ( ctx->total[1] << 3 );
  27433. low = ( ctx->total[0] << 3 );
  27434. PUT_UINT32_BE( high, msglen, 0 );
  27435. PUT_UINT32_BE( low, msglen, 4 );
  27436. last = ctx->total[0] & 0x3F;
  27437. padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );
  27438. mbedtls_sha256_update( ctx, sha256_padding, padn );
  27439. mbedtls_sha256_update( ctx, msglen, 8 );
  27440. PUT_UINT32_BE( ctx->state[0], output, 0 );
  27441. PUT_UINT32_BE( ctx->state[1], output, 4 );
  27442. PUT_UINT32_BE( ctx->state[2], output, 8 );
  27443. PUT_UINT32_BE( ctx->state[3], output, 12 );
  27444. PUT_UINT32_BE( ctx->state[4], output, 16 );
  27445. PUT_UINT32_BE( ctx->state[5], output, 20 );
  27446. PUT_UINT32_BE( ctx->state[6], output, 24 );
  27447. if( ctx->is224 == 0 )
  27448. PUT_UINT32_BE( ctx->state[7], output, 28 );
  27449. }
  27450. #endif /* !MBEDTLS_SHA256_ALT */
  27451. /*
  27452. * output = SHA-256( input buffer )
  27453. */
  27454. void mbedtls_sha256( const unsigned char *input, size_t ilen,
  27455. unsigned char output[32], int is224 )
  27456. {
  27457. mbedtls_sha256_context ctx;
  27458. mbedtls_sha256_init( &ctx );
  27459. mbedtls_sha256_starts( &ctx, is224 );
  27460. mbedtls_sha256_update( &ctx, input, ilen );
  27461. mbedtls_sha256_finish( &ctx, output );
  27462. mbedtls_sha256_free( &ctx );
  27463. }
  27464. #if defined(MBEDTLS_SELF_TEST)
  27465. /*
  27466. * FIPS-180-2 test vectors
  27467. */
  27468. static const unsigned char sha256_test_buf[3][57] =
  27469. {
  27470. { "abc" },
  27471. { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" },
  27472. { "" }
  27473. };
  27474. static const int sha256_test_buflen[3] =
  27475. {
  27476. 3, 56, 1000
  27477. };
  27478. static const unsigned char sha256_test_sum[6][32] =
  27479. {
  27480. /*
  27481. * SHA-224 test vectors
  27482. */
  27483. { 0x23, 0x09, 0x7D, 0x22, 0x34, 0x05, 0xD8, 0x22,
  27484. 0x86, 0x42, 0xA4, 0x77, 0xBD, 0xA2, 0x55, 0xB3,
  27485. 0x2A, 0xAD, 0xBC, 0xE4, 0xBD, 0xA0, 0xB3, 0xF7,
  27486. 0xE3, 0x6C, 0x9D, 0xA7 },
  27487. { 0x75, 0x38, 0x8B, 0x16, 0x51, 0x27, 0x76, 0xCC,
  27488. 0x5D, 0xBA, 0x5D, 0xA1, 0xFD, 0x89, 0x01, 0x50,
  27489. 0xB0, 0xC6, 0x45, 0x5C, 0xB4, 0xF5, 0x8B, 0x19,
  27490. 0x52, 0x52, 0x25, 0x25 },
  27491. { 0x20, 0x79, 0x46, 0x55, 0x98, 0x0C, 0x91, 0xD8,
  27492. 0xBB, 0xB4, 0xC1, 0xEA, 0x97, 0x61, 0x8A, 0x4B,
  27493. 0xF0, 0x3F, 0x42, 0x58, 0x19, 0x48, 0xB2, 0xEE,
  27494. 0x4E, 0xE7, 0xAD, 0x67 },
  27495. /*
  27496. * SHA-256 test vectors
  27497. */
  27498. { 0xBA, 0x78, 0x16, 0xBF, 0x8F, 0x01, 0xCF, 0xEA,
  27499. 0x41, 0x41, 0x40, 0xDE, 0x5D, 0xAE, 0x22, 0x23,
  27500. 0xB0, 0x03, 0x61, 0xA3, 0x96, 0x17, 0x7A, 0x9C,
  27501. 0xB4, 0x10, 0xFF, 0x61, 0xF2, 0x00, 0x15, 0xAD },
  27502. { 0x24, 0x8D, 0x6A, 0x61, 0xD2, 0x06, 0x38, 0xB8,
  27503. 0xE5, 0xC0, 0x26, 0x93, 0x0C, 0x3E, 0x60, 0x39,
  27504. 0xA3, 0x3C, 0xE4, 0x59, 0x64, 0xFF, 0x21, 0x67,
  27505. 0xF6, 0xEC, 0xED, 0xD4, 0x19, 0xDB, 0x06, 0xC1 },
  27506. { 0xCD, 0xC7, 0x6E, 0x5C, 0x99, 0x14, 0xFB, 0x92,
  27507. 0x81, 0xA1, 0xC7, 0xE2, 0x84, 0xD7, 0x3E, 0x67,
  27508. 0xF1, 0x80, 0x9A, 0x48, 0xA4, 0x97, 0x20, 0x0E,
  27509. 0x04, 0x6D, 0x39, 0xCC, 0xC7, 0x11, 0x2C, 0xD0 }
  27510. };
  27511. /*
  27512. * Checkup routine
  27513. */
  27514. int mbedtls_sha256_self_test( int verbose )
  27515. {
  27516. int i, j, k, buflen, ret = 0;
  27517. unsigned char buf[1024];
  27518. unsigned char sha256sum[32];
  27519. mbedtls_sha256_context ctx;
  27520. mbedtls_sha256_init( &ctx );
  27521. for( i = 0; i < 6; i++ )
  27522. {
  27523. j = i % 3;
  27524. k = i < 3;
  27525. if( verbose != 0 )
  27526. mbedtls_printf( " SHA-%d test #%d: ", 256 - k * 32, j + 1 );
  27527. mbedtls_sha256_starts( &ctx, k );
  27528. if( j == 2 )
  27529. {
  27530. memset( buf, 'a', buflen = 1000 );
  27531. for( j = 0; j < 1000; j++ )
  27532. mbedtls_sha256_update( &ctx, buf, buflen );
  27533. }
  27534. else
  27535. mbedtls_sha256_update( &ctx, sha256_test_buf[j],
  27536. sha256_test_buflen[j] );
  27537. mbedtls_sha256_finish( &ctx, sha256sum );
  27538. if( memcmp( sha256sum, sha256_test_sum[i], 32 - k * 4 ) != 0 )
  27539. {
  27540. if( verbose != 0 )
  27541. mbedtls_printf( "failed\n" );
  27542. ret = 1;
  27543. goto exit;
  27544. }
  27545. if( verbose != 0 )
  27546. mbedtls_printf( "passed\n" );
  27547. }
  27548. if( verbose != 0 )
  27549. mbedtls_printf( "\n" );
  27550. exit:
  27551. mbedtls_sha256_free( &ctx );
  27552. return( ret );
  27553. }
  27554. #endif /* MBEDTLS_SELF_TEST */
  27555. /* Amalgamated Release Mappings */
  27556. #undef P
  27557. #undef R
  27558. #undef SHR
  27559. #undef ROTR
  27560. #undef S0
  27561. #undef S1
  27562. #undef S2
  27563. #undef S3
  27564. #undef F0
  27565. #undef F1
  27566. #undef K
  27567. #endif /* MBEDTLS_SHA256_C */
  27568. /********* Start of file library/sha512.c ************/
  27569. /*
  27570. * FIPS-180-2 compliant SHA-384/512 implementation
  27571. *
  27572. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  27573. * SPDX-License-Identifier: Apache-2.0
  27574. *
  27575. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  27576. * not use this file except in compliance with the License.
  27577. * You may obtain a copy of the License at
  27578. *
  27579. * http://www.apache.org/licenses/LICENSE-2.0
  27580. *
  27581. * Unless required by applicable law or agreed to in writing, software
  27582. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  27583. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  27584. * See the License for the specific language governing permissions and
  27585. * limitations under the License.
  27586. *
  27587. * This file is part of mbed TLS (https://tls.mbed.org)
  27588. */
  27589. /*
  27590. * The SHA-512 Secure Hash Standard was published by NIST in 2002.
  27591. *
  27592. * http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf
  27593. */
  27594. #if !defined(MBEDTLS_CONFIG_FILE)
  27595. #else
  27596. #endif
  27597. #if defined(MBEDTLS_SHA512_C)
  27598. #if defined(_MSC_VER) || defined(__WATCOMC__)
  27599. #define UL64(x) x##ui64
  27600. #else
  27601. #define UL64(x) x##ULL
  27602. #endif
  27603. #include <string.h>
  27604. #if defined(MBEDTLS_SELF_TEST)
  27605. #if defined(MBEDTLS_PLATFORM_C)
  27606. #else
  27607. #include <stdio.h>
  27608. #define mbedtls_printf printf
  27609. #endif /* MBEDTLS_PLATFORM_C */
  27610. #endif /* MBEDTLS_SELF_TEST */
  27611. #if !defined(MBEDTLS_SHA512_ALT)
  27612. /* Implementation that should never be optimized out by the compiler */
  27613. static void sha512_zeroize( void *v, size_t n ) {
  27614. volatile unsigned char *p = v; while( n-- ) *p++ = 0;
  27615. }
  27616. /*
  27617. * 64-bit integer manipulation macros (big endian)
  27618. */
  27619. #ifndef GET_UINT64_BE
  27620. #define GET_UINT64_BE(n,b,i) \
  27621. { \
  27622. (n) = ( (uint64_t) (b)[(i) ] << 56 ) \
  27623. | ( (uint64_t) (b)[(i) + 1] << 48 ) \
  27624. | ( (uint64_t) (b)[(i) + 2] << 40 ) \
  27625. | ( (uint64_t) (b)[(i) + 3] << 32 ) \
  27626. | ( (uint64_t) (b)[(i) + 4] << 24 ) \
  27627. | ( (uint64_t) (b)[(i) + 5] << 16 ) \
  27628. | ( (uint64_t) (b)[(i) + 6] << 8 ) \
  27629. | ( (uint64_t) (b)[(i) + 7] ); \
  27630. }
  27631. #endif /* GET_UINT64_BE */
  27632. #ifndef PUT_UINT64_BE
  27633. #define PUT_UINT64_BE(n,b,i) \
  27634. { \
  27635. (b)[(i) ] = (unsigned char) ( (n) >> 56 ); \
  27636. (b)[(i) + 1] = (unsigned char) ( (n) >> 48 ); \
  27637. (b)[(i) + 2] = (unsigned char) ( (n) >> 40 ); \
  27638. (b)[(i) + 3] = (unsigned char) ( (n) >> 32 ); \
  27639. (b)[(i) + 4] = (unsigned char) ( (n) >> 24 ); \
  27640. (b)[(i) + 5] = (unsigned char) ( (n) >> 16 ); \
  27641. (b)[(i) + 6] = (unsigned char) ( (n) >> 8 ); \
  27642. (b)[(i) + 7] = (unsigned char) ( (n) ); \
  27643. }
  27644. #endif /* PUT_UINT64_BE */
  27645. /*
  27646. * Round constants
  27647. */
  27648. /* Amalgamated Release Mappings */
  27649. #define K K512
  27650. static const uint64_t K[80] =
  27651. {
  27652. UL64(0x428A2F98D728AE22), UL64(0x7137449123EF65CD),
  27653. UL64(0xB5C0FBCFEC4D3B2F), UL64(0xE9B5DBA58189DBBC),
  27654. UL64(0x3956C25BF348B538), UL64(0x59F111F1B605D019),
  27655. UL64(0x923F82A4AF194F9B), UL64(0xAB1C5ED5DA6D8118),
  27656. UL64(0xD807AA98A3030242), UL64(0x12835B0145706FBE),
  27657. UL64(0x243185BE4EE4B28C), UL64(0x550C7DC3D5FFB4E2),
  27658. UL64(0x72BE5D74F27B896F), UL64(0x80DEB1FE3B1696B1),
  27659. UL64(0x9BDC06A725C71235), UL64(0xC19BF174CF692694),
  27660. UL64(0xE49B69C19EF14AD2), UL64(0xEFBE4786384F25E3),
  27661. UL64(0x0FC19DC68B8CD5B5), UL64(0x240CA1CC77AC9C65),
  27662. UL64(0x2DE92C6F592B0275), UL64(0x4A7484AA6EA6E483),
  27663. UL64(0x5CB0A9DCBD41FBD4), UL64(0x76F988DA831153B5),
  27664. UL64(0x983E5152EE66DFAB), UL64(0xA831C66D2DB43210),
  27665. UL64(0xB00327C898FB213F), UL64(0xBF597FC7BEEF0EE4),
  27666. UL64(0xC6E00BF33DA88FC2), UL64(0xD5A79147930AA725),
  27667. UL64(0x06CA6351E003826F), UL64(0x142929670A0E6E70),
  27668. UL64(0x27B70A8546D22FFC), UL64(0x2E1B21385C26C926),
  27669. UL64(0x4D2C6DFC5AC42AED), UL64(0x53380D139D95B3DF),
  27670. UL64(0x650A73548BAF63DE), UL64(0x766A0ABB3C77B2A8),
  27671. UL64(0x81C2C92E47EDAEE6), UL64(0x92722C851482353B),
  27672. UL64(0xA2BFE8A14CF10364), UL64(0xA81A664BBC423001),
  27673. UL64(0xC24B8B70D0F89791), UL64(0xC76C51A30654BE30),
  27674. UL64(0xD192E819D6EF5218), UL64(0xD69906245565A910),
  27675. UL64(0xF40E35855771202A), UL64(0x106AA07032BBD1B8),
  27676. UL64(0x19A4C116B8D2D0C8), UL64(0x1E376C085141AB53),
  27677. UL64(0x2748774CDF8EEB99), UL64(0x34B0BCB5E19B48A8),
  27678. UL64(0x391C0CB3C5C95A63), UL64(0x4ED8AA4AE3418ACB),
  27679. UL64(0x5B9CCA4F7763E373), UL64(0x682E6FF3D6B2B8A3),
  27680. UL64(0x748F82EE5DEFB2FC), UL64(0x78A5636F43172F60),
  27681. UL64(0x84C87814A1F0AB72), UL64(0x8CC702081A6439EC),
  27682. UL64(0x90BEFFFA23631E28), UL64(0xA4506CEBDE82BDE9),
  27683. UL64(0xBEF9A3F7B2C67915), UL64(0xC67178F2E372532B),
  27684. UL64(0xCA273ECEEA26619C), UL64(0xD186B8C721C0C207),
  27685. UL64(0xEADA7DD6CDE0EB1E), UL64(0xF57D4F7FEE6ED178),
  27686. UL64(0x06F067AA72176FBA), UL64(0x0A637DC5A2C898A6),
  27687. UL64(0x113F9804BEF90DAE), UL64(0x1B710B35131C471B),
  27688. UL64(0x28DB77F523047D84), UL64(0x32CAAB7B40C72493),
  27689. UL64(0x3C9EBE0A15C9BEBC), UL64(0x431D67C49C100D4C),
  27690. UL64(0x4CC5D4BECB3E42B6), UL64(0x597F299CFC657E2A),
  27691. UL64(0x5FCB6FAB3AD6FAEC), UL64(0x6C44198C4A475817)
  27692. };
  27693. void mbedtls_sha512_init( mbedtls_sha512_context *ctx )
  27694. {
  27695. memset( ctx, 0, sizeof( mbedtls_sha512_context ) );
  27696. }
  27697. void mbedtls_sha512_free( mbedtls_sha512_context *ctx )
  27698. {
  27699. if( ctx == NULL )
  27700. return;
  27701. sha512_zeroize( ctx, sizeof( mbedtls_sha512_context ) );
  27702. }
  27703. void mbedtls_sha512_clone( mbedtls_sha512_context *dst,
  27704. const mbedtls_sha512_context *src )
  27705. {
  27706. *dst = *src;
  27707. }
  27708. /*
  27709. * SHA-512 context setup
  27710. */
  27711. void mbedtls_sha512_starts( mbedtls_sha512_context *ctx, int is384 )
  27712. {
  27713. ctx->total[0] = 0;
  27714. ctx->total[1] = 0;
  27715. if( is384 == 0 )
  27716. {
  27717. /* SHA-512 */
  27718. ctx->state[0] = UL64(0x6A09E667F3BCC908);
  27719. ctx->state[1] = UL64(0xBB67AE8584CAA73B);
  27720. ctx->state[2] = UL64(0x3C6EF372FE94F82B);
  27721. ctx->state[3] = UL64(0xA54FF53A5F1D36F1);
  27722. ctx->state[4] = UL64(0x510E527FADE682D1);
  27723. ctx->state[5] = UL64(0x9B05688C2B3E6C1F);
  27724. ctx->state[6] = UL64(0x1F83D9ABFB41BD6B);
  27725. ctx->state[7] = UL64(0x5BE0CD19137E2179);
  27726. }
  27727. else
  27728. {
  27729. /* SHA-384 */
  27730. ctx->state[0] = UL64(0xCBBB9D5DC1059ED8);
  27731. ctx->state[1] = UL64(0x629A292A367CD507);
  27732. ctx->state[2] = UL64(0x9159015A3070DD17);
  27733. ctx->state[3] = UL64(0x152FECD8F70E5939);
  27734. ctx->state[4] = UL64(0x67332667FFC00B31);
  27735. ctx->state[5] = UL64(0x8EB44A8768581511);
  27736. ctx->state[6] = UL64(0xDB0C2E0D64F98FA7);
  27737. ctx->state[7] = UL64(0x47B5481DBEFA4FA4);
  27738. }
  27739. ctx->is384 = is384;
  27740. }
  27741. #if !defined(MBEDTLS_SHA512_PROCESS_ALT)
  27742. void mbedtls_sha512_process( mbedtls_sha512_context *ctx, const unsigned char data[128] )
  27743. {
  27744. int i;
  27745. uint64_t temp1, temp2, W[80];
  27746. uint64_t A, B, C, D, E, F, G, H;
  27747. #define SHR(x,n) (x >> n)
  27748. #define ROTR(x,n) (SHR(x,n) | (x << (64 - n)))
  27749. #define S0(x) (ROTR(x, 1) ^ ROTR(x, 8) ^ SHR(x, 7))
  27750. #define S1(x) (ROTR(x,19) ^ ROTR(x,61) ^ SHR(x, 6))
  27751. #define S2(x) (ROTR(x,28) ^ ROTR(x,34) ^ ROTR(x,39))
  27752. #define S3(x) (ROTR(x,14) ^ ROTR(x,18) ^ ROTR(x,41))
  27753. #define F0(x,y,z) ((x & y) | (z & (x | y)))
  27754. #define F1(x,y,z) (z ^ (x & (y ^ z)))
  27755. #define P(a,b,c,d,e,f,g,h,x,K) \
  27756. { \
  27757. temp1 = h + S3(e) + F1(e,f,g) + K + x; \
  27758. temp2 = S2(a) + F0(a,b,c); \
  27759. d += temp1; h = temp1 + temp2; \
  27760. }
  27761. for( i = 0; i < 16; i++ )
  27762. {
  27763. GET_UINT64_BE( W[i], data, i << 3 );
  27764. }
  27765. for( ; i < 80; i++ )
  27766. {
  27767. W[i] = S1(W[i - 2]) + W[i - 7] +
  27768. S0(W[i - 15]) + W[i - 16];
  27769. }
  27770. A = ctx->state[0];
  27771. B = ctx->state[1];
  27772. C = ctx->state[2];
  27773. D = ctx->state[3];
  27774. E = ctx->state[4];
  27775. F = ctx->state[5];
  27776. G = ctx->state[6];
  27777. H = ctx->state[7];
  27778. i = 0;
  27779. do
  27780. {
  27781. P( A, B, C, D, E, F, G, H, W[i], K[i] ); i++;
  27782. P( H, A, B, C, D, E, F, G, W[i], K[i] ); i++;
  27783. P( G, H, A, B, C, D, E, F, W[i], K[i] ); i++;
  27784. P( F, G, H, A, B, C, D, E, W[i], K[i] ); i++;
  27785. P( E, F, G, H, A, B, C, D, W[i], K[i] ); i++;
  27786. P( D, E, F, G, H, A, B, C, W[i], K[i] ); i++;
  27787. P( C, D, E, F, G, H, A, B, W[i], K[i] ); i++;
  27788. P( B, C, D, E, F, G, H, A, W[i], K[i] ); i++;
  27789. }
  27790. while( i < 80 );
  27791. ctx->state[0] += A;
  27792. ctx->state[1] += B;
  27793. ctx->state[2] += C;
  27794. ctx->state[3] += D;
  27795. ctx->state[4] += E;
  27796. ctx->state[5] += F;
  27797. ctx->state[6] += G;
  27798. ctx->state[7] += H;
  27799. }
  27800. #endif /* !MBEDTLS_SHA512_PROCESS_ALT */
  27801. /*
  27802. * SHA-512 process buffer
  27803. */
  27804. void mbedtls_sha512_update( mbedtls_sha512_context *ctx, const unsigned char *input,
  27805. size_t ilen )
  27806. {
  27807. size_t fill;
  27808. unsigned int left;
  27809. if( ilen == 0 )
  27810. return;
  27811. left = (unsigned int) (ctx->total[0] & 0x7F);
  27812. fill = 128 - left;
  27813. ctx->total[0] += (uint64_t) ilen;
  27814. if( ctx->total[0] < (uint64_t) ilen )
  27815. ctx->total[1]++;
  27816. if( left && ilen >= fill )
  27817. {
  27818. memcpy( (void *) (ctx->buffer + left), input, fill );
  27819. mbedtls_sha512_process( ctx, ctx->buffer );
  27820. input += fill;
  27821. ilen -= fill;
  27822. left = 0;
  27823. }
  27824. while( ilen >= 128 )
  27825. {
  27826. mbedtls_sha512_process( ctx, input );
  27827. input += 128;
  27828. ilen -= 128;
  27829. }
  27830. if( ilen > 0 )
  27831. memcpy( (void *) (ctx->buffer + left), input, ilen );
  27832. }
  27833. static const unsigned char sha512_padding[128] =
  27834. {
  27835. 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  27836. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  27837. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  27838. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  27839. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  27840. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  27841. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  27842. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  27843. };
  27844. /*
  27845. * SHA-512 final digest
  27846. */
  27847. void mbedtls_sha512_finish( mbedtls_sha512_context *ctx, unsigned char output[64] )
  27848. {
  27849. size_t last, padn;
  27850. uint64_t high, low;
  27851. unsigned char msglen[16];
  27852. high = ( ctx->total[0] >> 61 )
  27853. | ( ctx->total[1] << 3 );
  27854. low = ( ctx->total[0] << 3 );
  27855. PUT_UINT64_BE( high, msglen, 0 );
  27856. PUT_UINT64_BE( low, msglen, 8 );
  27857. last = (size_t)( ctx->total[0] & 0x7F );
  27858. padn = ( last < 112 ) ? ( 112 - last ) : ( 240 - last );
  27859. mbedtls_sha512_update( ctx, sha512_padding, padn );
  27860. mbedtls_sha512_update( ctx, msglen, 16 );
  27861. PUT_UINT64_BE( ctx->state[0], output, 0 );
  27862. PUT_UINT64_BE( ctx->state[1], output, 8 );
  27863. PUT_UINT64_BE( ctx->state[2], output, 16 );
  27864. PUT_UINT64_BE( ctx->state[3], output, 24 );
  27865. PUT_UINT64_BE( ctx->state[4], output, 32 );
  27866. PUT_UINT64_BE( ctx->state[5], output, 40 );
  27867. if( ctx->is384 == 0 )
  27868. {
  27869. PUT_UINT64_BE( ctx->state[6], output, 48 );
  27870. PUT_UINT64_BE( ctx->state[7], output, 56 );
  27871. }
  27872. }
  27873. #endif /* !MBEDTLS_SHA512_ALT */
  27874. /*
  27875. * output = SHA-512( input buffer )
  27876. */
  27877. void mbedtls_sha512( const unsigned char *input, size_t ilen,
  27878. unsigned char output[64], int is384 )
  27879. {
  27880. mbedtls_sha512_context ctx;
  27881. mbedtls_sha512_init( &ctx );
  27882. mbedtls_sha512_starts( &ctx, is384 );
  27883. mbedtls_sha512_update( &ctx, input, ilen );
  27884. mbedtls_sha512_finish( &ctx, output );
  27885. mbedtls_sha512_free( &ctx );
  27886. }
  27887. #if defined(MBEDTLS_SELF_TEST)
  27888. /*
  27889. * FIPS-180-2 test vectors
  27890. */
  27891. static const unsigned char sha512_test_buf[3][113] =
  27892. {
  27893. { "abc" },
  27894. { "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn"
  27895. "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu" },
  27896. { "" }
  27897. };
  27898. static const int sha512_test_buflen[3] =
  27899. {
  27900. 3, 112, 1000
  27901. };
  27902. static const unsigned char sha512_test_sum[6][64] =
  27903. {
  27904. /*
  27905. * SHA-384 test vectors
  27906. */
  27907. { 0xCB, 0x00, 0x75, 0x3F, 0x45, 0xA3, 0x5E, 0x8B,
  27908. 0xB5, 0xA0, 0x3D, 0x69, 0x9A, 0xC6, 0x50, 0x07,
  27909. 0x27, 0x2C, 0x32, 0xAB, 0x0E, 0xDE, 0xD1, 0x63,
  27910. 0x1A, 0x8B, 0x60, 0x5A, 0x43, 0xFF, 0x5B, 0xED,
  27911. 0x80, 0x86, 0x07, 0x2B, 0xA1, 0xE7, 0xCC, 0x23,
  27912. 0x58, 0xBA, 0xEC, 0xA1, 0x34, 0xC8, 0x25, 0xA7 },
  27913. { 0x09, 0x33, 0x0C, 0x33, 0xF7, 0x11, 0x47, 0xE8,
  27914. 0x3D, 0x19, 0x2F, 0xC7, 0x82, 0xCD, 0x1B, 0x47,
  27915. 0x53, 0x11, 0x1B, 0x17, 0x3B, 0x3B, 0x05, 0xD2,
  27916. 0x2F, 0xA0, 0x80, 0x86, 0xE3, 0xB0, 0xF7, 0x12,
  27917. 0xFC, 0xC7, 0xC7, 0x1A, 0x55, 0x7E, 0x2D, 0xB9,
  27918. 0x66, 0xC3, 0xE9, 0xFA, 0x91, 0x74, 0x60, 0x39 },
  27919. { 0x9D, 0x0E, 0x18, 0x09, 0x71, 0x64, 0x74, 0xCB,
  27920. 0x08, 0x6E, 0x83, 0x4E, 0x31, 0x0A, 0x4A, 0x1C,
  27921. 0xED, 0x14, 0x9E, 0x9C, 0x00, 0xF2, 0x48, 0x52,
  27922. 0x79, 0x72, 0xCE, 0xC5, 0x70, 0x4C, 0x2A, 0x5B,
  27923. 0x07, 0xB8, 0xB3, 0xDC, 0x38, 0xEC, 0xC4, 0xEB,
  27924. 0xAE, 0x97, 0xDD, 0xD8, 0x7F, 0x3D, 0x89, 0x85 },
  27925. /*
  27926. * SHA-512 test vectors
  27927. */
  27928. { 0xDD, 0xAF, 0x35, 0xA1, 0x93, 0x61, 0x7A, 0xBA,
  27929. 0xCC, 0x41, 0x73, 0x49, 0xAE, 0x20, 0x41, 0x31,
  27930. 0x12, 0xE6, 0xFA, 0x4E, 0x89, 0xA9, 0x7E, 0xA2,
  27931. 0x0A, 0x9E, 0xEE, 0xE6, 0x4B, 0x55, 0xD3, 0x9A,
  27932. 0x21, 0x92, 0x99, 0x2A, 0x27, 0x4F, 0xC1, 0xA8,
  27933. 0x36, 0xBA, 0x3C, 0x23, 0xA3, 0xFE, 0xEB, 0xBD,
  27934. 0x45, 0x4D, 0x44, 0x23, 0x64, 0x3C, 0xE8, 0x0E,
  27935. 0x2A, 0x9A, 0xC9, 0x4F, 0xA5, 0x4C, 0xA4, 0x9F },
  27936. { 0x8E, 0x95, 0x9B, 0x75, 0xDA, 0xE3, 0x13, 0xDA,
  27937. 0x8C, 0xF4, 0xF7, 0x28, 0x14, 0xFC, 0x14, 0x3F,
  27938. 0x8F, 0x77, 0x79, 0xC6, 0xEB, 0x9F, 0x7F, 0xA1,
  27939. 0x72, 0x99, 0xAE, 0xAD, 0xB6, 0x88, 0x90, 0x18,
  27940. 0x50, 0x1D, 0x28, 0x9E, 0x49, 0x00, 0xF7, 0xE4,
  27941. 0x33, 0x1B, 0x99, 0xDE, 0xC4, 0xB5, 0x43, 0x3A,
  27942. 0xC7, 0xD3, 0x29, 0xEE, 0xB6, 0xDD, 0x26, 0x54,
  27943. 0x5E, 0x96, 0xE5, 0x5B, 0x87, 0x4B, 0xE9, 0x09 },
  27944. { 0xE7, 0x18, 0x48, 0x3D, 0x0C, 0xE7, 0x69, 0x64,
  27945. 0x4E, 0x2E, 0x42, 0xC7, 0xBC, 0x15, 0xB4, 0x63,
  27946. 0x8E, 0x1F, 0x98, 0xB1, 0x3B, 0x20, 0x44, 0x28,
  27947. 0x56, 0x32, 0xA8, 0x03, 0xAF, 0xA9, 0x73, 0xEB,
  27948. 0xDE, 0x0F, 0xF2, 0x44, 0x87, 0x7E, 0xA6, 0x0A,
  27949. 0x4C, 0xB0, 0x43, 0x2C, 0xE5, 0x77, 0xC3, 0x1B,
  27950. 0xEB, 0x00, 0x9C, 0x5C, 0x2C, 0x49, 0xAA, 0x2E,
  27951. 0x4E, 0xAD, 0xB2, 0x17, 0xAD, 0x8C, 0xC0, 0x9B }
  27952. };
  27953. /*
  27954. * Checkup routine
  27955. */
  27956. int mbedtls_sha512_self_test( int verbose )
  27957. {
  27958. int i, j, k, buflen, ret = 0;
  27959. unsigned char buf[1024];
  27960. unsigned char sha512sum[64];
  27961. mbedtls_sha512_context ctx;
  27962. mbedtls_sha512_init( &ctx );
  27963. for( i = 0; i < 6; i++ )
  27964. {
  27965. j = i % 3;
  27966. k = i < 3;
  27967. if( verbose != 0 )
  27968. mbedtls_printf( " SHA-%d test #%d: ", 512 - k * 128, j + 1 );
  27969. mbedtls_sha512_starts( &ctx, k );
  27970. if( j == 2 )
  27971. {
  27972. memset( buf, 'a', buflen = 1000 );
  27973. for( j = 0; j < 1000; j++ )
  27974. mbedtls_sha512_update( &ctx, buf, buflen );
  27975. }
  27976. else
  27977. mbedtls_sha512_update( &ctx, sha512_test_buf[j],
  27978. sha512_test_buflen[j] );
  27979. mbedtls_sha512_finish( &ctx, sha512sum );
  27980. if( memcmp( sha512sum, sha512_test_sum[i], 64 - k * 16 ) != 0 )
  27981. {
  27982. if( verbose != 0 )
  27983. mbedtls_printf( "failed\n" );
  27984. ret = 1;
  27985. goto exit;
  27986. }
  27987. if( verbose != 0 )
  27988. mbedtls_printf( "passed\n" );
  27989. }
  27990. if( verbose != 0 )
  27991. mbedtls_printf( "\n" );
  27992. exit:
  27993. mbedtls_sha512_free( &ctx );
  27994. return( ret );
  27995. }
  27996. #endif /* MBEDTLS_SELF_TEST */
  27997. /* Amalgamated Release Mappings */
  27998. #undef P
  27999. #undef R
  28000. #undef SHR
  28001. #undef ROTR
  28002. #undef S0
  28003. #undef S1
  28004. #undef S2
  28005. #undef S3
  28006. #undef F0
  28007. #undef F1
  28008. #undef K
  28009. #endif /* MBEDTLS_SHA512_C */
  28010. /********* Start of file library/ssl_cache.c ************/
  28011. /*
  28012. * SSL session cache implementation
  28013. *
  28014. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  28015. * SPDX-License-Identifier: Apache-2.0
  28016. *
  28017. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  28018. * not use this file except in compliance with the License.
  28019. * You may obtain a copy of the License at
  28020. *
  28021. * http://www.apache.org/licenses/LICENSE-2.0
  28022. *
  28023. * Unless required by applicable law or agreed to in writing, software
  28024. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  28025. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  28026. * See the License for the specific language governing permissions and
  28027. * limitations under the License.
  28028. *
  28029. * This file is part of mbed TLS (https://tls.mbed.org)
  28030. */
  28031. /*
  28032. * These session callbacks use a simple chained list
  28033. * to store and retrieve the session information.
  28034. */
  28035. #if !defined(MBEDTLS_CONFIG_FILE)
  28036. #else
  28037. #endif
  28038. #if defined(MBEDTLS_SSL_CACHE_C)
  28039. #include <string.h>
  28040. #if defined(MBEDTLS_PLATFORM_C)
  28041. #else
  28042. #include <stdlib.h>
  28043. #define mbedtls_calloc calloc
  28044. #define mbedtls_free free
  28045. #endif
  28046. void mbedtls_ssl_cache_init( mbedtls_ssl_cache_context *cache )
  28047. {
  28048. memset( cache, 0, sizeof( mbedtls_ssl_cache_context ) );
  28049. cache->timeout = MBEDTLS_SSL_CACHE_DEFAULT_TIMEOUT;
  28050. cache->max_entries = MBEDTLS_SSL_CACHE_DEFAULT_MAX_ENTRIES;
  28051. #if defined(MBEDTLS_THREADING_C)
  28052. mbedtls_mutex_init( &cache->mutex );
  28053. #endif
  28054. }
  28055. int mbedtls_ssl_cache_get( void *data, mbedtls_ssl_session *session )
  28056. {
  28057. int ret = 1;
  28058. #if defined(MBEDTLS_HAVE_TIME)
  28059. time_t t = time( NULL );
  28060. #endif
  28061. mbedtls_ssl_cache_context *cache = (mbedtls_ssl_cache_context *) data;
  28062. mbedtls_ssl_cache_entry *cur, *entry;
  28063. #if defined(MBEDTLS_THREADING_C)
  28064. if( mbedtls_mutex_lock( &cache->mutex ) != 0 )
  28065. return( 1 );
  28066. #endif
  28067. cur = cache->chain;
  28068. entry = NULL;
  28069. while( cur != NULL )
  28070. {
  28071. entry = cur;
  28072. cur = cur->next;
  28073. #if defined(MBEDTLS_HAVE_TIME)
  28074. if( cache->timeout != 0 &&
  28075. (int) ( t - entry->timestamp ) > cache->timeout )
  28076. continue;
  28077. #endif
  28078. if( session->ciphersuite != entry->session.ciphersuite ||
  28079. session->compression != entry->session.compression ||
  28080. session->id_len != entry->session.id_len )
  28081. continue;
  28082. if( memcmp( session->id, entry->session.id,
  28083. entry->session.id_len ) != 0 )
  28084. continue;
  28085. memcpy( session->master, entry->session.master, 48 );
  28086. session->verify_result = entry->session.verify_result;
  28087. #if defined(MBEDTLS_X509_CRT_PARSE_C)
  28088. /*
  28089. * Restore peer certificate (without rest of the original chain)
  28090. */
  28091. if( entry->peer_cert.p != NULL )
  28092. {
  28093. if( ( session->peer_cert = mbedtls_calloc( 1,
  28094. sizeof(mbedtls_x509_crt) ) ) == NULL )
  28095. {
  28096. ret = 1;
  28097. goto exit;
  28098. }
  28099. mbedtls_x509_crt_init( session->peer_cert );
  28100. if( mbedtls_x509_crt_parse( session->peer_cert, entry->peer_cert.p,
  28101. entry->peer_cert.len ) != 0 )
  28102. {
  28103. mbedtls_free( session->peer_cert );
  28104. session->peer_cert = NULL;
  28105. ret = 1;
  28106. goto exit;
  28107. }
  28108. }
  28109. #endif /* MBEDTLS_X509_CRT_PARSE_C */
  28110. ret = 0;
  28111. goto exit;
  28112. }
  28113. exit:
  28114. #if defined(MBEDTLS_THREADING_C)
  28115. if( mbedtls_mutex_unlock( &cache->mutex ) != 0 )
  28116. ret = 1;
  28117. #endif
  28118. return( ret );
  28119. }
  28120. int mbedtls_ssl_cache_set( void *data, const mbedtls_ssl_session *session )
  28121. {
  28122. int ret = 1;
  28123. #if defined(MBEDTLS_HAVE_TIME)
  28124. time_t t = time( NULL ), oldest = 0;
  28125. mbedtls_ssl_cache_entry *old = NULL;
  28126. #endif
  28127. mbedtls_ssl_cache_context *cache = (mbedtls_ssl_cache_context *) data;
  28128. mbedtls_ssl_cache_entry *cur, *prv;
  28129. int count = 0;
  28130. #if defined(MBEDTLS_THREADING_C)
  28131. if( ( ret = mbedtls_mutex_lock( &cache->mutex ) ) != 0 )
  28132. return( ret );
  28133. #endif
  28134. cur = cache->chain;
  28135. prv = NULL;
  28136. while( cur != NULL )
  28137. {
  28138. count++;
  28139. #if defined(MBEDTLS_HAVE_TIME)
  28140. if( cache->timeout != 0 &&
  28141. (int) ( t - cur->timestamp ) > cache->timeout )
  28142. {
  28143. cur->timestamp = t;
  28144. break; /* expired, reuse this slot, update timestamp */
  28145. }
  28146. #endif
  28147. if( memcmp( session->id, cur->session.id, cur->session.id_len ) == 0 )
  28148. break; /* client reconnected, keep timestamp for session id */
  28149. #if defined(MBEDTLS_HAVE_TIME)
  28150. if( oldest == 0 || cur->timestamp < oldest )
  28151. {
  28152. oldest = cur->timestamp;
  28153. old = cur;
  28154. }
  28155. #endif
  28156. prv = cur;
  28157. cur = cur->next;
  28158. }
  28159. if( cur == NULL )
  28160. {
  28161. #if defined(MBEDTLS_HAVE_TIME)
  28162. /*
  28163. * Reuse oldest entry if max_entries reached
  28164. */
  28165. if( count >= cache->max_entries )
  28166. {
  28167. if( old == NULL )
  28168. {
  28169. ret = 1;
  28170. goto exit;
  28171. }
  28172. cur = old;
  28173. }
  28174. #else /* MBEDTLS_HAVE_TIME */
  28175. /*
  28176. * Reuse first entry in chain if max_entries reached,
  28177. * but move to last place
  28178. */
  28179. if( count >= cache->max_entries )
  28180. {
  28181. if( cache->chain == NULL )
  28182. {
  28183. ret = 1;
  28184. goto exit;
  28185. }
  28186. cur = cache->chain;
  28187. cache->chain = cur->next;
  28188. cur->next = NULL;
  28189. prv->next = cur;
  28190. }
  28191. #endif /* MBEDTLS_HAVE_TIME */
  28192. else
  28193. {
  28194. /*
  28195. * max_entries not reached, create new entry
  28196. */
  28197. cur = mbedtls_calloc( 1, sizeof(mbedtls_ssl_cache_entry) );
  28198. if( cur == NULL )
  28199. {
  28200. ret = 1;
  28201. goto exit;
  28202. }
  28203. if( prv == NULL )
  28204. cache->chain = cur;
  28205. else
  28206. prv->next = cur;
  28207. }
  28208. #if defined(MBEDTLS_HAVE_TIME)
  28209. cur->timestamp = t;
  28210. #endif
  28211. }
  28212. memcpy( &cur->session, session, sizeof( mbedtls_ssl_session ) );
  28213. #if defined(MBEDTLS_X509_CRT_PARSE_C)
  28214. /*
  28215. * If we're reusing an entry, free its certificate first
  28216. */
  28217. if( cur->peer_cert.p != NULL )
  28218. {
  28219. mbedtls_free( cur->peer_cert.p );
  28220. memset( &cur->peer_cert, 0, sizeof(mbedtls_x509_buf) );
  28221. }
  28222. /*
  28223. * Store peer certificate
  28224. */
  28225. if( session->peer_cert != NULL )
  28226. {
  28227. cur->peer_cert.p = mbedtls_calloc( 1, session->peer_cert->raw.len );
  28228. if( cur->peer_cert.p == NULL )
  28229. {
  28230. ret = 1;
  28231. goto exit;
  28232. }
  28233. memcpy( cur->peer_cert.p, session->peer_cert->raw.p,
  28234. session->peer_cert->raw.len );
  28235. cur->peer_cert.len = session->peer_cert->raw.len;
  28236. cur->session.peer_cert = NULL;
  28237. }
  28238. #endif /* MBEDTLS_X509_CRT_PARSE_C */
  28239. ret = 0;
  28240. exit:
  28241. #if defined(MBEDTLS_THREADING_C)
  28242. if( mbedtls_mutex_unlock( &cache->mutex ) != 0 )
  28243. ret = 1;
  28244. #endif
  28245. return( ret );
  28246. }
  28247. #if defined(MBEDTLS_HAVE_TIME)
  28248. void mbedtls_ssl_cache_set_timeout( mbedtls_ssl_cache_context *cache, int timeout )
  28249. {
  28250. if( timeout < 0 ) timeout = 0;
  28251. cache->timeout = timeout;
  28252. }
  28253. #endif /* MBEDTLS_HAVE_TIME */
  28254. void mbedtls_ssl_cache_set_max_entries( mbedtls_ssl_cache_context *cache, int max )
  28255. {
  28256. if( max < 0 ) max = 0;
  28257. cache->max_entries = max;
  28258. }
  28259. void mbedtls_ssl_cache_free( mbedtls_ssl_cache_context *cache )
  28260. {
  28261. mbedtls_ssl_cache_entry *cur, *prv;
  28262. cur = cache->chain;
  28263. while( cur != NULL )
  28264. {
  28265. prv = cur;
  28266. cur = cur->next;
  28267. mbedtls_ssl_session_free( &prv->session );
  28268. #if defined(MBEDTLS_X509_CRT_PARSE_C)
  28269. mbedtls_free( prv->peer_cert.p );
  28270. #endif /* MBEDTLS_X509_CRT_PARSE_C */
  28271. mbedtls_free( prv );
  28272. }
  28273. #if defined(MBEDTLS_THREADING_C)
  28274. mbedtls_mutex_free( &cache->mutex );
  28275. #endif
  28276. }
  28277. #endif /* MBEDTLS_SSL_CACHE_C */
  28278. /********* Start of file library/ssl_ciphersuites.c ************/
  28279. /**
  28280. * \file ssl_ciphersuites.c
  28281. *
  28282. * \brief SSL ciphersuites for mbed TLS
  28283. *
  28284. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  28285. * SPDX-License-Identifier: Apache-2.0
  28286. *
  28287. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  28288. * not use this file except in compliance with the License.
  28289. * You may obtain a copy of the License at
  28290. *
  28291. * http://www.apache.org/licenses/LICENSE-2.0
  28292. *
  28293. * Unless required by applicable law or agreed to in writing, software
  28294. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  28295. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  28296. * See the License for the specific language governing permissions and
  28297. * limitations under the License.
  28298. *
  28299. * This file is part of mbed TLS (https://tls.mbed.org)
  28300. */
  28301. #if !defined(MBEDTLS_CONFIG_FILE)
  28302. #else
  28303. #endif
  28304. #if defined(MBEDTLS_SSL_TLS_C)
  28305. // #include <stdlib.h>
  28306. #include <string.h>
  28307. /*
  28308. * Ordered from most preferred to least preferred in terms of security.
  28309. *
  28310. * Current rule (except rc4, weak and null which come last):
  28311. * 1. By key exchange:
  28312. * Forward-secure non-PSK > forward-secure PSK > ECJPAKE > other non-PSK > other PSK
  28313. * 2. By key length and cipher:
  28314. * AES-256 > Camellia-256 > AES-128 > Camellia-128 > 3DES
  28315. * 3. By cipher mode when relevant GCM > CCM > CBC > CCM_8
  28316. * 4. By hash function used when relevant
  28317. * 5. By key exchange/auth again: EC > non-EC
  28318. */
  28319. static const int ciphersuite_preference[] =
  28320. {
  28321. #if defined(MBEDTLS_SSL_CIPHERSUITES)
  28322. MBEDTLS_SSL_CIPHERSUITES,
  28323. #else
  28324. /* All AES-256 ephemeral suites */
  28325. MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
  28326. MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
  28327. MBEDTLS_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,
  28328. MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM,
  28329. MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CCM,
  28330. MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,
  28331. MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,
  28332. MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256,
  28333. MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
  28334. MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
  28335. MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA,
  28336. MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8,
  28337. MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CCM_8,
  28338. /* All CAMELLIA-256 ephemeral suites */
  28339. MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384,
  28340. MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384,
  28341. MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384,
  28342. MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384,
  28343. MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384,
  28344. MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256,
  28345. MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA,
  28346. /* All AES-128 ephemeral suites */
  28347. MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
  28348. MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
  28349. MBEDTLS_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,
  28350. MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM,
  28351. MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM,
  28352. MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,
  28353. MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
  28354. MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256,
  28355. MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
  28356. MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
  28357. MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA,
  28358. MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8,
  28359. MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM_8,
  28360. /* All CAMELLIA-128 ephemeral suites */
  28361. MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256,
  28362. MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256,
  28363. MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256,
  28364. MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256,
  28365. MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256,
  28366. MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256,
  28367. MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA,
  28368. /* All remaining >= 128-bit ephemeral suites */
  28369. MBEDTLS_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA,
  28370. MBEDTLS_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA,
  28371. MBEDTLS_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA,
  28372. /* The PSK ephemeral suites */
  28373. MBEDTLS_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384,
  28374. MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CCM,
  28375. MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384,
  28376. MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384,
  28377. MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA,
  28378. MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA,
  28379. MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384,
  28380. MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384,
  28381. MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384,
  28382. MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CCM_8,
  28383. MBEDTLS_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256,
  28384. MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CCM,
  28385. MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256,
  28386. MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256,
  28387. MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA,
  28388. MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA,
  28389. MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256,
  28390. MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256,
  28391. MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256,
  28392. MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CCM_8,
  28393. MBEDTLS_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA,
  28394. MBEDTLS_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA,
  28395. /* The ECJPAKE suite */
  28396. MBEDTLS_TLS_ECJPAKE_WITH_AES_128_CCM_8,
  28397. /* All AES-256 suites */
  28398. MBEDTLS_TLS_RSA_WITH_AES_256_GCM_SHA384,
  28399. MBEDTLS_TLS_RSA_WITH_AES_256_CCM,
  28400. MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA256,
  28401. MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA,
  28402. MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384,
  28403. MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384,
  28404. MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA,
  28405. MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384,
  28406. MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384,
  28407. MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA,
  28408. MBEDTLS_TLS_RSA_WITH_AES_256_CCM_8,
  28409. /* All CAMELLIA-256 suites */
  28410. MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384,
  28411. MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256,
  28412. MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA,
  28413. MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384,
  28414. MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384,
  28415. MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384,
  28416. MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384,
  28417. /* All AES-128 suites */
  28418. MBEDTLS_TLS_RSA_WITH_AES_128_GCM_SHA256,
  28419. MBEDTLS_TLS_RSA_WITH_AES_128_CCM,
  28420. MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA256,
  28421. MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA,
  28422. MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256,
  28423. MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256,
  28424. MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA,
  28425. MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256,
  28426. MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256,
  28427. MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA,
  28428. MBEDTLS_TLS_RSA_WITH_AES_128_CCM_8,
  28429. /* All CAMELLIA-128 suites */
  28430. MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256,
  28431. MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256,
  28432. MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA,
  28433. MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256,
  28434. MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256,
  28435. MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256,
  28436. MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256,
  28437. /* All remaining >= 128-bit suites */
  28438. MBEDTLS_TLS_RSA_WITH_3DES_EDE_CBC_SHA,
  28439. MBEDTLS_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA,
  28440. MBEDTLS_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA,
  28441. /* The RSA PSK suites */
  28442. MBEDTLS_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384,
  28443. MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384,
  28444. MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA,
  28445. MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384,
  28446. MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384,
  28447. MBEDTLS_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256,
  28448. MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256,
  28449. MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA,
  28450. MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256,
  28451. MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256,
  28452. MBEDTLS_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA,
  28453. /* The PSK suites */
  28454. MBEDTLS_TLS_PSK_WITH_AES_256_GCM_SHA384,
  28455. MBEDTLS_TLS_PSK_WITH_AES_256_CCM,
  28456. MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA384,
  28457. MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA,
  28458. MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384,
  28459. MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384,
  28460. MBEDTLS_TLS_PSK_WITH_AES_256_CCM_8,
  28461. MBEDTLS_TLS_PSK_WITH_AES_128_GCM_SHA256,
  28462. MBEDTLS_TLS_PSK_WITH_AES_128_CCM,
  28463. MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA256,
  28464. MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA,
  28465. MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256,
  28466. MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256,
  28467. MBEDTLS_TLS_PSK_WITH_AES_128_CCM_8,
  28468. MBEDTLS_TLS_PSK_WITH_3DES_EDE_CBC_SHA,
  28469. /* RC4 suites */
  28470. MBEDTLS_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA,
  28471. MBEDTLS_TLS_ECDHE_RSA_WITH_RC4_128_SHA,
  28472. MBEDTLS_TLS_ECDHE_PSK_WITH_RC4_128_SHA,
  28473. MBEDTLS_TLS_DHE_PSK_WITH_RC4_128_SHA,
  28474. MBEDTLS_TLS_RSA_WITH_RC4_128_SHA,
  28475. MBEDTLS_TLS_RSA_WITH_RC4_128_MD5,
  28476. MBEDTLS_TLS_ECDH_RSA_WITH_RC4_128_SHA,
  28477. MBEDTLS_TLS_ECDH_ECDSA_WITH_RC4_128_SHA,
  28478. MBEDTLS_TLS_RSA_PSK_WITH_RC4_128_SHA,
  28479. MBEDTLS_TLS_PSK_WITH_RC4_128_SHA,
  28480. /* Weak suites */
  28481. MBEDTLS_TLS_DHE_RSA_WITH_DES_CBC_SHA,
  28482. MBEDTLS_TLS_RSA_WITH_DES_CBC_SHA,
  28483. /* NULL suites */
  28484. MBEDTLS_TLS_ECDHE_ECDSA_WITH_NULL_SHA,
  28485. MBEDTLS_TLS_ECDHE_RSA_WITH_NULL_SHA,
  28486. MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA384,
  28487. MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA256,
  28488. MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA,
  28489. MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA384,
  28490. MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA256,
  28491. MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA,
  28492. MBEDTLS_TLS_RSA_WITH_NULL_SHA256,
  28493. MBEDTLS_TLS_RSA_WITH_NULL_SHA,
  28494. MBEDTLS_TLS_RSA_WITH_NULL_MD5,
  28495. MBEDTLS_TLS_ECDH_RSA_WITH_NULL_SHA,
  28496. MBEDTLS_TLS_ECDH_ECDSA_WITH_NULL_SHA,
  28497. MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA384,
  28498. MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA256,
  28499. MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA,
  28500. MBEDTLS_TLS_PSK_WITH_NULL_SHA384,
  28501. MBEDTLS_TLS_PSK_WITH_NULL_SHA256,
  28502. MBEDTLS_TLS_PSK_WITH_NULL_SHA,
  28503. #endif /* MBEDTLS_SSL_CIPHERSUITES */
  28504. 0
  28505. };
  28506. static const mbedtls_ssl_ciphersuite_t ciphersuite_definitions[] =
  28507. {
  28508. #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
  28509. #if defined(MBEDTLS_AES_C)
  28510. #if defined(MBEDTLS_SHA1_C)
  28511. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  28512. { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, "TLS-ECDHE-ECDSA-WITH-AES-128-CBC-SHA",
  28513. MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA,
  28514. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  28515. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28516. 0 },
  28517. { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, "TLS-ECDHE-ECDSA-WITH-AES-256-CBC-SHA",
  28518. MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA,
  28519. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  28520. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28521. 0 },
  28522. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  28523. #endif /* MBEDTLS_SHA1_C */
  28524. #if defined(MBEDTLS_SHA256_C)
  28525. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  28526. { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, "TLS-ECDHE-ECDSA-WITH-AES-128-CBC-SHA256",
  28527. MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA,
  28528. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28529. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28530. 0 },
  28531. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  28532. #if defined(MBEDTLS_GCM_C)
  28533. { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, "TLS-ECDHE-ECDSA-WITH-AES-128-GCM-SHA256",
  28534. MBEDTLS_CIPHER_AES_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA,
  28535. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28536. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28537. 0 },
  28538. #endif /* MBEDTLS_GCM_C */
  28539. #endif /* MBEDTLS_SHA256_C */
  28540. #if defined(MBEDTLS_SHA512_C)
  28541. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  28542. { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, "TLS-ECDHE-ECDSA-WITH-AES-256-CBC-SHA384",
  28543. MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA,
  28544. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28545. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28546. 0 },
  28547. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  28548. #if defined(MBEDTLS_GCM_C)
  28549. { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, "TLS-ECDHE-ECDSA-WITH-AES-256-GCM-SHA384",
  28550. MBEDTLS_CIPHER_AES_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA,
  28551. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28552. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28553. 0 },
  28554. #endif /* MBEDTLS_GCM_C */
  28555. #endif /* MBEDTLS_SHA512_C */
  28556. #if defined(MBEDTLS_CCM_C)
  28557. { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM, "TLS-ECDHE-ECDSA-WITH-AES-256-CCM",
  28558. MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA,
  28559. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28560. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28561. 0 },
  28562. { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8, "TLS-ECDHE-ECDSA-WITH-AES-256-CCM-8",
  28563. MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA,
  28564. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28565. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28566. MBEDTLS_CIPHERSUITE_SHORT_TAG },
  28567. { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM, "TLS-ECDHE-ECDSA-WITH-AES-128-CCM",
  28568. MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA,
  28569. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28570. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28571. 0 },
  28572. { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8, "TLS-ECDHE-ECDSA-WITH-AES-128-CCM-8",
  28573. MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA,
  28574. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28575. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28576. MBEDTLS_CIPHERSUITE_SHORT_TAG },
  28577. #endif /* MBEDTLS_CCM_C */
  28578. #endif /* MBEDTLS_AES_C */
  28579. #if defined(MBEDTLS_CAMELLIA_C)
  28580. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  28581. #if defined(MBEDTLS_SHA256_C)
  28582. { MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256, "TLS-ECDHE-ECDSA-WITH-CAMELLIA-128-CBC-SHA256",
  28583. MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA,
  28584. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  28585. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28586. 0 },
  28587. #endif /* MBEDTLS_SHA256_C */
  28588. #if defined(MBEDTLS_SHA512_C)
  28589. { MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384, "TLS-ECDHE-ECDSA-WITH-CAMELLIA-256-CBC-SHA384",
  28590. MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA,
  28591. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  28592. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28593. 0 },
  28594. #endif /* MBEDTLS_SHA512_C */
  28595. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  28596. #if defined(MBEDTLS_GCM_C)
  28597. #if defined(MBEDTLS_SHA256_C)
  28598. { MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256, "TLS-ECDHE-ECDSA-WITH-CAMELLIA-128-GCM-SHA256",
  28599. MBEDTLS_CIPHER_CAMELLIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA,
  28600. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28601. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28602. 0 },
  28603. #endif /* MBEDTLS_SHA256_C */
  28604. #if defined(MBEDTLS_SHA512_C)
  28605. { MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384, "TLS-ECDHE-ECDSA-WITH-CAMELLIA-256-GCM-SHA384",
  28606. MBEDTLS_CIPHER_CAMELLIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA,
  28607. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28608. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28609. 0 },
  28610. #endif /* MBEDTLS_SHA512_C */
  28611. #endif /* MBEDTLS_GCM_C */
  28612. #endif /* MBEDTLS_CAMELLIA_C */
  28613. #if defined(MBEDTLS_DES_C)
  28614. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  28615. #if defined(MBEDTLS_SHA1_C)
  28616. { MBEDTLS_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, "TLS-ECDHE-ECDSA-WITH-3DES-EDE-CBC-SHA",
  28617. MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA,
  28618. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  28619. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28620. 0 },
  28621. #endif /* MBEDTLS_SHA1_C */
  28622. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  28623. #endif /* MBEDTLS_DES_C */
  28624. #if defined(MBEDTLS_ARC4_C)
  28625. #if defined(MBEDTLS_SHA1_C)
  28626. { MBEDTLS_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, "TLS-ECDHE-ECDSA-WITH-RC4-128-SHA",
  28627. MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA,
  28628. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  28629. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28630. MBEDTLS_CIPHERSUITE_NODTLS },
  28631. #endif /* MBEDTLS_SHA1_C */
  28632. #endif /* MBEDTLS_ARC4_C */
  28633. #if defined(MBEDTLS_CIPHER_NULL_CIPHER)
  28634. #if defined(MBEDTLS_SHA1_C)
  28635. { MBEDTLS_TLS_ECDHE_ECDSA_WITH_NULL_SHA, "TLS-ECDHE-ECDSA-WITH-NULL-SHA",
  28636. MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA,
  28637. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  28638. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28639. MBEDTLS_CIPHERSUITE_WEAK },
  28640. #endif /* MBEDTLS_SHA1_C */
  28641. #endif /* MBEDTLS_CIPHER_NULL_CIPHER */
  28642. #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
  28643. #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
  28644. #if defined(MBEDTLS_AES_C)
  28645. #if defined(MBEDTLS_SHA1_C)
  28646. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  28647. { MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, "TLS-ECDHE-RSA-WITH-AES-128-CBC-SHA",
  28648. MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA,
  28649. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  28650. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28651. 0 },
  28652. { MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, "TLS-ECDHE-RSA-WITH-AES-256-CBC-SHA",
  28653. MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA,
  28654. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  28655. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28656. 0 },
  28657. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  28658. #endif /* MBEDTLS_SHA1_C */
  28659. #if defined(MBEDTLS_SHA256_C)
  28660. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  28661. { MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, "TLS-ECDHE-RSA-WITH-AES-128-CBC-SHA256",
  28662. MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA,
  28663. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28664. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28665. 0 },
  28666. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  28667. #if defined(MBEDTLS_GCM_C)
  28668. { MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, "TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256",
  28669. MBEDTLS_CIPHER_AES_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA,
  28670. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28671. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28672. 0 },
  28673. #endif /* MBEDTLS_GCM_C */
  28674. #endif /* MBEDTLS_SHA256_C */
  28675. #if defined(MBEDTLS_SHA512_C)
  28676. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  28677. { MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, "TLS-ECDHE-RSA-WITH-AES-256-CBC-SHA384",
  28678. MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA,
  28679. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28680. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28681. 0 },
  28682. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  28683. #if defined(MBEDTLS_GCM_C)
  28684. { MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, "TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384",
  28685. MBEDTLS_CIPHER_AES_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA,
  28686. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28687. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28688. 0 },
  28689. #endif /* MBEDTLS_GCM_C */
  28690. #endif /* MBEDTLS_SHA512_C */
  28691. #endif /* MBEDTLS_AES_C */
  28692. #if defined(MBEDTLS_CAMELLIA_C)
  28693. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  28694. #if defined(MBEDTLS_SHA256_C)
  28695. { MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256, "TLS-ECDHE-RSA-WITH-CAMELLIA-128-CBC-SHA256",
  28696. MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA,
  28697. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  28698. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28699. 0 },
  28700. #endif /* MBEDTLS_SHA256_C */
  28701. #if defined(MBEDTLS_SHA512_C)
  28702. { MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384, "TLS-ECDHE-RSA-WITH-CAMELLIA-256-CBC-SHA384",
  28703. MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA,
  28704. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  28705. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28706. 0 },
  28707. #endif /* MBEDTLS_SHA512_C */
  28708. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  28709. #if defined(MBEDTLS_GCM_C)
  28710. #if defined(MBEDTLS_SHA256_C)
  28711. { MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256, "TLS-ECDHE-RSA-WITH-CAMELLIA-128-GCM-SHA256",
  28712. MBEDTLS_CIPHER_CAMELLIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA,
  28713. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28714. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28715. 0 },
  28716. #endif /* MBEDTLS_SHA256_C */
  28717. #if defined(MBEDTLS_SHA512_C)
  28718. { MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384, "TLS-ECDHE-RSA-WITH-CAMELLIA-256-GCM-SHA384",
  28719. MBEDTLS_CIPHER_CAMELLIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA,
  28720. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28721. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28722. 0 },
  28723. #endif /* MBEDTLS_SHA512_C */
  28724. #endif /* MBEDTLS_GCM_C */
  28725. #endif /* MBEDTLS_CAMELLIA_C */
  28726. #if defined(MBEDTLS_DES_C)
  28727. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  28728. #if defined(MBEDTLS_SHA1_C)
  28729. { MBEDTLS_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, "TLS-ECDHE-RSA-WITH-3DES-EDE-CBC-SHA",
  28730. MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA,
  28731. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  28732. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28733. 0 },
  28734. #endif /* MBEDTLS_SHA1_C */
  28735. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  28736. #endif /* MBEDTLS_DES_C */
  28737. #if defined(MBEDTLS_ARC4_C)
  28738. #if defined(MBEDTLS_SHA1_C)
  28739. { MBEDTLS_TLS_ECDHE_RSA_WITH_RC4_128_SHA, "TLS-ECDHE-RSA-WITH-RC4-128-SHA",
  28740. MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA,
  28741. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  28742. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28743. MBEDTLS_CIPHERSUITE_NODTLS },
  28744. #endif /* MBEDTLS_SHA1_C */
  28745. #endif /* MBEDTLS_ARC4_C */
  28746. #if defined(MBEDTLS_CIPHER_NULL_CIPHER)
  28747. #if defined(MBEDTLS_SHA1_C)
  28748. { MBEDTLS_TLS_ECDHE_RSA_WITH_NULL_SHA, "TLS-ECDHE-RSA-WITH-NULL-SHA",
  28749. MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA,
  28750. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  28751. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28752. MBEDTLS_CIPHERSUITE_WEAK },
  28753. #endif /* MBEDTLS_SHA1_C */
  28754. #endif /* MBEDTLS_CIPHER_NULL_CIPHER */
  28755. #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
  28756. #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED)
  28757. #if defined(MBEDTLS_AES_C)
  28758. #if defined(MBEDTLS_SHA512_C) && defined(MBEDTLS_GCM_C)
  28759. { MBEDTLS_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, "TLS-DHE-RSA-WITH-AES-256-GCM-SHA384",
  28760. MBEDTLS_CIPHER_AES_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_DHE_RSA,
  28761. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28762. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28763. 0 },
  28764. #endif /* MBEDTLS_SHA512_C && MBEDTLS_GCM_C */
  28765. #if defined(MBEDTLS_SHA256_C)
  28766. #if defined(MBEDTLS_GCM_C)
  28767. { MBEDTLS_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, "TLS-DHE-RSA-WITH-AES-128-GCM-SHA256",
  28768. MBEDTLS_CIPHER_AES_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA,
  28769. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28770. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28771. 0 },
  28772. #endif /* MBEDTLS_GCM_C */
  28773. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  28774. { MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, "TLS-DHE-RSA-WITH-AES-128-CBC-SHA256",
  28775. MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA,
  28776. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28777. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28778. 0 },
  28779. { MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, "TLS-DHE-RSA-WITH-AES-256-CBC-SHA256",
  28780. MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA,
  28781. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28782. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28783. 0 },
  28784. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  28785. #endif /* MBEDTLS_SHA256_C */
  28786. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  28787. #if defined(MBEDTLS_SHA1_C)
  28788. { MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA, "TLS-DHE-RSA-WITH-AES-128-CBC-SHA",
  28789. MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_RSA,
  28790. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,
  28791. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28792. 0 },
  28793. { MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA, "TLS-DHE-RSA-WITH-AES-256-CBC-SHA",
  28794. MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_RSA,
  28795. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,
  28796. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28797. 0 },
  28798. #endif /* MBEDTLS_SHA1_C */
  28799. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  28800. #if defined(MBEDTLS_CCM_C)
  28801. { MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CCM, "TLS-DHE-RSA-WITH-AES-256-CCM",
  28802. MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA,
  28803. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28804. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28805. 0 },
  28806. { MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CCM_8, "TLS-DHE-RSA-WITH-AES-256-CCM-8",
  28807. MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA,
  28808. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28809. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28810. MBEDTLS_CIPHERSUITE_SHORT_TAG },
  28811. { MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM, "TLS-DHE-RSA-WITH-AES-128-CCM",
  28812. MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA,
  28813. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28814. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28815. 0 },
  28816. { MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM_8, "TLS-DHE-RSA-WITH-AES-128-CCM-8",
  28817. MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA,
  28818. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28819. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28820. MBEDTLS_CIPHERSUITE_SHORT_TAG },
  28821. #endif /* MBEDTLS_CCM_C */
  28822. #endif /* MBEDTLS_AES_C */
  28823. #if defined(MBEDTLS_CAMELLIA_C)
  28824. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  28825. #if defined(MBEDTLS_SHA256_C)
  28826. { MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256, "TLS-DHE-RSA-WITH-CAMELLIA-128-CBC-SHA256",
  28827. MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA,
  28828. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28829. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28830. 0 },
  28831. { MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256, "TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA256",
  28832. MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA,
  28833. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28834. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28835. 0 },
  28836. #endif /* MBEDTLS_SHA256_C */
  28837. #if defined(MBEDTLS_SHA1_C)
  28838. { MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA, "TLS-DHE-RSA-WITH-CAMELLIA-128-CBC-SHA",
  28839. MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_RSA,
  28840. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,
  28841. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28842. 0 },
  28843. { MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA, "TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA",
  28844. MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_RSA,
  28845. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,
  28846. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28847. 0 },
  28848. #endif /* MBEDTLS_SHA1_C */
  28849. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  28850. #if defined(MBEDTLS_GCM_C)
  28851. #if defined(MBEDTLS_SHA256_C)
  28852. { MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256, "TLS-DHE-RSA-WITH-CAMELLIA-128-GCM-SHA256",
  28853. MBEDTLS_CIPHER_CAMELLIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA,
  28854. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28855. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28856. 0 },
  28857. #endif /* MBEDTLS_SHA256_C */
  28858. #if defined(MBEDTLS_SHA512_C)
  28859. { MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384, "TLS-DHE-RSA-WITH-CAMELLIA-256-GCM-SHA384",
  28860. MBEDTLS_CIPHER_CAMELLIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_DHE_RSA,
  28861. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28862. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28863. 0 },
  28864. #endif /* MBEDTLS_SHA512_C */
  28865. #endif /* MBEDTLS_GCM_C */
  28866. #endif /* MBEDTLS_CAMELLIA_C */
  28867. #if defined(MBEDTLS_DES_C)
  28868. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  28869. #if defined(MBEDTLS_SHA1_C)
  28870. { MBEDTLS_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA, "TLS-DHE-RSA-WITH-3DES-EDE-CBC-SHA",
  28871. MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_RSA,
  28872. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,
  28873. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28874. 0 },
  28875. #endif /* MBEDTLS_SHA1_C */
  28876. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  28877. #endif /* MBEDTLS_DES_C */
  28878. #endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */
  28879. #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
  28880. #if defined(MBEDTLS_AES_C)
  28881. #if defined(MBEDTLS_SHA512_C) && defined(MBEDTLS_GCM_C)
  28882. { MBEDTLS_TLS_RSA_WITH_AES_256_GCM_SHA384, "TLS-RSA-WITH-AES-256-GCM-SHA384",
  28883. MBEDTLS_CIPHER_AES_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_RSA,
  28884. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28885. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28886. 0 },
  28887. #endif /* MBEDTLS_SHA512_C && MBEDTLS_GCM_C */
  28888. #if defined(MBEDTLS_SHA256_C)
  28889. #if defined(MBEDTLS_GCM_C)
  28890. { MBEDTLS_TLS_RSA_WITH_AES_128_GCM_SHA256, "TLS-RSA-WITH-AES-128-GCM-SHA256",
  28891. MBEDTLS_CIPHER_AES_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA,
  28892. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28893. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28894. 0 },
  28895. #endif /* MBEDTLS_GCM_C */
  28896. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  28897. { MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA256, "TLS-RSA-WITH-AES-128-CBC-SHA256",
  28898. MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA,
  28899. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28900. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28901. 0 },
  28902. { MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA256, "TLS-RSA-WITH-AES-256-CBC-SHA256",
  28903. MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA,
  28904. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28905. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28906. 0 },
  28907. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  28908. #endif /* MBEDTLS_SHA256_C */
  28909. #if defined(MBEDTLS_SHA1_C)
  28910. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  28911. { MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA, "TLS-RSA-WITH-AES-128-CBC-SHA",
  28912. MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA,
  28913. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,
  28914. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28915. 0 },
  28916. { MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA, "TLS-RSA-WITH-AES-256-CBC-SHA",
  28917. MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA,
  28918. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,
  28919. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28920. 0 },
  28921. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  28922. #endif /* MBEDTLS_SHA1_C */
  28923. #if defined(MBEDTLS_CCM_C)
  28924. { MBEDTLS_TLS_RSA_WITH_AES_256_CCM, "TLS-RSA-WITH-AES-256-CCM",
  28925. MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA,
  28926. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28927. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28928. 0 },
  28929. { MBEDTLS_TLS_RSA_WITH_AES_256_CCM_8, "TLS-RSA-WITH-AES-256-CCM-8",
  28930. MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA,
  28931. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28932. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28933. MBEDTLS_CIPHERSUITE_SHORT_TAG },
  28934. { MBEDTLS_TLS_RSA_WITH_AES_128_CCM, "TLS-RSA-WITH-AES-128-CCM",
  28935. MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA,
  28936. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28937. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28938. 0 },
  28939. { MBEDTLS_TLS_RSA_WITH_AES_128_CCM_8, "TLS-RSA-WITH-AES-128-CCM-8",
  28940. MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA,
  28941. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28942. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28943. MBEDTLS_CIPHERSUITE_SHORT_TAG },
  28944. #endif /* MBEDTLS_CCM_C */
  28945. #endif /* MBEDTLS_AES_C */
  28946. #if defined(MBEDTLS_CAMELLIA_C)
  28947. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  28948. #if defined(MBEDTLS_SHA256_C)
  28949. { MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256, "TLS-RSA-WITH-CAMELLIA-128-CBC-SHA256",
  28950. MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA,
  28951. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28952. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28953. 0 },
  28954. { MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256, "TLS-RSA-WITH-CAMELLIA-256-CBC-SHA256",
  28955. MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA,
  28956. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28957. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28958. 0 },
  28959. #endif /* MBEDTLS_SHA256_C */
  28960. #if defined(MBEDTLS_SHA1_C)
  28961. { MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA, "TLS-RSA-WITH-CAMELLIA-128-CBC-SHA",
  28962. MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA,
  28963. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,
  28964. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28965. 0 },
  28966. { MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA, "TLS-RSA-WITH-CAMELLIA-256-CBC-SHA",
  28967. MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA,
  28968. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,
  28969. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28970. 0 },
  28971. #endif /* MBEDTLS_SHA1_C */
  28972. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  28973. #if defined(MBEDTLS_GCM_C)
  28974. #if defined(MBEDTLS_SHA256_C)
  28975. { MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256, "TLS-RSA-WITH-CAMELLIA-128-GCM-SHA256",
  28976. MBEDTLS_CIPHER_CAMELLIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA,
  28977. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28978. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28979. 0 },
  28980. #endif /* MBEDTLS_SHA256_C */
  28981. #if defined(MBEDTLS_SHA1_C)
  28982. { MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384, "TLS-RSA-WITH-CAMELLIA-256-GCM-SHA384",
  28983. MBEDTLS_CIPHER_CAMELLIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_RSA,
  28984. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28985. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28986. 0 },
  28987. #endif /* MBEDTLS_SHA1_C */
  28988. #endif /* MBEDTLS_GCM_C */
  28989. #endif /* MBEDTLS_CAMELLIA_C */
  28990. #if defined(MBEDTLS_DES_C)
  28991. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  28992. #if defined(MBEDTLS_SHA1_C)
  28993. { MBEDTLS_TLS_RSA_WITH_3DES_EDE_CBC_SHA, "TLS-RSA-WITH-3DES-EDE-CBC-SHA",
  28994. MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA,
  28995. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,
  28996. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  28997. 0 },
  28998. #endif /* MBEDTLS_SHA1_C */
  28999. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  29000. #endif /* MBEDTLS_DES_C */
  29001. #if defined(MBEDTLS_ARC4_C)
  29002. #if defined(MBEDTLS_MD5_C)
  29003. { MBEDTLS_TLS_RSA_WITH_RC4_128_MD5, "TLS-RSA-WITH-RC4-128-MD5",
  29004. MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MD_MD5, MBEDTLS_KEY_EXCHANGE_RSA,
  29005. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,
  29006. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29007. MBEDTLS_CIPHERSUITE_NODTLS },
  29008. #endif
  29009. #if defined(MBEDTLS_SHA1_C)
  29010. { MBEDTLS_TLS_RSA_WITH_RC4_128_SHA, "TLS-RSA-WITH-RC4-128-SHA",
  29011. MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA,
  29012. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,
  29013. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29014. MBEDTLS_CIPHERSUITE_NODTLS },
  29015. #endif
  29016. #endif /* MBEDTLS_ARC4_C */
  29017. #endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
  29018. #if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED)
  29019. #if defined(MBEDTLS_AES_C)
  29020. #if defined(MBEDTLS_SHA1_C)
  29021. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  29022. { MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, "TLS-ECDH-RSA-WITH-AES-128-CBC-SHA",
  29023. MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDH_RSA,
  29024. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  29025. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29026. 0 },
  29027. { MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA, "TLS-ECDH-RSA-WITH-AES-256-CBC-SHA",
  29028. MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDH_RSA,
  29029. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  29030. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29031. 0 },
  29032. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  29033. #endif /* MBEDTLS_SHA1_C */
  29034. #if defined(MBEDTLS_SHA256_C)
  29035. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  29036. { MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256, "TLS-ECDH-RSA-WITH-AES-128-CBC-SHA256",
  29037. MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_RSA,
  29038. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29039. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29040. 0 },
  29041. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  29042. #if defined(MBEDTLS_GCM_C)
  29043. { MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256, "TLS-ECDH-RSA-WITH-AES-128-GCM-SHA256",
  29044. MBEDTLS_CIPHER_AES_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_RSA,
  29045. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29046. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29047. 0 },
  29048. #endif /* MBEDTLS_GCM_C */
  29049. #endif /* MBEDTLS_SHA256_C */
  29050. #if defined(MBEDTLS_SHA512_C)
  29051. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  29052. { MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384, "TLS-ECDH-RSA-WITH-AES-256-CBC-SHA384",
  29053. MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_RSA,
  29054. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29055. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29056. 0 },
  29057. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  29058. #if defined(MBEDTLS_GCM_C)
  29059. { MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384, "TLS-ECDH-RSA-WITH-AES-256-GCM-SHA384",
  29060. MBEDTLS_CIPHER_AES_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_RSA,
  29061. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29062. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29063. 0 },
  29064. #endif /* MBEDTLS_GCM_C */
  29065. #endif /* MBEDTLS_SHA512_C */
  29066. #endif /* MBEDTLS_AES_C */
  29067. #if defined(MBEDTLS_CAMELLIA_C)
  29068. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  29069. #if defined(MBEDTLS_SHA256_C)
  29070. { MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256, "TLS-ECDH-RSA-WITH-CAMELLIA-128-CBC-SHA256",
  29071. MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_RSA,
  29072. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  29073. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29074. 0 },
  29075. #endif /* MBEDTLS_SHA256_C */
  29076. #if defined(MBEDTLS_SHA512_C)
  29077. { MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384, "TLS-ECDH-RSA-WITH-CAMELLIA-256-CBC-SHA384",
  29078. MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_RSA,
  29079. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  29080. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29081. 0 },
  29082. #endif /* MBEDTLS_SHA512_C */
  29083. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  29084. #if defined(MBEDTLS_GCM_C)
  29085. #if defined(MBEDTLS_SHA256_C)
  29086. { MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256, "TLS-ECDH-RSA-WITH-CAMELLIA-128-GCM-SHA256",
  29087. MBEDTLS_CIPHER_CAMELLIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_RSA,
  29088. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29089. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29090. 0 },
  29091. #endif /* MBEDTLS_SHA256_C */
  29092. #if defined(MBEDTLS_SHA512_C)
  29093. { MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384, "TLS-ECDH-RSA-WITH-CAMELLIA-256-GCM-SHA384",
  29094. MBEDTLS_CIPHER_CAMELLIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_RSA,
  29095. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29096. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29097. 0 },
  29098. #endif /* MBEDTLS_SHA512_C */
  29099. #endif /* MBEDTLS_GCM_C */
  29100. #endif /* MBEDTLS_CAMELLIA_C */
  29101. #if defined(MBEDTLS_DES_C)
  29102. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  29103. #if defined(MBEDTLS_SHA1_C)
  29104. { MBEDTLS_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA, "TLS-ECDH-RSA-WITH-3DES-EDE-CBC-SHA",
  29105. MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDH_RSA,
  29106. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  29107. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29108. 0 },
  29109. #endif /* MBEDTLS_SHA1_C */
  29110. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  29111. #endif /* MBEDTLS_DES_C */
  29112. #if defined(MBEDTLS_ARC4_C)
  29113. #if defined(MBEDTLS_SHA1_C)
  29114. { MBEDTLS_TLS_ECDH_RSA_WITH_RC4_128_SHA, "TLS-ECDH-RSA-WITH-RC4-128-SHA",
  29115. MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDH_RSA,
  29116. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  29117. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29118. MBEDTLS_CIPHERSUITE_NODTLS },
  29119. #endif /* MBEDTLS_SHA1_C */
  29120. #endif /* MBEDTLS_ARC4_C */
  29121. #if defined(MBEDTLS_CIPHER_NULL_CIPHER)
  29122. #if defined(MBEDTLS_SHA1_C)
  29123. { MBEDTLS_TLS_ECDH_RSA_WITH_NULL_SHA, "TLS-ECDH-RSA-WITH-NULL-SHA",
  29124. MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDH_RSA,
  29125. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  29126. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29127. MBEDTLS_CIPHERSUITE_WEAK },
  29128. #endif /* MBEDTLS_SHA1_C */
  29129. #endif /* MBEDTLS_CIPHER_NULL_CIPHER */
  29130. #endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED */
  29131. #if defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
  29132. #if defined(MBEDTLS_AES_C)
  29133. #if defined(MBEDTLS_SHA1_C)
  29134. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  29135. { MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, "TLS-ECDH-ECDSA-WITH-AES-128-CBC-SHA",
  29136. MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA,
  29137. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  29138. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29139. 0 },
  29140. { MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA, "TLS-ECDH-ECDSA-WITH-AES-256-CBC-SHA",
  29141. MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA,
  29142. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  29143. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29144. 0 },
  29145. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  29146. #endif /* MBEDTLS_SHA1_C */
  29147. #if defined(MBEDTLS_SHA256_C)
  29148. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  29149. { MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256, "TLS-ECDH-ECDSA-WITH-AES-128-CBC-SHA256",
  29150. MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA,
  29151. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29152. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29153. 0 },
  29154. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  29155. #if defined(MBEDTLS_GCM_C)
  29156. { MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256, "TLS-ECDH-ECDSA-WITH-AES-128-GCM-SHA256",
  29157. MBEDTLS_CIPHER_AES_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA,
  29158. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29159. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29160. 0 },
  29161. #endif /* MBEDTLS_GCM_C */
  29162. #endif /* MBEDTLS_SHA256_C */
  29163. #if defined(MBEDTLS_SHA512_C)
  29164. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  29165. { MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384, "TLS-ECDH-ECDSA-WITH-AES-256-CBC-SHA384",
  29166. MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA,
  29167. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29168. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29169. 0 },
  29170. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  29171. #if defined(MBEDTLS_GCM_C)
  29172. { MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384, "TLS-ECDH-ECDSA-WITH-AES-256-GCM-SHA384",
  29173. MBEDTLS_CIPHER_AES_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA,
  29174. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29175. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29176. 0 },
  29177. #endif /* MBEDTLS_GCM_C */
  29178. #endif /* MBEDTLS_SHA512_C */
  29179. #endif /* MBEDTLS_AES_C */
  29180. #if defined(MBEDTLS_CAMELLIA_C)
  29181. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  29182. #if defined(MBEDTLS_SHA256_C)
  29183. { MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256, "TLS-ECDH-ECDSA-WITH-CAMELLIA-128-CBC-SHA256",
  29184. MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA,
  29185. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  29186. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29187. 0 },
  29188. #endif /* MBEDTLS_SHA256_C */
  29189. #if defined(MBEDTLS_SHA512_C)
  29190. { MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384, "TLS-ECDH-ECDSA-WITH-CAMELLIA-256-CBC-SHA384",
  29191. MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA,
  29192. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  29193. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29194. 0 },
  29195. #endif /* MBEDTLS_SHA512_C */
  29196. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  29197. #if defined(MBEDTLS_GCM_C)
  29198. #if defined(MBEDTLS_SHA256_C)
  29199. { MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256, "TLS-ECDH-ECDSA-WITH-CAMELLIA-128-GCM-SHA256",
  29200. MBEDTLS_CIPHER_CAMELLIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA,
  29201. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29202. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29203. 0 },
  29204. #endif /* MBEDTLS_SHA256_C */
  29205. #if defined(MBEDTLS_SHA512_C)
  29206. { MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384, "TLS-ECDH-ECDSA-WITH-CAMELLIA-256-GCM-SHA384",
  29207. MBEDTLS_CIPHER_CAMELLIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA,
  29208. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29209. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29210. 0 },
  29211. #endif /* MBEDTLS_SHA512_C */
  29212. #endif /* MBEDTLS_GCM_C */
  29213. #endif /* MBEDTLS_CAMELLIA_C */
  29214. #if defined(MBEDTLS_DES_C)
  29215. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  29216. #if defined(MBEDTLS_SHA1_C)
  29217. { MBEDTLS_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA, "TLS-ECDH-ECDSA-WITH-3DES-EDE-CBC-SHA",
  29218. MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA,
  29219. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  29220. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29221. 0 },
  29222. #endif /* MBEDTLS_SHA1_C */
  29223. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  29224. #endif /* MBEDTLS_DES_C */
  29225. #if defined(MBEDTLS_ARC4_C)
  29226. #if defined(MBEDTLS_SHA1_C)
  29227. { MBEDTLS_TLS_ECDH_ECDSA_WITH_RC4_128_SHA, "TLS-ECDH-ECDSA-WITH-RC4-128-SHA",
  29228. MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA,
  29229. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  29230. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29231. MBEDTLS_CIPHERSUITE_NODTLS },
  29232. #endif /* MBEDTLS_SHA1_C */
  29233. #endif /* MBEDTLS_ARC4_C */
  29234. #if defined(MBEDTLS_CIPHER_NULL_CIPHER)
  29235. #if defined(MBEDTLS_SHA1_C)
  29236. { MBEDTLS_TLS_ECDH_ECDSA_WITH_NULL_SHA, "TLS-ECDH-ECDSA-WITH-NULL-SHA",
  29237. MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA,
  29238. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  29239. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29240. MBEDTLS_CIPHERSUITE_WEAK },
  29241. #endif /* MBEDTLS_SHA1_C */
  29242. #endif /* MBEDTLS_CIPHER_NULL_CIPHER */
  29243. #endif /* MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
  29244. #if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
  29245. #if defined(MBEDTLS_AES_C)
  29246. #if defined(MBEDTLS_GCM_C)
  29247. #if defined(MBEDTLS_SHA256_C)
  29248. { MBEDTLS_TLS_PSK_WITH_AES_128_GCM_SHA256, "TLS-PSK-WITH-AES-128-GCM-SHA256",
  29249. MBEDTLS_CIPHER_AES_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK,
  29250. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29251. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29252. 0 },
  29253. #endif /* MBEDTLS_SHA256_C */
  29254. #if defined(MBEDTLS_SHA512_C)
  29255. { MBEDTLS_TLS_PSK_WITH_AES_256_GCM_SHA384, "TLS-PSK-WITH-AES-256-GCM-SHA384",
  29256. MBEDTLS_CIPHER_AES_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_PSK,
  29257. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29258. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29259. 0 },
  29260. #endif /* MBEDTLS_SHA512_C */
  29261. #endif /* MBEDTLS_GCM_C */
  29262. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  29263. #if defined(MBEDTLS_SHA256_C)
  29264. { MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA256, "TLS-PSK-WITH-AES-128-CBC-SHA256",
  29265. MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK,
  29266. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  29267. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29268. 0 },
  29269. #endif /* MBEDTLS_SHA256_C */
  29270. #if defined(MBEDTLS_SHA512_C)
  29271. { MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA384, "TLS-PSK-WITH-AES-256-CBC-SHA384",
  29272. MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_PSK,
  29273. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  29274. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29275. 0 },
  29276. #endif /* MBEDTLS_SHA512_C */
  29277. #if defined(MBEDTLS_SHA1_C)
  29278. { MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA, "TLS-PSK-WITH-AES-128-CBC-SHA",
  29279. MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_PSK,
  29280. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,
  29281. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29282. 0 },
  29283. { MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA, "TLS-PSK-WITH-AES-256-CBC-SHA",
  29284. MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_PSK,
  29285. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,
  29286. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29287. 0 },
  29288. #endif /* MBEDTLS_SHA1_C */
  29289. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  29290. #if defined(MBEDTLS_CCM_C)
  29291. { MBEDTLS_TLS_PSK_WITH_AES_256_CCM, "TLS-PSK-WITH-AES-256-CCM",
  29292. MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK,
  29293. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29294. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29295. 0 },
  29296. { MBEDTLS_TLS_PSK_WITH_AES_256_CCM_8, "TLS-PSK-WITH-AES-256-CCM-8",
  29297. MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK,
  29298. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29299. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29300. MBEDTLS_CIPHERSUITE_SHORT_TAG },
  29301. { MBEDTLS_TLS_PSK_WITH_AES_128_CCM, "TLS-PSK-WITH-AES-128-CCM",
  29302. MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK,
  29303. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29304. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29305. 0 },
  29306. { MBEDTLS_TLS_PSK_WITH_AES_128_CCM_8, "TLS-PSK-WITH-AES-128-CCM-8",
  29307. MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK,
  29308. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29309. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29310. MBEDTLS_CIPHERSUITE_SHORT_TAG },
  29311. #endif /* MBEDTLS_CCM_C */
  29312. #endif /* MBEDTLS_AES_C */
  29313. #if defined(MBEDTLS_CAMELLIA_C)
  29314. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  29315. #if defined(MBEDTLS_SHA256_C)
  29316. { MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256, "TLS-PSK-WITH-CAMELLIA-128-CBC-SHA256",
  29317. MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK,
  29318. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  29319. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29320. 0 },
  29321. #endif /* MBEDTLS_SHA256_C */
  29322. #if defined(MBEDTLS_SHA512_C)
  29323. { MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384, "TLS-PSK-WITH-CAMELLIA-256-CBC-SHA384",
  29324. MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_PSK,
  29325. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  29326. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29327. 0 },
  29328. #endif /* MBEDTLS_SHA512_C */
  29329. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  29330. #if defined(MBEDTLS_GCM_C)
  29331. #if defined(MBEDTLS_SHA256_C)
  29332. { MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256, "TLS-PSK-WITH-CAMELLIA-128-GCM-SHA256",
  29333. MBEDTLS_CIPHER_CAMELLIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK,
  29334. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29335. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29336. 0 },
  29337. #endif /* MBEDTLS_SHA256_C */
  29338. #if defined(MBEDTLS_SHA512_C)
  29339. { MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384, "TLS-PSK-WITH-CAMELLIA-256-GCM-SHA384",
  29340. MBEDTLS_CIPHER_CAMELLIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_PSK,
  29341. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29342. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29343. 0 },
  29344. #endif /* MBEDTLS_SHA512_C */
  29345. #endif /* MBEDTLS_GCM_C */
  29346. #endif /* MBEDTLS_CAMELLIA_C */
  29347. #if defined(MBEDTLS_DES_C)
  29348. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  29349. #if defined(MBEDTLS_SHA1_C)
  29350. { MBEDTLS_TLS_PSK_WITH_3DES_EDE_CBC_SHA, "TLS-PSK-WITH-3DES-EDE-CBC-SHA",
  29351. MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_PSK,
  29352. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,
  29353. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29354. 0 },
  29355. #endif /* MBEDTLS_SHA1_C */
  29356. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  29357. #endif /* MBEDTLS_DES_C */
  29358. #if defined(MBEDTLS_ARC4_C)
  29359. #if defined(MBEDTLS_SHA1_C)
  29360. { MBEDTLS_TLS_PSK_WITH_RC4_128_SHA, "TLS-PSK-WITH-RC4-128-SHA",
  29361. MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_PSK,
  29362. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,
  29363. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29364. MBEDTLS_CIPHERSUITE_NODTLS },
  29365. #endif /* MBEDTLS_SHA1_C */
  29366. #endif /* MBEDTLS_ARC4_C */
  29367. #endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */
  29368. #if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
  29369. #if defined(MBEDTLS_AES_C)
  29370. #if defined(MBEDTLS_GCM_C)
  29371. #if defined(MBEDTLS_SHA256_C)
  29372. { MBEDTLS_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256, "TLS-DHE-PSK-WITH-AES-128-GCM-SHA256",
  29373. MBEDTLS_CIPHER_AES_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK,
  29374. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29375. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29376. 0 },
  29377. #endif /* MBEDTLS_SHA256_C */
  29378. #if defined(MBEDTLS_SHA512_C)
  29379. { MBEDTLS_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384, "TLS-DHE-PSK-WITH-AES-256-GCM-SHA384",
  29380. MBEDTLS_CIPHER_AES_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_DHE_PSK,
  29381. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29382. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29383. 0 },
  29384. #endif /* MBEDTLS_SHA512_C */
  29385. #endif /* MBEDTLS_GCM_C */
  29386. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  29387. #if defined(MBEDTLS_SHA256_C)
  29388. { MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256, "TLS-DHE-PSK-WITH-AES-128-CBC-SHA256",
  29389. MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK,
  29390. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  29391. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29392. 0 },
  29393. #endif /* MBEDTLS_SHA256_C */
  29394. #if defined(MBEDTLS_SHA512_C)
  29395. { MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384, "TLS-DHE-PSK-WITH-AES-256-CBC-SHA384",
  29396. MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_DHE_PSK,
  29397. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  29398. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29399. 0 },
  29400. #endif /* MBEDTLS_SHA512_C */
  29401. #if defined(MBEDTLS_SHA1_C)
  29402. { MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA, "TLS-DHE-PSK-WITH-AES-128-CBC-SHA",
  29403. MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_PSK,
  29404. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,
  29405. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29406. 0 },
  29407. { MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA, "TLS-DHE-PSK-WITH-AES-256-CBC-SHA",
  29408. MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_PSK,
  29409. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,
  29410. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29411. 0 },
  29412. #endif /* MBEDTLS_SHA1_C */
  29413. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  29414. #if defined(MBEDTLS_CCM_C)
  29415. { MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CCM, "TLS-DHE-PSK-WITH-AES-256-CCM",
  29416. MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK,
  29417. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29418. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29419. 0 },
  29420. { MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CCM_8, "TLS-DHE-PSK-WITH-AES-256-CCM-8",
  29421. MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK,
  29422. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29423. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29424. MBEDTLS_CIPHERSUITE_SHORT_TAG },
  29425. { MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CCM, "TLS-DHE-PSK-WITH-AES-128-CCM",
  29426. MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK,
  29427. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29428. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29429. 0 },
  29430. { MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CCM_8, "TLS-DHE-PSK-WITH-AES-128-CCM-8",
  29431. MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK,
  29432. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29433. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29434. MBEDTLS_CIPHERSUITE_SHORT_TAG },
  29435. #endif /* MBEDTLS_CCM_C */
  29436. #endif /* MBEDTLS_AES_C */
  29437. #if defined(MBEDTLS_CAMELLIA_C)
  29438. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  29439. #if defined(MBEDTLS_SHA256_C)
  29440. { MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256, "TLS-DHE-PSK-WITH-CAMELLIA-128-CBC-SHA256",
  29441. MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK,
  29442. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  29443. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29444. 0 },
  29445. #endif /* MBEDTLS_SHA256_C */
  29446. #if defined(MBEDTLS_SHA512_C)
  29447. { MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384, "TLS-DHE-PSK-WITH-CAMELLIA-256-CBC-SHA384",
  29448. MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_DHE_PSK,
  29449. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  29450. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29451. 0 },
  29452. #endif /* MBEDTLS_SHA512_C */
  29453. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  29454. #if defined(MBEDTLS_GCM_C)
  29455. #if defined(MBEDTLS_SHA256_C)
  29456. { MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256, "TLS-DHE-PSK-WITH-CAMELLIA-128-GCM-SHA256",
  29457. MBEDTLS_CIPHER_CAMELLIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK,
  29458. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29459. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29460. 0 },
  29461. #endif /* MBEDTLS_SHA256_C */
  29462. #if defined(MBEDTLS_SHA512_C)
  29463. { MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384, "TLS-DHE-PSK-WITH-CAMELLIA-256-GCM-SHA384",
  29464. MBEDTLS_CIPHER_CAMELLIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_DHE_PSK,
  29465. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29466. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29467. 0 },
  29468. #endif /* MBEDTLS_SHA512_C */
  29469. #endif /* MBEDTLS_GCM_C */
  29470. #endif /* MBEDTLS_CAMELLIA_C */
  29471. #if defined(MBEDTLS_DES_C)
  29472. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  29473. #if defined(MBEDTLS_SHA1_C)
  29474. { MBEDTLS_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA, "TLS-DHE-PSK-WITH-3DES-EDE-CBC-SHA",
  29475. MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_PSK,
  29476. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,
  29477. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29478. 0 },
  29479. #endif /* MBEDTLS_SHA1_C */
  29480. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  29481. #endif /* MBEDTLS_DES_C */
  29482. #if defined(MBEDTLS_ARC4_C)
  29483. #if defined(MBEDTLS_SHA1_C)
  29484. { MBEDTLS_TLS_DHE_PSK_WITH_RC4_128_SHA, "TLS-DHE-PSK-WITH-RC4-128-SHA",
  29485. MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_PSK,
  29486. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,
  29487. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29488. MBEDTLS_CIPHERSUITE_NODTLS },
  29489. #endif /* MBEDTLS_SHA1_C */
  29490. #endif /* MBEDTLS_ARC4_C */
  29491. #endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
  29492. #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
  29493. #if defined(MBEDTLS_AES_C)
  29494. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  29495. #if defined(MBEDTLS_SHA256_C)
  29496. { MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256, "TLS-ECDHE-PSK-WITH-AES-128-CBC-SHA256",
  29497. MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK,
  29498. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  29499. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29500. 0 },
  29501. #endif /* MBEDTLS_SHA256_C */
  29502. #if defined(MBEDTLS_SHA512_C)
  29503. { MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384, "TLS-ECDHE-PSK-WITH-AES-256-CBC-SHA384",
  29504. MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK,
  29505. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  29506. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29507. 0 },
  29508. #endif /* MBEDTLS_SHA512_C */
  29509. #if defined(MBEDTLS_SHA1_C)
  29510. { MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA, "TLS-ECDHE-PSK-WITH-AES-128-CBC-SHA",
  29511. MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK,
  29512. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  29513. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29514. 0 },
  29515. { MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA, "TLS-ECDHE-PSK-WITH-AES-256-CBC-SHA",
  29516. MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK,
  29517. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  29518. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29519. 0 },
  29520. #endif /* MBEDTLS_SHA1_C */
  29521. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  29522. #endif /* MBEDTLS_AES_C */
  29523. #if defined(MBEDTLS_CAMELLIA_C)
  29524. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  29525. #if defined(MBEDTLS_SHA256_C)
  29526. { MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256, "TLS-ECDHE-PSK-WITH-CAMELLIA-128-CBC-SHA256",
  29527. MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK,
  29528. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  29529. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29530. 0 },
  29531. #endif /* MBEDTLS_SHA256_C */
  29532. #if defined(MBEDTLS_SHA512_C)
  29533. { MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384, "TLS-ECDHE-PSK-WITH-CAMELLIA-256-CBC-SHA384",
  29534. MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK,
  29535. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  29536. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29537. 0 },
  29538. #endif /* MBEDTLS_SHA512_C */
  29539. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  29540. #endif /* MBEDTLS_CAMELLIA_C */
  29541. #if defined(MBEDTLS_DES_C)
  29542. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  29543. #if defined(MBEDTLS_SHA1_C)
  29544. { MBEDTLS_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA, "TLS-ECDHE-PSK-WITH-3DES-EDE-CBC-SHA",
  29545. MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK,
  29546. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  29547. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29548. 0 },
  29549. #endif /* MBEDTLS_SHA1_C */
  29550. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  29551. #endif /* MBEDTLS_DES_C */
  29552. #if defined(MBEDTLS_ARC4_C)
  29553. #if defined(MBEDTLS_SHA1_C)
  29554. { MBEDTLS_TLS_ECDHE_PSK_WITH_RC4_128_SHA, "TLS-ECDHE-PSK-WITH-RC4-128-SHA",
  29555. MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK,
  29556. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  29557. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29558. MBEDTLS_CIPHERSUITE_NODTLS },
  29559. #endif /* MBEDTLS_SHA1_C */
  29560. #endif /* MBEDTLS_ARC4_C */
  29561. #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
  29562. #if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
  29563. #if defined(MBEDTLS_AES_C)
  29564. #if defined(MBEDTLS_GCM_C)
  29565. #if defined(MBEDTLS_SHA256_C)
  29566. { MBEDTLS_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256, "TLS-RSA-PSK-WITH-AES-128-GCM-SHA256",
  29567. MBEDTLS_CIPHER_AES_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA_PSK,
  29568. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29569. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29570. 0 },
  29571. #endif /* MBEDTLS_SHA256_C */
  29572. #if defined(MBEDTLS_SHA512_C)
  29573. { MBEDTLS_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384, "TLS-RSA-PSK-WITH-AES-256-GCM-SHA384",
  29574. MBEDTLS_CIPHER_AES_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_RSA_PSK,
  29575. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29576. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29577. 0 },
  29578. #endif /* MBEDTLS_SHA512_C */
  29579. #endif /* MBEDTLS_GCM_C */
  29580. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  29581. #if defined(MBEDTLS_SHA256_C)
  29582. { MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256, "TLS-RSA-PSK-WITH-AES-128-CBC-SHA256",
  29583. MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA_PSK,
  29584. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  29585. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29586. 0 },
  29587. #endif /* MBEDTLS_SHA256_C */
  29588. #if defined(MBEDTLS_SHA512_C)
  29589. { MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384, "TLS-RSA-PSK-WITH-AES-256-CBC-SHA384",
  29590. MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_RSA_PSK,
  29591. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  29592. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29593. 0 },
  29594. #endif /* MBEDTLS_SHA512_C */
  29595. #if defined(MBEDTLS_SHA1_C)
  29596. { MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA, "TLS-RSA-PSK-WITH-AES-128-CBC-SHA",
  29597. MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA_PSK,
  29598. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  29599. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29600. 0 },
  29601. { MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA, "TLS-RSA-PSK-WITH-AES-256-CBC-SHA",
  29602. MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA_PSK,
  29603. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  29604. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29605. 0 },
  29606. #endif /* MBEDTLS_SHA1_C */
  29607. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  29608. #endif /* MBEDTLS_AES_C */
  29609. #if defined(MBEDTLS_CAMELLIA_C)
  29610. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  29611. #if defined(MBEDTLS_SHA256_C)
  29612. { MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256, "TLS-RSA-PSK-WITH-CAMELLIA-128-CBC-SHA256",
  29613. MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA_PSK,
  29614. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  29615. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29616. 0 },
  29617. #endif /* MBEDTLS_SHA256_C */
  29618. #if defined(MBEDTLS_SHA512_C)
  29619. { MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384, "TLS-RSA-PSK-WITH-CAMELLIA-256-CBC-SHA384",
  29620. MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_RSA_PSK,
  29621. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  29622. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29623. 0 },
  29624. #endif /* MBEDTLS_SHA512_C */
  29625. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  29626. #if defined(MBEDTLS_GCM_C)
  29627. #if defined(MBEDTLS_SHA256_C)
  29628. { MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256, "TLS-RSA-PSK-WITH-CAMELLIA-128-GCM-SHA256",
  29629. MBEDTLS_CIPHER_CAMELLIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA_PSK,
  29630. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29631. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29632. 0 },
  29633. #endif /* MBEDTLS_SHA256_C */
  29634. #if defined(MBEDTLS_SHA512_C)
  29635. { MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384, "TLS-RSA-PSK-WITH-CAMELLIA-256-GCM-SHA384",
  29636. MBEDTLS_CIPHER_CAMELLIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_RSA_PSK,
  29637. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29638. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29639. 0 },
  29640. #endif /* MBEDTLS_SHA512_C */
  29641. #endif /* MBEDTLS_GCM_C */
  29642. #endif /* MBEDTLS_CAMELLIA_C */
  29643. #if defined(MBEDTLS_DES_C)
  29644. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  29645. #if defined(MBEDTLS_SHA1_C)
  29646. { MBEDTLS_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA, "TLS-RSA-PSK-WITH-3DES-EDE-CBC-SHA",
  29647. MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA_PSK,
  29648. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  29649. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29650. 0 },
  29651. #endif /* MBEDTLS_SHA1_C */
  29652. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  29653. #endif /* MBEDTLS_DES_C */
  29654. #if defined(MBEDTLS_ARC4_C)
  29655. #if defined(MBEDTLS_SHA1_C)
  29656. { MBEDTLS_TLS_RSA_PSK_WITH_RC4_128_SHA, "TLS-RSA-PSK-WITH-RC4-128-SHA",
  29657. MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA_PSK,
  29658. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  29659. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29660. MBEDTLS_CIPHERSUITE_NODTLS },
  29661. #endif /* MBEDTLS_SHA1_C */
  29662. #endif /* MBEDTLS_ARC4_C */
  29663. #endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
  29664. #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
  29665. #if defined(MBEDTLS_AES_C)
  29666. #if defined(MBEDTLS_CCM_C)
  29667. { MBEDTLS_TLS_ECJPAKE_WITH_AES_128_CCM_8, "TLS-ECJPAKE-WITH-AES-128-CCM-8",
  29668. MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECJPAKE,
  29669. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29670. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29671. MBEDTLS_CIPHERSUITE_SHORT_TAG },
  29672. #endif /* MBEDTLS_CCM_C */
  29673. #endif /* MBEDTLS_AES_C */
  29674. #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
  29675. #if defined(MBEDTLS_ENABLE_WEAK_CIPHERSUITES)
  29676. #if defined(MBEDTLS_CIPHER_NULL_CIPHER)
  29677. #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
  29678. #if defined(MBEDTLS_MD5_C)
  29679. { MBEDTLS_TLS_RSA_WITH_NULL_MD5, "TLS-RSA-WITH-NULL-MD5",
  29680. MBEDTLS_CIPHER_NULL, MBEDTLS_MD_MD5, MBEDTLS_KEY_EXCHANGE_RSA,
  29681. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,
  29682. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29683. MBEDTLS_CIPHERSUITE_WEAK },
  29684. #endif
  29685. #if defined(MBEDTLS_SHA1_C)
  29686. { MBEDTLS_TLS_RSA_WITH_NULL_SHA, "TLS-RSA-WITH-NULL-SHA",
  29687. MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA,
  29688. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,
  29689. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29690. MBEDTLS_CIPHERSUITE_WEAK },
  29691. #endif
  29692. #if defined(MBEDTLS_SHA256_C)
  29693. { MBEDTLS_TLS_RSA_WITH_NULL_SHA256, "TLS-RSA-WITH-NULL-SHA256",
  29694. MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA,
  29695. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  29696. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29697. MBEDTLS_CIPHERSUITE_WEAK },
  29698. #endif
  29699. #endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
  29700. #if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
  29701. #if defined(MBEDTLS_SHA1_C)
  29702. { MBEDTLS_TLS_PSK_WITH_NULL_SHA, "TLS-PSK-WITH-NULL-SHA",
  29703. MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_PSK,
  29704. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,
  29705. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29706. MBEDTLS_CIPHERSUITE_WEAK },
  29707. #endif /* MBEDTLS_SHA1_C */
  29708. #if defined(MBEDTLS_SHA256_C)
  29709. { MBEDTLS_TLS_PSK_WITH_NULL_SHA256, "TLS-PSK-WITH-NULL-SHA256",
  29710. MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK,
  29711. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  29712. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29713. MBEDTLS_CIPHERSUITE_WEAK },
  29714. #endif
  29715. #if defined(MBEDTLS_SHA512_C)
  29716. { MBEDTLS_TLS_PSK_WITH_NULL_SHA384, "TLS-PSK-WITH-NULL-SHA384",
  29717. MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_PSK,
  29718. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  29719. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29720. MBEDTLS_CIPHERSUITE_WEAK },
  29721. #endif
  29722. #endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */
  29723. #if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
  29724. #if defined(MBEDTLS_SHA1_C)
  29725. { MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA, "TLS-DHE-PSK-WITH-NULL-SHA",
  29726. MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_PSK,
  29727. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,
  29728. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29729. MBEDTLS_CIPHERSUITE_WEAK },
  29730. #endif /* MBEDTLS_SHA1_C */
  29731. #if defined(MBEDTLS_SHA256_C)
  29732. { MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA256, "TLS-DHE-PSK-WITH-NULL-SHA256",
  29733. MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK,
  29734. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  29735. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29736. MBEDTLS_CIPHERSUITE_WEAK },
  29737. #endif
  29738. #if defined(MBEDTLS_SHA512_C)
  29739. { MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA384, "TLS-DHE-PSK-WITH-NULL-SHA384",
  29740. MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_DHE_PSK,
  29741. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  29742. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29743. MBEDTLS_CIPHERSUITE_WEAK },
  29744. #endif
  29745. #endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
  29746. #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
  29747. #if defined(MBEDTLS_SHA1_C)
  29748. { MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA, "TLS-ECDHE-PSK-WITH-NULL-SHA",
  29749. MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK,
  29750. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  29751. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29752. MBEDTLS_CIPHERSUITE_WEAK },
  29753. #endif /* MBEDTLS_SHA1_C */
  29754. #if defined(MBEDTLS_SHA256_C)
  29755. { MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA256, "TLS-ECDHE-PSK-WITH-NULL-SHA256",
  29756. MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK,
  29757. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  29758. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29759. MBEDTLS_CIPHERSUITE_WEAK },
  29760. #endif
  29761. #if defined(MBEDTLS_SHA512_C)
  29762. { MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA384, "TLS-ECDHE-PSK-WITH-NULL-SHA384",
  29763. MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK,
  29764. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  29765. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29766. MBEDTLS_CIPHERSUITE_WEAK },
  29767. #endif
  29768. #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
  29769. #if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
  29770. #if defined(MBEDTLS_SHA1_C)
  29771. { MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA, "TLS-RSA-PSK-WITH-NULL-SHA",
  29772. MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA_PSK,
  29773. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  29774. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29775. MBEDTLS_CIPHERSUITE_WEAK },
  29776. #endif /* MBEDTLS_SHA1_C */
  29777. #if defined(MBEDTLS_SHA256_C)
  29778. { MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA256, "TLS-RSA-PSK-WITH-NULL-SHA256",
  29779. MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA_PSK,
  29780. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  29781. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29782. MBEDTLS_CIPHERSUITE_WEAK },
  29783. #endif
  29784. #if defined(MBEDTLS_SHA512_C)
  29785. { MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA384, "TLS-RSA-PSK-WITH-NULL-SHA384",
  29786. MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_RSA_PSK,
  29787. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,
  29788. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29789. MBEDTLS_CIPHERSUITE_WEAK },
  29790. #endif
  29791. #endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
  29792. #endif /* MBEDTLS_CIPHER_NULL_CIPHER */
  29793. #if defined(MBEDTLS_DES_C)
  29794. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  29795. #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED)
  29796. #if defined(MBEDTLS_SHA1_C)
  29797. { MBEDTLS_TLS_DHE_RSA_WITH_DES_CBC_SHA, "TLS-DHE-RSA-WITH-DES-CBC-SHA",
  29798. MBEDTLS_CIPHER_DES_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_RSA,
  29799. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,
  29800. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29801. MBEDTLS_CIPHERSUITE_WEAK },
  29802. #endif /* MBEDTLS_SHA1_C */
  29803. #endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */
  29804. #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
  29805. #if defined(MBEDTLS_SHA1_C)
  29806. { MBEDTLS_TLS_RSA_WITH_DES_CBC_SHA, "TLS-RSA-WITH-DES-CBC-SHA",
  29807. MBEDTLS_CIPHER_DES_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA,
  29808. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,
  29809. MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,
  29810. MBEDTLS_CIPHERSUITE_WEAK },
  29811. #endif /* MBEDTLS_SHA1_C */
  29812. #endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
  29813. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  29814. #endif /* MBEDTLS_DES_C */
  29815. #endif /* MBEDTLS_ENABLE_WEAK_CIPHERSUITES */
  29816. { 0, "",
  29817. MBEDTLS_CIPHER_NONE, MBEDTLS_MD_NONE, MBEDTLS_KEY_EXCHANGE_NONE,
  29818. 0, 0, 0, 0, 0 }
  29819. };
  29820. #if defined(MBEDTLS_SSL_CIPHERSUITES)
  29821. const int *mbedtls_ssl_list_ciphersuites( void )
  29822. {
  29823. return( ciphersuite_preference );
  29824. }
  29825. #else
  29826. #define MAX_CIPHERSUITES sizeof( ciphersuite_definitions ) / \
  29827. sizeof( ciphersuite_definitions[0] )
  29828. static int supported_ciphersuites[MAX_CIPHERSUITES];
  29829. /* Amalgamated Release Mappings */
  29830. #define supported_init suites_supported_init
  29831. static int supported_init = 0;
  29832. const int *mbedtls_ssl_list_ciphersuites( void )
  29833. {
  29834. /*
  29835. * On initial call filter out all ciphersuites not supported by current
  29836. * build based on presence in the ciphersuite_definitions.
  29837. */
  29838. if( supported_init == 0 )
  29839. {
  29840. const int *p;
  29841. int *q;
  29842. for( p = ciphersuite_preference, q = supported_ciphersuites;
  29843. *p != 0 && q < supported_ciphersuites + MAX_CIPHERSUITES - 1;
  29844. p++ )
  29845. {
  29846. #if defined(MBEDTLS_REMOVE_ARC4_CIPHERSUITES)
  29847. const mbedtls_ssl_ciphersuite_t *cs_info;
  29848. if( ( cs_info = mbedtls_ssl_ciphersuite_from_id( *p ) ) != NULL &&
  29849. cs_info->cipher != MBEDTLS_CIPHER_ARC4_128 )
  29850. #else
  29851. if( mbedtls_ssl_ciphersuite_from_id( *p ) != NULL )
  29852. #endif
  29853. *(q++) = *p;
  29854. }
  29855. *q = 0;
  29856. supported_init = 1;
  29857. }
  29858. return( supported_ciphersuites );
  29859. }
  29860. #endif /* MBEDTLS_SSL_CIPHERSUITES */
  29861. const mbedtls_ssl_ciphersuite_t *mbedtls_ssl_ciphersuite_from_string(
  29862. const char *ciphersuite_name )
  29863. {
  29864. const mbedtls_ssl_ciphersuite_t *cur = ciphersuite_definitions;
  29865. if( NULL == ciphersuite_name )
  29866. return( NULL );
  29867. while( cur->id != 0 )
  29868. {
  29869. if( 0 == strcmp( cur->name, ciphersuite_name ) )
  29870. return( cur );
  29871. cur++;
  29872. }
  29873. return( NULL );
  29874. }
  29875. const mbedtls_ssl_ciphersuite_t *mbedtls_ssl_ciphersuite_from_id( int ciphersuite )
  29876. {
  29877. const mbedtls_ssl_ciphersuite_t *cur = ciphersuite_definitions;
  29878. while( cur->id != 0 )
  29879. {
  29880. if( cur->id == ciphersuite )
  29881. return( cur );
  29882. cur++;
  29883. }
  29884. return( NULL );
  29885. }
  29886. const char *mbedtls_ssl_get_ciphersuite_name( const int ciphersuite_id )
  29887. {
  29888. const mbedtls_ssl_ciphersuite_t *cur;
  29889. cur = mbedtls_ssl_ciphersuite_from_id( ciphersuite_id );
  29890. if( cur == NULL )
  29891. return( "unknown" );
  29892. return( cur->name );
  29893. }
  29894. int mbedtls_ssl_get_ciphersuite_id( const char *ciphersuite_name )
  29895. {
  29896. const mbedtls_ssl_ciphersuite_t *cur;
  29897. cur = mbedtls_ssl_ciphersuite_from_string( ciphersuite_name );
  29898. if( cur == NULL )
  29899. return( 0 );
  29900. return( cur->id );
  29901. }
  29902. #if defined(MBEDTLS_PK_C)
  29903. mbedtls_pk_type_t mbedtls_ssl_get_ciphersuite_sig_pk_alg( const mbedtls_ssl_ciphersuite_t *info )
  29904. {
  29905. switch( info->key_exchange )
  29906. {
  29907. case MBEDTLS_KEY_EXCHANGE_RSA:
  29908. case MBEDTLS_KEY_EXCHANGE_DHE_RSA:
  29909. case MBEDTLS_KEY_EXCHANGE_ECDHE_RSA:
  29910. case MBEDTLS_KEY_EXCHANGE_RSA_PSK:
  29911. return( MBEDTLS_PK_RSA );
  29912. case MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA:
  29913. return( MBEDTLS_PK_ECDSA );
  29914. case MBEDTLS_KEY_EXCHANGE_ECDH_RSA:
  29915. case MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA:
  29916. return( MBEDTLS_PK_ECKEY );
  29917. default:
  29918. return( MBEDTLS_PK_NONE );
  29919. }
  29920. }
  29921. #endif /* MBEDTLS_PK_C */
  29922. #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C)
  29923. int mbedtls_ssl_ciphersuite_uses_ec( const mbedtls_ssl_ciphersuite_t *info )
  29924. {
  29925. switch( info->key_exchange )
  29926. {
  29927. case MBEDTLS_KEY_EXCHANGE_ECDHE_RSA:
  29928. case MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA:
  29929. case MBEDTLS_KEY_EXCHANGE_ECDHE_PSK:
  29930. case MBEDTLS_KEY_EXCHANGE_ECDH_RSA:
  29931. case MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA:
  29932. return( 1 );
  29933. default:
  29934. return( 0 );
  29935. }
  29936. }
  29937. #endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C */
  29938. #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
  29939. int mbedtls_ssl_ciphersuite_uses_psk( const mbedtls_ssl_ciphersuite_t *info )
  29940. {
  29941. switch( info->key_exchange )
  29942. {
  29943. case MBEDTLS_KEY_EXCHANGE_PSK:
  29944. case MBEDTLS_KEY_EXCHANGE_RSA_PSK:
  29945. case MBEDTLS_KEY_EXCHANGE_DHE_PSK:
  29946. case MBEDTLS_KEY_EXCHANGE_ECDHE_PSK:
  29947. return( 1 );
  29948. default:
  29949. return( 0 );
  29950. }
  29951. }
  29952. #endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */
  29953. /* Amalgamated Release Mappings */
  29954. #undef supported_init
  29955. #endif /* MBEDTLS_SSL_TLS_C */
  29956. /********* Start of file library/ssl_cli.c ************/
  29957. /*
  29958. * SSLv3/TLSv1 client-side functions
  29959. *
  29960. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  29961. * SPDX-License-Identifier: Apache-2.0
  29962. *
  29963. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  29964. * not use this file except in compliance with the License.
  29965. * You may obtain a copy of the License at
  29966. *
  29967. * http://www.apache.org/licenses/LICENSE-2.0
  29968. *
  29969. * Unless required by applicable law or agreed to in writing, software
  29970. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  29971. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  29972. * See the License for the specific language governing permissions and
  29973. * limitations under the License.
  29974. *
  29975. * This file is part of mbed TLS (https://tls.mbed.org)
  29976. */
  29977. #if !defined(MBEDTLS_CONFIG_FILE)
  29978. #else
  29979. #endif
  29980. #if defined(MBEDTLS_SSL_CLI_C)
  29981. #include <string.h>
  29982. #if defined(MBEDTLS_PLATFORM_C)
  29983. #else
  29984. #include <stdlib.h>
  29985. #define mbedtls_calloc calloc
  29986. #define mbedtls_free free
  29987. #endif
  29988. #if !VXWORKS
  29989. #include <stdint.h>
  29990. #endif
  29991. #if defined(MBEDTLS_HAVE_TIME)
  29992. #include <time.h>
  29993. #endif
  29994. #if defined(MBEDTLS_SSL_SESSION_TICKETS)
  29995. /* Implementation that should never be optimized out by the compiler */
  29996. static void ssl_cli_zeroize( void *v, size_t n ) {
  29997. volatile unsigned char *p = v; while( n-- ) *p++ = 0;
  29998. }
  29999. #endif
  30000. #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
  30001. static void ssl_cli_write_hostname_ext( mbedtls_ssl_context *ssl,
  30002. unsigned char *buf,
  30003. size_t *olen )
  30004. {
  30005. unsigned char *p = buf;
  30006. const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;
  30007. size_t hostname_len;
  30008. *olen = 0;
  30009. if( ssl->hostname == NULL )
  30010. return;
  30011. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding server name extension: %s",
  30012. ssl->hostname ) );
  30013. hostname_len = strlen( ssl->hostname );
  30014. if( end < p || (size_t)( end - p ) < hostname_len + 9 )
  30015. {
  30016. MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
  30017. return;
  30018. }
  30019. /*
  30020. * struct {
  30021. * NameType name_type;
  30022. * select (name_type) {
  30023. * case host_name: HostName;
  30024. * } name;
  30025. * } ServerName;
  30026. *
  30027. * enum {
  30028. * host_name(0), (255)
  30029. * } NameType;
  30030. *
  30031. * opaque HostName<1..2^16-1>;
  30032. *
  30033. * struct {
  30034. * ServerName server_name_list<1..2^16-1>
  30035. * } ServerNameList;
  30036. */
  30037. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SERVERNAME >> 8 ) & 0xFF );
  30038. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SERVERNAME ) & 0xFF );
  30039. *p++ = (unsigned char)( ( (hostname_len + 5) >> 8 ) & 0xFF );
  30040. *p++ = (unsigned char)( ( (hostname_len + 5) ) & 0xFF );
  30041. *p++ = (unsigned char)( ( (hostname_len + 3) >> 8 ) & 0xFF );
  30042. *p++ = (unsigned char)( ( (hostname_len + 3) ) & 0xFF );
  30043. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SERVERNAME_HOSTNAME ) & 0xFF );
  30044. *p++ = (unsigned char)( ( hostname_len >> 8 ) & 0xFF );
  30045. *p++ = (unsigned char)( ( hostname_len ) & 0xFF );
  30046. memcpy( p, ssl->hostname, hostname_len );
  30047. *olen = hostname_len + 9;
  30048. }
  30049. #endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
  30050. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  30051. static void ssl_cli_write_renegotiation_ext( mbedtls_ssl_context *ssl,
  30052. unsigned char *buf,
  30053. size_t *olen )
  30054. {
  30055. unsigned char *p = buf;
  30056. const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;
  30057. *olen = 0;
  30058. if( ssl->renego_status != MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )
  30059. return;
  30060. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding renegotiation extension" ) );
  30061. if( end < p || (size_t)( end - p ) < 5 + ssl->verify_data_len )
  30062. {
  30063. MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
  30064. return;
  30065. }
  30066. /*
  30067. * Secure renegotiation
  30068. */
  30069. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_RENEGOTIATION_INFO >> 8 ) & 0xFF );
  30070. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_RENEGOTIATION_INFO ) & 0xFF );
  30071. *p++ = 0x00;
  30072. *p++ = ( ssl->verify_data_len + 1 ) & 0xFF;
  30073. *p++ = ssl->verify_data_len & 0xFF;
  30074. memcpy( p, ssl->own_verify_data, ssl->verify_data_len );
  30075. *olen = 5 + ssl->verify_data_len;
  30076. }
  30077. #endif /* MBEDTLS_SSL_RENEGOTIATION */
  30078. /*
  30079. * Only if we handle at least one key exchange that needs signatures.
  30080. */
  30081. #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
  30082. defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)
  30083. static void ssl_cli_write_signature_algorithms_ext( mbedtls_ssl_context *ssl,
  30084. unsigned char *buf,
  30085. size_t *olen )
  30086. {
  30087. unsigned char *p = buf;
  30088. const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;
  30089. size_t sig_alg_len = 0;
  30090. const int *md;
  30091. #if defined(MBEDTLS_RSA_C) || defined(MBEDTLS_ECDSA_C)
  30092. unsigned char *sig_alg_list = buf + 6;
  30093. #endif
  30094. *olen = 0;
  30095. if( ssl->conf->max_minor_ver != MBEDTLS_SSL_MINOR_VERSION_3 )
  30096. return;
  30097. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding signature_algorithms extension" ) );
  30098. for( md = ssl->conf->sig_hashes; *md != MBEDTLS_MD_NONE; md++ )
  30099. {
  30100. #if defined(MBEDTLS_ECDSA_C)
  30101. sig_alg_len += 2;
  30102. #endif
  30103. #if defined(MBEDTLS_RSA_C)
  30104. sig_alg_len += 2;
  30105. #endif
  30106. }
  30107. if( end < p || (size_t)( end - p ) < sig_alg_len + 6 )
  30108. {
  30109. MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
  30110. return;
  30111. }
  30112. /*
  30113. * Prepare signature_algorithms extension (TLS 1.2)
  30114. */
  30115. sig_alg_len = 0;
  30116. for( md = ssl->conf->sig_hashes; *md != MBEDTLS_MD_NONE; md++ )
  30117. {
  30118. #if defined(MBEDTLS_ECDSA_C)
  30119. sig_alg_list[sig_alg_len++] = mbedtls_ssl_hash_from_md_alg( *md );
  30120. sig_alg_list[sig_alg_len++] = MBEDTLS_SSL_SIG_ECDSA;
  30121. #endif
  30122. #if defined(MBEDTLS_RSA_C)
  30123. sig_alg_list[sig_alg_len++] = mbedtls_ssl_hash_from_md_alg( *md );
  30124. sig_alg_list[sig_alg_len++] = MBEDTLS_SSL_SIG_RSA;
  30125. #endif
  30126. }
  30127. /*
  30128. * enum {
  30129. * none(0), md5(1), sha1(2), sha224(3), sha256(4), sha384(5),
  30130. * sha512(6), (255)
  30131. * } HashAlgorithm;
  30132. *
  30133. * enum { anonymous(0), rsa(1), dsa(2), ecdsa(3), (255) }
  30134. * SignatureAlgorithm;
  30135. *
  30136. * struct {
  30137. * HashAlgorithm hash;
  30138. * SignatureAlgorithm signature;
  30139. * } SignatureAndHashAlgorithm;
  30140. *
  30141. * SignatureAndHashAlgorithm
  30142. * supported_signature_algorithms<2..2^16-2>;
  30143. */
  30144. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SIG_ALG >> 8 ) & 0xFF );
  30145. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SIG_ALG ) & 0xFF );
  30146. *p++ = (unsigned char)( ( ( sig_alg_len + 2 ) >> 8 ) & 0xFF );
  30147. *p++ = (unsigned char)( ( ( sig_alg_len + 2 ) ) & 0xFF );
  30148. *p++ = (unsigned char)( ( sig_alg_len >> 8 ) & 0xFF );
  30149. *p++ = (unsigned char)( ( sig_alg_len ) & 0xFF );
  30150. *olen = 6 + sig_alg_len;
  30151. }
  30152. #endif /* MBEDTLS_SSL_PROTO_TLS1_2 &&
  30153. MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */
  30154. #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
  30155. defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
  30156. static void ssl_cli_write_supported_elliptic_curves_ext( mbedtls_ssl_context *ssl,
  30157. unsigned char *buf,
  30158. size_t *olen )
  30159. {
  30160. unsigned char *p = buf;
  30161. const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;
  30162. unsigned char *elliptic_curve_list = p + 6;
  30163. size_t elliptic_curve_len = 0;
  30164. const mbedtls_ecp_curve_info *info;
  30165. #if defined(MBEDTLS_ECP_C)
  30166. const mbedtls_ecp_group_id *grp_id;
  30167. #else
  30168. ((void) ssl);
  30169. #endif
  30170. *olen = 0;
  30171. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding supported_elliptic_curves extension" ) );
  30172. #if defined(MBEDTLS_ECP_C)
  30173. for( grp_id = ssl->conf->curve_list; *grp_id != MBEDTLS_ECP_DP_NONE; grp_id++ )
  30174. {
  30175. info = mbedtls_ecp_curve_info_from_grp_id( *grp_id );
  30176. #else
  30177. for( info = mbedtls_ecp_curve_list(); info->grp_id != MBEDTLS_ECP_DP_NONE; info++ )
  30178. {
  30179. #endif
  30180. elliptic_curve_len += 2;
  30181. }
  30182. if( end < p || (size_t)( end - p ) < 6 + elliptic_curve_len )
  30183. {
  30184. MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
  30185. return;
  30186. }
  30187. elliptic_curve_len = 0;
  30188. #if defined(MBEDTLS_ECP_C)
  30189. for( grp_id = ssl->conf->curve_list; *grp_id != MBEDTLS_ECP_DP_NONE; grp_id++ )
  30190. {
  30191. info = mbedtls_ecp_curve_info_from_grp_id( *grp_id );
  30192. #else
  30193. for( info = mbedtls_ecp_curve_list(); info->grp_id != MBEDTLS_ECP_DP_NONE; info++ )
  30194. {
  30195. #endif
  30196. elliptic_curve_list[elliptic_curve_len++] = info->tls_id >> 8;
  30197. elliptic_curve_list[elliptic_curve_len++] = info->tls_id & 0xFF;
  30198. }
  30199. if( elliptic_curve_len == 0 )
  30200. return;
  30201. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES >> 8 ) & 0xFF );
  30202. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES ) & 0xFF );
  30203. *p++ = (unsigned char)( ( ( elliptic_curve_len + 2 ) >> 8 ) & 0xFF );
  30204. *p++ = (unsigned char)( ( ( elliptic_curve_len + 2 ) ) & 0xFF );
  30205. *p++ = (unsigned char)( ( ( elliptic_curve_len ) >> 8 ) & 0xFF );
  30206. *p++ = (unsigned char)( ( ( elliptic_curve_len ) ) & 0xFF );
  30207. *olen = 6 + elliptic_curve_len;
  30208. }
  30209. static void ssl_cli_write_supported_point_formats_ext( mbedtls_ssl_context *ssl,
  30210. unsigned char *buf,
  30211. size_t *olen )
  30212. {
  30213. unsigned char *p = buf;
  30214. const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;
  30215. *olen = 0;
  30216. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding supported_point_formats extension" ) );
  30217. if( end < p || (size_t)( end - p ) < 6 )
  30218. {
  30219. MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
  30220. return;
  30221. }
  30222. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS >> 8 ) & 0xFF );
  30223. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS ) & 0xFF );
  30224. *p++ = 0x00;
  30225. *p++ = 2;
  30226. *p++ = 1;
  30227. *p++ = MBEDTLS_ECP_PF_UNCOMPRESSED;
  30228. *olen = 6;
  30229. }
  30230. #endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C ||
  30231. MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
  30232. #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
  30233. static void ssl_cli_write_ecjpake_kkpp_ext( mbedtls_ssl_context *ssl,
  30234. unsigned char *buf,
  30235. size_t *olen )
  30236. {
  30237. int ret;
  30238. unsigned char *p = buf;
  30239. const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;
  30240. size_t kkpp_len;
  30241. *olen = 0;
  30242. /* Skip costly extension if we can't use EC J-PAKE anyway */
  30243. if( mbedtls_ecjpake_check( &ssl->handshake->ecjpake_ctx ) != 0 )
  30244. return;
  30245. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding ecjpake_kkpp extension" ) );
  30246. if( end - p < 4 )
  30247. {
  30248. MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
  30249. return;
  30250. }
  30251. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ECJPAKE_KKPP >> 8 ) & 0xFF );
  30252. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ECJPAKE_KKPP ) & 0xFF );
  30253. /*
  30254. * We may need to send ClientHello multiple times for Hello verification.
  30255. * We don't want to compute fresh values every time (both for performance
  30256. * and consistency reasons), so cache the extension content.
  30257. */
  30258. if( ssl->handshake->ecjpake_cache == NULL ||
  30259. ssl->handshake->ecjpake_cache_len == 0 )
  30260. {
  30261. MBEDTLS_SSL_DEBUG_MSG( 3, ( "generating new ecjpake parameters" ) );
  30262. ret = mbedtls_ecjpake_write_round_one( &ssl->handshake->ecjpake_ctx,
  30263. p + 2, end - p - 2, &kkpp_len,
  30264. ssl->conf->f_rng, ssl->conf->p_rng );
  30265. if( ret != 0 )
  30266. {
  30267. MBEDTLS_SSL_DEBUG_RET( 1 , "mbedtls_ecjpake_write_round_one", ret );
  30268. return;
  30269. }
  30270. ssl->handshake->ecjpake_cache = mbedtls_calloc( 1, kkpp_len );
  30271. if( ssl->handshake->ecjpake_cache == NULL )
  30272. {
  30273. MBEDTLS_SSL_DEBUG_MSG( 1, ( "allocation failed" ) );
  30274. return;
  30275. }
  30276. memcpy( ssl->handshake->ecjpake_cache, p + 2, kkpp_len );
  30277. ssl->handshake->ecjpake_cache_len = kkpp_len;
  30278. }
  30279. else
  30280. {
  30281. MBEDTLS_SSL_DEBUG_MSG( 3, ( "re-using cached ecjpake parameters" ) );
  30282. kkpp_len = ssl->handshake->ecjpake_cache_len;
  30283. if( (size_t)( end - p - 2 ) < kkpp_len )
  30284. {
  30285. MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
  30286. return;
  30287. }
  30288. memcpy( p + 2, ssl->handshake->ecjpake_cache, kkpp_len );
  30289. }
  30290. *p++ = (unsigned char)( ( kkpp_len >> 8 ) & 0xFF );
  30291. *p++ = (unsigned char)( ( kkpp_len ) & 0xFF );
  30292. *olen = kkpp_len + 4;
  30293. }
  30294. #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
  30295. #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
  30296. static void ssl_cli_write_max_fragment_length_ext( mbedtls_ssl_context *ssl,
  30297. unsigned char *buf,
  30298. size_t *olen )
  30299. {
  30300. unsigned char *p = buf;
  30301. const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;
  30302. *olen = 0;
  30303. if( ssl->conf->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE ) {
  30304. return;
  30305. }
  30306. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding max_fragment_length extension" ) );
  30307. if( end < p || (size_t)( end - p ) < 5 )
  30308. {
  30309. MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
  30310. return;
  30311. }
  30312. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH >> 8 ) & 0xFF );
  30313. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH ) & 0xFF );
  30314. *p++ = 0x00;
  30315. *p++ = 1;
  30316. *p++ = ssl->conf->mfl_code;
  30317. *olen = 5;
  30318. }
  30319. #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
  30320. #if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
  30321. static void ssl_cli_write_truncated_hmac_ext( mbedtls_ssl_context *ssl,
  30322. unsigned char *buf, size_t *olen )
  30323. {
  30324. unsigned char *p = buf;
  30325. const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;
  30326. *olen = 0;
  30327. if( ssl->conf->trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_DISABLED )
  30328. {
  30329. return;
  30330. }
  30331. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding truncated_hmac extension" ) );
  30332. if( end < p || (size_t)( end - p ) < 4 )
  30333. {
  30334. MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
  30335. return;
  30336. }
  30337. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_TRUNCATED_HMAC >> 8 ) & 0xFF );
  30338. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_TRUNCATED_HMAC ) & 0xFF );
  30339. *p++ = 0x00;
  30340. *p++ = 0x00;
  30341. *olen = 4;
  30342. }
  30343. #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
  30344. #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
  30345. static void ssl_cli_write_encrypt_then_mac_ext( mbedtls_ssl_context *ssl,
  30346. unsigned char *buf, size_t *olen )
  30347. {
  30348. unsigned char *p = buf;
  30349. const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;
  30350. *olen = 0;
  30351. if( ssl->conf->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED ||
  30352. ssl->conf->max_minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
  30353. {
  30354. return;
  30355. }
  30356. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding encrypt_then_mac "
  30357. "extension" ) );
  30358. if( end < p || (size_t)( end - p ) < 4 )
  30359. {
  30360. MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
  30361. return;
  30362. }
  30363. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC >> 8 ) & 0xFF );
  30364. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC ) & 0xFF );
  30365. *p++ = 0x00;
  30366. *p++ = 0x00;
  30367. *olen = 4;
  30368. }
  30369. #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
  30370. #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
  30371. static void ssl_cli_write_extended_ms_ext( mbedtls_ssl_context *ssl,
  30372. unsigned char *buf, size_t *olen )
  30373. {
  30374. unsigned char *p = buf;
  30375. const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;
  30376. *olen = 0;
  30377. if( ssl->conf->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED ||
  30378. ssl->conf->max_minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
  30379. {
  30380. return;
  30381. }
  30382. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding extended_master_secret "
  30383. "extension" ) );
  30384. if( end < p || (size_t)( end - p ) < 4 )
  30385. {
  30386. MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
  30387. return;
  30388. }
  30389. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET >> 8 ) & 0xFF );
  30390. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET ) & 0xFF );
  30391. *p++ = 0x00;
  30392. *p++ = 0x00;
  30393. *olen = 4;
  30394. }
  30395. #endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
  30396. #if defined(MBEDTLS_SSL_SESSION_TICKETS)
  30397. static void ssl_cli_write_session_ticket_ext( mbedtls_ssl_context *ssl,
  30398. unsigned char *buf, size_t *olen )
  30399. {
  30400. unsigned char *p = buf;
  30401. const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;
  30402. size_t tlen = ssl->session_negotiate->ticket_len;
  30403. *olen = 0;
  30404. if( ssl->conf->session_tickets == MBEDTLS_SSL_SESSION_TICKETS_DISABLED )
  30405. {
  30406. return;
  30407. }
  30408. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding session ticket extension" ) );
  30409. if( end < p || (size_t)( end - p ) < 4 + tlen )
  30410. {
  30411. MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
  30412. return;
  30413. }
  30414. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SESSION_TICKET >> 8 ) & 0xFF );
  30415. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SESSION_TICKET ) & 0xFF );
  30416. *p++ = (unsigned char)( ( tlen >> 8 ) & 0xFF );
  30417. *p++ = (unsigned char)( ( tlen ) & 0xFF );
  30418. *olen = 4;
  30419. if( ssl->session_negotiate->ticket == NULL || tlen == 0 )
  30420. {
  30421. return;
  30422. }
  30423. MBEDTLS_SSL_DEBUG_MSG( 3, ( "sending session ticket of length %d", tlen ) );
  30424. memcpy( p, ssl->session_negotiate->ticket, tlen );
  30425. *olen += tlen;
  30426. }
  30427. #endif /* MBEDTLS_SSL_SESSION_TICKETS */
  30428. #if defined(MBEDTLS_SSL_ALPN)
  30429. static void ssl_cli_write_alpn_ext( mbedtls_ssl_context *ssl,
  30430. unsigned char *buf, size_t *olen )
  30431. {
  30432. unsigned char *p = buf;
  30433. const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;
  30434. size_t alpnlen = 0;
  30435. const char **cur;
  30436. *olen = 0;
  30437. if( ssl->conf->alpn_list == NULL )
  30438. {
  30439. return;
  30440. }
  30441. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding alpn extension" ) );
  30442. for( cur = ssl->conf->alpn_list; *cur != NULL; cur++ )
  30443. alpnlen += (unsigned char)( strlen( *cur ) & 0xFF ) + 1;
  30444. if( end < p || (size_t)( end - p ) < 6 + alpnlen )
  30445. {
  30446. MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
  30447. return;
  30448. }
  30449. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ALPN >> 8 ) & 0xFF );
  30450. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ALPN ) & 0xFF );
  30451. /*
  30452. * opaque ProtocolName<1..2^8-1>;
  30453. *
  30454. * struct {
  30455. * ProtocolName protocol_name_list<2..2^16-1>
  30456. * } ProtocolNameList;
  30457. */
  30458. /* Skip writing extension and list length for now */
  30459. p += 4;
  30460. for( cur = ssl->conf->alpn_list; *cur != NULL; cur++ )
  30461. {
  30462. *p = (unsigned char)( strlen( *cur ) & 0xFF );
  30463. memcpy( p + 1, *cur, *p );
  30464. p += 1 + *p;
  30465. }
  30466. *olen = p - buf;
  30467. /* List length = olen - 2 (ext_type) - 2 (ext_len) - 2 (list_len) */
  30468. buf[4] = (unsigned char)( ( ( *olen - 6 ) >> 8 ) & 0xFF );
  30469. buf[5] = (unsigned char)( ( ( *olen - 6 ) ) & 0xFF );
  30470. /* Extension length = olen - 2 (ext_type) - 2 (ext_len) */
  30471. buf[2] = (unsigned char)( ( ( *olen - 4 ) >> 8 ) & 0xFF );
  30472. buf[3] = (unsigned char)( ( ( *olen - 4 ) ) & 0xFF );
  30473. }
  30474. #endif /* MBEDTLS_SSL_ALPN */
  30475. /*
  30476. * Generate random bytes for ClientHello
  30477. */
  30478. static int ssl_generate_random( mbedtls_ssl_context *ssl )
  30479. {
  30480. int ret;
  30481. unsigned char *p = ssl->handshake->randbytes;
  30482. #if defined(MBEDTLS_HAVE_TIME)
  30483. time_t t;
  30484. #endif
  30485. /*
  30486. * When responding to a verify request, MUST reuse random (RFC 6347 4.2.1)
  30487. */
  30488. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  30489. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
  30490. ssl->handshake->verify_cookie != NULL )
  30491. {
  30492. return( 0 );
  30493. }
  30494. #endif
  30495. #if defined(MBEDTLS_HAVE_TIME)
  30496. t = time( NULL );
  30497. *p++ = (unsigned char)( t >> 24 );
  30498. *p++ = (unsigned char)( t >> 16 );
  30499. *p++ = (unsigned char)( t >> 8 );
  30500. *p++ = (unsigned char)( t );
  30501. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, current time: %lu", t ) );
  30502. #else
  30503. if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, p, 4 ) ) != 0 )
  30504. return( ret );
  30505. p += 4;
  30506. #endif /* MBEDTLS_HAVE_TIME */
  30507. if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, p, 28 ) ) != 0 )
  30508. return( ret );
  30509. return( 0 );
  30510. }
  30511. static int ssl_write_client_hello( mbedtls_ssl_context *ssl )
  30512. {
  30513. int ret;
  30514. size_t i, n, olen, ext_len = 0;
  30515. unsigned char *buf;
  30516. unsigned char *p, *q;
  30517. unsigned char offer_compress;
  30518. const int *ciphersuites;
  30519. const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
  30520. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write client hello" ) );
  30521. if( ssl->conf->f_rng == NULL )
  30522. {
  30523. MBEDTLS_SSL_DEBUG_MSG( 1, ( "no RNG provided") );
  30524. return( MBEDTLS_ERR_SSL_NO_RNG );
  30525. }
  30526. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  30527. if( ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE )
  30528. #endif
  30529. {
  30530. ssl->major_ver = ssl->conf->min_major_ver;
  30531. ssl->minor_ver = ssl->conf->min_minor_ver;
  30532. }
  30533. if( ssl->conf->max_major_ver == 0 )
  30534. {
  30535. MBEDTLS_SSL_DEBUG_MSG( 1, ( "configured max major version is invalid, "
  30536. "consider using mbedtls_ssl_config_defaults()" ) );
  30537. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  30538. }
  30539. /*
  30540. * 0 . 0 handshake type
  30541. * 1 . 3 handshake length
  30542. * 4 . 5 highest version supported
  30543. * 6 . 9 current UNIX time
  30544. * 10 . 37 random bytes
  30545. */
  30546. buf = ssl->out_msg;
  30547. p = buf + 4;
  30548. mbedtls_ssl_write_version( ssl->conf->max_major_ver, ssl->conf->max_minor_ver,
  30549. ssl->conf->transport, p );
  30550. p += 2;
  30551. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, max version: [%d:%d]",
  30552. buf[4], buf[5] ) );
  30553. if( ( ret = ssl_generate_random( ssl ) ) != 0 )
  30554. {
  30555. MBEDTLS_SSL_DEBUG_RET( 1, "ssl_generate_random", ret );
  30556. return( ret );
  30557. }
  30558. memcpy( p, ssl->handshake->randbytes, 32 );
  30559. MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, random bytes", p, 32 );
  30560. p += 32;
  30561. /*
  30562. * 38 . 38 session id length
  30563. * 39 . 39+n session id
  30564. * 39+n . 39+n DTLS only: cookie length (1 byte)
  30565. * 40+n . .. DTSL only: cookie
  30566. * .. . .. ciphersuitelist length (2 bytes)
  30567. * .. . .. ciphersuitelist
  30568. * .. . .. compression methods length (1 byte)
  30569. * .. . .. compression methods
  30570. * .. . .. extensions length (2 bytes)
  30571. * .. . .. extensions
  30572. */
  30573. n = ssl->session_negotiate->id_len;
  30574. if( n < 16 || n > 32 ||
  30575. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  30576. ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE ||
  30577. #endif
  30578. ssl->handshake->resume == 0 )
  30579. {
  30580. n = 0;
  30581. }
  30582. #if defined(MBEDTLS_SSL_SESSION_TICKETS)
  30583. /*
  30584. * RFC 5077 section 3.4: "When presenting a ticket, the client MAY
  30585. * generate and include a Session ID in the TLS ClientHello."
  30586. */
  30587. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  30588. if( ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE )
  30589. #endif
  30590. {
  30591. if( ssl->session_negotiate->ticket != NULL &&
  30592. ssl->session_negotiate->ticket_len != 0 )
  30593. {
  30594. ret = ssl->conf->f_rng( ssl->conf->p_rng, ssl->session_negotiate->id, 32 );
  30595. if( ret != 0 )
  30596. return( ret );
  30597. ssl->session_negotiate->id_len = n = 32;
  30598. }
  30599. }
  30600. #endif /* MBEDTLS_SSL_SESSION_TICKETS */
  30601. *p++ = (unsigned char) n;
  30602. for( i = 0; i < n; i++ )
  30603. *p++ = ssl->session_negotiate->id[i];
  30604. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, session id len.: %d", n ) );
  30605. MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, session id", buf + 39, n );
  30606. /*
  30607. * DTLS cookie
  30608. */
  30609. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  30610. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
  30611. {
  30612. if( ssl->handshake->verify_cookie == NULL )
  30613. {
  30614. MBEDTLS_SSL_DEBUG_MSG( 3, ( "no verify cookie to send" ) );
  30615. *p++ = 0;
  30616. }
  30617. else
  30618. {
  30619. MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, cookie",
  30620. ssl->handshake->verify_cookie,
  30621. ssl->handshake->verify_cookie_len );
  30622. *p++ = ssl->handshake->verify_cookie_len;
  30623. memcpy( p, ssl->handshake->verify_cookie,
  30624. ssl->handshake->verify_cookie_len );
  30625. p += ssl->handshake->verify_cookie_len;
  30626. }
  30627. }
  30628. #endif
  30629. /*
  30630. * Ciphersuite list
  30631. */
  30632. ciphersuites = ssl->conf->ciphersuite_list[ssl->minor_ver];
  30633. /* Skip writing ciphersuite length for now */
  30634. n = 0;
  30635. q = p;
  30636. p += 2;
  30637. for( i = 0; ciphersuites[i] != 0; i++ )
  30638. {
  30639. ciphersuite_info = mbedtls_ssl_ciphersuite_from_id( ciphersuites[i] );
  30640. if( ciphersuite_info == NULL )
  30641. continue;
  30642. if( ciphersuite_info->min_minor_ver > ssl->conf->max_minor_ver ||
  30643. ciphersuite_info->max_minor_ver < ssl->conf->min_minor_ver )
  30644. continue;
  30645. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  30646. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
  30647. ( ciphersuite_info->flags & MBEDTLS_CIPHERSUITE_NODTLS ) )
  30648. continue;
  30649. #endif
  30650. #if defined(MBEDTLS_ARC4_C)
  30651. if( ssl->conf->arc4_disabled == MBEDTLS_SSL_ARC4_DISABLED &&
  30652. ciphersuite_info->cipher == MBEDTLS_CIPHER_ARC4_128 )
  30653. continue;
  30654. #endif
  30655. #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
  30656. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE &&
  30657. mbedtls_ecjpake_check( &ssl->handshake->ecjpake_ctx ) != 0 )
  30658. continue;
  30659. #endif
  30660. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, add ciphersuite: %04x",
  30661. ciphersuites[i] ) );
  30662. n++;
  30663. *p++ = (unsigned char)( ciphersuites[i] >> 8 );
  30664. *p++ = (unsigned char)( ciphersuites[i] );
  30665. }
  30666. /*
  30667. * Add TLS_EMPTY_RENEGOTIATION_INFO_SCSV
  30668. */
  30669. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  30670. if( ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE )
  30671. #endif
  30672. {
  30673. *p++ = (unsigned char)( MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO >> 8 );
  30674. *p++ = (unsigned char)( MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO );
  30675. n++;
  30676. }
  30677. /* Some versions of OpenSSL don't handle it correctly if not at end */
  30678. #if defined(MBEDTLS_SSL_FALLBACK_SCSV)
  30679. if( ssl->conf->fallback == MBEDTLS_SSL_IS_FALLBACK )
  30680. {
  30681. MBEDTLS_SSL_DEBUG_MSG( 3, ( "adding FALLBACK_SCSV" ) );
  30682. *p++ = (unsigned char)( MBEDTLS_SSL_FALLBACK_SCSV_VALUE >> 8 );
  30683. *p++ = (unsigned char)( MBEDTLS_SSL_FALLBACK_SCSV_VALUE );
  30684. n++;
  30685. }
  30686. #endif
  30687. *q++ = (unsigned char)( n >> 7 );
  30688. *q++ = (unsigned char)( n << 1 );
  30689. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, got %d ciphersuites", n ) );
  30690. #if defined(MBEDTLS_ZLIB_SUPPORT)
  30691. offer_compress = 1;
  30692. #else
  30693. offer_compress = 0;
  30694. #endif
  30695. /*
  30696. * We don't support compression with DTLS right now: is many records come
  30697. * in the same datagram, uncompressing one could overwrite the next one.
  30698. * We don't want to add complexity for handling that case unless there is
  30699. * an actual need for it.
  30700. */
  30701. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  30702. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
  30703. offer_compress = 0;
  30704. #endif
  30705. if( offer_compress )
  30706. {
  30707. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, compress len.: %d", 2 ) );
  30708. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, compress alg.: %d %d",
  30709. MBEDTLS_SSL_COMPRESS_DEFLATE, MBEDTLS_SSL_COMPRESS_NULL ) );
  30710. *p++ = 2;
  30711. *p++ = MBEDTLS_SSL_COMPRESS_DEFLATE;
  30712. *p++ = MBEDTLS_SSL_COMPRESS_NULL;
  30713. }
  30714. else
  30715. {
  30716. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, compress len.: %d", 1 ) );
  30717. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, compress alg.: %d",
  30718. MBEDTLS_SSL_COMPRESS_NULL ) );
  30719. *p++ = 1;
  30720. *p++ = MBEDTLS_SSL_COMPRESS_NULL;
  30721. }
  30722. // First write extensions, then the total length
  30723. //
  30724. #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
  30725. ssl_cli_write_hostname_ext( ssl, p + 2 + ext_len, &olen );
  30726. ext_len += olen;
  30727. #endif
  30728. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  30729. ssl_cli_write_renegotiation_ext( ssl, p + 2 + ext_len, &olen );
  30730. ext_len += olen;
  30731. #endif
  30732. #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
  30733. defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)
  30734. ssl_cli_write_signature_algorithms_ext( ssl, p + 2 + ext_len, &olen );
  30735. ext_len += olen;
  30736. #endif
  30737. #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
  30738. defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
  30739. ssl_cli_write_supported_elliptic_curves_ext( ssl, p + 2 + ext_len, &olen );
  30740. ext_len += olen;
  30741. ssl_cli_write_supported_point_formats_ext( ssl, p + 2 + ext_len, &olen );
  30742. ext_len += olen;
  30743. #endif
  30744. #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
  30745. ssl_cli_write_ecjpake_kkpp_ext( ssl, p + 2 + ext_len, &olen );
  30746. ext_len += olen;
  30747. #endif
  30748. #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
  30749. ssl_cli_write_max_fragment_length_ext( ssl, p + 2 + ext_len, &olen );
  30750. ext_len += olen;
  30751. #endif
  30752. #if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
  30753. ssl_cli_write_truncated_hmac_ext( ssl, p + 2 + ext_len, &olen );
  30754. ext_len += olen;
  30755. #endif
  30756. #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
  30757. ssl_cli_write_encrypt_then_mac_ext( ssl, p + 2 + ext_len, &olen );
  30758. ext_len += olen;
  30759. #endif
  30760. #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
  30761. ssl_cli_write_extended_ms_ext( ssl, p + 2 + ext_len, &olen );
  30762. ext_len += olen;
  30763. #endif
  30764. #if defined(MBEDTLS_SSL_ALPN)
  30765. ssl_cli_write_alpn_ext( ssl, p + 2 + ext_len, &olen );
  30766. ext_len += olen;
  30767. #endif
  30768. #if defined(MBEDTLS_SSL_SESSION_TICKETS)
  30769. ssl_cli_write_session_ticket_ext( ssl, p + 2 + ext_len, &olen );
  30770. ext_len += olen;
  30771. #endif
  30772. /* olen unused if all extensions are disabled */
  30773. ((void) olen);
  30774. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, total extension length: %d",
  30775. ext_len ) );
  30776. if( ext_len > 0 )
  30777. {
  30778. *p++ = (unsigned char)( ( ext_len >> 8 ) & 0xFF );
  30779. *p++ = (unsigned char)( ( ext_len ) & 0xFF );
  30780. p += ext_len;
  30781. }
  30782. ssl->out_msglen = p - buf;
  30783. ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
  30784. ssl->out_msg[0] = MBEDTLS_SSL_HS_CLIENT_HELLO;
  30785. ssl->state++;
  30786. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  30787. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
  30788. mbedtls_ssl_send_flight_completed( ssl );
  30789. #endif
  30790. if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 )
  30791. {
  30792. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret );
  30793. return( ret );
  30794. }
  30795. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write client hello" ) );
  30796. return( 0 );
  30797. }
  30798. static int ssl_cli_parse_renegotiation_info( mbedtls_ssl_context *ssl,
  30799. const unsigned char *buf,
  30800. size_t len )
  30801. {
  30802. int ret;
  30803. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  30804. if( ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE )
  30805. {
  30806. /* Check verify-data in constant-time. The length OTOH is no secret */
  30807. if( len != 1 + ssl->verify_data_len * 2 ||
  30808. buf[0] != ssl->verify_data_len * 2 ||
  30809. mbedtls_ssl_safer_memcmp( buf + 1,
  30810. ssl->own_verify_data, ssl->verify_data_len ) != 0 ||
  30811. mbedtls_ssl_safer_memcmp( buf + 1 + ssl->verify_data_len,
  30812. ssl->peer_verify_data, ssl->verify_data_len ) != 0 )
  30813. {
  30814. MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching renegotiation info" ) );
  30815. if( ( ret = mbedtls_ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
  30816. return( ret );
  30817. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
  30818. }
  30819. }
  30820. else
  30821. #endif /* MBEDTLS_SSL_RENEGOTIATION */
  30822. {
  30823. if( len != 1 || buf[0] != 0x00 )
  30824. {
  30825. MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-zero length renegotiation info" ) );
  30826. if( ( ret = mbedtls_ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
  30827. return( ret );
  30828. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
  30829. }
  30830. ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;
  30831. }
  30832. return( 0 );
  30833. }
  30834. #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
  30835. static int ssl_cli_parse_max_fragment_length_ext( mbedtls_ssl_context *ssl,
  30836. const unsigned char *buf,
  30837. size_t len )
  30838. {
  30839. /*
  30840. * server should use the extension only if we did,
  30841. * and if so the server's value should match ours (and len is always 1)
  30842. */
  30843. if( ssl->conf->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE ||
  30844. len != 1 ||
  30845. buf[0] != ssl->conf->mfl_code )
  30846. {
  30847. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
  30848. }
  30849. return( 0 );
  30850. }
  30851. #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
  30852. #if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
  30853. static int ssl_cli_parse_truncated_hmac_ext( mbedtls_ssl_context *ssl,
  30854. const unsigned char *buf,
  30855. size_t len )
  30856. {
  30857. if( ssl->conf->trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_DISABLED ||
  30858. len != 0 )
  30859. {
  30860. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
  30861. }
  30862. ((void) buf);
  30863. ssl->session_negotiate->trunc_hmac = MBEDTLS_SSL_TRUNC_HMAC_ENABLED;
  30864. return( 0 );
  30865. }
  30866. #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
  30867. #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
  30868. static int ssl_cli_parse_encrypt_then_mac_ext( mbedtls_ssl_context *ssl,
  30869. const unsigned char *buf,
  30870. size_t len )
  30871. {
  30872. if( ssl->conf->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED ||
  30873. ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ||
  30874. len != 0 )
  30875. {
  30876. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
  30877. }
  30878. ((void) buf);
  30879. ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED;
  30880. return( 0 );
  30881. }
  30882. #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
  30883. #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
  30884. static int ssl_cli_parse_extended_ms_ext( mbedtls_ssl_context *ssl,
  30885. const unsigned char *buf,
  30886. size_t len )
  30887. {
  30888. if( ssl->conf->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED ||
  30889. ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ||
  30890. len != 0 )
  30891. {
  30892. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
  30893. }
  30894. ((void) buf);
  30895. ssl->handshake->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED;
  30896. return( 0 );
  30897. }
  30898. #endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
  30899. #if defined(MBEDTLS_SSL_SESSION_TICKETS)
  30900. static int ssl_cli_parse_session_ticket_ext( mbedtls_ssl_context *ssl,
  30901. const unsigned char *buf,
  30902. size_t len )
  30903. {
  30904. if( ssl->conf->session_tickets == MBEDTLS_SSL_SESSION_TICKETS_DISABLED ||
  30905. len != 0 )
  30906. {
  30907. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
  30908. }
  30909. ((void) buf);
  30910. ssl->handshake->new_session_ticket = 1;
  30911. return( 0 );
  30912. }
  30913. #endif /* MBEDTLS_SSL_SESSION_TICKETS */
  30914. #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
  30915. defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
  30916. static int ssl_parse_supported_point_formats_ext( mbedtls_ssl_context *ssl,
  30917. const unsigned char *buf,
  30918. size_t len )
  30919. {
  30920. size_t list_size;
  30921. const unsigned char *p;
  30922. list_size = buf[0];
  30923. if( list_size + 1 != len )
  30924. {
  30925. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
  30926. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
  30927. }
  30928. p = buf + 1;
  30929. while( list_size > 0 )
  30930. {
  30931. if( p[0] == MBEDTLS_ECP_PF_UNCOMPRESSED ||
  30932. p[0] == MBEDTLS_ECP_PF_COMPRESSED )
  30933. {
  30934. #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C)
  30935. ssl->handshake->ecdh_ctx.point_format = p[0];
  30936. #endif
  30937. #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
  30938. ssl->handshake->ecjpake_ctx.point_format = p[0];
  30939. #endif
  30940. MBEDTLS_SSL_DEBUG_MSG( 4, ( "point format selected: %d", p[0] ) );
  30941. return( 0 );
  30942. }
  30943. list_size--;
  30944. p++;
  30945. }
  30946. MBEDTLS_SSL_DEBUG_MSG( 1, ( "no point format in common" ) );
  30947. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
  30948. }
  30949. #endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C ||
  30950. MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
  30951. #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
  30952. static int ssl_parse_ecjpake_kkpp( mbedtls_ssl_context *ssl,
  30953. const unsigned char *buf,
  30954. size_t len )
  30955. {
  30956. int ret;
  30957. if( ssl->transform_negotiate->ciphersuite_info->key_exchange !=
  30958. MBEDTLS_KEY_EXCHANGE_ECJPAKE )
  30959. {
  30960. MBEDTLS_SSL_DEBUG_MSG( 3, ( "skip ecjpake kkpp extension" ) );
  30961. return( 0 );
  30962. }
  30963. /* If we got here, we no longer need our cached extension */
  30964. mbedtls_free( ssl->handshake->ecjpake_cache );
  30965. ssl->handshake->ecjpake_cache = NULL;
  30966. ssl->handshake->ecjpake_cache_len = 0;
  30967. if( ( ret = mbedtls_ecjpake_read_round_one( &ssl->handshake->ecjpake_ctx,
  30968. buf, len ) ) != 0 )
  30969. {
  30970. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_read_round_one", ret );
  30971. return( ret );
  30972. }
  30973. return( 0 );
  30974. }
  30975. #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
  30976. #if defined(MBEDTLS_SSL_ALPN)
  30977. static int ssl_cli_parse_alpn_ext( mbedtls_ssl_context *ssl,
  30978. const unsigned char *buf, size_t len )
  30979. {
  30980. size_t list_len, name_len;
  30981. const char **p;
  30982. /* If we didn't send it, the server shouldn't send it */
  30983. if( ssl->conf->alpn_list == NULL )
  30984. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
  30985. /*
  30986. * opaque ProtocolName<1..2^8-1>;
  30987. *
  30988. * struct {
  30989. * ProtocolName protocol_name_list<2..2^16-1>
  30990. * } ProtocolNameList;
  30991. *
  30992. * the "ProtocolNameList" MUST contain exactly one "ProtocolName"
  30993. */
  30994. /* Min length is 2 (list_len) + 1 (name_len) + 1 (name) */
  30995. if( len < 4 )
  30996. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
  30997. list_len = ( buf[0] << 8 ) | buf[1];
  30998. if( list_len != len - 2 )
  30999. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
  31000. name_len = buf[2];
  31001. if( name_len != list_len - 1 )
  31002. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
  31003. /* Check that the server chosen protocol was in our list and save it */
  31004. for( p = ssl->conf->alpn_list; *p != NULL; p++ )
  31005. {
  31006. if( name_len == strlen( *p ) &&
  31007. memcmp( buf + 3, *p, name_len ) == 0 )
  31008. {
  31009. ssl->alpn_chosen = *p;
  31010. return( 0 );
  31011. }
  31012. }
  31013. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
  31014. }
  31015. #endif /* MBEDTLS_SSL_ALPN */
  31016. /*
  31017. * Parse HelloVerifyRequest. Only called after verifying the HS type.
  31018. */
  31019. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  31020. static int ssl_parse_hello_verify_request( mbedtls_ssl_context *ssl )
  31021. {
  31022. const unsigned char *p = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl );
  31023. int major_ver, minor_ver;
  31024. unsigned char cookie_len;
  31025. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse hello verify request" ) );
  31026. /*
  31027. * struct {
  31028. * ProtocolVersion server_version;
  31029. * opaque cookie<0..2^8-1>;
  31030. * } HelloVerifyRequest;
  31031. */
  31032. MBEDTLS_SSL_DEBUG_BUF( 3, "server version", p, 2 );
  31033. mbedtls_ssl_read_version( &major_ver, &minor_ver, ssl->conf->transport, p );
  31034. p += 2;
  31035. /*
  31036. * Since the RFC is not clear on this point, accept DTLS 1.0 (TLS 1.1)
  31037. * even is lower than our min version.
  31038. */
  31039. if( major_ver < MBEDTLS_SSL_MAJOR_VERSION_3 ||
  31040. minor_ver < MBEDTLS_SSL_MINOR_VERSION_2 ||
  31041. major_ver > ssl->conf->max_major_ver ||
  31042. minor_ver > ssl->conf->max_minor_ver )
  31043. {
  31044. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server version" ) );
  31045. mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
  31046. MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION );
  31047. return( MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION );
  31048. }
  31049. cookie_len = *p++;
  31050. MBEDTLS_SSL_DEBUG_BUF( 3, "cookie", p, cookie_len );
  31051. mbedtls_free( ssl->handshake->verify_cookie );
  31052. ssl->handshake->verify_cookie = mbedtls_calloc( 1, cookie_len );
  31053. if( ssl->handshake->verify_cookie == NULL )
  31054. {
  31055. MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc failed (%d bytes)", cookie_len ) );
  31056. return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
  31057. }
  31058. memcpy( ssl->handshake->verify_cookie, p, cookie_len );
  31059. ssl->handshake->verify_cookie_len = cookie_len;
  31060. /* Start over at ClientHello */
  31061. ssl->state = MBEDTLS_SSL_CLIENT_HELLO;
  31062. mbedtls_ssl_reset_checksum( ssl );
  31063. mbedtls_ssl_recv_flight_completed( ssl );
  31064. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse hello verify request" ) );
  31065. return( 0 );
  31066. }
  31067. #endif /* MBEDTLS_SSL_PROTO_DTLS */
  31068. static int ssl_parse_server_hello( mbedtls_ssl_context *ssl )
  31069. {
  31070. int ret, i;
  31071. size_t n;
  31072. size_t ext_len;
  31073. unsigned char *buf, *ext;
  31074. unsigned char comp;
  31075. #if defined(MBEDTLS_ZLIB_SUPPORT)
  31076. int accept_comp;
  31077. #endif
  31078. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  31079. int renegotiation_info_seen = 0;
  31080. #endif
  31081. int handshake_failure = 0;
  31082. const mbedtls_ssl_ciphersuite_t *suite_info;
  31083. #if defined(MBEDTLS_DEBUG_C)
  31084. uint32_t t;
  31085. #endif
  31086. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse server hello" ) );
  31087. buf = ssl->in_msg;
  31088. if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 )
  31089. {
  31090. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
  31091. return( ret );
  31092. }
  31093. if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
  31094. {
  31095. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  31096. if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )
  31097. {
  31098. ssl->renego_records_seen++;
  31099. if( ssl->conf->renego_max_records >= 0 &&
  31100. ssl->renego_records_seen > ssl->conf->renego_max_records )
  31101. {
  31102. MBEDTLS_SSL_DEBUG_MSG( 1, ( "renegotiation requested, "
  31103. "but not honored by server" ) );
  31104. return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
  31105. }
  31106. MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-handshake message during renego" ) );
  31107. return( MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO );
  31108. }
  31109. #endif /* MBEDTLS_SSL_RENEGOTIATION */
  31110. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
  31111. return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
  31112. }
  31113. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  31114. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
  31115. {
  31116. if( buf[0] == MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST )
  31117. {
  31118. MBEDTLS_SSL_DEBUG_MSG( 2, ( "received hello verify request" ) );
  31119. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse server hello" ) );
  31120. return( ssl_parse_hello_verify_request( ssl ) );
  31121. }
  31122. else
  31123. {
  31124. /* We made it through the verification process */
  31125. mbedtls_free( ssl->handshake->verify_cookie );
  31126. ssl->handshake->verify_cookie = NULL;
  31127. ssl->handshake->verify_cookie_len = 0;
  31128. }
  31129. }
  31130. #endif /* MBEDTLS_SSL_PROTO_DTLS */
  31131. if( ssl->in_hslen < 38 + mbedtls_ssl_hs_hdr_len( ssl ) ||
  31132. buf[0] != MBEDTLS_SSL_HS_SERVER_HELLO )
  31133. {
  31134. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
  31135. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
  31136. }
  31137. /*
  31138. * 0 . 1 server_version
  31139. * 2 . 33 random (maybe including 4 bytes of Unix time)
  31140. * 34 . 34 session_id length = n
  31141. * 35 . 34+n session_id
  31142. * 35+n . 36+n cipher_suite
  31143. * 37+n . 37+n compression_method
  31144. *
  31145. * 38+n . 39+n extensions length (optional)
  31146. * 40+n . .. extensions
  31147. */
  31148. buf += mbedtls_ssl_hs_hdr_len( ssl );
  31149. MBEDTLS_SSL_DEBUG_BUF( 3, "server hello, version", buf + 0, 2 );
  31150. mbedtls_ssl_read_version( &ssl->major_ver, &ssl->minor_ver,
  31151. ssl->conf->transport, buf + 0 );
  31152. if( ssl->major_ver < ssl->conf->min_major_ver ||
  31153. ssl->minor_ver < ssl->conf->min_minor_ver ||
  31154. ssl->major_ver > ssl->conf->max_major_ver ||
  31155. ssl->minor_ver > ssl->conf->max_minor_ver )
  31156. {
  31157. MBEDTLS_SSL_DEBUG_MSG( 1, ( "server version out of bounds - "
  31158. " min: [%d:%d], server: [%d:%d], max: [%d:%d]",
  31159. ssl->conf->min_major_ver, ssl->conf->min_minor_ver,
  31160. ssl->major_ver, ssl->minor_ver,
  31161. ssl->conf->max_major_ver, ssl->conf->max_minor_ver ) );
  31162. mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
  31163. MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION );
  31164. return( MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION );
  31165. }
  31166. #if defined(MBEDTLS_DEBUG_C)
  31167. t = ( (uint32_t) buf[2] << 24 )
  31168. | ( (uint32_t) buf[3] << 16 )
  31169. | ( (uint32_t) buf[4] << 8 )
  31170. | ( (uint32_t) buf[5] );
  31171. MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, current time: %lu", t ) );
  31172. #endif
  31173. memcpy( ssl->handshake->randbytes + 32, buf + 2, 32 );
  31174. n = buf[34];
  31175. MBEDTLS_SSL_DEBUG_BUF( 3, "server hello, random bytes", buf + 2, 32 );
  31176. if( n > 32 )
  31177. {
  31178. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
  31179. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
  31180. }
  31181. if( ssl->in_hslen > mbedtls_ssl_hs_hdr_len( ssl ) + 39 + n )
  31182. {
  31183. ext_len = ( ( buf[38 + n] << 8 )
  31184. | ( buf[39 + n] ) );
  31185. if( ( ext_len > 0 && ext_len < 4 ) ||
  31186. ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) + 40 + n + ext_len )
  31187. {
  31188. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
  31189. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
  31190. }
  31191. }
  31192. else if( ssl->in_hslen == mbedtls_ssl_hs_hdr_len( ssl ) + 38 + n )
  31193. {
  31194. ext_len = 0;
  31195. }
  31196. else
  31197. {
  31198. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
  31199. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
  31200. }
  31201. /* ciphersuite (used later) */
  31202. i = ( buf[35 + n] << 8 ) | buf[36 + n];
  31203. /*
  31204. * Read and check compression
  31205. */
  31206. comp = buf[37 + n];
  31207. #if defined(MBEDTLS_ZLIB_SUPPORT)
  31208. /* See comments in ssl_write_client_hello() */
  31209. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  31210. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
  31211. accept_comp = 0;
  31212. else
  31213. #endif
  31214. accept_comp = 1;
  31215. if( comp != MBEDTLS_SSL_COMPRESS_NULL &&
  31216. ( comp != MBEDTLS_SSL_COMPRESS_DEFLATE || accept_comp == 0 ) )
  31217. #else /* MBEDTLS_ZLIB_SUPPORT */
  31218. if( comp != MBEDTLS_SSL_COMPRESS_NULL )
  31219. #endif/* MBEDTLS_ZLIB_SUPPORT */
  31220. {
  31221. MBEDTLS_SSL_DEBUG_MSG( 1, ( "server hello, bad compression: %d", comp ) );
  31222. return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
  31223. }
  31224. /*
  31225. * Initialize update checksum functions
  31226. */
  31227. ssl->transform_negotiate->ciphersuite_info = mbedtls_ssl_ciphersuite_from_id( i );
  31228. if( ssl->transform_negotiate->ciphersuite_info == NULL )
  31229. {
  31230. MBEDTLS_SSL_DEBUG_MSG( 1, ( "ciphersuite info for %04x not found", i ) );
  31231. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  31232. }
  31233. mbedtls_ssl_optimize_checksum( ssl, ssl->transform_negotiate->ciphersuite_info );
  31234. MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, session id len.: %d", n ) );
  31235. MBEDTLS_SSL_DEBUG_BUF( 3, "server hello, session id", buf + 35, n );
  31236. /*
  31237. * Check if the session can be resumed
  31238. */
  31239. if( ssl->handshake->resume == 0 || n == 0 ||
  31240. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  31241. ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE ||
  31242. #endif
  31243. ssl->session_negotiate->ciphersuite != i ||
  31244. ssl->session_negotiate->compression != comp ||
  31245. ssl->session_negotiate->id_len != n ||
  31246. memcmp( ssl->session_negotiate->id, buf + 35, n ) != 0 )
  31247. {
  31248. ssl->state++;
  31249. ssl->handshake->resume = 0;
  31250. #if defined(MBEDTLS_HAVE_TIME)
  31251. ssl->session_negotiate->start = time( NULL );
  31252. #endif
  31253. ssl->session_negotiate->ciphersuite = i;
  31254. ssl->session_negotiate->compression = comp;
  31255. ssl->session_negotiate->id_len = n;
  31256. memcpy( ssl->session_negotiate->id, buf + 35, n );
  31257. }
  31258. else
  31259. {
  31260. ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC;
  31261. if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 )
  31262. {
  31263. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_derive_keys", ret );
  31264. return( ret );
  31265. }
  31266. }
  31267. MBEDTLS_SSL_DEBUG_MSG( 3, ( "%s session has been resumed",
  31268. ssl->handshake->resume ? "a" : "no" ) );
  31269. MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, chosen ciphersuite: %04x", i ) );
  31270. MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, compress alg.: %d", buf[37 + n] ) );
  31271. suite_info = mbedtls_ssl_ciphersuite_from_id( ssl->session_negotiate->ciphersuite );
  31272. if( suite_info == NULL
  31273. #if defined(MBEDTLS_ARC4_C)
  31274. || ( ssl->conf->arc4_disabled &&
  31275. suite_info->cipher == MBEDTLS_CIPHER_ARC4_128 )
  31276. #endif
  31277. )
  31278. {
  31279. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
  31280. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
  31281. }
  31282. MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, chosen ciphersuite: %s", suite_info->name ) );
  31283. i = 0;
  31284. while( 1 )
  31285. {
  31286. if( ssl->conf->ciphersuite_list[ssl->minor_ver][i] == 0 )
  31287. {
  31288. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
  31289. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
  31290. }
  31291. if( ssl->conf->ciphersuite_list[ssl->minor_ver][i++] ==
  31292. ssl->session_negotiate->ciphersuite )
  31293. {
  31294. break;
  31295. }
  31296. }
  31297. if( comp != MBEDTLS_SSL_COMPRESS_NULL
  31298. #if defined(MBEDTLS_ZLIB_SUPPORT)
  31299. && comp != MBEDTLS_SSL_COMPRESS_DEFLATE
  31300. #endif
  31301. )
  31302. {
  31303. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
  31304. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
  31305. }
  31306. ssl->session_negotiate->compression = comp;
  31307. ext = buf + 40 + n;
  31308. MBEDTLS_SSL_DEBUG_MSG( 2, ( "server hello, total extension length: %d", ext_len ) );
  31309. while( ext_len )
  31310. {
  31311. unsigned int ext_id = ( ( ext[0] << 8 )
  31312. | ( ext[1] ) );
  31313. unsigned int ext_size = ( ( ext[2] << 8 )
  31314. | ( ext[3] ) );
  31315. if( ext_size + 4 > ext_len )
  31316. {
  31317. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
  31318. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
  31319. }
  31320. switch( ext_id )
  31321. {
  31322. case MBEDTLS_TLS_EXT_RENEGOTIATION_INFO:
  31323. MBEDTLS_SSL_DEBUG_MSG( 3, ( "found renegotiation extension" ) );
  31324. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  31325. renegotiation_info_seen = 1;
  31326. #endif
  31327. if( ( ret = ssl_cli_parse_renegotiation_info( ssl, ext + 4,
  31328. ext_size ) ) != 0 )
  31329. return( ret );
  31330. break;
  31331. #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
  31332. case MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH:
  31333. MBEDTLS_SSL_DEBUG_MSG( 3, ( "found max_fragment_length extension" ) );
  31334. if( ( ret = ssl_cli_parse_max_fragment_length_ext( ssl,
  31335. ext + 4, ext_size ) ) != 0 )
  31336. {
  31337. return( ret );
  31338. }
  31339. break;
  31340. #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
  31341. #if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
  31342. case MBEDTLS_TLS_EXT_TRUNCATED_HMAC:
  31343. MBEDTLS_SSL_DEBUG_MSG( 3, ( "found truncated_hmac extension" ) );
  31344. if( ( ret = ssl_cli_parse_truncated_hmac_ext( ssl,
  31345. ext + 4, ext_size ) ) != 0 )
  31346. {
  31347. return( ret );
  31348. }
  31349. break;
  31350. #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
  31351. #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
  31352. case MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC:
  31353. MBEDTLS_SSL_DEBUG_MSG( 3, ( "found encrypt_then_mac extension" ) );
  31354. if( ( ret = ssl_cli_parse_encrypt_then_mac_ext( ssl,
  31355. ext + 4, ext_size ) ) != 0 )
  31356. {
  31357. return( ret );
  31358. }
  31359. break;
  31360. #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
  31361. #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
  31362. case MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET:
  31363. MBEDTLS_SSL_DEBUG_MSG( 3, ( "found extended_master_secret extension" ) );
  31364. if( ( ret = ssl_cli_parse_extended_ms_ext( ssl,
  31365. ext + 4, ext_size ) ) != 0 )
  31366. {
  31367. return( ret );
  31368. }
  31369. break;
  31370. #endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
  31371. #if defined(MBEDTLS_SSL_SESSION_TICKETS)
  31372. case MBEDTLS_TLS_EXT_SESSION_TICKET:
  31373. MBEDTLS_SSL_DEBUG_MSG( 3, ( "found session_ticket extension" ) );
  31374. if( ( ret = ssl_cli_parse_session_ticket_ext( ssl,
  31375. ext + 4, ext_size ) ) != 0 )
  31376. {
  31377. return( ret );
  31378. }
  31379. break;
  31380. #endif /* MBEDTLS_SSL_SESSION_TICKETS */
  31381. #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
  31382. defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
  31383. case MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS:
  31384. MBEDTLS_SSL_DEBUG_MSG( 3, ( "found supported_point_formats extension" ) );
  31385. if( ( ret = ssl_parse_supported_point_formats_ext( ssl,
  31386. ext + 4, ext_size ) ) != 0 )
  31387. {
  31388. return( ret );
  31389. }
  31390. break;
  31391. #endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C ||
  31392. MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
  31393. #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
  31394. case MBEDTLS_TLS_EXT_ECJPAKE_KKPP:
  31395. MBEDTLS_SSL_DEBUG_MSG( 3, ( "found ecjpake_kkpp extension" ) );
  31396. if( ( ret = ssl_parse_ecjpake_kkpp( ssl,
  31397. ext + 4, ext_size ) ) != 0 )
  31398. {
  31399. return( ret );
  31400. }
  31401. break;
  31402. #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
  31403. #if defined(MBEDTLS_SSL_ALPN)
  31404. case MBEDTLS_TLS_EXT_ALPN:
  31405. MBEDTLS_SSL_DEBUG_MSG( 3, ( "found alpn extension" ) );
  31406. if( ( ret = ssl_cli_parse_alpn_ext( ssl, ext + 4, ext_size ) ) != 0 )
  31407. return( ret );
  31408. break;
  31409. #endif /* MBEDTLS_SSL_ALPN */
  31410. default:
  31411. MBEDTLS_SSL_DEBUG_MSG( 3, ( "unknown extension found: %d (ignoring)",
  31412. ext_id ) );
  31413. }
  31414. ext_len -= 4 + ext_size;
  31415. ext += 4 + ext_size;
  31416. if( ext_len > 0 && ext_len < 4 )
  31417. {
  31418. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
  31419. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
  31420. }
  31421. }
  31422. /*
  31423. * Renegotiation security checks
  31424. */
  31425. if( ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
  31426. ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE )
  31427. {
  31428. MBEDTLS_SSL_DEBUG_MSG( 1, ( "legacy renegotiation, breaking off handshake" ) );
  31429. handshake_failure = 1;
  31430. }
  31431. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  31432. else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
  31433. ssl->secure_renegotiation == MBEDTLS_SSL_SECURE_RENEGOTIATION &&
  31434. renegotiation_info_seen == 0 )
  31435. {
  31436. MBEDTLS_SSL_DEBUG_MSG( 1, ( "renegotiation_info extension missing (secure)" ) );
  31437. handshake_failure = 1;
  31438. }
  31439. else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
  31440. ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
  31441. ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION )
  31442. {
  31443. MBEDTLS_SSL_DEBUG_MSG( 1, ( "legacy renegotiation not allowed" ) );
  31444. handshake_failure = 1;
  31445. }
  31446. else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
  31447. ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
  31448. renegotiation_info_seen == 1 )
  31449. {
  31450. MBEDTLS_SSL_DEBUG_MSG( 1, ( "renegotiation_info extension present (legacy)" ) );
  31451. handshake_failure = 1;
  31452. }
  31453. #endif /* MBEDTLS_SSL_RENEGOTIATION */
  31454. if( handshake_failure == 1 )
  31455. {
  31456. if( ( ret = mbedtls_ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
  31457. return( ret );
  31458. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
  31459. }
  31460. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse server hello" ) );
  31461. return( 0 );
  31462. }
  31463. #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
  31464. defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
  31465. static int ssl_parse_server_dh_params( mbedtls_ssl_context *ssl, unsigned char **p,
  31466. unsigned char *end )
  31467. {
  31468. int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
  31469. /*
  31470. * Ephemeral DH parameters:
  31471. *
  31472. * struct {
  31473. * opaque dh_p<1..2^16-1>;
  31474. * opaque dh_g<1..2^16-1>;
  31475. * opaque dh_Ys<1..2^16-1>;
  31476. * } ServerDHParams;
  31477. */
  31478. if( ( ret = mbedtls_dhm_read_params( &ssl->handshake->dhm_ctx, p, end ) ) != 0 )
  31479. {
  31480. MBEDTLS_SSL_DEBUG_RET( 2, ( "mbedtls_dhm_read_params" ), ret );
  31481. return( ret );
  31482. }
  31483. if( ssl->handshake->dhm_ctx.len * 8 < ssl->conf->dhm_min_bitlen )
  31484. {
  31485. MBEDTLS_SSL_DEBUG_MSG( 1, ( "DHM prime too short: %d < %d",
  31486. ssl->handshake->dhm_ctx.len * 8,
  31487. ssl->conf->dhm_min_bitlen ) );
  31488. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
  31489. }
  31490. MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: P ", &ssl->handshake->dhm_ctx.P );
  31491. MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: G ", &ssl->handshake->dhm_ctx.G );
  31492. MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: GY", &ssl->handshake->dhm_ctx.GY );
  31493. return( ret );
  31494. }
  31495. #endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||
  31496. MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
  31497. #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
  31498. defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
  31499. defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) || \
  31500. defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
  31501. defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
  31502. static int ssl_check_server_ecdh_params( const mbedtls_ssl_context *ssl )
  31503. {
  31504. const mbedtls_ecp_curve_info *curve_info;
  31505. curve_info = mbedtls_ecp_curve_info_from_grp_id( ssl->handshake->ecdh_ctx.grp.id );
  31506. if( curve_info == NULL )
  31507. {
  31508. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  31509. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  31510. }
  31511. MBEDTLS_SSL_DEBUG_MSG( 2, ( "ECDH curve: %s", curve_info->name ) );
  31512. #if defined(MBEDTLS_ECP_C)
  31513. if( mbedtls_ssl_check_curve( ssl, ssl->handshake->ecdh_ctx.grp.id ) != 0 )
  31514. #else
  31515. if( ssl->handshake->ecdh_ctx.grp.nbits < 163 ||
  31516. ssl->handshake->ecdh_ctx.grp.nbits > 521 )
  31517. #endif
  31518. return( -1 );
  31519. MBEDTLS_SSL_DEBUG_ECP( 3, "ECDH: Qp", &ssl->handshake->ecdh_ctx.Qp );
  31520. return( 0 );
  31521. }
  31522. #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
  31523. MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
  31524. MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED ||
  31525. MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
  31526. MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
  31527. #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
  31528. defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
  31529. defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
  31530. static int ssl_parse_server_ecdh_params( mbedtls_ssl_context *ssl,
  31531. unsigned char **p,
  31532. unsigned char *end )
  31533. {
  31534. int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
  31535. /*
  31536. * Ephemeral ECDH parameters:
  31537. *
  31538. * struct {
  31539. * ECParameters curve_params;
  31540. * ECPoint public;
  31541. * } ServerECDHParams;
  31542. */
  31543. if( ( ret = mbedtls_ecdh_read_params( &ssl->handshake->ecdh_ctx,
  31544. (const unsigned char **) p, end ) ) != 0 )
  31545. {
  31546. MBEDTLS_SSL_DEBUG_RET( 1, ( "mbedtls_ecdh_read_params" ), ret );
  31547. return( ret );
  31548. }
  31549. if( ssl_check_server_ecdh_params( ssl ) != 0 )
  31550. {
  31551. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message (ECDHE curve)" ) );
  31552. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
  31553. }
  31554. return( ret );
  31555. }
  31556. #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
  31557. MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
  31558. MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
  31559. #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
  31560. static int ssl_parse_server_psk_hint( mbedtls_ssl_context *ssl,
  31561. unsigned char **p,
  31562. unsigned char *end )
  31563. {
  31564. int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
  31565. size_t len;
  31566. ((void) ssl);
  31567. /*
  31568. * PSK parameters:
  31569. *
  31570. * opaque psk_identity_hint<0..2^16-1>;
  31571. */
  31572. len = (*p)[0] << 8 | (*p)[1];
  31573. *p += 2;
  31574. if( (*p) + len > end )
  31575. {
  31576. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message (psk_identity_hint length)" ) );
  31577. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
  31578. }
  31579. // TODO: Retrieve PSK identity hint and callback to app
  31580. //
  31581. *p += len;
  31582. ret = 0;
  31583. return( ret );
  31584. }
  31585. #endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */
  31586. #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \
  31587. defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
  31588. /*
  31589. * Generate a pre-master secret and encrypt it with the server's RSA key
  31590. */
  31591. static int ssl_write_encrypted_pms( mbedtls_ssl_context *ssl,
  31592. size_t offset, size_t *olen,
  31593. size_t pms_offset )
  31594. {
  31595. int ret;
  31596. size_t len_bytes = ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ? 0 : 2;
  31597. unsigned char *p = ssl->handshake->premaster + pms_offset;
  31598. if( offset + len_bytes > MBEDTLS_SSL_MAX_CONTENT_LEN )
  31599. {
  31600. MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small for encrypted pms" ) );
  31601. return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
  31602. }
  31603. /*
  31604. * Generate (part of) the pre-master as
  31605. * struct {
  31606. * ProtocolVersion client_version;
  31607. * opaque random[46];
  31608. * } PreMasterSecret;
  31609. */
  31610. mbedtls_ssl_write_version( ssl->conf->max_major_ver, ssl->conf->max_minor_ver,
  31611. ssl->conf->transport, p );
  31612. if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, p + 2, 46 ) ) != 0 )
  31613. {
  31614. MBEDTLS_SSL_DEBUG_RET( 1, "f_rng", ret );
  31615. return( ret );
  31616. }
  31617. ssl->handshake->pmslen = 48;
  31618. if( ssl->session_negotiate->peer_cert == NULL )
  31619. {
  31620. MBEDTLS_SSL_DEBUG_MSG( 2, ( "certificate required" ) );
  31621. return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
  31622. }
  31623. /*
  31624. * Now write it out, encrypted
  31625. */
  31626. if( ! mbedtls_pk_can_do( &ssl->session_negotiate->peer_cert->pk,
  31627. MBEDTLS_PK_RSA ) )
  31628. {
  31629. MBEDTLS_SSL_DEBUG_MSG( 1, ( "certificate key type mismatch" ) );
  31630. return( MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH );
  31631. }
  31632. if( ( ret = mbedtls_pk_encrypt( &ssl->session_negotiate->peer_cert->pk,
  31633. p, ssl->handshake->pmslen,
  31634. ssl->out_msg + offset + len_bytes, olen,
  31635. MBEDTLS_SSL_MAX_CONTENT_LEN - offset - len_bytes,
  31636. ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
  31637. {
  31638. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_rsa_pkcs1_encrypt", ret );
  31639. return( ret );
  31640. }
  31641. #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
  31642. defined(MBEDTLS_SSL_PROTO_TLS1_2)
  31643. if( len_bytes == 2 )
  31644. {
  31645. ssl->out_msg[offset+0] = (unsigned char)( *olen >> 8 );
  31646. ssl->out_msg[offset+1] = (unsigned char)( *olen );
  31647. *olen += 2;
  31648. }
  31649. #endif
  31650. return( 0 );
  31651. }
  31652. #endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED ||
  31653. MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
  31654. #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
  31655. #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
  31656. defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
  31657. defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
  31658. static int ssl_parse_signature_algorithm( mbedtls_ssl_context *ssl,
  31659. unsigned char **p,
  31660. unsigned char *end,
  31661. mbedtls_md_type_t *md_alg,
  31662. mbedtls_pk_type_t *pk_alg )
  31663. {
  31664. ((void) ssl);
  31665. *md_alg = MBEDTLS_MD_NONE;
  31666. *pk_alg = MBEDTLS_PK_NONE;
  31667. /* Only in TLS 1.2 */
  31668. if( ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_3 )
  31669. {
  31670. return( 0 );
  31671. }
  31672. if( (*p) + 2 > end )
  31673. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
  31674. /*
  31675. * Get hash algorithm
  31676. */
  31677. if( ( *md_alg = mbedtls_ssl_md_alg_from_hash( (*p)[0] ) ) == MBEDTLS_MD_NONE )
  31678. {
  31679. MBEDTLS_SSL_DEBUG_MSG( 1, ( "Server used unsupported "
  31680. "HashAlgorithm %d", *(p)[0] ) );
  31681. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
  31682. }
  31683. /*
  31684. * Get signature algorithm
  31685. */
  31686. if( ( *pk_alg = mbedtls_ssl_pk_alg_from_sig( (*p)[1] ) ) == MBEDTLS_PK_NONE )
  31687. {
  31688. MBEDTLS_SSL_DEBUG_MSG( 1, ( "server used unsupported "
  31689. "SignatureAlgorithm %d", (*p)[1] ) );
  31690. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
  31691. }
  31692. /*
  31693. * Check if the hash is acceptable
  31694. */
  31695. if( mbedtls_ssl_check_sig_hash( ssl, *md_alg ) != 0 )
  31696. {
  31697. MBEDTLS_SSL_DEBUG_MSG( 1, ( "server used HashAlgorithm "
  31698. "that was not offered" ) );
  31699. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
  31700. }
  31701. MBEDTLS_SSL_DEBUG_MSG( 2, ( "Server used SignatureAlgorithm %d", (*p)[1] ) );
  31702. MBEDTLS_SSL_DEBUG_MSG( 2, ( "Server used HashAlgorithm %d", (*p)[0] ) );
  31703. *p += 2;
  31704. return( 0 );
  31705. }
  31706. #endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||
  31707. MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
  31708. MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
  31709. #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
  31710. #if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
  31711. defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
  31712. static int ssl_cli_get_ecdh_params_from_cert( mbedtls_ssl_context *ssl )
  31713. {
  31714. int ret;
  31715. const mbedtls_ecp_keypair *peer_key;
  31716. if( ssl->session_negotiate->peer_cert == NULL )
  31717. {
  31718. MBEDTLS_SSL_DEBUG_MSG( 2, ( "certificate required" ) );
  31719. return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
  31720. }
  31721. if( ! mbedtls_pk_can_do( &ssl->session_negotiate->peer_cert->pk,
  31722. MBEDTLS_PK_ECKEY ) )
  31723. {
  31724. MBEDTLS_SSL_DEBUG_MSG( 1, ( "server key not ECDH capable" ) );
  31725. return( MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH );
  31726. }
  31727. peer_key = mbedtls_pk_ec( ssl->session_negotiate->peer_cert->pk );
  31728. if( ( ret = mbedtls_ecdh_get_params( &ssl->handshake->ecdh_ctx, peer_key,
  31729. MBEDTLS_ECDH_THEIRS ) ) != 0 )
  31730. {
  31731. MBEDTLS_SSL_DEBUG_RET( 1, ( "mbedtls_ecdh_get_params" ), ret );
  31732. return( ret );
  31733. }
  31734. if( ssl_check_server_ecdh_params( ssl ) != 0 )
  31735. {
  31736. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server certificate (ECDH curve)" ) );
  31737. return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE );
  31738. }
  31739. return( ret );
  31740. }
  31741. #endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) ||
  31742. MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
  31743. static int ssl_parse_server_key_exchange( mbedtls_ssl_context *ssl )
  31744. {
  31745. int ret;
  31746. const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
  31747. unsigned char *p, *end;
  31748. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse server key exchange" ) );
  31749. #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
  31750. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA )
  31751. {
  31752. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse server key exchange" ) );
  31753. ssl->state++;
  31754. return( 0 );
  31755. }
  31756. ((void) p);
  31757. ((void) end);
  31758. #endif
  31759. #if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
  31760. defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
  31761. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA ||
  31762. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA )
  31763. {
  31764. if( ( ret = ssl_cli_get_ecdh_params_from_cert( ssl ) ) != 0 )
  31765. {
  31766. MBEDTLS_SSL_DEBUG_RET( 1, "ssl_cli_get_ecdh_params_from_cert", ret );
  31767. return( ret );
  31768. }
  31769. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse server key exchange" ) );
  31770. ssl->state++;
  31771. return( 0 );
  31772. }
  31773. ((void) p);
  31774. ((void) end);
  31775. #endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
  31776. MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
  31777. if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 )
  31778. {
  31779. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
  31780. return( ret );
  31781. }
  31782. if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
  31783. {
  31784. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
  31785. return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
  31786. }
  31787. /*
  31788. * ServerKeyExchange may be skipped with PSK and RSA-PSK when the server
  31789. * doesn't use a psk_identity_hint
  31790. */
  31791. if( ssl->in_msg[0] != MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE )
  31792. {
  31793. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
  31794. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK )
  31795. {
  31796. ssl->record_read = 1;
  31797. goto exit;
  31798. }
  31799. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
  31800. return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
  31801. }
  31802. p = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl );
  31803. end = ssl->in_msg + ssl->in_hslen;
  31804. MBEDTLS_SSL_DEBUG_BUF( 3, "server key exchange", p, end - p );
  31805. #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
  31806. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
  31807. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
  31808. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
  31809. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )
  31810. {
  31811. if( ssl_parse_server_psk_hint( ssl, &p, end ) != 0 )
  31812. {
  31813. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
  31814. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
  31815. }
  31816. } /* FALLTROUGH */
  31817. #endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */
  31818. #if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) || \
  31819. defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
  31820. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
  31821. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK )
  31822. ; /* nothing more to do */
  31823. else
  31824. #endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED ||
  31825. MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
  31826. #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
  31827. defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
  31828. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_RSA ||
  31829. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK )
  31830. {
  31831. if( ssl_parse_server_dh_params( ssl, &p, end ) != 0 )
  31832. {
  31833. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
  31834. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
  31835. }
  31836. }
  31837. else
  31838. #endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||
  31839. MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
  31840. #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
  31841. defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) || \
  31842. defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
  31843. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
  31844. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
  31845. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA )
  31846. {
  31847. if( ssl_parse_server_ecdh_params( ssl, &p, end ) != 0 )
  31848. {
  31849. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
  31850. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
  31851. }
  31852. }
  31853. else
  31854. #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
  31855. MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED ||
  31856. MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
  31857. #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
  31858. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
  31859. {
  31860. ret = mbedtls_ecjpake_read_round_two( &ssl->handshake->ecjpake_ctx,
  31861. p, end - p );
  31862. if( ret != 0 )
  31863. {
  31864. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_read_round_two", ret );
  31865. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
  31866. }
  31867. }
  31868. else
  31869. #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
  31870. {
  31871. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  31872. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  31873. }
  31874. #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
  31875. defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
  31876. defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
  31877. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_RSA ||
  31878. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
  31879. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA )
  31880. {
  31881. size_t sig_len, hashlen;
  31882. unsigned char hash[64];
  31883. mbedtls_md_type_t md_alg = MBEDTLS_MD_NONE;
  31884. mbedtls_pk_type_t pk_alg = MBEDTLS_PK_NONE;
  31885. unsigned char *params = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl );
  31886. size_t params_len = p - params;
  31887. /*
  31888. * Handle the digitally-signed structure
  31889. */
  31890. #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
  31891. if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
  31892. {
  31893. if( ssl_parse_signature_algorithm( ssl, &p, end,
  31894. &md_alg, &pk_alg ) != 0 )
  31895. {
  31896. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
  31897. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
  31898. }
  31899. if( pk_alg != mbedtls_ssl_get_ciphersuite_sig_pk_alg( ciphersuite_info ) )
  31900. {
  31901. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
  31902. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
  31903. }
  31904. }
  31905. else
  31906. #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
  31907. #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
  31908. defined(MBEDTLS_SSL_PROTO_TLS1_1)
  31909. if( ssl->minor_ver < MBEDTLS_SSL_MINOR_VERSION_3 )
  31910. {
  31911. pk_alg = mbedtls_ssl_get_ciphersuite_sig_pk_alg( ciphersuite_info );
  31912. /* Default hash for ECDSA is SHA-1 */
  31913. if( pk_alg == MBEDTLS_PK_ECDSA && md_alg == MBEDTLS_MD_NONE )
  31914. md_alg = MBEDTLS_MD_SHA1;
  31915. }
  31916. else
  31917. #endif
  31918. {
  31919. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  31920. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  31921. }
  31922. /*
  31923. * Read signature
  31924. */
  31925. sig_len = ( p[0] << 8 ) | p[1];
  31926. p += 2;
  31927. if( end != p + sig_len )
  31928. {
  31929. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
  31930. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
  31931. }
  31932. MBEDTLS_SSL_DEBUG_BUF( 3, "signature", p, sig_len );
  31933. /*
  31934. * Compute the hash that has been signed
  31935. */
  31936. #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
  31937. defined(MBEDTLS_SSL_PROTO_TLS1_1)
  31938. if( md_alg == MBEDTLS_MD_NONE )
  31939. {
  31940. mbedtls_md5_context mbedtls_md5;
  31941. mbedtls_sha1_context mbedtls_sha1;
  31942. mbedtls_md5_init( &mbedtls_md5 );
  31943. mbedtls_sha1_init( &mbedtls_sha1 );
  31944. hashlen = 36;
  31945. /*
  31946. * digitally-signed struct {
  31947. * opaque md5_hash[16];
  31948. * opaque sha_hash[20];
  31949. * };
  31950. *
  31951. * md5_hash
  31952. * MD5(ClientHello.random + ServerHello.random
  31953. * + ServerParams);
  31954. * sha_hash
  31955. * SHA(ClientHello.random + ServerHello.random
  31956. * + ServerParams);
  31957. */
  31958. mbedtls_md5_starts( &mbedtls_md5 );
  31959. mbedtls_md5_update( &mbedtls_md5, ssl->handshake->randbytes, 64 );
  31960. mbedtls_md5_update( &mbedtls_md5, params, params_len );
  31961. mbedtls_md5_finish( &mbedtls_md5, hash );
  31962. mbedtls_sha1_starts( &mbedtls_sha1 );
  31963. mbedtls_sha1_update( &mbedtls_sha1, ssl->handshake->randbytes, 64 );
  31964. mbedtls_sha1_update( &mbedtls_sha1, params, params_len );
  31965. mbedtls_sha1_finish( &mbedtls_sha1, hash + 16 );
  31966. mbedtls_md5_free( &mbedtls_md5 );
  31967. mbedtls_sha1_free( &mbedtls_sha1 );
  31968. }
  31969. else
  31970. #endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \
  31971. MBEDTLS_SSL_PROTO_TLS1_1 */
  31972. #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
  31973. defined(MBEDTLS_SSL_PROTO_TLS1_2)
  31974. if( md_alg != MBEDTLS_MD_NONE )
  31975. {
  31976. mbedtls_md_context_t ctx;
  31977. mbedtls_md_init( &ctx );
  31978. /* Info from md_alg will be used instead */
  31979. hashlen = 0;
  31980. /*
  31981. * digitally-signed struct {
  31982. * opaque client_random[32];
  31983. * opaque server_random[32];
  31984. * ServerDHParams params;
  31985. * };
  31986. */
  31987. if( ( ret = mbedtls_md_setup( &ctx,
  31988. mbedtls_md_info_from_type( md_alg ), 0 ) ) != 0 )
  31989. {
  31990. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_setup", ret );
  31991. return( ret );
  31992. }
  31993. mbedtls_md_starts( &ctx );
  31994. mbedtls_md_update( &ctx, ssl->handshake->randbytes, 64 );
  31995. mbedtls_md_update( &ctx, params, params_len );
  31996. mbedtls_md_finish( &ctx, hash );
  31997. mbedtls_md_free( &ctx );
  31998. }
  31999. else
  32000. #endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \
  32001. MBEDTLS_SSL_PROTO_TLS1_2 */
  32002. {
  32003. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  32004. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  32005. }
  32006. MBEDTLS_SSL_DEBUG_BUF( 3, "parameters hash", hash, hashlen != 0 ? hashlen :
  32007. (unsigned int) ( mbedtls_md_get_size( mbedtls_md_info_from_type( md_alg ) ) ) );
  32008. if( ssl->session_negotiate->peer_cert == NULL )
  32009. {
  32010. MBEDTLS_SSL_DEBUG_MSG( 2, ( "certificate required" ) );
  32011. return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
  32012. }
  32013. /*
  32014. * Verify signature
  32015. */
  32016. if( ! mbedtls_pk_can_do( &ssl->session_negotiate->peer_cert->pk, pk_alg ) )
  32017. {
  32018. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
  32019. return( MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH );
  32020. }
  32021. if( ( ret = mbedtls_pk_verify( &ssl->session_negotiate->peer_cert->pk,
  32022. md_alg, hash, hashlen, p, sig_len ) ) != 0 )
  32023. {
  32024. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_pk_verify", ret );
  32025. return( ret );
  32026. }
  32027. }
  32028. #endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||
  32029. MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
  32030. MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
  32031. exit:
  32032. ssl->state++;
  32033. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse server key exchange" ) );
  32034. return( 0 );
  32035. }
  32036. #if !defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) && \
  32037. !defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) && \
  32038. !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) && \
  32039. !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
  32040. static int ssl_parse_certificate_request( mbedtls_ssl_context *ssl )
  32041. {
  32042. const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
  32043. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate request" ) );
  32044. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
  32045. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
  32046. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
  32047. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
  32048. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
  32049. {
  32050. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate request" ) );
  32051. ssl->state++;
  32052. return( 0 );
  32053. }
  32054. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  32055. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  32056. }
  32057. #else
  32058. static int ssl_parse_certificate_request( mbedtls_ssl_context *ssl )
  32059. {
  32060. int ret;
  32061. unsigned char *buf, *p;
  32062. size_t n = 0, m = 0;
  32063. size_t cert_type_len = 0, dn_len = 0;
  32064. const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
  32065. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate request" ) );
  32066. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
  32067. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
  32068. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
  32069. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
  32070. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
  32071. {
  32072. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate request" ) );
  32073. ssl->state++;
  32074. return( 0 );
  32075. }
  32076. if( ssl->record_read == 0 )
  32077. {
  32078. if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 )
  32079. {
  32080. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
  32081. return( ret );
  32082. }
  32083. if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
  32084. {
  32085. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
  32086. return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
  32087. }
  32088. ssl->record_read = 1;
  32089. }
  32090. ssl->client_auth = 0;
  32091. ssl->state++;
  32092. if( ssl->in_msg[0] == MBEDTLS_SSL_HS_CERTIFICATE_REQUEST )
  32093. ssl->client_auth++;
  32094. MBEDTLS_SSL_DEBUG_MSG( 3, ( "got %s certificate request",
  32095. ssl->client_auth ? "a" : "no" ) );
  32096. if( ssl->client_auth == 0 )
  32097. goto exit;
  32098. ssl->record_read = 0;
  32099. // TODO: handshake_failure alert for an anonymous server to request
  32100. // client authentication
  32101. /*
  32102. * struct {
  32103. * ClientCertificateType certificate_types<1..2^8-1>;
  32104. * SignatureAndHashAlgorithm
  32105. * supported_signature_algorithms<2^16-1>; -- TLS 1.2 only
  32106. * DistinguishedName certificate_authorities<0..2^16-1>;
  32107. * } CertificateRequest;
  32108. */
  32109. buf = ssl->in_msg;
  32110. // Retrieve cert types
  32111. //
  32112. cert_type_len = buf[mbedtls_ssl_hs_hdr_len( ssl )];
  32113. n = cert_type_len;
  32114. if( ssl->in_hslen < mbedtls_ssl_hs_hdr_len( ssl ) + 2 + n )
  32115. {
  32116. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
  32117. return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
  32118. }
  32119. p = buf + mbedtls_ssl_hs_hdr_len( ssl ) + 1;
  32120. while( cert_type_len > 0 )
  32121. {
  32122. #if defined(MBEDTLS_RSA_C)
  32123. if( *p == MBEDTLS_SSL_CERT_TYPE_RSA_SIGN &&
  32124. mbedtls_pk_can_do( mbedtls_ssl_own_key( ssl ), MBEDTLS_PK_RSA ) )
  32125. {
  32126. ssl->handshake->cert_type = MBEDTLS_SSL_CERT_TYPE_RSA_SIGN;
  32127. break;
  32128. }
  32129. else
  32130. #endif
  32131. #if defined(MBEDTLS_ECDSA_C)
  32132. if( *p == MBEDTLS_SSL_CERT_TYPE_ECDSA_SIGN &&
  32133. mbedtls_pk_can_do( mbedtls_ssl_own_key( ssl ), MBEDTLS_PK_ECDSA ) )
  32134. {
  32135. ssl->handshake->cert_type = MBEDTLS_SSL_CERT_TYPE_ECDSA_SIGN;
  32136. break;
  32137. }
  32138. else
  32139. #endif
  32140. {
  32141. ; /* Unsupported cert type, ignore */
  32142. }
  32143. cert_type_len--;
  32144. p++;
  32145. }
  32146. #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
  32147. if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
  32148. {
  32149. /* Ignored, see comments about hash in write_certificate_verify */
  32150. // TODO: should check the signature part against our pk_key though
  32151. size_t sig_alg_len = ( ( buf[mbedtls_ssl_hs_hdr_len( ssl ) + 1 + n] << 8 )
  32152. | ( buf[mbedtls_ssl_hs_hdr_len( ssl ) + 2 + n] ) );
  32153. m += 2;
  32154. n += sig_alg_len;
  32155. if( ssl->in_hslen < mbedtls_ssl_hs_hdr_len( ssl ) + 2 + n )
  32156. {
  32157. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
  32158. return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
  32159. }
  32160. }
  32161. #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
  32162. /* Ignore certificate_authorities, we only have one cert anyway */
  32163. // TODO: should not send cert if no CA matches
  32164. dn_len = ( ( buf[mbedtls_ssl_hs_hdr_len( ssl ) + 1 + m + n] << 8 )
  32165. | ( buf[mbedtls_ssl_hs_hdr_len( ssl ) + 2 + m + n] ) );
  32166. n += dn_len;
  32167. if( ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) + 3 + m + n )
  32168. {
  32169. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
  32170. return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
  32171. }
  32172. exit:
  32173. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse certificate request" ) );
  32174. return( 0 );
  32175. }
  32176. #endif /* !MBEDTLS_KEY_EXCHANGE_RSA_ENABLED &&
  32177. !MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED &&
  32178. !MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED &&
  32179. !MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
  32180. static int ssl_parse_server_hello_done( mbedtls_ssl_context *ssl )
  32181. {
  32182. int ret;
  32183. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse server hello done" ) );
  32184. if( ssl->record_read == 0 )
  32185. {
  32186. if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 )
  32187. {
  32188. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
  32189. return( ret );
  32190. }
  32191. if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
  32192. {
  32193. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello done message" ) );
  32194. return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
  32195. }
  32196. }
  32197. ssl->record_read = 0;
  32198. if( ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) ||
  32199. ssl->in_msg[0] != MBEDTLS_SSL_HS_SERVER_HELLO_DONE )
  32200. {
  32201. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello done message" ) );
  32202. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO_DONE );
  32203. }
  32204. ssl->state++;
  32205. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  32206. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
  32207. mbedtls_ssl_recv_flight_completed( ssl );
  32208. #endif
  32209. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse server hello done" ) );
  32210. return( 0 );
  32211. }
  32212. static int ssl_write_client_key_exchange( mbedtls_ssl_context *ssl )
  32213. {
  32214. int ret;
  32215. size_t i, n;
  32216. const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
  32217. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write client key exchange" ) );
  32218. #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED)
  32219. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_RSA )
  32220. {
  32221. /*
  32222. * DHM key exchange -- send G^X mod P
  32223. */
  32224. n = ssl->handshake->dhm_ctx.len;
  32225. ssl->out_msg[4] = (unsigned char)( n >> 8 );
  32226. ssl->out_msg[5] = (unsigned char)( n );
  32227. i = 6;
  32228. ret = mbedtls_dhm_make_public( &ssl->handshake->dhm_ctx,
  32229. (int) mbedtls_mpi_size( &ssl->handshake->dhm_ctx.P ),
  32230. &ssl->out_msg[i], n,
  32231. ssl->conf->f_rng, ssl->conf->p_rng );
  32232. if( ret != 0 )
  32233. {
  32234. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_make_public", ret );
  32235. return( ret );
  32236. }
  32237. MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: X ", &ssl->handshake->dhm_ctx.X );
  32238. MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: GX", &ssl->handshake->dhm_ctx.GX );
  32239. if( ( ret = mbedtls_dhm_calc_secret( &ssl->handshake->dhm_ctx,
  32240. ssl->handshake->premaster,
  32241. MBEDTLS_PREMASTER_SIZE,
  32242. &ssl->handshake->pmslen,
  32243. ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
  32244. {
  32245. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_calc_secret", ret );
  32246. return( ret );
  32247. }
  32248. MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K );
  32249. }
  32250. else
  32251. #endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */
  32252. #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
  32253. defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
  32254. defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
  32255. defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
  32256. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
  32257. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA ||
  32258. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA ||
  32259. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA )
  32260. {
  32261. /*
  32262. * ECDH key exchange -- send client public value
  32263. */
  32264. i = 4;
  32265. ret = mbedtls_ecdh_make_public( &ssl->handshake->ecdh_ctx,
  32266. &n,
  32267. &ssl->out_msg[i], 1000,
  32268. ssl->conf->f_rng, ssl->conf->p_rng );
  32269. if( ret != 0 )
  32270. {
  32271. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_make_public", ret );
  32272. return( ret );
  32273. }
  32274. MBEDTLS_SSL_DEBUG_ECP( 3, "ECDH: Q", &ssl->handshake->ecdh_ctx.Q );
  32275. if( ( ret = mbedtls_ecdh_calc_secret( &ssl->handshake->ecdh_ctx,
  32276. &ssl->handshake->pmslen,
  32277. ssl->handshake->premaster,
  32278. MBEDTLS_MPI_MAX_SIZE,
  32279. ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
  32280. {
  32281. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_calc_secret", ret );
  32282. return( ret );
  32283. }
  32284. MBEDTLS_SSL_DEBUG_MPI( 3, "ECDH: z", &ssl->handshake->ecdh_ctx.z );
  32285. }
  32286. else
  32287. #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
  32288. MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
  32289. MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
  32290. MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
  32291. #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
  32292. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
  32293. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
  32294. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
  32295. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )
  32296. {
  32297. /*
  32298. * opaque psk_identity<0..2^16-1>;
  32299. */
  32300. if( ssl->conf->psk == NULL || ssl->conf->psk_identity == NULL )
  32301. {
  32302. MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no private key for PSK" ) );
  32303. return( MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED );
  32304. }
  32305. i = 4;
  32306. n = ssl->conf->psk_identity_len;
  32307. if( i + 2 + n > MBEDTLS_SSL_MAX_CONTENT_LEN )
  32308. {
  32309. MBEDTLS_SSL_DEBUG_MSG( 1, ( "psk identity too long or "
  32310. "SSL buffer too short" ) );
  32311. return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
  32312. }
  32313. ssl->out_msg[i++] = (unsigned char)( n >> 8 );
  32314. ssl->out_msg[i++] = (unsigned char)( n );
  32315. memcpy( ssl->out_msg + i, ssl->conf->psk_identity, ssl->conf->psk_identity_len );
  32316. i += ssl->conf->psk_identity_len;
  32317. #if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
  32318. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK )
  32319. {
  32320. n = 0;
  32321. }
  32322. else
  32323. #endif
  32324. #if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
  32325. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK )
  32326. {
  32327. if( ( ret = ssl_write_encrypted_pms( ssl, i, &n, 2 ) ) != 0 )
  32328. return( ret );
  32329. }
  32330. else
  32331. #endif
  32332. #if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
  32333. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK )
  32334. {
  32335. /*
  32336. * ClientDiffieHellmanPublic public (DHM send G^X mod P)
  32337. */
  32338. n = ssl->handshake->dhm_ctx.len;
  32339. if( i + 2 + n > MBEDTLS_SSL_MAX_CONTENT_LEN )
  32340. {
  32341. MBEDTLS_SSL_DEBUG_MSG( 1, ( "psk identity or DHM size too long"
  32342. " or SSL buffer too short" ) );
  32343. return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
  32344. }
  32345. ssl->out_msg[i++] = (unsigned char)( n >> 8 );
  32346. ssl->out_msg[i++] = (unsigned char)( n );
  32347. ret = mbedtls_dhm_make_public( &ssl->handshake->dhm_ctx,
  32348. (int) mbedtls_mpi_size( &ssl->handshake->dhm_ctx.P ),
  32349. &ssl->out_msg[i], n,
  32350. ssl->conf->f_rng, ssl->conf->p_rng );
  32351. if( ret != 0 )
  32352. {
  32353. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_make_public", ret );
  32354. return( ret );
  32355. }
  32356. }
  32357. else
  32358. #endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
  32359. #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
  32360. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )
  32361. {
  32362. /*
  32363. * ClientECDiffieHellmanPublic public;
  32364. */
  32365. ret = mbedtls_ecdh_make_public( &ssl->handshake->ecdh_ctx, &n,
  32366. &ssl->out_msg[i], MBEDTLS_SSL_MAX_CONTENT_LEN - i,
  32367. ssl->conf->f_rng, ssl->conf->p_rng );
  32368. if( ret != 0 )
  32369. {
  32370. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_make_public", ret );
  32371. return( ret );
  32372. }
  32373. MBEDTLS_SSL_DEBUG_ECP( 3, "ECDH: Q", &ssl->handshake->ecdh_ctx.Q );
  32374. }
  32375. else
  32376. #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
  32377. {
  32378. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  32379. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  32380. }
  32381. if( ( ret = mbedtls_ssl_psk_derive_premaster( ssl,
  32382. ciphersuite_info->key_exchange ) ) != 0 )
  32383. {
  32384. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_psk_derive_premaster", ret );
  32385. return( ret );
  32386. }
  32387. }
  32388. else
  32389. #endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */
  32390. #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
  32391. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA )
  32392. {
  32393. i = 4;
  32394. if( ( ret = ssl_write_encrypted_pms( ssl, i, &n, 0 ) ) != 0 )
  32395. return( ret );
  32396. }
  32397. else
  32398. #endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
  32399. #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
  32400. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
  32401. {
  32402. i = 4;
  32403. ret = mbedtls_ecjpake_write_round_two( &ssl->handshake->ecjpake_ctx,
  32404. ssl->out_msg + i, MBEDTLS_SSL_MAX_CONTENT_LEN - i, &n,
  32405. ssl->conf->f_rng, ssl->conf->p_rng );
  32406. if( ret != 0 )
  32407. {
  32408. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_write_round_two", ret );
  32409. return( ret );
  32410. }
  32411. ret = mbedtls_ecjpake_derive_secret( &ssl->handshake->ecjpake_ctx,
  32412. ssl->handshake->premaster, 32, &ssl->handshake->pmslen,
  32413. ssl->conf->f_rng, ssl->conf->p_rng );
  32414. if( ret != 0 )
  32415. {
  32416. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_derive_secret", ret );
  32417. return( ret );
  32418. }
  32419. }
  32420. else
  32421. #endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
  32422. {
  32423. ((void) ciphersuite_info);
  32424. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  32425. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  32426. }
  32427. ssl->out_msglen = i + n;
  32428. ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
  32429. ssl->out_msg[0] = MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE;
  32430. ssl->state++;
  32431. if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 )
  32432. {
  32433. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret );
  32434. return( ret );
  32435. }
  32436. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write client key exchange" ) );
  32437. return( 0 );
  32438. }
  32439. #if !defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) && \
  32440. !defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) && \
  32441. !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) && \
  32442. !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
  32443. static int ssl_write_certificate_verify( mbedtls_ssl_context *ssl )
  32444. {
  32445. const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
  32446. int ret;
  32447. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate verify" ) );
  32448. if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 )
  32449. {
  32450. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_derive_keys", ret );
  32451. return( ret );
  32452. }
  32453. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
  32454. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
  32455. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
  32456. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
  32457. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
  32458. {
  32459. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
  32460. ssl->state++;
  32461. return( 0 );
  32462. }
  32463. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  32464. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  32465. }
  32466. #else
  32467. static int ssl_write_certificate_verify( mbedtls_ssl_context *ssl )
  32468. {
  32469. int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
  32470. const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
  32471. size_t n = 0, offset = 0;
  32472. unsigned char hash[48];
  32473. unsigned char *hash_start = hash;
  32474. mbedtls_md_type_t md_alg = MBEDTLS_MD_NONE;
  32475. unsigned int hashlen;
  32476. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate verify" ) );
  32477. if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 )
  32478. {
  32479. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_derive_keys", ret );
  32480. return( ret );
  32481. }
  32482. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
  32483. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
  32484. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
  32485. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
  32486. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
  32487. {
  32488. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
  32489. ssl->state++;
  32490. return( 0 );
  32491. }
  32492. if( ssl->client_auth == 0 || mbedtls_ssl_own_cert( ssl ) == NULL )
  32493. {
  32494. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
  32495. ssl->state++;
  32496. return( 0 );
  32497. }
  32498. if( mbedtls_ssl_own_key( ssl ) == NULL )
  32499. {
  32500. MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no private key for certificate" ) );
  32501. return( MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED );
  32502. }
  32503. /*
  32504. * Make an RSA signature of the handshake digests
  32505. */
  32506. ssl->handshake->calc_verify( ssl, hash );
  32507. #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
  32508. defined(MBEDTLS_SSL_PROTO_TLS1_1)
  32509. if( ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_3 )
  32510. {
  32511. /*
  32512. * digitally-signed struct {
  32513. * opaque md5_hash[16];
  32514. * opaque sha_hash[20];
  32515. * };
  32516. *
  32517. * md5_hash
  32518. * MD5(handshake_messages);
  32519. *
  32520. * sha_hash
  32521. * SHA(handshake_messages);
  32522. */
  32523. hashlen = 36;
  32524. md_alg = MBEDTLS_MD_NONE;
  32525. /*
  32526. * For ECDSA, default hash is SHA-1 only
  32527. */
  32528. if( mbedtls_pk_can_do( mbedtls_ssl_own_key( ssl ), MBEDTLS_PK_ECDSA ) )
  32529. {
  32530. hash_start += 16;
  32531. hashlen -= 16;
  32532. md_alg = MBEDTLS_MD_SHA1;
  32533. }
  32534. }
  32535. else
  32536. #endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \
  32537. MBEDTLS_SSL_PROTO_TLS1_1 */
  32538. #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
  32539. if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
  32540. {
  32541. /*
  32542. * digitally-signed struct {
  32543. * opaque handshake_messages[handshake_messages_length];
  32544. * };
  32545. *
  32546. * Taking shortcut here. We assume that the server always allows the
  32547. * PRF Hash function and has sent it in the allowed signature
  32548. * algorithms list received in the Certificate Request message.
  32549. *
  32550. * Until we encounter a server that does not, we will take this
  32551. * shortcut.
  32552. *
  32553. * Reason: Otherwise we should have running hashes for SHA512 and SHA224
  32554. * in order to satisfy 'weird' needs from the server side.
  32555. */
  32556. if( ssl->transform_negotiate->ciphersuite_info->mac ==
  32557. MBEDTLS_MD_SHA384 )
  32558. {
  32559. md_alg = MBEDTLS_MD_SHA384;
  32560. ssl->out_msg[4] = MBEDTLS_SSL_HASH_SHA384;
  32561. }
  32562. else
  32563. {
  32564. md_alg = MBEDTLS_MD_SHA256;
  32565. ssl->out_msg[4] = MBEDTLS_SSL_HASH_SHA256;
  32566. }
  32567. ssl->out_msg[5] = mbedtls_ssl_sig_from_pk( mbedtls_ssl_own_key( ssl ) );
  32568. /* Info from md_alg will be used instead */
  32569. hashlen = 0;
  32570. offset = 2;
  32571. }
  32572. else
  32573. #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
  32574. {
  32575. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  32576. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  32577. }
  32578. if( ( ret = mbedtls_pk_sign( mbedtls_ssl_own_key( ssl ), md_alg, hash_start, hashlen,
  32579. ssl->out_msg + 6 + offset, &n,
  32580. ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
  32581. {
  32582. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_pk_sign", ret );
  32583. return( ret );
  32584. }
  32585. ssl->out_msg[4 + offset] = (unsigned char)( n >> 8 );
  32586. ssl->out_msg[5 + offset] = (unsigned char)( n );
  32587. ssl->out_msglen = 6 + n + offset;
  32588. ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
  32589. ssl->out_msg[0] = MBEDTLS_SSL_HS_CERTIFICATE_VERIFY;
  32590. ssl->state++;
  32591. if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 )
  32592. {
  32593. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret );
  32594. return( ret );
  32595. }
  32596. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write certificate verify" ) );
  32597. return( ret );
  32598. }
  32599. #endif /* !MBEDTLS_KEY_EXCHANGE_RSA_ENABLED &&
  32600. !MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED &&
  32601. !MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
  32602. #if defined(MBEDTLS_SSL_SESSION_TICKETS)
  32603. static int ssl_parse_new_session_ticket( mbedtls_ssl_context *ssl )
  32604. {
  32605. int ret;
  32606. uint32_t lifetime;
  32607. size_t ticket_len;
  32608. unsigned char *ticket;
  32609. const unsigned char *msg;
  32610. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse new session ticket" ) );
  32611. if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 )
  32612. {
  32613. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
  32614. return( ret );
  32615. }
  32616. if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
  32617. {
  32618. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) );
  32619. return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
  32620. }
  32621. /*
  32622. * struct {
  32623. * uint32 ticket_lifetime_hint;
  32624. * opaque ticket<0..2^16-1>;
  32625. * } NewSessionTicket;
  32626. *
  32627. * 0 . 3 ticket_lifetime_hint
  32628. * 4 . 5 ticket_len (n)
  32629. * 6 . 5+n ticket content
  32630. */
  32631. if( ssl->in_msg[0] != MBEDTLS_SSL_HS_NEW_SESSION_TICKET ||
  32632. ssl->in_hslen < 6 + mbedtls_ssl_hs_hdr_len( ssl ) )
  32633. {
  32634. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) );
  32635. return( MBEDTLS_ERR_SSL_BAD_HS_NEW_SESSION_TICKET );
  32636. }
  32637. msg = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl );
  32638. lifetime = ( msg[0] << 24 ) | ( msg[1] << 16 ) |
  32639. ( msg[2] << 8 ) | ( msg[3] );
  32640. ticket_len = ( msg[4] << 8 ) | ( msg[5] );
  32641. if( ticket_len + 6 + mbedtls_ssl_hs_hdr_len( ssl ) != ssl->in_hslen )
  32642. {
  32643. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) );
  32644. return( MBEDTLS_ERR_SSL_BAD_HS_NEW_SESSION_TICKET );
  32645. }
  32646. MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket length: %d", ticket_len ) );
  32647. /* We're not waiting for a NewSessionTicket message any more */
  32648. ssl->handshake->new_session_ticket = 0;
  32649. ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC;
  32650. /*
  32651. * Zero-length ticket means the server changed his mind and doesn't want
  32652. * to send a ticket after all, so just forget it
  32653. */
  32654. if( ticket_len == 0 )
  32655. return( 0 );
  32656. ssl_cli_zeroize( ssl->session_negotiate->ticket,
  32657. ssl->session_negotiate->ticket_len );
  32658. mbedtls_free( ssl->session_negotiate->ticket );
  32659. ssl->session_negotiate->ticket = NULL;
  32660. ssl->session_negotiate->ticket_len = 0;
  32661. if( ( ticket = mbedtls_calloc( 1, ticket_len ) ) == NULL )
  32662. {
  32663. MBEDTLS_SSL_DEBUG_MSG( 1, ( "ticket alloc failed" ) );
  32664. return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
  32665. }
  32666. memcpy( ticket, msg + 6, ticket_len );
  32667. ssl->session_negotiate->ticket = ticket;
  32668. ssl->session_negotiate->ticket_len = ticket_len;
  32669. ssl->session_negotiate->ticket_lifetime = lifetime;
  32670. /*
  32671. * RFC 5077 section 3.4:
  32672. * "If the client receives a session ticket from the server, then it
  32673. * discards any Session ID that was sent in the ServerHello."
  32674. */
  32675. MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket in use, discarding session id" ) );
  32676. ssl->session_negotiate->id_len = 0;
  32677. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse new session ticket" ) );
  32678. return( 0 );
  32679. }
  32680. #endif /* MBEDTLS_SSL_SESSION_TICKETS */
  32681. /*
  32682. * SSL handshake -- client side -- single step
  32683. */
  32684. int mbedtls_ssl_handshake_client_step( mbedtls_ssl_context *ssl )
  32685. {
  32686. int ret = 0;
  32687. if( ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER || ssl->handshake == NULL )
  32688. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  32689. MBEDTLS_SSL_DEBUG_MSG( 2, ( "client state: %d", ssl->state ) );
  32690. if( ( ret = mbedtls_ssl_flush_output( ssl ) ) != 0 )
  32691. return( ret );
  32692. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  32693. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
  32694. ssl->handshake->retransmit_state == MBEDTLS_SSL_RETRANS_SENDING )
  32695. {
  32696. if( ( ret = mbedtls_ssl_resend( ssl ) ) != 0 )
  32697. return( ret );
  32698. }
  32699. #endif
  32700. /* Change state now, so that it is right in mbedtls_ssl_read_record(), used
  32701. * by DTLS for dropping out-of-sequence ChangeCipherSpec records */
  32702. #if defined(MBEDTLS_SSL_SESSION_TICKETS)
  32703. if( ssl->state == MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC &&
  32704. ssl->handshake->new_session_ticket != 0 )
  32705. {
  32706. ssl->state = MBEDTLS_SSL_SERVER_NEW_SESSION_TICKET;
  32707. }
  32708. #endif
  32709. switch( ssl->state )
  32710. {
  32711. case MBEDTLS_SSL_HELLO_REQUEST:
  32712. ssl->state = MBEDTLS_SSL_CLIENT_HELLO;
  32713. break;
  32714. /*
  32715. * ==> ClientHello
  32716. */
  32717. case MBEDTLS_SSL_CLIENT_HELLO:
  32718. ret = ssl_write_client_hello( ssl );
  32719. break;
  32720. /*
  32721. * <== ServerHello
  32722. * Certificate
  32723. * ( ServerKeyExchange )
  32724. * ( CertificateRequest )
  32725. * ServerHelloDone
  32726. */
  32727. case MBEDTLS_SSL_SERVER_HELLO:
  32728. ret = ssl_parse_server_hello( ssl );
  32729. break;
  32730. case MBEDTLS_SSL_SERVER_CERTIFICATE:
  32731. ret = mbedtls_ssl_parse_certificate( ssl );
  32732. break;
  32733. case MBEDTLS_SSL_SERVER_KEY_EXCHANGE:
  32734. ret = ssl_parse_server_key_exchange( ssl );
  32735. break;
  32736. case MBEDTLS_SSL_CERTIFICATE_REQUEST:
  32737. ret = ssl_parse_certificate_request( ssl );
  32738. break;
  32739. case MBEDTLS_SSL_SERVER_HELLO_DONE:
  32740. ret = ssl_parse_server_hello_done( ssl );
  32741. break;
  32742. /*
  32743. * ==> ( Certificate/Alert )
  32744. * ClientKeyExchange
  32745. * ( CertificateVerify )
  32746. * ChangeCipherSpec
  32747. * Finished
  32748. */
  32749. case MBEDTLS_SSL_CLIENT_CERTIFICATE:
  32750. ret = mbedtls_ssl_write_certificate( ssl );
  32751. break;
  32752. case MBEDTLS_SSL_CLIENT_KEY_EXCHANGE:
  32753. ret = ssl_write_client_key_exchange( ssl );
  32754. break;
  32755. case MBEDTLS_SSL_CERTIFICATE_VERIFY:
  32756. ret = ssl_write_certificate_verify( ssl );
  32757. break;
  32758. case MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC:
  32759. ret = mbedtls_ssl_write_change_cipher_spec( ssl );
  32760. break;
  32761. case MBEDTLS_SSL_CLIENT_FINISHED:
  32762. ret = mbedtls_ssl_write_finished( ssl );
  32763. break;
  32764. /*
  32765. * <== ( NewSessionTicket )
  32766. * ChangeCipherSpec
  32767. * Finished
  32768. */
  32769. #if defined(MBEDTLS_SSL_SESSION_TICKETS)
  32770. case MBEDTLS_SSL_SERVER_NEW_SESSION_TICKET:
  32771. ret = ssl_parse_new_session_ticket( ssl );
  32772. break;
  32773. #endif
  32774. case MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC:
  32775. ret = mbedtls_ssl_parse_change_cipher_spec( ssl );
  32776. break;
  32777. case MBEDTLS_SSL_SERVER_FINISHED:
  32778. ret = mbedtls_ssl_parse_finished( ssl );
  32779. break;
  32780. case MBEDTLS_SSL_FLUSH_BUFFERS:
  32781. MBEDTLS_SSL_DEBUG_MSG( 2, ( "handshake: done" ) );
  32782. ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;
  32783. break;
  32784. case MBEDTLS_SSL_HANDSHAKE_WRAPUP:
  32785. mbedtls_ssl_handshake_wrapup( ssl );
  32786. break;
  32787. default:
  32788. MBEDTLS_SSL_DEBUG_MSG( 1, ( "invalid state %d", ssl->state ) );
  32789. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  32790. }
  32791. return( ret );
  32792. }
  32793. #endif /* MBEDTLS_SSL_CLI_C */
  32794. /********* Start of file library/ssl_cookie.c ************/
  32795. /*
  32796. * DTLS cookie callbacks implementation
  32797. *
  32798. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  32799. * SPDX-License-Identifier: Apache-2.0
  32800. *
  32801. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  32802. * not use this file except in compliance with the License.
  32803. * You may obtain a copy of the License at
  32804. *
  32805. * http://www.apache.org/licenses/LICENSE-2.0
  32806. *
  32807. * Unless required by applicable law or agreed to in writing, software
  32808. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  32809. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  32810. * See the License for the specific language governing permissions and
  32811. * limitations under the License.
  32812. *
  32813. * This file is part of mbed TLS (https://tls.mbed.org)
  32814. */
  32815. /*
  32816. * These session callbacks use a simple chained list
  32817. * to store and retrieve the session information.
  32818. */
  32819. #if !defined(MBEDTLS_CONFIG_FILE)
  32820. #else
  32821. #endif
  32822. #if defined(MBEDTLS_SSL_COOKIE_C)
  32823. #if defined(MBEDTLS_PLATFORM_C)
  32824. #else
  32825. #define mbedtls_calloc calloc
  32826. #define mbedtls_free free
  32827. #endif
  32828. #include <string.h>
  32829. /* Implementation that should never be optimized out by the compiler */
  32830. static void ssl_cookie_zeroize( void *v, size_t n ) {
  32831. volatile unsigned char *p = v; while( n-- ) *p++ = 0;
  32832. }
  32833. /*
  32834. * If DTLS is in use, then at least one of SHA-1, SHA-256, SHA-512 is
  32835. * available. Try SHA-256 first, 512 wastes resources since we need to stay
  32836. * with max 32 bytes of cookie for DTLS 1.0
  32837. */
  32838. #if defined(MBEDTLS_SHA256_C)
  32839. #define COOKIE_MD MBEDTLS_MD_SHA224
  32840. #define COOKIE_MD_OUTLEN 32
  32841. #define COOKIE_HMAC_LEN 28
  32842. #elif defined(MBEDTLS_SHA512_C)
  32843. #define COOKIE_MD MBEDTLS_MD_SHA384
  32844. #define COOKIE_MD_OUTLEN 48
  32845. #define COOKIE_HMAC_LEN 28
  32846. #elif defined(MBEDTLS_SHA1_C)
  32847. #define COOKIE_MD MBEDTLS_MD_SHA1
  32848. #define COOKIE_MD_OUTLEN 20
  32849. #define COOKIE_HMAC_LEN 20
  32850. #else
  32851. #error "DTLS hello verify needs SHA-1 or SHA-2"
  32852. #endif
  32853. /*
  32854. * Cookies are formed of a 4-bytes timestamp (or serial number) and
  32855. * an HMAC of timestemp and client ID.
  32856. */
  32857. #define COOKIE_LEN ( 4 + COOKIE_HMAC_LEN )
  32858. void mbedtls_ssl_cookie_init( mbedtls_ssl_cookie_ctx *ctx )
  32859. {
  32860. mbedtls_md_init( &ctx->hmac_ctx );
  32861. #if !defined(MBEDTLS_HAVE_TIME)
  32862. ctx->serial = 0;
  32863. #endif
  32864. ctx->timeout = MBEDTLS_SSL_COOKIE_TIMEOUT;
  32865. #if defined(MBEDTLS_THREADING_C)
  32866. mbedtls_mutex_init( &ctx->mutex );
  32867. #endif
  32868. }
  32869. void mbedtls_ssl_cookie_set_timeout( mbedtls_ssl_cookie_ctx *ctx, unsigned long delay )
  32870. {
  32871. ctx->timeout = delay;
  32872. }
  32873. void mbedtls_ssl_cookie_free( mbedtls_ssl_cookie_ctx *ctx )
  32874. {
  32875. mbedtls_md_free( &ctx->hmac_ctx );
  32876. #if defined(MBEDTLS_THREADING_C)
  32877. mbedtls_mutex_init( &ctx->mutex );
  32878. #endif
  32879. ssl_cookie_zeroize( ctx, sizeof( mbedtls_ssl_cookie_ctx ) );
  32880. }
  32881. int mbedtls_ssl_cookie_setup( mbedtls_ssl_cookie_ctx *ctx,
  32882. int (*f_rng)(void *, unsigned char *, size_t),
  32883. void *p_rng )
  32884. {
  32885. int ret;
  32886. unsigned char key[COOKIE_MD_OUTLEN];
  32887. if( ( ret = f_rng( p_rng, key, sizeof( key ) ) ) != 0 )
  32888. return( ret );
  32889. ret = mbedtls_md_setup( &ctx->hmac_ctx, mbedtls_md_info_from_type( COOKIE_MD ), 1 );
  32890. if( ret != 0 )
  32891. return( ret );
  32892. ret = mbedtls_md_hmac_starts( &ctx->hmac_ctx, key, sizeof( key ) );
  32893. if( ret != 0 )
  32894. return( ret );
  32895. ssl_cookie_zeroize( key, sizeof( key ) );
  32896. return( 0 );
  32897. }
  32898. /*
  32899. * Generate the HMAC part of a cookie
  32900. */
  32901. static int ssl_cookie_hmac( mbedtls_md_context_t *hmac_ctx,
  32902. const unsigned char time[4],
  32903. unsigned char **p, unsigned char *end,
  32904. const unsigned char *cli_id, size_t cli_id_len )
  32905. {
  32906. unsigned char hmac_out[COOKIE_MD_OUTLEN];
  32907. if( (size_t)( end - *p ) < COOKIE_HMAC_LEN )
  32908. return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
  32909. if( mbedtls_md_hmac_reset( hmac_ctx ) != 0 ||
  32910. mbedtls_md_hmac_update( hmac_ctx, time, 4 ) != 0 ||
  32911. mbedtls_md_hmac_update( hmac_ctx, cli_id, cli_id_len ) != 0 ||
  32912. mbedtls_md_hmac_finish( hmac_ctx, hmac_out ) != 0 )
  32913. {
  32914. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  32915. }
  32916. memcpy( *p, hmac_out, COOKIE_HMAC_LEN );
  32917. *p += COOKIE_HMAC_LEN;
  32918. return( 0 );
  32919. }
  32920. /*
  32921. * Generate cookie for DTLS ClientHello verification
  32922. */
  32923. int mbedtls_ssl_cookie_write( void *p_ctx,
  32924. unsigned char **p, unsigned char *end,
  32925. const unsigned char *cli_id, size_t cli_id_len )
  32926. {
  32927. int ret;
  32928. mbedtls_ssl_cookie_ctx *ctx = (mbedtls_ssl_cookie_ctx *) p_ctx;
  32929. unsigned long t;
  32930. if( ctx == NULL || cli_id == NULL )
  32931. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  32932. if( (size_t)( end - *p ) < COOKIE_LEN )
  32933. return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
  32934. #if defined(MBEDTLS_HAVE_TIME)
  32935. t = (unsigned long) time( NULL );
  32936. #else
  32937. t = ctx->serial++;
  32938. #endif
  32939. (*p)[0] = (unsigned char)( t >> 24 );
  32940. (*p)[1] = (unsigned char)( t >> 16 );
  32941. (*p)[2] = (unsigned char)( t >> 8 );
  32942. (*p)[3] = (unsigned char)( t );
  32943. *p += 4;
  32944. #if defined(MBEDTLS_THREADING_C)
  32945. if( ( ret = mbedtls_mutex_lock( &ctx->mutex ) ) != 0 )
  32946. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR + ret );
  32947. #endif
  32948. ret = ssl_cookie_hmac( &ctx->hmac_ctx, *p - 4,
  32949. p, end, cli_id, cli_id_len );
  32950. #if defined(MBEDTLS_THREADING_C)
  32951. if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 )
  32952. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR +
  32953. MBEDTLS_ERR_THREADING_MUTEX_ERROR );
  32954. #endif
  32955. return( ret );
  32956. }
  32957. /*
  32958. * Check a cookie
  32959. */
  32960. int mbedtls_ssl_cookie_check( void *p_ctx,
  32961. const unsigned char *cookie, size_t cookie_len,
  32962. const unsigned char *cli_id, size_t cli_id_len )
  32963. {
  32964. unsigned char ref_hmac[COOKIE_HMAC_LEN];
  32965. int ret = 0;
  32966. unsigned char *p = ref_hmac;
  32967. mbedtls_ssl_cookie_ctx *ctx = (mbedtls_ssl_cookie_ctx *) p_ctx;
  32968. unsigned long cur_time, cookie_time;
  32969. if( ctx == NULL || cli_id == NULL )
  32970. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  32971. if( cookie_len != COOKIE_LEN )
  32972. return( -1 );
  32973. #if defined(MBEDTLS_THREADING_C)
  32974. if( ( ret = mbedtls_mutex_lock( &ctx->mutex ) ) != 0 )
  32975. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR + ret );
  32976. #endif
  32977. if( ssl_cookie_hmac( &ctx->hmac_ctx, cookie,
  32978. &p, p + sizeof( ref_hmac ),
  32979. cli_id, cli_id_len ) != 0 )
  32980. ret = -1;
  32981. #if defined(MBEDTLS_THREADING_C)
  32982. if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 )
  32983. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR +
  32984. MBEDTLS_ERR_THREADING_MUTEX_ERROR );
  32985. #endif
  32986. if( ret != 0 )
  32987. return( ret );
  32988. if( mbedtls_ssl_safer_memcmp( cookie + 4, ref_hmac, sizeof( ref_hmac ) ) != 0 )
  32989. return( -1 );
  32990. #if defined(MBEDTLS_HAVE_TIME)
  32991. cur_time = (unsigned long) time( NULL );
  32992. #else
  32993. cur_time = ctx->serial;
  32994. #endif
  32995. cookie_time = ( (unsigned long) cookie[0] << 24 ) |
  32996. ( (unsigned long) cookie[1] << 16 ) |
  32997. ( (unsigned long) cookie[2] << 8 ) |
  32998. ( (unsigned long) cookie[3] );
  32999. if( ctx->timeout != 0 && cur_time - cookie_time > ctx->timeout )
  33000. return( -1 );
  33001. return( 0 );
  33002. }
  33003. #endif /* MBEDTLS_SSL_COOKIE_C */
  33004. /********* Start of file library/ssl_srv.c ************/
  33005. /*
  33006. * SSLv3/TLSv1 server-side functions
  33007. *
  33008. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  33009. * SPDX-License-Identifier: Apache-2.0
  33010. *
  33011. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  33012. * not use this file except in compliance with the License.
  33013. * You may obtain a copy of the License at
  33014. *
  33015. * http://www.apache.org/licenses/LICENSE-2.0
  33016. *
  33017. * Unless required by applicable law or agreed to in writing, software
  33018. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  33019. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  33020. * See the License for the specific language governing permissions and
  33021. * limitations under the License.
  33022. *
  33023. * This file is part of mbed TLS (https://tls.mbed.org)
  33024. */
  33025. #if !defined(MBEDTLS_CONFIG_FILE)
  33026. #else
  33027. #endif
  33028. #if defined(MBEDTLS_SSL_SRV_C)
  33029. #include <string.h>
  33030. #if defined(MBEDTLS_ECP_C)
  33031. #endif
  33032. #if defined(MBEDTLS_PLATFORM_C)
  33033. #else
  33034. #include <stdlib.h>
  33035. #define mbedtls_calloc calloc
  33036. #define mbedtls_free free
  33037. #endif
  33038. #if defined(MBEDTLS_HAVE_TIME)
  33039. #include <time.h>
  33040. #endif
  33041. #if defined(MBEDTLS_SSL_SESSION_TICKETS)
  33042. /* Implementation that should never be optimized out by the compiler */
  33043. static void ssl_srv_zeroize( void *v, size_t n ) {
  33044. volatile unsigned char *p = v; while( n-- ) *p++ = 0;
  33045. }
  33046. #endif
  33047. #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
  33048. int mbedtls_ssl_set_client_transport_id( mbedtls_ssl_context *ssl,
  33049. const unsigned char *info,
  33050. size_t ilen )
  33051. {
  33052. if( ssl->conf->endpoint != MBEDTLS_SSL_IS_SERVER )
  33053. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  33054. mbedtls_free( ssl->cli_id );
  33055. if( ( ssl->cli_id = mbedtls_calloc( 1, ilen ) ) == NULL )
  33056. return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
  33057. memcpy( ssl->cli_id, info, ilen );
  33058. ssl->cli_id_len = ilen;
  33059. return( 0 );
  33060. }
  33061. void mbedtls_ssl_conf_dtls_cookies( mbedtls_ssl_config *conf,
  33062. mbedtls_ssl_cookie_write_t *f_cookie_write,
  33063. mbedtls_ssl_cookie_check_t *f_cookie_check,
  33064. void *p_cookie )
  33065. {
  33066. conf->f_cookie_write = f_cookie_write;
  33067. conf->f_cookie_check = f_cookie_check;
  33068. conf->p_cookie = p_cookie;
  33069. }
  33070. #endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
  33071. #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
  33072. static int ssl_parse_servername_ext( mbedtls_ssl_context *ssl,
  33073. const unsigned char *buf,
  33074. size_t len )
  33075. {
  33076. int ret;
  33077. size_t servername_list_size, hostname_len;
  33078. const unsigned char *p;
  33079. MBEDTLS_SSL_DEBUG_MSG( 3, ( "parse ServerName extension" ) );
  33080. servername_list_size = ( ( buf[0] << 8 ) | ( buf[1] ) );
  33081. if( servername_list_size + 2 != len )
  33082. {
  33083. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
  33084. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  33085. }
  33086. p = buf + 2;
  33087. while( servername_list_size > 0 )
  33088. {
  33089. hostname_len = ( ( p[1] << 8 ) | p[2] );
  33090. if( hostname_len + 3 > servername_list_size )
  33091. {
  33092. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
  33093. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  33094. }
  33095. if( p[0] == MBEDTLS_TLS_EXT_SERVERNAME_HOSTNAME )
  33096. {
  33097. ret = ssl->conf->f_sni( ssl->conf->p_sni,
  33098. ssl, p + 3, hostname_len );
  33099. if( ret != 0 )
  33100. {
  33101. MBEDTLS_SSL_DEBUG_RET( 1, "ssl_sni_wrapper", ret );
  33102. mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
  33103. MBEDTLS_SSL_ALERT_MSG_UNRECOGNIZED_NAME );
  33104. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  33105. }
  33106. return( 0 );
  33107. }
  33108. servername_list_size -= hostname_len + 3;
  33109. p += hostname_len + 3;
  33110. }
  33111. if( servername_list_size != 0 )
  33112. {
  33113. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
  33114. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  33115. }
  33116. return( 0 );
  33117. }
  33118. #endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
  33119. static int ssl_srv_parse_renegotiation_info( mbedtls_ssl_context *ssl,
  33120. const unsigned char *buf,
  33121. size_t len )
  33122. {
  33123. int ret;
  33124. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  33125. if( ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE )
  33126. {
  33127. /* Check verify-data in constant-time. The length OTOH is no secret */
  33128. if( len != 1 + ssl->verify_data_len ||
  33129. buf[0] != ssl->verify_data_len ||
  33130. mbedtls_ssl_safer_memcmp( buf + 1, ssl->peer_verify_data,
  33131. ssl->verify_data_len ) != 0 )
  33132. {
  33133. MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching renegotiation info" ) );
  33134. if( ( ret = mbedtls_ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
  33135. return( ret );
  33136. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  33137. }
  33138. }
  33139. else
  33140. #endif /* MBEDTLS_SSL_RENEGOTIATION */
  33141. {
  33142. if( len != 1 || buf[0] != 0x0 )
  33143. {
  33144. MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-zero length renegotiation info" ) );
  33145. if( ( ret = mbedtls_ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
  33146. return( ret );
  33147. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  33148. }
  33149. ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;
  33150. }
  33151. return( 0 );
  33152. }
  33153. #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
  33154. defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)
  33155. static int ssl_parse_signature_algorithms_ext( mbedtls_ssl_context *ssl,
  33156. const unsigned char *buf,
  33157. size_t len )
  33158. {
  33159. size_t sig_alg_list_size;
  33160. const unsigned char *p;
  33161. const unsigned char *end = buf + len;
  33162. const int *md_cur;
  33163. sig_alg_list_size = ( ( buf[0] << 8 ) | ( buf[1] ) );
  33164. if( sig_alg_list_size + 2 != len ||
  33165. sig_alg_list_size % 2 != 0 )
  33166. {
  33167. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
  33168. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  33169. }
  33170. /*
  33171. * For now, ignore the SignatureAlgorithm part and rely on offered
  33172. * ciphersuites only for that part. To be fixed later.
  33173. *
  33174. * So, just look at the HashAlgorithm part.
  33175. */
  33176. for( md_cur = ssl->conf->sig_hashes; *md_cur != MBEDTLS_MD_NONE; md_cur++ ) {
  33177. for( p = buf + 2; p < end; p += 2 ) {
  33178. if( *md_cur == (int) mbedtls_ssl_md_alg_from_hash( p[0] ) ) {
  33179. ssl->handshake->sig_alg = p[0];
  33180. goto have_sig_alg;
  33181. }
  33182. }
  33183. }
  33184. /* Some key echanges do not need signatures at all */
  33185. MBEDTLS_SSL_DEBUG_MSG( 3, ( "no signature_algorithm in common" ) );
  33186. return( 0 );
  33187. have_sig_alg:
  33188. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, signature_algorithm ext: %d",
  33189. ssl->handshake->sig_alg ) );
  33190. return( 0 );
  33191. }
  33192. #endif /* MBEDTLS_SSL_PROTO_TLS1_2 &&
  33193. MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */
  33194. #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
  33195. defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
  33196. static int ssl_parse_supported_elliptic_curves( mbedtls_ssl_context *ssl,
  33197. const unsigned char *buf,
  33198. size_t len )
  33199. {
  33200. size_t list_size, our_size;
  33201. const unsigned char *p;
  33202. const mbedtls_ecp_curve_info *curve_info, **curves;
  33203. list_size = ( ( buf[0] << 8 ) | ( buf[1] ) );
  33204. if( list_size + 2 != len ||
  33205. list_size % 2 != 0 )
  33206. {
  33207. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
  33208. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  33209. }
  33210. /* Should never happen unless client duplicates the extension */
  33211. if( ssl->handshake->curves != NULL )
  33212. {
  33213. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
  33214. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  33215. }
  33216. /* Don't allow our peer to make us allocate too much memory,
  33217. * and leave room for a final 0 */
  33218. our_size = list_size / 2 + 1;
  33219. if( our_size > MBEDTLS_ECP_DP_MAX )
  33220. our_size = MBEDTLS_ECP_DP_MAX;
  33221. if( ( curves = mbedtls_calloc( our_size, sizeof( *curves ) ) ) == NULL )
  33222. return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
  33223. ssl->handshake->curves = curves;
  33224. p = buf + 2;
  33225. while( list_size > 0 && our_size > 1 )
  33226. {
  33227. curve_info = mbedtls_ecp_curve_info_from_tls_id( ( p[0] << 8 ) | p[1] );
  33228. if( curve_info != NULL )
  33229. {
  33230. *curves++ = curve_info;
  33231. our_size--;
  33232. }
  33233. list_size -= 2;
  33234. p += 2;
  33235. }
  33236. return( 0 );
  33237. }
  33238. static int ssl_parse_supported_point_formats( mbedtls_ssl_context *ssl,
  33239. const unsigned char *buf,
  33240. size_t len )
  33241. {
  33242. size_t list_size;
  33243. const unsigned char *p;
  33244. list_size = buf[0];
  33245. if( list_size + 1 != len )
  33246. {
  33247. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
  33248. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  33249. }
  33250. p = buf + 1;
  33251. while( list_size > 0 )
  33252. {
  33253. if( p[0] == MBEDTLS_ECP_PF_UNCOMPRESSED ||
  33254. p[0] == MBEDTLS_ECP_PF_COMPRESSED )
  33255. {
  33256. #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C)
  33257. ssl->handshake->ecdh_ctx.point_format = p[0];
  33258. #endif
  33259. #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
  33260. ssl->handshake->ecjpake_ctx.point_format = p[0];
  33261. #endif
  33262. MBEDTLS_SSL_DEBUG_MSG( 4, ( "point format selected: %d", p[0] ) );
  33263. return( 0 );
  33264. }
  33265. list_size--;
  33266. p++;
  33267. }
  33268. return( 0 );
  33269. }
  33270. #endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C ||
  33271. MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
  33272. #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
  33273. static int ssl_parse_ecjpake_kkpp( mbedtls_ssl_context *ssl,
  33274. const unsigned char *buf,
  33275. size_t len )
  33276. {
  33277. int ret;
  33278. if( mbedtls_ecjpake_check( &ssl->handshake->ecjpake_ctx ) != 0 )
  33279. {
  33280. MBEDTLS_SSL_DEBUG_MSG( 3, ( "skip ecjpake kkpp extension" ) );
  33281. return( 0 );
  33282. }
  33283. if( ( ret = mbedtls_ecjpake_read_round_one( &ssl->handshake->ecjpake_ctx,
  33284. buf, len ) ) != 0 )
  33285. {
  33286. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_read_round_one", ret );
  33287. return( ret );
  33288. }
  33289. /* Only mark the extension as OK when we're sure it is */
  33290. ssl->handshake->cli_exts |= MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK;
  33291. return( 0 );
  33292. }
  33293. #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
  33294. #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
  33295. static int ssl_srv_parse_max_fragment_length_ext( mbedtls_ssl_context *ssl,
  33296. const unsigned char *buf,
  33297. size_t len )
  33298. {
  33299. if( len != 1 || buf[0] >= MBEDTLS_SSL_MAX_FRAG_LEN_INVALID )
  33300. {
  33301. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
  33302. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  33303. }
  33304. ssl->session_negotiate->mfl_code = buf[0];
  33305. return( 0 );
  33306. }
  33307. #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
  33308. #if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
  33309. static int ssl_srv_parse_truncated_hmac_ext( mbedtls_ssl_context *ssl,
  33310. const unsigned char *buf,
  33311. size_t len )
  33312. {
  33313. if( len != 0 )
  33314. {
  33315. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
  33316. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  33317. }
  33318. ((void) buf);
  33319. if( ssl->conf->trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_ENABLED )
  33320. ssl->session_negotiate->trunc_hmac = MBEDTLS_SSL_TRUNC_HMAC_ENABLED;
  33321. return( 0 );
  33322. }
  33323. #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
  33324. #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
  33325. static int ssl_srv_parse_encrypt_then_mac_ext( mbedtls_ssl_context *ssl,
  33326. const unsigned char *buf,
  33327. size_t len )
  33328. {
  33329. if( len != 0 )
  33330. {
  33331. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
  33332. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  33333. }
  33334. ((void) buf);
  33335. if( ssl->conf->encrypt_then_mac == MBEDTLS_SSL_ETM_ENABLED &&
  33336. ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_0 )
  33337. {
  33338. ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED;
  33339. }
  33340. return( 0 );
  33341. }
  33342. #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
  33343. #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
  33344. static int ssl_srv_parse_extended_ms_ext( mbedtls_ssl_context *ssl,
  33345. const unsigned char *buf,
  33346. size_t len )
  33347. {
  33348. if( len != 0 )
  33349. {
  33350. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
  33351. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  33352. }
  33353. ((void) buf);
  33354. if( ssl->conf->extended_ms == MBEDTLS_SSL_EXTENDED_MS_ENABLED &&
  33355. ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_0 )
  33356. {
  33357. ssl->handshake->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED;
  33358. }
  33359. return( 0 );
  33360. }
  33361. #endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
  33362. #if defined(MBEDTLS_SSL_SESSION_TICKETS)
  33363. static int ssl_srv_parse_session_ticket_ext( mbedtls_ssl_context *ssl,
  33364. unsigned char *buf,
  33365. size_t len )
  33366. {
  33367. int ret;
  33368. mbedtls_ssl_session session;
  33369. mbedtls_ssl_session_init( &session );
  33370. if( ssl->conf->f_ticket_parse == NULL ||
  33371. ssl->conf->f_ticket_write == NULL )
  33372. {
  33373. return( 0 );
  33374. }
  33375. /* Remember the client asked us to send a new ticket */
  33376. ssl->handshake->new_session_ticket = 1;
  33377. MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket length: %d", len ) );
  33378. if( len == 0 )
  33379. return( 0 );
  33380. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  33381. if( ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE )
  33382. {
  33383. MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket rejected: renegotiating" ) );
  33384. return( 0 );
  33385. }
  33386. #endif /* MBEDTLS_SSL_RENEGOTIATION */
  33387. /*
  33388. * Failures are ok: just ignore the ticket and proceed.
  33389. */
  33390. if( ( ret = ssl->conf->f_ticket_parse( ssl->conf->p_ticket, &session,
  33391. buf, len ) ) != 0 )
  33392. {
  33393. mbedtls_ssl_session_free( &session );
  33394. if( ret == MBEDTLS_ERR_SSL_INVALID_MAC )
  33395. MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket is not authentic" ) );
  33396. else if( ret == MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED )
  33397. MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket is expired" ) );
  33398. else
  33399. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_ticket_parse", ret );
  33400. return( 0 );
  33401. }
  33402. /*
  33403. * Keep the session ID sent by the client, since we MUST send it back to
  33404. * inform them we're accepting the ticket (RFC 5077 section 3.4)
  33405. */
  33406. session.id_len = ssl->session_negotiate->id_len;
  33407. memcpy( &session.id, ssl->session_negotiate->id, session.id_len );
  33408. mbedtls_ssl_session_free( ssl->session_negotiate );
  33409. memcpy( ssl->session_negotiate, &session, sizeof( mbedtls_ssl_session ) );
  33410. /* Zeroize instead of free as we copied the content */
  33411. ssl_srv_zeroize( &session, sizeof( mbedtls_ssl_session ) );
  33412. MBEDTLS_SSL_DEBUG_MSG( 3, ( "session successfully restored from ticket" ) );
  33413. ssl->handshake->resume = 1;
  33414. /* Don't send a new ticket after all, this one is OK */
  33415. ssl->handshake->new_session_ticket = 0;
  33416. return( 0 );
  33417. }
  33418. #endif /* MBEDTLS_SSL_SESSION_TICKETS */
  33419. #if defined(MBEDTLS_SSL_ALPN)
  33420. static int ssl_srv_parse_alpn_ext( mbedtls_ssl_context *ssl,
  33421. const unsigned char *buf, size_t len )
  33422. {
  33423. size_t list_len, cur_len, ours_len;
  33424. const unsigned char *theirs, *start, *end;
  33425. const char **ours;
  33426. /* If ALPN not configured, just ignore the extension */
  33427. if( ssl->conf->alpn_list == NULL )
  33428. return( 0 );
  33429. /*
  33430. * opaque ProtocolName<1..2^8-1>;
  33431. *
  33432. * struct {
  33433. * ProtocolName protocol_name_list<2..2^16-1>
  33434. * } ProtocolNameList;
  33435. */
  33436. /* Min length is 2 (list_len) + 1 (name_len) + 1 (name) */
  33437. if( len < 4 )
  33438. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  33439. list_len = ( buf[0] << 8 ) | buf[1];
  33440. if( list_len != len - 2 )
  33441. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  33442. /*
  33443. * Use our order of preference
  33444. */
  33445. start = buf + 2;
  33446. end = buf + len;
  33447. for( ours = ssl->conf->alpn_list; *ours != NULL; ours++ )
  33448. {
  33449. ours_len = strlen( *ours );
  33450. for( theirs = start; theirs != end; theirs += cur_len )
  33451. {
  33452. /* If the list is well formed, we should get equality first */
  33453. if( theirs > end )
  33454. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  33455. cur_len = *theirs++;
  33456. /* Empty strings MUST NOT be included */
  33457. if( cur_len == 0 )
  33458. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  33459. if( cur_len == ours_len &&
  33460. memcmp( theirs, *ours, cur_len ) == 0 )
  33461. {
  33462. ssl->alpn_chosen = *ours;
  33463. return( 0 );
  33464. }
  33465. }
  33466. }
  33467. /* If we get there, no match was found */
  33468. mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
  33469. MBEDTLS_SSL_ALERT_MSG_NO_APPLICATION_PROTOCOL );
  33470. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  33471. }
  33472. #endif /* MBEDTLS_SSL_ALPN */
  33473. /*
  33474. * Auxiliary functions for ServerHello parsing and related actions
  33475. */
  33476. #if defined(MBEDTLS_X509_CRT_PARSE_C)
  33477. /*
  33478. * Return 0 if the given key uses one of the acceptable curves, -1 otherwise
  33479. */
  33480. #if defined(MBEDTLS_ECDSA_C)
  33481. static int ssl_check_key_curve( mbedtls_pk_context *pk,
  33482. const mbedtls_ecp_curve_info **curves )
  33483. {
  33484. const mbedtls_ecp_curve_info **crv = curves;
  33485. mbedtls_ecp_group_id grp_id = mbedtls_pk_ec( *pk )->grp.id;
  33486. while( *crv != NULL )
  33487. {
  33488. if( (*crv)->grp_id == grp_id )
  33489. return( 0 );
  33490. crv++;
  33491. }
  33492. return( -1 );
  33493. }
  33494. #endif /* MBEDTLS_ECDSA_C */
  33495. /*
  33496. * Try picking a certificate for this ciphersuite,
  33497. * return 0 on success and -1 on failure.
  33498. */
  33499. static int ssl_pick_cert( mbedtls_ssl_context *ssl,
  33500. const mbedtls_ssl_ciphersuite_t * ciphersuite_info )
  33501. {
  33502. mbedtls_ssl_key_cert *cur, *list, *fallback = NULL;
  33503. mbedtls_pk_type_t pk_alg = mbedtls_ssl_get_ciphersuite_sig_pk_alg( ciphersuite_info );
  33504. uint32_t flags;
  33505. #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
  33506. if( ssl->handshake->sni_key_cert != NULL )
  33507. list = ssl->handshake->sni_key_cert;
  33508. else
  33509. #endif
  33510. list = ssl->conf->key_cert;
  33511. if( pk_alg == MBEDTLS_PK_NONE )
  33512. return( 0 );
  33513. MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite requires certificate" ) );
  33514. if( list == NULL )
  33515. {
  33516. MBEDTLS_SSL_DEBUG_MSG( 3, ( "server has no certificate" ) );
  33517. return( -1 );
  33518. }
  33519. for( cur = list; cur != NULL; cur = cur->next )
  33520. {
  33521. MBEDTLS_SSL_DEBUG_CRT( 3, "candidate certificate chain, certificate",
  33522. cur->cert );
  33523. if( ! mbedtls_pk_can_do( cur->key, pk_alg ) )
  33524. {
  33525. MBEDTLS_SSL_DEBUG_MSG( 3, ( "certificate mismatch: key type" ) );
  33526. continue;
  33527. }
  33528. /*
  33529. * This avoids sending the client a cert it'll reject based on
  33530. * keyUsage or other extensions.
  33531. *
  33532. * It also allows the user to provision different certificates for
  33533. * different uses based on keyUsage, eg if they want to avoid signing
  33534. * and decrypting with the same RSA key.
  33535. */
  33536. if( mbedtls_ssl_check_cert_usage( cur->cert, ciphersuite_info,
  33537. MBEDTLS_SSL_IS_SERVER, &flags ) != 0 )
  33538. {
  33539. MBEDTLS_SSL_DEBUG_MSG( 3, ( "certificate mismatch: "
  33540. "(extended) key usage extension" ) );
  33541. continue;
  33542. }
  33543. #if defined(MBEDTLS_ECDSA_C)
  33544. if( pk_alg == MBEDTLS_PK_ECDSA &&
  33545. ssl_check_key_curve( cur->key, ssl->handshake->curves ) != 0 )
  33546. {
  33547. MBEDTLS_SSL_DEBUG_MSG( 3, ( "certificate mismatch: elliptic curve" ) );
  33548. continue;
  33549. }
  33550. #endif
  33551. /*
  33552. * Try to select a SHA-1 certificate for pre-1.2 clients, but still
  33553. * present them a SHA-higher cert rather than failing if it's the only
  33554. * one we got that satisfies the other conditions.
  33555. */
  33556. if( ssl->minor_ver < MBEDTLS_SSL_MINOR_VERSION_3 &&
  33557. cur->cert->sig_md != MBEDTLS_MD_SHA1 )
  33558. {
  33559. if( fallback == NULL )
  33560. fallback = cur;
  33561. {
  33562. MBEDTLS_SSL_DEBUG_MSG( 3, ( "certificate not preferred: "
  33563. "sha-2 with pre-TLS 1.2 client" ) );
  33564. continue;
  33565. }
  33566. }
  33567. /* If we get there, we got a winner */
  33568. break;
  33569. }
  33570. if( cur == NULL )
  33571. cur = fallback;
  33572. /* Do not update ssl->handshake->key_cert unless there is a match */
  33573. if( cur != NULL )
  33574. {
  33575. ssl->handshake->key_cert = cur;
  33576. MBEDTLS_SSL_DEBUG_CRT( 3, "selected certificate chain, certificate",
  33577. ssl->handshake->key_cert->cert );
  33578. return( 0 );
  33579. }
  33580. return( -1 );
  33581. }
  33582. #endif /* MBEDTLS_X509_CRT_PARSE_C */
  33583. /*
  33584. * Check if a given ciphersuite is suitable for use with our config/keys/etc
  33585. * Sets ciphersuite_info only if the suite matches.
  33586. */
  33587. static int ssl_ciphersuite_match( mbedtls_ssl_context *ssl, int suite_id,
  33588. const mbedtls_ssl_ciphersuite_t **ciphersuite_info )
  33589. {
  33590. const mbedtls_ssl_ciphersuite_t *suite_info;
  33591. suite_info = mbedtls_ssl_ciphersuite_from_id( suite_id );
  33592. if( suite_info == NULL )
  33593. {
  33594. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  33595. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  33596. }
  33597. MBEDTLS_SSL_DEBUG_MSG( 3, ( "trying ciphersuite: %s", suite_info->name ) );
  33598. if( suite_info->min_minor_ver > ssl->minor_ver ||
  33599. suite_info->max_minor_ver < ssl->minor_ver )
  33600. {
  33601. MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite mismatch: version" ) );
  33602. return( 0 );
  33603. }
  33604. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  33605. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
  33606. ( suite_info->flags & MBEDTLS_CIPHERSUITE_NODTLS ) )
  33607. return( 0 );
  33608. #endif
  33609. #if defined(MBEDTLS_ARC4_C)
  33610. if( ssl->conf->arc4_disabled == MBEDTLS_SSL_ARC4_DISABLED &&
  33611. suite_info->cipher == MBEDTLS_CIPHER_ARC4_128 )
  33612. {
  33613. MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite mismatch: rc4" ) );
  33614. return( 0 );
  33615. }
  33616. #endif
  33617. #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
  33618. if( suite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE &&
  33619. ( ssl->handshake->cli_exts & MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK ) == 0 )
  33620. {
  33621. MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite mismatch: ecjpake "
  33622. "not configured or ext missing" ) );
  33623. return( 0 );
  33624. }
  33625. #endif
  33626. #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C)
  33627. if( mbedtls_ssl_ciphersuite_uses_ec( suite_info ) &&
  33628. ( ssl->handshake->curves == NULL ||
  33629. ssl->handshake->curves[0] == NULL ) )
  33630. {
  33631. MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite mismatch: "
  33632. "no common elliptic curve" ) );
  33633. return( 0 );
  33634. }
  33635. #endif
  33636. #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
  33637. /* If the ciphersuite requires a pre-shared key and we don't
  33638. * have one, skip it now rather than failing later */
  33639. if( mbedtls_ssl_ciphersuite_uses_psk( suite_info ) &&
  33640. ssl->conf->f_psk == NULL &&
  33641. ( ssl->conf->psk == NULL || ssl->conf->psk_identity == NULL ||
  33642. ssl->conf->psk_identity_len == 0 || ssl->conf->psk_len == 0 ) )
  33643. {
  33644. MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite mismatch: no pre-shared key" ) );
  33645. return( 0 );
  33646. }
  33647. #endif
  33648. #if defined(MBEDTLS_X509_CRT_PARSE_C)
  33649. /*
  33650. * Final check: if ciphersuite requires us to have a
  33651. * certificate/key of a particular type:
  33652. * - select the appropriate certificate if we have one, or
  33653. * - try the next ciphersuite if we don't
  33654. * This must be done last since we modify the key_cert list.
  33655. */
  33656. if( ssl_pick_cert( ssl, suite_info ) != 0 )
  33657. {
  33658. MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite mismatch: "
  33659. "no suitable certificate" ) );
  33660. return( 0 );
  33661. }
  33662. #endif
  33663. *ciphersuite_info = suite_info;
  33664. return( 0 );
  33665. }
  33666. #if defined(MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO)
  33667. static int ssl_parse_client_hello_v2( mbedtls_ssl_context *ssl )
  33668. {
  33669. int ret, got_common_suite;
  33670. unsigned int i, j;
  33671. size_t n;
  33672. unsigned int ciph_len, sess_len, chal_len;
  33673. unsigned char *buf, *p;
  33674. const int *ciphersuites;
  33675. const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
  33676. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse client hello v2" ) );
  33677. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  33678. if( ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE )
  33679. {
  33680. MBEDTLS_SSL_DEBUG_MSG( 1, ( "client hello v2 illegal for renegotiation" ) );
  33681. if( ( ret = mbedtls_ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
  33682. return( ret );
  33683. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  33684. }
  33685. #endif /* MBEDTLS_SSL_RENEGOTIATION */
  33686. buf = ssl->in_hdr;
  33687. MBEDTLS_SSL_DEBUG_BUF( 4, "record header", buf, 5 );
  33688. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v2, message type: %d",
  33689. buf[2] ) );
  33690. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v2, message len.: %d",
  33691. ( ( buf[0] & 0x7F ) << 8 ) | buf[1] ) );
  33692. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v2, max. version: [%d:%d]",
  33693. buf[3], buf[4] ) );
  33694. /*
  33695. * SSLv2 Client Hello
  33696. *
  33697. * Record layer:
  33698. * 0 . 1 message length
  33699. *
  33700. * SSL layer:
  33701. * 2 . 2 message type
  33702. * 3 . 4 protocol version
  33703. */
  33704. if( buf[2] != MBEDTLS_SSL_HS_CLIENT_HELLO ||
  33705. buf[3] != MBEDTLS_SSL_MAJOR_VERSION_3 )
  33706. {
  33707. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
  33708. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  33709. }
  33710. n = ( ( buf[0] << 8 ) | buf[1] ) & 0x7FFF;
  33711. if( n < 17 || n > 512 )
  33712. {
  33713. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
  33714. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  33715. }
  33716. ssl->major_ver = MBEDTLS_SSL_MAJOR_VERSION_3;
  33717. ssl->minor_ver = ( buf[4] <= ssl->conf->max_minor_ver )
  33718. ? buf[4] : ssl->conf->max_minor_ver;
  33719. if( ssl->minor_ver < ssl->conf->min_minor_ver )
  33720. {
  33721. MBEDTLS_SSL_DEBUG_MSG( 1, ( "client only supports ssl smaller than minimum"
  33722. " [%d:%d] < [%d:%d]",
  33723. ssl->major_ver, ssl->minor_ver,
  33724. ssl->conf->min_major_ver, ssl->conf->min_minor_ver ) );
  33725. mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
  33726. MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION );
  33727. return( MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION );
  33728. }
  33729. ssl->handshake->max_major_ver = buf[3];
  33730. ssl->handshake->max_minor_ver = buf[4];
  33731. if( ( ret = mbedtls_ssl_fetch_input( ssl, 2 + n ) ) != 0 )
  33732. {
  33733. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_fetch_input", ret );
  33734. return( ret );
  33735. }
  33736. ssl->handshake->update_checksum( ssl, buf + 2, n );
  33737. buf = ssl->in_msg;
  33738. n = ssl->in_left - 5;
  33739. /*
  33740. * 0 . 1 ciphersuitelist length
  33741. * 2 . 3 session id length
  33742. * 4 . 5 challenge length
  33743. * 6 . .. ciphersuitelist
  33744. * .. . .. session id
  33745. * .. . .. challenge
  33746. */
  33747. MBEDTLS_SSL_DEBUG_BUF( 4, "record contents", buf, n );
  33748. ciph_len = ( buf[0] << 8 ) | buf[1];
  33749. sess_len = ( buf[2] << 8 ) | buf[3];
  33750. chal_len = ( buf[4] << 8 ) | buf[5];
  33751. MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciph_len: %d, sess_len: %d, chal_len: %d",
  33752. ciph_len, sess_len, chal_len ) );
  33753. /*
  33754. * Make sure each parameter length is valid
  33755. */
  33756. if( ciph_len < 3 || ( ciph_len % 3 ) != 0 )
  33757. {
  33758. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
  33759. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  33760. }
  33761. if( sess_len > 32 )
  33762. {
  33763. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
  33764. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  33765. }
  33766. if( chal_len < 8 || chal_len > 32 )
  33767. {
  33768. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
  33769. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  33770. }
  33771. if( n != 6 + ciph_len + sess_len + chal_len )
  33772. {
  33773. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
  33774. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  33775. }
  33776. MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, ciphersuitelist",
  33777. buf + 6, ciph_len );
  33778. MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, session id",
  33779. buf + 6 + ciph_len, sess_len );
  33780. MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, challenge",
  33781. buf + 6 + ciph_len + sess_len, chal_len );
  33782. p = buf + 6 + ciph_len;
  33783. ssl->session_negotiate->id_len = sess_len;
  33784. memset( ssl->session_negotiate->id, 0,
  33785. sizeof( ssl->session_negotiate->id ) );
  33786. memcpy( ssl->session_negotiate->id, p, ssl->session_negotiate->id_len );
  33787. p += sess_len;
  33788. memset( ssl->handshake->randbytes, 0, 64 );
  33789. memcpy( ssl->handshake->randbytes + 32 - chal_len, p, chal_len );
  33790. /*
  33791. * Check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV
  33792. */
  33793. for( i = 0, p = buf + 6; i < ciph_len; i += 3, p += 3 )
  33794. {
  33795. if( p[0] == 0 && p[1] == 0 && p[2] == MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO )
  33796. {
  33797. MBEDTLS_SSL_DEBUG_MSG( 3, ( "received TLS_EMPTY_RENEGOTIATION_INFO " ) );
  33798. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  33799. if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )
  33800. {
  33801. MBEDTLS_SSL_DEBUG_MSG( 1, ( "received RENEGOTIATION SCSV "
  33802. "during renegotiation" ) );
  33803. if( ( ret = mbedtls_ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
  33804. return( ret );
  33805. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  33806. }
  33807. #endif /* MBEDTLS_SSL_RENEGOTIATION */
  33808. ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;
  33809. break;
  33810. }
  33811. }
  33812. #if defined(MBEDTLS_SSL_FALLBACK_SCSV)
  33813. for( i = 0, p = buf + 6; i < ciph_len; i += 3, p += 3 )
  33814. {
  33815. if( p[0] == 0 &&
  33816. p[1] == (unsigned char)( ( MBEDTLS_SSL_FALLBACK_SCSV_VALUE >> 8 ) & 0xff ) &&
  33817. p[2] == (unsigned char)( ( MBEDTLS_SSL_FALLBACK_SCSV_VALUE ) & 0xff ) )
  33818. {
  33819. MBEDTLS_SSL_DEBUG_MSG( 3, ( "received FALLBACK_SCSV" ) );
  33820. if( ssl->minor_ver < ssl->conf->max_minor_ver )
  33821. {
  33822. MBEDTLS_SSL_DEBUG_MSG( 1, ( "inapropriate fallback" ) );
  33823. mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
  33824. MBEDTLS_SSL_ALERT_MSG_INAPROPRIATE_FALLBACK );
  33825. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  33826. }
  33827. break;
  33828. }
  33829. }
  33830. #endif /* MBEDTLS_SSL_FALLBACK_SCSV */
  33831. got_common_suite = 0;
  33832. ciphersuites = ssl->conf->ciphersuite_list[ssl->minor_ver];
  33833. ciphersuite_info = NULL;
  33834. #if defined(MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE)
  33835. for( j = 0, p = buf + 6; j < ciph_len; j += 3, p += 3 )
  33836. {
  33837. for( i = 0; ciphersuites[i] != 0; i++ )
  33838. #else
  33839. for( i = 0; ciphersuites[i] != 0; i++ )
  33840. {
  33841. for( j = 0, p = buf + 6; j < ciph_len; j += 3, p += 3 )
  33842. #endif
  33843. {
  33844. if( p[0] != 0 ||
  33845. p[1] != ( ( ciphersuites[i] >> 8 ) & 0xFF ) ||
  33846. p[2] != ( ( ciphersuites[i] ) & 0xFF ) )
  33847. continue;
  33848. got_common_suite = 1;
  33849. if( ( ret = ssl_ciphersuite_match( ssl, ciphersuites[i],
  33850. &ciphersuite_info ) ) != 0 )
  33851. return( ret );
  33852. if( ciphersuite_info != NULL )
  33853. goto have_ciphersuite_v2;
  33854. }
  33855. }
  33856. if( got_common_suite )
  33857. {
  33858. MBEDTLS_SSL_DEBUG_MSG( 1, ( "got ciphersuites in common, "
  33859. "but none of them usable" ) );
  33860. return( MBEDTLS_ERR_SSL_NO_USABLE_CIPHERSUITE );
  33861. }
  33862. else
  33863. {
  33864. MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no ciphersuites in common" ) );
  33865. return( MBEDTLS_ERR_SSL_NO_CIPHER_CHOSEN );
  33866. }
  33867. have_ciphersuite_v2:
  33868. MBEDTLS_SSL_DEBUG_MSG( 2, ( "selected ciphersuite: %s", ciphersuite_info->name ) );
  33869. ssl->session_negotiate->ciphersuite = ciphersuites[i];
  33870. ssl->transform_negotiate->ciphersuite_info = ciphersuite_info;
  33871. mbedtls_ssl_optimize_checksum( ssl, ssl->transform_negotiate->ciphersuite_info );
  33872. /*
  33873. * SSLv2 Client Hello relevant renegotiation security checks
  33874. */
  33875. if( ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
  33876. ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE )
  33877. {
  33878. MBEDTLS_SSL_DEBUG_MSG( 1, ( "legacy renegotiation, breaking off handshake" ) );
  33879. if( ( ret = mbedtls_ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
  33880. return( ret );
  33881. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  33882. }
  33883. ssl->in_left = 0;
  33884. ssl->state++;
  33885. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse client hello v2" ) );
  33886. return( 0 );
  33887. }
  33888. #endif /* MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO */
  33889. static int ssl_parse_client_hello( mbedtls_ssl_context *ssl )
  33890. {
  33891. int ret, got_common_suite;
  33892. size_t i, j;
  33893. size_t ciph_offset, comp_offset, ext_offset;
  33894. size_t msg_len, ciph_len, sess_len, comp_len, ext_len;
  33895. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  33896. size_t cookie_offset, cookie_len;
  33897. #endif
  33898. unsigned char *buf, *p, *ext;
  33899. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  33900. int renegotiation_info_seen = 0;
  33901. #endif
  33902. int handshake_failure = 0;
  33903. const int *ciphersuites;
  33904. const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
  33905. int major, minor;
  33906. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse client hello" ) );
  33907. #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
  33908. read_record_header:
  33909. #endif
  33910. /*
  33911. * If renegotiating, then the input was read with mbedtls_ssl_read_record(),
  33912. * otherwise read it ourselves manually in order to support SSLv2
  33913. * ClientHello, which doesn't use the same record layer format.
  33914. */
  33915. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  33916. if( ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE )
  33917. #endif
  33918. {
  33919. if( ( ret = mbedtls_ssl_fetch_input( ssl, 5 ) ) != 0 )
  33920. {
  33921. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_fetch_input", ret );
  33922. return( ret );
  33923. }
  33924. }
  33925. buf = ssl->in_hdr;
  33926. #if defined(MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO)
  33927. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  33928. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_STREAM )
  33929. #endif
  33930. if( ( buf[0] & 0x80 ) != 0 )
  33931. return ssl_parse_client_hello_v2( ssl );
  33932. #endif
  33933. MBEDTLS_SSL_DEBUG_BUF( 4, "record header", buf, mbedtls_ssl_hdr_len( ssl ) );
  33934. /*
  33935. * SSLv3/TLS Client Hello
  33936. *
  33937. * Record layer:
  33938. * 0 . 0 message type
  33939. * 1 . 2 protocol version
  33940. * 3 . 11 DTLS: epoch + record sequence number
  33941. * 3 . 4 message length
  33942. */
  33943. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, message type: %d",
  33944. buf[0] ) );
  33945. if( buf[0] != MBEDTLS_SSL_MSG_HANDSHAKE )
  33946. {
  33947. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
  33948. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  33949. }
  33950. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, message len.: %d",
  33951. ( ssl->in_len[0] << 8 ) | ssl->in_len[1] ) );
  33952. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, protocol version: [%d:%d]",
  33953. buf[1], buf[2] ) );
  33954. mbedtls_ssl_read_version( &major, &minor, ssl->conf->transport, buf + 1 );
  33955. /* According to RFC 5246 Appendix E.1, the version here is typically
  33956. * "{03,00}, the lowest version number supported by the client, [or] the
  33957. * value of ClientHello.client_version", so the only meaningful check here
  33958. * is the major version shouldn't be less than 3 */
  33959. if( major < MBEDTLS_SSL_MAJOR_VERSION_3 )
  33960. {
  33961. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
  33962. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  33963. }
  33964. /* For DTLS if this is the initial handshake, remember the client sequence
  33965. * number to use it in our next message (RFC 6347 4.2.1) */
  33966. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  33967. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM
  33968. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  33969. && ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE
  33970. #endif
  33971. )
  33972. {
  33973. /* Epoch should be 0 for initial handshakes */
  33974. if( ssl->in_ctr[0] != 0 || ssl->in_ctr[1] != 0 )
  33975. {
  33976. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
  33977. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  33978. }
  33979. memcpy( ssl->out_ctr + 2, ssl->in_ctr + 2, 6 );
  33980. #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
  33981. if( mbedtls_ssl_dtls_replay_check( ssl ) != 0 )
  33982. {
  33983. MBEDTLS_SSL_DEBUG_MSG( 1, ( "replayed record, discarding" ) );
  33984. ssl->next_record_offset = 0;
  33985. ssl->in_left = 0;
  33986. goto read_record_header;
  33987. }
  33988. /* No MAC to check yet, so we can update right now */
  33989. mbedtls_ssl_dtls_replay_update( ssl );
  33990. #endif
  33991. }
  33992. #endif /* MBEDTLS_SSL_PROTO_DTLS */
  33993. msg_len = ( ssl->in_len[0] << 8 ) | ssl->in_len[1];
  33994. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  33995. if( ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE )
  33996. {
  33997. /* Set by mbedtls_ssl_read_record() */
  33998. msg_len = ssl->in_hslen;
  33999. }
  34000. else
  34001. #endif
  34002. {
  34003. if( msg_len > MBEDTLS_SSL_MAX_CONTENT_LEN )
  34004. {
  34005. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
  34006. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  34007. }
  34008. if( ( ret = mbedtls_ssl_fetch_input( ssl, mbedtls_ssl_hdr_len( ssl ) + msg_len ) ) != 0 )
  34009. {
  34010. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_fetch_input", ret );
  34011. return( ret );
  34012. }
  34013. /* Done reading this record, get ready for the next one */
  34014. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  34015. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
  34016. ssl->next_record_offset = msg_len + mbedtls_ssl_hdr_len( ssl );
  34017. else
  34018. #endif
  34019. ssl->in_left = 0;
  34020. }
  34021. buf = ssl->in_msg;
  34022. MBEDTLS_SSL_DEBUG_BUF( 4, "record contents", buf, msg_len );
  34023. ssl->handshake->update_checksum( ssl, buf, msg_len );
  34024. /*
  34025. * Handshake layer:
  34026. * 0 . 0 handshake type
  34027. * 1 . 3 handshake length
  34028. * 4 . 5 DTLS only: message seqence number
  34029. * 6 . 8 DTLS only: fragment offset
  34030. * 9 . 11 DTLS only: fragment length
  34031. */
  34032. if( msg_len < mbedtls_ssl_hs_hdr_len( ssl ) )
  34033. {
  34034. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
  34035. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  34036. }
  34037. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, handshake type: %d", buf[0] ) );
  34038. if( buf[0] != MBEDTLS_SSL_HS_CLIENT_HELLO )
  34039. {
  34040. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
  34041. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  34042. }
  34043. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, handshake len.: %d",
  34044. ( buf[1] << 16 ) | ( buf[2] << 8 ) | buf[3] ) );
  34045. /* We don't support fragmentation of ClientHello (yet?) */
  34046. if( buf[1] != 0 ||
  34047. msg_len != mbedtls_ssl_hs_hdr_len( ssl ) + ( ( buf[2] << 8 ) | buf[3] ) )
  34048. {
  34049. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
  34050. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  34051. }
  34052. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  34053. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
  34054. {
  34055. /*
  34056. * Copy the client's handshake message_seq on initial handshakes,
  34057. * check sequence number on renego.
  34058. */
  34059. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  34060. if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )
  34061. {
  34062. /* This couldn't be done in ssl_prepare_handshake_record() */
  34063. unsigned int cli_msg_seq = ( ssl->in_msg[4] << 8 ) |
  34064. ssl->in_msg[5];
  34065. if( cli_msg_seq != ssl->handshake->in_msg_seq )
  34066. {
  34067. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message_seq: "
  34068. "%d (expected %d)", cli_msg_seq,
  34069. ssl->handshake->in_msg_seq ) );
  34070. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  34071. }
  34072. ssl->handshake->in_msg_seq++;
  34073. }
  34074. else
  34075. #endif
  34076. {
  34077. unsigned int cli_msg_seq = ( ssl->in_msg[4] << 8 ) |
  34078. ssl->in_msg[5];
  34079. ssl->handshake->out_msg_seq = cli_msg_seq;
  34080. ssl->handshake->in_msg_seq = cli_msg_seq + 1;
  34081. }
  34082. /*
  34083. * For now we don't support fragmentation, so make sure
  34084. * fragment_offset == 0 and fragment_length == length
  34085. */
  34086. if( ssl->in_msg[6] != 0 || ssl->in_msg[7] != 0 || ssl->in_msg[8] != 0 ||
  34087. memcmp( ssl->in_msg + 1, ssl->in_msg + 9, 3 ) != 0 )
  34088. {
  34089. MBEDTLS_SSL_DEBUG_MSG( 1, ( "ClientHello fragmentation not supported" ) );
  34090. return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
  34091. }
  34092. }
  34093. #endif /* MBEDTLS_SSL_PROTO_DTLS */
  34094. buf += mbedtls_ssl_hs_hdr_len( ssl );
  34095. msg_len -= mbedtls_ssl_hs_hdr_len( ssl );
  34096. /*
  34097. * ClientHello layer:
  34098. * 0 . 1 protocol version
  34099. * 2 . 33 random bytes (starting with 4 bytes of Unix time)
  34100. * 34 . 35 session id length (1 byte)
  34101. * 35 . 34+x session id
  34102. * 35+x . 35+x DTLS only: cookie length (1 byte)
  34103. * 36+x . .. DTLS only: cookie
  34104. * .. . .. ciphersuite list length (2 bytes)
  34105. * .. . .. ciphersuite list
  34106. * .. . .. compression alg. list length (1 byte)
  34107. * .. . .. compression alg. list
  34108. * .. . .. extensions length (2 bytes, optional)
  34109. * .. . .. extensions (optional)
  34110. */
  34111. /*
  34112. * Minimal length (with everything empty and extensions ommitted) is
  34113. * 2 + 32 + 1 + 2 + 1 = 38 bytes. Check that first, so that we can
  34114. * read at least up to session id length without worrying.
  34115. */
  34116. if( msg_len < 38 )
  34117. {
  34118. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
  34119. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  34120. }
  34121. /*
  34122. * Check and save the protocol version
  34123. */
  34124. MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, version", buf, 2 );
  34125. mbedtls_ssl_read_version( &ssl->major_ver, &ssl->minor_ver,
  34126. ssl->conf->transport, buf );
  34127. ssl->handshake->max_major_ver = ssl->major_ver;
  34128. ssl->handshake->max_minor_ver = ssl->minor_ver;
  34129. if( ssl->major_ver < ssl->conf->min_major_ver ||
  34130. ssl->minor_ver < ssl->conf->min_minor_ver )
  34131. {
  34132. MBEDTLS_SSL_DEBUG_MSG( 1, ( "client only supports ssl smaller than minimum"
  34133. " [%d:%d] < [%d:%d]",
  34134. ssl->major_ver, ssl->minor_ver,
  34135. ssl->conf->min_major_ver, ssl->conf->min_minor_ver ) );
  34136. mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
  34137. MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION );
  34138. return( MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION );
  34139. }
  34140. if( ssl->major_ver > ssl->conf->max_major_ver )
  34141. {
  34142. ssl->major_ver = ssl->conf->max_major_ver;
  34143. ssl->minor_ver = ssl->conf->max_minor_ver;
  34144. }
  34145. else if( ssl->minor_ver > ssl->conf->max_minor_ver )
  34146. ssl->minor_ver = ssl->conf->max_minor_ver;
  34147. /*
  34148. * Save client random (inc. Unix time)
  34149. */
  34150. MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, random bytes", buf + 2, 32 );
  34151. memcpy( ssl->handshake->randbytes, buf + 2, 32 );
  34152. /*
  34153. * Check the session ID length and save session ID
  34154. */
  34155. sess_len = buf[34];
  34156. if( sess_len > sizeof( ssl->session_negotiate->id ) ||
  34157. sess_len + 34 + 2 > msg_len ) /* 2 for cipherlist length field */
  34158. {
  34159. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
  34160. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  34161. }
  34162. MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, session id", buf + 35, sess_len );
  34163. ssl->session_negotiate->id_len = sess_len;
  34164. memset( ssl->session_negotiate->id, 0,
  34165. sizeof( ssl->session_negotiate->id ) );
  34166. memcpy( ssl->session_negotiate->id, buf + 35,
  34167. ssl->session_negotiate->id_len );
  34168. /*
  34169. * Check the cookie length and content
  34170. */
  34171. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  34172. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
  34173. {
  34174. cookie_offset = 35 + sess_len;
  34175. cookie_len = buf[cookie_offset];
  34176. if( cookie_offset + 1 + cookie_len + 2 > msg_len )
  34177. {
  34178. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
  34179. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  34180. }
  34181. MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, cookie",
  34182. buf + cookie_offset + 1, cookie_len );
  34183. #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
  34184. if( ssl->conf->f_cookie_check != NULL
  34185. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  34186. && ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE
  34187. #endif
  34188. )
  34189. {
  34190. if( ssl->conf->f_cookie_check( ssl->conf->p_cookie,
  34191. buf + cookie_offset + 1, cookie_len,
  34192. ssl->cli_id, ssl->cli_id_len ) != 0 )
  34193. {
  34194. MBEDTLS_SSL_DEBUG_MSG( 2, ( "cookie verification failed" ) );
  34195. ssl->handshake->verify_cookie_len = 1;
  34196. }
  34197. else
  34198. {
  34199. MBEDTLS_SSL_DEBUG_MSG( 2, ( "cookie verification passed" ) );
  34200. ssl->handshake->verify_cookie_len = 0;
  34201. }
  34202. }
  34203. else
  34204. #endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
  34205. {
  34206. /* We know we didn't send a cookie, so it should be empty */
  34207. if( cookie_len != 0 )
  34208. {
  34209. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
  34210. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  34211. }
  34212. MBEDTLS_SSL_DEBUG_MSG( 2, ( "cookie verification skipped" ) );
  34213. }
  34214. /*
  34215. * Check the ciphersuitelist length (will be parsed later)
  34216. */
  34217. ciph_offset = cookie_offset + 1 + cookie_len;
  34218. }
  34219. else
  34220. #endif /* MBEDTLS_SSL_PROTO_DTLS */
  34221. ciph_offset = 35 + sess_len;
  34222. ciph_len = ( buf[ciph_offset + 0] << 8 )
  34223. | ( buf[ciph_offset + 1] );
  34224. if( ciph_len < 2 ||
  34225. ciph_len + 2 + ciph_offset + 1 > msg_len || /* 1 for comp. alg. len */
  34226. ( ciph_len % 2 ) != 0 )
  34227. {
  34228. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
  34229. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  34230. }
  34231. MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, ciphersuitelist",
  34232. buf + ciph_offset + 2, ciph_len );
  34233. /*
  34234. * Check the compression algorithms length and pick one
  34235. */
  34236. comp_offset = ciph_offset + 2 + ciph_len;
  34237. comp_len = buf[comp_offset];
  34238. if( comp_len < 1 ||
  34239. comp_len > 16 ||
  34240. comp_len + comp_offset + 1 > msg_len )
  34241. {
  34242. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
  34243. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  34244. }
  34245. MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, compression",
  34246. buf + comp_offset + 1, comp_len );
  34247. ssl->session_negotiate->compression = MBEDTLS_SSL_COMPRESS_NULL;
  34248. #if defined(MBEDTLS_ZLIB_SUPPORT)
  34249. for( i = 0; i < comp_len; ++i )
  34250. {
  34251. if( buf[comp_offset + 1 + i] == MBEDTLS_SSL_COMPRESS_DEFLATE )
  34252. {
  34253. ssl->session_negotiate->compression = MBEDTLS_SSL_COMPRESS_DEFLATE;
  34254. break;
  34255. }
  34256. }
  34257. #endif
  34258. /* See comments in ssl_write_client_hello() */
  34259. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  34260. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
  34261. ssl->session_negotiate->compression = MBEDTLS_SSL_COMPRESS_NULL;
  34262. #endif
  34263. /*
  34264. * Check the extension length
  34265. */
  34266. ext_offset = comp_offset + 1 + comp_len;
  34267. if( msg_len > ext_offset )
  34268. {
  34269. if( msg_len < ext_offset + 2 )
  34270. {
  34271. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
  34272. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  34273. }
  34274. ext_len = ( buf[ext_offset + 0] << 8 )
  34275. | ( buf[ext_offset + 1] );
  34276. if( ( ext_len > 0 && ext_len < 4 ) ||
  34277. msg_len != ext_offset + 2 + ext_len )
  34278. {
  34279. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
  34280. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  34281. }
  34282. }
  34283. else
  34284. ext_len = 0;
  34285. ext = buf + ext_offset + 2;
  34286. MBEDTLS_SSL_DEBUG_BUF( 3, "client hello extensions", ext, ext_len );
  34287. while( ext_len != 0 )
  34288. {
  34289. unsigned int ext_id = ( ( ext[0] << 8 )
  34290. | ( ext[1] ) );
  34291. unsigned int ext_size = ( ( ext[2] << 8 )
  34292. | ( ext[3] ) );
  34293. if( ext_size + 4 > ext_len )
  34294. {
  34295. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
  34296. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  34297. }
  34298. switch( ext_id )
  34299. {
  34300. #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
  34301. case MBEDTLS_TLS_EXT_SERVERNAME:
  34302. MBEDTLS_SSL_DEBUG_MSG( 3, ( "found ServerName extension" ) );
  34303. if( ssl->conf->f_sni == NULL )
  34304. break;
  34305. ret = ssl_parse_servername_ext( ssl, ext + 4, ext_size );
  34306. if( ret != 0 )
  34307. return( ret );
  34308. break;
  34309. #endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
  34310. case MBEDTLS_TLS_EXT_RENEGOTIATION_INFO:
  34311. MBEDTLS_SSL_DEBUG_MSG( 3, ( "found renegotiation extension" ) );
  34312. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  34313. renegotiation_info_seen = 1;
  34314. #endif
  34315. ret = ssl_srv_parse_renegotiation_info( ssl, ext + 4, ext_size );
  34316. if( ret != 0 )
  34317. return( ret );
  34318. break;
  34319. #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
  34320. defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)
  34321. case MBEDTLS_TLS_EXT_SIG_ALG:
  34322. MBEDTLS_SSL_DEBUG_MSG( 3, ( "found signature_algorithms extension" ) );
  34323. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  34324. if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )
  34325. break;
  34326. #endif
  34327. ret = ssl_parse_signature_algorithms_ext( ssl, ext + 4, ext_size );
  34328. if( ret != 0 )
  34329. return( ret );
  34330. break;
  34331. #endif /* MBEDTLS_SSL_PROTO_TLS1_2 &&
  34332. MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */
  34333. #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
  34334. defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
  34335. case MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES:
  34336. MBEDTLS_SSL_DEBUG_MSG( 3, ( "found supported elliptic curves extension" ) );
  34337. ret = ssl_parse_supported_elliptic_curves( ssl, ext + 4, ext_size );
  34338. if( ret != 0 )
  34339. return( ret );
  34340. break;
  34341. case MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS:
  34342. MBEDTLS_SSL_DEBUG_MSG( 3, ( "found supported point formats extension" ) );
  34343. ssl->handshake->cli_exts |= MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT;
  34344. ret = ssl_parse_supported_point_formats( ssl, ext + 4, ext_size );
  34345. if( ret != 0 )
  34346. return( ret );
  34347. break;
  34348. #endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C ||
  34349. MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
  34350. #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
  34351. case MBEDTLS_TLS_EXT_ECJPAKE_KKPP:
  34352. MBEDTLS_SSL_DEBUG_MSG( 3, ( "found ecjpake kkpp extension" ) );
  34353. ret = ssl_parse_ecjpake_kkpp( ssl, ext + 4, ext_size );
  34354. if( ret != 0 )
  34355. return( ret );
  34356. break;
  34357. #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
  34358. #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
  34359. case MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH:
  34360. MBEDTLS_SSL_DEBUG_MSG( 3, ( "found max fragment length extension" ) );
  34361. ret = ssl_srv_parse_max_fragment_length_ext( ssl, ext + 4, ext_size );
  34362. if( ret != 0 )
  34363. return( ret );
  34364. break;
  34365. #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
  34366. #if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
  34367. case MBEDTLS_TLS_EXT_TRUNCATED_HMAC:
  34368. MBEDTLS_SSL_DEBUG_MSG( 3, ( "found truncated hmac extension" ) );
  34369. ret = ssl_srv_parse_truncated_hmac_ext( ssl, ext + 4, ext_size );
  34370. if( ret != 0 )
  34371. return( ret );
  34372. break;
  34373. #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
  34374. #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
  34375. case MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC:
  34376. MBEDTLS_SSL_DEBUG_MSG( 3, ( "found encrypt then mac extension" ) );
  34377. ret = ssl_srv_parse_encrypt_then_mac_ext( ssl, ext + 4, ext_size );
  34378. if( ret != 0 )
  34379. return( ret );
  34380. break;
  34381. #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
  34382. #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
  34383. case MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET:
  34384. MBEDTLS_SSL_DEBUG_MSG( 3, ( "found extended master secret extension" ) );
  34385. ret = ssl_srv_parse_extended_ms_ext( ssl, ext + 4, ext_size );
  34386. if( ret != 0 )
  34387. return( ret );
  34388. break;
  34389. #endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
  34390. #if defined(MBEDTLS_SSL_SESSION_TICKETS)
  34391. case MBEDTLS_TLS_EXT_SESSION_TICKET:
  34392. MBEDTLS_SSL_DEBUG_MSG( 3, ( "found session ticket extension" ) );
  34393. ret = ssl_srv_parse_session_ticket_ext( ssl, ext + 4, ext_size );
  34394. if( ret != 0 )
  34395. return( ret );
  34396. break;
  34397. #endif /* MBEDTLS_SSL_SESSION_TICKETS */
  34398. #if defined(MBEDTLS_SSL_ALPN)
  34399. case MBEDTLS_TLS_EXT_ALPN:
  34400. MBEDTLS_SSL_DEBUG_MSG( 3, ( "found alpn extension" ) );
  34401. ret = ssl_srv_parse_alpn_ext( ssl, ext + 4, ext_size );
  34402. if( ret != 0 )
  34403. return( ret );
  34404. break;
  34405. #endif /* MBEDTLS_SSL_SESSION_TICKETS */
  34406. default:
  34407. MBEDTLS_SSL_DEBUG_MSG( 3, ( "unknown extension found: %d (ignoring)",
  34408. ext_id ) );
  34409. }
  34410. ext_len -= 4 + ext_size;
  34411. ext += 4 + ext_size;
  34412. if( ext_len > 0 && ext_len < 4 )
  34413. {
  34414. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
  34415. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  34416. }
  34417. }
  34418. #if defined(MBEDTLS_SSL_FALLBACK_SCSV)
  34419. for( i = 0, p = buf + 41 + sess_len; i < ciph_len; i += 2, p += 2 )
  34420. {
  34421. if( p[0] == (unsigned char)( ( MBEDTLS_SSL_FALLBACK_SCSV_VALUE >> 8 ) & 0xff ) &&
  34422. p[1] == (unsigned char)( ( MBEDTLS_SSL_FALLBACK_SCSV_VALUE ) & 0xff ) )
  34423. {
  34424. MBEDTLS_SSL_DEBUG_MSG( 2, ( "received FALLBACK_SCSV" ) );
  34425. if( ssl->minor_ver < ssl->conf->max_minor_ver )
  34426. {
  34427. MBEDTLS_SSL_DEBUG_MSG( 1, ( "inapropriate fallback" ) );
  34428. mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
  34429. MBEDTLS_SSL_ALERT_MSG_INAPROPRIATE_FALLBACK );
  34430. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  34431. }
  34432. break;
  34433. }
  34434. }
  34435. #endif /* MBEDTLS_SSL_FALLBACK_SCSV */
  34436. /*
  34437. * Check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV
  34438. */
  34439. for( i = 0, p = buf + ciph_offset + 2; i < ciph_len; i += 2, p += 2 )
  34440. {
  34441. if( p[0] == 0 && p[1] == MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO )
  34442. {
  34443. MBEDTLS_SSL_DEBUG_MSG( 3, ( "received TLS_EMPTY_RENEGOTIATION_INFO " ) );
  34444. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  34445. if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )
  34446. {
  34447. MBEDTLS_SSL_DEBUG_MSG( 1, ( "received RENEGOTIATION SCSV during renegotiation" ) );
  34448. if( ( ret = mbedtls_ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
  34449. return( ret );
  34450. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  34451. }
  34452. #endif
  34453. ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;
  34454. break;
  34455. }
  34456. }
  34457. /*
  34458. * Renegotiation security checks
  34459. */
  34460. if( ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION &&
  34461. ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE )
  34462. {
  34463. MBEDTLS_SSL_DEBUG_MSG( 1, ( "legacy renegotiation, breaking off handshake" ) );
  34464. handshake_failure = 1;
  34465. }
  34466. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  34467. else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
  34468. ssl->secure_renegotiation == MBEDTLS_SSL_SECURE_RENEGOTIATION &&
  34469. renegotiation_info_seen == 0 )
  34470. {
  34471. MBEDTLS_SSL_DEBUG_MSG( 1, ( "renegotiation_info extension missing (secure)" ) );
  34472. handshake_failure = 1;
  34473. }
  34474. else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
  34475. ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
  34476. ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION )
  34477. {
  34478. MBEDTLS_SSL_DEBUG_MSG( 1, ( "legacy renegotiation not allowed" ) );
  34479. handshake_failure = 1;
  34480. }
  34481. else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
  34482. ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
  34483. renegotiation_info_seen == 1 )
  34484. {
  34485. MBEDTLS_SSL_DEBUG_MSG( 1, ( "renegotiation_info extension present (legacy)" ) );
  34486. handshake_failure = 1;
  34487. }
  34488. #endif /* MBEDTLS_SSL_RENEGOTIATION */
  34489. if( handshake_failure == 1 )
  34490. {
  34491. if( ( ret = mbedtls_ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
  34492. return( ret );
  34493. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  34494. }
  34495. /*
  34496. * Search for a matching ciphersuite
  34497. * (At the end because we need information from the EC-based extensions
  34498. * and certificate from the SNI callback triggered by the SNI extension.)
  34499. */
  34500. got_common_suite = 0;
  34501. ciphersuites = ssl->conf->ciphersuite_list[ssl->minor_ver];
  34502. ciphersuite_info = NULL;
  34503. #if defined(MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE)
  34504. for( j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2 )
  34505. {
  34506. for( i = 0; ciphersuites[i] != 0; i++ )
  34507. #else
  34508. for( i = 0; ciphersuites[i] != 0; i++ )
  34509. {
  34510. for( j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2 )
  34511. #endif
  34512. {
  34513. if( p[0] != ( ( ciphersuites[i] >> 8 ) & 0xFF ) ||
  34514. p[1] != ( ( ciphersuites[i] ) & 0xFF ) )
  34515. continue;
  34516. got_common_suite = 1;
  34517. if( ( ret = ssl_ciphersuite_match( ssl, ciphersuites[i],
  34518. &ciphersuite_info ) ) != 0 )
  34519. return( ret );
  34520. if( ciphersuite_info != NULL )
  34521. goto have_ciphersuite;
  34522. }
  34523. }
  34524. if( got_common_suite )
  34525. {
  34526. MBEDTLS_SSL_DEBUG_MSG( 1, ( "got ciphersuites in common, "
  34527. "but none of them usable" ) );
  34528. mbedtls_ssl_send_fatal_handshake_failure( ssl );
  34529. return( MBEDTLS_ERR_SSL_NO_USABLE_CIPHERSUITE );
  34530. }
  34531. else
  34532. {
  34533. MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no ciphersuites in common" ) );
  34534. mbedtls_ssl_send_fatal_handshake_failure( ssl );
  34535. for( j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2 ) {
  34536. int code = (p[0] & 0xFF) << 8 | (p[1] & 0xFF);
  34537. MBEDTLS_SSL_DEBUG_MSG( 1, ( "Client cipher %s, 0x%04X", mbedtls_ssl_get_ciphersuite_name(code), code));
  34538. }
  34539. return( MBEDTLS_ERR_SSL_NO_CIPHER_CHOSEN );
  34540. }
  34541. have_ciphersuite:
  34542. MBEDTLS_SSL_DEBUG_MSG( 2, ( "selected ciphersuite: %s", ciphersuite_info->name ) );
  34543. ssl->session_negotiate->ciphersuite = ciphersuites[i];
  34544. ssl->transform_negotiate->ciphersuite_info = ciphersuite_info;
  34545. mbedtls_ssl_optimize_checksum( ssl, ssl->transform_negotiate->ciphersuite_info );
  34546. ssl->state++;
  34547. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  34548. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
  34549. mbedtls_ssl_recv_flight_completed( ssl );
  34550. #endif
  34551. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse client hello" ) );
  34552. return( 0 );
  34553. }
  34554. #if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
  34555. static void ssl_srv_write_truncated_hmac_ext( mbedtls_ssl_context *ssl,
  34556. unsigned char *buf,
  34557. size_t *olen )
  34558. {
  34559. unsigned char *p = buf;
  34560. if( ssl->session_negotiate->trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_DISABLED )
  34561. {
  34562. *olen = 0;
  34563. return;
  34564. }
  34565. MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, adding truncated hmac extension" ) );
  34566. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_TRUNCATED_HMAC >> 8 ) & 0xFF );
  34567. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_TRUNCATED_HMAC ) & 0xFF );
  34568. *p++ = 0x00;
  34569. *p++ = 0x00;
  34570. *olen = 4;
  34571. }
  34572. #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
  34573. #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
  34574. static void ssl_srv_write_encrypt_then_mac_ext( mbedtls_ssl_context *ssl,
  34575. unsigned char *buf,
  34576. size_t *olen )
  34577. {
  34578. unsigned char *p = buf;
  34579. const mbedtls_ssl_ciphersuite_t *suite = NULL;
  34580. const mbedtls_cipher_info_t *cipher = NULL;
  34581. if( ssl->session_negotiate->encrypt_then_mac == MBEDTLS_SSL_EXTENDED_MS_DISABLED ||
  34582. ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
  34583. {
  34584. *olen = 0;
  34585. return;
  34586. }
  34587. /*
  34588. * RFC 7366: "If a server receives an encrypt-then-MAC request extension
  34589. * from a client and then selects a stream or Authenticated Encryption
  34590. * with Associated Data (AEAD) ciphersuite, it MUST NOT send an
  34591. * encrypt-then-MAC response extension back to the client."
  34592. */
  34593. if( ( suite = mbedtls_ssl_ciphersuite_from_id(
  34594. ssl->session_negotiate->ciphersuite ) ) == NULL ||
  34595. ( cipher = mbedtls_cipher_info_from_type( suite->cipher ) ) == NULL ||
  34596. cipher->mode != MBEDTLS_MODE_CBC )
  34597. {
  34598. *olen = 0;
  34599. return;
  34600. }
  34601. MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, adding encrypt then mac extension" ) );
  34602. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC >> 8 ) & 0xFF );
  34603. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC ) & 0xFF );
  34604. *p++ = 0x00;
  34605. *p++ = 0x00;
  34606. *olen = 4;
  34607. }
  34608. #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
  34609. #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
  34610. static void ssl_srv_write_extended_ms_ext( mbedtls_ssl_context *ssl,
  34611. unsigned char *buf,
  34612. size_t *olen )
  34613. {
  34614. unsigned char *p = buf;
  34615. if( ssl->handshake->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED ||
  34616. ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
  34617. {
  34618. *olen = 0;
  34619. return;
  34620. }
  34621. MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, adding extended master secret "
  34622. "extension" ) );
  34623. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET >> 8 ) & 0xFF );
  34624. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET ) & 0xFF );
  34625. *p++ = 0x00;
  34626. *p++ = 0x00;
  34627. *olen = 4;
  34628. }
  34629. #endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
  34630. #if defined(MBEDTLS_SSL_SESSION_TICKETS)
  34631. static void ssl_srv_write_session_ticket_ext( mbedtls_ssl_context *ssl,
  34632. unsigned char *buf,
  34633. size_t *olen )
  34634. {
  34635. unsigned char *p = buf;
  34636. if( ssl->handshake->new_session_ticket == 0 )
  34637. {
  34638. *olen = 0;
  34639. return;
  34640. }
  34641. MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, adding session ticket extension" ) );
  34642. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SESSION_TICKET >> 8 ) & 0xFF );
  34643. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SESSION_TICKET ) & 0xFF );
  34644. *p++ = 0x00;
  34645. *p++ = 0x00;
  34646. *olen = 4;
  34647. }
  34648. #endif /* MBEDTLS_SSL_SESSION_TICKETS */
  34649. static void ssl_srv_write_renegotiation_ext( mbedtls_ssl_context *ssl,
  34650. unsigned char *buf,
  34651. size_t *olen )
  34652. {
  34653. unsigned char *p = buf;
  34654. if( ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION )
  34655. {
  34656. *olen = 0;
  34657. return;
  34658. }
  34659. MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, secure renegotiation extension" ) );
  34660. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_RENEGOTIATION_INFO >> 8 ) & 0xFF );
  34661. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_RENEGOTIATION_INFO ) & 0xFF );
  34662. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  34663. if( ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE )
  34664. {
  34665. *p++ = 0x00;
  34666. *p++ = ( ssl->verify_data_len * 2 + 1 ) & 0xFF;
  34667. *p++ = ssl->verify_data_len * 2 & 0xFF;
  34668. memcpy( p, ssl->peer_verify_data, ssl->verify_data_len );
  34669. p += ssl->verify_data_len;
  34670. memcpy( p, ssl->own_verify_data, ssl->verify_data_len );
  34671. p += ssl->verify_data_len;
  34672. }
  34673. else
  34674. #endif /* MBEDTLS_SSL_RENEGOTIATION */
  34675. {
  34676. *p++ = 0x00;
  34677. *p++ = 0x01;
  34678. *p++ = 0x00;
  34679. }
  34680. *olen = p - buf;
  34681. }
  34682. #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
  34683. static void ssl_srv_write_max_fragment_length_ext( mbedtls_ssl_context *ssl,
  34684. unsigned char *buf,
  34685. size_t *olen )
  34686. {
  34687. unsigned char *p = buf;
  34688. if( ssl->session_negotiate->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE )
  34689. {
  34690. *olen = 0;
  34691. return;
  34692. }
  34693. MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, max_fragment_length extension" ) );
  34694. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH >> 8 ) & 0xFF );
  34695. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH ) & 0xFF );
  34696. *p++ = 0x00;
  34697. *p++ = 1;
  34698. *p++ = ssl->session_negotiate->mfl_code;
  34699. *olen = 5;
  34700. }
  34701. #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
  34702. #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
  34703. defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
  34704. static void ssl_srv_write_supported_point_formats_ext( mbedtls_ssl_context *ssl,
  34705. unsigned char *buf,
  34706. size_t *olen )
  34707. {
  34708. unsigned char *p = buf;
  34709. ((void) ssl);
  34710. if( ( ssl->handshake->cli_exts &
  34711. MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT ) == 0 )
  34712. {
  34713. *olen = 0;
  34714. return;
  34715. }
  34716. MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, supported_point_formats extension" ) );
  34717. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS >> 8 ) & 0xFF );
  34718. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS ) & 0xFF );
  34719. *p++ = 0x00;
  34720. *p++ = 2;
  34721. *p++ = 1;
  34722. *p++ = MBEDTLS_ECP_PF_UNCOMPRESSED;
  34723. *olen = 6;
  34724. }
  34725. #endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C || MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
  34726. #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
  34727. static void ssl_srv_write_ecjpake_kkpp_ext( mbedtls_ssl_context *ssl,
  34728. unsigned char *buf,
  34729. size_t *olen )
  34730. {
  34731. int ret;
  34732. unsigned char *p = buf;
  34733. const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;
  34734. size_t kkpp_len;
  34735. *olen = 0;
  34736. /* Skip costly computation if not needed */
  34737. if( ssl->transform_negotiate->ciphersuite_info->key_exchange !=
  34738. MBEDTLS_KEY_EXCHANGE_ECJPAKE )
  34739. return;
  34740. MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, ecjpake kkpp extension" ) );
  34741. if( end - p < 4 )
  34742. {
  34743. MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
  34744. return;
  34745. }
  34746. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ECJPAKE_KKPP >> 8 ) & 0xFF );
  34747. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ECJPAKE_KKPP ) & 0xFF );
  34748. ret = mbedtls_ecjpake_write_round_one( &ssl->handshake->ecjpake_ctx,
  34749. p + 2, end - p - 2, &kkpp_len,
  34750. ssl->conf->f_rng, ssl->conf->p_rng );
  34751. if( ret != 0 )
  34752. {
  34753. MBEDTLS_SSL_DEBUG_RET( 1 , "mbedtls_ecjpake_write_round_one", ret );
  34754. return;
  34755. }
  34756. *p++ = (unsigned char)( ( kkpp_len >> 8 ) & 0xFF );
  34757. *p++ = (unsigned char)( ( kkpp_len ) & 0xFF );
  34758. *olen = kkpp_len + 4;
  34759. }
  34760. #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
  34761. #if defined(MBEDTLS_SSL_ALPN )
  34762. static void ssl_srv_write_alpn_ext( mbedtls_ssl_context *ssl,
  34763. unsigned char *buf, size_t *olen )
  34764. {
  34765. if( ssl->alpn_chosen == NULL )
  34766. {
  34767. *olen = 0;
  34768. return;
  34769. }
  34770. MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, adding alpn extension" ) );
  34771. /*
  34772. * 0 . 1 ext identifier
  34773. * 2 . 3 ext length
  34774. * 4 . 5 protocol list length
  34775. * 6 . 6 protocol name length
  34776. * 7 . 7+n protocol name
  34777. */
  34778. buf[0] = (unsigned char)( ( MBEDTLS_TLS_EXT_ALPN >> 8 ) & 0xFF );
  34779. buf[1] = (unsigned char)( ( MBEDTLS_TLS_EXT_ALPN ) & 0xFF );
  34780. *olen = 7 + strlen( ssl->alpn_chosen );
  34781. buf[2] = (unsigned char)( ( ( *olen - 4 ) >> 8 ) & 0xFF );
  34782. buf[3] = (unsigned char)( ( ( *olen - 4 ) ) & 0xFF );
  34783. buf[4] = (unsigned char)( ( ( *olen - 6 ) >> 8 ) & 0xFF );
  34784. buf[5] = (unsigned char)( ( ( *olen - 6 ) ) & 0xFF );
  34785. buf[6] = (unsigned char)( ( ( *olen - 7 ) ) & 0xFF );
  34786. memcpy( buf + 7, ssl->alpn_chosen, *olen - 7 );
  34787. }
  34788. #endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C */
  34789. #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
  34790. static int ssl_write_hello_verify_request( mbedtls_ssl_context *ssl )
  34791. {
  34792. int ret;
  34793. unsigned char *p = ssl->out_msg + 4;
  34794. unsigned char *cookie_len_byte;
  34795. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write hello verify request" ) );
  34796. /*
  34797. * struct {
  34798. * ProtocolVersion server_version;
  34799. * opaque cookie<0..2^8-1>;
  34800. * } HelloVerifyRequest;
  34801. */
  34802. /* The RFC is not clear on this point, but sending the actual negotiated
  34803. * version looks like the most interoperable thing to do. */
  34804. mbedtls_ssl_write_version( ssl->major_ver, ssl->minor_ver,
  34805. ssl->conf->transport, p );
  34806. MBEDTLS_SSL_DEBUG_BUF( 3, "server version", p, 2 );
  34807. p += 2;
  34808. /* If we get here, f_cookie_check is not null */
  34809. if( ssl->conf->f_cookie_write == NULL )
  34810. {
  34811. MBEDTLS_SSL_DEBUG_MSG( 1, ( "inconsistent cookie callbacks" ) );
  34812. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  34813. }
  34814. /* Skip length byte until we know the length */
  34815. cookie_len_byte = p++;
  34816. if( ( ret = ssl->conf->f_cookie_write( ssl->conf->p_cookie,
  34817. &p, ssl->out_buf + MBEDTLS_SSL_BUFFER_LEN,
  34818. ssl->cli_id, ssl->cli_id_len ) ) != 0 )
  34819. {
  34820. MBEDTLS_SSL_DEBUG_RET( 1, "f_cookie_write", ret );
  34821. return( ret );
  34822. }
  34823. *cookie_len_byte = (unsigned char)( p - ( cookie_len_byte + 1 ) );
  34824. MBEDTLS_SSL_DEBUG_BUF( 3, "cookie sent", cookie_len_byte + 1, *cookie_len_byte );
  34825. ssl->out_msglen = p - ssl->out_msg;
  34826. ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
  34827. ssl->out_msg[0] = MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST;
  34828. ssl->state = MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT;
  34829. if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 )
  34830. {
  34831. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret );
  34832. return( ret );
  34833. }
  34834. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write hello verify request" ) );
  34835. return( 0 );
  34836. }
  34837. #endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
  34838. static int ssl_write_server_hello( mbedtls_ssl_context *ssl )
  34839. {
  34840. #if defined(MBEDTLS_HAVE_TIME)
  34841. time_t t;
  34842. #endif
  34843. int ret;
  34844. size_t olen, ext_len = 0, n;
  34845. unsigned char *buf, *p;
  34846. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write server hello" ) );
  34847. #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
  34848. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
  34849. ssl->handshake->verify_cookie_len != 0 )
  34850. {
  34851. MBEDTLS_SSL_DEBUG_MSG( 2, ( "client hello was not authenticated" ) );
  34852. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write server hello" ) );
  34853. return( ssl_write_hello_verify_request( ssl ) );
  34854. }
  34855. #endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
  34856. if( ssl->conf->f_rng == NULL )
  34857. {
  34858. MBEDTLS_SSL_DEBUG_MSG( 1, ( "no RNG provided") );
  34859. return( MBEDTLS_ERR_SSL_NO_RNG );
  34860. }
  34861. /*
  34862. * 0 . 0 handshake type
  34863. * 1 . 3 handshake length
  34864. * 4 . 5 protocol version
  34865. * 6 . 9 UNIX time()
  34866. * 10 . 37 random bytes
  34867. */
  34868. buf = ssl->out_msg;
  34869. p = buf + 4;
  34870. mbedtls_ssl_write_version( ssl->major_ver, ssl->minor_ver,
  34871. ssl->conf->transport, p );
  34872. p += 2;
  34873. MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, chosen version: [%d:%d]",
  34874. buf[4], buf[5] ) );
  34875. #if defined(MBEDTLS_HAVE_TIME)
  34876. t = time( NULL );
  34877. *p++ = (unsigned char)( t >> 24 );
  34878. *p++ = (unsigned char)( t >> 16 );
  34879. *p++ = (unsigned char)( t >> 8 );
  34880. *p++ = (unsigned char)( t );
  34881. MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, current time: %lu", t ) );
  34882. #else
  34883. if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, p, 4 ) ) != 0 )
  34884. return( ret );
  34885. p += 4;
  34886. #endif /* MBEDTLS_HAVE_TIME */
  34887. if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, p, 28 ) ) != 0 )
  34888. return( ret );
  34889. p += 28;
  34890. memcpy( ssl->handshake->randbytes + 32, buf + 6, 32 );
  34891. MBEDTLS_SSL_DEBUG_BUF( 3, "server hello, random bytes", buf + 6, 32 );
  34892. /*
  34893. * Resume is 0 by default, see ssl_handshake_init().
  34894. * It may be already set to 1 by ssl_srv_parse_session_ticket_ext().
  34895. * If not, try looking up session ID in our cache.
  34896. */
  34897. if( ssl->handshake->resume == 0 &&
  34898. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  34899. ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE &&
  34900. #endif
  34901. ssl->session_negotiate->id_len != 0 &&
  34902. ssl->conf->f_get_cache != NULL &&
  34903. ssl->conf->f_get_cache( ssl->conf->p_cache, ssl->session_negotiate ) == 0 )
  34904. {
  34905. MBEDTLS_SSL_DEBUG_MSG( 3, ( "session successfully restored from cache" ) );
  34906. ssl->handshake->resume = 1;
  34907. }
  34908. if( ssl->handshake->resume == 0 )
  34909. {
  34910. /*
  34911. * New session, create a new session id,
  34912. * unless we're about to issue a session ticket
  34913. */
  34914. ssl->state++;
  34915. #if defined(MBEDTLS_HAVE_TIME)
  34916. ssl->session_negotiate->start = time( NULL );
  34917. #endif
  34918. #if defined(MBEDTLS_SSL_SESSION_TICKETS)
  34919. if( ssl->handshake->new_session_ticket != 0 )
  34920. {
  34921. ssl->session_negotiate->id_len = n = 0;
  34922. memset( ssl->session_negotiate->id, 0, 32 );
  34923. }
  34924. else
  34925. #endif /* MBEDTLS_SSL_SESSION_TICKETS */
  34926. {
  34927. ssl->session_negotiate->id_len = n = 32;
  34928. if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, ssl->session_negotiate->id,
  34929. n ) ) != 0 )
  34930. return( ret );
  34931. }
  34932. }
  34933. else
  34934. {
  34935. /*
  34936. * Resuming a session
  34937. */
  34938. n = ssl->session_negotiate->id_len;
  34939. ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC;
  34940. if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 )
  34941. {
  34942. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_derive_keys", ret );
  34943. return( ret );
  34944. }
  34945. }
  34946. /*
  34947. * 38 . 38 session id length
  34948. * 39 . 38+n session id
  34949. * 39+n . 40+n chosen ciphersuite
  34950. * 41+n . 41+n chosen compression alg.
  34951. * 42+n . 43+n extensions length
  34952. * 44+n . 43+n+m extensions
  34953. */
  34954. *p++ = (unsigned char) ssl->session_negotiate->id_len;
  34955. memcpy( p, ssl->session_negotiate->id, ssl->session_negotiate->id_len );
  34956. p += ssl->session_negotiate->id_len;
  34957. MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, session id len.: %d", n ) );
  34958. MBEDTLS_SSL_DEBUG_BUF( 3, "server hello, session id", buf + 39, n );
  34959. MBEDTLS_SSL_DEBUG_MSG( 3, ( "%s session has been resumed",
  34960. ssl->handshake->resume ? "a" : "no" ) );
  34961. *p++ = (unsigned char)( ssl->session_negotiate->ciphersuite >> 8 );
  34962. *p++ = (unsigned char)( ssl->session_negotiate->ciphersuite );
  34963. *p++ = (unsigned char)( ssl->session_negotiate->compression );
  34964. MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, chosen ciphersuite: %s",
  34965. mbedtls_ssl_get_ciphersuite_name( ssl->session_negotiate->ciphersuite ) ) );
  34966. MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, compress alg.: 0x%02X",
  34967. ssl->session_negotiate->compression ) );
  34968. /*
  34969. * First write extensions, then the total length
  34970. */
  34971. ssl_srv_write_renegotiation_ext( ssl, p + 2 + ext_len, &olen );
  34972. ext_len += olen;
  34973. #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
  34974. ssl_srv_write_max_fragment_length_ext( ssl, p + 2 + ext_len, &olen );
  34975. ext_len += olen;
  34976. #endif
  34977. #if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
  34978. ssl_srv_write_truncated_hmac_ext( ssl, p + 2 + ext_len, &olen );
  34979. ext_len += olen;
  34980. #endif
  34981. #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
  34982. ssl_srv_write_encrypt_then_mac_ext( ssl, p + 2 + ext_len, &olen );
  34983. ext_len += olen;
  34984. #endif
  34985. #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
  34986. ssl_srv_write_extended_ms_ext( ssl, p + 2 + ext_len, &olen );
  34987. ext_len += olen;
  34988. #endif
  34989. #if defined(MBEDTLS_SSL_SESSION_TICKETS)
  34990. ssl_srv_write_session_ticket_ext( ssl, p + 2 + ext_len, &olen );
  34991. ext_len += olen;
  34992. #endif
  34993. #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
  34994. defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
  34995. ssl_srv_write_supported_point_formats_ext( ssl, p + 2 + ext_len, &olen );
  34996. ext_len += olen;
  34997. #endif
  34998. #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
  34999. ssl_srv_write_ecjpake_kkpp_ext( ssl, p + 2 + ext_len, &olen );
  35000. ext_len += olen;
  35001. #endif
  35002. #if defined(MBEDTLS_SSL_ALPN)
  35003. ssl_srv_write_alpn_ext( ssl, p + 2 + ext_len, &olen );
  35004. ext_len += olen;
  35005. #endif
  35006. MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, total extension length: %d", ext_len ) );
  35007. if( ext_len > 0 )
  35008. {
  35009. *p++ = (unsigned char)( ( ext_len >> 8 ) & 0xFF );
  35010. *p++ = (unsigned char)( ( ext_len ) & 0xFF );
  35011. p += ext_len;
  35012. }
  35013. ssl->out_msglen = p - buf;
  35014. ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
  35015. ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_HELLO;
  35016. ret = mbedtls_ssl_write_record( ssl );
  35017. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write server hello" ) );
  35018. return( ret );
  35019. }
  35020. #if !defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) && \
  35021. !defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) && \
  35022. !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) && \
  35023. !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
  35024. static int ssl_write_certificate_request( mbedtls_ssl_context *ssl )
  35025. {
  35026. const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
  35027. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate request" ) );
  35028. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
  35029. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
  35030. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
  35031. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
  35032. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
  35033. {
  35034. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate request" ) );
  35035. ssl->state++;
  35036. return( 0 );
  35037. }
  35038. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  35039. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  35040. }
  35041. #else
  35042. static int ssl_write_certificate_request( mbedtls_ssl_context *ssl )
  35043. {
  35044. int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
  35045. const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
  35046. size_t dn_size, total_dn_size; /* excluding length bytes */
  35047. size_t ct_len, sa_len; /* including length bytes */
  35048. unsigned char *buf, *p;
  35049. const unsigned char * const end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;
  35050. const mbedtls_x509_crt *crt;
  35051. int authmode;
  35052. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate request" ) );
  35053. ssl->state++;
  35054. #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
  35055. if( ssl->handshake->sni_authmode != MBEDTLS_SSL_VERIFY_UNSET )
  35056. authmode = ssl->handshake->sni_authmode;
  35057. else
  35058. #endif
  35059. authmode = ssl->conf->authmode;
  35060. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
  35061. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
  35062. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
  35063. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
  35064. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ||
  35065. authmode == MBEDTLS_SSL_VERIFY_NONE )
  35066. {
  35067. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate request" ) );
  35068. return( 0 );
  35069. }
  35070. /*
  35071. * 0 . 0 handshake type
  35072. * 1 . 3 handshake length
  35073. * 4 . 4 cert type count
  35074. * 5 .. m-1 cert types
  35075. * m .. m+1 sig alg length (TLS 1.2 only)
  35076. * m+1 .. n-1 SignatureAndHashAlgorithms (TLS 1.2 only)
  35077. * n .. n+1 length of all DNs
  35078. * n+2 .. n+3 length of DN 1
  35079. * n+4 .. ... Distinguished Name #1
  35080. * ... .. ... length of DN 2, etc.
  35081. */
  35082. buf = ssl->out_msg;
  35083. p = buf + 4;
  35084. /*
  35085. * Supported certificate types
  35086. *
  35087. * ClientCertificateType certificate_types<1..2^8-1>;
  35088. * enum { (255) } ClientCertificateType;
  35089. */
  35090. ct_len = 0;
  35091. #if defined(MBEDTLS_RSA_C)
  35092. p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_RSA_SIGN;
  35093. #endif
  35094. #if defined(MBEDTLS_ECDSA_C)
  35095. p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_ECDSA_SIGN;
  35096. #endif
  35097. p[0] = (unsigned char) ct_len++;
  35098. p += ct_len;
  35099. sa_len = 0;
  35100. #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
  35101. /*
  35102. * Add signature_algorithms for verify (TLS 1.2)
  35103. *
  35104. * SignatureAndHashAlgorithm supported_signature_algorithms<2..2^16-2>;
  35105. *
  35106. * struct {
  35107. * HashAlgorithm hash;
  35108. * SignatureAlgorithm signature;
  35109. * } SignatureAndHashAlgorithm;
  35110. *
  35111. * enum { (255) } HashAlgorithm;
  35112. * enum { (255) } SignatureAlgorithm;
  35113. */
  35114. if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
  35115. {
  35116. /*
  35117. * Only use current running hash algorithm that is already required
  35118. * for requested ciphersuite.
  35119. */
  35120. ssl->handshake->verify_sig_alg = MBEDTLS_SSL_HASH_SHA256;
  35121. if( ssl->transform_negotiate->ciphersuite_info->mac ==
  35122. MBEDTLS_MD_SHA384 )
  35123. {
  35124. ssl->handshake->verify_sig_alg = MBEDTLS_SSL_HASH_SHA384;
  35125. }
  35126. /*
  35127. * Supported signature algorithms
  35128. */
  35129. #if defined(MBEDTLS_RSA_C)
  35130. p[2 + sa_len++] = ssl->handshake->verify_sig_alg;
  35131. p[2 + sa_len++] = MBEDTLS_SSL_SIG_RSA;
  35132. #endif
  35133. #if defined(MBEDTLS_ECDSA_C)
  35134. p[2 + sa_len++] = ssl->handshake->verify_sig_alg;
  35135. p[2 + sa_len++] = MBEDTLS_SSL_SIG_ECDSA;
  35136. #endif
  35137. p[0] = (unsigned char)( sa_len >> 8 );
  35138. p[1] = (unsigned char)( sa_len );
  35139. sa_len += 2;
  35140. p += sa_len;
  35141. }
  35142. #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
  35143. /*
  35144. * DistinguishedName certificate_authorities<0..2^16-1>;
  35145. * opaque DistinguishedName<1..2^16-1>;
  35146. */
  35147. p += 2;
  35148. #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
  35149. if( ssl->handshake->sni_ca_chain != NULL )
  35150. crt = ssl->handshake->sni_ca_chain;
  35151. else
  35152. #endif
  35153. crt = ssl->conf->ca_chain;
  35154. total_dn_size = 0;
  35155. while( crt != NULL && crt->version != 0 )
  35156. {
  35157. dn_size = crt->subject_raw.len;
  35158. if( end < p ||
  35159. (size_t)( end - p ) < dn_size ||
  35160. (size_t)( end - p ) < 2 + dn_size )
  35161. {
  35162. MBEDTLS_SSL_DEBUG_MSG( 1, ( "skipping CAs: buffer too short" ) );
  35163. break;
  35164. }
  35165. *p++ = (unsigned char)( dn_size >> 8 );
  35166. *p++ = (unsigned char)( dn_size );
  35167. memcpy( p, crt->subject_raw.p, dn_size );
  35168. p += dn_size;
  35169. MBEDTLS_SSL_DEBUG_BUF( 3, "requested DN", p - dn_size, dn_size );
  35170. total_dn_size += 2 + dn_size;
  35171. crt = crt->next;
  35172. }
  35173. ssl->out_msglen = p - buf;
  35174. ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
  35175. ssl->out_msg[0] = MBEDTLS_SSL_HS_CERTIFICATE_REQUEST;
  35176. ssl->out_msg[4 + ct_len + sa_len] = (unsigned char)( total_dn_size >> 8 );
  35177. ssl->out_msg[5 + ct_len + sa_len] = (unsigned char)( total_dn_size );
  35178. ret = mbedtls_ssl_write_record( ssl );
  35179. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write certificate request" ) );
  35180. return( ret );
  35181. }
  35182. #endif /* !MBEDTLS_KEY_EXCHANGE_RSA_ENABLED &&
  35183. !MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED &&
  35184. !MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED &&
  35185. !MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
  35186. #if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
  35187. defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
  35188. static int ssl_srv_get_ecdh_params_from_cert( mbedtls_ssl_context *ssl )
  35189. {
  35190. int ret;
  35191. if( ! mbedtls_pk_can_do( mbedtls_ssl_own_key( ssl ), MBEDTLS_PK_ECKEY ) )
  35192. {
  35193. MBEDTLS_SSL_DEBUG_MSG( 1, ( "server key not ECDH capable" ) );
  35194. return( MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH );
  35195. }
  35196. if( ( ret = mbedtls_ecdh_get_params( &ssl->handshake->ecdh_ctx,
  35197. mbedtls_pk_ec( *mbedtls_ssl_own_key( ssl ) ),
  35198. MBEDTLS_ECDH_OURS ) ) != 0 )
  35199. {
  35200. MBEDTLS_SSL_DEBUG_RET( 1, ( "mbedtls_ecdh_get_params" ), ret );
  35201. return( ret );
  35202. }
  35203. return( 0 );
  35204. }
  35205. #endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) ||
  35206. MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
  35207. static int ssl_write_server_key_exchange( mbedtls_ssl_context *ssl )
  35208. {
  35209. int ret;
  35210. size_t n = 0;
  35211. const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
  35212. ssl->transform_negotiate->ciphersuite_info;
  35213. #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
  35214. defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) || \
  35215. defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
  35216. defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) || \
  35217. defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
  35218. defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
  35219. unsigned char *p = ssl->out_msg + 4;
  35220. unsigned char *dig_signed = p;
  35221. size_t dig_signed_len = 0, len;
  35222. ((void) dig_signed);
  35223. ((void) dig_signed_len);
  35224. ((void) len);
  35225. #endif
  35226. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write server key exchange" ) );
  35227. #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \
  35228. defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) || \
  35229. defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
  35230. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA ||
  35231. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
  35232. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK )
  35233. {
  35234. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write server key exchange" ) );
  35235. ssl->state++;
  35236. return( 0 );
  35237. }
  35238. #endif
  35239. #if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
  35240. defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
  35241. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA ||
  35242. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA )
  35243. {
  35244. ssl_srv_get_ecdh_params_from_cert( ssl );
  35245. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write server key exchange" ) );
  35246. ssl->state++;
  35247. return( 0 );
  35248. }
  35249. #endif
  35250. #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
  35251. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
  35252. {
  35253. size_t jlen;
  35254. const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;
  35255. ret = mbedtls_ecjpake_write_round_two( &ssl->handshake->ecjpake_ctx,
  35256. p, end - p, &jlen, ssl->conf->f_rng, ssl->conf->p_rng );
  35257. if( ret != 0 )
  35258. {
  35259. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_write_round_two", ret );
  35260. return( ret );
  35261. }
  35262. p += jlen;
  35263. n += jlen;
  35264. }
  35265. #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
  35266. #if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) || \
  35267. defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
  35268. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
  35269. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )
  35270. {
  35271. /* TODO: Support identity hints */
  35272. *(p++) = 0x00;
  35273. *(p++) = 0x00;
  35274. n += 2;
  35275. }
  35276. #endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED ||
  35277. MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
  35278. #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
  35279. defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
  35280. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_RSA ||
  35281. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK )
  35282. {
  35283. if( ssl->conf->dhm_P.p == NULL || ssl->conf->dhm_G.p == NULL )
  35284. {
  35285. MBEDTLS_SSL_DEBUG_MSG( 1, ( "no DH parameters set" ) );
  35286. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  35287. }
  35288. /*
  35289. * Ephemeral DH parameters:
  35290. *
  35291. * struct {
  35292. * opaque dh_p<1..2^16-1>;
  35293. * opaque dh_g<1..2^16-1>;
  35294. * opaque dh_Ys<1..2^16-1>;
  35295. * } ServerDHParams;
  35296. */
  35297. if( ( ret = mbedtls_mpi_copy( &ssl->handshake->dhm_ctx.P, &ssl->conf->dhm_P ) ) != 0 ||
  35298. ( ret = mbedtls_mpi_copy( &ssl->handshake->dhm_ctx.G, &ssl->conf->dhm_G ) ) != 0 )
  35299. {
  35300. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_mpi_copy", ret );
  35301. return( ret );
  35302. }
  35303. if( ( ret = mbedtls_dhm_make_params( &ssl->handshake->dhm_ctx,
  35304. (int) mbedtls_mpi_size( &ssl->handshake->dhm_ctx.P ),
  35305. p, &len, ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
  35306. {
  35307. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_make_params", ret );
  35308. return( ret );
  35309. }
  35310. dig_signed = p;
  35311. dig_signed_len = len;
  35312. p += len;
  35313. n += len;
  35314. MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: X ", &ssl->handshake->dhm_ctx.X );
  35315. MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: P ", &ssl->handshake->dhm_ctx.P );
  35316. MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: G ", &ssl->handshake->dhm_ctx.G );
  35317. MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: GX", &ssl->handshake->dhm_ctx.GX );
  35318. }
  35319. #endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||
  35320. MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
  35321. #if defined(MBEDTLS_KEY_EXCHANGE__SOME__ECDHE_ENABLED)
  35322. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
  35323. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA ||
  35324. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )
  35325. {
  35326. /*
  35327. * Ephemeral ECDH parameters:
  35328. *
  35329. * struct {
  35330. * ECParameters curve_params;
  35331. * ECPoint public;
  35332. * } ServerECDHParams;
  35333. */
  35334. const mbedtls_ecp_curve_info **curve = NULL;
  35335. const mbedtls_ecp_group_id *gid;
  35336. /* Match our preference list against the offered curves */
  35337. for( gid = ssl->conf->curve_list; *gid != MBEDTLS_ECP_DP_NONE; gid++ )
  35338. for( curve = ssl->handshake->curves; *curve != NULL; curve++ )
  35339. if( (*curve)->grp_id == *gid )
  35340. goto curve_matching_done;
  35341. curve_matching_done:
  35342. if( curve == NULL || *curve == NULL )
  35343. {
  35344. MBEDTLS_SSL_DEBUG_MSG( 1, ( "no matching curve for ECDHE" ) );
  35345. return( MBEDTLS_ERR_SSL_NO_CIPHER_CHOSEN );
  35346. }
  35347. MBEDTLS_SSL_DEBUG_MSG( 2, ( "ECDHE curve: %s", (*curve)->name ) );
  35348. if( ( ret = mbedtls_ecp_group_load( &ssl->handshake->ecdh_ctx.grp,
  35349. (*curve)->grp_id ) ) != 0 )
  35350. {
  35351. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecp_group_load", ret );
  35352. return( ret );
  35353. }
  35354. if( ( ret = mbedtls_ecdh_make_params( &ssl->handshake->ecdh_ctx, &len,
  35355. p, MBEDTLS_SSL_MAX_CONTENT_LEN - n,
  35356. ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
  35357. {
  35358. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_make_params", ret );
  35359. return( ret );
  35360. }
  35361. dig_signed = p;
  35362. dig_signed_len = len;
  35363. p += len;
  35364. n += len;
  35365. MBEDTLS_SSL_DEBUG_ECP( 3, "ECDH: Q ", &ssl->handshake->ecdh_ctx.Q );
  35366. }
  35367. #endif /* MBEDTLS_KEY_EXCHANGE__SOME__ECDHE_ENABLED */
  35368. #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
  35369. defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
  35370. defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
  35371. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_RSA ||
  35372. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
  35373. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA )
  35374. {
  35375. size_t signature_len = 0;
  35376. unsigned int hashlen = 0;
  35377. unsigned char hash[64];
  35378. mbedtls_md_type_t md_alg = MBEDTLS_MD_NONE;
  35379. /*
  35380. * Choose hash algorithm. NONE means MD5 + SHA1 here.
  35381. */
  35382. #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
  35383. if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
  35384. {
  35385. md_alg = mbedtls_ssl_md_alg_from_hash( ssl->handshake->sig_alg );
  35386. if( md_alg == MBEDTLS_MD_NONE )
  35387. {
  35388. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  35389. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  35390. }
  35391. }
  35392. else
  35393. #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
  35394. #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
  35395. defined(MBEDTLS_SSL_PROTO_TLS1_1)
  35396. if( ciphersuite_info->key_exchange ==
  35397. MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA )
  35398. {
  35399. md_alg = MBEDTLS_MD_SHA1;
  35400. }
  35401. else
  35402. #endif
  35403. {
  35404. md_alg = MBEDTLS_MD_NONE;
  35405. }
  35406. /*
  35407. * Compute the hash to be signed
  35408. */
  35409. #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
  35410. defined(MBEDTLS_SSL_PROTO_TLS1_1)
  35411. if( md_alg == MBEDTLS_MD_NONE )
  35412. {
  35413. mbedtls_md5_context mbedtls_md5;
  35414. mbedtls_sha1_context mbedtls_sha1;
  35415. mbedtls_md5_init( &mbedtls_md5 );
  35416. mbedtls_sha1_init( &mbedtls_sha1 );
  35417. /*
  35418. * digitally-signed struct {
  35419. * opaque md5_hash[16];
  35420. * opaque sha_hash[20];
  35421. * };
  35422. *
  35423. * md5_hash
  35424. * MD5(ClientHello.random + ServerHello.random
  35425. * + ServerParams);
  35426. * sha_hash
  35427. * SHA(ClientHello.random + ServerHello.random
  35428. * + ServerParams);
  35429. */
  35430. mbedtls_md5_starts( &mbedtls_md5 );
  35431. mbedtls_md5_update( &mbedtls_md5, ssl->handshake->randbytes, 64 );
  35432. mbedtls_md5_update( &mbedtls_md5, dig_signed, dig_signed_len );
  35433. mbedtls_md5_finish( &mbedtls_md5, hash );
  35434. mbedtls_sha1_starts( &mbedtls_sha1 );
  35435. mbedtls_sha1_update( &mbedtls_sha1, ssl->handshake->randbytes, 64 );
  35436. mbedtls_sha1_update( &mbedtls_sha1, dig_signed, dig_signed_len );
  35437. mbedtls_sha1_finish( &mbedtls_sha1, hash + 16 );
  35438. hashlen = 36;
  35439. mbedtls_md5_free( &mbedtls_md5 );
  35440. mbedtls_sha1_free( &mbedtls_sha1 );
  35441. }
  35442. else
  35443. #endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \
  35444. MBEDTLS_SSL_PROTO_TLS1_1 */
  35445. #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
  35446. defined(MBEDTLS_SSL_PROTO_TLS1_2)
  35447. if( md_alg != MBEDTLS_MD_NONE )
  35448. {
  35449. mbedtls_md_context_t ctx;
  35450. const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type( md_alg );
  35451. mbedtls_md_init( &ctx );
  35452. /* Info from md_alg will be used instead */
  35453. hashlen = 0;
  35454. /*
  35455. * digitally-signed struct {
  35456. * opaque client_random[32];
  35457. * opaque server_random[32];
  35458. * ServerDHParams params;
  35459. * };
  35460. */
  35461. if( ( ret = mbedtls_md_setup( &ctx, md_info, 0 ) ) != 0 )
  35462. {
  35463. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_setup", ret );
  35464. return( ret );
  35465. }
  35466. mbedtls_md_starts( &ctx );
  35467. mbedtls_md_update( &ctx, ssl->handshake->randbytes, 64 );
  35468. mbedtls_md_update( &ctx, dig_signed, dig_signed_len );
  35469. mbedtls_md_finish( &ctx, hash );
  35470. mbedtls_md_free( &ctx );
  35471. }
  35472. else
  35473. #endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \
  35474. MBEDTLS_SSL_PROTO_TLS1_2 */
  35475. {
  35476. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  35477. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  35478. }
  35479. MBEDTLS_SSL_DEBUG_BUF( 3, "parameters hash", hash, hashlen != 0 ? hashlen :
  35480. (unsigned int) ( mbedtls_md_get_size( mbedtls_md_info_from_type( md_alg ) ) ) );
  35481. /*
  35482. * Make the signature
  35483. */
  35484. if( mbedtls_ssl_own_key( ssl ) == NULL )
  35485. {
  35486. MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no private key" ) );
  35487. return( MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED );
  35488. }
  35489. #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
  35490. if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
  35491. {
  35492. *(p++) = ssl->handshake->sig_alg;
  35493. *(p++) = mbedtls_ssl_sig_from_pk( mbedtls_ssl_own_key( ssl ) );
  35494. n += 2;
  35495. }
  35496. #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
  35497. if( ( ret = mbedtls_pk_sign( mbedtls_ssl_own_key( ssl ), md_alg, hash, hashlen,
  35498. p + 2 , &signature_len,
  35499. ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
  35500. {
  35501. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_pk_sign", ret );
  35502. return( ret );
  35503. }
  35504. *(p++) = (unsigned char)( signature_len >> 8 );
  35505. *(p++) = (unsigned char)( signature_len );
  35506. n += 2;
  35507. MBEDTLS_SSL_DEBUG_BUF( 3, "my signature", p, signature_len );
  35508. n += signature_len;
  35509. }
  35510. #endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) ||
  35511. MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
  35512. MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
  35513. ssl->out_msglen = 4 + n;
  35514. ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
  35515. ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE;
  35516. ssl->state++;
  35517. if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 )
  35518. {
  35519. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret );
  35520. return( ret );
  35521. }
  35522. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write server key exchange" ) );
  35523. return( 0 );
  35524. }
  35525. static int ssl_write_server_hello_done( mbedtls_ssl_context *ssl )
  35526. {
  35527. int ret;
  35528. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write server hello done" ) );
  35529. ssl->out_msglen = 4;
  35530. ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
  35531. ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_HELLO_DONE;
  35532. ssl->state++;
  35533. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  35534. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
  35535. mbedtls_ssl_send_flight_completed( ssl );
  35536. #endif
  35537. if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 )
  35538. {
  35539. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret );
  35540. return( ret );
  35541. }
  35542. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write server hello done" ) );
  35543. return( 0 );
  35544. }
  35545. #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
  35546. defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
  35547. static int ssl_parse_client_dh_public( mbedtls_ssl_context *ssl, unsigned char **p,
  35548. const unsigned char *end )
  35549. {
  35550. int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
  35551. size_t n;
  35552. /*
  35553. * Receive G^Y mod P, premaster = (G^Y)^X mod P
  35554. */
  35555. if( *p + 2 > end )
  35556. {
  35557. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
  35558. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
  35559. }
  35560. n = ( (*p)[0] << 8 ) | (*p)[1];
  35561. *p += 2;
  35562. if( *p + n > end )
  35563. {
  35564. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
  35565. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
  35566. }
  35567. if( ( ret = mbedtls_dhm_read_public( &ssl->handshake->dhm_ctx, *p, n ) ) != 0 )
  35568. {
  35569. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_read_public", ret );
  35570. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP );
  35571. }
  35572. *p += n;
  35573. MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: GY", &ssl->handshake->dhm_ctx.GY );
  35574. return( ret );
  35575. }
  35576. #endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||
  35577. MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
  35578. #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \
  35579. defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
  35580. static int ssl_parse_encrypted_pms( mbedtls_ssl_context *ssl,
  35581. const unsigned char *p,
  35582. const unsigned char *end,
  35583. size_t pms_offset )
  35584. {
  35585. int ret;
  35586. size_t len = mbedtls_pk_get_len( mbedtls_ssl_own_key( ssl ) );
  35587. unsigned char *pms = ssl->handshake->premaster + pms_offset;
  35588. unsigned char ver[2];
  35589. unsigned char fake_pms[48], peer_pms[48];
  35590. unsigned char mask;
  35591. size_t i, peer_pmslen;
  35592. unsigned int diff;
  35593. if( ! mbedtls_pk_can_do( mbedtls_ssl_own_key( ssl ), MBEDTLS_PK_RSA ) )
  35594. {
  35595. MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no RSA private key" ) );
  35596. return( MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED );
  35597. }
  35598. /*
  35599. * Decrypt the premaster using own private RSA key
  35600. */
  35601. #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
  35602. defined(MBEDTLS_SSL_PROTO_TLS1_2)
  35603. if( ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_0 )
  35604. {
  35605. if( *p++ != ( ( len >> 8 ) & 0xFF ) ||
  35606. *p++ != ( ( len ) & 0xFF ) )
  35607. {
  35608. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
  35609. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
  35610. }
  35611. }
  35612. #endif
  35613. if( p + len != end )
  35614. {
  35615. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
  35616. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
  35617. }
  35618. mbedtls_ssl_write_version( ssl->handshake->max_major_ver,
  35619. ssl->handshake->max_minor_ver,
  35620. ssl->conf->transport, ver );
  35621. /*
  35622. * Protection against Bleichenbacher's attack: invalid PKCS#1 v1.5 padding
  35623. * must not cause the connection to end immediately; instead, send a
  35624. * bad_record_mac later in the handshake.
  35625. * Also, avoid data-dependant branches here to protect against
  35626. * timing-based variants.
  35627. */
  35628. ret = ssl->conf->f_rng( ssl->conf->p_rng, fake_pms, sizeof( fake_pms ) );
  35629. if( ret != 0 )
  35630. return( ret );
  35631. ret = mbedtls_pk_decrypt( mbedtls_ssl_own_key( ssl ), p, len,
  35632. peer_pms, &peer_pmslen,
  35633. sizeof( peer_pms ),
  35634. ssl->conf->f_rng, ssl->conf->p_rng );
  35635. diff = (unsigned int) ret;
  35636. diff |= peer_pmslen ^ 48;
  35637. diff |= peer_pms[0] ^ ver[0];
  35638. diff |= peer_pms[1] ^ ver[1];
  35639. #if defined(MBEDTLS_SSL_DEBUG_ALL)
  35640. if( diff != 0 )
  35641. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
  35642. #endif
  35643. if( sizeof( ssl->handshake->premaster ) < pms_offset ||
  35644. sizeof( ssl->handshake->premaster ) - pms_offset < 48 )
  35645. {
  35646. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  35647. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  35648. }
  35649. ssl->handshake->pmslen = 48;
  35650. /* mask = diff ? 0xff : 0x00 using bit operations to avoid branches */
  35651. /* MSVC has a warning about unary minus on unsigned, but this is
  35652. * well-defined and precisely what we want to do here */
  35653. #if defined(_MSC_VER)
  35654. #pragma warning( push )
  35655. #pragma warning( disable : 4146 )
  35656. #endif
  35657. mask = - ( ( diff | - diff ) >> ( sizeof( unsigned int ) * 8 - 1 ) );
  35658. #if defined(_MSC_VER)
  35659. #pragma warning( pop )
  35660. #endif
  35661. for( i = 0; i < ssl->handshake->pmslen; i++ )
  35662. pms[i] = ( mask & fake_pms[i] ) | ( (~mask) & peer_pms[i] );
  35663. return( 0 );
  35664. }
  35665. #endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED ||
  35666. MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
  35667. #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
  35668. static int ssl_parse_client_psk_identity( mbedtls_ssl_context *ssl, unsigned char **p,
  35669. const unsigned char *end )
  35670. {
  35671. int ret = 0;
  35672. size_t n;
  35673. if( ssl->conf->f_psk == NULL &&
  35674. ( ssl->conf->psk == NULL || ssl->conf->psk_identity == NULL ||
  35675. ssl->conf->psk_identity_len == 0 || ssl->conf->psk_len == 0 ) )
  35676. {
  35677. MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no pre-shared key" ) );
  35678. return( MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED );
  35679. }
  35680. /*
  35681. * Receive client pre-shared key identity name
  35682. */
  35683. if( *p + 2 > end )
  35684. {
  35685. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
  35686. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
  35687. }
  35688. n = ( (*p)[0] << 8 ) | (*p)[1];
  35689. *p += 2;
  35690. if( n < 1 || n > 65535 || *p + n > end )
  35691. {
  35692. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
  35693. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
  35694. }
  35695. if( ssl->conf->f_psk != NULL )
  35696. {
  35697. if( ssl->conf->f_psk( ssl->conf->p_psk, ssl, *p, n ) != 0 )
  35698. ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
  35699. }
  35700. else
  35701. {
  35702. /* Identity is not a big secret since clients send it in the clear,
  35703. * but treat it carefully anyway, just in case */
  35704. if( n != ssl->conf->psk_identity_len ||
  35705. mbedtls_ssl_safer_memcmp( ssl->conf->psk_identity, *p, n ) != 0 )
  35706. {
  35707. ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
  35708. }
  35709. }
  35710. if( ret == MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY )
  35711. {
  35712. MBEDTLS_SSL_DEBUG_BUF( 3, "Unknown PSK identity", *p, n );
  35713. if( ( ret = mbedtls_ssl_send_alert_message( ssl,
  35714. MBEDTLS_SSL_ALERT_LEVEL_FATAL,
  35715. MBEDTLS_SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY ) ) != 0 )
  35716. {
  35717. return( ret );
  35718. }
  35719. return( MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY );
  35720. }
  35721. *p += n;
  35722. return( 0 );
  35723. }
  35724. #endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */
  35725. static int ssl_parse_client_key_exchange( mbedtls_ssl_context *ssl )
  35726. {
  35727. int ret;
  35728. const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
  35729. unsigned char *p, *end;
  35730. ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
  35731. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse client key exchange" ) );
  35732. if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 )
  35733. {
  35734. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
  35735. return( ret );
  35736. }
  35737. p = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl );
  35738. end = ssl->in_msg + ssl->in_hslen;
  35739. if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
  35740. {
  35741. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
  35742. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
  35743. }
  35744. if( ssl->in_msg[0] != MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE )
  35745. {
  35746. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
  35747. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
  35748. }
  35749. #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED)
  35750. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_RSA )
  35751. {
  35752. if( ( ret = ssl_parse_client_dh_public( ssl, &p, end ) ) != 0 )
  35753. {
  35754. MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_parse_client_dh_public" ), ret );
  35755. return( ret );
  35756. }
  35757. if( p != end )
  35758. {
  35759. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange" ) );
  35760. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
  35761. }
  35762. if( ( ret = mbedtls_dhm_calc_secret( &ssl->handshake->dhm_ctx,
  35763. ssl->handshake->premaster,
  35764. MBEDTLS_PREMASTER_SIZE,
  35765. &ssl->handshake->pmslen,
  35766. ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
  35767. {
  35768. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_calc_secret", ret );
  35769. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS );
  35770. }
  35771. MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K );
  35772. }
  35773. else
  35774. #endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */
  35775. #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
  35776. defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
  35777. defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
  35778. defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
  35779. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
  35780. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA ||
  35781. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA ||
  35782. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA )
  35783. {
  35784. if( ( ret = mbedtls_ecdh_read_public( &ssl->handshake->ecdh_ctx,
  35785. p, end - p) ) != 0 )
  35786. {
  35787. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_read_public", ret );
  35788. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP );
  35789. }
  35790. MBEDTLS_SSL_DEBUG_ECP( 3, "ECDH: Qp ", &ssl->handshake->ecdh_ctx.Qp );
  35791. if( ( ret = mbedtls_ecdh_calc_secret( &ssl->handshake->ecdh_ctx,
  35792. &ssl->handshake->pmslen,
  35793. ssl->handshake->premaster,
  35794. MBEDTLS_MPI_MAX_SIZE,
  35795. ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
  35796. {
  35797. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_calc_secret", ret );
  35798. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS );
  35799. }
  35800. MBEDTLS_SSL_DEBUG_MPI( 3, "ECDH: z ", &ssl->handshake->ecdh_ctx.z );
  35801. }
  35802. else
  35803. #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
  35804. MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
  35805. MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
  35806. MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
  35807. #if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
  35808. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK )
  35809. {
  35810. if( ( ret = ssl_parse_client_psk_identity( ssl, &p, end ) ) != 0 )
  35811. {
  35812. MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_parse_client_psk_identity" ), ret );
  35813. return( ret );
  35814. }
  35815. if( p != end )
  35816. {
  35817. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange" ) );
  35818. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
  35819. }
  35820. if( ( ret = mbedtls_ssl_psk_derive_premaster( ssl,
  35821. ciphersuite_info->key_exchange ) ) != 0 )
  35822. {
  35823. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_psk_derive_premaster", ret );
  35824. return( ret );
  35825. }
  35826. }
  35827. else
  35828. #endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */
  35829. #if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
  35830. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK )
  35831. {
  35832. if( ( ret = ssl_parse_client_psk_identity( ssl, &p, end ) ) != 0 )
  35833. {
  35834. MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_parse_client_psk_identity" ), ret );
  35835. return( ret );
  35836. }
  35837. if( ( ret = ssl_parse_encrypted_pms( ssl, p, end, 2 ) ) != 0 )
  35838. {
  35839. MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_parse_encrypted_pms" ), ret );
  35840. return( ret );
  35841. }
  35842. if( ( ret = mbedtls_ssl_psk_derive_premaster( ssl,
  35843. ciphersuite_info->key_exchange ) ) != 0 )
  35844. {
  35845. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_psk_derive_premaster", ret );
  35846. return( ret );
  35847. }
  35848. }
  35849. else
  35850. #endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
  35851. #if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
  35852. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK )
  35853. {
  35854. if( ( ret = ssl_parse_client_psk_identity( ssl, &p, end ) ) != 0 )
  35855. {
  35856. MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_parse_client_psk_identity" ), ret );
  35857. return( ret );
  35858. }
  35859. if( ( ret = ssl_parse_client_dh_public( ssl, &p, end ) ) != 0 )
  35860. {
  35861. MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_parse_client_dh_public" ), ret );
  35862. return( ret );
  35863. }
  35864. if( p != end )
  35865. {
  35866. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange" ) );
  35867. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
  35868. }
  35869. if( ( ret = mbedtls_ssl_psk_derive_premaster( ssl,
  35870. ciphersuite_info->key_exchange ) ) != 0 )
  35871. {
  35872. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_psk_derive_premaster", ret );
  35873. return( ret );
  35874. }
  35875. }
  35876. else
  35877. #endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
  35878. #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
  35879. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )
  35880. {
  35881. if( ( ret = ssl_parse_client_psk_identity( ssl, &p, end ) ) != 0 )
  35882. {
  35883. MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_parse_client_psk_identity" ), ret );
  35884. return( ret );
  35885. }
  35886. if( ( ret = mbedtls_ecdh_read_public( &ssl->handshake->ecdh_ctx,
  35887. p, end - p ) ) != 0 )
  35888. {
  35889. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_read_public", ret );
  35890. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP );
  35891. }
  35892. MBEDTLS_SSL_DEBUG_ECP( 3, "ECDH: Qp ", &ssl->handshake->ecdh_ctx.Qp );
  35893. if( ( ret = mbedtls_ssl_psk_derive_premaster( ssl,
  35894. ciphersuite_info->key_exchange ) ) != 0 )
  35895. {
  35896. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_psk_derive_premaster", ret );
  35897. return( ret );
  35898. }
  35899. }
  35900. else
  35901. #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
  35902. #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
  35903. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA )
  35904. {
  35905. if( ( ret = ssl_parse_encrypted_pms( ssl, p, end, 0 ) ) != 0 )
  35906. {
  35907. MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_parse_parse_encrypted_pms_secret" ), ret );
  35908. return( ret );
  35909. }
  35910. }
  35911. else
  35912. #endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
  35913. #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
  35914. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
  35915. {
  35916. ret = mbedtls_ecjpake_read_round_two( &ssl->handshake->ecjpake_ctx,
  35917. p, end - p );
  35918. if( ret != 0 )
  35919. {
  35920. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_read_round_two", ret );
  35921. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
  35922. }
  35923. ret = mbedtls_ecjpake_derive_secret( &ssl->handshake->ecjpake_ctx,
  35924. ssl->handshake->premaster, 32, &ssl->handshake->pmslen,
  35925. ssl->conf->f_rng, ssl->conf->p_rng );
  35926. if( ret != 0 )
  35927. {
  35928. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_derive_secret", ret );
  35929. return( ret );
  35930. }
  35931. }
  35932. else
  35933. #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
  35934. {
  35935. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  35936. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  35937. }
  35938. if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 )
  35939. {
  35940. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_derive_keys", ret );
  35941. return( ret );
  35942. }
  35943. ssl->state++;
  35944. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse client key exchange" ) );
  35945. return( 0 );
  35946. }
  35947. #if !defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) && \
  35948. !defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) && \
  35949. !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) && \
  35950. !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
  35951. static int ssl_parse_certificate_verify( mbedtls_ssl_context *ssl )
  35952. {
  35953. const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
  35954. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate verify" ) );
  35955. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
  35956. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
  35957. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
  35958. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
  35959. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
  35960. {
  35961. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate verify" ) );
  35962. ssl->state++;
  35963. return( 0 );
  35964. }
  35965. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  35966. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  35967. }
  35968. #else
  35969. static int ssl_parse_certificate_verify( mbedtls_ssl_context *ssl )
  35970. {
  35971. int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
  35972. size_t i, sig_len;
  35973. unsigned char hash[48];
  35974. unsigned char *hash_start = hash;
  35975. size_t hashlen;
  35976. #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
  35977. mbedtls_pk_type_t pk_alg;
  35978. #endif
  35979. mbedtls_md_type_t md_alg;
  35980. const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
  35981. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate verify" ) );
  35982. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
  35983. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
  35984. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
  35985. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
  35986. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ||
  35987. ssl->session_negotiate->peer_cert == NULL )
  35988. {
  35989. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate verify" ) );
  35990. ssl->state++;
  35991. return( 0 );
  35992. }
  35993. /* Needs to be done before read_record() to exclude current message */
  35994. ssl->handshake->calc_verify( ssl, hash );
  35995. if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 )
  35996. {
  35997. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
  35998. return( ret );
  35999. }
  36000. ssl->state++;
  36001. if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ||
  36002. ssl->in_msg[0] != MBEDTLS_SSL_HS_CERTIFICATE_VERIFY )
  36003. {
  36004. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate verify message" ) );
  36005. return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );
  36006. }
  36007. i = mbedtls_ssl_hs_hdr_len( ssl );
  36008. /*
  36009. * struct {
  36010. * SignatureAndHashAlgorithm algorithm; -- TLS 1.2 only
  36011. * opaque signature<0..2^16-1>;
  36012. * } DigitallySigned;
  36013. */
  36014. #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
  36015. defined(MBEDTLS_SSL_PROTO_TLS1_1)
  36016. if( ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_3 )
  36017. {
  36018. md_alg = MBEDTLS_MD_NONE;
  36019. hashlen = 36;
  36020. /* For ECDSA, use SHA-1, not MD-5 + SHA-1 */
  36021. if( mbedtls_pk_can_do( &ssl->session_negotiate->peer_cert->pk,
  36022. MBEDTLS_PK_ECDSA ) )
  36023. {
  36024. hash_start += 16;
  36025. hashlen -= 16;
  36026. md_alg = MBEDTLS_MD_SHA1;
  36027. }
  36028. }
  36029. else
  36030. #endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 ||
  36031. MBEDTLS_SSL_PROTO_TLS1_1 */
  36032. #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
  36033. if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
  36034. {
  36035. if( i + 2 > ssl->in_hslen )
  36036. {
  36037. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate verify message" ) );
  36038. return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );
  36039. }
  36040. /*
  36041. * Hash
  36042. */
  36043. if( ssl->in_msg[i] != ssl->handshake->verify_sig_alg )
  36044. {
  36045. MBEDTLS_SSL_DEBUG_MSG( 1, ( "peer not adhering to requested sig_alg"
  36046. " for verify message" ) );
  36047. return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );
  36048. }
  36049. md_alg = mbedtls_ssl_md_alg_from_hash( ssl->handshake->verify_sig_alg );
  36050. /* Info from md_alg will be used instead */
  36051. hashlen = 0;
  36052. i++;
  36053. /*
  36054. * Signature
  36055. */
  36056. if( ( pk_alg = mbedtls_ssl_pk_alg_from_sig( ssl->in_msg[i] ) )
  36057. == MBEDTLS_PK_NONE )
  36058. {
  36059. MBEDTLS_SSL_DEBUG_MSG( 1, ( "peer not adhering to requested sig_alg"
  36060. " for verify message" ) );
  36061. return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );
  36062. }
  36063. /*
  36064. * Check the certificate's key type matches the signature alg
  36065. */
  36066. if( ! mbedtls_pk_can_do( &ssl->session_negotiate->peer_cert->pk, pk_alg ) )
  36067. {
  36068. MBEDTLS_SSL_DEBUG_MSG( 1, ( "sig_alg doesn't match cert key" ) );
  36069. return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );
  36070. }
  36071. i++;
  36072. }
  36073. else
  36074. #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
  36075. {
  36076. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  36077. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  36078. }
  36079. if( i + 2 > ssl->in_hslen )
  36080. {
  36081. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate verify message" ) );
  36082. return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );
  36083. }
  36084. sig_len = ( ssl->in_msg[i] << 8 ) | ssl->in_msg[i+1];
  36085. i += 2;
  36086. if( i + sig_len != ssl->in_hslen )
  36087. {
  36088. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate verify message" ) );
  36089. return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );
  36090. }
  36091. if( ( ret = mbedtls_pk_verify( &ssl->session_negotiate->peer_cert->pk,
  36092. md_alg, hash_start, hashlen,
  36093. ssl->in_msg + i, sig_len ) ) != 0 )
  36094. {
  36095. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_pk_verify", ret );
  36096. return( ret );
  36097. }
  36098. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse certificate verify" ) );
  36099. return( ret );
  36100. }
  36101. #endif /* !MBEDTLS_KEY_EXCHANGE_RSA_ENABLED &&
  36102. !MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED &&
  36103. !MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
  36104. #if defined(MBEDTLS_SSL_SESSION_TICKETS)
  36105. static int ssl_write_new_session_ticket( mbedtls_ssl_context *ssl )
  36106. {
  36107. int ret;
  36108. size_t tlen;
  36109. uint32_t lifetime;
  36110. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write new session ticket" ) );
  36111. ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
  36112. ssl->out_msg[0] = MBEDTLS_SSL_HS_NEW_SESSION_TICKET;
  36113. /*
  36114. * struct {
  36115. * uint32 ticket_lifetime_hint;
  36116. * opaque ticket<0..2^16-1>;
  36117. * } NewSessionTicket;
  36118. *
  36119. * 4 . 7 ticket_lifetime_hint (0 = unspecified)
  36120. * 8 . 9 ticket_len (n)
  36121. * 10 . 9+n ticket content
  36122. */
  36123. if( ( ret = ssl->conf->f_ticket_write( ssl->conf->p_ticket,
  36124. ssl->session_negotiate,
  36125. ssl->out_msg + 10,
  36126. ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN,
  36127. &tlen, &lifetime ) ) != 0 )
  36128. {
  36129. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_ticket_write", ret );
  36130. tlen = 0;
  36131. }
  36132. ssl->out_msg[4] = ( lifetime >> 24 ) & 0xFF;
  36133. ssl->out_msg[5] = ( lifetime >> 16 ) & 0xFF;
  36134. ssl->out_msg[6] = ( lifetime >> 8 ) & 0xFF;
  36135. ssl->out_msg[7] = ( lifetime ) & 0xFF;
  36136. ssl->out_msg[8] = (unsigned char)( ( tlen >> 8 ) & 0xFF );
  36137. ssl->out_msg[9] = (unsigned char)( ( tlen ) & 0xFF );
  36138. ssl->out_msglen = 10 + tlen;
  36139. /*
  36140. * Morally equivalent to updating ssl->state, but NewSessionTicket and
  36141. * ChangeCipherSpec share the same state.
  36142. */
  36143. ssl->handshake->new_session_ticket = 0;
  36144. if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 )
  36145. {
  36146. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret );
  36147. return( ret );
  36148. }
  36149. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write new session ticket" ) );
  36150. return( 0 );
  36151. }
  36152. #endif /* MBEDTLS_SSL_SESSION_TICKETS */
  36153. /*
  36154. * SSL handshake -- server side -- single step
  36155. */
  36156. int mbedtls_ssl_handshake_server_step( mbedtls_ssl_context *ssl )
  36157. {
  36158. int ret = 0;
  36159. if( ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER || ssl->handshake == NULL )
  36160. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  36161. MBEDTLS_SSL_DEBUG_MSG( 2, ( "server state: %d", ssl->state ) );
  36162. if( ( ret = mbedtls_ssl_flush_output( ssl ) ) != 0 )
  36163. return( ret );
  36164. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  36165. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
  36166. ssl->handshake->retransmit_state == MBEDTLS_SSL_RETRANS_SENDING )
  36167. {
  36168. if( ( ret = mbedtls_ssl_resend( ssl ) ) != 0 )
  36169. return( ret );
  36170. }
  36171. #endif
  36172. switch( ssl->state )
  36173. {
  36174. case MBEDTLS_SSL_HELLO_REQUEST:
  36175. ssl->state = MBEDTLS_SSL_CLIENT_HELLO;
  36176. break;
  36177. /*
  36178. * <== ClientHello
  36179. */
  36180. case MBEDTLS_SSL_CLIENT_HELLO:
  36181. ret = ssl_parse_client_hello( ssl );
  36182. break;
  36183. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  36184. case MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT:
  36185. return( MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED );
  36186. #endif
  36187. /*
  36188. * ==> ServerHello
  36189. * Certificate
  36190. * ( ServerKeyExchange )
  36191. * ( CertificateRequest )
  36192. * ServerHelloDone
  36193. */
  36194. case MBEDTLS_SSL_SERVER_HELLO:
  36195. ret = ssl_write_server_hello( ssl );
  36196. break;
  36197. case MBEDTLS_SSL_SERVER_CERTIFICATE:
  36198. ret = mbedtls_ssl_write_certificate( ssl );
  36199. break;
  36200. case MBEDTLS_SSL_SERVER_KEY_EXCHANGE:
  36201. ret = ssl_write_server_key_exchange( ssl );
  36202. break;
  36203. case MBEDTLS_SSL_CERTIFICATE_REQUEST:
  36204. ret = ssl_write_certificate_request( ssl );
  36205. break;
  36206. case MBEDTLS_SSL_SERVER_HELLO_DONE:
  36207. ret = ssl_write_server_hello_done( ssl );
  36208. break;
  36209. /*
  36210. * <== ( Certificate/Alert )
  36211. * ClientKeyExchange
  36212. * ( CertificateVerify )
  36213. * ChangeCipherSpec
  36214. * Finished
  36215. */
  36216. case MBEDTLS_SSL_CLIENT_CERTIFICATE:
  36217. ret = mbedtls_ssl_parse_certificate( ssl );
  36218. break;
  36219. case MBEDTLS_SSL_CLIENT_KEY_EXCHANGE:
  36220. ret = ssl_parse_client_key_exchange( ssl );
  36221. break;
  36222. case MBEDTLS_SSL_CERTIFICATE_VERIFY:
  36223. ret = ssl_parse_certificate_verify( ssl );
  36224. break;
  36225. case MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC:
  36226. ret = mbedtls_ssl_parse_change_cipher_spec( ssl );
  36227. break;
  36228. case MBEDTLS_SSL_CLIENT_FINISHED:
  36229. ret = mbedtls_ssl_parse_finished( ssl );
  36230. break;
  36231. /*
  36232. * ==> ( NewSessionTicket )
  36233. * ChangeCipherSpec
  36234. * Finished
  36235. */
  36236. case MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC:
  36237. #if defined(MBEDTLS_SSL_SESSION_TICKETS)
  36238. if( ssl->handshake->new_session_ticket != 0 )
  36239. ret = ssl_write_new_session_ticket( ssl );
  36240. else
  36241. #endif
  36242. ret = mbedtls_ssl_write_change_cipher_spec( ssl );
  36243. break;
  36244. case MBEDTLS_SSL_SERVER_FINISHED:
  36245. ret = mbedtls_ssl_write_finished( ssl );
  36246. break;
  36247. case MBEDTLS_SSL_FLUSH_BUFFERS:
  36248. MBEDTLS_SSL_DEBUG_MSG( 2, ( "handshake: done" ) );
  36249. ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;
  36250. break;
  36251. case MBEDTLS_SSL_HANDSHAKE_WRAPUP:
  36252. mbedtls_ssl_handshake_wrapup( ssl );
  36253. break;
  36254. default:
  36255. MBEDTLS_SSL_DEBUG_MSG( 1, ( "invalid state %d", ssl->state ) );
  36256. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  36257. }
  36258. return( ret );
  36259. }
  36260. #endif /* MBEDTLS_SSL_SRV_C */
  36261. /********* Start of file library/ssl_ticket.c ************/
  36262. /*
  36263. * TLS server tickets callbacks implementation
  36264. *
  36265. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  36266. * SPDX-License-Identifier: Apache-2.0
  36267. *
  36268. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  36269. * not use this file except in compliance with the License.
  36270. * You may obtain a copy of the License at
  36271. *
  36272. * http://www.apache.org/licenses/LICENSE-2.0
  36273. *
  36274. * Unless required by applicable law or agreed to in writing, software
  36275. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  36276. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  36277. * See the License for the specific language governing permissions and
  36278. * limitations under the License.
  36279. *
  36280. * This file is part of mbed TLS (https://tls.mbed.org)
  36281. */
  36282. #if !defined(MBEDTLS_CONFIG_FILE)
  36283. #else
  36284. #endif
  36285. #if defined(MBEDTLS_SSL_TICKET_C)
  36286. #if defined(MBEDTLS_PLATFORM_C)
  36287. #else
  36288. #include <stdlib.h>
  36289. #define mbedtls_calloc calloc
  36290. #define mbedtls_free free
  36291. #endif
  36292. #include <string.h>
  36293. /* Implementation that should never be optimized out by the compiler */
  36294. static void ssl_ticket_zeroize( void *v, size_t n ) {
  36295. volatile unsigned char *p = v; while( n-- ) *p++ = 0;
  36296. }
  36297. /*
  36298. * Initialze context
  36299. */
  36300. void mbedtls_ssl_ticket_init( mbedtls_ssl_ticket_context *ctx )
  36301. {
  36302. memset( ctx, 0, sizeof( mbedtls_ssl_ticket_context ) );
  36303. #if defined(MBEDTLS_THREADING_C)
  36304. mbedtls_mutex_init( &ctx->mutex );
  36305. #endif
  36306. }
  36307. #define MAX_KEY_BYTES 32 /* 256 bits */
  36308. /*
  36309. * Generate/update a key
  36310. */
  36311. static int ssl_ticket_gen_key( mbedtls_ssl_ticket_context *ctx,
  36312. unsigned char index )
  36313. {
  36314. int ret;
  36315. unsigned char buf[MAX_KEY_BYTES];
  36316. mbedtls_ssl_ticket_key *key = ctx->keys + index;
  36317. #if defined(MBEDTLS_HAVE_TIME)
  36318. key->generation_time = (uint32_t) time( NULL );
  36319. #endif
  36320. if( ( ret = ctx->f_rng( ctx->p_rng, key->name, sizeof( key->name ) ) ) != 0 )
  36321. return( ret );
  36322. if( ( ret = ctx->f_rng( ctx->p_rng, buf, sizeof( buf ) ) ) != 0 )
  36323. return( ret );
  36324. /* With GCM and CCM, same context can encrypt & decrypt */
  36325. ret = mbedtls_cipher_setkey( &key->ctx, buf,
  36326. mbedtls_cipher_get_key_bitlen( &key->ctx ),
  36327. MBEDTLS_ENCRYPT );
  36328. ssl_ticket_zeroize( buf, sizeof( buf ) );
  36329. return( ret );
  36330. }
  36331. /*
  36332. * Rotate/generate keys if necessary
  36333. */
  36334. static int ssl_ticket_update_keys( mbedtls_ssl_ticket_context *ctx )
  36335. {
  36336. #if !defined(MBEDTLS_HAVE_TIME)
  36337. ((void) ctx);
  36338. #else
  36339. if( ctx->ticket_lifetime != 0 )
  36340. {
  36341. uint32_t current_time = (uint32_t) time( NULL );
  36342. uint32_t key_time = ctx->keys[ctx->active].generation_time;
  36343. if( current_time > key_time &&
  36344. current_time - key_time < ctx->ticket_lifetime )
  36345. {
  36346. return( 0 );
  36347. }
  36348. ctx->active = 1 - ctx->active;
  36349. return( ssl_ticket_gen_key( ctx, ctx->active ) );
  36350. }
  36351. else
  36352. #endif /* MBEDTLS_HAVE_TIME */
  36353. return( 0 );
  36354. }
  36355. /*
  36356. * Setup context for actual use
  36357. */
  36358. int mbedtls_ssl_ticket_setup( mbedtls_ssl_ticket_context *ctx,
  36359. int (*f_rng)(void *, unsigned char *, size_t), void *p_rng,
  36360. mbedtls_cipher_type_t cipher,
  36361. uint32_t lifetime )
  36362. {
  36363. int ret;
  36364. const mbedtls_cipher_info_t *cipher_info;
  36365. ctx->f_rng = f_rng;
  36366. ctx->p_rng = p_rng;
  36367. ctx->ticket_lifetime = lifetime;
  36368. cipher_info = mbedtls_cipher_info_from_type( cipher);
  36369. if( cipher_info == NULL )
  36370. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  36371. if( cipher_info->mode != MBEDTLS_MODE_GCM &&
  36372. cipher_info->mode != MBEDTLS_MODE_CCM )
  36373. {
  36374. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  36375. }
  36376. if( cipher_info->key_bitlen > 8 * MAX_KEY_BYTES )
  36377. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  36378. if( ( ret = mbedtls_cipher_setup( &ctx->keys[0].ctx, cipher_info ) ) != 0 ||
  36379. ( ret = mbedtls_cipher_setup( &ctx->keys[1].ctx, cipher_info ) ) != 0 )
  36380. {
  36381. return( ret );
  36382. }
  36383. if( ( ret = ssl_ticket_gen_key( ctx, 0 ) ) != 0 ||
  36384. ( ret = ssl_ticket_gen_key( ctx, 1 ) ) != 0 )
  36385. {
  36386. return( ret );
  36387. }
  36388. return( 0 );
  36389. }
  36390. /*
  36391. * Serialize a session in the following format:
  36392. * 0 . n-1 session structure, n = sizeof(mbedtls_ssl_session)
  36393. * n . n+2 peer_cert length = m (0 if no certificate)
  36394. * n+3 . n+2+m peer cert ASN.1
  36395. */
  36396. static int ssl_save_session( const mbedtls_ssl_session *session,
  36397. unsigned char *buf, size_t buf_len,
  36398. size_t *olen )
  36399. {
  36400. unsigned char *p = buf;
  36401. size_t left = buf_len;
  36402. #if defined(MBEDTLS_X509_CRT_PARSE_C)
  36403. size_t cert_len;
  36404. #endif /* MBEDTLS_X509_CRT_PARSE_C */
  36405. if( left < sizeof( mbedtls_ssl_session ) )
  36406. return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
  36407. memcpy( p, session, sizeof( mbedtls_ssl_session ) );
  36408. p += sizeof( mbedtls_ssl_session );
  36409. left -= sizeof( mbedtls_ssl_session );
  36410. #if defined(MBEDTLS_X509_CRT_PARSE_C)
  36411. if( session->peer_cert == NULL )
  36412. cert_len = 0;
  36413. else
  36414. cert_len = session->peer_cert->raw.len;
  36415. if( left < 3 + cert_len )
  36416. return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
  36417. *p++ = (unsigned char)( cert_len >> 16 & 0xFF );
  36418. *p++ = (unsigned char)( cert_len >> 8 & 0xFF );
  36419. *p++ = (unsigned char)( cert_len & 0xFF );
  36420. if( session->peer_cert != NULL )
  36421. memcpy( p, session->peer_cert->raw.p, cert_len );
  36422. p += cert_len;
  36423. #endif /* MBEDTLS_X509_CRT_PARSE_C */
  36424. *olen = p - buf;
  36425. return( 0 );
  36426. }
  36427. /*
  36428. * Unserialise session, see ssl_save_session()
  36429. */
  36430. static int ssl_load_session( mbedtls_ssl_session *session,
  36431. const unsigned char *buf, size_t len )
  36432. {
  36433. const unsigned char *p = buf;
  36434. const unsigned char * const end = buf + len;
  36435. #if defined(MBEDTLS_X509_CRT_PARSE_C)
  36436. size_t cert_len;
  36437. #endif /* MBEDTLS_X509_CRT_PARSE_C */
  36438. if( p + sizeof( mbedtls_ssl_session ) > end )
  36439. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  36440. memcpy( session, p, sizeof( mbedtls_ssl_session ) );
  36441. p += sizeof( mbedtls_ssl_session );
  36442. #if defined(MBEDTLS_X509_CRT_PARSE_C)
  36443. if( p + 3 > end )
  36444. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  36445. cert_len = ( p[0] << 16 ) | ( p[1] << 8 ) | p[2];
  36446. p += 3;
  36447. if( cert_len == 0 )
  36448. {
  36449. session->peer_cert = NULL;
  36450. }
  36451. else
  36452. {
  36453. int ret;
  36454. if( p + cert_len > end )
  36455. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  36456. session->peer_cert = mbedtls_calloc( 1, sizeof( mbedtls_x509_crt ) );
  36457. if( session->peer_cert == NULL )
  36458. return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
  36459. mbedtls_x509_crt_init( session->peer_cert );
  36460. if( ( ret = mbedtls_x509_crt_parse_der( session->peer_cert,
  36461. p, cert_len ) ) != 0 )
  36462. {
  36463. mbedtls_x509_crt_free( session->peer_cert );
  36464. mbedtls_free( session->peer_cert );
  36465. session->peer_cert = NULL;
  36466. return( ret );
  36467. }
  36468. p += cert_len;
  36469. }
  36470. #endif /* MBEDTLS_X509_CRT_PARSE_C */
  36471. if( p != end )
  36472. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  36473. return( 0 );
  36474. }
  36475. /*
  36476. * Create session ticket, with the following structure:
  36477. *
  36478. * struct {
  36479. * opaque key_name[4];
  36480. * opaque iv[12];
  36481. * opaque encrypted_state<0..2^16-1>;
  36482. * opaque tag[16];
  36483. * } ticket;
  36484. *
  36485. * The key_name, iv, and length of encrypted_state are the additional
  36486. * authenticated data.
  36487. */
  36488. int mbedtls_ssl_ticket_write( void *p_ticket,
  36489. const mbedtls_ssl_session *session,
  36490. unsigned char *start,
  36491. const unsigned char *end,
  36492. size_t *tlen,
  36493. uint32_t *ticket_lifetime )
  36494. {
  36495. int ret;
  36496. mbedtls_ssl_ticket_context *ctx = p_ticket;
  36497. mbedtls_ssl_ticket_key *key;
  36498. unsigned char *key_name = start;
  36499. unsigned char *iv = start + 4;
  36500. unsigned char *state_len_bytes = iv + 12;
  36501. unsigned char *state = state_len_bytes + 2;
  36502. unsigned char *tag;
  36503. size_t clear_len, ciph_len;
  36504. *tlen = 0;
  36505. if( ctx == NULL || ctx->f_rng == NULL )
  36506. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  36507. /* We need at least 4 bytes for key_name, 12 for IV, 2 for len 16 for tag,
  36508. * in addition to session itself, that will be checked when writing it. */
  36509. if( end - start < 4 + 12 + 2 + 16 )
  36510. return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
  36511. #if defined(MBEDTLS_THREADING_C)
  36512. if( ( ret = mbedtls_mutex_lock( &ctx->mutex ) ) != 0 )
  36513. return( ret );
  36514. #endif
  36515. if( ( ret = ssl_ticket_update_keys( ctx ) ) != 0 )
  36516. goto cleanup;
  36517. key = &ctx->keys[ctx->active];
  36518. *ticket_lifetime = ctx->ticket_lifetime;
  36519. memcpy( key_name, key->name, 4 );
  36520. if( ( ret = ctx->f_rng( ctx->p_rng, iv, 12 ) ) != 0 )
  36521. goto cleanup;
  36522. /* Dump session state */
  36523. if( ( ret = ssl_save_session( session,
  36524. state, end - state, &clear_len ) ) != 0 ||
  36525. (unsigned long) clear_len > 65535 )
  36526. {
  36527. goto cleanup;
  36528. }
  36529. state_len_bytes[0] = ( clear_len >> 8 ) & 0xff;
  36530. state_len_bytes[1] = ( clear_len ) & 0xff;
  36531. /* Encrypt and authenticate */
  36532. tag = state + clear_len;
  36533. if( ( ret = mbedtls_cipher_auth_encrypt( &key->ctx,
  36534. iv, 12, key_name, 4 + 12 + 2,
  36535. state, clear_len, state, &ciph_len, tag, 16 ) ) != 0 )
  36536. {
  36537. goto cleanup;
  36538. }
  36539. if( ciph_len != clear_len )
  36540. {
  36541. ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR;
  36542. goto cleanup;
  36543. }
  36544. *tlen = 4 + 12 + 2 + 16 + ciph_len;
  36545. cleanup:
  36546. #if defined(MBEDTLS_THREADING_C)
  36547. if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 )
  36548. return( MBEDTLS_ERR_THREADING_MUTEX_ERROR );
  36549. #endif
  36550. return( ret );
  36551. }
  36552. /*
  36553. * Select key based on name
  36554. */
  36555. static mbedtls_ssl_ticket_key *ssl_ticket_select_key(
  36556. mbedtls_ssl_ticket_context *ctx,
  36557. const unsigned char name[4] )
  36558. {
  36559. unsigned char i;
  36560. for( i = 0; i < sizeof( ctx->keys ) / sizeof( *ctx->keys ); i++ )
  36561. if( memcmp( name, ctx->keys[i].name, 4 ) == 0 )
  36562. return( &ctx->keys[i] );
  36563. return( NULL );
  36564. }
  36565. /*
  36566. * Load session ticket (see mbedtls_ssl_ticket_write for structure)
  36567. */
  36568. int mbedtls_ssl_ticket_parse( void *p_ticket,
  36569. mbedtls_ssl_session *session,
  36570. unsigned char *buf,
  36571. size_t len )
  36572. {
  36573. int ret;
  36574. mbedtls_ssl_ticket_context *ctx = p_ticket;
  36575. mbedtls_ssl_ticket_key *key;
  36576. unsigned char *key_name = buf;
  36577. unsigned char *iv = buf + 4;
  36578. unsigned char *enc_len_p = iv + 12;
  36579. unsigned char *ticket = enc_len_p + 2;
  36580. unsigned char *tag;
  36581. size_t enc_len, clear_len;
  36582. if( ctx == NULL || ctx->f_rng == NULL )
  36583. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  36584. /* See mbedtls_ssl_ticket_write() */
  36585. if( len < 4 + 12 + 2 + 16 )
  36586. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  36587. #if defined(MBEDTLS_THREADING_C)
  36588. if( ( ret = mbedtls_mutex_lock( &ctx->mutex ) ) != 0 )
  36589. return( ret );
  36590. #endif
  36591. if( ( ret = ssl_ticket_update_keys( ctx ) ) != 0 )
  36592. goto cleanup;
  36593. enc_len = ( enc_len_p[0] << 8 ) | enc_len_p[1];
  36594. tag = ticket + enc_len;
  36595. if( len != 4 + 12 + 2 + enc_len + 16 )
  36596. {
  36597. ret = MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
  36598. goto cleanup;
  36599. }
  36600. /* Select key */
  36601. if( ( key = ssl_ticket_select_key( ctx, key_name ) ) == NULL )
  36602. {
  36603. /* We can't know for sure but this is a likely option unless we're
  36604. * under attack - this is only informative anyway */
  36605. ret = MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED;
  36606. goto cleanup;
  36607. }
  36608. /* Decrypt and authenticate */
  36609. if( ( ret = mbedtls_cipher_auth_decrypt( &key->ctx, iv, 12,
  36610. key_name, 4 + 12 + 2, ticket, enc_len,
  36611. ticket, &clear_len, tag, 16 ) ) != 0 )
  36612. {
  36613. if( ret == MBEDTLS_ERR_CIPHER_AUTH_FAILED )
  36614. ret = MBEDTLS_ERR_SSL_INVALID_MAC;
  36615. goto cleanup;
  36616. }
  36617. if( clear_len != enc_len )
  36618. {
  36619. ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR;
  36620. goto cleanup;
  36621. }
  36622. /* Actually load session */
  36623. if( ( ret = ssl_load_session( session, ticket, clear_len ) ) != 0 )
  36624. goto cleanup;
  36625. #if defined(MBEDTLS_HAVE_TIME)
  36626. {
  36627. /* Check for expiration */
  36628. time_t current_time = time( NULL );
  36629. if( current_time < session->start ||
  36630. (uint32_t)( current_time - session->start ) > ctx->ticket_lifetime )
  36631. {
  36632. ret = MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED;
  36633. goto cleanup;
  36634. }
  36635. }
  36636. #endif
  36637. cleanup:
  36638. #if defined(MBEDTLS_THREADING_C)
  36639. if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 )
  36640. return( MBEDTLS_ERR_THREADING_MUTEX_ERROR );
  36641. #endif
  36642. return( ret );
  36643. }
  36644. /*
  36645. * Free context
  36646. */
  36647. void mbedtls_ssl_ticket_free( mbedtls_ssl_ticket_context *ctx )
  36648. {
  36649. mbedtls_cipher_free( &ctx->keys[0].ctx );
  36650. mbedtls_cipher_free( &ctx->keys[1].ctx );
  36651. #if defined(MBEDTLS_THREADING_C)
  36652. mbedtls_mutex_free( &ctx->mutex );
  36653. #endif
  36654. ssl_ticket_zeroize( ctx, sizeof( mbedtls_ssl_ticket_context ) );
  36655. }
  36656. #endif /* MBEDTLS_SSL_TICKET_C */
  36657. /********* Start of file library/ssl_tls.c ************/
  36658. /*
  36659. * SSLv3/TLSv1 shared functions
  36660. *
  36661. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  36662. * SPDX-License-Identifier: Apache-2.0
  36663. *
  36664. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  36665. * not use this file except in compliance with the License.
  36666. * You may obtain a copy of the License at
  36667. *
  36668. * http://www.apache.org/licenses/LICENSE-2.0
  36669. *
  36670. * Unless required by applicable law or agreed to in writing, software
  36671. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  36672. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  36673. * See the License for the specific language governing permissions and
  36674. * limitations under the License.
  36675. *
  36676. * This file is part of mbed TLS (https://tls.mbed.org)
  36677. */
  36678. /*
  36679. * The SSL 3.0 specification was drafted by Netscape in 1996,
  36680. * and became an IETF standard in 1999.
  36681. *
  36682. * http://wp.netscape.com/eng/ssl3/
  36683. * http://www.ietf.org/rfc/rfc2246.txt
  36684. * http://www.ietf.org/rfc/rfc4346.txt
  36685. */
  36686. #if !defined(MBEDTLS_CONFIG_FILE)
  36687. #else
  36688. #endif
  36689. #if defined(MBEDTLS_SSL_TLS_C)
  36690. #include <string.h>
  36691. #if defined(MBEDTLS_X509_CRT_PARSE_C) && \
  36692. defined(MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE)
  36693. #endif
  36694. #if defined(MBEDTLS_PLATFORM_C)
  36695. #else
  36696. #include <stdlib.h>
  36697. #define mbedtls_calloc calloc
  36698. #define mbedtls_free free
  36699. #endif
  36700. /* Implementation that should never be optimized out by the compiler */
  36701. static void ssl_tls_zeroize( void *v, size_t n ) {
  36702. volatile unsigned char *p = v; while( n-- ) *p++ = 0;
  36703. }
  36704. /* Length of the "epoch" field in the record header */
  36705. static inline size_t ssl_ep_len( const mbedtls_ssl_context *ssl )
  36706. {
  36707. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  36708. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
  36709. return( 2 );
  36710. #else
  36711. ((void) ssl);
  36712. #endif
  36713. return( 0 );
  36714. }
  36715. /*
  36716. * Start a timer.
  36717. * Passing millisecs = 0 cancels a running timer.
  36718. */
  36719. static void ssl_set_timer( mbedtls_ssl_context *ssl, uint32_t millisecs )
  36720. {
  36721. if( ssl->f_set_timer == NULL )
  36722. return;
  36723. MBEDTLS_SSL_DEBUG_MSG( 3, ( "set_timer to %d ms", (int) millisecs ) );
  36724. ssl->f_set_timer( ssl->p_timer, millisecs / 4, millisecs );
  36725. }
  36726. /*
  36727. * Return -1 is timer is expired, 0 if it isn't.
  36728. */
  36729. static int ssl_check_timer( mbedtls_ssl_context *ssl )
  36730. {
  36731. if( ssl->f_get_timer == NULL )
  36732. return( 0 );
  36733. if( ssl->f_get_timer( ssl->p_timer ) == 2 )
  36734. {
  36735. MBEDTLS_SSL_DEBUG_MSG( 3, ( "timer expired" ) );
  36736. return( -1 );
  36737. }
  36738. return( 0 );
  36739. }
  36740. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  36741. /*
  36742. * Double the retransmit timeout value, within the allowed range,
  36743. * returning -1 if the maximum value has already been reached.
  36744. */
  36745. static int ssl_double_retransmit_timeout( mbedtls_ssl_context *ssl )
  36746. {
  36747. uint32_t new_timeout;
  36748. if( ssl->handshake->retransmit_timeout >= ssl->conf->hs_timeout_max )
  36749. return( -1 );
  36750. new_timeout = 2 * ssl->handshake->retransmit_timeout;
  36751. /* Avoid arithmetic overflow and range overflow */
  36752. if( new_timeout < ssl->handshake->retransmit_timeout ||
  36753. new_timeout > ssl->conf->hs_timeout_max )
  36754. {
  36755. new_timeout = ssl->conf->hs_timeout_max;
  36756. }
  36757. ssl->handshake->retransmit_timeout = new_timeout;
  36758. MBEDTLS_SSL_DEBUG_MSG( 3, ( "update timeout value to %d millisecs",
  36759. ssl->handshake->retransmit_timeout ) );
  36760. return( 0 );
  36761. }
  36762. static void ssl_reset_retransmit_timeout( mbedtls_ssl_context *ssl )
  36763. {
  36764. ssl->handshake->retransmit_timeout = ssl->conf->hs_timeout_min;
  36765. MBEDTLS_SSL_DEBUG_MSG( 3, ( "update timeout value to %d millisecs",
  36766. ssl->handshake->retransmit_timeout ) );
  36767. }
  36768. #endif /* MBEDTLS_SSL_PROTO_DTLS */
  36769. #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
  36770. /*
  36771. * Convert max_fragment_length codes to length.
  36772. * RFC 6066 says:
  36773. * enum{
  36774. * 2^9(1), 2^10(2), 2^11(3), 2^12(4), (255)
  36775. * } MaxFragmentLength;
  36776. * and we add 0 -> extension unused
  36777. */
  36778. static unsigned int mfl_code_to_length[MBEDTLS_SSL_MAX_FRAG_LEN_INVALID] =
  36779. {
  36780. MBEDTLS_SSL_MAX_CONTENT_LEN, /* MBEDTLS_SSL_MAX_FRAG_LEN_NONE */
  36781. 512, /* MBEDTLS_SSL_MAX_FRAG_LEN_512 */
  36782. 1024, /* MBEDTLS_SSL_MAX_FRAG_LEN_1024 */
  36783. 2048, /* MBEDTLS_SSL_MAX_FRAG_LEN_2048 */
  36784. 4096, /* MBEDTLS_SSL_MAX_FRAG_LEN_4096 */
  36785. };
  36786. #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
  36787. #if defined(MBEDTLS_SSL_CLI_C)
  36788. static int ssl_session_copy( mbedtls_ssl_session *dst, const mbedtls_ssl_session *src )
  36789. {
  36790. mbedtls_ssl_session_free( dst );
  36791. memcpy( dst, src, sizeof( mbedtls_ssl_session ) );
  36792. #if defined(MBEDTLS_X509_CRT_PARSE_C)
  36793. if( src->peer_cert != NULL )
  36794. {
  36795. int ret;
  36796. dst->peer_cert = mbedtls_calloc( 1, sizeof(mbedtls_x509_crt) );
  36797. if( dst->peer_cert == NULL )
  36798. return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
  36799. mbedtls_x509_crt_init( dst->peer_cert );
  36800. if( ( ret = mbedtls_x509_crt_parse_der( dst->peer_cert, src->peer_cert->raw.p,
  36801. src->peer_cert->raw.len ) ) != 0 )
  36802. {
  36803. mbedtls_free( dst->peer_cert );
  36804. dst->peer_cert = NULL;
  36805. return( ret );
  36806. }
  36807. }
  36808. #endif /* MBEDTLS_X509_CRT_PARSE_C */
  36809. #if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
  36810. if( src->ticket != NULL )
  36811. {
  36812. dst->ticket = mbedtls_calloc( 1, src->ticket_len );
  36813. if( dst->ticket == NULL )
  36814. return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
  36815. memcpy( dst->ticket, src->ticket, src->ticket_len );
  36816. }
  36817. #endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */
  36818. return( 0 );
  36819. }
  36820. #endif /* MBEDTLS_SSL_CLI_C */
  36821. #if defined(MBEDTLS_SSL_HW_RECORD_ACCEL)
  36822. int (*mbedtls_ssl_hw_record_init)( mbedtls_ssl_context *ssl,
  36823. const unsigned char *key_enc, const unsigned char *key_dec,
  36824. size_t keylen,
  36825. const unsigned char *iv_enc, const unsigned char *iv_dec,
  36826. size_t ivlen,
  36827. const unsigned char *mac_enc, const unsigned char *mac_dec,
  36828. size_t maclen ) = NULL;
  36829. int (*mbedtls_ssl_hw_record_activate)( mbedtls_ssl_context *ssl, int direction) = NULL;
  36830. int (*mbedtls_ssl_hw_record_reset)( mbedtls_ssl_context *ssl ) = NULL;
  36831. int (*mbedtls_ssl_hw_record_write)( mbedtls_ssl_context *ssl ) = NULL;
  36832. int (*mbedtls_ssl_hw_record_read)( mbedtls_ssl_context *ssl ) = NULL;
  36833. int (*mbedtls_ssl_hw_record_finish)( mbedtls_ssl_context *ssl ) = NULL;
  36834. #endif /* MBEDTLS_SSL_HW_RECORD_ACCEL */
  36835. /*
  36836. * Key material generation
  36837. */
  36838. #if defined(MBEDTLS_SSL_PROTO_SSL3)
  36839. static int ssl3_prf( const unsigned char *secret, size_t slen,
  36840. const char *label,
  36841. const unsigned char *random, size_t rlen,
  36842. unsigned char *dstbuf, size_t dlen )
  36843. {
  36844. size_t i;
  36845. mbedtls_md5_context md5;
  36846. mbedtls_sha1_context sha1;
  36847. unsigned char padding[16];
  36848. unsigned char sha1sum[20];
  36849. ((void)label);
  36850. mbedtls_md5_init( &md5 );
  36851. mbedtls_sha1_init( &sha1 );
  36852. /*
  36853. * SSLv3:
  36854. * block =
  36855. * MD5( secret + SHA1( 'A' + secret + random ) ) +
  36856. * MD5( secret + SHA1( 'BB' + secret + random ) ) +
  36857. * MD5( secret + SHA1( 'CCC' + secret + random ) ) +
  36858. * ...
  36859. */
  36860. for( i = 0; i < dlen / 16; i++ )
  36861. {
  36862. memset( padding, (unsigned char) ('A' + i), 1 + i );
  36863. mbedtls_sha1_starts( &sha1 );
  36864. mbedtls_sha1_update( &sha1, padding, 1 + i );
  36865. mbedtls_sha1_update( &sha1, secret, slen );
  36866. mbedtls_sha1_update( &sha1, random, rlen );
  36867. mbedtls_sha1_finish( &sha1, sha1sum );
  36868. mbedtls_md5_starts( &md5 );
  36869. mbedtls_md5_update( &md5, secret, slen );
  36870. mbedtls_md5_update( &md5, sha1sum, 20 );
  36871. mbedtls_md5_finish( &md5, dstbuf + i * 16 );
  36872. }
  36873. mbedtls_md5_free( &md5 );
  36874. mbedtls_sha1_free( &sha1 );
  36875. ssl_tls_zeroize( padding, sizeof( padding ) );
  36876. ssl_tls_zeroize( sha1sum, sizeof( sha1sum ) );
  36877. return( 0 );
  36878. }
  36879. #endif /* MBEDTLS_SSL_PROTO_SSL3 */
  36880. #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1)
  36881. static int tls1_prf( const unsigned char *secret, size_t slen,
  36882. const char *label,
  36883. const unsigned char *random, size_t rlen,
  36884. unsigned char *dstbuf, size_t dlen )
  36885. {
  36886. size_t nb, hs;
  36887. size_t i, j, k;
  36888. const unsigned char *S1, *S2;
  36889. unsigned char tmp[128];
  36890. unsigned char h_i[20];
  36891. const mbedtls_md_info_t *md_info;
  36892. mbedtls_md_context_t md_ctx;
  36893. int ret;
  36894. mbedtls_md_init( &md_ctx );
  36895. if( sizeof( tmp ) < 20 + strlen( label ) + rlen )
  36896. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  36897. hs = ( slen + 1 ) / 2;
  36898. S1 = secret;
  36899. S2 = secret + slen - hs;
  36900. nb = strlen( label );
  36901. memcpy( tmp + 20, label, nb );
  36902. memcpy( tmp + 20 + nb, random, rlen );
  36903. nb += rlen;
  36904. /*
  36905. * First compute P_md5(secret,label+random)[0..dlen]
  36906. */
  36907. if( ( md_info = mbedtls_md_info_from_type( MBEDTLS_MD_MD5 ) ) == NULL )
  36908. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  36909. if( ( ret = mbedtls_md_setup( &md_ctx, md_info, 1 ) ) != 0 )
  36910. return( ret );
  36911. mbedtls_md_hmac_starts( &md_ctx, S1, hs );
  36912. mbedtls_md_hmac_update( &md_ctx, tmp + 20, nb );
  36913. mbedtls_md_hmac_finish( &md_ctx, 4 + tmp );
  36914. for( i = 0; i < dlen; i += 16 )
  36915. {
  36916. mbedtls_md_hmac_reset ( &md_ctx );
  36917. mbedtls_md_hmac_update( &md_ctx, 4 + tmp, 16 + nb );
  36918. mbedtls_md_hmac_finish( &md_ctx, h_i );
  36919. mbedtls_md_hmac_reset ( &md_ctx );
  36920. mbedtls_md_hmac_update( &md_ctx, 4 + tmp, 16 );
  36921. mbedtls_md_hmac_finish( &md_ctx, 4 + tmp );
  36922. k = ( i + 16 > dlen ) ? dlen % 16 : 16;
  36923. for( j = 0; j < k; j++ )
  36924. dstbuf[i + j] = h_i[j];
  36925. }
  36926. mbedtls_md_free( &md_ctx );
  36927. /*
  36928. * XOR out with P_sha1(secret,label+random)[0..dlen]
  36929. */
  36930. if( ( md_info = mbedtls_md_info_from_type( MBEDTLS_MD_SHA1 ) ) == NULL )
  36931. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  36932. if( ( ret = mbedtls_md_setup( &md_ctx, md_info, 1 ) ) != 0 )
  36933. return( ret );
  36934. mbedtls_md_hmac_starts( &md_ctx, S2, hs );
  36935. mbedtls_md_hmac_update( &md_ctx, tmp + 20, nb );
  36936. mbedtls_md_hmac_finish( &md_ctx, tmp );
  36937. for( i = 0; i < dlen; i += 20 )
  36938. {
  36939. mbedtls_md_hmac_reset ( &md_ctx );
  36940. mbedtls_md_hmac_update( &md_ctx, tmp, 20 + nb );
  36941. mbedtls_md_hmac_finish( &md_ctx, h_i );
  36942. mbedtls_md_hmac_reset ( &md_ctx );
  36943. mbedtls_md_hmac_update( &md_ctx, tmp, 20 );
  36944. mbedtls_md_hmac_finish( &md_ctx, tmp );
  36945. k = ( i + 20 > dlen ) ? dlen % 20 : 20;
  36946. for( j = 0; j < k; j++ )
  36947. dstbuf[i + j] = (unsigned char)( dstbuf[i + j] ^ h_i[j] );
  36948. }
  36949. mbedtls_md_free( &md_ctx );
  36950. ssl_tls_zeroize( tmp, sizeof( tmp ) );
  36951. ssl_tls_zeroize( h_i, sizeof( h_i ) );
  36952. return( 0 );
  36953. }
  36954. #endif /* MBEDTLS_SSL_PROTO_TLS1) || MBEDTLS_SSL_PROTO_TLS1_1 */
  36955. #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
  36956. static int tls_prf_generic( mbedtls_md_type_t md_type,
  36957. const unsigned char *secret, size_t slen,
  36958. const char *label,
  36959. const unsigned char *random, size_t rlen,
  36960. unsigned char *dstbuf, size_t dlen )
  36961. {
  36962. size_t nb;
  36963. size_t i, j, k, md_len;
  36964. unsigned char tmp[128];
  36965. unsigned char h_i[MBEDTLS_MD_MAX_SIZE];
  36966. const mbedtls_md_info_t *md_info;
  36967. mbedtls_md_context_t md_ctx;
  36968. int ret;
  36969. mbedtls_md_init( &md_ctx );
  36970. if( ( md_info = mbedtls_md_info_from_type( md_type ) ) == NULL )
  36971. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  36972. md_len = mbedtls_md_get_size( md_info );
  36973. if( sizeof( tmp ) < md_len + strlen( label ) + rlen )
  36974. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  36975. nb = strlen( label );
  36976. memcpy( tmp + md_len, label, nb );
  36977. memcpy( tmp + md_len + nb, random, rlen );
  36978. nb += rlen;
  36979. /*
  36980. * Compute P_<hash>(secret, label + random)[0..dlen]
  36981. */
  36982. if ( ( ret = mbedtls_md_setup( &md_ctx, md_info, 1 ) ) != 0 )
  36983. return( ret );
  36984. mbedtls_md_hmac_starts( &md_ctx, secret, slen );
  36985. mbedtls_md_hmac_update( &md_ctx, tmp + md_len, nb );
  36986. mbedtls_md_hmac_finish( &md_ctx, tmp );
  36987. for( i = 0; i < dlen; i += md_len )
  36988. {
  36989. mbedtls_md_hmac_reset ( &md_ctx );
  36990. mbedtls_md_hmac_update( &md_ctx, tmp, md_len + nb );
  36991. mbedtls_md_hmac_finish( &md_ctx, h_i );
  36992. mbedtls_md_hmac_reset ( &md_ctx );
  36993. mbedtls_md_hmac_update( &md_ctx, tmp, md_len );
  36994. mbedtls_md_hmac_finish( &md_ctx, tmp );
  36995. k = ( i + md_len > dlen ) ? dlen % md_len : md_len;
  36996. for( j = 0; j < k; j++ )
  36997. dstbuf[i + j] = h_i[j];
  36998. }
  36999. mbedtls_md_free( &md_ctx );
  37000. ssl_tls_zeroize( tmp, sizeof( tmp ) );
  37001. ssl_tls_zeroize( h_i, sizeof( h_i ) );
  37002. return( 0 );
  37003. }
  37004. #if defined(MBEDTLS_SHA256_C)
  37005. static int tls_prf_sha256( const unsigned char *secret, size_t slen,
  37006. const char *label,
  37007. const unsigned char *random, size_t rlen,
  37008. unsigned char *dstbuf, size_t dlen )
  37009. {
  37010. return( tls_prf_generic( MBEDTLS_MD_SHA256, secret, slen,
  37011. label, random, rlen, dstbuf, dlen ) );
  37012. }
  37013. #endif /* MBEDTLS_SHA256_C */
  37014. #if defined(MBEDTLS_SHA512_C)
  37015. static int tls_prf_sha384( const unsigned char *secret, size_t slen,
  37016. const char *label,
  37017. const unsigned char *random, size_t rlen,
  37018. unsigned char *dstbuf, size_t dlen )
  37019. {
  37020. return( tls_prf_generic( MBEDTLS_MD_SHA384, secret, slen,
  37021. label, random, rlen, dstbuf, dlen ) );
  37022. }
  37023. #endif /* MBEDTLS_SHA512_C */
  37024. #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
  37025. static void ssl_update_checksum_start( mbedtls_ssl_context *, const unsigned char *, size_t );
  37026. #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
  37027. defined(MBEDTLS_SSL_PROTO_TLS1_1)
  37028. static void ssl_update_checksum_md5sha1( mbedtls_ssl_context *, const unsigned char *, size_t );
  37029. #endif
  37030. #if defined(MBEDTLS_SSL_PROTO_SSL3)
  37031. static void ssl_calc_verify_ssl( mbedtls_ssl_context *, unsigned char * );
  37032. static void ssl_calc_finished_ssl( mbedtls_ssl_context *, unsigned char *, int );
  37033. #endif
  37034. #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1)
  37035. static void ssl_calc_verify_tls( mbedtls_ssl_context *, unsigned char * );
  37036. static void ssl_calc_finished_tls( mbedtls_ssl_context *, unsigned char *, int );
  37037. #endif
  37038. #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
  37039. #if defined(MBEDTLS_SHA256_C)
  37040. static void ssl_update_checksum_sha256( mbedtls_ssl_context *, const unsigned char *, size_t );
  37041. static void ssl_calc_verify_tls_sha256( mbedtls_ssl_context *,unsigned char * );
  37042. static void ssl_calc_finished_tls_sha256( mbedtls_ssl_context *,unsigned char *, int );
  37043. #endif
  37044. #if defined(MBEDTLS_SHA512_C)
  37045. static void ssl_update_checksum_sha384( mbedtls_ssl_context *, const unsigned char *, size_t );
  37046. static void ssl_calc_verify_tls_sha384( mbedtls_ssl_context *, unsigned char * );
  37047. static void ssl_calc_finished_tls_sha384( mbedtls_ssl_context *, unsigned char *, int );
  37048. #endif
  37049. #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
  37050. int mbedtls_ssl_derive_keys( mbedtls_ssl_context *ssl )
  37051. {
  37052. int ret = 0;
  37053. unsigned char tmp[64];
  37054. unsigned char keyblk[256];
  37055. unsigned char *key1;
  37056. unsigned char *key2;
  37057. unsigned char *mac_enc;
  37058. unsigned char *mac_dec;
  37059. size_t iv_copy_len;
  37060. const mbedtls_cipher_info_t *cipher_info;
  37061. const mbedtls_md_info_t *md_info;
  37062. mbedtls_ssl_session *session = ssl->session_negotiate;
  37063. mbedtls_ssl_transform *transform = ssl->transform_negotiate;
  37064. mbedtls_ssl_handshake_params *handshake = ssl->handshake;
  37065. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> derive keys" ) );
  37066. cipher_info = mbedtls_cipher_info_from_type( transform->ciphersuite_info->cipher );
  37067. if( cipher_info == NULL )
  37068. {
  37069. MBEDTLS_SSL_DEBUG_MSG( 1, ( "cipher info for %d not found",
  37070. transform->ciphersuite_info->cipher ) );
  37071. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  37072. }
  37073. md_info = mbedtls_md_info_from_type( transform->ciphersuite_info->mac );
  37074. if( md_info == NULL )
  37075. {
  37076. MBEDTLS_SSL_DEBUG_MSG( 1, ( "mbedtls_md info for %d not found",
  37077. transform->ciphersuite_info->mac ) );
  37078. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  37079. }
  37080. /*
  37081. * Set appropriate PRF function and other SSL / TLS / TLS1.2 functions
  37082. */
  37083. #if defined(MBEDTLS_SSL_PROTO_SSL3)
  37084. if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
  37085. {
  37086. handshake->tls_prf = ssl3_prf;
  37087. handshake->calc_verify = ssl_calc_verify_ssl;
  37088. handshake->calc_finished = ssl_calc_finished_ssl;
  37089. }
  37090. else
  37091. #endif
  37092. #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1)
  37093. if( ssl->minor_ver < MBEDTLS_SSL_MINOR_VERSION_3 )
  37094. {
  37095. handshake->tls_prf = tls1_prf;
  37096. handshake->calc_verify = ssl_calc_verify_tls;
  37097. handshake->calc_finished = ssl_calc_finished_tls;
  37098. }
  37099. else
  37100. #endif
  37101. #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
  37102. #if defined(MBEDTLS_SHA512_C)
  37103. if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 &&
  37104. transform->ciphersuite_info->mac == MBEDTLS_MD_SHA384 )
  37105. {
  37106. handshake->tls_prf = tls_prf_sha384;
  37107. handshake->calc_verify = ssl_calc_verify_tls_sha384;
  37108. handshake->calc_finished = ssl_calc_finished_tls_sha384;
  37109. }
  37110. else
  37111. #endif
  37112. #if defined(MBEDTLS_SHA256_C)
  37113. if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
  37114. {
  37115. handshake->tls_prf = tls_prf_sha256;
  37116. handshake->calc_verify = ssl_calc_verify_tls_sha256;
  37117. handshake->calc_finished = ssl_calc_finished_tls_sha256;
  37118. }
  37119. else
  37120. #endif
  37121. #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
  37122. {
  37123. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  37124. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  37125. }
  37126. /*
  37127. * SSLv3:
  37128. * master =
  37129. * MD5( premaster + SHA1( 'A' + premaster + randbytes ) ) +
  37130. * MD5( premaster + SHA1( 'BB' + premaster + randbytes ) ) +
  37131. * MD5( premaster + SHA1( 'CCC' + premaster + randbytes ) )
  37132. *
  37133. * TLSv1+:
  37134. * master = PRF( premaster, "master secret", randbytes )[0..47]
  37135. */
  37136. if( handshake->resume == 0 )
  37137. {
  37138. MBEDTLS_SSL_DEBUG_BUF( 3, "premaster secret", handshake->premaster,
  37139. handshake->pmslen );
  37140. #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
  37141. if( ssl->handshake->extended_ms == MBEDTLS_SSL_EXTENDED_MS_ENABLED )
  37142. {
  37143. unsigned char session_hash[48];
  37144. size_t hash_len;
  37145. MBEDTLS_SSL_DEBUG_MSG( 3, ( "using extended master secret" ) );
  37146. ssl->handshake->calc_verify( ssl, session_hash );
  37147. #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
  37148. if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
  37149. {
  37150. #if defined(MBEDTLS_SHA512_C)
  37151. if( ssl->transform_negotiate->ciphersuite_info->mac ==
  37152. MBEDTLS_MD_SHA384 )
  37153. {
  37154. hash_len = 48;
  37155. }
  37156. else
  37157. #endif
  37158. hash_len = 32;
  37159. }
  37160. else
  37161. #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
  37162. hash_len = 36;
  37163. MBEDTLS_SSL_DEBUG_BUF( 3, "session hash", session_hash, hash_len );
  37164. ret = handshake->tls_prf( handshake->premaster, handshake->pmslen,
  37165. "extended master secret",
  37166. session_hash, hash_len,
  37167. session->master, 48 );
  37168. if( ret != 0 )
  37169. {
  37170. MBEDTLS_SSL_DEBUG_RET( 1, "prf", ret );
  37171. return( ret );
  37172. }
  37173. }
  37174. else
  37175. #endif
  37176. ret = handshake->tls_prf( handshake->premaster, handshake->pmslen,
  37177. "master secret",
  37178. handshake->randbytes, 64,
  37179. session->master, 48 );
  37180. if( ret != 0 )
  37181. {
  37182. MBEDTLS_SSL_DEBUG_RET( 1, "prf", ret );
  37183. return( ret );
  37184. }
  37185. ssl_tls_zeroize( handshake->premaster, sizeof(handshake->premaster) );
  37186. }
  37187. else
  37188. MBEDTLS_SSL_DEBUG_MSG( 3, ( "no premaster (session resumed)" ) );
  37189. /*
  37190. * Swap the client and server random values.
  37191. */
  37192. memcpy( tmp, handshake->randbytes, 64 );
  37193. memcpy( handshake->randbytes, tmp + 32, 32 );
  37194. memcpy( handshake->randbytes + 32, tmp, 32 );
  37195. ssl_tls_zeroize( tmp, sizeof( tmp ) );
  37196. /*
  37197. * SSLv3:
  37198. * key block =
  37199. * MD5( master + SHA1( 'A' + master + randbytes ) ) +
  37200. * MD5( master + SHA1( 'BB' + master + randbytes ) ) +
  37201. * MD5( master + SHA1( 'CCC' + master + randbytes ) ) +
  37202. * MD5( master + SHA1( 'DDDD' + master + randbytes ) ) +
  37203. * ...
  37204. *
  37205. * TLSv1:
  37206. * key block = PRF( master, "key expansion", randbytes )
  37207. */
  37208. ret = handshake->tls_prf( session->master, 48, "key expansion",
  37209. handshake->randbytes, 64, keyblk, 256 );
  37210. if( ret != 0 )
  37211. {
  37212. MBEDTLS_SSL_DEBUG_RET( 1, "prf", ret );
  37213. return( ret );
  37214. }
  37215. MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite = %s",
  37216. mbedtls_ssl_get_ciphersuite_name( session->ciphersuite ) ) );
  37217. MBEDTLS_SSL_DEBUG_BUF( 3, "master secret", session->master, 48 );
  37218. MBEDTLS_SSL_DEBUG_BUF( 4, "random bytes", handshake->randbytes, 64 );
  37219. MBEDTLS_SSL_DEBUG_BUF( 4, "key block", keyblk, 256 );
  37220. ssl_tls_zeroize( handshake->randbytes, sizeof( handshake->randbytes ) );
  37221. /*
  37222. * Determine the appropriate key, IV and MAC length.
  37223. */
  37224. transform->keylen = cipher_info->key_bitlen / 8;
  37225. if( cipher_info->mode == MBEDTLS_MODE_GCM ||
  37226. cipher_info->mode == MBEDTLS_MODE_CCM )
  37227. {
  37228. transform->maclen = 0;
  37229. transform->ivlen = 12;
  37230. transform->fixed_ivlen = 4;
  37231. /* Minimum length is expicit IV + tag */
  37232. transform->minlen = transform->ivlen - transform->fixed_ivlen
  37233. + ( transform->ciphersuite_info->flags &
  37234. MBEDTLS_CIPHERSUITE_SHORT_TAG ? 8 : 16 );
  37235. }
  37236. else
  37237. {
  37238. /* Initialize HMAC contexts */
  37239. if( ( ret = mbedtls_md_setup( &transform->md_ctx_enc, md_info, 1 ) ) != 0 ||
  37240. ( ret = mbedtls_md_setup( &transform->md_ctx_dec, md_info, 1 ) ) != 0 )
  37241. {
  37242. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_setup", ret );
  37243. return( ret );
  37244. }
  37245. /* Get MAC length */
  37246. transform->maclen = mbedtls_md_get_size( md_info );
  37247. #if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
  37248. /*
  37249. * If HMAC is to be truncated, we shall keep the leftmost bytes,
  37250. * (rfc 6066 page 13 or rfc 2104 section 4),
  37251. * so we only need to adjust the length here.
  37252. */
  37253. if( session->trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_ENABLED )
  37254. transform->maclen = MBEDTLS_SSL_TRUNCATED_HMAC_LEN;
  37255. #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
  37256. /* IV length */
  37257. transform->ivlen = cipher_info->iv_size;
  37258. /* Minimum length */
  37259. if( cipher_info->mode == MBEDTLS_MODE_STREAM )
  37260. transform->minlen = transform->maclen;
  37261. else
  37262. {
  37263. /*
  37264. * GenericBlockCipher:
  37265. * 1. if EtM is in use: one block plus MAC
  37266. * otherwise: * first multiple of blocklen greater than maclen
  37267. * 2. IV except for SSL3 and TLS 1.0
  37268. */
  37269. #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
  37270. if( session->encrypt_then_mac == MBEDTLS_SSL_ETM_ENABLED )
  37271. {
  37272. transform->minlen = transform->maclen
  37273. + cipher_info->block_size;
  37274. }
  37275. else
  37276. #endif
  37277. {
  37278. transform->minlen = transform->maclen
  37279. + cipher_info->block_size
  37280. - transform->maclen % cipher_info->block_size;
  37281. }
  37282. #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1)
  37283. if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ||
  37284. ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_1 )
  37285. ; /* No need to adjust minlen */
  37286. else
  37287. #endif
  37288. #if defined(MBEDTLS_SSL_PROTO_TLS1_1) || defined(MBEDTLS_SSL_PROTO_TLS1_2)
  37289. if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_2 ||
  37290. ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
  37291. {
  37292. transform->minlen += transform->ivlen;
  37293. }
  37294. else
  37295. #endif
  37296. {
  37297. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  37298. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  37299. }
  37300. }
  37301. }
  37302. MBEDTLS_SSL_DEBUG_MSG( 3, ( "keylen: %d, minlen: %d, ivlen: %d, maclen: %d",
  37303. transform->keylen, transform->minlen, transform->ivlen,
  37304. transform->maclen ) );
  37305. /*
  37306. * Finally setup the cipher contexts, IVs and MAC secrets.
  37307. */
  37308. #if defined(MBEDTLS_SSL_CLI_C)
  37309. if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )
  37310. {
  37311. key1 = keyblk + transform->maclen * 2;
  37312. key2 = keyblk + transform->maclen * 2 + transform->keylen;
  37313. mac_enc = keyblk;
  37314. mac_dec = keyblk + transform->maclen;
  37315. /*
  37316. * This is not used in TLS v1.1.
  37317. */
  37318. iv_copy_len = ( transform->fixed_ivlen ) ?
  37319. transform->fixed_ivlen : transform->ivlen;
  37320. memcpy( transform->iv_enc, key2 + transform->keylen, iv_copy_len );
  37321. memcpy( transform->iv_dec, key2 + transform->keylen + iv_copy_len,
  37322. iv_copy_len );
  37323. }
  37324. else
  37325. #endif /* MBEDTLS_SSL_CLI_C */
  37326. #if defined(MBEDTLS_SSL_SRV_C)
  37327. if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
  37328. {
  37329. key1 = keyblk + transform->maclen * 2 + transform->keylen;
  37330. key2 = keyblk + transform->maclen * 2;
  37331. mac_enc = keyblk + transform->maclen;
  37332. mac_dec = keyblk;
  37333. /*
  37334. * This is not used in TLS v1.1.
  37335. */
  37336. iv_copy_len = ( transform->fixed_ivlen ) ?
  37337. transform->fixed_ivlen : transform->ivlen;
  37338. memcpy( transform->iv_dec, key1 + transform->keylen, iv_copy_len );
  37339. memcpy( transform->iv_enc, key1 + transform->keylen + iv_copy_len,
  37340. iv_copy_len );
  37341. }
  37342. else
  37343. #endif /* MBEDTLS_SSL_SRV_C */
  37344. {
  37345. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  37346. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  37347. }
  37348. #if defined(MBEDTLS_SSL_PROTO_SSL3)
  37349. if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
  37350. {
  37351. if( transform->maclen > sizeof transform->mac_enc )
  37352. {
  37353. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  37354. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  37355. }
  37356. memcpy( transform->mac_enc, mac_enc, transform->maclen );
  37357. memcpy( transform->mac_dec, mac_dec, transform->maclen );
  37358. }
  37359. else
  37360. #endif /* MBEDTLS_SSL_PROTO_SSL3 */
  37361. #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
  37362. defined(MBEDTLS_SSL_PROTO_TLS1_2)
  37363. if( ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_1 )
  37364. {
  37365. mbedtls_md_hmac_starts( &transform->md_ctx_enc, mac_enc, transform->maclen );
  37366. mbedtls_md_hmac_starts( &transform->md_ctx_dec, mac_dec, transform->maclen );
  37367. }
  37368. else
  37369. #endif
  37370. {
  37371. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  37372. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  37373. }
  37374. #if defined(MBEDTLS_SSL_HW_RECORD_ACCEL)
  37375. if( mbedtls_ssl_hw_record_init != NULL )
  37376. {
  37377. int ret = 0;
  37378. MBEDTLS_SSL_DEBUG_MSG( 2, ( "going for mbedtls_ssl_hw_record_init()" ) );
  37379. if( ( ret = mbedtls_ssl_hw_record_init( ssl, key1, key2, transform->keylen,
  37380. transform->iv_enc, transform->iv_dec,
  37381. iv_copy_len,
  37382. mac_enc, mac_dec,
  37383. transform->maclen ) ) != 0 )
  37384. {
  37385. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_hw_record_init", ret );
  37386. return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
  37387. }
  37388. }
  37389. #endif /* MBEDTLS_SSL_HW_RECORD_ACCEL */
  37390. #if defined(MBEDTLS_SSL_EXPORT_KEYS)
  37391. if( ssl->conf->f_export_keys != NULL )
  37392. {
  37393. ssl->conf->f_export_keys( ssl->conf->p_export_keys,
  37394. session->master, keyblk,
  37395. transform->maclen, transform->keylen,
  37396. iv_copy_len );
  37397. }
  37398. #endif
  37399. if( ( ret = mbedtls_cipher_setup( &transform->cipher_ctx_enc,
  37400. cipher_info ) ) != 0 )
  37401. {
  37402. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setup", ret );
  37403. return( ret );
  37404. }
  37405. if( ( ret = mbedtls_cipher_setup( &transform->cipher_ctx_dec,
  37406. cipher_info ) ) != 0 )
  37407. {
  37408. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setup", ret );
  37409. return( ret );
  37410. }
  37411. if( ( ret = mbedtls_cipher_setkey( &transform->cipher_ctx_enc, key1,
  37412. cipher_info->key_bitlen,
  37413. MBEDTLS_ENCRYPT ) ) != 0 )
  37414. {
  37415. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setkey", ret );
  37416. return( ret );
  37417. }
  37418. if( ( ret = mbedtls_cipher_setkey( &transform->cipher_ctx_dec, key2,
  37419. cipher_info->key_bitlen,
  37420. MBEDTLS_DECRYPT ) ) != 0 )
  37421. {
  37422. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setkey", ret );
  37423. return( ret );
  37424. }
  37425. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  37426. if( cipher_info->mode == MBEDTLS_MODE_CBC )
  37427. {
  37428. if( ( ret = mbedtls_cipher_set_padding_mode( &transform->cipher_ctx_enc,
  37429. MBEDTLS_PADDING_NONE ) ) != 0 )
  37430. {
  37431. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_set_padding_mode", ret );
  37432. return( ret );
  37433. }
  37434. if( ( ret = mbedtls_cipher_set_padding_mode( &transform->cipher_ctx_dec,
  37435. MBEDTLS_PADDING_NONE ) ) != 0 )
  37436. {
  37437. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_set_padding_mode", ret );
  37438. return( ret );
  37439. }
  37440. }
  37441. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  37442. ssl_tls_zeroize( keyblk, sizeof( keyblk ) );
  37443. #if defined(MBEDTLS_ZLIB_SUPPORT)
  37444. // Initialize compression
  37445. //
  37446. if( session->compression == MBEDTLS_SSL_COMPRESS_DEFLATE )
  37447. {
  37448. if( ssl->compress_buf == NULL )
  37449. {
  37450. MBEDTLS_SSL_DEBUG_MSG( 3, ( "Allocating compression buffer" ) );
  37451. ssl->compress_buf = mbedtls_calloc( 1, MBEDTLS_SSL_BUFFER_LEN );
  37452. if( ssl->compress_buf == NULL )
  37453. {
  37454. MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc(%d bytes) failed",
  37455. MBEDTLS_SSL_BUFFER_LEN ) );
  37456. return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
  37457. }
  37458. }
  37459. MBEDTLS_SSL_DEBUG_MSG( 3, ( "Initializing zlib states" ) );
  37460. memset( &transform->ctx_deflate, 0, sizeof( transform->ctx_deflate ) );
  37461. memset( &transform->ctx_inflate, 0, sizeof( transform->ctx_inflate ) );
  37462. if( deflateInit( &transform->ctx_deflate,
  37463. Z_DEFAULT_COMPRESSION ) != Z_OK ||
  37464. inflateInit( &transform->ctx_inflate ) != Z_OK )
  37465. {
  37466. MBEDTLS_SSL_DEBUG_MSG( 1, ( "Failed to initialize compression" ) );
  37467. return( MBEDTLS_ERR_SSL_COMPRESSION_FAILED );
  37468. }
  37469. }
  37470. #endif /* MBEDTLS_ZLIB_SUPPORT */
  37471. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= derive keys" ) );
  37472. return( 0 );
  37473. }
  37474. #if defined(MBEDTLS_SSL_PROTO_SSL3)
  37475. void ssl_calc_verify_ssl( mbedtls_ssl_context *ssl, unsigned char hash[36] )
  37476. {
  37477. mbedtls_md5_context md5;
  37478. mbedtls_sha1_context sha1;
  37479. unsigned char pad_1[48];
  37480. unsigned char pad_2[48];
  37481. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc verify ssl" ) );
  37482. mbedtls_md5_init( &md5 );
  37483. mbedtls_sha1_init( &sha1 );
  37484. mbedtls_md5_clone( &md5, &ssl->handshake->fin_md5 );
  37485. mbedtls_sha1_clone( &sha1, &ssl->handshake->fin_sha1 );
  37486. memset( pad_1, 0x36, 48 );
  37487. memset( pad_2, 0x5C, 48 );
  37488. mbedtls_md5_update( &md5, ssl->session_negotiate->master, 48 );
  37489. mbedtls_md5_update( &md5, pad_1, 48 );
  37490. mbedtls_md5_finish( &md5, hash );
  37491. mbedtls_md5_starts( &md5 );
  37492. mbedtls_md5_update( &md5, ssl->session_negotiate->master, 48 );
  37493. mbedtls_md5_update( &md5, pad_2, 48 );
  37494. mbedtls_md5_update( &md5, hash, 16 );
  37495. mbedtls_md5_finish( &md5, hash );
  37496. mbedtls_sha1_update( &sha1, ssl->session_negotiate->master, 48 );
  37497. mbedtls_sha1_update( &sha1, pad_1, 40 );
  37498. mbedtls_sha1_finish( &sha1, hash + 16 );
  37499. mbedtls_sha1_starts( &sha1 );
  37500. mbedtls_sha1_update( &sha1, ssl->session_negotiate->master, 48 );
  37501. mbedtls_sha1_update( &sha1, pad_2, 40 );
  37502. mbedtls_sha1_update( &sha1, hash + 16, 20 );
  37503. mbedtls_sha1_finish( &sha1, hash + 16 );
  37504. MBEDTLS_SSL_DEBUG_BUF( 3, "calculated verify result", hash, 36 );
  37505. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
  37506. mbedtls_md5_free( &md5 );
  37507. mbedtls_sha1_free( &sha1 );
  37508. return;
  37509. }
  37510. #endif /* MBEDTLS_SSL_PROTO_SSL3 */
  37511. #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1)
  37512. void ssl_calc_verify_tls( mbedtls_ssl_context *ssl, unsigned char hash[36] )
  37513. {
  37514. mbedtls_md5_context md5;
  37515. mbedtls_sha1_context sha1;
  37516. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc verify tls" ) );
  37517. mbedtls_md5_init( &md5 );
  37518. mbedtls_sha1_init( &sha1 );
  37519. mbedtls_md5_clone( &md5, &ssl->handshake->fin_md5 );
  37520. mbedtls_sha1_clone( &sha1, &ssl->handshake->fin_sha1 );
  37521. mbedtls_md5_finish( &md5, hash );
  37522. mbedtls_sha1_finish( &sha1, hash + 16 );
  37523. MBEDTLS_SSL_DEBUG_BUF( 3, "calculated verify result", hash, 36 );
  37524. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
  37525. mbedtls_md5_free( &md5 );
  37526. mbedtls_sha1_free( &sha1 );
  37527. return;
  37528. }
  37529. #endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 */
  37530. #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
  37531. #if defined(MBEDTLS_SHA256_C)
  37532. void ssl_calc_verify_tls_sha256( mbedtls_ssl_context *ssl, unsigned char hash[32] )
  37533. {
  37534. mbedtls_sha256_context sha256;
  37535. mbedtls_sha256_init( &sha256 );
  37536. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc verify sha256" ) );
  37537. mbedtls_sha256_clone( &sha256, &ssl->handshake->fin_sha256 );
  37538. mbedtls_sha256_finish( &sha256, hash );
  37539. MBEDTLS_SSL_DEBUG_BUF( 3, "calculated verify result", hash, 32 );
  37540. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
  37541. mbedtls_sha256_free( &sha256 );
  37542. return;
  37543. }
  37544. #endif /* MBEDTLS_SHA256_C */
  37545. #if defined(MBEDTLS_SHA512_C)
  37546. void ssl_calc_verify_tls_sha384( mbedtls_ssl_context *ssl, unsigned char hash[48] )
  37547. {
  37548. mbedtls_sha512_context sha512;
  37549. mbedtls_sha512_init( &sha512 );
  37550. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc verify sha384" ) );
  37551. mbedtls_sha512_clone( &sha512, &ssl->handshake->fin_sha512 );
  37552. mbedtls_sha512_finish( &sha512, hash );
  37553. MBEDTLS_SSL_DEBUG_BUF( 3, "calculated verify result", hash, 48 );
  37554. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
  37555. mbedtls_sha512_free( &sha512 );
  37556. return;
  37557. }
  37558. #endif /* MBEDTLS_SHA512_C */
  37559. #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
  37560. #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
  37561. int mbedtls_ssl_psk_derive_premaster( mbedtls_ssl_context *ssl, mbedtls_key_exchange_type_t key_ex )
  37562. {
  37563. unsigned char *p = ssl->handshake->premaster;
  37564. unsigned char *end = p + sizeof( ssl->handshake->premaster );
  37565. const unsigned char *psk = ssl->conf->psk;
  37566. size_t psk_len = ssl->conf->psk_len;
  37567. /* If the psk callback was called, use its result */
  37568. if( ssl->handshake->psk != NULL )
  37569. {
  37570. psk = ssl->handshake->psk;
  37571. psk_len = ssl->handshake->psk_len;
  37572. }
  37573. /*
  37574. * PMS = struct {
  37575. * opaque other_secret<0..2^16-1>;
  37576. * opaque psk<0..2^16-1>;
  37577. * };
  37578. * with "other_secret" depending on the particular key exchange
  37579. */
  37580. #if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
  37581. if( key_ex == MBEDTLS_KEY_EXCHANGE_PSK )
  37582. {
  37583. if( end - p < 2 )
  37584. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  37585. *(p++) = (unsigned char)( psk_len >> 8 );
  37586. *(p++) = (unsigned char)( psk_len );
  37587. if( end < p || (size_t)( end - p ) < psk_len )
  37588. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  37589. memset( p, 0, psk_len );
  37590. p += psk_len;
  37591. }
  37592. else
  37593. #endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */
  37594. #if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
  37595. if( key_ex == MBEDTLS_KEY_EXCHANGE_RSA_PSK )
  37596. {
  37597. /*
  37598. * other_secret already set by the ClientKeyExchange message,
  37599. * and is 48 bytes long
  37600. */
  37601. *p++ = 0;
  37602. *p++ = 48;
  37603. p += 48;
  37604. }
  37605. else
  37606. #endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
  37607. #if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
  37608. if( key_ex == MBEDTLS_KEY_EXCHANGE_DHE_PSK )
  37609. {
  37610. int ret;
  37611. size_t len;
  37612. /* Write length only when we know the actual value */
  37613. if( ( ret = mbedtls_dhm_calc_secret( &ssl->handshake->dhm_ctx,
  37614. p + 2, end - ( p + 2 ), &len,
  37615. ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
  37616. {
  37617. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_calc_secret", ret );
  37618. return( ret );
  37619. }
  37620. *(p++) = (unsigned char)( len >> 8 );
  37621. *(p++) = (unsigned char)( len );
  37622. p += len;
  37623. MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K );
  37624. }
  37625. else
  37626. #endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
  37627. #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
  37628. if( key_ex == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )
  37629. {
  37630. int ret;
  37631. size_t zlen;
  37632. if( ( ret = mbedtls_ecdh_calc_secret( &ssl->handshake->ecdh_ctx, &zlen,
  37633. p + 2, end - ( p + 2 ),
  37634. ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
  37635. {
  37636. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_calc_secret", ret );
  37637. return( ret );
  37638. }
  37639. *(p++) = (unsigned char)( zlen >> 8 );
  37640. *(p++) = (unsigned char)( zlen );
  37641. p += zlen;
  37642. MBEDTLS_SSL_DEBUG_MPI( 3, "ECDH: z", &ssl->handshake->ecdh_ctx.z );
  37643. }
  37644. else
  37645. #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
  37646. {
  37647. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  37648. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  37649. }
  37650. /* opaque psk<0..2^16-1>; */
  37651. if( end - p < 2 )
  37652. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  37653. *(p++) = (unsigned char)( psk_len >> 8 );
  37654. *(p++) = (unsigned char)( psk_len );
  37655. if( end < p || (size_t)( end - p ) < psk_len )
  37656. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  37657. memcpy( p, psk, psk_len );
  37658. p += psk_len;
  37659. ssl->handshake->pmslen = p - ssl->handshake->premaster;
  37660. return( 0 );
  37661. }
  37662. #endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */
  37663. #if defined(MBEDTLS_SSL_PROTO_SSL3)
  37664. /*
  37665. * SSLv3.0 MAC functions
  37666. */
  37667. static void ssl_mac( mbedtls_md_context_t *md_ctx, unsigned char *secret,
  37668. unsigned char *buf, size_t len,
  37669. unsigned char *ctr, int type )
  37670. {
  37671. unsigned char header[11];
  37672. unsigned char padding[48];
  37673. int padlen;
  37674. int md_size = mbedtls_md_get_size( md_ctx->md_info );
  37675. int md_type = mbedtls_md_get_type( md_ctx->md_info );
  37676. /* Only MD5 and SHA-1 supported */
  37677. if( md_type == MBEDTLS_MD_MD5 )
  37678. padlen = 48;
  37679. else
  37680. padlen = 40;
  37681. memcpy( header, ctr, 8 );
  37682. header[ 8] = (unsigned char) type;
  37683. header[ 9] = (unsigned char)( len >> 8 );
  37684. header[10] = (unsigned char)( len );
  37685. memset( padding, 0x36, padlen );
  37686. mbedtls_md_starts( md_ctx );
  37687. mbedtls_md_update( md_ctx, secret, md_size );
  37688. mbedtls_md_update( md_ctx, padding, padlen );
  37689. mbedtls_md_update( md_ctx, header, 11 );
  37690. mbedtls_md_update( md_ctx, buf, len );
  37691. mbedtls_md_finish( md_ctx, buf + len );
  37692. memset( padding, 0x5C, padlen );
  37693. mbedtls_md_starts( md_ctx );
  37694. mbedtls_md_update( md_ctx, secret, md_size );
  37695. mbedtls_md_update( md_ctx, padding, padlen );
  37696. mbedtls_md_update( md_ctx, buf + len, md_size );
  37697. mbedtls_md_finish( md_ctx, buf + len );
  37698. }
  37699. #endif /* MBEDTLS_SSL_PROTO_SSL3 */
  37700. #if defined(MBEDTLS_ARC4_C) || defined(MBEDTLS_CIPHER_NULL_CIPHER) || \
  37701. ( defined(MBEDTLS_CIPHER_MODE_CBC) && \
  37702. ( defined(MBEDTLS_AES_C) || defined(MBEDTLS_CAMELLIA_C) ) )
  37703. #define SSL_SOME_MODES_USE_MAC
  37704. #endif
  37705. /*
  37706. * Encryption/decryption functions
  37707. */
  37708. static int ssl_encrypt_buf( mbedtls_ssl_context *ssl )
  37709. {
  37710. mbedtls_cipher_mode_t mode;
  37711. int auth_done = 0;
  37712. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> encrypt buf" ) );
  37713. if( ssl->session_out == NULL || ssl->transform_out == NULL )
  37714. {
  37715. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  37716. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  37717. }
  37718. mode = mbedtls_cipher_get_cipher_mode( &ssl->transform_out->cipher_ctx_enc );
  37719. MBEDTLS_SSL_DEBUG_BUF( 4, "before encrypt: output payload",
  37720. ssl->out_msg, ssl->out_msglen );
  37721. /*
  37722. * Add MAC before if needed
  37723. */
  37724. #if defined(SSL_SOME_MODES_USE_MAC)
  37725. if( mode == MBEDTLS_MODE_STREAM ||
  37726. ( mode == MBEDTLS_MODE_CBC
  37727. #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
  37728. && ssl->session_out->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED
  37729. #endif
  37730. ) )
  37731. {
  37732. #if defined(MBEDTLS_SSL_PROTO_SSL3)
  37733. if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
  37734. {
  37735. ssl_mac( &ssl->transform_out->md_ctx_enc,
  37736. ssl->transform_out->mac_enc,
  37737. ssl->out_msg, ssl->out_msglen,
  37738. ssl->out_ctr, ssl->out_msgtype );
  37739. }
  37740. else
  37741. #endif
  37742. #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
  37743. defined(MBEDTLS_SSL_PROTO_TLS1_2)
  37744. if( ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_1 )
  37745. {
  37746. mbedtls_md_hmac_update( &ssl->transform_out->md_ctx_enc, ssl->out_ctr, 8 );
  37747. mbedtls_md_hmac_update( &ssl->transform_out->md_ctx_enc, ssl->out_hdr, 3 );
  37748. mbedtls_md_hmac_update( &ssl->transform_out->md_ctx_enc, ssl->out_len, 2 );
  37749. mbedtls_md_hmac_update( &ssl->transform_out->md_ctx_enc,
  37750. ssl->out_msg, ssl->out_msglen );
  37751. mbedtls_md_hmac_finish( &ssl->transform_out->md_ctx_enc,
  37752. ssl->out_msg + ssl->out_msglen );
  37753. mbedtls_md_hmac_reset( &ssl->transform_out->md_ctx_enc );
  37754. }
  37755. else
  37756. #endif
  37757. {
  37758. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  37759. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  37760. }
  37761. MBEDTLS_SSL_DEBUG_BUF( 4, "computed mac",
  37762. ssl->out_msg + ssl->out_msglen,
  37763. ssl->transform_out->maclen );
  37764. ssl->out_msglen += ssl->transform_out->maclen;
  37765. auth_done++;
  37766. }
  37767. #endif /* AEAD not the only option */
  37768. /*
  37769. * Encrypt
  37770. */
  37771. #if defined(MBEDTLS_ARC4_C) || defined(MBEDTLS_CIPHER_NULL_CIPHER)
  37772. if( mode == MBEDTLS_MODE_STREAM )
  37773. {
  37774. int ret;
  37775. size_t olen = 0;
  37776. MBEDTLS_SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, "
  37777. "including %d bytes of padding",
  37778. ssl->out_msglen, 0 ) );
  37779. if( ( ret = mbedtls_cipher_crypt( &ssl->transform_out->cipher_ctx_enc,
  37780. ssl->transform_out->iv_enc,
  37781. ssl->transform_out->ivlen,
  37782. ssl->out_msg, ssl->out_msglen,
  37783. ssl->out_msg, &olen ) ) != 0 )
  37784. {
  37785. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_crypt", ret );
  37786. return( ret );
  37787. }
  37788. if( ssl->out_msglen != olen )
  37789. {
  37790. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  37791. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  37792. }
  37793. }
  37794. else
  37795. #endif /* MBEDTLS_ARC4_C || MBEDTLS_CIPHER_NULL_CIPHER */
  37796. #if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CCM_C)
  37797. if( mode == MBEDTLS_MODE_GCM ||
  37798. mode == MBEDTLS_MODE_CCM )
  37799. {
  37800. int ret;
  37801. size_t enc_msglen, olen;
  37802. unsigned char *enc_msg;
  37803. unsigned char add_data[13];
  37804. unsigned char taglen = ssl->transform_out->ciphersuite_info->flags &
  37805. MBEDTLS_CIPHERSUITE_SHORT_TAG ? 8 : 16;
  37806. memcpy( add_data, ssl->out_ctr, 8 );
  37807. add_data[8] = ssl->out_msgtype;
  37808. mbedtls_ssl_write_version( ssl->major_ver, ssl->minor_ver,
  37809. ssl->conf->transport, add_data + 9 );
  37810. add_data[11] = ( ssl->out_msglen >> 8 ) & 0xFF;
  37811. add_data[12] = ssl->out_msglen & 0xFF;
  37812. MBEDTLS_SSL_DEBUG_BUF( 4, "additional data used for AEAD",
  37813. add_data, 13 );
  37814. /*
  37815. * Generate IV
  37816. */
  37817. #if defined(MBEDTLS_SSL_AEAD_RANDOM_IV)
  37818. ret = ssl->conf->f_rng( ssl->conf->p_rng,
  37819. ssl->transform_out->iv_enc + ssl->transform_out->fixed_ivlen,
  37820. ssl->transform_out->ivlen - ssl->transform_out->fixed_ivlen );
  37821. if( ret != 0 )
  37822. return( ret );
  37823. memcpy( ssl->out_iv,
  37824. ssl->transform_out->iv_enc + ssl->transform_out->fixed_ivlen,
  37825. ssl->transform_out->ivlen - ssl->transform_out->fixed_ivlen );
  37826. #else
  37827. if( ssl->transform_out->ivlen - ssl->transform_out->fixed_ivlen != 8 )
  37828. {
  37829. /* Reminder if we ever add an AEAD mode with a different size */
  37830. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  37831. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  37832. }
  37833. memcpy( ssl->transform_out->iv_enc + ssl->transform_out->fixed_ivlen,
  37834. ssl->out_ctr, 8 );
  37835. memcpy( ssl->out_iv, ssl->out_ctr, 8 );
  37836. #endif
  37837. MBEDTLS_SSL_DEBUG_BUF( 4, "IV used", ssl->out_iv,
  37838. ssl->transform_out->ivlen - ssl->transform_out->fixed_ivlen );
  37839. /*
  37840. * Fix pointer positions and message length with added IV
  37841. */
  37842. enc_msg = ssl->out_msg;
  37843. enc_msglen = ssl->out_msglen;
  37844. ssl->out_msglen += ssl->transform_out->ivlen -
  37845. ssl->transform_out->fixed_ivlen;
  37846. MBEDTLS_SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, "
  37847. "including %d bytes of padding",
  37848. ssl->out_msglen, 0 ) );
  37849. /*
  37850. * Encrypt and authenticate
  37851. */
  37852. if( ( ret = mbedtls_cipher_auth_encrypt( &ssl->transform_out->cipher_ctx_enc,
  37853. ssl->transform_out->iv_enc,
  37854. ssl->transform_out->ivlen,
  37855. add_data, 13,
  37856. enc_msg, enc_msglen,
  37857. enc_msg, &olen,
  37858. enc_msg + enc_msglen, taglen ) ) != 0 )
  37859. {
  37860. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_auth_encrypt", ret );
  37861. return( ret );
  37862. }
  37863. if( olen != enc_msglen )
  37864. {
  37865. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  37866. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  37867. }
  37868. ssl->out_msglen += taglen;
  37869. auth_done++;
  37870. MBEDTLS_SSL_DEBUG_BUF( 4, "after encrypt: tag", enc_msg + enc_msglen, taglen );
  37871. }
  37872. else
  37873. #endif /* MBEDTLS_GCM_C || MBEDTLS_CCM_C */
  37874. #if defined(MBEDTLS_CIPHER_MODE_CBC) && \
  37875. ( defined(MBEDTLS_AES_C) || defined(MBEDTLS_CAMELLIA_C) )
  37876. if( mode == MBEDTLS_MODE_CBC )
  37877. {
  37878. int ret;
  37879. unsigned char *enc_msg;
  37880. size_t enc_msglen, padlen, olen = 0, i;
  37881. padlen = ssl->transform_out->ivlen - ( ssl->out_msglen + 1 ) %
  37882. ssl->transform_out->ivlen;
  37883. if( padlen == ssl->transform_out->ivlen )
  37884. padlen = 0;
  37885. for( i = 0; i <= padlen; i++ )
  37886. ssl->out_msg[ssl->out_msglen + i] = (unsigned char) padlen;
  37887. ssl->out_msglen += padlen + 1;
  37888. enc_msglen = ssl->out_msglen;
  37889. enc_msg = ssl->out_msg;
  37890. #if defined(MBEDTLS_SSL_PROTO_TLS1_1) || defined(MBEDTLS_SSL_PROTO_TLS1_2)
  37891. /*
  37892. * Prepend per-record IV for block cipher in TLS v1.1 and up as per
  37893. * Method 1 (6.2.3.2. in RFC4346 and RFC5246)
  37894. */
  37895. if( ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_2 )
  37896. {
  37897. /*
  37898. * Generate IV
  37899. */
  37900. ret = ssl->conf->f_rng( ssl->conf->p_rng, ssl->transform_out->iv_enc,
  37901. ssl->transform_out->ivlen );
  37902. if( ret != 0 )
  37903. return( ret );
  37904. memcpy( ssl->out_iv, ssl->transform_out->iv_enc,
  37905. ssl->transform_out->ivlen );
  37906. /*
  37907. * Fix pointer positions and message length with added IV
  37908. */
  37909. enc_msg = ssl->out_msg;
  37910. enc_msglen = ssl->out_msglen;
  37911. ssl->out_msglen += ssl->transform_out->ivlen;
  37912. }
  37913. #endif /* MBEDTLS_SSL_PROTO_TLS1_1 || MBEDTLS_SSL_PROTO_TLS1_2 */
  37914. MBEDTLS_SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, "
  37915. "including %d bytes of IV and %d bytes of padding",
  37916. ssl->out_msglen, ssl->transform_out->ivlen,
  37917. padlen + 1 ) );
  37918. if( ( ret = mbedtls_cipher_crypt( &ssl->transform_out->cipher_ctx_enc,
  37919. ssl->transform_out->iv_enc,
  37920. ssl->transform_out->ivlen,
  37921. enc_msg, enc_msglen,
  37922. enc_msg, &olen ) ) != 0 )
  37923. {
  37924. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_crypt", ret );
  37925. return( ret );
  37926. }
  37927. if( enc_msglen != olen )
  37928. {
  37929. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  37930. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  37931. }
  37932. #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1)
  37933. if( ssl->minor_ver < MBEDTLS_SSL_MINOR_VERSION_2 )
  37934. {
  37935. /*
  37936. * Save IV in SSL3 and TLS1
  37937. */
  37938. memcpy( ssl->transform_out->iv_enc,
  37939. ssl->transform_out->cipher_ctx_enc.iv,
  37940. ssl->transform_out->ivlen );
  37941. }
  37942. #endif
  37943. #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
  37944. if( auth_done == 0 )
  37945. {
  37946. /*
  37947. * MAC(MAC_write_key, seq_num +
  37948. * TLSCipherText.type +
  37949. * TLSCipherText.version +
  37950. * length_of( (IV +) ENC(...) ) +
  37951. * IV + // except for TLS 1.0
  37952. * ENC(content + padding + padding_length));
  37953. */
  37954. unsigned char pseudo_hdr[13];
  37955. MBEDTLS_SSL_DEBUG_MSG( 3, ( "using encrypt then mac" ) );
  37956. memcpy( pseudo_hdr + 0, ssl->out_ctr, 8 );
  37957. memcpy( pseudo_hdr + 8, ssl->out_hdr, 3 );
  37958. pseudo_hdr[11] = (unsigned char)( ( ssl->out_msglen >> 8 ) & 0xFF );
  37959. pseudo_hdr[12] = (unsigned char)( ( ssl->out_msglen ) & 0xFF );
  37960. MBEDTLS_SSL_DEBUG_BUF( 4, "MAC'd meta-data", pseudo_hdr, 13 );
  37961. mbedtls_md_hmac_update( &ssl->transform_out->md_ctx_enc, pseudo_hdr, 13 );
  37962. mbedtls_md_hmac_update( &ssl->transform_out->md_ctx_enc,
  37963. ssl->out_iv, ssl->out_msglen );
  37964. mbedtls_md_hmac_finish( &ssl->transform_out->md_ctx_enc,
  37965. ssl->out_iv + ssl->out_msglen );
  37966. mbedtls_md_hmac_reset( &ssl->transform_out->md_ctx_enc );
  37967. ssl->out_msglen += ssl->transform_out->maclen;
  37968. auth_done++;
  37969. }
  37970. #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
  37971. }
  37972. else
  37973. #endif /* MBEDTLS_CIPHER_MODE_CBC &&
  37974. ( MBEDTLS_AES_C || MBEDTLS_CAMELLIA_C ) */
  37975. {
  37976. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  37977. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  37978. }
  37979. /* Make extra sure authentication was performed, exactly once */
  37980. if( auth_done != 1 )
  37981. {
  37982. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  37983. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  37984. }
  37985. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= encrypt buf" ) );
  37986. return( 0 );
  37987. }
  37988. #define SSL_MAX_MAC_SIZE 48
  37989. static int ssl_decrypt_buf( mbedtls_ssl_context *ssl )
  37990. {
  37991. size_t i;
  37992. mbedtls_cipher_mode_t mode;
  37993. int auth_done = 0;
  37994. #if defined(SSL_SOME_MODES_USE_MAC)
  37995. size_t padlen = 0, correct = 1;
  37996. #endif
  37997. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> decrypt buf" ) );
  37998. if( ssl->session_in == NULL || ssl->transform_in == NULL )
  37999. {
  38000. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  38001. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  38002. }
  38003. mode = mbedtls_cipher_get_cipher_mode( &ssl->transform_in->cipher_ctx_dec );
  38004. if( ssl->in_msglen < ssl->transform_in->minlen )
  38005. {
  38006. MBEDTLS_SSL_DEBUG_MSG( 1, ( "in_msglen (%d) < minlen (%d)",
  38007. ssl->in_msglen, ssl->transform_in->minlen ) );
  38008. return( MBEDTLS_ERR_SSL_INVALID_MAC );
  38009. }
  38010. #if defined(MBEDTLS_ARC4_C) || defined(MBEDTLS_CIPHER_NULL_CIPHER)
  38011. if( mode == MBEDTLS_MODE_STREAM )
  38012. {
  38013. int ret;
  38014. size_t olen = 0;
  38015. padlen = 0;
  38016. if( ( ret = mbedtls_cipher_crypt( &ssl->transform_in->cipher_ctx_dec,
  38017. ssl->transform_in->iv_dec,
  38018. ssl->transform_in->ivlen,
  38019. ssl->in_msg, ssl->in_msglen,
  38020. ssl->in_msg, &olen ) ) != 0 )
  38021. {
  38022. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_crypt", ret );
  38023. return( ret );
  38024. }
  38025. if( ssl->in_msglen != olen )
  38026. {
  38027. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  38028. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  38029. }
  38030. }
  38031. else
  38032. #endif /* MBEDTLS_ARC4_C || MBEDTLS_CIPHER_NULL_CIPHER */
  38033. #if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CCM_C)
  38034. if( mode == MBEDTLS_MODE_GCM ||
  38035. mode == MBEDTLS_MODE_CCM )
  38036. {
  38037. int ret;
  38038. size_t dec_msglen, olen;
  38039. unsigned char *dec_msg;
  38040. unsigned char *dec_msg_result;
  38041. unsigned char add_data[13];
  38042. unsigned char taglen = ssl->transform_in->ciphersuite_info->flags &
  38043. MBEDTLS_CIPHERSUITE_SHORT_TAG ? 8 : 16;
  38044. size_t explicit_iv_len = ssl->transform_in->ivlen -
  38045. ssl->transform_in->fixed_ivlen;
  38046. if( ssl->in_msglen < explicit_iv_len + taglen )
  38047. {
  38048. MBEDTLS_SSL_DEBUG_MSG( 1, ( "msglen (%d) < explicit_iv_len (%d) "
  38049. "+ taglen (%d)", ssl->in_msglen,
  38050. explicit_iv_len, taglen ) );
  38051. return( MBEDTLS_ERR_SSL_INVALID_MAC );
  38052. }
  38053. dec_msglen = ssl->in_msglen - explicit_iv_len - taglen;
  38054. dec_msg = ssl->in_msg;
  38055. dec_msg_result = ssl->in_msg;
  38056. ssl->in_msglen = dec_msglen;
  38057. memcpy( add_data, ssl->in_ctr, 8 );
  38058. add_data[8] = ssl->in_msgtype;
  38059. mbedtls_ssl_write_version( ssl->major_ver, ssl->minor_ver,
  38060. ssl->conf->transport, add_data + 9 );
  38061. add_data[11] = ( ssl->in_msglen >> 8 ) & 0xFF;
  38062. add_data[12] = ssl->in_msglen & 0xFF;
  38063. MBEDTLS_SSL_DEBUG_BUF( 4, "additional data used for AEAD",
  38064. add_data, 13 );
  38065. memcpy( ssl->transform_in->iv_dec + ssl->transform_in->fixed_ivlen,
  38066. ssl->in_iv,
  38067. ssl->transform_in->ivlen - ssl->transform_in->fixed_ivlen );
  38068. MBEDTLS_SSL_DEBUG_BUF( 4, "IV used", ssl->transform_in->iv_dec,
  38069. ssl->transform_in->ivlen );
  38070. MBEDTLS_SSL_DEBUG_BUF( 4, "TAG used", dec_msg + dec_msglen, taglen );
  38071. /*
  38072. * Decrypt and authenticate
  38073. */
  38074. if( ( ret = mbedtls_cipher_auth_decrypt( &ssl->transform_in->cipher_ctx_dec,
  38075. ssl->transform_in->iv_dec,
  38076. ssl->transform_in->ivlen,
  38077. add_data, 13,
  38078. dec_msg, dec_msglen,
  38079. dec_msg_result, &olen,
  38080. dec_msg + dec_msglen, taglen ) ) != 0 )
  38081. {
  38082. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_auth_decrypt", ret );
  38083. if( ret == MBEDTLS_ERR_CIPHER_AUTH_FAILED )
  38084. return( MBEDTLS_ERR_SSL_INVALID_MAC );
  38085. return( ret );
  38086. }
  38087. auth_done++;
  38088. if( olen != dec_msglen )
  38089. {
  38090. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  38091. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  38092. }
  38093. }
  38094. else
  38095. #endif /* MBEDTLS_GCM_C || MBEDTLS_CCM_C */
  38096. #if defined(MBEDTLS_CIPHER_MODE_CBC) && \
  38097. ( defined(MBEDTLS_AES_C) || defined(MBEDTLS_CAMELLIA_C) )
  38098. if( mode == MBEDTLS_MODE_CBC )
  38099. {
  38100. /*
  38101. * Decrypt and check the padding
  38102. */
  38103. int ret;
  38104. unsigned char *dec_msg;
  38105. unsigned char *dec_msg_result;
  38106. size_t dec_msglen;
  38107. size_t minlen = 0;
  38108. size_t olen = 0;
  38109. /*
  38110. * Check immediate ciphertext sanity
  38111. */
  38112. #if defined(MBEDTLS_SSL_PROTO_TLS1_1) || defined(MBEDTLS_SSL_PROTO_TLS1_2)
  38113. if( ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_2 )
  38114. minlen += ssl->transform_in->ivlen;
  38115. #endif
  38116. if( ssl->in_msglen < minlen + ssl->transform_in->ivlen ||
  38117. ssl->in_msglen < minlen + ssl->transform_in->maclen + 1 )
  38118. {
  38119. MBEDTLS_SSL_DEBUG_MSG( 1, ( "msglen (%d) < max( ivlen(%d), maclen (%d) "
  38120. "+ 1 ) ( + expl IV )", ssl->in_msglen,
  38121. ssl->transform_in->ivlen,
  38122. ssl->transform_in->maclen ) );
  38123. return( MBEDTLS_ERR_SSL_INVALID_MAC );
  38124. }
  38125. dec_msglen = ssl->in_msglen;
  38126. dec_msg = ssl->in_msg;
  38127. dec_msg_result = ssl->in_msg;
  38128. /*
  38129. * Authenticate before decrypt if enabled
  38130. */
  38131. #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
  38132. if( ssl->session_in->encrypt_then_mac == MBEDTLS_SSL_ETM_ENABLED )
  38133. {
  38134. unsigned char computed_mac[SSL_MAX_MAC_SIZE];
  38135. unsigned char pseudo_hdr[13];
  38136. MBEDTLS_SSL_DEBUG_MSG( 3, ( "using encrypt then mac" ) );
  38137. dec_msglen -= ssl->transform_in->maclen;
  38138. ssl->in_msglen -= ssl->transform_in->maclen;
  38139. memcpy( pseudo_hdr + 0, ssl->in_ctr, 8 );
  38140. memcpy( pseudo_hdr + 8, ssl->in_hdr, 3 );
  38141. pseudo_hdr[11] = (unsigned char)( ( ssl->in_msglen >> 8 ) & 0xFF );
  38142. pseudo_hdr[12] = (unsigned char)( ( ssl->in_msglen ) & 0xFF );
  38143. MBEDTLS_SSL_DEBUG_BUF( 4, "MAC'd meta-data", pseudo_hdr, 13 );
  38144. mbedtls_md_hmac_update( &ssl->transform_in->md_ctx_dec, pseudo_hdr, 13 );
  38145. mbedtls_md_hmac_update( &ssl->transform_in->md_ctx_dec,
  38146. ssl->in_iv, ssl->in_msglen );
  38147. mbedtls_md_hmac_finish( &ssl->transform_in->md_ctx_dec, computed_mac );
  38148. mbedtls_md_hmac_reset( &ssl->transform_in->md_ctx_dec );
  38149. MBEDTLS_SSL_DEBUG_BUF( 4, "message mac", ssl->in_iv + ssl->in_msglen,
  38150. ssl->transform_in->maclen );
  38151. MBEDTLS_SSL_DEBUG_BUF( 4, "computed mac", computed_mac,
  38152. ssl->transform_in->maclen );
  38153. if( mbedtls_ssl_safer_memcmp( ssl->in_iv + ssl->in_msglen, computed_mac,
  38154. ssl->transform_in->maclen ) != 0 )
  38155. {
  38156. MBEDTLS_SSL_DEBUG_MSG( 1, ( "message mac does not match" ) );
  38157. return( MBEDTLS_ERR_SSL_INVALID_MAC );
  38158. }
  38159. auth_done++;
  38160. }
  38161. #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
  38162. /*
  38163. * Check length sanity
  38164. */
  38165. if( ssl->in_msglen % ssl->transform_in->ivlen != 0 )
  38166. {
  38167. MBEDTLS_SSL_DEBUG_MSG( 1, ( "msglen (%d) %% ivlen (%d) != 0",
  38168. ssl->in_msglen, ssl->transform_in->ivlen ) );
  38169. return( MBEDTLS_ERR_SSL_INVALID_MAC );
  38170. }
  38171. #if defined(MBEDTLS_SSL_PROTO_TLS1_1) || defined(MBEDTLS_SSL_PROTO_TLS1_2)
  38172. /*
  38173. * Initialize for prepended IV for block cipher in TLS v1.1 and up
  38174. */
  38175. if( ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_2 )
  38176. {
  38177. dec_msglen -= ssl->transform_in->ivlen;
  38178. ssl->in_msglen -= ssl->transform_in->ivlen;
  38179. for( i = 0; i < ssl->transform_in->ivlen; i++ )
  38180. ssl->transform_in->iv_dec[i] = ssl->in_iv[i];
  38181. }
  38182. #endif /* MBEDTLS_SSL_PROTO_TLS1_1 || MBEDTLS_SSL_PROTO_TLS1_2 */
  38183. if( ( ret = mbedtls_cipher_crypt( &ssl->transform_in->cipher_ctx_dec,
  38184. ssl->transform_in->iv_dec,
  38185. ssl->transform_in->ivlen,
  38186. dec_msg, dec_msglen,
  38187. dec_msg_result, &olen ) ) != 0 )
  38188. {
  38189. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_crypt", ret );
  38190. return( ret );
  38191. }
  38192. if( dec_msglen != olen )
  38193. {
  38194. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  38195. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  38196. }
  38197. #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1)
  38198. if( ssl->minor_ver < MBEDTLS_SSL_MINOR_VERSION_2 )
  38199. {
  38200. /*
  38201. * Save IV in SSL3 and TLS1
  38202. */
  38203. memcpy( ssl->transform_in->iv_dec,
  38204. ssl->transform_in->cipher_ctx_dec.iv,
  38205. ssl->transform_in->ivlen );
  38206. }
  38207. #endif
  38208. padlen = 1 + ssl->in_msg[ssl->in_msglen - 1];
  38209. if( ssl->in_msglen < ssl->transform_in->maclen + padlen &&
  38210. auth_done == 0 )
  38211. {
  38212. #if defined(MBEDTLS_SSL_DEBUG_ALL)
  38213. MBEDTLS_SSL_DEBUG_MSG( 1, ( "msglen (%d) < maclen (%d) + padlen (%d)",
  38214. ssl->in_msglen, ssl->transform_in->maclen, padlen ) );
  38215. #endif
  38216. padlen = 0;
  38217. correct = 0;
  38218. }
  38219. #if defined(MBEDTLS_SSL_PROTO_SSL3)
  38220. if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
  38221. {
  38222. if( padlen > ssl->transform_in->ivlen )
  38223. {
  38224. #if defined(MBEDTLS_SSL_DEBUG_ALL)
  38225. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad padding length: is %d, "
  38226. "should be no more than %d",
  38227. padlen, ssl->transform_in->ivlen ) );
  38228. #endif
  38229. correct = 0;
  38230. }
  38231. }
  38232. else
  38233. #endif /* MBEDTLS_SSL_PROTO_SSL3 */
  38234. #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
  38235. defined(MBEDTLS_SSL_PROTO_TLS1_2)
  38236. if( ssl->minor_ver > MBEDTLS_SSL_MINOR_VERSION_0 )
  38237. {
  38238. /*
  38239. * TLSv1+: always check the padding up to the first failure
  38240. * and fake check up to 256 bytes of padding
  38241. */
  38242. size_t pad_count = 0, real_count = 1;
  38243. size_t padding_idx = ssl->in_msglen - padlen - 1;
  38244. /*
  38245. * Padding is guaranteed to be incorrect if:
  38246. * 1. padlen >= ssl->in_msglen
  38247. *
  38248. * 2. padding_idx >= MBEDTLS_SSL_MAX_CONTENT_LEN +
  38249. * ssl->transform_in->maclen
  38250. *
  38251. * In both cases we reset padding_idx to a safe value (0) to
  38252. * prevent out-of-buffer reads.
  38253. */
  38254. correct &= ( ssl->in_msglen >= padlen + 1 );
  38255. correct &= ( padding_idx < MBEDTLS_SSL_MAX_CONTENT_LEN +
  38256. ssl->transform_in->maclen );
  38257. padding_idx *= correct;
  38258. for( i = 1; i <= 256; i++ )
  38259. {
  38260. real_count &= ( i <= padlen );
  38261. pad_count += real_count *
  38262. ( ssl->in_msg[padding_idx + i] == padlen - 1 );
  38263. }
  38264. correct &= ( pad_count == padlen ); /* Only 1 on correct padding */
  38265. #if defined(MBEDTLS_SSL_DEBUG_ALL)
  38266. if( padlen > 0 && correct == 0 )
  38267. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad padding byte detected" ) );
  38268. #endif
  38269. padlen &= correct * 0x1FF;
  38270. }
  38271. else
  38272. #endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \
  38273. MBEDTLS_SSL_PROTO_TLS1_2 */
  38274. {
  38275. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  38276. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  38277. }
  38278. ssl->in_msglen -= padlen;
  38279. }
  38280. else
  38281. #endif /* MBEDTLS_CIPHER_MODE_CBC &&
  38282. ( MBEDTLS_AES_C || MBEDTLS_CAMELLIA_C ) */
  38283. {
  38284. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  38285. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  38286. }
  38287. MBEDTLS_SSL_DEBUG_BUF( 4, "raw buffer after decryption",
  38288. ssl->in_msg, ssl->in_msglen );
  38289. /*
  38290. * Authenticate if not done yet.
  38291. * Compute the MAC regardless of the padding result (RFC4346, CBCTIME).
  38292. */
  38293. #if defined(SSL_SOME_MODES_USE_MAC)
  38294. if( auth_done == 0 )
  38295. {
  38296. unsigned char tmp[SSL_MAX_MAC_SIZE];
  38297. ssl->in_msglen -= ssl->transform_in->maclen;
  38298. ssl->in_len[0] = (unsigned char)( ssl->in_msglen >> 8 );
  38299. ssl->in_len[1] = (unsigned char)( ssl->in_msglen );
  38300. memcpy( tmp, ssl->in_msg + ssl->in_msglen, ssl->transform_in->maclen );
  38301. #if defined(MBEDTLS_SSL_PROTO_SSL3)
  38302. if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
  38303. {
  38304. ssl_mac( &ssl->transform_in->md_ctx_dec,
  38305. ssl->transform_in->mac_dec,
  38306. ssl->in_msg, ssl->in_msglen,
  38307. ssl->in_ctr, ssl->in_msgtype );
  38308. }
  38309. else
  38310. #endif /* MBEDTLS_SSL_PROTO_SSL3 */
  38311. #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
  38312. defined(MBEDTLS_SSL_PROTO_TLS1_2)
  38313. if( ssl->minor_ver > MBEDTLS_SSL_MINOR_VERSION_0 )
  38314. {
  38315. /*
  38316. * Process MAC and always update for padlen afterwards to make
  38317. * total time independent of padlen
  38318. *
  38319. * extra_run compensates MAC check for padlen
  38320. *
  38321. * Known timing attacks:
  38322. * - Lucky Thirteen (http://www.isg.rhul.ac.uk/tls/TLStiming.pdf)
  38323. *
  38324. * We use ( ( Lx + 8 ) / 64 ) to handle 'negative Lx' values
  38325. * correctly. (We round down instead of up, so -56 is the correct
  38326. * value for our calculations instead of -55)
  38327. */
  38328. size_t j, extra_run = 0;
  38329. extra_run = ( 13 + ssl->in_msglen + padlen + 8 ) / 64 -
  38330. ( 13 + ssl->in_msglen + 8 ) / 64;
  38331. extra_run &= correct * 0xFF;
  38332. mbedtls_md_hmac_update( &ssl->transform_in->md_ctx_dec, ssl->in_ctr, 8 );
  38333. mbedtls_md_hmac_update( &ssl->transform_in->md_ctx_dec, ssl->in_hdr, 3 );
  38334. mbedtls_md_hmac_update( &ssl->transform_in->md_ctx_dec, ssl->in_len, 2 );
  38335. mbedtls_md_hmac_update( &ssl->transform_in->md_ctx_dec, ssl->in_msg,
  38336. ssl->in_msglen );
  38337. mbedtls_md_hmac_finish( &ssl->transform_in->md_ctx_dec,
  38338. ssl->in_msg + ssl->in_msglen );
  38339. /* Call mbedtls_md_process at least once due to cache attacks */
  38340. for( j = 0; j < extra_run + 1; j++ )
  38341. mbedtls_md_process( &ssl->transform_in->md_ctx_dec, ssl->in_msg );
  38342. mbedtls_md_hmac_reset( &ssl->transform_in->md_ctx_dec );
  38343. }
  38344. else
  38345. #endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \
  38346. MBEDTLS_SSL_PROTO_TLS1_2 */
  38347. {
  38348. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  38349. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  38350. }
  38351. MBEDTLS_SSL_DEBUG_BUF( 4, "message mac", tmp, ssl->transform_in->maclen );
  38352. MBEDTLS_SSL_DEBUG_BUF( 4, "computed mac", ssl->in_msg + ssl->in_msglen,
  38353. ssl->transform_in->maclen );
  38354. if( mbedtls_ssl_safer_memcmp( tmp, ssl->in_msg + ssl->in_msglen,
  38355. ssl->transform_in->maclen ) != 0 )
  38356. {
  38357. #if defined(MBEDTLS_SSL_DEBUG_ALL)
  38358. MBEDTLS_SSL_DEBUG_MSG( 1, ( "message mac does not match" ) );
  38359. #endif
  38360. correct = 0;
  38361. }
  38362. auth_done++;
  38363. /*
  38364. * Finally check the correct flag
  38365. */
  38366. if( correct == 0 )
  38367. return( MBEDTLS_ERR_SSL_INVALID_MAC );
  38368. }
  38369. #endif /* SSL_SOME_MODES_USE_MAC */
  38370. /* Make extra sure authentication was performed, exactly once */
  38371. if( auth_done != 1 )
  38372. {
  38373. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  38374. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  38375. }
  38376. if( ssl->in_msglen == 0 )
  38377. {
  38378. ssl->nb_zero++;
  38379. /*
  38380. * Three or more empty messages may be a DoS attack
  38381. * (excessive CPU consumption).
  38382. */
  38383. if( ssl->nb_zero > 3 )
  38384. {
  38385. MBEDTLS_SSL_DEBUG_MSG( 1, ( "received four consecutive empty "
  38386. "messages, possible DoS attack" ) );
  38387. return( MBEDTLS_ERR_SSL_INVALID_MAC );
  38388. }
  38389. }
  38390. else
  38391. ssl->nb_zero = 0;
  38392. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  38393. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
  38394. {
  38395. ; /* in_ctr read from peer, not maintained internally */
  38396. }
  38397. else
  38398. #endif
  38399. {
  38400. for( i = 8; i > ssl_ep_len( ssl ); i-- )
  38401. if( ++ssl->in_ctr[i - 1] != 0 )
  38402. break;
  38403. /* The loop goes to its end iff the counter is wrapping */
  38404. if( i == ssl_ep_len( ssl ) )
  38405. {
  38406. MBEDTLS_SSL_DEBUG_MSG( 1, ( "incoming message counter would wrap" ) );
  38407. return( MBEDTLS_ERR_SSL_COUNTER_WRAPPING );
  38408. }
  38409. }
  38410. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= decrypt buf" ) );
  38411. return( 0 );
  38412. }
  38413. #undef MAC_NONE
  38414. #undef MAC_PLAINTEXT
  38415. #undef MAC_CIPHERTEXT
  38416. #if defined(MBEDTLS_ZLIB_SUPPORT)
  38417. /*
  38418. * Compression/decompression functions
  38419. */
  38420. static int ssl_compress_buf( mbedtls_ssl_context *ssl )
  38421. {
  38422. int ret;
  38423. unsigned char *msg_post = ssl->out_msg;
  38424. size_t len_pre = ssl->out_msglen;
  38425. unsigned char *msg_pre = ssl->compress_buf;
  38426. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> compress buf" ) );
  38427. if( len_pre == 0 )
  38428. return( 0 );
  38429. memcpy( msg_pre, ssl->out_msg, len_pre );
  38430. MBEDTLS_SSL_DEBUG_MSG( 3, ( "before compression: msglen = %d, ",
  38431. ssl->out_msglen ) );
  38432. MBEDTLS_SSL_DEBUG_BUF( 4, "before compression: output payload",
  38433. ssl->out_msg, ssl->out_msglen );
  38434. ssl->transform_out->ctx_deflate.next_in = msg_pre;
  38435. ssl->transform_out->ctx_deflate.avail_in = len_pre;
  38436. ssl->transform_out->ctx_deflate.next_out = msg_post;
  38437. ssl->transform_out->ctx_deflate.avail_out = MBEDTLS_SSL_BUFFER_LEN;
  38438. ret = deflate( &ssl->transform_out->ctx_deflate, Z_SYNC_FLUSH );
  38439. if( ret != Z_OK )
  38440. {
  38441. MBEDTLS_SSL_DEBUG_MSG( 1, ( "failed to perform compression (%d)", ret ) );
  38442. return( MBEDTLS_ERR_SSL_COMPRESSION_FAILED );
  38443. }
  38444. ssl->out_msglen = MBEDTLS_SSL_BUFFER_LEN -
  38445. ssl->transform_out->ctx_deflate.avail_out;
  38446. MBEDTLS_SSL_DEBUG_MSG( 3, ( "after compression: msglen = %d, ",
  38447. ssl->out_msglen ) );
  38448. MBEDTLS_SSL_DEBUG_BUF( 4, "after compression: output payload",
  38449. ssl->out_msg, ssl->out_msglen );
  38450. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= compress buf" ) );
  38451. return( 0 );
  38452. }
  38453. static int ssl_decompress_buf( mbedtls_ssl_context *ssl )
  38454. {
  38455. int ret;
  38456. unsigned char *msg_post = ssl->in_msg;
  38457. size_t len_pre = ssl->in_msglen;
  38458. unsigned char *msg_pre = ssl->compress_buf;
  38459. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> decompress buf" ) );
  38460. if( len_pre == 0 )
  38461. return( 0 );
  38462. memcpy( msg_pre, ssl->in_msg, len_pre );
  38463. MBEDTLS_SSL_DEBUG_MSG( 3, ( "before decompression: msglen = %d, ",
  38464. ssl->in_msglen ) );
  38465. MBEDTLS_SSL_DEBUG_BUF( 4, "before decompression: input payload",
  38466. ssl->in_msg, ssl->in_msglen );
  38467. ssl->transform_in->ctx_inflate.next_in = msg_pre;
  38468. ssl->transform_in->ctx_inflate.avail_in = len_pre;
  38469. ssl->transform_in->ctx_inflate.next_out = msg_post;
  38470. ssl->transform_in->ctx_inflate.avail_out = MBEDTLS_SSL_MAX_CONTENT_LEN;
  38471. ret = inflate( &ssl->transform_in->ctx_inflate, Z_SYNC_FLUSH );
  38472. if( ret != Z_OK )
  38473. {
  38474. MBEDTLS_SSL_DEBUG_MSG( 1, ( "failed to perform decompression (%d)", ret ) );
  38475. return( MBEDTLS_ERR_SSL_COMPRESSION_FAILED );
  38476. }
  38477. ssl->in_msglen = MBEDTLS_SSL_MAX_CONTENT_LEN -
  38478. ssl->transform_in->ctx_inflate.avail_out;
  38479. MBEDTLS_SSL_DEBUG_MSG( 3, ( "after decompression: msglen = %d, ",
  38480. ssl->in_msglen ) );
  38481. MBEDTLS_SSL_DEBUG_BUF( 4, "after decompression: input payload",
  38482. ssl->in_msg, ssl->in_msglen );
  38483. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= decompress buf" ) );
  38484. return( 0 );
  38485. }
  38486. #endif /* MBEDTLS_ZLIB_SUPPORT */
  38487. #if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_RENEGOTIATION)
  38488. static int ssl_write_hello_request( mbedtls_ssl_context *ssl );
  38489. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  38490. static int ssl_resend_hello_request( mbedtls_ssl_context *ssl )
  38491. {
  38492. /* If renegotiation is not enforced, retransmit until we would reach max
  38493. * timeout if we were using the usual handshake doubling scheme */
  38494. if( ssl->conf->renego_max_records < 0 )
  38495. {
  38496. uint32_t ratio = ssl->conf->hs_timeout_max / ssl->conf->hs_timeout_min + 1;
  38497. unsigned char doublings = 1;
  38498. while( ratio != 0 )
  38499. {
  38500. ++doublings;
  38501. ratio >>= 1;
  38502. }
  38503. if( ++ssl->renego_records_seen > doublings )
  38504. {
  38505. MBEDTLS_SSL_DEBUG_MSG( 2, ( "no longer retransmitting hello request" ) );
  38506. return( 0 );
  38507. }
  38508. }
  38509. return( ssl_write_hello_request( ssl ) );
  38510. }
  38511. #endif
  38512. #endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_RENEGOTIATION */
  38513. /*
  38514. * Fill the input message buffer by appending data to it.
  38515. * The amount of data already fetched is in ssl->in_left.
  38516. *
  38517. * If we return 0, is it guaranteed that (at least) nb_want bytes are
  38518. * available (from this read and/or a previous one). Otherwise, an error code
  38519. * is returned (possibly EOF or WANT_READ).
  38520. *
  38521. * With stream transport (TLS) on success ssl->in_left == nb_want, but
  38522. * with datagram transport (DTLS) on success ssl->in_left >= nb_want,
  38523. * since we always read a whole datagram at once.
  38524. *
  38525. * For DTLS, it is up to the caller to set ssl->next_record_offset when
  38526. * they're done reading a record.
  38527. */
  38528. int mbedtls_ssl_fetch_input( mbedtls_ssl_context *ssl, size_t nb_want )
  38529. {
  38530. int ret;
  38531. size_t len;
  38532. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> fetch input" ) );
  38533. if( ssl->f_recv == NULL && ssl->f_recv_timeout == NULL )
  38534. {
  38535. MBEDTLS_SSL_DEBUG_MSG( 1, ( "Bad usage of mbedtls_ssl_set_bio() "
  38536. "or mbedtls_ssl_set_bio()" ) );
  38537. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  38538. }
  38539. if( nb_want > MBEDTLS_SSL_BUFFER_LEN - (size_t)( ssl->in_hdr - ssl->in_buf ) )
  38540. {
  38541. MBEDTLS_SSL_DEBUG_MSG( 1, ( "requesting more data than fits" ) );
  38542. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  38543. }
  38544. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  38545. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
  38546. {
  38547. uint32_t timeout;
  38548. /* Just to be sure */
  38549. if( ssl->f_set_timer == NULL || ssl->f_get_timer == NULL )
  38550. {
  38551. MBEDTLS_SSL_DEBUG_MSG( 1, ( "You must use "
  38552. "mbedtls_ssl_set_timer_cb() for DTLS" ) );
  38553. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  38554. }
  38555. /*
  38556. * The point is, we need to always read a full datagram at once, so we
  38557. * sometimes read more then requested, and handle the additional data.
  38558. * It could be the rest of the current record (while fetching the
  38559. * header) and/or some other records in the same datagram.
  38560. */
  38561. /*
  38562. * Move to the next record in the already read datagram if applicable
  38563. */
  38564. if( ssl->next_record_offset != 0 )
  38565. {
  38566. if( ssl->in_left < ssl->next_record_offset )
  38567. {
  38568. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  38569. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  38570. }
  38571. ssl->in_left -= ssl->next_record_offset;
  38572. if( ssl->in_left != 0 )
  38573. {
  38574. MBEDTLS_SSL_DEBUG_MSG( 2, ( "next record in same datagram, offset: %d",
  38575. ssl->next_record_offset ) );
  38576. memmove( ssl->in_hdr,
  38577. ssl->in_hdr + ssl->next_record_offset,
  38578. ssl->in_left );
  38579. }
  38580. ssl->next_record_offset = 0;
  38581. }
  38582. MBEDTLS_SSL_DEBUG_MSG( 2, ( "in_left: %d, nb_want: %d",
  38583. ssl->in_left, nb_want ) );
  38584. /*
  38585. * Done if we already have enough data.
  38586. */
  38587. if( nb_want <= ssl->in_left)
  38588. {
  38589. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= fetch input" ) );
  38590. return( 0 );
  38591. }
  38592. /*
  38593. * A record can't be split accross datagrams. If we need to read but
  38594. * are not at the beginning of a new record, the caller did something
  38595. * wrong.
  38596. */
  38597. if( ssl->in_left != 0 )
  38598. {
  38599. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  38600. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  38601. }
  38602. /*
  38603. * Don't even try to read if time's out already.
  38604. * This avoids by-passing the timer when repeatedly receiving messages
  38605. * that will end up being dropped.
  38606. */
  38607. if( ssl_check_timer( ssl ) != 0 )
  38608. ret = MBEDTLS_ERR_SSL_TIMEOUT;
  38609. else
  38610. {
  38611. len = MBEDTLS_SSL_BUFFER_LEN - ( ssl->in_hdr - ssl->in_buf );
  38612. if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER )
  38613. timeout = ssl->handshake->retransmit_timeout;
  38614. else
  38615. timeout = ssl->conf->read_timeout;
  38616. MBEDTLS_SSL_DEBUG_MSG( 3, ( "f_recv_timeout: %u ms", timeout ) );
  38617. if( ssl->f_recv_timeout != NULL )
  38618. ret = ssl->f_recv_timeout( ssl->p_bio, ssl->in_hdr, len,
  38619. timeout );
  38620. else
  38621. ret = ssl->f_recv( ssl->p_bio, ssl->in_hdr, len );
  38622. MBEDTLS_SSL_DEBUG_RET( 2, "ssl->f_recv(_timeout)", ret );
  38623. if( ret == 0 )
  38624. return( MBEDTLS_ERR_SSL_CONN_EOF );
  38625. }
  38626. if( ret == MBEDTLS_ERR_SSL_TIMEOUT )
  38627. {
  38628. MBEDTLS_SSL_DEBUG_MSG( 2, ( "timeout" ) );
  38629. ssl_set_timer( ssl, 0 );
  38630. if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER )
  38631. {
  38632. if( ssl_double_retransmit_timeout( ssl ) != 0 )
  38633. {
  38634. MBEDTLS_SSL_DEBUG_MSG( 1, ( "handshake timeout" ) );
  38635. return( MBEDTLS_ERR_SSL_TIMEOUT );
  38636. }
  38637. if( ( ret = mbedtls_ssl_resend( ssl ) ) != 0 )
  38638. {
  38639. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_resend", ret );
  38640. return( ret );
  38641. }
  38642. return( MBEDTLS_ERR_SSL_WANT_READ );
  38643. }
  38644. #if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_RENEGOTIATION)
  38645. else if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER &&
  38646. ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_PENDING )
  38647. {
  38648. if( ( ret = ssl_resend_hello_request( ssl ) ) != 0 )
  38649. {
  38650. MBEDTLS_SSL_DEBUG_RET( 1, "ssl_resend_hello_request", ret );
  38651. return( ret );
  38652. }
  38653. return( MBEDTLS_ERR_SSL_WANT_READ );
  38654. }
  38655. #endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_RENEGOTIATION */
  38656. }
  38657. if( ret < 0 )
  38658. return( ret );
  38659. ssl->in_left = ret;
  38660. }
  38661. else
  38662. #endif
  38663. {
  38664. MBEDTLS_SSL_DEBUG_MSG( 2, ( "in_left: %d, nb_want: %d",
  38665. ssl->in_left, nb_want ) );
  38666. while( ssl->in_left < nb_want )
  38667. {
  38668. len = nb_want - ssl->in_left;
  38669. if( ssl_check_timer( ssl ) != 0 )
  38670. ret = MBEDTLS_ERR_SSL_TIMEOUT;
  38671. else
  38672. {
  38673. if( ssl->f_recv_timeout != NULL )
  38674. {
  38675. ret = ssl->f_recv_timeout( ssl->p_bio,
  38676. ssl->in_hdr + ssl->in_left, len,
  38677. ssl->conf->read_timeout );
  38678. }
  38679. else
  38680. {
  38681. ret = ssl->f_recv( ssl->p_bio,
  38682. ssl->in_hdr + ssl->in_left, len );
  38683. }
  38684. }
  38685. MBEDTLS_SSL_DEBUG_MSG( 2, ( "in_left: %d, nb_want: %d",
  38686. ssl->in_left, nb_want ) );
  38687. MBEDTLS_SSL_DEBUG_RET( 2, "ssl->f_recv(_timeout)", ret );
  38688. if( ret == 0 )
  38689. return( MBEDTLS_ERR_SSL_CONN_EOF );
  38690. if( ret < 0 )
  38691. return( ret );
  38692. ssl->in_left += ret;
  38693. }
  38694. }
  38695. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= fetch input" ) );
  38696. return( 0 );
  38697. }
  38698. /*
  38699. * Flush any data not yet written
  38700. */
  38701. int mbedtls_ssl_flush_output( mbedtls_ssl_context *ssl )
  38702. {
  38703. int ret;
  38704. unsigned char *buf, i;
  38705. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> flush output" ) );
  38706. if( ssl->f_send == NULL )
  38707. {
  38708. MBEDTLS_SSL_DEBUG_MSG( 1, ( "Bad usage of mbedtls_ssl_set_bio() "
  38709. "or mbedtls_ssl_set_bio()" ) );
  38710. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  38711. }
  38712. /* Avoid incrementing counter if data is flushed */
  38713. if( ssl->out_left == 0 )
  38714. {
  38715. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= flush output" ) );
  38716. return( 0 );
  38717. }
  38718. while( ssl->out_left > 0 )
  38719. {
  38720. MBEDTLS_SSL_DEBUG_MSG( 2, ( "message length: %d, out_left: %d",
  38721. mbedtls_ssl_hdr_len( ssl ) + ssl->out_msglen, ssl->out_left ) );
  38722. buf = ssl->out_hdr + mbedtls_ssl_hdr_len( ssl ) +
  38723. ssl->out_msglen - ssl->out_left;
  38724. ret = ssl->f_send( ssl->p_bio, buf, ssl->out_left );
  38725. MBEDTLS_SSL_DEBUG_RET( 2, "ssl->f_send", ret );
  38726. if( ret <= 0 )
  38727. return( ret );
  38728. ssl->out_left -= ret;
  38729. }
  38730. for( i = 8; i > ssl_ep_len( ssl ); i-- )
  38731. if( ++ssl->out_ctr[i - 1] != 0 )
  38732. break;
  38733. /* The loop goes to its end iff the counter is wrapping */
  38734. if( i == ssl_ep_len( ssl ) )
  38735. {
  38736. MBEDTLS_SSL_DEBUG_MSG( 1, ( "outgoing message counter would wrap" ) );
  38737. return( MBEDTLS_ERR_SSL_COUNTER_WRAPPING );
  38738. }
  38739. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= flush output" ) );
  38740. return( 0 );
  38741. }
  38742. /*
  38743. * Functions to handle the DTLS retransmission state machine
  38744. */
  38745. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  38746. /*
  38747. * Append current handshake message to current outgoing flight
  38748. */
  38749. static int ssl_flight_append( mbedtls_ssl_context *ssl )
  38750. {
  38751. mbedtls_ssl_flight_item *msg;
  38752. /* Allocate space for current message */
  38753. if( ( msg = mbedtls_calloc( 1, sizeof( mbedtls_ssl_flight_item ) ) ) == NULL )
  38754. {
  38755. MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc %d bytes failed",
  38756. sizeof( mbedtls_ssl_flight_item ) ) );
  38757. return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
  38758. }
  38759. if( ( msg->p = mbedtls_calloc( 1, ssl->out_msglen ) ) == NULL )
  38760. {
  38761. MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc %d bytes failed", ssl->out_msglen ) );
  38762. mbedtls_free( msg );
  38763. return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
  38764. }
  38765. /* Copy current handshake message with headers */
  38766. memcpy( msg->p, ssl->out_msg, ssl->out_msglen );
  38767. msg->len = ssl->out_msglen;
  38768. msg->type = ssl->out_msgtype;
  38769. msg->next = NULL;
  38770. /* Append to the current flight */
  38771. if( ssl->handshake->flight == NULL )
  38772. ssl->handshake->flight = msg;
  38773. else
  38774. {
  38775. mbedtls_ssl_flight_item *cur = ssl->handshake->flight;
  38776. while( cur->next != NULL )
  38777. cur = cur->next;
  38778. cur->next = msg;
  38779. }
  38780. return( 0 );
  38781. }
  38782. /*
  38783. * Free the current flight of handshake messages
  38784. */
  38785. static void ssl_flight_free( mbedtls_ssl_flight_item *flight )
  38786. {
  38787. mbedtls_ssl_flight_item *cur = flight;
  38788. mbedtls_ssl_flight_item *next;
  38789. while( cur != NULL )
  38790. {
  38791. next = cur->next;
  38792. mbedtls_free( cur->p );
  38793. mbedtls_free( cur );
  38794. cur = next;
  38795. }
  38796. }
  38797. #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
  38798. static void ssl_dtls_replay_reset( mbedtls_ssl_context *ssl );
  38799. #endif
  38800. /*
  38801. * Swap transform_out and out_ctr with the alternative ones
  38802. */
  38803. static void ssl_swap_epochs( mbedtls_ssl_context *ssl )
  38804. {
  38805. mbedtls_ssl_transform *tmp_transform;
  38806. unsigned char tmp_out_ctr[8];
  38807. if( ssl->transform_out == ssl->handshake->alt_transform_out )
  38808. {
  38809. MBEDTLS_SSL_DEBUG_MSG( 3, ( "skip swap epochs" ) );
  38810. return;
  38811. }
  38812. MBEDTLS_SSL_DEBUG_MSG( 3, ( "swap epochs" ) );
  38813. /* Swap transforms */
  38814. tmp_transform = ssl->transform_out;
  38815. ssl->transform_out = ssl->handshake->alt_transform_out;
  38816. ssl->handshake->alt_transform_out = tmp_transform;
  38817. /* Swap epoch + sequence_number */
  38818. memcpy( tmp_out_ctr, ssl->out_ctr, 8 );
  38819. memcpy( ssl->out_ctr, ssl->handshake->alt_out_ctr, 8 );
  38820. memcpy( ssl->handshake->alt_out_ctr, tmp_out_ctr, 8 );
  38821. /* Adjust to the newly activated transform */
  38822. if( ssl->transform_out != NULL &&
  38823. ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_2 )
  38824. {
  38825. ssl->out_msg = ssl->out_iv + ssl->transform_out->ivlen -
  38826. ssl->transform_out->fixed_ivlen;
  38827. }
  38828. else
  38829. ssl->out_msg = ssl->out_iv;
  38830. #if defined(MBEDTLS_SSL_HW_RECORD_ACCEL)
  38831. if( mbedtls_ssl_hw_record_activate != NULL )
  38832. {
  38833. if( ( ret = mbedtls_ssl_hw_record_activate( ssl, MBEDTLS_SSL_CHANNEL_OUTBOUND ) ) != 0 )
  38834. {
  38835. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_hw_record_activate", ret );
  38836. return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
  38837. }
  38838. }
  38839. #endif
  38840. }
  38841. /*
  38842. * Retransmit the current flight of messages.
  38843. *
  38844. * Need to remember the current message in case flush_output returns
  38845. * WANT_WRITE, causing us to exit this function and come back later.
  38846. * This function must be called until state is no longer SENDING.
  38847. */
  38848. int mbedtls_ssl_resend( mbedtls_ssl_context *ssl )
  38849. {
  38850. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> mbedtls_ssl_resend" ) );
  38851. if( ssl->handshake->retransmit_state != MBEDTLS_SSL_RETRANS_SENDING )
  38852. {
  38853. MBEDTLS_SSL_DEBUG_MSG( 2, ( "initialise resending" ) );
  38854. ssl->handshake->cur_msg = ssl->handshake->flight;
  38855. ssl_swap_epochs( ssl );
  38856. ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_SENDING;
  38857. }
  38858. while( ssl->handshake->cur_msg != NULL )
  38859. {
  38860. int ret;
  38861. mbedtls_ssl_flight_item *cur = ssl->handshake->cur_msg;
  38862. /* Swap epochs before sending Finished: we can't do it after
  38863. * sending ChangeCipherSpec, in case write returns WANT_READ.
  38864. * Must be done before copying, may change out_msg pointer */
  38865. if( cur->type == MBEDTLS_SSL_MSG_HANDSHAKE &&
  38866. cur->p[0] == MBEDTLS_SSL_HS_FINISHED )
  38867. {
  38868. ssl_swap_epochs( ssl );
  38869. }
  38870. memcpy( ssl->out_msg, cur->p, cur->len );
  38871. ssl->out_msglen = cur->len;
  38872. ssl->out_msgtype = cur->type;
  38873. ssl->handshake->cur_msg = cur->next;
  38874. MBEDTLS_SSL_DEBUG_BUF( 3, "resent handshake message header", ssl->out_msg, 12 );
  38875. if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 )
  38876. {
  38877. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret );
  38878. return( ret );
  38879. }
  38880. }
  38881. if( ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER )
  38882. ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_FINISHED;
  38883. else
  38884. {
  38885. ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_WAITING;
  38886. ssl_set_timer( ssl, ssl->handshake->retransmit_timeout );
  38887. }
  38888. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= mbedtls_ssl_resend" ) );
  38889. return( 0 );
  38890. }
  38891. /*
  38892. * To be called when the last message of an incoming flight is received.
  38893. */
  38894. void mbedtls_ssl_recv_flight_completed( mbedtls_ssl_context *ssl )
  38895. {
  38896. /* We won't need to resend that one any more */
  38897. ssl_flight_free( ssl->handshake->flight );
  38898. ssl->handshake->flight = NULL;
  38899. ssl->handshake->cur_msg = NULL;
  38900. /* The next incoming flight will start with this msg_seq */
  38901. ssl->handshake->in_flight_start_seq = ssl->handshake->in_msg_seq;
  38902. /* Cancel timer */
  38903. ssl_set_timer( ssl, 0 );
  38904. if( ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE &&
  38905. ssl->in_msg[0] == MBEDTLS_SSL_HS_FINISHED )
  38906. {
  38907. ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_FINISHED;
  38908. }
  38909. else
  38910. ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_PREPARING;
  38911. }
  38912. /*
  38913. * To be called when the last message of an outgoing flight is send.
  38914. */
  38915. void mbedtls_ssl_send_flight_completed( mbedtls_ssl_context *ssl )
  38916. {
  38917. ssl_reset_retransmit_timeout( ssl );
  38918. ssl_set_timer( ssl, ssl->handshake->retransmit_timeout );
  38919. if( ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE &&
  38920. ssl->in_msg[0] == MBEDTLS_SSL_HS_FINISHED )
  38921. {
  38922. ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_FINISHED;
  38923. }
  38924. else
  38925. ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_WAITING;
  38926. }
  38927. #endif /* MBEDTLS_SSL_PROTO_DTLS */
  38928. /*
  38929. * Record layer functions
  38930. */
  38931. /*
  38932. * Write current record.
  38933. * Uses ssl->out_msgtype, ssl->out_msglen and bytes at ssl->out_msg.
  38934. */
  38935. int mbedtls_ssl_write_record( mbedtls_ssl_context *ssl )
  38936. {
  38937. int ret, done = 0;
  38938. size_t len = ssl->out_msglen;
  38939. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write record" ) );
  38940. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  38941. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
  38942. ssl->handshake != NULL &&
  38943. ssl->handshake->retransmit_state == MBEDTLS_SSL_RETRANS_SENDING )
  38944. {
  38945. ; /* Skip special handshake treatment when resending */
  38946. }
  38947. else
  38948. #endif
  38949. if( ssl->out_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE )
  38950. {
  38951. if( ssl->out_msg[0] != MBEDTLS_SSL_HS_HELLO_REQUEST &&
  38952. ssl->handshake == NULL )
  38953. {
  38954. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  38955. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  38956. }
  38957. ssl->out_msg[1] = (unsigned char)( ( len - 4 ) >> 16 );
  38958. ssl->out_msg[2] = (unsigned char)( ( len - 4 ) >> 8 );
  38959. ssl->out_msg[3] = (unsigned char)( ( len - 4 ) );
  38960. /*
  38961. * DTLS has additional fields in the Handshake layer,
  38962. * between the length field and the actual payload:
  38963. * uint16 message_seq;
  38964. * uint24 fragment_offset;
  38965. * uint24 fragment_length;
  38966. */
  38967. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  38968. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
  38969. {
  38970. /* Make room for the additional DTLS fields */
  38971. memmove( ssl->out_msg + 12, ssl->out_msg + 4, len - 4 );
  38972. ssl->out_msglen += 8;
  38973. len += 8;
  38974. /* Write message_seq and update it, except for HelloRequest */
  38975. if( ssl->out_msg[0] != MBEDTLS_SSL_HS_HELLO_REQUEST )
  38976. {
  38977. ssl->out_msg[4] = ( ssl->handshake->out_msg_seq >> 8 ) & 0xFF;
  38978. ssl->out_msg[5] = ( ssl->handshake->out_msg_seq ) & 0xFF;
  38979. ++( ssl->handshake->out_msg_seq );
  38980. }
  38981. else
  38982. {
  38983. ssl->out_msg[4] = 0;
  38984. ssl->out_msg[5] = 0;
  38985. }
  38986. /* We don't fragment, so frag_offset = 0 and frag_len = len */
  38987. memset( ssl->out_msg + 6, 0x00, 3 );
  38988. memcpy( ssl->out_msg + 9, ssl->out_msg + 1, 3 );
  38989. }
  38990. #endif /* MBEDTLS_SSL_PROTO_DTLS */
  38991. if( ssl->out_msg[0] != MBEDTLS_SSL_HS_HELLO_REQUEST )
  38992. ssl->handshake->update_checksum( ssl, ssl->out_msg, len );
  38993. }
  38994. /* Save handshake and CCS messages for resending */
  38995. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  38996. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
  38997. ssl->handshake != NULL &&
  38998. ssl->handshake->retransmit_state != MBEDTLS_SSL_RETRANS_SENDING &&
  38999. ( ssl->out_msgtype == MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC ||
  39000. ssl->out_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE ) )
  39001. {
  39002. if( ( ret = ssl_flight_append( ssl ) ) != 0 )
  39003. {
  39004. MBEDTLS_SSL_DEBUG_RET( 1, "ssl_flight_append", ret );
  39005. return( ret );
  39006. }
  39007. }
  39008. #endif
  39009. #if defined(MBEDTLS_ZLIB_SUPPORT)
  39010. if( ssl->transform_out != NULL &&
  39011. ssl->session_out->compression == MBEDTLS_SSL_COMPRESS_DEFLATE )
  39012. {
  39013. if( ( ret = ssl_compress_buf( ssl ) ) != 0 )
  39014. {
  39015. MBEDTLS_SSL_DEBUG_RET( 1, "ssl_compress_buf", ret );
  39016. return( ret );
  39017. }
  39018. len = ssl->out_msglen;
  39019. }
  39020. #endif /*MBEDTLS_ZLIB_SUPPORT */
  39021. #if defined(MBEDTLS_SSL_HW_RECORD_ACCEL)
  39022. if( mbedtls_ssl_hw_record_write != NULL )
  39023. {
  39024. MBEDTLS_SSL_DEBUG_MSG( 2, ( "going for mbedtls_ssl_hw_record_write()" ) );
  39025. ret = mbedtls_ssl_hw_record_write( ssl );
  39026. if( ret != 0 && ret != MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH )
  39027. {
  39028. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_hw_record_write", ret );
  39029. return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
  39030. }
  39031. if( ret == 0 )
  39032. done = 1;
  39033. }
  39034. #endif /* MBEDTLS_SSL_HW_RECORD_ACCEL */
  39035. if( !done )
  39036. {
  39037. ssl->out_hdr[0] = (unsigned char) ssl->out_msgtype;
  39038. mbedtls_ssl_write_version( ssl->major_ver, ssl->minor_ver,
  39039. ssl->conf->transport, ssl->out_hdr + 1 );
  39040. ssl->out_len[0] = (unsigned char)( len >> 8 );
  39041. ssl->out_len[1] = (unsigned char)( len );
  39042. if( ssl->transform_out != NULL )
  39043. {
  39044. if( ( ret = ssl_encrypt_buf( ssl ) ) != 0 )
  39045. {
  39046. MBEDTLS_SSL_DEBUG_RET( 1, "ssl_encrypt_buf", ret );
  39047. return( ret );
  39048. }
  39049. len = ssl->out_msglen;
  39050. ssl->out_len[0] = (unsigned char)( len >> 8 );
  39051. ssl->out_len[1] = (unsigned char)( len );
  39052. }
  39053. ssl->out_left = mbedtls_ssl_hdr_len( ssl ) + ssl->out_msglen;
  39054. MBEDTLS_SSL_DEBUG_MSG( 3, ( "output record: msgtype = %d, "
  39055. "version = [%d:%d], msglen = %d",
  39056. ssl->out_hdr[0], ssl->out_hdr[1], ssl->out_hdr[2],
  39057. ( ssl->out_len[0] << 8 ) | ssl->out_len[1] ) );
  39058. MBEDTLS_SSL_DEBUG_BUF( 4, "output record sent to network",
  39059. ssl->out_hdr, mbedtls_ssl_hdr_len( ssl ) + ssl->out_msglen );
  39060. }
  39061. if( ( ret = mbedtls_ssl_flush_output( ssl ) ) != 0 )
  39062. {
  39063. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_flush_output", ret );
  39064. return( ret );
  39065. }
  39066. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write record" ) );
  39067. return( 0 );
  39068. }
  39069. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  39070. /*
  39071. * Mark bits in bitmask (used for DTLS HS reassembly)
  39072. */
  39073. static void ssl_bitmask_set( unsigned char *mask, size_t offset, size_t len )
  39074. {
  39075. unsigned int start_bits, end_bits;
  39076. start_bits = 8 - ( offset % 8 );
  39077. if( start_bits != 8 )
  39078. {
  39079. size_t first_byte_idx = offset / 8;
  39080. /* Special case */
  39081. if( len <= start_bits )
  39082. {
  39083. for( ; len != 0; len-- )
  39084. mask[first_byte_idx] |= 1 << ( start_bits - len );
  39085. /* Avoid potential issues with offset or len becoming invalid */
  39086. return;
  39087. }
  39088. offset += start_bits; /* Now offset % 8 == 0 */
  39089. len -= start_bits;
  39090. for( ; start_bits != 0; start_bits-- )
  39091. mask[first_byte_idx] |= 1 << ( start_bits - 1 );
  39092. }
  39093. end_bits = len % 8;
  39094. if( end_bits != 0 )
  39095. {
  39096. size_t last_byte_idx = ( offset + len ) / 8;
  39097. len -= end_bits; /* Now len % 8 == 0 */
  39098. for( ; end_bits != 0; end_bits-- )
  39099. mask[last_byte_idx] |= 1 << ( 8 - end_bits );
  39100. }
  39101. memset( mask + offset / 8, 0xFF, len / 8 );
  39102. }
  39103. /*
  39104. * Check that bitmask is full
  39105. */
  39106. static int ssl_bitmask_check( unsigned char *mask, size_t len )
  39107. {
  39108. size_t i;
  39109. for( i = 0; i < len / 8; i++ )
  39110. if( mask[i] != 0xFF )
  39111. return( -1 );
  39112. for( i = 0; i < len % 8; i++ )
  39113. if( ( mask[len / 8] & ( 1 << ( 7 - i ) ) ) == 0 )
  39114. return( -1 );
  39115. return( 0 );
  39116. }
  39117. /*
  39118. * Reassemble fragmented DTLS handshake messages.
  39119. *
  39120. * Use a temporary buffer for reassembly, divided in two parts:
  39121. * - the first holds the reassembled message (including handshake header),
  39122. * - the second holds a bitmask indicating which parts of the message
  39123. * (excluding headers) have been received so far.
  39124. */
  39125. static int ssl_reassemble_dtls_handshake( mbedtls_ssl_context *ssl )
  39126. {
  39127. unsigned char *msg, *bitmask;
  39128. size_t frag_len, frag_off;
  39129. size_t msg_len = ssl->in_hslen - 12; /* Without headers */
  39130. if( ssl->handshake == NULL )
  39131. {
  39132. MBEDTLS_SSL_DEBUG_MSG( 1, ( "not supported outside handshake (for now)" ) );
  39133. return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
  39134. }
  39135. /*
  39136. * For first fragment, check size and allocate buffer
  39137. */
  39138. if( ssl->handshake->hs_msg == NULL )
  39139. {
  39140. size_t alloc_len;
  39141. MBEDTLS_SSL_DEBUG_MSG( 2, ( "initialize reassembly, total length = %d",
  39142. msg_len ) );
  39143. if( ssl->in_hslen > MBEDTLS_SSL_MAX_CONTENT_LEN )
  39144. {
  39145. MBEDTLS_SSL_DEBUG_MSG( 1, ( "handshake message too large" ) );
  39146. return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
  39147. }
  39148. /* The bitmask needs one bit per byte of message excluding header */
  39149. alloc_len = 12 + msg_len + msg_len / 8 + ( msg_len % 8 != 0 );
  39150. ssl->handshake->hs_msg = mbedtls_calloc( 1, alloc_len );
  39151. if( ssl->handshake->hs_msg == NULL )
  39152. {
  39153. MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc failed (%d bytes)", alloc_len ) );
  39154. return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
  39155. }
  39156. /* Prepare final header: copy msg_type, length and message_seq,
  39157. * then add standardised fragment_offset and fragment_length */
  39158. memcpy( ssl->handshake->hs_msg, ssl->in_msg, 6 );
  39159. memset( ssl->handshake->hs_msg + 6, 0, 3 );
  39160. memcpy( ssl->handshake->hs_msg + 9,
  39161. ssl->handshake->hs_msg + 1, 3 );
  39162. }
  39163. else
  39164. {
  39165. /* Make sure msg_type and length are consistent */
  39166. if( memcmp( ssl->handshake->hs_msg, ssl->in_msg, 4 ) != 0 )
  39167. {
  39168. MBEDTLS_SSL_DEBUG_MSG( 1, ( "fragment header mismatch" ) );
  39169. return( MBEDTLS_ERR_SSL_INVALID_RECORD );
  39170. }
  39171. }
  39172. msg = ssl->handshake->hs_msg + 12;
  39173. bitmask = msg + msg_len;
  39174. /*
  39175. * Check and copy current fragment
  39176. */
  39177. frag_off = ( ssl->in_msg[6] << 16 ) |
  39178. ( ssl->in_msg[7] << 8 ) |
  39179. ssl->in_msg[8];
  39180. frag_len = ( ssl->in_msg[9] << 16 ) |
  39181. ( ssl->in_msg[10] << 8 ) |
  39182. ssl->in_msg[11];
  39183. if( frag_off + frag_len > msg_len )
  39184. {
  39185. MBEDTLS_SSL_DEBUG_MSG( 1, ( "invalid fragment offset/len: %d + %d > %d",
  39186. frag_off, frag_len, msg_len ) );
  39187. return( MBEDTLS_ERR_SSL_INVALID_RECORD );
  39188. }
  39189. if( frag_len + 12 > ssl->in_msglen )
  39190. {
  39191. MBEDTLS_SSL_DEBUG_MSG( 1, ( "invalid fragment length: %d + 12 > %d",
  39192. frag_len, ssl->in_msglen ) );
  39193. return( MBEDTLS_ERR_SSL_INVALID_RECORD );
  39194. }
  39195. MBEDTLS_SSL_DEBUG_MSG( 2, ( "adding fragment, offset = %d, length = %d",
  39196. frag_off, frag_len ) );
  39197. memcpy( msg + frag_off, ssl->in_msg + 12, frag_len );
  39198. ssl_bitmask_set( bitmask, frag_off, frag_len );
  39199. /*
  39200. * Do we have the complete message by now?
  39201. * If yes, finalize it, else ask to read the next record.
  39202. */
  39203. if( ssl_bitmask_check( bitmask, msg_len ) != 0 )
  39204. {
  39205. MBEDTLS_SSL_DEBUG_MSG( 2, ( "message is not complete yet" ) );
  39206. return( MBEDTLS_ERR_SSL_WANT_READ );
  39207. }
  39208. MBEDTLS_SSL_DEBUG_MSG( 2, ( "handshake message completed" ) );
  39209. if( frag_len + 12 < ssl->in_msglen )
  39210. {
  39211. /*
  39212. * We'got more handshake messages in the same record.
  39213. * This case is not handled now because no know implementation does
  39214. * that and it's hard to test, so we prefer to fail cleanly for now.
  39215. */
  39216. MBEDTLS_SSL_DEBUG_MSG( 1, ( "last fragment not alone in its record" ) );
  39217. return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
  39218. }
  39219. if( ssl->in_left > ssl->next_record_offset )
  39220. {
  39221. /*
  39222. * We've got more data in the buffer after the current record,
  39223. * that we don't want to overwrite. Move it before writing the
  39224. * reassembled message, and adjust in_left and next_record_offset.
  39225. */
  39226. unsigned char *cur_remain = ssl->in_hdr + ssl->next_record_offset;
  39227. unsigned char *new_remain = ssl->in_msg + ssl->in_hslen;
  39228. size_t remain_len = ssl->in_left - ssl->next_record_offset;
  39229. /* First compute and check new lengths */
  39230. ssl->next_record_offset = new_remain - ssl->in_hdr;
  39231. ssl->in_left = ssl->next_record_offset + remain_len;
  39232. if( ssl->in_left > MBEDTLS_SSL_BUFFER_LEN -
  39233. (size_t)( ssl->in_hdr - ssl->in_buf ) )
  39234. {
  39235. MBEDTLS_SSL_DEBUG_MSG( 1, ( "reassembled message too large for buffer" ) );
  39236. return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
  39237. }
  39238. memmove( new_remain, cur_remain, remain_len );
  39239. }
  39240. memcpy( ssl->in_msg, ssl->handshake->hs_msg, ssl->in_hslen );
  39241. mbedtls_free( ssl->handshake->hs_msg );
  39242. ssl->handshake->hs_msg = NULL;
  39243. MBEDTLS_SSL_DEBUG_BUF( 3, "reassembled handshake message",
  39244. ssl->in_msg, ssl->in_hslen );
  39245. return( 0 );
  39246. }
  39247. #endif /* MBEDTLS_SSL_PROTO_DTLS */
  39248. static int ssl_prepare_handshake_record( mbedtls_ssl_context *ssl )
  39249. {
  39250. if( ssl->in_msglen < mbedtls_ssl_hs_hdr_len( ssl ) )
  39251. {
  39252. MBEDTLS_SSL_DEBUG_MSG( 1, ( "handshake message too short: %d",
  39253. ssl->in_msglen ) );
  39254. return( MBEDTLS_ERR_SSL_INVALID_RECORD );
  39255. }
  39256. ssl->in_hslen = mbedtls_ssl_hs_hdr_len( ssl ) + (
  39257. ( ssl->in_msg[1] << 16 ) |
  39258. ( ssl->in_msg[2] << 8 ) |
  39259. ssl->in_msg[3] );
  39260. MBEDTLS_SSL_DEBUG_MSG( 3, ( "handshake message: msglen ="
  39261. " %d, type = %d, hslen = %d",
  39262. ssl->in_msglen, ssl->in_msg[0], ssl->in_hslen ) );
  39263. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  39264. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
  39265. {
  39266. int ret;
  39267. unsigned int recv_msg_seq = ( ssl->in_msg[4] << 8 ) | ssl->in_msg[5];
  39268. /* ssl->handshake is NULL when receiving ClientHello for renego */
  39269. if( ssl->handshake != NULL &&
  39270. recv_msg_seq != ssl->handshake->in_msg_seq )
  39271. {
  39272. /* Retransmit only on last message from previous flight, to avoid
  39273. * too many retransmissions.
  39274. * Besides, No sane server ever retransmits HelloVerifyRequest */
  39275. if( recv_msg_seq == ssl->handshake->in_flight_start_seq - 1 &&
  39276. ssl->in_msg[0] != MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST )
  39277. {
  39278. MBEDTLS_SSL_DEBUG_MSG( 2, ( "received message from last flight, "
  39279. "message_seq = %d, start_of_flight = %d",
  39280. recv_msg_seq,
  39281. ssl->handshake->in_flight_start_seq ) );
  39282. if( ( ret = mbedtls_ssl_resend( ssl ) ) != 0 )
  39283. {
  39284. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_resend", ret );
  39285. return( ret );
  39286. }
  39287. }
  39288. else
  39289. {
  39290. MBEDTLS_SSL_DEBUG_MSG( 2, ( "dropping out-of-sequence message: "
  39291. "message_seq = %d, expected = %d",
  39292. recv_msg_seq,
  39293. ssl->handshake->in_msg_seq ) );
  39294. }
  39295. return( MBEDTLS_ERR_SSL_WANT_READ );
  39296. }
  39297. /* Wait until message completion to increment in_msg_seq */
  39298. /* Reassemble if current message is fragmented or reassembly is
  39299. * already in progress */
  39300. if( ssl->in_msglen < ssl->in_hslen ||
  39301. memcmp( ssl->in_msg + 6, "\0\0\0", 3 ) != 0 ||
  39302. memcmp( ssl->in_msg + 9, ssl->in_msg + 1, 3 ) != 0 ||
  39303. ( ssl->handshake != NULL && ssl->handshake->hs_msg != NULL ) )
  39304. {
  39305. MBEDTLS_SSL_DEBUG_MSG( 2, ( "found fragmented DTLS handshake message" ) );
  39306. if( ( ret = ssl_reassemble_dtls_handshake( ssl ) ) != 0 )
  39307. {
  39308. MBEDTLS_SSL_DEBUG_RET( 1, "ssl_reassemble_dtls_handshake", ret );
  39309. return( ret );
  39310. }
  39311. }
  39312. }
  39313. else
  39314. #endif /* MBEDTLS_SSL_PROTO_DTLS */
  39315. /* With TLS we don't handle fragmentation (for now) */
  39316. if( ssl->in_msglen < ssl->in_hslen )
  39317. {
  39318. MBEDTLS_SSL_DEBUG_MSG( 1, ( "TLS handshake fragmentation not supported" ) );
  39319. return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
  39320. }
  39321. if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER &&
  39322. ssl->handshake != NULL )
  39323. {
  39324. ssl->handshake->update_checksum( ssl, ssl->in_msg, ssl->in_hslen );
  39325. }
  39326. /* Handshake message is complete, increment counter */
  39327. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  39328. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
  39329. ssl->handshake != NULL )
  39330. {
  39331. ssl->handshake->in_msg_seq++;
  39332. }
  39333. #endif
  39334. return( 0 );
  39335. }
  39336. /*
  39337. * DTLS anti-replay: RFC 6347 4.1.2.6
  39338. *
  39339. * in_window is a field of bits numbered from 0 (lsb) to 63 (msb).
  39340. * Bit n is set iff record number in_window_top - n has been seen.
  39341. *
  39342. * Usually, in_window_top is the last record number seen and the lsb of
  39343. * in_window is set. The only exception is the initial state (record number 0
  39344. * not seen yet).
  39345. */
  39346. #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
  39347. static void ssl_dtls_replay_reset( mbedtls_ssl_context *ssl )
  39348. {
  39349. ssl->in_window_top = 0;
  39350. ssl->in_window = 0;
  39351. }
  39352. static inline uint64_t ssl_load_six_bytes( unsigned char *buf )
  39353. {
  39354. return( ( (uint64_t) buf[0] << 40 ) |
  39355. ( (uint64_t) buf[1] << 32 ) |
  39356. ( (uint64_t) buf[2] << 24 ) |
  39357. ( (uint64_t) buf[3] << 16 ) |
  39358. ( (uint64_t) buf[4] << 8 ) |
  39359. ( (uint64_t) buf[5] ) );
  39360. }
  39361. /*
  39362. * Return 0 if sequence number is acceptable, -1 otherwise
  39363. */
  39364. int mbedtls_ssl_dtls_replay_check( mbedtls_ssl_context *ssl )
  39365. {
  39366. uint64_t rec_seqnum = ssl_load_six_bytes( ssl->in_ctr + 2 );
  39367. uint64_t bit;
  39368. if( ssl->conf->anti_replay == MBEDTLS_SSL_ANTI_REPLAY_DISABLED )
  39369. return( 0 );
  39370. if( rec_seqnum > ssl->in_window_top )
  39371. return( 0 );
  39372. bit = ssl->in_window_top - rec_seqnum;
  39373. if( bit >= 64 )
  39374. return( -1 );
  39375. if( ( ssl->in_window & ( (uint64_t) 1 << bit ) ) != 0 )
  39376. return( -1 );
  39377. return( 0 );
  39378. }
  39379. /*
  39380. * Update replay window on new validated record
  39381. */
  39382. void mbedtls_ssl_dtls_replay_update( mbedtls_ssl_context *ssl )
  39383. {
  39384. uint64_t rec_seqnum = ssl_load_six_bytes( ssl->in_ctr + 2 );
  39385. if( ssl->conf->anti_replay == MBEDTLS_SSL_ANTI_REPLAY_DISABLED )
  39386. return;
  39387. if( rec_seqnum > ssl->in_window_top )
  39388. {
  39389. /* Update window_top and the contents of the window */
  39390. uint64_t shift = rec_seqnum - ssl->in_window_top;
  39391. if( shift >= 64 )
  39392. ssl->in_window = 1;
  39393. else
  39394. {
  39395. ssl->in_window <<= shift;
  39396. ssl->in_window |= 1;
  39397. }
  39398. ssl->in_window_top = rec_seqnum;
  39399. }
  39400. else
  39401. {
  39402. /* Mark that number as seen in the current window */
  39403. uint64_t bit = ssl->in_window_top - rec_seqnum;
  39404. if( bit < 64 ) /* Always true, but be extra sure */
  39405. ssl->in_window |= (uint64_t) 1 << bit;
  39406. }
  39407. }
  39408. #endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY */
  39409. #if defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE) && defined(MBEDTLS_SSL_SRV_C)
  39410. /* Forward declaration */
  39411. static int ssl_session_reset_int( mbedtls_ssl_context *ssl, int partial );
  39412. /*
  39413. * Without any SSL context, check if a datagram looks like a ClientHello with
  39414. * a valid cookie, and if it doesn't, generate a HelloVerifyRequest message.
  39415. * Both input and output include full DTLS headers.
  39416. *
  39417. * - if cookie is valid, return 0
  39418. * - if ClientHello looks superficially valid but cookie is not,
  39419. * fill obuf and set olen, then
  39420. * return MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED
  39421. * - otherwise return a specific error code
  39422. */
  39423. static int ssl_check_dtls_clihlo_cookie(
  39424. mbedtls_ssl_cookie_write_t *f_cookie_write,
  39425. mbedtls_ssl_cookie_check_t *f_cookie_check,
  39426. void *p_cookie,
  39427. const unsigned char *cli_id, size_t cli_id_len,
  39428. const unsigned char *in, size_t in_len,
  39429. unsigned char *obuf, size_t buf_len, size_t *olen )
  39430. {
  39431. size_t sid_len, cookie_len;
  39432. unsigned char *p;
  39433. if( f_cookie_write == NULL || f_cookie_check == NULL )
  39434. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  39435. /*
  39436. * Structure of ClientHello with record and handshake headers,
  39437. * and expected values. We don't need to check a lot, more checks will be
  39438. * done when actually parsing the ClientHello - skipping those checks
  39439. * avoids code duplication and does not make cookie forging any easier.
  39440. *
  39441. * 0-0 ContentType type; copied, must be handshake
  39442. * 1-2 ProtocolVersion version; copied
  39443. * 3-4 uint16 epoch; copied, must be 0
  39444. * 5-10 uint48 sequence_number; copied
  39445. * 11-12 uint16 length; (ignored)
  39446. *
  39447. * 13-13 HandshakeType msg_type; (ignored)
  39448. * 14-16 uint24 length; (ignored)
  39449. * 17-18 uint16 message_seq; copied
  39450. * 19-21 uint24 fragment_offset; copied, must be 0
  39451. * 22-24 uint24 fragment_length; (ignored)
  39452. *
  39453. * 25-26 ProtocolVersion client_version; (ignored)
  39454. * 27-58 Random random; (ignored)
  39455. * 59-xx SessionID session_id; 1 byte len + sid_len content
  39456. * 60+ opaque cookie<0..2^8-1>; 1 byte len + content
  39457. * ...
  39458. *
  39459. * Minimum length is 61 bytes.
  39460. */
  39461. if( in_len < 61 ||
  39462. in[0] != MBEDTLS_SSL_MSG_HANDSHAKE ||
  39463. in[3] != 0 || in[4] != 0 ||
  39464. in[19] != 0 || in[20] != 0 || in[21] != 0 )
  39465. {
  39466. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  39467. }
  39468. sid_len = in[59];
  39469. if( sid_len > in_len - 61 )
  39470. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  39471. cookie_len = in[60 + sid_len];
  39472. if( cookie_len > in_len - 60 )
  39473. return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
  39474. if( f_cookie_check( p_cookie, in + sid_len + 61, cookie_len,
  39475. cli_id, cli_id_len ) == 0 )
  39476. {
  39477. /* Valid cookie */
  39478. return( 0 );
  39479. }
  39480. /*
  39481. * If we get here, we've got an invalid cookie, let's prepare HVR.
  39482. *
  39483. * 0-0 ContentType type; copied
  39484. * 1-2 ProtocolVersion version; copied
  39485. * 3-4 uint16 epoch; copied
  39486. * 5-10 uint48 sequence_number; copied
  39487. * 11-12 uint16 length; olen - 13
  39488. *
  39489. * 13-13 HandshakeType msg_type; hello_verify_request
  39490. * 14-16 uint24 length; olen - 25
  39491. * 17-18 uint16 message_seq; copied
  39492. * 19-21 uint24 fragment_offset; copied
  39493. * 22-24 uint24 fragment_length; olen - 25
  39494. *
  39495. * 25-26 ProtocolVersion server_version; 0xfe 0xff
  39496. * 27-27 opaque cookie<0..2^8-1>; cookie_len = olen - 27, cookie
  39497. *
  39498. * Minimum length is 28.
  39499. */
  39500. if( buf_len < 28 )
  39501. return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
  39502. /* Copy most fields and adapt others */
  39503. memcpy( obuf, in, 25 );
  39504. obuf[13] = MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST;
  39505. obuf[25] = 0xfe;
  39506. obuf[26] = 0xff;
  39507. /* Generate and write actual cookie */
  39508. p = obuf + 28;
  39509. if( f_cookie_write( p_cookie,
  39510. &p, obuf + buf_len, cli_id, cli_id_len ) != 0 )
  39511. {
  39512. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  39513. }
  39514. *olen = p - obuf;
  39515. /* Go back and fill length fields */
  39516. obuf[27] = (unsigned char)( *olen - 28 );
  39517. obuf[14] = obuf[22] = (unsigned char)( ( *olen - 25 ) >> 16 );
  39518. obuf[15] = obuf[23] = (unsigned char)( ( *olen - 25 ) >> 8 );
  39519. obuf[16] = obuf[24] = (unsigned char)( ( *olen - 25 ) );
  39520. obuf[11] = (unsigned char)( ( *olen - 13 ) >> 8 );
  39521. obuf[12] = (unsigned char)( ( *olen - 13 ) );
  39522. return( MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED );
  39523. }
  39524. /*
  39525. * Handle possible client reconnect with the same UDP quadruplet
  39526. * (RFC 6347 Section 4.2.8).
  39527. *
  39528. * Called by ssl_parse_record_header() in case we receive an epoch 0 record
  39529. * that looks like a ClientHello.
  39530. *
  39531. * - if the input looks like a ClientHello without cookies,
  39532. * send back HelloVerifyRequest, then
  39533. * return MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED
  39534. * - if the input looks like a ClientHello with a valid cookie,
  39535. * reset the session of the current context, and
  39536. * return MBEDTLS_ERR_SSL_CLIENT_RECONNECT
  39537. * - if anything goes wrong, return a specific error code
  39538. *
  39539. * mbedtls_ssl_read_record() will ignore the record if anything else than
  39540. * MBEDTLS_ERR_SSL_CLIENT_RECONNECT or 0 is returned, although this function
  39541. * cannot not return 0.
  39542. */
  39543. static int ssl_handle_possible_reconnect( mbedtls_ssl_context *ssl )
  39544. {
  39545. int ret;
  39546. size_t len;
  39547. ret = ssl_check_dtls_clihlo_cookie(
  39548. ssl->conf->f_cookie_write,
  39549. ssl->conf->f_cookie_check,
  39550. ssl->conf->p_cookie,
  39551. ssl->cli_id, ssl->cli_id_len,
  39552. ssl->in_buf, ssl->in_left,
  39553. ssl->out_buf, MBEDTLS_SSL_MAX_CONTENT_LEN, &len );
  39554. MBEDTLS_SSL_DEBUG_RET( 2, "ssl_check_dtls_clihlo_cookie", ret );
  39555. if( ret == MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED )
  39556. {
  39557. /* Dont check write errors as we can't do anything here.
  39558. * If the error is permanent we'll catch it later,
  39559. * if it's not, then hopefully it'll work next time. */
  39560. (void) ssl->f_send( ssl->p_bio, ssl->out_buf, len );
  39561. return( MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED );
  39562. }
  39563. if( ret == 0 )
  39564. {
  39565. /* Got a valid cookie, partially reset context */
  39566. if( ( ret = ssl_session_reset_int( ssl, 1 ) ) != 0 )
  39567. {
  39568. MBEDTLS_SSL_DEBUG_RET( 1, "reset", ret );
  39569. return( ret );
  39570. }
  39571. return( MBEDTLS_ERR_SSL_CLIENT_RECONNECT );
  39572. }
  39573. return( ret );
  39574. }
  39575. #endif /* MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE && MBEDTLS_SSL_SRV_C */
  39576. /*
  39577. * ContentType type;
  39578. * ProtocolVersion version;
  39579. * uint16 epoch; // DTLS only
  39580. * uint48 sequence_number; // DTLS only
  39581. * uint16 length;
  39582. *
  39583. * Return 0 if header looks sane (and, for DTLS, the record is expected)
  39584. * MBEDTLS_ERR_SSL_INVALID_RECORD if the header looks bad,
  39585. * MBEDTLS_ERR_SSL_UNEXPECTED_RECORD (DTLS only) if sane but unexpected.
  39586. *
  39587. * With DTLS, mbedtls_ssl_read_record() will:
  39588. * 1. proceed with the record if this function returns 0
  39589. * 2. drop only the current record if this function returns UNEXPECTED_RECORD
  39590. * 3. return CLIENT_RECONNECT if this function return that value
  39591. * 4. drop the whole datagram if this function returns anything else.
  39592. * Point 2 is needed when the peer is resending, and we have already received
  39593. * the first record from a datagram but are still waiting for the others.
  39594. */
  39595. static int ssl_parse_record_header( mbedtls_ssl_context *ssl )
  39596. {
  39597. int ret;
  39598. int major_ver, minor_ver;
  39599. MBEDTLS_SSL_DEBUG_BUF( 4, "input record header", ssl->in_hdr, mbedtls_ssl_hdr_len( ssl ) );
  39600. ssl->in_msgtype = ssl->in_hdr[0];
  39601. ssl->in_msglen = ( ssl->in_len[0] << 8 ) | ssl->in_len[1];
  39602. mbedtls_ssl_read_version( &major_ver, &minor_ver, ssl->conf->transport, ssl->in_hdr + 1 );
  39603. MBEDTLS_SSL_DEBUG_MSG( 3, ( "input record: msgtype = %d, "
  39604. "version = [%d:%d], msglen = %d",
  39605. ssl->in_msgtype,
  39606. major_ver, minor_ver, ssl->in_msglen ) );
  39607. /* Check record type */
  39608. if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE &&
  39609. ssl->in_msgtype != MBEDTLS_SSL_MSG_ALERT &&
  39610. ssl->in_msgtype != MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC &&
  39611. ssl->in_msgtype != MBEDTLS_SSL_MSG_APPLICATION_DATA )
  39612. {
  39613. MBEDTLS_SSL_DEBUG_MSG( 1, ( "unknown record type" ) );
  39614. if( ( ret = mbedtls_ssl_send_alert_message( ssl,
  39615. MBEDTLS_SSL_ALERT_LEVEL_FATAL,
  39616. MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE ) ) != 0 )
  39617. {
  39618. return( ret );
  39619. }
  39620. return( MBEDTLS_ERR_SSL_INVALID_RECORD );
  39621. }
  39622. /* Check version */
  39623. if( major_ver != ssl->major_ver )
  39624. {
  39625. MBEDTLS_SSL_DEBUG_MSG( 1, ( "major version mismatch" ) );
  39626. return( MBEDTLS_ERR_SSL_INVALID_RECORD );
  39627. }
  39628. if( minor_ver > ssl->conf->max_minor_ver )
  39629. {
  39630. MBEDTLS_SSL_DEBUG_MSG( 1, ( "minor version mismatch" ) );
  39631. return( MBEDTLS_ERR_SSL_INVALID_RECORD );
  39632. }
  39633. /* Check length against the size of our buffer */
  39634. if( ssl->in_msglen > MBEDTLS_SSL_BUFFER_LEN
  39635. - (size_t)( ssl->in_msg - ssl->in_buf ) )
  39636. {
  39637. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad message length" ) );
  39638. return( MBEDTLS_ERR_SSL_INVALID_RECORD );
  39639. }
  39640. /* Check length against bounds of the current transform and version */
  39641. if( ssl->transform_in == NULL )
  39642. {
  39643. if( ssl->in_msglen < 1 ||
  39644. ssl->in_msglen > MBEDTLS_SSL_MAX_CONTENT_LEN )
  39645. {
  39646. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad message length" ) );
  39647. return( MBEDTLS_ERR_SSL_INVALID_RECORD );
  39648. }
  39649. }
  39650. else
  39651. {
  39652. if( ssl->in_msglen < ssl->transform_in->minlen )
  39653. {
  39654. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad message length" ) );
  39655. return( MBEDTLS_ERR_SSL_INVALID_RECORD );
  39656. }
  39657. #if defined(MBEDTLS_SSL_PROTO_SSL3)
  39658. if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 &&
  39659. ssl->in_msglen > ssl->transform_in->minlen + MBEDTLS_SSL_MAX_CONTENT_LEN )
  39660. {
  39661. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad message length" ) );
  39662. return( MBEDTLS_ERR_SSL_INVALID_RECORD );
  39663. }
  39664. #endif
  39665. #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
  39666. defined(MBEDTLS_SSL_PROTO_TLS1_2)
  39667. /*
  39668. * TLS encrypted messages can have up to 256 bytes of padding
  39669. */
  39670. if( ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_1 &&
  39671. ssl->in_msglen > ssl->transform_in->minlen +
  39672. MBEDTLS_SSL_MAX_CONTENT_LEN + 256 )
  39673. {
  39674. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad message length" ) );
  39675. return( MBEDTLS_ERR_SSL_INVALID_RECORD );
  39676. }
  39677. #endif
  39678. }
  39679. /*
  39680. * DTLS-related tests done last, because most of them may result in
  39681. * silently dropping the record (but not the whole datagram), and we only
  39682. * want to consider that after ensuring that the "basic" fields (type,
  39683. * version, length) are sane.
  39684. */
  39685. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  39686. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
  39687. {
  39688. unsigned int rec_epoch = ( ssl->in_ctr[0] << 8 ) | ssl->in_ctr[1];
  39689. /* Drop unexpected ChangeCipherSpec messages */
  39690. if( ssl->in_msgtype == MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC &&
  39691. ssl->state != MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC &&
  39692. ssl->state != MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC )
  39693. {
  39694. MBEDTLS_SSL_DEBUG_MSG( 1, ( "dropping unexpected ChangeCipherSpec" ) );
  39695. return( MBEDTLS_ERR_SSL_UNEXPECTED_RECORD );
  39696. }
  39697. /* Drop unexpected ApplicationData records,
  39698. * except at the beginning of renegotiations */
  39699. if( ssl->in_msgtype == MBEDTLS_SSL_MSG_APPLICATION_DATA &&
  39700. ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER
  39701. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  39702. && ! ( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
  39703. ssl->state == MBEDTLS_SSL_SERVER_HELLO )
  39704. #endif
  39705. )
  39706. {
  39707. MBEDTLS_SSL_DEBUG_MSG( 1, ( "dropping unexpected ApplicationData" ) );
  39708. return( MBEDTLS_ERR_SSL_UNEXPECTED_RECORD );
  39709. }
  39710. /* Check epoch (and sequence number) with DTLS */
  39711. if( rec_epoch != ssl->in_epoch )
  39712. {
  39713. MBEDTLS_SSL_DEBUG_MSG( 1, ( "record from another epoch: "
  39714. "expected %d, received %d",
  39715. ssl->in_epoch, rec_epoch ) );
  39716. #if defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE) && defined(MBEDTLS_SSL_SRV_C)
  39717. /*
  39718. * Check for an epoch 0 ClientHello. We can't use in_msg here to
  39719. * access the first byte of record content (handshake type), as we
  39720. * have an active transform (possibly iv_len != 0), so use the
  39721. * fact that the record header len is 13 instead.
  39722. */
  39723. if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER &&
  39724. ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER &&
  39725. rec_epoch == 0 &&
  39726. ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE &&
  39727. ssl->in_left > 13 &&
  39728. ssl->in_buf[13] == MBEDTLS_SSL_HS_CLIENT_HELLO )
  39729. {
  39730. MBEDTLS_SSL_DEBUG_MSG( 1, ( "possible client reconnect "
  39731. "from the same port" ) );
  39732. return( ssl_handle_possible_reconnect( ssl ) );
  39733. }
  39734. else
  39735. #endif /* MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE && MBEDTLS_SSL_SRV_C */
  39736. return( MBEDTLS_ERR_SSL_UNEXPECTED_RECORD );
  39737. }
  39738. #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
  39739. /* Replay detection only works for the current epoch */
  39740. if( rec_epoch == ssl->in_epoch &&
  39741. mbedtls_ssl_dtls_replay_check( ssl ) != 0 )
  39742. {
  39743. MBEDTLS_SSL_DEBUG_MSG( 1, ( "replayed record" ) );
  39744. return( MBEDTLS_ERR_SSL_UNEXPECTED_RECORD );
  39745. }
  39746. #endif
  39747. }
  39748. #endif /* MBEDTLS_SSL_PROTO_DTLS */
  39749. return( 0 );
  39750. }
  39751. /*
  39752. * If applicable, decrypt (and decompress) record content
  39753. */
  39754. static int ssl_prepare_record_content( mbedtls_ssl_context *ssl )
  39755. {
  39756. int ret, done = 0;
  39757. MBEDTLS_SSL_DEBUG_BUF( 4, "input record from network",
  39758. ssl->in_hdr, mbedtls_ssl_hdr_len( ssl ) + ssl->in_msglen );
  39759. #if defined(MBEDTLS_SSL_HW_RECORD_ACCEL)
  39760. if( mbedtls_ssl_hw_record_read != NULL )
  39761. {
  39762. MBEDTLS_SSL_DEBUG_MSG( 2, ( "going for mbedtls_ssl_hw_record_read()" ) );
  39763. ret = mbedtls_ssl_hw_record_read( ssl );
  39764. if( ret != 0 && ret != MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH )
  39765. {
  39766. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_hw_record_read", ret );
  39767. return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
  39768. }
  39769. if( ret == 0 )
  39770. done = 1;
  39771. }
  39772. #endif /* MBEDTLS_SSL_HW_RECORD_ACCEL */
  39773. if( !done && ssl->transform_in != NULL )
  39774. {
  39775. if( ( ret = ssl_decrypt_buf( ssl ) ) != 0 )
  39776. {
  39777. MBEDTLS_SSL_DEBUG_RET( 1, "ssl_decrypt_buf", ret );
  39778. return( ret );
  39779. }
  39780. MBEDTLS_SSL_DEBUG_BUF( 4, "input payload after decrypt",
  39781. ssl->in_msg, ssl->in_msglen );
  39782. if( ssl->in_msglen > MBEDTLS_SSL_MAX_CONTENT_LEN )
  39783. {
  39784. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad message length" ) );
  39785. return( MBEDTLS_ERR_SSL_INVALID_RECORD );
  39786. }
  39787. }
  39788. #if defined(MBEDTLS_ZLIB_SUPPORT)
  39789. if( ssl->transform_in != NULL &&
  39790. ssl->session_in->compression == MBEDTLS_SSL_COMPRESS_DEFLATE )
  39791. {
  39792. if( ( ret = ssl_decompress_buf( ssl ) ) != 0 )
  39793. {
  39794. MBEDTLS_SSL_DEBUG_RET( 1, "ssl_decompress_buf", ret );
  39795. return( ret );
  39796. }
  39797. // TODO: what's the purpose of these lines? is in_len used?
  39798. ssl->in_len[0] = (unsigned char)( ssl->in_msglen >> 8 );
  39799. ssl->in_len[1] = (unsigned char)( ssl->in_msglen );
  39800. }
  39801. #endif /* MBEDTLS_ZLIB_SUPPORT */
  39802. #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
  39803. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
  39804. {
  39805. mbedtls_ssl_dtls_replay_update( ssl );
  39806. }
  39807. #endif
  39808. return( 0 );
  39809. }
  39810. static void ssl_handshake_wrapup_free_hs_transform( mbedtls_ssl_context *ssl );
  39811. /*
  39812. * Read a record.
  39813. *
  39814. * Silently ignore non-fatal alert (and for DTLS, invalid records as well,
  39815. * RFC 6347 4.1.2.7) and continue reading until a valid record is found.
  39816. *
  39817. */
  39818. int mbedtls_ssl_read_record( mbedtls_ssl_context *ssl )
  39819. {
  39820. int ret;
  39821. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> read record" ) );
  39822. if( ssl->in_hslen != 0 && ssl->in_hslen < ssl->in_msglen )
  39823. {
  39824. /*
  39825. * Get next Handshake message in the current record
  39826. */
  39827. ssl->in_msglen -= ssl->in_hslen;
  39828. memmove( ssl->in_msg, ssl->in_msg + ssl->in_hslen,
  39829. ssl->in_msglen );
  39830. MBEDTLS_SSL_DEBUG_BUF( 4, "remaining content in record",
  39831. ssl->in_msg, ssl->in_msglen );
  39832. if( ( ret = ssl_prepare_handshake_record( ssl ) ) != 0 )
  39833. return( ret );
  39834. return( 0 );
  39835. }
  39836. ssl->in_hslen = 0;
  39837. /*
  39838. * Read the record header and parse it
  39839. */
  39840. read_record_header:
  39841. if( ( ret = mbedtls_ssl_fetch_input( ssl, mbedtls_ssl_hdr_len( ssl ) ) ) != 0 )
  39842. {
  39843. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_fetch_input", ret );
  39844. return( ret );
  39845. }
  39846. if( ( ret = ssl_parse_record_header( ssl ) ) != 0 )
  39847. {
  39848. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  39849. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
  39850. ret != MBEDTLS_ERR_SSL_CLIENT_RECONNECT )
  39851. {
  39852. if( ret == MBEDTLS_ERR_SSL_UNEXPECTED_RECORD )
  39853. {
  39854. /* Skip unexpected record (but not whole datagram) */
  39855. ssl->next_record_offset = ssl->in_msglen
  39856. + mbedtls_ssl_hdr_len( ssl );
  39857. MBEDTLS_SSL_DEBUG_MSG( 1, ( "discarding unexpected record "
  39858. "(header)" ) );
  39859. }
  39860. else
  39861. {
  39862. /* Skip invalid record and the rest of the datagram */
  39863. ssl->next_record_offset = 0;
  39864. ssl->in_left = 0;
  39865. MBEDTLS_SSL_DEBUG_MSG( 1, ( "discarding invalid record "
  39866. "(header)" ) );
  39867. }
  39868. /* Get next record */
  39869. goto read_record_header;
  39870. }
  39871. #endif
  39872. return( ret );
  39873. }
  39874. /*
  39875. * Read and optionally decrypt the message contents
  39876. */
  39877. if( ( ret = mbedtls_ssl_fetch_input( ssl,
  39878. mbedtls_ssl_hdr_len( ssl ) + ssl->in_msglen ) ) != 0 )
  39879. {
  39880. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_fetch_input", ret );
  39881. return( ret );
  39882. }
  39883. /* Done reading this record, get ready for the next one */
  39884. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  39885. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
  39886. ssl->next_record_offset = ssl->in_msglen + mbedtls_ssl_hdr_len( ssl );
  39887. else
  39888. #endif
  39889. ssl->in_left = 0;
  39890. if( ( ret = ssl_prepare_record_content( ssl ) ) != 0 )
  39891. {
  39892. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  39893. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
  39894. {
  39895. /* Silently discard invalid records */
  39896. if( ret == MBEDTLS_ERR_SSL_INVALID_RECORD ||
  39897. ret == MBEDTLS_ERR_SSL_INVALID_MAC )
  39898. {
  39899. /* Except when waiting for Finished as a bad mac here
  39900. * probably means something went wrong in the handshake
  39901. * (eg wrong psk used, mitm downgrade attempt, etc.) */
  39902. if( ssl->state == MBEDTLS_SSL_CLIENT_FINISHED ||
  39903. ssl->state == MBEDTLS_SSL_SERVER_FINISHED )
  39904. {
  39905. #if defined(MBEDTLS_SSL_ALL_ALERT_MESSAGES)
  39906. if( ret == MBEDTLS_ERR_SSL_INVALID_MAC )
  39907. {
  39908. mbedtls_ssl_send_alert_message( ssl,
  39909. MBEDTLS_SSL_ALERT_LEVEL_FATAL,
  39910. MBEDTLS_SSL_ALERT_MSG_BAD_RECORD_MAC );
  39911. }
  39912. #endif
  39913. return( ret );
  39914. }
  39915. #if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT)
  39916. if( ssl->conf->badmac_limit != 0 &&
  39917. ++ssl->badmac_seen >= ssl->conf->badmac_limit )
  39918. {
  39919. MBEDTLS_SSL_DEBUG_MSG( 1, ( "too many records with bad MAC" ) );
  39920. return( MBEDTLS_ERR_SSL_INVALID_MAC );
  39921. }
  39922. #endif
  39923. MBEDTLS_SSL_DEBUG_MSG( 1, ( "discarding invalid record (mac)" ) );
  39924. goto read_record_header;
  39925. }
  39926. return( ret );
  39927. }
  39928. else
  39929. #endif
  39930. {
  39931. /* Error out (and send alert) on invalid records */
  39932. #if defined(MBEDTLS_SSL_ALL_ALERT_MESSAGES)
  39933. if( ret == MBEDTLS_ERR_SSL_INVALID_MAC )
  39934. {
  39935. mbedtls_ssl_send_alert_message( ssl,
  39936. MBEDTLS_SSL_ALERT_LEVEL_FATAL,
  39937. MBEDTLS_SSL_ALERT_MSG_BAD_RECORD_MAC );
  39938. }
  39939. #endif
  39940. return( ret );
  39941. }
  39942. }
  39943. /*
  39944. * When we sent the last flight of the handshake, we MUST respond to a
  39945. * retransmit of the peer's previous flight with a retransmit. (In
  39946. * practice, only the Finished message will make it, other messages
  39947. * including CCS use the old transform so they're dropped as invalid.)
  39948. *
  39949. * If the record we received is not a handshake message, however, it
  39950. * means the peer received our last flight so we can clean up
  39951. * handshake info.
  39952. *
  39953. * This check needs to be done before prepare_handshake() due to an edge
  39954. * case: if the client immediately requests renegotiation, this
  39955. * finishes the current handshake first, avoiding the new ClientHello
  39956. * being mistaken for an ancient message in the current handshake.
  39957. */
  39958. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  39959. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
  39960. ssl->handshake != NULL &&
  39961. ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER )
  39962. {
  39963. if( ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE &&
  39964. ssl->in_msg[0] == MBEDTLS_SSL_HS_FINISHED )
  39965. {
  39966. MBEDTLS_SSL_DEBUG_MSG( 2, ( "received retransmit of last flight" ) );
  39967. if( ( ret = mbedtls_ssl_resend( ssl ) ) != 0 )
  39968. {
  39969. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_resend", ret );
  39970. return( ret );
  39971. }
  39972. return( MBEDTLS_ERR_SSL_WANT_READ );
  39973. }
  39974. else
  39975. {
  39976. ssl_handshake_wrapup_free_hs_transform( ssl );
  39977. }
  39978. }
  39979. #endif
  39980. /*
  39981. * Handle particular types of records
  39982. */
  39983. if( ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE )
  39984. {
  39985. if( ( ret = ssl_prepare_handshake_record( ssl ) ) != 0 )
  39986. return( ret );
  39987. }
  39988. if( ssl->in_msgtype == MBEDTLS_SSL_MSG_ALERT )
  39989. {
  39990. MBEDTLS_SSL_DEBUG_MSG( 2, ( "got an alert message, type: [%d:%d]",
  39991. ssl->in_msg[0], ssl->in_msg[1] ) );
  39992. /*
  39993. * Ignore non-fatal alerts, except close_notify and no_renegotiation
  39994. */
  39995. if( ssl->in_msg[0] == MBEDTLS_SSL_ALERT_LEVEL_FATAL )
  39996. {
  39997. MBEDTLS_SSL_DEBUG_MSG( 1, ( "is a fatal alert message (msg %d)",
  39998. ssl->in_msg[1] ) );
  39999. return( MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE );
  40000. }
  40001. if( ssl->in_msg[0] == MBEDTLS_SSL_ALERT_LEVEL_WARNING &&
  40002. ssl->in_msg[1] == MBEDTLS_SSL_ALERT_MSG_CLOSE_NOTIFY )
  40003. {
  40004. MBEDTLS_SSL_DEBUG_MSG( 2, ( "is a close notify message" ) );
  40005. return( MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY );
  40006. }
  40007. #if defined(MBEDTLS_SSL_RENEGOTIATION_ENABLED)
  40008. if( ssl->in_msg[0] == MBEDTLS_SSL_ALERT_LEVEL_WARNING &&
  40009. ssl->in_msg[1] == MBEDTLS_SSL_ALERT_MSG_NO_RENEGOTIATION )
  40010. {
  40011. MBEDTLS_SSL_DEBUG_MSG( 2, ( "is a SSLv3 no_cert" ) );
  40012. /* Will be handled when trying to parse ServerHello */
  40013. return( 0 );
  40014. }
  40015. #endif
  40016. #if defined(MBEDTLS_SSL_PROTO_SSL3) && defined(MBEDTLS_SSL_SRV_C)
  40017. if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 &&
  40018. ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER &&
  40019. ssl->in_msg[0] == MBEDTLS_SSL_ALERT_LEVEL_WARNING &&
  40020. ssl->in_msg[1] == MBEDTLS_SSL_ALERT_MSG_NO_CERT )
  40021. {
  40022. MBEDTLS_SSL_DEBUG_MSG( 2, ( "is a SSLv3 no_cert" ) );
  40023. /* Will be handled in mbedtls_ssl_parse_certificate() */
  40024. return( 0 );
  40025. }
  40026. #endif /* MBEDTLS_SSL_PROTO_SSL3 && MBEDTLS_SSL_SRV_C */
  40027. /* Silently ignore: fetch new message */
  40028. goto read_record_header;
  40029. }
  40030. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= read record" ) );
  40031. return( 0 );
  40032. }
  40033. int mbedtls_ssl_send_fatal_handshake_failure( mbedtls_ssl_context *ssl )
  40034. {
  40035. int ret;
  40036. if( ( ret = mbedtls_ssl_send_alert_message( ssl,
  40037. MBEDTLS_SSL_ALERT_LEVEL_FATAL,
  40038. MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ) ) != 0 )
  40039. {
  40040. return( ret );
  40041. }
  40042. return( 0 );
  40043. }
  40044. int mbedtls_ssl_send_alert_message( mbedtls_ssl_context *ssl,
  40045. unsigned char level,
  40046. unsigned char message )
  40047. {
  40048. int ret;
  40049. if( ssl == NULL || ssl->conf == NULL )
  40050. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  40051. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> send alert message" ) );
  40052. ssl->out_msgtype = MBEDTLS_SSL_MSG_ALERT;
  40053. ssl->out_msglen = 2;
  40054. ssl->out_msg[0] = level;
  40055. ssl->out_msg[1] = message;
  40056. if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 )
  40057. {
  40058. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret );
  40059. return( ret );
  40060. }
  40061. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= send alert message" ) );
  40062. return( 0 );
  40063. }
  40064. /*
  40065. * Handshake functions
  40066. */
  40067. #if !defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) && \
  40068. !defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) && \
  40069. !defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) && \
  40070. !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) && \
  40071. !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) && \
  40072. !defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) && \
  40073. !defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
  40074. int mbedtls_ssl_write_certificate( mbedtls_ssl_context *ssl )
  40075. {
  40076. const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
  40077. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate" ) );
  40078. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
  40079. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
  40080. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
  40081. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
  40082. {
  40083. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
  40084. ssl->state++;
  40085. return( 0 );
  40086. }
  40087. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  40088. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  40089. }
  40090. int mbedtls_ssl_parse_certificate( mbedtls_ssl_context *ssl )
  40091. {
  40092. const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
  40093. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate" ) );
  40094. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
  40095. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
  40096. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
  40097. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
  40098. {
  40099. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
  40100. ssl->state++;
  40101. return( 0 );
  40102. }
  40103. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  40104. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  40105. }
  40106. #else
  40107. int mbedtls_ssl_write_certificate( mbedtls_ssl_context *ssl )
  40108. {
  40109. int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
  40110. size_t i, n;
  40111. const mbedtls_x509_crt *crt;
  40112. const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
  40113. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate" ) );
  40114. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
  40115. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
  40116. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
  40117. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
  40118. {
  40119. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
  40120. ssl->state++;
  40121. return( 0 );
  40122. }
  40123. #if defined(MBEDTLS_SSL_CLI_C)
  40124. if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )
  40125. {
  40126. if( ssl->client_auth == 0 )
  40127. {
  40128. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
  40129. ssl->state++;
  40130. return( 0 );
  40131. }
  40132. #if defined(MBEDTLS_SSL_PROTO_SSL3)
  40133. /*
  40134. * If using SSLv3 and got no cert, send an Alert message
  40135. * (otherwise an empty Certificate message will be sent).
  40136. */
  40137. if( mbedtls_ssl_own_cert( ssl ) == NULL &&
  40138. ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
  40139. {
  40140. ssl->out_msglen = 2;
  40141. ssl->out_msgtype = MBEDTLS_SSL_MSG_ALERT;
  40142. ssl->out_msg[0] = MBEDTLS_SSL_ALERT_LEVEL_WARNING;
  40143. ssl->out_msg[1] = MBEDTLS_SSL_ALERT_MSG_NO_CERT;
  40144. MBEDTLS_SSL_DEBUG_MSG( 2, ( "got no certificate to send" ) );
  40145. goto write_msg;
  40146. }
  40147. #endif /* MBEDTLS_SSL_PROTO_SSL3 */
  40148. }
  40149. #endif /* MBEDTLS_SSL_CLI_C */
  40150. #if defined(MBEDTLS_SSL_SRV_C)
  40151. if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
  40152. {
  40153. if( mbedtls_ssl_own_cert( ssl ) == NULL )
  40154. {
  40155. MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no certificate to send" ) );
  40156. return( MBEDTLS_ERR_SSL_CERTIFICATE_REQUIRED );
  40157. }
  40158. }
  40159. #endif
  40160. MBEDTLS_SSL_DEBUG_CRT( 3, "own certificate", mbedtls_ssl_own_cert( ssl ) );
  40161. /*
  40162. * 0 . 0 handshake type
  40163. * 1 . 3 handshake length
  40164. * 4 . 6 length of all certs
  40165. * 7 . 9 length of cert. 1
  40166. * 10 . n-1 peer certificate
  40167. * n . n+2 length of cert. 2
  40168. * n+3 . ... upper level cert, etc.
  40169. */
  40170. i = 7;
  40171. crt = mbedtls_ssl_own_cert( ssl );
  40172. while( crt != NULL )
  40173. {
  40174. n = crt->raw.len;
  40175. if( n > MBEDTLS_SSL_MAX_CONTENT_LEN - 3 - i )
  40176. {
  40177. MBEDTLS_SSL_DEBUG_MSG( 1, ( "certificate too large, %d > %d",
  40178. i + 3 + n, MBEDTLS_SSL_MAX_CONTENT_LEN ) );
  40179. return( MBEDTLS_ERR_SSL_CERTIFICATE_TOO_LARGE );
  40180. }
  40181. ssl->out_msg[i ] = (unsigned char)( n >> 16 );
  40182. ssl->out_msg[i + 1] = (unsigned char)( n >> 8 );
  40183. ssl->out_msg[i + 2] = (unsigned char)( n );
  40184. i += 3; memcpy( ssl->out_msg + i, crt->raw.p, n );
  40185. i += n; crt = crt->next;
  40186. }
  40187. ssl->out_msg[4] = (unsigned char)( ( i - 7 ) >> 16 );
  40188. ssl->out_msg[5] = (unsigned char)( ( i - 7 ) >> 8 );
  40189. ssl->out_msg[6] = (unsigned char)( ( i - 7 ) );
  40190. ssl->out_msglen = i;
  40191. ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
  40192. ssl->out_msg[0] = MBEDTLS_SSL_HS_CERTIFICATE;
  40193. #if defined(MBEDTLS_SSL_PROTO_SSL3) && defined(MBEDTLS_SSL_CLI_C)
  40194. write_msg:
  40195. #endif
  40196. ssl->state++;
  40197. if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 )
  40198. {
  40199. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret );
  40200. return( ret );
  40201. }
  40202. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write certificate" ) );
  40203. return( ret );
  40204. }
  40205. int mbedtls_ssl_parse_certificate( mbedtls_ssl_context *ssl )
  40206. {
  40207. int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
  40208. size_t i, n;
  40209. const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
  40210. int authmode = ssl->conf->authmode;
  40211. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate" ) );
  40212. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
  40213. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
  40214. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
  40215. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
  40216. {
  40217. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
  40218. ssl->state++;
  40219. return( 0 );
  40220. }
  40221. #if defined(MBEDTLS_SSL_SRV_C)
  40222. if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER &&
  40223. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK )
  40224. {
  40225. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
  40226. ssl->state++;
  40227. return( 0 );
  40228. }
  40229. #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
  40230. if( ssl->handshake->sni_authmode != MBEDTLS_SSL_VERIFY_UNSET )
  40231. authmode = ssl->handshake->sni_authmode;
  40232. #endif
  40233. if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER &&
  40234. authmode == MBEDTLS_SSL_VERIFY_NONE )
  40235. {
  40236. ssl->session_negotiate->verify_result = MBEDTLS_X509_BADCERT_SKIP_VERIFY;
  40237. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
  40238. ssl->state++;
  40239. return( 0 );
  40240. }
  40241. #endif
  40242. if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 )
  40243. {
  40244. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
  40245. return( ret );
  40246. }
  40247. ssl->state++;
  40248. #if defined(MBEDTLS_SSL_SRV_C)
  40249. #if defined(MBEDTLS_SSL_PROTO_SSL3)
  40250. /*
  40251. * Check if the client sent an empty certificate
  40252. */
  40253. if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER &&
  40254. ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
  40255. {
  40256. if( ssl->in_msglen == 2 &&
  40257. ssl->in_msgtype == MBEDTLS_SSL_MSG_ALERT &&
  40258. ssl->in_msg[0] == MBEDTLS_SSL_ALERT_LEVEL_WARNING &&
  40259. ssl->in_msg[1] == MBEDTLS_SSL_ALERT_MSG_NO_CERT )
  40260. {
  40261. MBEDTLS_SSL_DEBUG_MSG( 1, ( "SSLv3 client has no certificate" ) );
  40262. ssl->session_negotiate->verify_result = MBEDTLS_X509_BADCERT_MISSING;
  40263. if( authmode == MBEDTLS_SSL_VERIFY_OPTIONAL )
  40264. return( 0 );
  40265. else
  40266. return( MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE );
  40267. }
  40268. }
  40269. #endif /* MBEDTLS_SSL_PROTO_SSL3 */
  40270. #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
  40271. defined(MBEDTLS_SSL_PROTO_TLS1_2)
  40272. if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER &&
  40273. ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_0 )
  40274. {
  40275. if( ssl->in_hslen == 3 + mbedtls_ssl_hs_hdr_len( ssl ) &&
  40276. ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE &&
  40277. ssl->in_msg[0] == MBEDTLS_SSL_HS_CERTIFICATE &&
  40278. memcmp( ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl ), "\0\0\0", 3 ) == 0 )
  40279. {
  40280. MBEDTLS_SSL_DEBUG_MSG( 1, ( "TLSv1 client has no certificate" ) );
  40281. ssl->session_negotiate->verify_result = MBEDTLS_X509_BADCERT_MISSING;
  40282. if( authmode == MBEDTLS_SSL_VERIFY_OPTIONAL )
  40283. return( 0 );
  40284. else
  40285. return( MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE );
  40286. }
  40287. }
  40288. #endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \
  40289. MBEDTLS_SSL_PROTO_TLS1_2 */
  40290. #endif /* MBEDTLS_SSL_SRV_C */
  40291. if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
  40292. {
  40293. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
  40294. return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
  40295. }
  40296. if( ssl->in_msg[0] != MBEDTLS_SSL_HS_CERTIFICATE ||
  40297. ssl->in_hslen < mbedtls_ssl_hs_hdr_len( ssl ) + 3 + 3 )
  40298. {
  40299. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
  40300. return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE );
  40301. }
  40302. i = mbedtls_ssl_hs_hdr_len( ssl );
  40303. /*
  40304. * Same message structure as in mbedtls_ssl_write_certificate()
  40305. */
  40306. n = ( ssl->in_msg[i+1] << 8 ) | ssl->in_msg[i+2];
  40307. if( ssl->in_msg[i] != 0 ||
  40308. ssl->in_hslen != n + 3 + mbedtls_ssl_hs_hdr_len( ssl ) )
  40309. {
  40310. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
  40311. return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE );
  40312. }
  40313. /* In case we tried to reuse a session but it failed */
  40314. if( ssl->session_negotiate->peer_cert != NULL )
  40315. {
  40316. mbedtls_x509_crt_free( ssl->session_negotiate->peer_cert );
  40317. mbedtls_free( ssl->session_negotiate->peer_cert );
  40318. }
  40319. if( ( ssl->session_negotiate->peer_cert = mbedtls_calloc( 1,
  40320. sizeof( mbedtls_x509_crt ) ) ) == NULL )
  40321. {
  40322. MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc(%d bytes) failed",
  40323. sizeof( mbedtls_x509_crt ) ) );
  40324. return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
  40325. }
  40326. mbedtls_x509_crt_init( ssl->session_negotiate->peer_cert );
  40327. i += 3;
  40328. while( i < ssl->in_hslen )
  40329. {
  40330. if( ssl->in_msg[i] != 0 )
  40331. {
  40332. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
  40333. return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE );
  40334. }
  40335. n = ( (unsigned int) ssl->in_msg[i + 1] << 8 )
  40336. | (unsigned int) ssl->in_msg[i + 2];
  40337. i += 3;
  40338. if( n < 128 || i + n > ssl->in_hslen )
  40339. {
  40340. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
  40341. return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE );
  40342. }
  40343. ret = mbedtls_x509_crt_parse_der( ssl->session_negotiate->peer_cert,
  40344. ssl->in_msg + i, n );
  40345. if( ret != 0 )
  40346. {
  40347. MBEDTLS_SSL_DEBUG_RET( 1, " mbedtls_x509_crt_parse_der", ret );
  40348. return( ret );
  40349. }
  40350. i += n;
  40351. }
  40352. MBEDTLS_SSL_DEBUG_CRT( 3, "peer certificate", ssl->session_negotiate->peer_cert );
  40353. /*
  40354. * On client, make sure the server cert doesn't change during renego to
  40355. * avoid "triple handshake" attack: https://secure-resumption.com/
  40356. */
  40357. #if defined(MBEDTLS_SSL_RENEGOTIATION) && defined(MBEDTLS_SSL_CLI_C)
  40358. if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT &&
  40359. ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )
  40360. {
  40361. if( ssl->session->peer_cert == NULL )
  40362. {
  40363. MBEDTLS_SSL_DEBUG_MSG( 1, ( "new server cert during renegotiation" ) );
  40364. return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE );
  40365. }
  40366. if( ssl->session->peer_cert->raw.len !=
  40367. ssl->session_negotiate->peer_cert->raw.len ||
  40368. memcmp( ssl->session->peer_cert->raw.p,
  40369. ssl->session_negotiate->peer_cert->raw.p,
  40370. ssl->session->peer_cert->raw.len ) != 0 )
  40371. {
  40372. MBEDTLS_SSL_DEBUG_MSG( 1, ( "server cert changed during renegotiation" ) );
  40373. return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE );
  40374. }
  40375. }
  40376. #endif /* MBEDTLS_SSL_RENEGOTIATION && MBEDTLS_SSL_CLI_C */
  40377. if( authmode != MBEDTLS_SSL_VERIFY_NONE )
  40378. {
  40379. mbedtls_x509_crt *ca_chain;
  40380. mbedtls_x509_crl *ca_crl;
  40381. #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
  40382. if( ssl->handshake->sni_ca_chain != NULL )
  40383. {
  40384. ca_chain = ssl->handshake->sni_ca_chain;
  40385. ca_crl = ssl->handshake->sni_ca_crl;
  40386. }
  40387. else
  40388. #endif
  40389. {
  40390. ca_chain = ssl->conf->ca_chain;
  40391. ca_crl = ssl->conf->ca_crl;
  40392. }
  40393. if( ca_chain == NULL )
  40394. {
  40395. MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no CA chain" ) );
  40396. return( MBEDTLS_ERR_SSL_CA_CHAIN_REQUIRED );
  40397. }
  40398. /*
  40399. * Main check: verify certificate
  40400. */
  40401. ret = mbedtls_x509_crt_verify_with_profile(
  40402. ssl->session_negotiate->peer_cert,
  40403. ca_chain, ca_crl,
  40404. ssl->conf->cert_profile,
  40405. ssl->hostname,
  40406. &ssl->session_negotiate->verify_result,
  40407. ssl->conf->f_vrfy, ssl->conf->p_vrfy );
  40408. if( ret != 0 )
  40409. {
  40410. MBEDTLS_SSL_DEBUG_RET( 1, "x509_verify_cert", ret );
  40411. }
  40412. /*
  40413. * Secondary checks: always done, but change 'ret' only if it was 0
  40414. */
  40415. #if defined(MBEDTLS_ECP_C)
  40416. {
  40417. const mbedtls_pk_context *pk = &ssl->session_negotiate->peer_cert->pk;
  40418. /* If certificate uses an EC key, make sure the curve is OK */
  40419. if( mbedtls_pk_can_do( pk, MBEDTLS_PK_ECKEY ) &&
  40420. mbedtls_ssl_check_curve( ssl, mbedtls_pk_ec( *pk )->grp.id ) != 0 )
  40421. {
  40422. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate (EC key curve)" ) );
  40423. if( ret == 0 )
  40424. ret = MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE;
  40425. }
  40426. }
  40427. #endif /* MBEDTLS_ECP_C */
  40428. if( mbedtls_ssl_check_cert_usage( ssl->session_negotiate->peer_cert,
  40429. ciphersuite_info,
  40430. ! ssl->conf->endpoint,
  40431. &ssl->session_negotiate->verify_result ) != 0 )
  40432. {
  40433. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate (usage extensions)" ) );
  40434. if( ret == 0 )
  40435. ret = MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE;
  40436. }
  40437. if( authmode == MBEDTLS_SSL_VERIFY_OPTIONAL )
  40438. ret = 0;
  40439. }
  40440. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse certificate" ) );
  40441. return( ret );
  40442. }
  40443. #endif /* !MBEDTLS_KEY_EXCHANGE_RSA_ENABLED
  40444. !MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED
  40445. !MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED
  40446. !MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED
  40447. !MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED
  40448. !MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED
  40449. !MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
  40450. int mbedtls_ssl_write_change_cipher_spec( mbedtls_ssl_context *ssl )
  40451. {
  40452. int ret;
  40453. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write change cipher spec" ) );
  40454. ssl->out_msgtype = MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC;
  40455. ssl->out_msglen = 1;
  40456. ssl->out_msg[0] = 1;
  40457. ssl->state++;
  40458. if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 )
  40459. {
  40460. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret );
  40461. return( ret );
  40462. }
  40463. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write change cipher spec" ) );
  40464. return( 0 );
  40465. }
  40466. int mbedtls_ssl_parse_change_cipher_spec( mbedtls_ssl_context *ssl )
  40467. {
  40468. int ret;
  40469. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse change cipher spec" ) );
  40470. if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 )
  40471. {
  40472. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
  40473. return( ret );
  40474. }
  40475. if( ssl->in_msgtype != MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC )
  40476. {
  40477. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad change cipher spec message" ) );
  40478. return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
  40479. }
  40480. if( ssl->in_msglen != 1 || ssl->in_msg[0] != 1 )
  40481. {
  40482. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad change cipher spec message" ) );
  40483. return( MBEDTLS_ERR_SSL_BAD_HS_CHANGE_CIPHER_SPEC );
  40484. }
  40485. /*
  40486. * Switch to our negotiated transform and session parameters for inbound
  40487. * data.
  40488. */
  40489. MBEDTLS_SSL_DEBUG_MSG( 3, ( "switching to new transform spec for inbound data" ) );
  40490. ssl->transform_in = ssl->transform_negotiate;
  40491. ssl->session_in = ssl->session_negotiate;
  40492. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  40493. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
  40494. {
  40495. #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
  40496. ssl_dtls_replay_reset( ssl );
  40497. #endif
  40498. /* Increment epoch */
  40499. if( ++ssl->in_epoch == 0 )
  40500. {
  40501. MBEDTLS_SSL_DEBUG_MSG( 1, ( "DTLS epoch would wrap" ) );
  40502. return( MBEDTLS_ERR_SSL_COUNTER_WRAPPING );
  40503. }
  40504. }
  40505. else
  40506. #endif /* MBEDTLS_SSL_PROTO_DTLS */
  40507. memset( ssl->in_ctr, 0, 8 );
  40508. /*
  40509. * Set the in_msg pointer to the correct location based on IV length
  40510. */
  40511. if( ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_2 )
  40512. {
  40513. ssl->in_msg = ssl->in_iv + ssl->transform_negotiate->ivlen -
  40514. ssl->transform_negotiate->fixed_ivlen;
  40515. }
  40516. else
  40517. ssl->in_msg = ssl->in_iv;
  40518. #if defined(MBEDTLS_SSL_HW_RECORD_ACCEL)
  40519. if( mbedtls_ssl_hw_record_activate != NULL )
  40520. {
  40521. if( ( ret = mbedtls_ssl_hw_record_activate( ssl, MBEDTLS_SSL_CHANNEL_INBOUND ) ) != 0 )
  40522. {
  40523. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_hw_record_activate", ret );
  40524. return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
  40525. }
  40526. }
  40527. #endif
  40528. ssl->state++;
  40529. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse change cipher spec" ) );
  40530. return( 0 );
  40531. }
  40532. void mbedtls_ssl_optimize_checksum( mbedtls_ssl_context *ssl,
  40533. const mbedtls_ssl_ciphersuite_t *ciphersuite_info )
  40534. {
  40535. ((void) ciphersuite_info);
  40536. #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
  40537. defined(MBEDTLS_SSL_PROTO_TLS1_1)
  40538. if( ssl->minor_ver < MBEDTLS_SSL_MINOR_VERSION_3 )
  40539. ssl->handshake->update_checksum = ssl_update_checksum_md5sha1;
  40540. else
  40541. #endif
  40542. #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
  40543. #if defined(MBEDTLS_SHA512_C)
  40544. if( ciphersuite_info->mac == MBEDTLS_MD_SHA384 )
  40545. ssl->handshake->update_checksum = ssl_update_checksum_sha384;
  40546. else
  40547. #endif
  40548. #if defined(MBEDTLS_SHA256_C)
  40549. if( ciphersuite_info->mac != MBEDTLS_MD_SHA384 )
  40550. ssl->handshake->update_checksum = ssl_update_checksum_sha256;
  40551. else
  40552. #endif
  40553. #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
  40554. {
  40555. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  40556. return;
  40557. }
  40558. }
  40559. void mbedtls_ssl_reset_checksum( mbedtls_ssl_context *ssl )
  40560. {
  40561. #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
  40562. defined(MBEDTLS_SSL_PROTO_TLS1_1)
  40563. mbedtls_md5_starts( &ssl->handshake->fin_md5 );
  40564. mbedtls_sha1_starts( &ssl->handshake->fin_sha1 );
  40565. #endif
  40566. #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
  40567. #if defined(MBEDTLS_SHA256_C)
  40568. mbedtls_sha256_starts( &ssl->handshake->fin_sha256, 0 );
  40569. #endif
  40570. #if defined(MBEDTLS_SHA512_C)
  40571. mbedtls_sha512_starts( &ssl->handshake->fin_sha512, 1 );
  40572. #endif
  40573. #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
  40574. }
  40575. static void ssl_update_checksum_start( mbedtls_ssl_context *ssl,
  40576. const unsigned char *buf, size_t len )
  40577. {
  40578. #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
  40579. defined(MBEDTLS_SSL_PROTO_TLS1_1)
  40580. mbedtls_md5_update( &ssl->handshake->fin_md5 , buf, len );
  40581. mbedtls_sha1_update( &ssl->handshake->fin_sha1, buf, len );
  40582. #endif
  40583. #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
  40584. #if defined(MBEDTLS_SHA256_C)
  40585. mbedtls_sha256_update( &ssl->handshake->fin_sha256, buf, len );
  40586. #endif
  40587. #if defined(MBEDTLS_SHA512_C)
  40588. mbedtls_sha512_update( &ssl->handshake->fin_sha512, buf, len );
  40589. #endif
  40590. #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
  40591. }
  40592. #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
  40593. defined(MBEDTLS_SSL_PROTO_TLS1_1)
  40594. static void ssl_update_checksum_md5sha1( mbedtls_ssl_context *ssl,
  40595. const unsigned char *buf, size_t len )
  40596. {
  40597. mbedtls_md5_update( &ssl->handshake->fin_md5 , buf, len );
  40598. mbedtls_sha1_update( &ssl->handshake->fin_sha1, buf, len );
  40599. }
  40600. #endif
  40601. #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
  40602. #if defined(MBEDTLS_SHA256_C)
  40603. static void ssl_update_checksum_sha256( mbedtls_ssl_context *ssl,
  40604. const unsigned char *buf, size_t len )
  40605. {
  40606. mbedtls_sha256_update( &ssl->handshake->fin_sha256, buf, len );
  40607. }
  40608. #endif
  40609. #if defined(MBEDTLS_SHA512_C)
  40610. static void ssl_update_checksum_sha384( mbedtls_ssl_context *ssl,
  40611. const unsigned char *buf, size_t len )
  40612. {
  40613. mbedtls_sha512_update( &ssl->handshake->fin_sha512, buf, len );
  40614. }
  40615. #endif
  40616. #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
  40617. #if defined(MBEDTLS_SSL_PROTO_SSL3)
  40618. static void ssl_calc_finished_ssl(
  40619. mbedtls_ssl_context *ssl, unsigned char *buf, int from )
  40620. {
  40621. const char *sender;
  40622. mbedtls_md5_context md5;
  40623. mbedtls_sha1_context sha1;
  40624. unsigned char padbuf[48];
  40625. unsigned char md5sum[16];
  40626. unsigned char sha1sum[20];
  40627. mbedtls_ssl_session *session = ssl->session_negotiate;
  40628. if( !session )
  40629. session = ssl->session;
  40630. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc finished ssl" ) );
  40631. mbedtls_md5_init( &md5 );
  40632. mbedtls_sha1_init( &sha1 );
  40633. mbedtls_md5_clone( &md5, &ssl->handshake->fin_md5 );
  40634. mbedtls_sha1_clone( &sha1, &ssl->handshake->fin_sha1 );
  40635. /*
  40636. * SSLv3:
  40637. * hash =
  40638. * MD5( master + pad2 +
  40639. * MD5( handshake + sender + master + pad1 ) )
  40640. * + SHA1( master + pad2 +
  40641. * SHA1( handshake + sender + master + pad1 ) )
  40642. */
  40643. #if !defined(MBEDTLS_MD5_ALT)
  40644. MBEDTLS_SSL_DEBUG_BUF( 4, "finished md5 state", (unsigned char *)
  40645. md5.state, sizeof( md5.state ) );
  40646. #endif
  40647. #if !defined(MBEDTLS_SHA1_ALT)
  40648. MBEDTLS_SSL_DEBUG_BUF( 4, "finished sha1 state", (unsigned char *)
  40649. sha1.state, sizeof( sha1.state ) );
  40650. #endif
  40651. sender = ( from == MBEDTLS_SSL_IS_CLIENT ) ? "CLNT"
  40652. : "SRVR";
  40653. memset( padbuf, 0x36, 48 );
  40654. mbedtls_md5_update( &md5, (const unsigned char *) sender, 4 );
  40655. mbedtls_md5_update( &md5, session->master, 48 );
  40656. mbedtls_md5_update( &md5, padbuf, 48 );
  40657. mbedtls_md5_finish( &md5, md5sum );
  40658. mbedtls_sha1_update( &sha1, (const unsigned char *) sender, 4 );
  40659. mbedtls_sha1_update( &sha1, session->master, 48 );
  40660. mbedtls_sha1_update( &sha1, padbuf, 40 );
  40661. mbedtls_sha1_finish( &sha1, sha1sum );
  40662. memset( padbuf, 0x5C, 48 );
  40663. mbedtls_md5_starts( &md5 );
  40664. mbedtls_md5_update( &md5, session->master, 48 );
  40665. mbedtls_md5_update( &md5, padbuf, 48 );
  40666. mbedtls_md5_update( &md5, md5sum, 16 );
  40667. mbedtls_md5_finish( &md5, buf );
  40668. mbedtls_sha1_starts( &sha1 );
  40669. mbedtls_sha1_update( &sha1, session->master, 48 );
  40670. mbedtls_sha1_update( &sha1, padbuf , 40 );
  40671. mbedtls_sha1_update( &sha1, sha1sum, 20 );
  40672. mbedtls_sha1_finish( &sha1, buf + 16 );
  40673. MBEDTLS_SSL_DEBUG_BUF( 3, "calc finished result", buf, 36 );
  40674. mbedtls_md5_free( &md5 );
  40675. mbedtls_sha1_free( &sha1 );
  40676. ssl_tls_zeroize( padbuf, sizeof( padbuf ) );
  40677. ssl_tls_zeroize( md5sum, sizeof( md5sum ) );
  40678. ssl_tls_zeroize( sha1sum, sizeof( sha1sum ) );
  40679. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
  40680. }
  40681. #endif /* MBEDTLS_SSL_PROTO_SSL3 */
  40682. #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1)
  40683. static void ssl_calc_finished_tls(
  40684. mbedtls_ssl_context *ssl, unsigned char *buf, int from )
  40685. {
  40686. int len = 12;
  40687. const char *sender;
  40688. mbedtls_md5_context md5;
  40689. mbedtls_sha1_context sha1;
  40690. unsigned char padbuf[36];
  40691. mbedtls_ssl_session *session = ssl->session_negotiate;
  40692. if( !session )
  40693. session = ssl->session;
  40694. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc finished tls" ) );
  40695. mbedtls_md5_init( &md5 );
  40696. mbedtls_sha1_init( &sha1 );
  40697. mbedtls_md5_clone( &md5, &ssl->handshake->fin_md5 );
  40698. mbedtls_sha1_clone( &sha1, &ssl->handshake->fin_sha1 );
  40699. /*
  40700. * TLSv1:
  40701. * hash = PRF( master, finished_label,
  40702. * MD5( handshake ) + SHA1( handshake ) )[0..11]
  40703. */
  40704. #if !defined(MBEDTLS_MD5_ALT)
  40705. MBEDTLS_SSL_DEBUG_BUF( 4, "finished md5 state", (unsigned char *)
  40706. md5.state, sizeof( md5.state ) );
  40707. #endif
  40708. #if !defined(MBEDTLS_SHA1_ALT)
  40709. MBEDTLS_SSL_DEBUG_BUF( 4, "finished sha1 state", (unsigned char *)
  40710. sha1.state, sizeof( sha1.state ) );
  40711. #endif
  40712. sender = ( from == MBEDTLS_SSL_IS_CLIENT )
  40713. ? "client finished"
  40714. : "server finished";
  40715. mbedtls_md5_finish( &md5, padbuf );
  40716. mbedtls_sha1_finish( &sha1, padbuf + 16 );
  40717. ssl->handshake->tls_prf( session->master, 48, sender,
  40718. padbuf, 36, buf, len );
  40719. MBEDTLS_SSL_DEBUG_BUF( 3, "calc finished result", buf, len );
  40720. mbedtls_md5_free( &md5 );
  40721. mbedtls_sha1_free( &sha1 );
  40722. ssl_tls_zeroize( padbuf, sizeof( padbuf ) );
  40723. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
  40724. }
  40725. #endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 */
  40726. #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
  40727. #if defined(MBEDTLS_SHA256_C)
  40728. static void ssl_calc_finished_tls_sha256(
  40729. mbedtls_ssl_context *ssl, unsigned char *buf, int from )
  40730. {
  40731. int len = 12;
  40732. const char *sender;
  40733. mbedtls_sha256_context sha256;
  40734. unsigned char padbuf[32];
  40735. mbedtls_ssl_session *session = ssl->session_negotiate;
  40736. if( !session )
  40737. session = ssl->session;
  40738. mbedtls_sha256_init( &sha256 );
  40739. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc finished tls sha256" ) );
  40740. mbedtls_sha256_clone( &sha256, &ssl->handshake->fin_sha256 );
  40741. /*
  40742. * TLSv1.2:
  40743. * hash = PRF( master, finished_label,
  40744. * Hash( handshake ) )[0.11]
  40745. */
  40746. #if !defined(MBEDTLS_SHA256_ALT)
  40747. MBEDTLS_SSL_DEBUG_BUF( 4, "finished sha2 state", (unsigned char *)
  40748. sha256.state, sizeof( sha256.state ) );
  40749. #endif
  40750. sender = ( from == MBEDTLS_SSL_IS_CLIENT )
  40751. ? "client finished"
  40752. : "server finished";
  40753. mbedtls_sha256_finish( &sha256, padbuf );
  40754. ssl->handshake->tls_prf( session->master, 48, sender,
  40755. padbuf, 32, buf, len );
  40756. MBEDTLS_SSL_DEBUG_BUF( 3, "calc finished result", buf, len );
  40757. mbedtls_sha256_free( &sha256 );
  40758. ssl_tls_zeroize( padbuf, sizeof( padbuf ) );
  40759. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
  40760. }
  40761. #endif /* MBEDTLS_SHA256_C */
  40762. #if defined(MBEDTLS_SHA512_C)
  40763. static void ssl_calc_finished_tls_sha384(
  40764. mbedtls_ssl_context *ssl, unsigned char *buf, int from )
  40765. {
  40766. int len = 12;
  40767. const char *sender;
  40768. mbedtls_sha512_context sha512;
  40769. unsigned char padbuf[48];
  40770. mbedtls_ssl_session *session = ssl->session_negotiate;
  40771. if( !session )
  40772. session = ssl->session;
  40773. mbedtls_sha512_init( &sha512 );
  40774. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc finished tls sha384" ) );
  40775. mbedtls_sha512_clone( &sha512, &ssl->handshake->fin_sha512 );
  40776. /*
  40777. * TLSv1.2:
  40778. * hash = PRF( master, finished_label,
  40779. * Hash( handshake ) )[0.11]
  40780. */
  40781. #if !defined(MBEDTLS_SHA512_ALT)
  40782. MBEDTLS_SSL_DEBUG_BUF( 4, "finished sha512 state", (unsigned char *)
  40783. sha512.state, sizeof( sha512.state ) );
  40784. #endif
  40785. sender = ( from == MBEDTLS_SSL_IS_CLIENT )
  40786. ? "client finished"
  40787. : "server finished";
  40788. mbedtls_sha512_finish( &sha512, padbuf );
  40789. ssl->handshake->tls_prf( session->master, 48, sender,
  40790. padbuf, 48, buf, len );
  40791. MBEDTLS_SSL_DEBUG_BUF( 3, "calc finished result", buf, len );
  40792. mbedtls_sha512_free( &sha512 );
  40793. ssl_tls_zeroize( padbuf, sizeof( padbuf ) );
  40794. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
  40795. }
  40796. #endif /* MBEDTLS_SHA512_C */
  40797. #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
  40798. static void ssl_handshake_wrapup_free_hs_transform( mbedtls_ssl_context *ssl )
  40799. {
  40800. MBEDTLS_SSL_DEBUG_MSG( 3, ( "=> handshake wrapup: final free" ) );
  40801. /*
  40802. * Free our handshake params
  40803. */
  40804. mbedtls_ssl_handshake_free( ssl->handshake );
  40805. mbedtls_free( ssl->handshake );
  40806. ssl->handshake = NULL;
  40807. /*
  40808. * Free the previous transform and swith in the current one
  40809. */
  40810. if( ssl->transform )
  40811. {
  40812. mbedtls_ssl_transform_free( ssl->transform );
  40813. mbedtls_free( ssl->transform );
  40814. }
  40815. ssl->transform = ssl->transform_negotiate;
  40816. ssl->transform_negotiate = NULL;
  40817. MBEDTLS_SSL_DEBUG_MSG( 3, ( "<= handshake wrapup: final free" ) );
  40818. }
  40819. void mbedtls_ssl_handshake_wrapup( mbedtls_ssl_context *ssl )
  40820. {
  40821. int resume = ssl->handshake->resume;
  40822. MBEDTLS_SSL_DEBUG_MSG( 3, ( "=> handshake wrapup" ) );
  40823. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  40824. if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )
  40825. {
  40826. ssl->renego_status = MBEDTLS_SSL_RENEGOTIATION_DONE;
  40827. ssl->renego_records_seen = 0;
  40828. }
  40829. #endif
  40830. /*
  40831. * Free the previous session and switch in the current one
  40832. */
  40833. if( ssl->session )
  40834. {
  40835. #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
  40836. /* RFC 7366 3.1: keep the EtM state */
  40837. ssl->session_negotiate->encrypt_then_mac =
  40838. ssl->session->encrypt_then_mac;
  40839. #endif
  40840. mbedtls_ssl_session_free( ssl->session );
  40841. mbedtls_free( ssl->session );
  40842. }
  40843. ssl->session = ssl->session_negotiate;
  40844. ssl->session_negotiate = NULL;
  40845. /*
  40846. * Add cache entry
  40847. */
  40848. if( ssl->conf->f_set_cache != NULL &&
  40849. ssl->session->id_len != 0 &&
  40850. resume == 0 )
  40851. {
  40852. if( ssl->conf->f_set_cache( ssl->conf->p_cache, ssl->session ) != 0 )
  40853. MBEDTLS_SSL_DEBUG_MSG( 1, ( "cache did not store session" ) );
  40854. }
  40855. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  40856. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
  40857. ssl->handshake->flight != NULL )
  40858. {
  40859. /* Cancel handshake timer */
  40860. ssl_set_timer( ssl, 0 );
  40861. /* Keep last flight around in case we need to resend it:
  40862. * we need the handshake and transform structures for that */
  40863. MBEDTLS_SSL_DEBUG_MSG( 3, ( "skip freeing handshake and transform" ) );
  40864. }
  40865. else
  40866. #endif
  40867. ssl_handshake_wrapup_free_hs_transform( ssl );
  40868. ssl->state++;
  40869. MBEDTLS_SSL_DEBUG_MSG( 3, ( "<= handshake wrapup" ) );
  40870. }
  40871. int mbedtls_ssl_write_finished( mbedtls_ssl_context *ssl )
  40872. {
  40873. int ret, hash_len;
  40874. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write finished" ) );
  40875. /*
  40876. * Set the out_msg pointer to the correct location based on IV length
  40877. */
  40878. if( ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_2 )
  40879. {
  40880. ssl->out_msg = ssl->out_iv + ssl->transform_negotiate->ivlen -
  40881. ssl->transform_negotiate->fixed_ivlen;
  40882. }
  40883. else
  40884. ssl->out_msg = ssl->out_iv;
  40885. ssl->handshake->calc_finished( ssl, ssl->out_msg + 4, ssl->conf->endpoint );
  40886. // TODO TLS/1.2 Hash length is determined by cipher suite (Page 63)
  40887. hash_len = ( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ) ? 36 : 12;
  40888. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  40889. ssl->verify_data_len = hash_len;
  40890. memcpy( ssl->own_verify_data, ssl->out_msg + 4, hash_len );
  40891. #endif
  40892. ssl->out_msglen = 4 + hash_len;
  40893. ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
  40894. ssl->out_msg[0] = MBEDTLS_SSL_HS_FINISHED;
  40895. /*
  40896. * In case of session resuming, invert the client and server
  40897. * ChangeCipherSpec messages order.
  40898. */
  40899. if( ssl->handshake->resume != 0 )
  40900. {
  40901. #if defined(MBEDTLS_SSL_CLI_C)
  40902. if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )
  40903. ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;
  40904. #endif
  40905. #if defined(MBEDTLS_SSL_SRV_C)
  40906. if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
  40907. ssl->state = MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC;
  40908. #endif
  40909. }
  40910. else
  40911. ssl->state++;
  40912. /*
  40913. * Switch to our negotiated transform and session parameters for outbound
  40914. * data.
  40915. */
  40916. MBEDTLS_SSL_DEBUG_MSG( 3, ( "switching to new transform spec for outbound data" ) );
  40917. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  40918. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
  40919. {
  40920. unsigned char i;
  40921. /* Remember current epoch settings for resending */
  40922. ssl->handshake->alt_transform_out = ssl->transform_out;
  40923. memcpy( ssl->handshake->alt_out_ctr, ssl->out_ctr, 8 );
  40924. /* Set sequence_number to zero */
  40925. memset( ssl->out_ctr + 2, 0, 6 );
  40926. /* Increment epoch */
  40927. for( i = 2; i > 0; i-- )
  40928. if( ++ssl->out_ctr[i - 1] != 0 )
  40929. break;
  40930. /* The loop goes to its end iff the counter is wrapping */
  40931. if( i == 0 )
  40932. {
  40933. MBEDTLS_SSL_DEBUG_MSG( 1, ( "DTLS epoch would wrap" ) );
  40934. return( MBEDTLS_ERR_SSL_COUNTER_WRAPPING );
  40935. }
  40936. }
  40937. else
  40938. #endif /* MBEDTLS_SSL_PROTO_DTLS */
  40939. memset( ssl->out_ctr, 0, 8 );
  40940. ssl->transform_out = ssl->transform_negotiate;
  40941. ssl->session_out = ssl->session_negotiate;
  40942. #if defined(MBEDTLS_SSL_HW_RECORD_ACCEL)
  40943. if( mbedtls_ssl_hw_record_activate != NULL )
  40944. {
  40945. if( ( ret = mbedtls_ssl_hw_record_activate( ssl, MBEDTLS_SSL_CHANNEL_OUTBOUND ) ) != 0 )
  40946. {
  40947. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_hw_record_activate", ret );
  40948. return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
  40949. }
  40950. }
  40951. #endif
  40952. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  40953. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
  40954. mbedtls_ssl_send_flight_completed( ssl );
  40955. #endif
  40956. if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 )
  40957. {
  40958. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret );
  40959. return( ret );
  40960. }
  40961. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write finished" ) );
  40962. return( 0 );
  40963. }
  40964. #if defined(MBEDTLS_SSL_PROTO_SSL3)
  40965. #define SSL_MAX_HASH_LEN 36
  40966. #else
  40967. #define SSL_MAX_HASH_LEN 12
  40968. #endif
  40969. int mbedtls_ssl_parse_finished( mbedtls_ssl_context *ssl )
  40970. {
  40971. int ret;
  40972. unsigned int hash_len;
  40973. unsigned char buf[SSL_MAX_HASH_LEN];
  40974. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse finished" ) );
  40975. ssl->handshake->calc_finished( ssl, buf, ssl->conf->endpoint ^ 1 );
  40976. if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 )
  40977. {
  40978. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
  40979. return( ret );
  40980. }
  40981. if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
  40982. {
  40983. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
  40984. return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
  40985. }
  40986. /* There is currently no ciphersuite using another length with TLS 1.2 */
  40987. #if defined(MBEDTLS_SSL_PROTO_SSL3)
  40988. if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
  40989. hash_len = 36;
  40990. else
  40991. #endif
  40992. hash_len = 12;
  40993. if( ssl->in_msg[0] != MBEDTLS_SSL_HS_FINISHED ||
  40994. ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) + hash_len )
  40995. {
  40996. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
  40997. return( MBEDTLS_ERR_SSL_BAD_HS_FINISHED );
  40998. }
  40999. if( mbedtls_ssl_safer_memcmp( ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl ),
  41000. buf, hash_len ) != 0 )
  41001. {
  41002. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
  41003. return( MBEDTLS_ERR_SSL_BAD_HS_FINISHED );
  41004. }
  41005. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  41006. ssl->verify_data_len = hash_len;
  41007. memcpy( ssl->peer_verify_data, buf, hash_len );
  41008. #endif
  41009. if( ssl->handshake->resume != 0 )
  41010. {
  41011. #if defined(MBEDTLS_SSL_CLI_C)
  41012. if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )
  41013. ssl->state = MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC;
  41014. #endif
  41015. #if defined(MBEDTLS_SSL_SRV_C)
  41016. if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
  41017. ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;
  41018. #endif
  41019. }
  41020. else
  41021. ssl->state++;
  41022. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  41023. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
  41024. mbedtls_ssl_recv_flight_completed( ssl );
  41025. #endif
  41026. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse finished" ) );
  41027. return( 0 );
  41028. }
  41029. static void ssl_handshake_params_init( mbedtls_ssl_handshake_params *handshake )
  41030. {
  41031. memset( handshake, 0, sizeof( mbedtls_ssl_handshake_params ) );
  41032. #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
  41033. defined(MBEDTLS_SSL_PROTO_TLS1_1)
  41034. mbedtls_md5_init( &handshake->fin_md5 );
  41035. mbedtls_sha1_init( &handshake->fin_sha1 );
  41036. mbedtls_md5_starts( &handshake->fin_md5 );
  41037. mbedtls_sha1_starts( &handshake->fin_sha1 );
  41038. #endif
  41039. #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
  41040. #if defined(MBEDTLS_SHA256_C)
  41041. mbedtls_sha256_init( &handshake->fin_sha256 );
  41042. mbedtls_sha256_starts( &handshake->fin_sha256, 0 );
  41043. #endif
  41044. #if defined(MBEDTLS_SHA512_C)
  41045. mbedtls_sha512_init( &handshake->fin_sha512 );
  41046. mbedtls_sha512_starts( &handshake->fin_sha512, 1 );
  41047. #endif
  41048. #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
  41049. handshake->update_checksum = ssl_update_checksum_start;
  41050. handshake->sig_alg = MBEDTLS_SSL_HASH_SHA1;
  41051. #if defined(MBEDTLS_DHM_C)
  41052. mbedtls_dhm_init( &handshake->dhm_ctx );
  41053. #endif
  41054. #if defined(MBEDTLS_ECDH_C)
  41055. mbedtls_ecdh_init( &handshake->ecdh_ctx );
  41056. #endif
  41057. #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
  41058. mbedtls_ecjpake_init( &handshake->ecjpake_ctx );
  41059. #if defined(MBEDTLS_SSL_CLI_C)
  41060. handshake->ecjpake_cache = NULL;
  41061. handshake->ecjpake_cache_len = 0;
  41062. #endif
  41063. #endif
  41064. #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
  41065. handshake->sni_authmode = MBEDTLS_SSL_VERIFY_UNSET;
  41066. #endif
  41067. }
  41068. static void ssl_transform_init( mbedtls_ssl_transform *transform )
  41069. {
  41070. memset( transform, 0, sizeof(mbedtls_ssl_transform) );
  41071. mbedtls_cipher_init( &transform->cipher_ctx_enc );
  41072. mbedtls_cipher_init( &transform->cipher_ctx_dec );
  41073. mbedtls_md_init( &transform->md_ctx_enc );
  41074. mbedtls_md_init( &transform->md_ctx_dec );
  41075. }
  41076. void mbedtls_ssl_session_init( mbedtls_ssl_session *session )
  41077. {
  41078. memset( session, 0, sizeof(mbedtls_ssl_session) );
  41079. }
  41080. static int ssl_handshake_init( mbedtls_ssl_context *ssl )
  41081. {
  41082. /* Clear old handshake information if present */
  41083. if( ssl->transform_negotiate )
  41084. mbedtls_ssl_transform_free( ssl->transform_negotiate );
  41085. if( ssl->session_negotiate )
  41086. mbedtls_ssl_session_free( ssl->session_negotiate );
  41087. if( ssl->handshake )
  41088. mbedtls_ssl_handshake_free( ssl->handshake );
  41089. /*
  41090. * Either the pointers are now NULL or cleared properly and can be freed.
  41091. * Now allocate missing structures.
  41092. */
  41093. if( ssl->transform_negotiate == NULL )
  41094. {
  41095. ssl->transform_negotiate = mbedtls_calloc( 1, sizeof(mbedtls_ssl_transform) );
  41096. }
  41097. if( ssl->session_negotiate == NULL )
  41098. {
  41099. ssl->session_negotiate = mbedtls_calloc( 1, sizeof(mbedtls_ssl_session) );
  41100. }
  41101. if( ssl->handshake == NULL )
  41102. {
  41103. ssl->handshake = mbedtls_calloc( 1, sizeof(mbedtls_ssl_handshake_params) );
  41104. }
  41105. /* All pointers should exist and can be directly freed without issue */
  41106. if( ssl->handshake == NULL ||
  41107. ssl->transform_negotiate == NULL ||
  41108. ssl->session_negotiate == NULL )
  41109. {
  41110. MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc() of ssl sub-contexts failed" ) );
  41111. mbedtls_free( ssl->handshake );
  41112. mbedtls_free( ssl->transform_negotiate );
  41113. mbedtls_free( ssl->session_negotiate );
  41114. ssl->handshake = NULL;
  41115. ssl->transform_negotiate = NULL;
  41116. ssl->session_negotiate = NULL;
  41117. return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
  41118. }
  41119. /* Initialize structures */
  41120. mbedtls_ssl_session_init( ssl->session_negotiate );
  41121. ssl_transform_init( ssl->transform_negotiate );
  41122. ssl_handshake_params_init( ssl->handshake );
  41123. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  41124. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
  41125. {
  41126. ssl->handshake->alt_transform_out = ssl->transform_out;
  41127. if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )
  41128. ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_PREPARING;
  41129. else
  41130. ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_WAITING;
  41131. ssl_set_timer( ssl, 0 );
  41132. }
  41133. #endif
  41134. return( 0 );
  41135. }
  41136. #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C)
  41137. /* Dummy cookie callbacks for defaults */
  41138. static int ssl_cookie_write_dummy( void *ctx,
  41139. unsigned char **p, unsigned char *end,
  41140. const unsigned char *cli_id, size_t cli_id_len )
  41141. {
  41142. ((void) ctx);
  41143. ((void) p);
  41144. ((void) end);
  41145. ((void) cli_id);
  41146. ((void) cli_id_len);
  41147. return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
  41148. }
  41149. static int ssl_cookie_check_dummy( void *ctx,
  41150. const unsigned char *cookie, size_t cookie_len,
  41151. const unsigned char *cli_id, size_t cli_id_len )
  41152. {
  41153. ((void) ctx);
  41154. ((void) cookie);
  41155. ((void) cookie_len);
  41156. ((void) cli_id);
  41157. ((void) cli_id_len);
  41158. return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
  41159. }
  41160. #endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY && MBEDTLS_SSL_SRV_C */
  41161. /*
  41162. * Initialize an SSL context
  41163. */
  41164. void mbedtls_ssl_init( mbedtls_ssl_context *ssl )
  41165. {
  41166. memset( ssl, 0, sizeof( mbedtls_ssl_context ) );
  41167. }
  41168. /*
  41169. * Setup an SSL context
  41170. */
  41171. int mbedtls_ssl_setup( mbedtls_ssl_context *ssl,
  41172. const mbedtls_ssl_config *conf )
  41173. {
  41174. int ret;
  41175. const size_t len = MBEDTLS_SSL_BUFFER_LEN;
  41176. ssl->conf = conf;
  41177. /*
  41178. * Prepare base structures
  41179. */
  41180. if( ( ssl-> in_buf = mbedtls_calloc( 1, len ) ) == NULL ||
  41181. ( ssl->out_buf = mbedtls_calloc( 1, len ) ) == NULL )
  41182. {
  41183. MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc(%d bytes) failed", len ) );
  41184. mbedtls_free( ssl->in_buf );
  41185. ssl->in_buf = NULL;
  41186. return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
  41187. }
  41188. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  41189. if( conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
  41190. {
  41191. ssl->out_hdr = ssl->out_buf;
  41192. ssl->out_ctr = ssl->out_buf + 3;
  41193. ssl->out_len = ssl->out_buf + 11;
  41194. ssl->out_iv = ssl->out_buf + 13;
  41195. ssl->out_msg = ssl->out_buf + 13;
  41196. ssl->in_hdr = ssl->in_buf;
  41197. ssl->in_ctr = ssl->in_buf + 3;
  41198. ssl->in_len = ssl->in_buf + 11;
  41199. ssl->in_iv = ssl->in_buf + 13;
  41200. ssl->in_msg = ssl->in_buf + 13;
  41201. }
  41202. else
  41203. #endif
  41204. {
  41205. ssl->out_ctr = ssl->out_buf;
  41206. ssl->out_hdr = ssl->out_buf + 8;
  41207. ssl->out_len = ssl->out_buf + 11;
  41208. ssl->out_iv = ssl->out_buf + 13;
  41209. ssl->out_msg = ssl->out_buf + 13;
  41210. ssl->in_ctr = ssl->in_buf;
  41211. ssl->in_hdr = ssl->in_buf + 8;
  41212. ssl->in_len = ssl->in_buf + 11;
  41213. ssl->in_iv = ssl->in_buf + 13;
  41214. ssl->in_msg = ssl->in_buf + 13;
  41215. }
  41216. if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
  41217. return( ret );
  41218. return( 0 );
  41219. }
  41220. /*
  41221. * Reset an initialized and used SSL context for re-use while retaining
  41222. * all application-set variables, function pointers and data.
  41223. *
  41224. * If partial is non-zero, keep data in the input buffer and client ID.
  41225. * (Use when a DTLS client reconnects from the same port.)
  41226. */
  41227. static int ssl_session_reset_int( mbedtls_ssl_context *ssl, int partial )
  41228. {
  41229. int ret;
  41230. ssl->state = MBEDTLS_SSL_HELLO_REQUEST;
  41231. /* Cancel any possibly running timer */
  41232. ssl_set_timer( ssl, 0 );
  41233. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  41234. ssl->renego_status = MBEDTLS_SSL_INITIAL_HANDSHAKE;
  41235. ssl->renego_records_seen = 0;
  41236. ssl->verify_data_len = 0;
  41237. memset( ssl->own_verify_data, 0, MBEDTLS_SSL_VERIFY_DATA_MAX_LEN );
  41238. memset( ssl->peer_verify_data, 0, MBEDTLS_SSL_VERIFY_DATA_MAX_LEN );
  41239. #endif
  41240. ssl->secure_renegotiation = MBEDTLS_SSL_LEGACY_RENEGOTIATION;
  41241. ssl->in_offt = NULL;
  41242. ssl->in_msg = ssl->in_buf + 13;
  41243. ssl->in_msgtype = 0;
  41244. ssl->in_msglen = 0;
  41245. if( partial == 0 )
  41246. ssl->in_left = 0;
  41247. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  41248. ssl->next_record_offset = 0;
  41249. ssl->in_epoch = 0;
  41250. #endif
  41251. #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
  41252. ssl_dtls_replay_reset( ssl );
  41253. #endif
  41254. ssl->in_hslen = 0;
  41255. ssl->nb_zero = 0;
  41256. ssl->record_read = 0;
  41257. ssl->out_msg = ssl->out_buf + 13;
  41258. ssl->out_msgtype = 0;
  41259. ssl->out_msglen = 0;
  41260. ssl->out_left = 0;
  41261. #if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING)
  41262. if( ssl->split_done != MBEDTLS_SSL_CBC_RECORD_SPLITTING_DISABLED )
  41263. ssl->split_done = 0;
  41264. #endif
  41265. ssl->transform_in = NULL;
  41266. ssl->transform_out = NULL;
  41267. memset( ssl->out_buf, 0, MBEDTLS_SSL_BUFFER_LEN );
  41268. if( partial == 0 )
  41269. memset( ssl->in_buf, 0, MBEDTLS_SSL_BUFFER_LEN );
  41270. #if defined(MBEDTLS_SSL_HW_RECORD_ACCEL)
  41271. if( mbedtls_ssl_hw_record_reset != NULL )
  41272. {
  41273. MBEDTLS_SSL_DEBUG_MSG( 2, ( "going for mbedtls_ssl_hw_record_reset()" ) );
  41274. if( ( ret = mbedtls_ssl_hw_record_reset( ssl ) ) != 0 )
  41275. {
  41276. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_hw_record_reset", ret );
  41277. return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
  41278. }
  41279. }
  41280. #endif
  41281. if( ssl->transform )
  41282. {
  41283. mbedtls_ssl_transform_free( ssl->transform );
  41284. mbedtls_free( ssl->transform );
  41285. ssl->transform = NULL;
  41286. }
  41287. if( ssl->session )
  41288. {
  41289. mbedtls_ssl_session_free( ssl->session );
  41290. mbedtls_free( ssl->session );
  41291. ssl->session = NULL;
  41292. }
  41293. #if defined(MBEDTLS_SSL_ALPN)
  41294. ssl->alpn_chosen = NULL;
  41295. #endif
  41296. #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C)
  41297. if( partial == 0 )
  41298. {
  41299. mbedtls_free( ssl->cli_id );
  41300. ssl->cli_id = NULL;
  41301. ssl->cli_id_len = 0;
  41302. }
  41303. #endif
  41304. if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
  41305. return( ret );
  41306. return( 0 );
  41307. }
  41308. /*
  41309. * Reset an initialized and used SSL context for re-use while retaining
  41310. * all application-set variables, function pointers and data.
  41311. */
  41312. int mbedtls_ssl_session_reset( mbedtls_ssl_context *ssl )
  41313. {
  41314. return( ssl_session_reset_int( ssl, 0 ) );
  41315. }
  41316. /*
  41317. * SSL set accessors
  41318. */
  41319. void mbedtls_ssl_conf_endpoint( mbedtls_ssl_config *conf, int endpoint )
  41320. {
  41321. conf->endpoint = endpoint;
  41322. }
  41323. void mbedtls_ssl_conf_transport( mbedtls_ssl_config *conf, int transport )
  41324. {
  41325. conf->transport = transport;
  41326. }
  41327. #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
  41328. void mbedtls_ssl_conf_dtls_anti_replay( mbedtls_ssl_config *conf, char mode )
  41329. {
  41330. conf->anti_replay = mode;
  41331. }
  41332. #endif
  41333. #if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT)
  41334. void mbedtls_ssl_conf_dtls_badmac_limit( mbedtls_ssl_config *conf, unsigned limit )
  41335. {
  41336. conf->badmac_limit = limit;
  41337. }
  41338. #endif
  41339. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  41340. void mbedtls_ssl_conf_handshake_timeout( mbedtls_ssl_config *conf, uint32_t min, uint32_t max )
  41341. {
  41342. conf->hs_timeout_min = min;
  41343. conf->hs_timeout_max = max;
  41344. }
  41345. #endif
  41346. void mbedtls_ssl_conf_authmode( mbedtls_ssl_config *conf, int authmode )
  41347. {
  41348. conf->authmode = authmode;
  41349. }
  41350. #if defined(MBEDTLS_X509_CRT_PARSE_C)
  41351. void mbedtls_ssl_conf_verify( mbedtls_ssl_config *conf,
  41352. int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *),
  41353. void *p_vrfy )
  41354. {
  41355. conf->f_vrfy = f_vrfy;
  41356. conf->p_vrfy = p_vrfy;
  41357. }
  41358. #endif /* MBEDTLS_X509_CRT_PARSE_C */
  41359. void mbedtls_ssl_conf_rng( mbedtls_ssl_config *conf,
  41360. int (*f_rng)(void *, unsigned char *, size_t),
  41361. void *p_rng )
  41362. {
  41363. conf->f_rng = f_rng;
  41364. conf->p_rng = p_rng;
  41365. }
  41366. void mbedtls_ssl_conf_dbg( mbedtls_ssl_config *conf,
  41367. void (*f_dbg)(void *, int, const char *, int, const char *),
  41368. void *p_dbg )
  41369. {
  41370. conf->f_dbg = f_dbg;
  41371. conf->p_dbg = p_dbg;
  41372. }
  41373. void mbedtls_ssl_set_bio( mbedtls_ssl_context *ssl,
  41374. void *p_bio,
  41375. int (*f_send)(void *, const unsigned char *, size_t),
  41376. int (*f_recv)(void *, unsigned char *, size_t),
  41377. int (*f_recv_timeout)(void *, unsigned char *, size_t, uint32_t) )
  41378. {
  41379. ssl->p_bio = p_bio;
  41380. ssl->f_send = f_send;
  41381. ssl->f_recv = f_recv;
  41382. ssl->f_recv_timeout = f_recv_timeout;
  41383. }
  41384. void mbedtls_ssl_conf_read_timeout( mbedtls_ssl_config *conf, uint32_t timeout )
  41385. {
  41386. conf->read_timeout = timeout;
  41387. }
  41388. void mbedtls_ssl_set_timer_cb( mbedtls_ssl_context *ssl,
  41389. void *p_timer,
  41390. void (*f_set_timer)(void *, uint32_t int_ms, uint32_t fin_ms),
  41391. int (*f_get_timer)(void *) )
  41392. {
  41393. ssl->p_timer = p_timer;
  41394. ssl->f_set_timer = f_set_timer;
  41395. ssl->f_get_timer = f_get_timer;
  41396. /* Make sure we start with no timer running */
  41397. ssl_set_timer( ssl, 0 );
  41398. }
  41399. #if defined(MBEDTLS_SSL_SRV_C)
  41400. void mbedtls_ssl_conf_session_cache( mbedtls_ssl_config *conf,
  41401. void *p_cache,
  41402. int (*f_get_cache)(void *, mbedtls_ssl_session *),
  41403. int (*f_set_cache)(void *, const mbedtls_ssl_session *) )
  41404. {
  41405. conf->p_cache = p_cache;
  41406. conf->f_get_cache = f_get_cache;
  41407. conf->f_set_cache = f_set_cache;
  41408. }
  41409. #endif /* MBEDTLS_SSL_SRV_C */
  41410. #if defined(MBEDTLS_SSL_CLI_C)
  41411. int mbedtls_ssl_set_session( mbedtls_ssl_context *ssl, const mbedtls_ssl_session *session )
  41412. {
  41413. int ret;
  41414. if( ssl == NULL ||
  41415. session == NULL ||
  41416. ssl->session_negotiate == NULL ||
  41417. ssl->conf->endpoint != MBEDTLS_SSL_IS_CLIENT )
  41418. {
  41419. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  41420. }
  41421. if( ( ret = ssl_session_copy( ssl->session_negotiate, session ) ) != 0 )
  41422. return( ret );
  41423. ssl->handshake->resume = 1;
  41424. return( 0 );
  41425. }
  41426. #endif /* MBEDTLS_SSL_CLI_C */
  41427. void mbedtls_ssl_conf_ciphersuites( mbedtls_ssl_config *conf,
  41428. const int *ciphersuites )
  41429. {
  41430. conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_0] = ciphersuites;
  41431. conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_1] = ciphersuites;
  41432. conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_2] = ciphersuites;
  41433. conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_3] = ciphersuites;
  41434. }
  41435. void mbedtls_ssl_conf_ciphersuites_for_version( mbedtls_ssl_config *conf,
  41436. const int *ciphersuites,
  41437. int major, int minor )
  41438. {
  41439. if( major != MBEDTLS_SSL_MAJOR_VERSION_3 )
  41440. return;
  41441. if( minor < MBEDTLS_SSL_MINOR_VERSION_0 || minor > MBEDTLS_SSL_MINOR_VERSION_3 )
  41442. return;
  41443. conf->ciphersuite_list[minor] = ciphersuites;
  41444. }
  41445. #if defined(MBEDTLS_X509_CRT_PARSE_C)
  41446. void mbedtls_ssl_conf_cert_profile( mbedtls_ssl_config *conf,
  41447. const mbedtls_x509_crt_profile *profile )
  41448. {
  41449. conf->cert_profile = profile;
  41450. }
  41451. /* Append a new keycert entry to a (possibly empty) list */
  41452. static int ssl_append_key_cert( mbedtls_ssl_key_cert **head,
  41453. mbedtls_x509_crt *cert,
  41454. mbedtls_pk_context *key )
  41455. {
  41456. mbedtls_ssl_key_cert *new;
  41457. new = mbedtls_calloc( 1, sizeof( mbedtls_ssl_key_cert ) );
  41458. if( new == NULL )
  41459. return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
  41460. new->cert = cert;
  41461. new->key = key;
  41462. new->next = NULL;
  41463. /* Update head is the list was null, else add to the end */
  41464. if( *head == NULL )
  41465. {
  41466. *head = new;
  41467. }
  41468. else
  41469. {
  41470. mbedtls_ssl_key_cert *cur = *head;
  41471. while( cur->next != NULL )
  41472. cur = cur->next;
  41473. cur->next = new;
  41474. }
  41475. return( 0 );
  41476. }
  41477. int mbedtls_ssl_conf_own_cert( mbedtls_ssl_config *conf,
  41478. mbedtls_x509_crt *own_cert,
  41479. mbedtls_pk_context *pk_key )
  41480. {
  41481. return( ssl_append_key_cert( &conf->key_cert, own_cert, pk_key ) );
  41482. }
  41483. void mbedtls_ssl_conf_ca_chain( mbedtls_ssl_config *conf,
  41484. mbedtls_x509_crt *ca_chain,
  41485. mbedtls_x509_crl *ca_crl )
  41486. {
  41487. conf->ca_chain = ca_chain;
  41488. conf->ca_crl = ca_crl;
  41489. }
  41490. #endif /* MBEDTLS_X509_CRT_PARSE_C */
  41491. #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
  41492. int mbedtls_ssl_set_hs_own_cert( mbedtls_ssl_context *ssl,
  41493. mbedtls_x509_crt *own_cert,
  41494. mbedtls_pk_context *pk_key )
  41495. {
  41496. return( ssl_append_key_cert( &ssl->handshake->sni_key_cert,
  41497. own_cert, pk_key ) );
  41498. }
  41499. void mbedtls_ssl_set_hs_ca_chain( mbedtls_ssl_context *ssl,
  41500. mbedtls_x509_crt *ca_chain,
  41501. mbedtls_x509_crl *ca_crl )
  41502. {
  41503. ssl->handshake->sni_ca_chain = ca_chain;
  41504. ssl->handshake->sni_ca_crl = ca_crl;
  41505. }
  41506. void mbedtls_ssl_set_hs_authmode( mbedtls_ssl_context *ssl,
  41507. int authmode )
  41508. {
  41509. ssl->handshake->sni_authmode = authmode;
  41510. }
  41511. #endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
  41512. #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
  41513. /*
  41514. * Set EC J-PAKE password for current handshake
  41515. */
  41516. int mbedtls_ssl_set_hs_ecjpake_password( mbedtls_ssl_context *ssl,
  41517. const unsigned char *pw,
  41518. size_t pw_len )
  41519. {
  41520. mbedtls_ecjpake_role role;
  41521. if( ssl->handshake == NULL && ssl->conf == NULL )
  41522. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  41523. if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
  41524. role = MBEDTLS_ECJPAKE_SERVER;
  41525. else
  41526. role = MBEDTLS_ECJPAKE_CLIENT;
  41527. return( mbedtls_ecjpake_setup( &ssl->handshake->ecjpake_ctx,
  41528. role,
  41529. MBEDTLS_MD_SHA256,
  41530. MBEDTLS_ECP_DP_SECP256R1,
  41531. pw, pw_len ) );
  41532. }
  41533. #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
  41534. #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
  41535. int mbedtls_ssl_conf_psk( mbedtls_ssl_config *conf,
  41536. const unsigned char *psk, size_t psk_len,
  41537. const unsigned char *psk_identity, size_t psk_identity_len )
  41538. {
  41539. if( psk == NULL || psk_identity == NULL )
  41540. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  41541. if( psk_len > MBEDTLS_PSK_MAX_LEN )
  41542. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  41543. /* Identity len will be encoded on two bytes */
  41544. if( ( psk_identity_len >> 16 ) != 0 ||
  41545. psk_identity_len > MBEDTLS_SSL_MAX_CONTENT_LEN )
  41546. {
  41547. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  41548. }
  41549. if( conf->psk != NULL || conf->psk_identity != NULL )
  41550. {
  41551. mbedtls_free( conf->psk );
  41552. mbedtls_free( conf->psk_identity );
  41553. conf->psk = NULL;
  41554. conf->psk_identity = NULL;
  41555. }
  41556. if( ( conf->psk = mbedtls_calloc( 1, psk_len ) ) == NULL ||
  41557. ( conf->psk_identity = mbedtls_calloc( 1, psk_identity_len ) ) == NULL )
  41558. {
  41559. mbedtls_free( conf->psk );
  41560. mbedtls_free( conf->psk_identity );
  41561. conf->psk = NULL;
  41562. conf->psk_identity = NULL;
  41563. return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
  41564. }
  41565. conf->psk_len = psk_len;
  41566. conf->psk_identity_len = psk_identity_len;
  41567. memcpy( conf->psk, psk, conf->psk_len );
  41568. memcpy( conf->psk_identity, psk_identity, conf->psk_identity_len );
  41569. return( 0 );
  41570. }
  41571. int mbedtls_ssl_set_hs_psk( mbedtls_ssl_context *ssl,
  41572. const unsigned char *psk, size_t psk_len )
  41573. {
  41574. if( psk == NULL || ssl->handshake == NULL )
  41575. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  41576. if( psk_len > MBEDTLS_PSK_MAX_LEN )
  41577. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  41578. if( ssl->handshake->psk != NULL )
  41579. mbedtls_free( ssl->handshake->psk );
  41580. if( ( ssl->handshake->psk = mbedtls_calloc( 1, psk_len ) ) == NULL )
  41581. return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
  41582. ssl->handshake->psk_len = psk_len;
  41583. memcpy( ssl->handshake->psk, psk, ssl->handshake->psk_len );
  41584. return( 0 );
  41585. }
  41586. void mbedtls_ssl_conf_psk_cb( mbedtls_ssl_config *conf,
  41587. int (*f_psk)(void *, mbedtls_ssl_context *, const unsigned char *,
  41588. size_t),
  41589. void *p_psk )
  41590. {
  41591. conf->f_psk = f_psk;
  41592. conf->p_psk = p_psk;
  41593. }
  41594. #endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */
  41595. #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C)
  41596. int mbedtls_ssl_conf_dh_param( mbedtls_ssl_config *conf, const char *dhm_P, const char *dhm_G )
  41597. {
  41598. int ret;
  41599. if( ( ret = mbedtls_mpi_read_string( &conf->dhm_P, 16, dhm_P ) ) != 0 ||
  41600. ( ret = mbedtls_mpi_read_string( &conf->dhm_G, 16, dhm_G ) ) != 0 )
  41601. {
  41602. mbedtls_mpi_free( &conf->dhm_P );
  41603. mbedtls_mpi_free( &conf->dhm_G );
  41604. return( ret );
  41605. }
  41606. return( 0 );
  41607. }
  41608. int mbedtls_ssl_conf_dh_param_ctx( mbedtls_ssl_config *conf, mbedtls_dhm_context *dhm_ctx )
  41609. {
  41610. int ret;
  41611. if( ( ret = mbedtls_mpi_copy( &conf->dhm_P, &dhm_ctx->P ) ) != 0 ||
  41612. ( ret = mbedtls_mpi_copy( &conf->dhm_G, &dhm_ctx->G ) ) != 0 )
  41613. {
  41614. mbedtls_mpi_free( &conf->dhm_P );
  41615. mbedtls_mpi_free( &conf->dhm_G );
  41616. return( ret );
  41617. }
  41618. return( 0 );
  41619. }
  41620. #endif /* MBEDTLS_DHM_C && MBEDTLS_SSL_SRV_C */
  41621. #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_CLI_C)
  41622. /*
  41623. * Set the minimum length for Diffie-Hellman parameters
  41624. */
  41625. void mbedtls_ssl_conf_dhm_min_bitlen( mbedtls_ssl_config *conf,
  41626. unsigned int bitlen )
  41627. {
  41628. conf->dhm_min_bitlen = bitlen;
  41629. }
  41630. #endif /* MBEDTLS_DHM_C && MBEDTLS_SSL_CLI_C */
  41631. #if defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)
  41632. /*
  41633. * Set allowed/preferred hashes for handshake signatures
  41634. */
  41635. void mbedtls_ssl_conf_sig_hashes( mbedtls_ssl_config *conf,
  41636. const int *hashes )
  41637. {
  41638. conf->sig_hashes = hashes;
  41639. }
  41640. #endif
  41641. #if defined(MBEDTLS_ECP_C)
  41642. /*
  41643. * Set the allowed elliptic curves
  41644. */
  41645. void mbedtls_ssl_conf_curves( mbedtls_ssl_config *conf,
  41646. const mbedtls_ecp_group_id *curve_list )
  41647. {
  41648. conf->curve_list = curve_list;
  41649. }
  41650. #endif
  41651. #if defined(MBEDTLS_X509_CRT_PARSE_C)
  41652. int mbedtls_ssl_set_hostname( mbedtls_ssl_context *ssl, const char *hostname )
  41653. {
  41654. size_t hostname_len;
  41655. if( hostname == NULL )
  41656. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  41657. hostname_len = strlen( hostname );
  41658. if( hostname_len + 1 == 0 )
  41659. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  41660. if( hostname_len > MBEDTLS_SSL_MAX_HOST_NAME_LEN )
  41661. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  41662. ssl->hostname = mbedtls_calloc( 1, hostname_len + 1 );
  41663. if( ssl->hostname == NULL )
  41664. return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
  41665. memcpy( ssl->hostname, hostname, hostname_len );
  41666. ssl->hostname[hostname_len] = '\0';
  41667. return( 0 );
  41668. }
  41669. #endif
  41670. #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
  41671. void mbedtls_ssl_conf_sni( mbedtls_ssl_config *conf,
  41672. int (*f_sni)(void *, mbedtls_ssl_context *,
  41673. const unsigned char *, size_t),
  41674. void *p_sni )
  41675. {
  41676. conf->f_sni = f_sni;
  41677. conf->p_sni = p_sni;
  41678. }
  41679. #endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
  41680. #if defined(MBEDTLS_SSL_ALPN)
  41681. int mbedtls_ssl_conf_alpn_protocols( mbedtls_ssl_config *conf, const char **protos )
  41682. {
  41683. size_t cur_len, tot_len;
  41684. const char **p;
  41685. /*
  41686. * "Empty strings MUST NOT be included and byte strings MUST NOT be
  41687. * truncated". Check lengths now rather than later.
  41688. */
  41689. tot_len = 0;
  41690. for( p = protos; *p != NULL; p++ )
  41691. {
  41692. cur_len = strlen( *p );
  41693. tot_len += cur_len;
  41694. if( cur_len == 0 || cur_len > 255 || tot_len > 65535 )
  41695. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  41696. }
  41697. conf->alpn_list = protos;
  41698. return( 0 );
  41699. }
  41700. const char *mbedtls_ssl_get_alpn_protocol( const mbedtls_ssl_context *ssl )
  41701. {
  41702. return( ssl->alpn_chosen );
  41703. }
  41704. #endif /* MBEDTLS_SSL_ALPN */
  41705. void mbedtls_ssl_conf_max_version( mbedtls_ssl_config *conf, int major, int minor )
  41706. {
  41707. conf->max_major_ver = major;
  41708. conf->max_minor_ver = minor;
  41709. }
  41710. void mbedtls_ssl_conf_min_version( mbedtls_ssl_config *conf, int major, int minor )
  41711. {
  41712. conf->min_major_ver = major;
  41713. conf->min_minor_ver = minor;
  41714. }
  41715. #if defined(MBEDTLS_SSL_FALLBACK_SCSV) && defined(MBEDTLS_SSL_CLI_C)
  41716. void mbedtls_ssl_conf_fallback( mbedtls_ssl_config *conf, char fallback )
  41717. {
  41718. conf->fallback = fallback;
  41719. }
  41720. #endif
  41721. #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
  41722. void mbedtls_ssl_conf_encrypt_then_mac( mbedtls_ssl_config *conf, char etm )
  41723. {
  41724. conf->encrypt_then_mac = etm;
  41725. }
  41726. #endif
  41727. #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
  41728. void mbedtls_ssl_conf_extended_master_secret( mbedtls_ssl_config *conf, char ems )
  41729. {
  41730. conf->extended_ms = ems;
  41731. }
  41732. #endif
  41733. #if defined(MBEDTLS_ARC4_C)
  41734. void mbedtls_ssl_conf_arc4_support( mbedtls_ssl_config *conf, char arc4 )
  41735. {
  41736. conf->arc4_disabled = arc4;
  41737. }
  41738. #endif
  41739. #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
  41740. int mbedtls_ssl_conf_max_frag_len( mbedtls_ssl_config *conf, unsigned char mfl_code )
  41741. {
  41742. if( mfl_code >= MBEDTLS_SSL_MAX_FRAG_LEN_INVALID ||
  41743. mfl_code_to_length[mfl_code] > MBEDTLS_SSL_MAX_CONTENT_LEN )
  41744. {
  41745. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  41746. }
  41747. conf->mfl_code = mfl_code;
  41748. return( 0 );
  41749. }
  41750. #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
  41751. #if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
  41752. void mbedtls_ssl_conf_truncated_hmac( mbedtls_ssl_config *conf, int truncate )
  41753. {
  41754. conf->trunc_hmac = truncate;
  41755. }
  41756. #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
  41757. #if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING)
  41758. void mbedtls_ssl_conf_cbc_record_splitting( mbedtls_ssl_config *conf, char split )
  41759. {
  41760. conf->cbc_record_splitting = split;
  41761. }
  41762. #endif
  41763. void mbedtls_ssl_conf_legacy_renegotiation( mbedtls_ssl_config *conf, int allow_legacy )
  41764. {
  41765. conf->allow_legacy_renegotiation = allow_legacy;
  41766. }
  41767. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  41768. void mbedtls_ssl_conf_renegotiation( mbedtls_ssl_config *conf, int renegotiation )
  41769. {
  41770. conf->disable_renegotiation = renegotiation;
  41771. }
  41772. void mbedtls_ssl_conf_renegotiation_enforced( mbedtls_ssl_config *conf, int max_records )
  41773. {
  41774. conf->renego_max_records = max_records;
  41775. }
  41776. void mbedtls_ssl_conf_renegotiation_period( mbedtls_ssl_config *conf,
  41777. const unsigned char period[8] )
  41778. {
  41779. memcpy( conf->renego_period, period, 8 );
  41780. }
  41781. #endif /* MBEDTLS_SSL_RENEGOTIATION */
  41782. #if defined(MBEDTLS_SSL_SESSION_TICKETS)
  41783. #if defined(MBEDTLS_SSL_CLI_C)
  41784. void mbedtls_ssl_conf_session_tickets( mbedtls_ssl_config *conf, int use_tickets )
  41785. {
  41786. conf->session_tickets = use_tickets;
  41787. }
  41788. #endif
  41789. #if defined(MBEDTLS_SSL_SRV_C)
  41790. void mbedtls_ssl_conf_session_tickets_cb( mbedtls_ssl_config *conf,
  41791. mbedtls_ssl_ticket_write_t *f_ticket_write,
  41792. mbedtls_ssl_ticket_parse_t *f_ticket_parse,
  41793. void *p_ticket )
  41794. {
  41795. conf->f_ticket_write = f_ticket_write;
  41796. conf->f_ticket_parse = f_ticket_parse;
  41797. conf->p_ticket = p_ticket;
  41798. }
  41799. #endif
  41800. #endif /* MBEDTLS_SSL_SESSION_TICKETS */
  41801. #if defined(MBEDTLS_SSL_EXPORT_KEYS)
  41802. void mbedtls_ssl_conf_export_keys_cb( mbedtls_ssl_config *conf,
  41803. mbedtls_ssl_export_keys_t *f_export_keys,
  41804. void *p_export_keys )
  41805. {
  41806. conf->f_export_keys = f_export_keys;
  41807. conf->p_export_keys = p_export_keys;
  41808. }
  41809. #endif
  41810. /*
  41811. * SSL get accessors
  41812. */
  41813. size_t mbedtls_ssl_get_bytes_avail( const mbedtls_ssl_context *ssl )
  41814. {
  41815. return( ssl->in_offt == NULL ? 0 : ssl->in_msglen );
  41816. }
  41817. uint32_t mbedtls_ssl_get_verify_result( const mbedtls_ssl_context *ssl )
  41818. {
  41819. if( ssl->session != NULL )
  41820. return( ssl->session->verify_result );
  41821. if( ssl->session_negotiate != NULL )
  41822. return( ssl->session_negotiate->verify_result );
  41823. return( 0xFFFFFFFF );
  41824. }
  41825. const char *mbedtls_ssl_get_ciphersuite( const mbedtls_ssl_context *ssl )
  41826. {
  41827. if( ssl == NULL || ssl->session == NULL )
  41828. return( NULL );
  41829. return mbedtls_ssl_get_ciphersuite_name( ssl->session->ciphersuite );
  41830. }
  41831. const char *mbedtls_ssl_get_version( const mbedtls_ssl_context *ssl )
  41832. {
  41833. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  41834. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
  41835. {
  41836. switch( ssl->minor_ver )
  41837. {
  41838. case MBEDTLS_SSL_MINOR_VERSION_2:
  41839. return( "DTLSv1.0" );
  41840. case MBEDTLS_SSL_MINOR_VERSION_3:
  41841. return( "DTLSv1.2" );
  41842. default:
  41843. return( "unknown (DTLS)" );
  41844. }
  41845. }
  41846. #endif
  41847. switch( ssl->minor_ver )
  41848. {
  41849. case MBEDTLS_SSL_MINOR_VERSION_0:
  41850. return( "SSLv3.0" );
  41851. case MBEDTLS_SSL_MINOR_VERSION_1:
  41852. return( "TLSv1.0" );
  41853. case MBEDTLS_SSL_MINOR_VERSION_2:
  41854. return( "TLSv1.1" );
  41855. case MBEDTLS_SSL_MINOR_VERSION_3:
  41856. return( "TLSv1.2" );
  41857. default:
  41858. return( "unknown" );
  41859. }
  41860. }
  41861. int mbedtls_ssl_get_record_expansion( const mbedtls_ssl_context *ssl )
  41862. {
  41863. size_t transform_expansion;
  41864. const mbedtls_ssl_transform *transform = ssl->transform_out;
  41865. #if defined(MBEDTLS_ZLIB_SUPPORT)
  41866. if( ssl->session_out->compression != MBEDTLS_SSL_COMPRESS_NULL )
  41867. return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
  41868. #endif
  41869. if( transform == NULL )
  41870. return( (int) mbedtls_ssl_hdr_len( ssl ) );
  41871. switch( mbedtls_cipher_get_cipher_mode( &transform->cipher_ctx_enc ) )
  41872. {
  41873. case MBEDTLS_MODE_GCM:
  41874. case MBEDTLS_MODE_CCM:
  41875. case MBEDTLS_MODE_STREAM:
  41876. transform_expansion = transform->minlen;
  41877. break;
  41878. case MBEDTLS_MODE_CBC:
  41879. transform_expansion = transform->maclen
  41880. + mbedtls_cipher_get_block_size( &transform->cipher_ctx_enc );
  41881. break;
  41882. default:
  41883. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  41884. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  41885. }
  41886. return( (int)( mbedtls_ssl_hdr_len( ssl ) + transform_expansion ) );
  41887. }
  41888. #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
  41889. size_t mbedtls_ssl_get_max_frag_len( const mbedtls_ssl_context *ssl )
  41890. {
  41891. size_t max_len;
  41892. /*
  41893. * Assume mfl_code is correct since it was checked when set
  41894. */
  41895. max_len = mfl_code_to_length[ssl->conf->mfl_code];
  41896. /*
  41897. * Check if a smaller max length was negotiated
  41898. */
  41899. if( ssl->session_out != NULL &&
  41900. mfl_code_to_length[ssl->session_out->mfl_code] < max_len )
  41901. {
  41902. max_len = mfl_code_to_length[ssl->session_out->mfl_code];
  41903. }
  41904. return max_len;
  41905. }
  41906. #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
  41907. #if defined(MBEDTLS_X509_CRT_PARSE_C)
  41908. const mbedtls_x509_crt *mbedtls_ssl_get_peer_cert( const mbedtls_ssl_context *ssl )
  41909. {
  41910. if( ssl == NULL || ssl->session == NULL )
  41911. return( NULL );
  41912. return( ssl->session->peer_cert );
  41913. }
  41914. #endif /* MBEDTLS_X509_CRT_PARSE_C */
  41915. #if defined(MBEDTLS_SSL_CLI_C)
  41916. int mbedtls_ssl_get_session( const mbedtls_ssl_context *ssl, mbedtls_ssl_session *dst )
  41917. {
  41918. if( ssl == NULL ||
  41919. dst == NULL ||
  41920. ssl->session == NULL ||
  41921. ssl->conf->endpoint != MBEDTLS_SSL_IS_CLIENT )
  41922. {
  41923. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  41924. }
  41925. return( ssl_session_copy( dst, ssl->session ) );
  41926. }
  41927. #endif /* MBEDTLS_SSL_CLI_C */
  41928. /*
  41929. * Perform a single step of the SSL handshake
  41930. */
  41931. int mbedtls_ssl_handshake_step( mbedtls_ssl_context *ssl )
  41932. {
  41933. int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
  41934. if( ssl == NULL || ssl->conf == NULL )
  41935. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  41936. #if defined(MBEDTLS_SSL_CLI_C)
  41937. if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )
  41938. ret = mbedtls_ssl_handshake_client_step( ssl );
  41939. #endif
  41940. #if defined(MBEDTLS_SSL_SRV_C)
  41941. if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
  41942. ret = mbedtls_ssl_handshake_server_step( ssl );
  41943. #endif
  41944. return( ret );
  41945. }
  41946. /*
  41947. * Perform the SSL handshake
  41948. */
  41949. int mbedtls_ssl_handshake( mbedtls_ssl_context *ssl )
  41950. {
  41951. int ret = 0;
  41952. if( ssl == NULL || ssl->conf == NULL )
  41953. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  41954. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> handshake" ) );
  41955. while( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER )
  41956. {
  41957. ret = mbedtls_ssl_handshake_step( ssl );
  41958. if( ret != 0 )
  41959. break;
  41960. }
  41961. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= handshake" ) );
  41962. return( ret );
  41963. }
  41964. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  41965. #if defined(MBEDTLS_SSL_SRV_C)
  41966. /*
  41967. * Write HelloRequest to request renegotiation on server
  41968. */
  41969. static int ssl_write_hello_request( mbedtls_ssl_context *ssl )
  41970. {
  41971. int ret;
  41972. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write hello request" ) );
  41973. ssl->out_msglen = 4;
  41974. ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
  41975. ssl->out_msg[0] = MBEDTLS_SSL_HS_HELLO_REQUEST;
  41976. if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 )
  41977. {
  41978. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret );
  41979. return( ret );
  41980. }
  41981. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write hello request" ) );
  41982. return( 0 );
  41983. }
  41984. #endif /* MBEDTLS_SSL_SRV_C */
  41985. /*
  41986. * Actually renegotiate current connection, triggered by either:
  41987. * - any side: calling mbedtls_ssl_renegotiate(),
  41988. * - client: receiving a HelloRequest during mbedtls_ssl_read(),
  41989. * - server: receiving any handshake message on server during mbedtls_ssl_read() after
  41990. * the initial handshake is completed.
  41991. * If the handshake doesn't complete due to waiting for I/O, it will continue
  41992. * during the next calls to mbedtls_ssl_renegotiate() or mbedtls_ssl_read() respectively.
  41993. */
  41994. static int ssl_start_renegotiation( mbedtls_ssl_context *ssl )
  41995. {
  41996. int ret;
  41997. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> renegotiate" ) );
  41998. if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
  41999. return( ret );
  42000. /* RFC 6347 4.2.2: "[...] the HelloRequest will have message_seq = 0 and
  42001. * the ServerHello will have message_seq = 1" */
  42002. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  42003. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
  42004. ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_PENDING )
  42005. {
  42006. if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
  42007. ssl->handshake->out_msg_seq = 1;
  42008. else
  42009. ssl->handshake->in_msg_seq = 1;
  42010. }
  42011. #endif
  42012. ssl->state = MBEDTLS_SSL_HELLO_REQUEST;
  42013. ssl->renego_status = MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS;
  42014. if( ( ret = mbedtls_ssl_handshake( ssl ) ) != 0 )
  42015. {
  42016. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_handshake", ret );
  42017. return( ret );
  42018. }
  42019. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= renegotiate" ) );
  42020. return( 0 );
  42021. }
  42022. /*
  42023. * Renegotiate current connection on client,
  42024. * or request renegotiation on server
  42025. */
  42026. int mbedtls_ssl_renegotiate( mbedtls_ssl_context *ssl )
  42027. {
  42028. int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
  42029. if( ssl == NULL || ssl->conf == NULL )
  42030. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  42031. #if defined(MBEDTLS_SSL_SRV_C)
  42032. /* On server, just send the request */
  42033. if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
  42034. {
  42035. if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER )
  42036. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  42037. ssl->renego_status = MBEDTLS_SSL_RENEGOTIATION_PENDING;
  42038. /* Did we already try/start sending HelloRequest? */
  42039. if( ssl->out_left != 0 )
  42040. return( mbedtls_ssl_flush_output( ssl ) );
  42041. return( ssl_write_hello_request( ssl ) );
  42042. }
  42043. #endif /* MBEDTLS_SSL_SRV_C */
  42044. #if defined(MBEDTLS_SSL_CLI_C)
  42045. /*
  42046. * On client, either start the renegotiation process or,
  42047. * if already in progress, continue the handshake
  42048. */
  42049. if( ssl->renego_status != MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )
  42050. {
  42051. if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER )
  42052. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  42053. if( ( ret = ssl_start_renegotiation( ssl ) ) != 0 )
  42054. {
  42055. MBEDTLS_SSL_DEBUG_RET( 1, "ssl_start_renegotiation", ret );
  42056. return( ret );
  42057. }
  42058. }
  42059. else
  42060. {
  42061. if( ( ret = mbedtls_ssl_handshake( ssl ) ) != 0 )
  42062. {
  42063. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_handshake", ret );
  42064. return( ret );
  42065. }
  42066. }
  42067. #endif /* MBEDTLS_SSL_CLI_C */
  42068. return( ret );
  42069. }
  42070. /*
  42071. * Check record counters and renegotiate if they're above the limit.
  42072. */
  42073. static int ssl_check_ctr_renegotiate( mbedtls_ssl_context *ssl )
  42074. {
  42075. if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER ||
  42076. ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_PENDING ||
  42077. ssl->conf->disable_renegotiation == MBEDTLS_SSL_RENEGOTIATION_DISABLED )
  42078. {
  42079. return( 0 );
  42080. }
  42081. if( memcmp( ssl->in_ctr, ssl->conf->renego_period, 8 ) <= 0 &&
  42082. memcmp( ssl->out_ctr, ssl->conf->renego_period, 8 ) <= 0 )
  42083. {
  42084. return( 0 );
  42085. }
  42086. MBEDTLS_SSL_DEBUG_MSG( 1, ( "record counter limit reached: renegotiate" ) );
  42087. return( mbedtls_ssl_renegotiate( ssl ) );
  42088. }
  42089. #endif /* MBEDTLS_SSL_RENEGOTIATION */
  42090. /*
  42091. * Receive application data decrypted from the SSL layer
  42092. */
  42093. int mbedtls_ssl_read( mbedtls_ssl_context *ssl, unsigned char *buf, size_t len )
  42094. {
  42095. int ret, record_read = 0;
  42096. size_t n;
  42097. if( ssl == NULL || ssl->conf == NULL )
  42098. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  42099. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> read" ) );
  42100. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  42101. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
  42102. {
  42103. if( ( ret = mbedtls_ssl_flush_output( ssl ) ) != 0 )
  42104. return( ret );
  42105. if( ssl->handshake != NULL &&
  42106. ssl->handshake->retransmit_state == MBEDTLS_SSL_RETRANS_SENDING )
  42107. {
  42108. if( ( ret = mbedtls_ssl_resend( ssl ) ) != 0 )
  42109. return( ret );
  42110. }
  42111. }
  42112. #endif
  42113. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  42114. if( ( ret = ssl_check_ctr_renegotiate( ssl ) ) != 0 )
  42115. {
  42116. MBEDTLS_SSL_DEBUG_RET( 1, "ssl_check_ctr_renegotiate", ret );
  42117. return( ret );
  42118. }
  42119. #endif
  42120. if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER )
  42121. {
  42122. ret = mbedtls_ssl_handshake( ssl );
  42123. if( ret == MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO )
  42124. {
  42125. record_read = 1;
  42126. }
  42127. else if( ret != 0 )
  42128. {
  42129. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_handshake", ret );
  42130. return( ret );
  42131. }
  42132. }
  42133. if( ssl->in_offt == NULL )
  42134. {
  42135. /* Start timer if not already running */
  42136. if( ssl->f_get_timer != NULL &&
  42137. ssl->f_get_timer( ssl->p_timer ) == -1 )
  42138. {
  42139. ssl_set_timer( ssl, ssl->conf->read_timeout );
  42140. }
  42141. if( ! record_read )
  42142. {
  42143. if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 )
  42144. {
  42145. if( ret == MBEDTLS_ERR_SSL_CONN_EOF )
  42146. return( 0 );
  42147. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
  42148. return( ret );
  42149. }
  42150. }
  42151. if( ssl->in_msglen == 0 &&
  42152. ssl->in_msgtype == MBEDTLS_SSL_MSG_APPLICATION_DATA )
  42153. {
  42154. /*
  42155. * OpenSSL sends empty messages to randomize the IV
  42156. */
  42157. if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 )
  42158. {
  42159. if( ret == MBEDTLS_ERR_SSL_CONN_EOF )
  42160. return( 0 );
  42161. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
  42162. return( ret );
  42163. }
  42164. }
  42165. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  42166. if( ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE )
  42167. {
  42168. MBEDTLS_SSL_DEBUG_MSG( 1, ( "received handshake message" ) );
  42169. #if defined(MBEDTLS_SSL_CLI_C)
  42170. if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT &&
  42171. ( ssl->in_msg[0] != MBEDTLS_SSL_HS_HELLO_REQUEST ||
  42172. ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) ) )
  42173. {
  42174. MBEDTLS_SSL_DEBUG_MSG( 1, ( "handshake received (not HelloRequest)" ) );
  42175. /* With DTLS, drop the packet (probably from last handshake) */
  42176. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  42177. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
  42178. return( MBEDTLS_ERR_SSL_WANT_READ );
  42179. #endif
  42180. return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
  42181. }
  42182. if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER &&
  42183. ssl->in_msg[0] != MBEDTLS_SSL_HS_CLIENT_HELLO )
  42184. {
  42185. MBEDTLS_SSL_DEBUG_MSG( 1, ( "handshake received (not ClientHello)" ) );
  42186. /* With DTLS, drop the packet (probably from last handshake) */
  42187. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  42188. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
  42189. return( MBEDTLS_ERR_SSL_WANT_READ );
  42190. #endif
  42191. return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
  42192. }
  42193. #endif
  42194. if( ssl->conf->disable_renegotiation == MBEDTLS_SSL_RENEGOTIATION_DISABLED ||
  42195. ( ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
  42196. ssl->conf->allow_legacy_renegotiation ==
  42197. MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION ) )
  42198. {
  42199. MBEDTLS_SSL_DEBUG_MSG( 3, ( "refusing renegotiation, sending alert" ) );
  42200. #if defined(MBEDTLS_SSL_PROTO_SSL3)
  42201. if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
  42202. {
  42203. /*
  42204. * SSLv3 does not have a "no_renegotiation" alert
  42205. */
  42206. if( ( ret = mbedtls_ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
  42207. return( ret );
  42208. }
  42209. else
  42210. #endif /* MBEDTLS_SSL_PROTO_SSL3 */
  42211. #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
  42212. defined(MBEDTLS_SSL_PROTO_TLS1_2)
  42213. if( ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_1 )
  42214. {
  42215. if( ( ret = mbedtls_ssl_send_alert_message( ssl,
  42216. MBEDTLS_SSL_ALERT_LEVEL_WARNING,
  42217. MBEDTLS_SSL_ALERT_MSG_NO_RENEGOTIATION ) ) != 0 )
  42218. {
  42219. return( ret );
  42220. }
  42221. }
  42222. else
  42223. #endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 ||
  42224. MBEDTLS_SSL_PROTO_TLS1_2 */
  42225. {
  42226. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  42227. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  42228. }
  42229. }
  42230. else
  42231. {
  42232. /* DTLS clients need to know renego is server-initiated */
  42233. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  42234. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
  42235. ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )
  42236. {
  42237. ssl->renego_status = MBEDTLS_SSL_RENEGOTIATION_PENDING;
  42238. }
  42239. #endif
  42240. ret = ssl_start_renegotiation( ssl );
  42241. if( ret == MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO )
  42242. {
  42243. record_read = 1;
  42244. }
  42245. else if( ret != 0 )
  42246. {
  42247. MBEDTLS_SSL_DEBUG_RET( 1, "ssl_start_renegotiation", ret );
  42248. return( ret );
  42249. }
  42250. }
  42251. /* If a non-handshake record was read during renego, fallthrough,
  42252. * else tell the user they should call mbedtls_ssl_read() again */
  42253. if( ! record_read )
  42254. return( MBEDTLS_ERR_SSL_WANT_READ );
  42255. }
  42256. else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_PENDING )
  42257. {
  42258. if( ssl->conf->renego_max_records >= 0 )
  42259. {
  42260. if( ++ssl->renego_records_seen > ssl->conf->renego_max_records )
  42261. {
  42262. MBEDTLS_SSL_DEBUG_MSG( 1, ( "renegotiation requested, "
  42263. "but not honored by client" ) );
  42264. return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
  42265. }
  42266. }
  42267. }
  42268. #endif /* MBEDTLS_SSL_RENEGOTIATION */
  42269. /* Fatal and closure alerts handled by mbedtls_ssl_read_record() */
  42270. if( ssl->in_msgtype == MBEDTLS_SSL_MSG_ALERT )
  42271. {
  42272. MBEDTLS_SSL_DEBUG_MSG( 2, ( "ignoring non-fatal non-closure alert" ) );
  42273. return( MBEDTLS_ERR_SSL_WANT_READ );
  42274. }
  42275. if( ssl->in_msgtype != MBEDTLS_SSL_MSG_APPLICATION_DATA )
  42276. {
  42277. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad application data message" ) );
  42278. return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
  42279. }
  42280. ssl->in_offt = ssl->in_msg;
  42281. /* We're going to return something now, cancel timer,
  42282. * except if handshake (renegotiation) is in progress */
  42283. if( ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER )
  42284. ssl_set_timer( ssl, 0 );
  42285. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  42286. /* If we requested renego but received AppData, resend HelloRequest.
  42287. * Do it now, after setting in_offt, to avoid taking this branch
  42288. * again if ssl_write_hello_request() returns WANT_WRITE */
  42289. #if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_RENEGOTIATION)
  42290. if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER &&
  42291. ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_PENDING )
  42292. {
  42293. if( ( ret = ssl_resend_hello_request( ssl ) ) != 0 )
  42294. {
  42295. MBEDTLS_SSL_DEBUG_RET( 1, "ssl_resend_hello_request", ret );
  42296. return( ret );
  42297. }
  42298. }
  42299. #endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_RENEGOTIATION */
  42300. #endif
  42301. }
  42302. n = ( len < ssl->in_msglen )
  42303. ? len : ssl->in_msglen;
  42304. memcpy( buf, ssl->in_offt, n );
  42305. ssl->in_msglen -= n;
  42306. if( ssl->in_msglen == 0 )
  42307. /* all bytes consumed */
  42308. ssl->in_offt = NULL;
  42309. else
  42310. /* more data available */
  42311. ssl->in_offt += n;
  42312. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= read" ) );
  42313. return( (int) n );
  42314. }
  42315. /*
  42316. * Send application data to be encrypted by the SSL layer,
  42317. * taking care of max fragment length and buffer size
  42318. */
  42319. static int ssl_write_real( mbedtls_ssl_context *ssl,
  42320. const unsigned char *buf, size_t len )
  42321. {
  42322. int ret;
  42323. #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
  42324. size_t max_len = mbedtls_ssl_get_max_frag_len( ssl );
  42325. if( len > max_len )
  42326. {
  42327. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  42328. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
  42329. {
  42330. MBEDTLS_SSL_DEBUG_MSG( 1, ( "fragment larger than the (negotiated) "
  42331. "maximum fragment length: %d > %d",
  42332. len, max_len ) );
  42333. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  42334. }
  42335. else
  42336. #endif
  42337. len = max_len;
  42338. }
  42339. #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
  42340. if( ssl->out_left != 0 )
  42341. {
  42342. if( ( ret = mbedtls_ssl_flush_output( ssl ) ) != 0 )
  42343. {
  42344. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_flush_output", ret );
  42345. return( ret );
  42346. }
  42347. }
  42348. else
  42349. {
  42350. ssl->out_msglen = len;
  42351. ssl->out_msgtype = MBEDTLS_SSL_MSG_APPLICATION_DATA;
  42352. memcpy( ssl->out_msg, buf, len );
  42353. if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 )
  42354. {
  42355. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret );
  42356. return( ret );
  42357. }
  42358. }
  42359. return( (int) len );
  42360. }
  42361. /*
  42362. * Write application data, doing 1/n-1 splitting if necessary.
  42363. *
  42364. * With non-blocking I/O, ssl_write_real() may return WANT_WRITE,
  42365. * then the caller will call us again with the same arguments, so
  42366. * remember wether we already did the split or not.
  42367. */
  42368. #if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING)
  42369. static int ssl_write_split( mbedtls_ssl_context *ssl,
  42370. const unsigned char *buf, size_t len )
  42371. {
  42372. int ret;
  42373. if( ssl->conf->cbc_record_splitting ==
  42374. MBEDTLS_SSL_CBC_RECORD_SPLITTING_DISABLED ||
  42375. len <= 1 ||
  42376. ssl->minor_ver > MBEDTLS_SSL_MINOR_VERSION_1 ||
  42377. mbedtls_cipher_get_cipher_mode( &ssl->transform_out->cipher_ctx_enc )
  42378. != MBEDTLS_MODE_CBC )
  42379. {
  42380. return( ssl_write_real( ssl, buf, len ) );
  42381. }
  42382. if( ssl->split_done == 0 )
  42383. {
  42384. if( ( ret = ssl_write_real( ssl, buf, 1 ) ) <= 0 )
  42385. return( ret );
  42386. ssl->split_done = 1;
  42387. }
  42388. if( ( ret = ssl_write_real( ssl, buf + 1, len - 1 ) ) <= 0 )
  42389. return( ret );
  42390. ssl->split_done = 0;
  42391. return( ret + 1 );
  42392. }
  42393. #endif /* MBEDTLS_SSL_CBC_RECORD_SPLITTING */
  42394. /*
  42395. * Write application data (public-facing wrapper)
  42396. */
  42397. int mbedtls_ssl_write( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len )
  42398. {
  42399. int ret;
  42400. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write" ) );
  42401. if( ssl == NULL || ssl->conf == NULL )
  42402. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  42403. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  42404. if( ( ret = ssl_check_ctr_renegotiate( ssl ) ) != 0 )
  42405. {
  42406. MBEDTLS_SSL_DEBUG_RET( 1, "ssl_check_ctr_renegotiate", ret );
  42407. return( ret );
  42408. }
  42409. #endif
  42410. if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER )
  42411. {
  42412. if( ( ret = mbedtls_ssl_handshake( ssl ) ) != 0 )
  42413. {
  42414. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_handshake", ret );
  42415. return( ret );
  42416. }
  42417. }
  42418. #if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING)
  42419. ret = ssl_write_split( ssl, buf, len );
  42420. #else
  42421. ret = ssl_write_real( ssl, buf, len );
  42422. #endif
  42423. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write" ) );
  42424. return( ret );
  42425. }
  42426. /*
  42427. * Notify the peer that the connection is being closed
  42428. */
  42429. int mbedtls_ssl_close_notify( mbedtls_ssl_context *ssl )
  42430. {
  42431. int ret;
  42432. if( ssl == NULL || ssl->conf == NULL )
  42433. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  42434. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write close notify" ) );
  42435. if( ssl->out_left != 0 )
  42436. return( mbedtls_ssl_flush_output( ssl ) );
  42437. if( ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER )
  42438. {
  42439. if( ( ret = mbedtls_ssl_send_alert_message( ssl,
  42440. MBEDTLS_SSL_ALERT_LEVEL_WARNING,
  42441. MBEDTLS_SSL_ALERT_MSG_CLOSE_NOTIFY ) ) != 0 )
  42442. {
  42443. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_send_alert_message", ret );
  42444. return( ret );
  42445. }
  42446. }
  42447. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write close notify" ) );
  42448. return( 0 );
  42449. }
  42450. void mbedtls_ssl_transform_free( mbedtls_ssl_transform *transform )
  42451. {
  42452. if( transform == NULL )
  42453. return;
  42454. #if defined(MBEDTLS_ZLIB_SUPPORT)
  42455. deflateEnd( &transform->ctx_deflate );
  42456. inflateEnd( &transform->ctx_inflate );
  42457. #endif
  42458. mbedtls_cipher_free( &transform->cipher_ctx_enc );
  42459. mbedtls_cipher_free( &transform->cipher_ctx_dec );
  42460. mbedtls_md_free( &transform->md_ctx_enc );
  42461. mbedtls_md_free( &transform->md_ctx_dec );
  42462. ssl_tls_zeroize( transform, sizeof( mbedtls_ssl_transform ) );
  42463. }
  42464. #if defined(MBEDTLS_X509_CRT_PARSE_C)
  42465. static void ssl_key_cert_free( mbedtls_ssl_key_cert *key_cert )
  42466. {
  42467. mbedtls_ssl_key_cert *cur = key_cert, *next;
  42468. while( cur != NULL )
  42469. {
  42470. next = cur->next;
  42471. mbedtls_free( cur );
  42472. cur = next;
  42473. }
  42474. }
  42475. #endif /* MBEDTLS_X509_CRT_PARSE_C */
  42476. void mbedtls_ssl_handshake_free( mbedtls_ssl_handshake_params *handshake )
  42477. {
  42478. if( handshake == NULL )
  42479. return;
  42480. #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
  42481. defined(MBEDTLS_SSL_PROTO_TLS1_1)
  42482. mbedtls_md5_free( &handshake->fin_md5 );
  42483. mbedtls_sha1_free( &handshake->fin_sha1 );
  42484. #endif
  42485. #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
  42486. #if defined(MBEDTLS_SHA256_C)
  42487. mbedtls_sha256_free( &handshake->fin_sha256 );
  42488. #endif
  42489. #if defined(MBEDTLS_SHA512_C)
  42490. mbedtls_sha512_free( &handshake->fin_sha512 );
  42491. #endif
  42492. #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
  42493. #if defined(MBEDTLS_DHM_C)
  42494. mbedtls_dhm_free( &handshake->dhm_ctx );
  42495. #endif
  42496. #if defined(MBEDTLS_ECDH_C)
  42497. mbedtls_ecdh_free( &handshake->ecdh_ctx );
  42498. #endif
  42499. #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
  42500. mbedtls_ecjpake_free( &handshake->ecjpake_ctx );
  42501. #if defined(MBEDTLS_SSL_CLI_C)
  42502. mbedtls_free( handshake->ecjpake_cache );
  42503. handshake->ecjpake_cache = NULL;
  42504. handshake->ecjpake_cache_len = 0;
  42505. #endif
  42506. #endif
  42507. #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C)
  42508. /* explicit void pointer cast for buggy MS compiler */
  42509. mbedtls_free( (void *) handshake->curves );
  42510. #endif
  42511. #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
  42512. if( handshake->psk != NULL )
  42513. {
  42514. ssl_tls_zeroize( handshake->psk, handshake->psk_len );
  42515. mbedtls_free( handshake->psk );
  42516. }
  42517. #endif
  42518. #if defined(MBEDTLS_X509_CRT_PARSE_C) && \
  42519. defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
  42520. /*
  42521. * Free only the linked list wrapper, not the keys themselves
  42522. * since the belong to the SNI callback
  42523. */
  42524. if( handshake->sni_key_cert != NULL )
  42525. {
  42526. mbedtls_ssl_key_cert *cur = handshake->sni_key_cert, *next;
  42527. while( cur != NULL )
  42528. {
  42529. next = cur->next;
  42530. mbedtls_free( cur );
  42531. cur = next;
  42532. }
  42533. }
  42534. #endif /* MBEDTLS_X509_CRT_PARSE_C && MBEDTLS_SSL_SERVER_NAME_INDICATION */
  42535. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  42536. mbedtls_free( handshake->verify_cookie );
  42537. mbedtls_free( handshake->hs_msg );
  42538. ssl_flight_free( handshake->flight );
  42539. #endif
  42540. ssl_tls_zeroize( handshake, sizeof( mbedtls_ssl_handshake_params ) );
  42541. }
  42542. void mbedtls_ssl_session_free( mbedtls_ssl_session *session )
  42543. {
  42544. if( session == NULL )
  42545. return;
  42546. #if defined(MBEDTLS_X509_CRT_PARSE_C)
  42547. if( session->peer_cert != NULL )
  42548. {
  42549. mbedtls_x509_crt_free( session->peer_cert );
  42550. mbedtls_free( session->peer_cert );
  42551. }
  42552. #endif
  42553. #if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
  42554. mbedtls_free( session->ticket );
  42555. #endif
  42556. ssl_tls_zeroize( session, sizeof( mbedtls_ssl_session ) );
  42557. }
  42558. /*
  42559. * Free an SSL context
  42560. */
  42561. void mbedtls_ssl_free( mbedtls_ssl_context *ssl )
  42562. {
  42563. if( ssl == NULL )
  42564. return;
  42565. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> free" ) );
  42566. if( ssl->out_buf != NULL )
  42567. {
  42568. ssl_tls_zeroize( ssl->out_buf, MBEDTLS_SSL_BUFFER_LEN );
  42569. mbedtls_free( ssl->out_buf );
  42570. }
  42571. if( ssl->in_buf != NULL )
  42572. {
  42573. ssl_tls_zeroize( ssl->in_buf, MBEDTLS_SSL_BUFFER_LEN );
  42574. mbedtls_free( ssl->in_buf );
  42575. }
  42576. #if defined(MBEDTLS_ZLIB_SUPPORT)
  42577. if( ssl->compress_buf != NULL )
  42578. {
  42579. ssl_tls_zeroize( ssl->compress_buf, MBEDTLS_SSL_BUFFER_LEN );
  42580. mbedtls_free( ssl->compress_buf );
  42581. }
  42582. #endif
  42583. if( ssl->transform )
  42584. {
  42585. mbedtls_ssl_transform_free( ssl->transform );
  42586. mbedtls_free( ssl->transform );
  42587. }
  42588. if( ssl->handshake )
  42589. {
  42590. mbedtls_ssl_handshake_free( ssl->handshake );
  42591. mbedtls_ssl_transform_free( ssl->transform_negotiate );
  42592. mbedtls_ssl_session_free( ssl->session_negotiate );
  42593. mbedtls_free( ssl->handshake );
  42594. mbedtls_free( ssl->transform_negotiate );
  42595. mbedtls_free( ssl->session_negotiate );
  42596. }
  42597. if( ssl->session )
  42598. {
  42599. mbedtls_ssl_session_free( ssl->session );
  42600. mbedtls_free( ssl->session );
  42601. }
  42602. #if defined(MBEDTLS_X509_CRT_PARSE_C)
  42603. if( ssl->hostname != NULL )
  42604. {
  42605. ssl_tls_zeroize( ssl->hostname, strlen( ssl->hostname ) );
  42606. mbedtls_free( ssl->hostname );
  42607. }
  42608. #endif
  42609. #if defined(MBEDTLS_SSL_HW_RECORD_ACCEL)
  42610. if( mbedtls_ssl_hw_record_finish != NULL )
  42611. {
  42612. MBEDTLS_SSL_DEBUG_MSG( 2, ( "going for mbedtls_ssl_hw_record_finish()" ) );
  42613. mbedtls_ssl_hw_record_finish( ssl );
  42614. }
  42615. #endif
  42616. #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C)
  42617. mbedtls_free( ssl->cli_id );
  42618. #endif
  42619. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= free" ) );
  42620. /* Actually clear after last debug message */
  42621. ssl_tls_zeroize( ssl, sizeof( mbedtls_ssl_context ) );
  42622. }
  42623. /*
  42624. * Initialze mbedtls_ssl_config
  42625. */
  42626. void mbedtls_ssl_config_init( mbedtls_ssl_config *conf )
  42627. {
  42628. memset( conf, 0, sizeof( mbedtls_ssl_config ) );
  42629. }
  42630. #if defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)
  42631. static int ssl_preset_default_hashes[] = {
  42632. #if defined(MBEDTLS_SHA512_C)
  42633. MBEDTLS_MD_SHA512,
  42634. MBEDTLS_MD_SHA384,
  42635. #endif
  42636. #if defined(MBEDTLS_SHA256_C)
  42637. MBEDTLS_MD_SHA256,
  42638. MBEDTLS_MD_SHA224,
  42639. #endif
  42640. #if defined(MBEDTLS_SHA1_C)
  42641. MBEDTLS_MD_SHA1,
  42642. #endif
  42643. MBEDTLS_MD_NONE
  42644. };
  42645. #endif
  42646. static int ssl_preset_suiteb_ciphersuites[] = {
  42647. MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
  42648. MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
  42649. 0
  42650. };
  42651. #if defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)
  42652. static int ssl_preset_suiteb_hashes[] = {
  42653. MBEDTLS_MD_SHA256,
  42654. MBEDTLS_MD_SHA384,
  42655. MBEDTLS_MD_NONE
  42656. };
  42657. #endif
  42658. #if defined(MBEDTLS_ECP_C)
  42659. static mbedtls_ecp_group_id ssl_preset_suiteb_curves[] = {
  42660. MBEDTLS_ECP_DP_SECP256R1,
  42661. MBEDTLS_ECP_DP_SECP384R1,
  42662. MBEDTLS_ECP_DP_NONE
  42663. };
  42664. #endif
  42665. /*
  42666. * Load default in mbedtls_ssl_config
  42667. */
  42668. int mbedtls_ssl_config_defaults( mbedtls_ssl_config *conf,
  42669. int endpoint, int transport, int preset )
  42670. {
  42671. #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C)
  42672. int ret;
  42673. #endif
  42674. /* Use the functions here so that they are covered in tests,
  42675. * but otherwise access member directly for efficiency */
  42676. mbedtls_ssl_conf_endpoint( conf, endpoint );
  42677. mbedtls_ssl_conf_transport( conf, transport );
  42678. /*
  42679. * Things that are common to all presets
  42680. */
  42681. #if defined(MBEDTLS_SSL_CLI_C)
  42682. if( endpoint == MBEDTLS_SSL_IS_CLIENT )
  42683. {
  42684. conf->authmode = MBEDTLS_SSL_VERIFY_REQUIRED;
  42685. #if defined(MBEDTLS_SSL_SESSION_TICKETS)
  42686. conf->session_tickets = MBEDTLS_SSL_SESSION_TICKETS_ENABLED;
  42687. #endif
  42688. }
  42689. #endif
  42690. #if defined(MBEDTLS_ARC4_C)
  42691. conf->arc4_disabled = MBEDTLS_SSL_ARC4_DISABLED;
  42692. #endif
  42693. #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
  42694. conf->encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED;
  42695. #endif
  42696. #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
  42697. conf->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED;
  42698. #endif
  42699. #if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING)
  42700. conf->cbc_record_splitting = MBEDTLS_SSL_CBC_RECORD_SPLITTING_ENABLED;
  42701. #endif
  42702. #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C)
  42703. conf->f_cookie_write = ssl_cookie_write_dummy;
  42704. conf->f_cookie_check = ssl_cookie_check_dummy;
  42705. #endif
  42706. #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
  42707. conf->anti_replay = MBEDTLS_SSL_ANTI_REPLAY_ENABLED;
  42708. #endif
  42709. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  42710. conf->hs_timeout_min = MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MIN;
  42711. conf->hs_timeout_max = MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MAX;
  42712. #endif
  42713. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  42714. conf->renego_max_records = MBEDTLS_SSL_RENEGO_MAX_RECORDS_DEFAULT;
  42715. memset( conf->renego_period, 0xFF, 7 );
  42716. conf->renego_period[7] = 0x00;
  42717. #endif
  42718. #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C)
  42719. if( endpoint == MBEDTLS_SSL_IS_SERVER )
  42720. {
  42721. if( ( ret = mbedtls_ssl_conf_dh_param( conf,
  42722. MBEDTLS_DHM_RFC5114_MODP_2048_P,
  42723. MBEDTLS_DHM_RFC5114_MODP_2048_G ) ) != 0 )
  42724. {
  42725. return( ret );
  42726. }
  42727. }
  42728. #endif
  42729. /*
  42730. * Preset-specific defaults
  42731. */
  42732. switch( preset )
  42733. {
  42734. /*
  42735. * NSA Suite B
  42736. */
  42737. case MBEDTLS_SSL_PRESET_SUITEB:
  42738. conf->min_major_ver = MBEDTLS_SSL_MAJOR_VERSION_3;
  42739. conf->min_minor_ver = MBEDTLS_SSL_MINOR_VERSION_3; /* TLS 1.2 */
  42740. conf->max_major_ver = MBEDTLS_SSL_MAX_MAJOR_VERSION;
  42741. conf->max_minor_ver = MBEDTLS_SSL_MAX_MINOR_VERSION;
  42742. conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_0] =
  42743. conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_1] =
  42744. conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_2] =
  42745. conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_3] =
  42746. ssl_preset_suiteb_ciphersuites;
  42747. #if defined(MBEDTLS_X509_CRT_PARSE_C)
  42748. conf->cert_profile = &mbedtls_x509_crt_profile_suiteb;
  42749. #endif
  42750. #if defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)
  42751. conf->sig_hashes = ssl_preset_suiteb_hashes;
  42752. #endif
  42753. #if defined(MBEDTLS_ECP_C)
  42754. conf->curve_list = ssl_preset_suiteb_curves;
  42755. #endif
  42756. break;
  42757. /*
  42758. * Default
  42759. */
  42760. default:
  42761. conf->min_major_ver = MBEDTLS_SSL_MAJOR_VERSION_3;
  42762. conf->min_minor_ver = MBEDTLS_SSL_MINOR_VERSION_1; /* TLS 1.0 */
  42763. conf->max_major_ver = MBEDTLS_SSL_MAX_MAJOR_VERSION;
  42764. conf->max_minor_ver = MBEDTLS_SSL_MAX_MINOR_VERSION;
  42765. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  42766. if( transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
  42767. conf->min_minor_ver = MBEDTLS_SSL_MINOR_VERSION_2;
  42768. #endif
  42769. conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_0] =
  42770. conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_1] =
  42771. conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_2] =
  42772. conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_3] =
  42773. mbedtls_ssl_list_ciphersuites();
  42774. #if defined(MBEDTLS_X509_CRT_PARSE_C)
  42775. conf->cert_profile = &mbedtls_x509_crt_profile_default;
  42776. #endif
  42777. #if defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)
  42778. conf->sig_hashes = ssl_preset_default_hashes;
  42779. #endif
  42780. #if defined(MBEDTLS_ECP_C)
  42781. conf->curve_list = mbedtls_ecp_grp_id_list();
  42782. #endif
  42783. #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_CLI_C)
  42784. conf->dhm_min_bitlen = 1024;
  42785. #endif
  42786. }
  42787. return( 0 );
  42788. }
  42789. /*
  42790. * Free mbedtls_ssl_config
  42791. */
  42792. void mbedtls_ssl_config_free( mbedtls_ssl_config *conf )
  42793. {
  42794. #if defined(MBEDTLS_DHM_C)
  42795. mbedtls_mpi_free( &conf->dhm_P );
  42796. mbedtls_mpi_free( &conf->dhm_G );
  42797. #endif
  42798. #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
  42799. if( conf->psk != NULL )
  42800. {
  42801. ssl_tls_zeroize( conf->psk, conf->psk_len );
  42802. ssl_tls_zeroize( conf->psk_identity, conf->psk_identity_len );
  42803. mbedtls_free( conf->psk );
  42804. mbedtls_free( conf->psk_identity );
  42805. conf->psk_len = 0;
  42806. conf->psk_identity_len = 0;
  42807. }
  42808. #endif
  42809. #if defined(MBEDTLS_X509_CRT_PARSE_C)
  42810. ssl_key_cert_free( conf->key_cert );
  42811. #endif
  42812. ssl_tls_zeroize( conf, sizeof( mbedtls_ssl_config ) );
  42813. }
  42814. #if defined(MBEDTLS_PK_C) && \
  42815. ( defined(MBEDTLS_RSA_C) || defined(MBEDTLS_ECDSA_C) )
  42816. /*
  42817. * Convert between MBEDTLS_PK_XXX and SSL_SIG_XXX
  42818. */
  42819. unsigned char mbedtls_ssl_sig_from_pk( mbedtls_pk_context *pk )
  42820. {
  42821. #if defined(MBEDTLS_RSA_C)
  42822. if( mbedtls_pk_can_do( pk, MBEDTLS_PK_RSA ) )
  42823. return( MBEDTLS_SSL_SIG_RSA );
  42824. #endif
  42825. #if defined(MBEDTLS_ECDSA_C)
  42826. if( mbedtls_pk_can_do( pk, MBEDTLS_PK_ECDSA ) )
  42827. return( MBEDTLS_SSL_SIG_ECDSA );
  42828. #endif
  42829. return( MBEDTLS_SSL_SIG_ANON );
  42830. }
  42831. mbedtls_pk_type_t mbedtls_ssl_pk_alg_from_sig( unsigned char sig )
  42832. {
  42833. switch( sig )
  42834. {
  42835. #if defined(MBEDTLS_RSA_C)
  42836. case MBEDTLS_SSL_SIG_RSA:
  42837. return( MBEDTLS_PK_RSA );
  42838. #endif
  42839. #if defined(MBEDTLS_ECDSA_C)
  42840. case MBEDTLS_SSL_SIG_ECDSA:
  42841. return( MBEDTLS_PK_ECDSA );
  42842. #endif
  42843. default:
  42844. return( MBEDTLS_PK_NONE );
  42845. }
  42846. }
  42847. #endif /* MBEDTLS_PK_C && ( MBEDTLS_RSA_C || MBEDTLS_ECDSA_C ) */
  42848. /*
  42849. * Convert from MBEDTLS_SSL_HASH_XXX to MBEDTLS_MD_XXX
  42850. */
  42851. mbedtls_md_type_t mbedtls_ssl_md_alg_from_hash( unsigned char hash )
  42852. {
  42853. switch( hash )
  42854. {
  42855. #if defined(MBEDTLS_MD5_C)
  42856. case MBEDTLS_SSL_HASH_MD5:
  42857. return( MBEDTLS_MD_MD5 );
  42858. #endif
  42859. #if defined(MBEDTLS_SHA1_C)
  42860. case MBEDTLS_SSL_HASH_SHA1:
  42861. return( MBEDTLS_MD_SHA1 );
  42862. #endif
  42863. #if defined(MBEDTLS_SHA256_C)
  42864. case MBEDTLS_SSL_HASH_SHA224:
  42865. return( MBEDTLS_MD_SHA224 );
  42866. case MBEDTLS_SSL_HASH_SHA256:
  42867. return( MBEDTLS_MD_SHA256 );
  42868. #endif
  42869. #if defined(MBEDTLS_SHA512_C)
  42870. case MBEDTLS_SSL_HASH_SHA384:
  42871. return( MBEDTLS_MD_SHA384 );
  42872. case MBEDTLS_SSL_HASH_SHA512:
  42873. return( MBEDTLS_MD_SHA512 );
  42874. #endif
  42875. default:
  42876. return( MBEDTLS_MD_NONE );
  42877. }
  42878. }
  42879. /*
  42880. * Convert from MBEDTLS_MD_XXX to MBEDTLS_SSL_HASH_XXX
  42881. */
  42882. unsigned char mbedtls_ssl_hash_from_md_alg( int md )
  42883. {
  42884. switch( md )
  42885. {
  42886. #if defined(MBEDTLS_MD5_C)
  42887. case MBEDTLS_MD_MD5:
  42888. return( MBEDTLS_SSL_HASH_MD5 );
  42889. #endif
  42890. #if defined(MBEDTLS_SHA1_C)
  42891. case MBEDTLS_MD_SHA1:
  42892. return( MBEDTLS_SSL_HASH_SHA1 );
  42893. #endif
  42894. #if defined(MBEDTLS_SHA256_C)
  42895. case MBEDTLS_MD_SHA224:
  42896. return( MBEDTLS_SSL_HASH_SHA224 );
  42897. case MBEDTLS_MD_SHA256:
  42898. return( MBEDTLS_SSL_HASH_SHA256 );
  42899. #endif
  42900. #if defined(MBEDTLS_SHA512_C)
  42901. case MBEDTLS_MD_SHA384:
  42902. return( MBEDTLS_SSL_HASH_SHA384 );
  42903. case MBEDTLS_MD_SHA512:
  42904. return( MBEDTLS_SSL_HASH_SHA512 );
  42905. #endif
  42906. default:
  42907. return( MBEDTLS_SSL_HASH_NONE );
  42908. }
  42909. }
  42910. #if defined(MBEDTLS_ECP_C)
  42911. /*
  42912. * Check if a curve proposed by the peer is in our list.
  42913. * Return 0 if we're willing to use it, -1 otherwise.
  42914. */
  42915. int mbedtls_ssl_check_curve( const mbedtls_ssl_context *ssl, mbedtls_ecp_group_id grp_id )
  42916. {
  42917. const mbedtls_ecp_group_id *gid;
  42918. if( ssl->conf->curve_list == NULL )
  42919. return( -1 );
  42920. for( gid = ssl->conf->curve_list; *gid != MBEDTLS_ECP_DP_NONE; gid++ )
  42921. if( *gid == grp_id )
  42922. return( 0 );
  42923. return( -1 );
  42924. }
  42925. #endif /* MBEDTLS_ECP_C */
  42926. #if defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)
  42927. /*
  42928. * Check if a hash proposed by the peer is in our list.
  42929. * Return 0 if we're willing to use it, -1 otherwise.
  42930. */
  42931. int mbedtls_ssl_check_sig_hash( const mbedtls_ssl_context *ssl,
  42932. mbedtls_md_type_t md )
  42933. {
  42934. const int *cur;
  42935. if( ssl->conf->sig_hashes == NULL )
  42936. return( -1 );
  42937. for( cur = ssl->conf->sig_hashes; *cur != MBEDTLS_MD_NONE; cur++ )
  42938. if( *cur == (int) md )
  42939. return( 0 );
  42940. return( -1 );
  42941. }
  42942. #endif /* MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */
  42943. #if defined(MBEDTLS_X509_CRT_PARSE_C)
  42944. int mbedtls_ssl_check_cert_usage( const mbedtls_x509_crt *cert,
  42945. const mbedtls_ssl_ciphersuite_t *ciphersuite,
  42946. int cert_endpoint,
  42947. uint32_t *flags )
  42948. {
  42949. int ret = 0;
  42950. #if defined(MBEDTLS_X509_CHECK_KEY_USAGE)
  42951. int usage = 0;
  42952. #endif
  42953. #if defined(MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE)
  42954. const char *ext_oid;
  42955. size_t ext_len;
  42956. #endif
  42957. #if !defined(MBEDTLS_X509_CHECK_KEY_USAGE) && \
  42958. !defined(MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE)
  42959. ((void) cert);
  42960. ((void) cert_endpoint);
  42961. ((void) flags);
  42962. #endif
  42963. #if defined(MBEDTLS_X509_CHECK_KEY_USAGE)
  42964. if( cert_endpoint == MBEDTLS_SSL_IS_SERVER )
  42965. {
  42966. /* Server part of the key exchange */
  42967. switch( ciphersuite->key_exchange )
  42968. {
  42969. case MBEDTLS_KEY_EXCHANGE_RSA:
  42970. case MBEDTLS_KEY_EXCHANGE_RSA_PSK:
  42971. usage = MBEDTLS_X509_KU_KEY_ENCIPHERMENT;
  42972. break;
  42973. case MBEDTLS_KEY_EXCHANGE_DHE_RSA:
  42974. case MBEDTLS_KEY_EXCHANGE_ECDHE_RSA:
  42975. case MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA:
  42976. usage = MBEDTLS_X509_KU_DIGITAL_SIGNATURE;
  42977. break;
  42978. case MBEDTLS_KEY_EXCHANGE_ECDH_RSA:
  42979. case MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA:
  42980. usage = MBEDTLS_X509_KU_KEY_AGREEMENT;
  42981. break;
  42982. /* Don't use default: we want warnings when adding new values */
  42983. case MBEDTLS_KEY_EXCHANGE_NONE:
  42984. case MBEDTLS_KEY_EXCHANGE_PSK:
  42985. case MBEDTLS_KEY_EXCHANGE_DHE_PSK:
  42986. case MBEDTLS_KEY_EXCHANGE_ECDHE_PSK:
  42987. case MBEDTLS_KEY_EXCHANGE_ECJPAKE:
  42988. usage = 0;
  42989. }
  42990. }
  42991. else
  42992. {
  42993. /* Client auth: we only implement rsa_sign and mbedtls_ecdsa_sign for now */
  42994. usage = MBEDTLS_X509_KU_DIGITAL_SIGNATURE;
  42995. }
  42996. if( mbedtls_x509_crt_check_key_usage( cert, usage ) != 0 )
  42997. {
  42998. *flags |= MBEDTLS_X509_BADCERT_KEY_USAGE;
  42999. ret = -1;
  43000. }
  43001. #else
  43002. ((void) ciphersuite);
  43003. #endif /* MBEDTLS_X509_CHECK_KEY_USAGE */
  43004. #if defined(MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE)
  43005. if( cert_endpoint == MBEDTLS_SSL_IS_SERVER )
  43006. {
  43007. ext_oid = MBEDTLS_OID_SERVER_AUTH;
  43008. ext_len = MBEDTLS_OID_SIZE( MBEDTLS_OID_SERVER_AUTH );
  43009. }
  43010. else
  43011. {
  43012. ext_oid = MBEDTLS_OID_CLIENT_AUTH;
  43013. ext_len = MBEDTLS_OID_SIZE( MBEDTLS_OID_CLIENT_AUTH );
  43014. }
  43015. if( mbedtls_x509_crt_check_extended_key_usage( cert, ext_oid, ext_len ) != 0 )
  43016. {
  43017. *flags |= MBEDTLS_X509_BADCERT_EXT_KEY_USAGE;
  43018. ret = -1;
  43019. }
  43020. #endif /* MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE */
  43021. return( ret );
  43022. }
  43023. #endif /* MBEDTLS_X509_CRT_PARSE_C */
  43024. /*
  43025. * Convert version numbers to/from wire format
  43026. * and, for DTLS, to/from TLS equivalent.
  43027. *
  43028. * For TLS this is the identity.
  43029. * For DTLS, use one complement (v -> 255 - v, and then map as follows:
  43030. * 1.0 <-> 3.2 (DTLS 1.0 is based on TLS 1.1)
  43031. * 1.x <-> 3.x+1 for x != 0 (DTLS 1.2 based on TLS 1.2)
  43032. */
  43033. void mbedtls_ssl_write_version( int major, int minor, int transport,
  43034. unsigned char ver[2] )
  43035. {
  43036. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  43037. if( transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
  43038. {
  43039. if( minor == MBEDTLS_SSL_MINOR_VERSION_2 )
  43040. --minor; /* DTLS 1.0 stored as TLS 1.1 internally */
  43041. ver[0] = (unsigned char)( 255 - ( major - 2 ) );
  43042. ver[1] = (unsigned char)( 255 - ( minor - 1 ) );
  43043. }
  43044. else
  43045. #else
  43046. ((void) transport);
  43047. #endif
  43048. {
  43049. ver[0] = (unsigned char) major;
  43050. ver[1] = (unsigned char) minor;
  43051. }
  43052. }
  43053. void mbedtls_ssl_read_version( int *major, int *minor, int transport,
  43054. const unsigned char ver[2] )
  43055. {
  43056. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  43057. if( transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
  43058. {
  43059. *major = 255 - ver[0] + 2;
  43060. *minor = 255 - ver[1] + 1;
  43061. if( *minor == MBEDTLS_SSL_MINOR_VERSION_1 )
  43062. ++*minor; /* DTLS 1.0 stored as TLS 1.1 internally */
  43063. }
  43064. else
  43065. #else
  43066. ((void) transport);
  43067. #endif
  43068. {
  43069. *major = ver[0];
  43070. *minor = ver[1];
  43071. }
  43072. }
  43073. #endif /* MBEDTLS_SSL_TLS_C */
  43074. /********* Start of file library/threading.c ************/
  43075. /*
  43076. * Threading abstraction layer
  43077. *
  43078. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  43079. * SPDX-License-Identifier: Apache-2.0
  43080. *
  43081. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  43082. * not use this file except in compliance with the License.
  43083. * You may obtain a copy of the License at
  43084. *
  43085. * http://www.apache.org/licenses/LICENSE-2.0
  43086. *
  43087. * Unless required by applicable law or agreed to in writing, software
  43088. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  43089. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  43090. * See the License for the specific language governing permissions and
  43091. * limitations under the License.
  43092. *
  43093. * This file is part of mbed TLS (https://tls.mbed.org)
  43094. */
  43095. #if !defined(MBEDTLS_CONFIG_FILE)
  43096. #else
  43097. #endif
  43098. #if defined(MBEDTLS_THREADING_C)
  43099. #if defined(MBEDTLS_THREADING_PTHREAD)
  43100. static void threading_mutex_init_pthread( mbedtls_threading_mutex_t *mutex )
  43101. {
  43102. if( mutex == NULL )
  43103. return;
  43104. mutex->is_valid = pthread_mutex_init( &mutex->mutex, NULL ) == 0;
  43105. }
  43106. static void threading_mutex_free_pthread( mbedtls_threading_mutex_t *mutex )
  43107. {
  43108. if( mutex == NULL )
  43109. return;
  43110. (void) pthread_mutex_destroy( &mutex->mutex );
  43111. }
  43112. static int threading_mutex_lock_pthread( mbedtls_threading_mutex_t *mutex )
  43113. {
  43114. if( mutex == NULL || ! mutex->is_valid )
  43115. return( MBEDTLS_ERR_THREADING_BAD_INPUT_DATA );
  43116. if( pthread_mutex_lock( &mutex->mutex ) != 0 )
  43117. return( MBEDTLS_ERR_THREADING_MUTEX_ERROR );
  43118. return( 0 );
  43119. }
  43120. static int threading_mutex_unlock_pthread( mbedtls_threading_mutex_t *mutex )
  43121. {
  43122. if( mutex == NULL || ! mutex->is_valid )
  43123. return( MBEDTLS_ERR_THREADING_BAD_INPUT_DATA );
  43124. if( pthread_mutex_unlock( &mutex->mutex ) != 0 )
  43125. return( MBEDTLS_ERR_THREADING_MUTEX_ERROR );
  43126. return( 0 );
  43127. }
  43128. void (*mbedtls_mutex_init)( mbedtls_threading_mutex_t * ) = threading_mutex_init_pthread;
  43129. void (*mbedtls_mutex_free)( mbedtls_threading_mutex_t * ) = threading_mutex_free_pthread;
  43130. int (*mbedtls_mutex_lock)( mbedtls_threading_mutex_t * ) = threading_mutex_lock_pthread;
  43131. int (*mbedtls_mutex_unlock)( mbedtls_threading_mutex_t * ) = threading_mutex_unlock_pthread;
  43132. /*
  43133. * With phtreads we can statically initialize mutexes
  43134. */
  43135. #define MUTEX_INIT = { PTHREAD_MUTEX_INITIALIZER, 1 }
  43136. #endif /* MBEDTLS_THREADING_PTHREAD */
  43137. #if defined(MBEDTLS_THREADING_ALT)
  43138. static int threading_mutex_fail( mbedtls_threading_mutex_t *mutex )
  43139. {
  43140. ((void) mutex );
  43141. return( MBEDTLS_ERR_THREADING_BAD_INPUT_DATA );
  43142. }
  43143. static void threading_mutex_dummy( mbedtls_threading_mutex_t *mutex )
  43144. {
  43145. ((void) mutex );
  43146. return;
  43147. }
  43148. void (*mbedtls_mutex_init)( mbedtls_threading_mutex_t * ) = threading_mutex_dummy;
  43149. void (*mbedtls_mutex_free)( mbedtls_threading_mutex_t * ) = threading_mutex_dummy;
  43150. int (*mbedtls_mutex_lock)( mbedtls_threading_mutex_t * ) = threading_mutex_fail;
  43151. int (*mbedtls_mutex_unlock)( mbedtls_threading_mutex_t * ) = threading_mutex_fail;
  43152. /*
  43153. * Set functions pointers and initialize global mutexes
  43154. */
  43155. void mbedtls_threading_set_alt( void (*mutex_init)( mbedtls_threading_mutex_t * ),
  43156. void (*mutex_free)( mbedtls_threading_mutex_t * ),
  43157. int (*mutex_lock)( mbedtls_threading_mutex_t * ),
  43158. int (*mutex_unlock)( mbedtls_threading_mutex_t * ) )
  43159. {
  43160. mbedtls_mutex_init = mutex_init;
  43161. mbedtls_mutex_free = mutex_free;
  43162. mbedtls_mutex_lock = mutex_lock;
  43163. mbedtls_mutex_unlock = mutex_unlock;
  43164. mbedtls_mutex_init( &mbedtls_threading_readdir_mutex );
  43165. mbedtls_mutex_init( &mbedtls_threading_gmtime_mutex );
  43166. }
  43167. /*
  43168. * Free global mutexes
  43169. */
  43170. void mbedtls_threading_free_alt( void )
  43171. {
  43172. mbedtls_mutex_free( &mbedtls_threading_readdir_mutex );
  43173. mbedtls_mutex_free( &mbedtls_threading_gmtime_mutex );
  43174. }
  43175. #endif /* MBEDTLS_THREADING_ALT */
  43176. /*
  43177. * Define global mutexes
  43178. */
  43179. #ifndef MUTEX_INIT
  43180. #define MUTEX_INIT
  43181. #endif
  43182. mbedtls_threading_mutex_t mbedtls_threading_readdir_mutex MUTEX_INIT;
  43183. mbedtls_threading_mutex_t mbedtls_threading_gmtime_mutex MUTEX_INIT;
  43184. #endif /* MBEDTLS_THREADING_C */
  43185. /********* Start of file library/timing.c ************/
  43186. /*
  43187. * Portable interface to the CPU cycle counter
  43188. *
  43189. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  43190. * SPDX-License-Identifier: Apache-2.0
  43191. *
  43192. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  43193. * not use this file except in compliance with the License.
  43194. * You may obtain a copy of the License at
  43195. *
  43196. * http://www.apache.org/licenses/LICENSE-2.0
  43197. *
  43198. * Unless required by applicable law or agreed to in writing, software
  43199. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  43200. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  43201. * See the License for the specific language governing permissions and
  43202. * limitations under the License.
  43203. *
  43204. * This file is part of mbed TLS (https://tls.mbed.org)
  43205. */
  43206. #if !defined(MBEDTLS_CONFIG_FILE)
  43207. #else
  43208. #endif
  43209. #if defined(MBEDTLS_SELF_TEST) && defined(MBEDTLS_PLATFORM_C)
  43210. #else
  43211. #include <stdio.h>
  43212. #define mbedtls_printf printf
  43213. #endif
  43214. #if defined(MBEDTLS_TIMING_C)
  43215. #if !defined(MBEDTLS_TIMING_ALT)
  43216. #ifndef asm
  43217. #define asm __asm
  43218. #endif
  43219. #if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32)
  43220. #include <windows.h>
  43221. #include <winbase.h>
  43222. struct _hr_time
  43223. {
  43224. LARGE_INTEGER start;
  43225. };
  43226. #else
  43227. #include <unistd.h>
  43228. #include <sys/types.h>
  43229. #if !VXWORKS
  43230. #include <sys/time.h>
  43231. #endif
  43232. #include <signal.h>
  43233. #include <time.h>
  43234. struct _hr_time
  43235. {
  43236. struct timeval start;
  43237. };
  43238. #endif /* _WIN32 && !EFIX64 && !EFI32 */
  43239. #if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) && \
  43240. ( defined(_MSC_VER) && defined(_M_IX86) ) || defined(__WATCOMC__)
  43241. #define HAVE_HARDCLOCK
  43242. unsigned long mbedtls_timing_hardclock( void )
  43243. {
  43244. unsigned long tsc;
  43245. __asm rdtsc
  43246. __asm mov [tsc], eax
  43247. return( tsc );
  43248. }
  43249. #endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM &&
  43250. ( _MSC_VER && _M_IX86 ) || __WATCOMC__ */
  43251. /* some versions of mingw-64 have 32-bit longs even on x84_64 */
  43252. #if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) && \
  43253. defined(__GNUC__) && ( defined(__i386__) || ( \
  43254. ( defined(__amd64__) || defined( __x86_64__) ) && __SIZEOF_LONG__ == 4 ) )
  43255. #define HAVE_HARDCLOCK
  43256. unsigned long mbedtls_timing_hardclock( void )
  43257. {
  43258. unsigned long lo, hi;
  43259. asm volatile( "rdtsc" : "=a" (lo), "=d" (hi) );
  43260. return( lo );
  43261. }
  43262. #endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM &&
  43263. __GNUC__ && __i386__ */
  43264. #if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) && \
  43265. defined(__GNUC__) && ( defined(__amd64__) || defined(__x86_64__) )
  43266. #define HAVE_HARDCLOCK
  43267. unsigned long mbedtls_timing_hardclock( void )
  43268. {
  43269. unsigned long lo, hi;
  43270. asm volatile( "rdtsc" : "=a" (lo), "=d" (hi) );
  43271. return( lo | ( hi << 32 ) );
  43272. }
  43273. #endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM &&
  43274. __GNUC__ && ( __amd64__ || __x86_64__ ) */
  43275. #if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) && \
  43276. defined(__GNUC__) && ( defined(__powerpc__) || defined(__ppc__) )
  43277. #define HAVE_HARDCLOCK
  43278. unsigned long mbedtls_timing_hardclock( void )
  43279. {
  43280. unsigned long tbl, tbu0, tbu1;
  43281. do
  43282. {
  43283. asm volatile( "mftbu %0" : "=r" (tbu0) );
  43284. asm volatile( "mftb %0" : "=r" (tbl ) );
  43285. asm volatile( "mftbu %0" : "=r" (tbu1) );
  43286. }
  43287. while( tbu0 != tbu1 );
  43288. return( tbl );
  43289. }
  43290. #endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM &&
  43291. __GNUC__ && ( __powerpc__ || __ppc__ ) */
  43292. #if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) && \
  43293. defined(__GNUC__) && defined(__sparc64__)
  43294. #if defined(__OpenBSD__)
  43295. #warning OpenBSD does not allow access to tick register using software version instead
  43296. #else
  43297. #define HAVE_HARDCLOCK
  43298. unsigned long mbedtls_timing_hardclock( void )
  43299. {
  43300. unsigned long tick;
  43301. asm volatile( "rdpr %%tick, %0;" : "=&r" (tick) );
  43302. return( tick );
  43303. }
  43304. #endif /* __OpenBSD__ */
  43305. #endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM &&
  43306. __GNUC__ && __sparc64__ */
  43307. #if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) && \
  43308. defined(__GNUC__) && defined(__sparc__) && !defined(__sparc64__)
  43309. #define HAVE_HARDCLOCK
  43310. unsigned long mbedtls_timing_hardclock( void )
  43311. {
  43312. unsigned long tick;
  43313. asm volatile( ".byte 0x83, 0x41, 0x00, 0x00" );
  43314. asm volatile( "mov %%g1, %0" : "=r" (tick) );
  43315. return( tick );
  43316. }
  43317. #endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM &&
  43318. __GNUC__ && __sparc__ && !__sparc64__ */
  43319. #if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) && \
  43320. defined(__GNUC__) && defined(__alpha__)
  43321. #define HAVE_HARDCLOCK
  43322. unsigned long mbedtls_timing_hardclock( void )
  43323. {
  43324. unsigned long cc;
  43325. asm volatile( "rpcc %0" : "=r" (cc) );
  43326. return( cc & 0xFFFFFFFF );
  43327. }
  43328. #endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM &&
  43329. __GNUC__ && __alpha__ */
  43330. #if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) && \
  43331. defined(__GNUC__) && defined(__ia64__)
  43332. #define HAVE_HARDCLOCK
  43333. unsigned long mbedtls_timing_hardclock( void )
  43334. {
  43335. unsigned long itc;
  43336. asm volatile( "mov %0 = ar.itc" : "=r" (itc) );
  43337. return( itc );
  43338. }
  43339. #endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM &&
  43340. __GNUC__ && __ia64__ */
  43341. #if !defined(HAVE_HARDCLOCK) && defined(_MSC_VER) && \
  43342. !defined(EFIX64) && !defined(EFI32)
  43343. #define HAVE_HARDCLOCK
  43344. unsigned long mbedtls_timing_hardclock( void )
  43345. {
  43346. LARGE_INTEGER offset;
  43347. QueryPerformanceCounter( &offset );
  43348. return( (unsigned long)( offset.QuadPart ) );
  43349. }
  43350. #endif /* !HAVE_HARDCLOCK && _MSC_VER && !EFIX64 && !EFI32 */
  43351. #if !defined(HAVE_HARDCLOCK)
  43352. #define HAVE_HARDCLOCK
  43353. static int hardclock_init = 0;
  43354. static struct timeval tv_init;
  43355. unsigned long mbedtls_timing_hardclock( void )
  43356. {
  43357. struct timeval tv_cur;
  43358. if( hardclock_init == 0 )
  43359. {
  43360. gettimeofday( &tv_init, NULL );
  43361. hardclock_init = 1;
  43362. }
  43363. gettimeofday( &tv_cur, NULL );
  43364. return( ( tv_cur.tv_sec - tv_init.tv_sec ) * 1000000
  43365. + ( tv_cur.tv_usec - tv_init.tv_usec ) );
  43366. }
  43367. #endif /* !HAVE_HARDCLOCK */
  43368. volatile int mbedtls_timing_alarmed = 0;
  43369. #if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32)
  43370. unsigned long mbedtls_timing_get_timer( struct mbedtls_timing_hr_time *val, int reset )
  43371. {
  43372. unsigned long delta;
  43373. LARGE_INTEGER offset, hfreq;
  43374. struct _hr_time *t = (struct _hr_time *) val;
  43375. QueryPerformanceCounter( &offset );
  43376. QueryPerformanceFrequency( &hfreq );
  43377. delta = (unsigned long)( ( 1000 *
  43378. ( offset.QuadPart - t->start.QuadPart ) ) /
  43379. hfreq.QuadPart );
  43380. if( reset )
  43381. QueryPerformanceCounter( &t->start );
  43382. return( delta );
  43383. }
  43384. /* It's OK to use a global because alarm() is supposed to be global anyway */
  43385. static DWORD alarmMs;
  43386. static DWORD WINAPI TimerProc( LPVOID TimerContext )
  43387. {
  43388. ((void) TimerContext);
  43389. Sleep( alarmMs );
  43390. mbedtls_timing_alarmed = 1;
  43391. return( TRUE );
  43392. }
  43393. void mbedtls_set_alarm( int seconds )
  43394. {
  43395. DWORD ThreadId;
  43396. mbedtls_timing_alarmed = 0;
  43397. alarmMs = seconds * 1000;
  43398. CloseHandle( CreateThread( NULL, 0, TimerProc, NULL, 0, &ThreadId ) );
  43399. }
  43400. #else /* _WIN32 && !EFIX64 && !EFI32 */
  43401. unsigned long mbedtls_timing_get_timer( struct mbedtls_timing_hr_time *val, int reset )
  43402. {
  43403. unsigned long delta;
  43404. struct timeval offset;
  43405. struct _hr_time *t = (struct _hr_time *) val;
  43406. gettimeofday( &offset, NULL );
  43407. if( reset )
  43408. {
  43409. t->start.tv_sec = offset.tv_sec;
  43410. t->start.tv_usec = offset.tv_usec;
  43411. return( 0 );
  43412. }
  43413. delta = ( offset.tv_sec - t->start.tv_sec ) * 1000
  43414. + ( offset.tv_usec - t->start.tv_usec ) / 1000;
  43415. return( delta );
  43416. }
  43417. static void sighandler( int signum )
  43418. {
  43419. mbedtls_timing_alarmed = 1;
  43420. signal( signum, sighandler );
  43421. }
  43422. void mbedtls_set_alarm( int seconds )
  43423. {
  43424. mbedtls_timing_alarmed = 0;
  43425. signal( SIGALRM, sighandler );
  43426. alarm( seconds );
  43427. }
  43428. #endif /* _WIN32 && !EFIX64 && !EFI32 */
  43429. /*
  43430. * Set delays to watch
  43431. */
  43432. void mbedtls_timing_set_delay( void *data, uint32_t int_ms, uint32_t fin_ms )
  43433. {
  43434. mbedtls_timing_delay_context *ctx = (mbedtls_timing_delay_context *) data;
  43435. ctx->int_ms = int_ms;
  43436. ctx->fin_ms = fin_ms;
  43437. if( fin_ms != 0 )
  43438. (void) mbedtls_timing_get_timer( &ctx->timer, 1 );
  43439. }
  43440. /*
  43441. * Get number of delays expired
  43442. */
  43443. int mbedtls_timing_get_delay( void *data )
  43444. {
  43445. mbedtls_timing_delay_context *ctx = (mbedtls_timing_delay_context *) data;
  43446. unsigned long elapsed_ms;
  43447. if( ctx->fin_ms == 0 )
  43448. return( -1 );
  43449. elapsed_ms = mbedtls_timing_get_timer( &ctx->timer, 0 );
  43450. if( elapsed_ms >= ctx->fin_ms )
  43451. return( 2 );
  43452. if( elapsed_ms >= ctx->int_ms )
  43453. return( 1 );
  43454. return( 0 );
  43455. }
  43456. #endif /* !MBEDTLS_TIMING_ALT */
  43457. #if defined(MBEDTLS_SELF_TEST)
  43458. /*
  43459. * Busy-waits for the given number of milliseconds.
  43460. * Used for testing mbedtls_timing_hardclock.
  43461. */
  43462. static void busy_msleep( unsigned long msec )
  43463. {
  43464. struct mbedtls_timing_hr_time hires;
  43465. unsigned long i = 0; /* for busy-waiting */
  43466. volatile unsigned long j; /* to prevent optimisation */
  43467. (void) mbedtls_timing_get_timer( &hires, 1 );
  43468. while( mbedtls_timing_get_timer( &hires, 0 ) < msec )
  43469. i++;
  43470. j = i;
  43471. (void) j;
  43472. }
  43473. #define FAIL do \
  43474. { \
  43475. if( verbose != 0 ) \
  43476. mbedtls_printf( "failed\n" ); \
  43477. \
  43478. return( 1 ); \
  43479. } while( 0 )
  43480. /*
  43481. * Checkup routine
  43482. *
  43483. * Warning: this is work in progress, some tests may not be reliable enough
  43484. * yet! False positives may happen.
  43485. */
  43486. int mbedtls_timing_self_test( int verbose )
  43487. {
  43488. unsigned long cycles, ratio;
  43489. unsigned long millisecs, secs;
  43490. int hardfail;
  43491. struct mbedtls_timing_hr_time hires;
  43492. uint32_t a, b;
  43493. mbedtls_timing_delay_context ctx;
  43494. if( verbose != 0 )
  43495. mbedtls_printf( " TIMING tests note: will take some time!\n" );
  43496. if( verbose != 0 )
  43497. mbedtls_printf( " TIMING test #1 (set_alarm / get_timer): " );
  43498. for( secs = 1; secs <= 3; secs++ )
  43499. {
  43500. (void) mbedtls_timing_get_timer( &hires, 1 );
  43501. mbedtls_set_alarm( (int) secs );
  43502. while( !mbedtls_timing_alarmed )
  43503. ;
  43504. millisecs = mbedtls_timing_get_timer( &hires, 0 );
  43505. /* For some reason on Windows it looks like alarm has an extra delay
  43506. * (maybe related to creating a new thread). Allow some room here. */
  43507. if( millisecs < 800 * secs || millisecs > 1200 * secs + 300 )
  43508. {
  43509. if( verbose != 0 )
  43510. mbedtls_printf( "failed\n" );
  43511. return( 1 );
  43512. }
  43513. }
  43514. if( verbose != 0 )
  43515. mbedtls_printf( "passed\n" );
  43516. if( verbose != 0 )
  43517. mbedtls_printf( " TIMING test #2 (set/get_delay ): " );
  43518. for( a = 200; a <= 400; a += 200 )
  43519. {
  43520. for( b = 200; b <= 400; b += 200 )
  43521. {
  43522. mbedtls_timing_set_delay( &ctx, a, a + b );
  43523. busy_msleep( a - a / 8 );
  43524. if( mbedtls_timing_get_delay( &ctx ) != 0 )
  43525. FAIL;
  43526. busy_msleep( a / 4 );
  43527. if( mbedtls_timing_get_delay( &ctx ) != 1 )
  43528. FAIL;
  43529. busy_msleep( b - a / 8 - b / 8 );
  43530. if( mbedtls_timing_get_delay( &ctx ) != 1 )
  43531. FAIL;
  43532. busy_msleep( b / 4 );
  43533. if( mbedtls_timing_get_delay( &ctx ) != 2 )
  43534. FAIL;
  43535. }
  43536. }
  43537. mbedtls_timing_set_delay( &ctx, 0, 0 );
  43538. busy_msleep( 200 );
  43539. if( mbedtls_timing_get_delay( &ctx ) != -1 )
  43540. FAIL;
  43541. if( verbose != 0 )
  43542. mbedtls_printf( "passed\n" );
  43543. if( verbose != 0 )
  43544. mbedtls_printf( " TIMING test #3 (hardclock / get_timer): " );
  43545. /*
  43546. * Allow one failure for possible counter wrapping.
  43547. * On a 4Ghz 32-bit machine the cycle counter wraps about once per second;
  43548. * since the whole test is about 10ms, it shouldn't happen twice in a row.
  43549. */
  43550. hardfail = 0;
  43551. hard_test:
  43552. if( hardfail > 1 )
  43553. {
  43554. if( verbose != 0 )
  43555. mbedtls_printf( "failed (ignored)\n" );
  43556. goto hard_test_done;
  43557. }
  43558. /* Get a reference ratio cycles/ms */
  43559. millisecs = 1;
  43560. cycles = mbedtls_timing_hardclock();
  43561. busy_msleep( millisecs );
  43562. cycles = mbedtls_timing_hardclock() - cycles;
  43563. ratio = cycles / millisecs;
  43564. /* Check that the ratio is mostly constant */
  43565. for( millisecs = 2; millisecs <= 4; millisecs++ )
  43566. {
  43567. cycles = mbedtls_timing_hardclock();
  43568. busy_msleep( millisecs );
  43569. cycles = mbedtls_timing_hardclock() - cycles;
  43570. /* Allow variation up to 20% */
  43571. if( cycles / millisecs < ratio - ratio / 5 ||
  43572. cycles / millisecs > ratio + ratio / 5 )
  43573. {
  43574. hardfail++;
  43575. goto hard_test;
  43576. }
  43577. }
  43578. if( verbose != 0 )
  43579. mbedtls_printf( "passed\n" );
  43580. hard_test_done:
  43581. if( verbose != 0 )
  43582. mbedtls_printf( "\n" );
  43583. return( 0 );
  43584. }
  43585. #endif /* MBEDTLS_SELF_TEST */
  43586. #endif /* MBEDTLS_TIMING_C */
  43587. /********* Start of file library/version.c ************/
  43588. /*
  43589. * Version information
  43590. *
  43591. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  43592. * SPDX-License-Identifier: Apache-2.0
  43593. *
  43594. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  43595. * not use this file except in compliance with the License.
  43596. * You may obtain a copy of the License at
  43597. *
  43598. * http://www.apache.org/licenses/LICENSE-2.0
  43599. *
  43600. * Unless required by applicable law or agreed to in writing, software
  43601. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  43602. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  43603. * See the License for the specific language governing permissions and
  43604. * limitations under the License.
  43605. *
  43606. * This file is part of mbed TLS (https://tls.mbed.org)
  43607. */
  43608. #if !defined(MBEDTLS_CONFIG_FILE)
  43609. #else
  43610. #endif
  43611. #if defined(MBEDTLS_VERSION_C)
  43612. #include <string.h>
  43613. unsigned int mbedtls_version_get_number()
  43614. {
  43615. return( MBEDTLS_VERSION_NUMBER );
  43616. }
  43617. void mbedtls_version_get_string( char *string )
  43618. {
  43619. memcpy( string, MBEDTLS_VERSION_STRING,
  43620. sizeof( MBEDTLS_VERSION_STRING ) );
  43621. }
  43622. void mbedtls_version_get_string_full( char *string )
  43623. {
  43624. memcpy( string, MBEDTLS_VERSION_STRING_FULL,
  43625. sizeof( MBEDTLS_VERSION_STRING_FULL ) );
  43626. }
  43627. #endif /* MBEDTLS_VERSION_C */
  43628. /********* Start of file library/version_features.c ************/
  43629. /*
  43630. * Version feature information
  43631. *
  43632. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  43633. * SPDX-License-Identifier: Apache-2.0
  43634. *
  43635. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  43636. * not use this file except in compliance with the License.
  43637. * You may obtain a copy of the License at
  43638. *
  43639. * http://www.apache.org/licenses/LICENSE-2.0
  43640. *
  43641. * Unless required by applicable law or agreed to in writing, software
  43642. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  43643. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  43644. * See the License for the specific language governing permissions and
  43645. * limitations under the License.
  43646. *
  43647. * This file is part of mbed TLS (https://tls.mbed.org)
  43648. */
  43649. #if !defined(MBEDTLS_CONFIG_FILE)
  43650. #else
  43651. #endif
  43652. #if defined(MBEDTLS_VERSION_C)
  43653. #include <string.h>
  43654. static const char *features[] = {
  43655. #if defined(MBEDTLS_VERSION_FEATURES)
  43656. #if defined(MBEDTLS_HAVE_ASM)
  43657. "MBEDTLS_HAVE_ASM",
  43658. #endif /* MBEDTLS_HAVE_ASM */
  43659. #if defined(MBEDTLS_HAVE_SSE2)
  43660. "MBEDTLS_HAVE_SSE2",
  43661. #endif /* MBEDTLS_HAVE_SSE2 */
  43662. #if defined(MBEDTLS_HAVE_TIME)
  43663. "MBEDTLS_HAVE_TIME",
  43664. #endif /* MBEDTLS_HAVE_TIME */
  43665. #if defined(MBEDTLS_HAVE_TIME_DATE)
  43666. "MBEDTLS_HAVE_TIME_DATE",
  43667. #endif /* MBEDTLS_HAVE_TIME_DATE */
  43668. #if defined(MBEDTLS_PLATFORM_MEMORY)
  43669. "MBEDTLS_PLATFORM_MEMORY",
  43670. #endif /* MBEDTLS_PLATFORM_MEMORY */
  43671. #if defined(MBEDTLS_PLATFORM_NO_STD_FUNCTIONS)
  43672. "MBEDTLS_PLATFORM_NO_STD_FUNCTIONS",
  43673. #endif /* MBEDTLS_PLATFORM_NO_STD_FUNCTIONS */
  43674. #if defined(MBEDTLS_PLATFORM_EXIT_ALT)
  43675. "MBEDTLS_PLATFORM_EXIT_ALT",
  43676. #endif /* MBEDTLS_PLATFORM_EXIT_ALT */
  43677. #if defined(MBEDTLS_PLATFORM_FPRINTF_ALT)
  43678. "MBEDTLS_PLATFORM_FPRINTF_ALT",
  43679. #endif /* MBEDTLS_PLATFORM_FPRINTF_ALT */
  43680. #if defined(MBEDTLS_PLATFORM_PRINTF_ALT)
  43681. "MBEDTLS_PLATFORM_PRINTF_ALT",
  43682. #endif /* MBEDTLS_PLATFORM_PRINTF_ALT */
  43683. #if defined(MBEDTLS_PLATFORM_SNPRINTF_ALT)
  43684. "MBEDTLS_PLATFORM_SNPRINTF_ALT",
  43685. #endif /* MBEDTLS_PLATFORM_SNPRINTF_ALT */
  43686. #if defined(MBEDTLS_DEPRECATED_WARNING)
  43687. "MBEDTLS_DEPRECATED_WARNING",
  43688. #endif /* MBEDTLS_DEPRECATED_WARNING */
  43689. #if defined(MBEDTLS_DEPRECATED_REMOVED)
  43690. "MBEDTLS_DEPRECATED_REMOVED",
  43691. #endif /* MBEDTLS_DEPRECATED_REMOVED */
  43692. #if defined(MBEDTLS_TIMING_ALT)
  43693. "MBEDTLS_TIMING_ALT",
  43694. #endif /* MBEDTLS_TIMING_ALT */
  43695. #if defined(MBEDTLS_AES_ALT)
  43696. "MBEDTLS_AES_ALT",
  43697. #endif /* MBEDTLS_AES_ALT */
  43698. #if defined(MBEDTLS_ARC4_ALT)
  43699. "MBEDTLS_ARC4_ALT",
  43700. #endif /* MBEDTLS_ARC4_ALT */
  43701. #if defined(MBEDTLS_BLOWFISH_ALT)
  43702. "MBEDTLS_BLOWFISH_ALT",
  43703. #endif /* MBEDTLS_BLOWFISH_ALT */
  43704. #if defined(MBEDTLS_CAMELLIA_ALT)
  43705. "MBEDTLS_CAMELLIA_ALT",
  43706. #endif /* MBEDTLS_CAMELLIA_ALT */
  43707. #if defined(MBEDTLS_DES_ALT)
  43708. "MBEDTLS_DES_ALT",
  43709. #endif /* MBEDTLS_DES_ALT */
  43710. #if defined(MBEDTLS_XTEA_ALT)
  43711. "MBEDTLS_XTEA_ALT",
  43712. #endif /* MBEDTLS_XTEA_ALT */
  43713. #if defined(MBEDTLS_MD2_ALT)
  43714. "MBEDTLS_MD2_ALT",
  43715. #endif /* MBEDTLS_MD2_ALT */
  43716. #if defined(MBEDTLS_MD4_ALT)
  43717. "MBEDTLS_MD4_ALT",
  43718. #endif /* MBEDTLS_MD4_ALT */
  43719. #if defined(MBEDTLS_MD5_ALT)
  43720. "MBEDTLS_MD5_ALT",
  43721. #endif /* MBEDTLS_MD5_ALT */
  43722. #if defined(MBEDTLS_RIPEMD160_ALT)
  43723. "MBEDTLS_RIPEMD160_ALT",
  43724. #endif /* MBEDTLS_RIPEMD160_ALT */
  43725. #if defined(MBEDTLS_SHA1_ALT)
  43726. "MBEDTLS_SHA1_ALT",
  43727. #endif /* MBEDTLS_SHA1_ALT */
  43728. #if defined(MBEDTLS_SHA256_ALT)
  43729. "MBEDTLS_SHA256_ALT",
  43730. #endif /* MBEDTLS_SHA256_ALT */
  43731. #if defined(MBEDTLS_SHA512_ALT)
  43732. "MBEDTLS_SHA512_ALT",
  43733. #endif /* MBEDTLS_SHA512_ALT */
  43734. #if defined(MBEDTLS_MD2_PROCESS_ALT)
  43735. "MBEDTLS_MD2_PROCESS_ALT",
  43736. #endif /* MBEDTLS_MD2_PROCESS_ALT */
  43737. #if defined(MBEDTLS_MD4_PROCESS_ALT)
  43738. "MBEDTLS_MD4_PROCESS_ALT",
  43739. #endif /* MBEDTLS_MD4_PROCESS_ALT */
  43740. #if defined(MBEDTLS_MD5_PROCESS_ALT)
  43741. "MBEDTLS_MD5_PROCESS_ALT",
  43742. #endif /* MBEDTLS_MD5_PROCESS_ALT */
  43743. #if defined(MBEDTLS_RIPEMD160_PROCESS_ALT)
  43744. "MBEDTLS_RIPEMD160_PROCESS_ALT",
  43745. #endif /* MBEDTLS_RIPEMD160_PROCESS_ALT */
  43746. #if defined(MBEDTLS_SHA1_PROCESS_ALT)
  43747. "MBEDTLS_SHA1_PROCESS_ALT",
  43748. #endif /* MBEDTLS_SHA1_PROCESS_ALT */
  43749. #if defined(MBEDTLS_SHA256_PROCESS_ALT)
  43750. "MBEDTLS_SHA256_PROCESS_ALT",
  43751. #endif /* MBEDTLS_SHA256_PROCESS_ALT */
  43752. #if defined(MBEDTLS_SHA512_PROCESS_ALT)
  43753. "MBEDTLS_SHA512_PROCESS_ALT",
  43754. #endif /* MBEDTLS_SHA512_PROCESS_ALT */
  43755. #if defined(MBEDTLS_DES_SETKEY_ALT)
  43756. "MBEDTLS_DES_SETKEY_ALT",
  43757. #endif /* MBEDTLS_DES_SETKEY_ALT */
  43758. #if defined(MBEDTLS_DES_CRYPT_ECB_ALT)
  43759. "MBEDTLS_DES_CRYPT_ECB_ALT",
  43760. #endif /* MBEDTLS_DES_CRYPT_ECB_ALT */
  43761. #if defined(MBEDTLS_DES3_CRYPT_ECB_ALT)
  43762. "MBEDTLS_DES3_CRYPT_ECB_ALT",
  43763. #endif /* MBEDTLS_DES3_CRYPT_ECB_ALT */
  43764. #if defined(MBEDTLS_AES_SETKEY_ENC_ALT)
  43765. "MBEDTLS_AES_SETKEY_ENC_ALT",
  43766. #endif /* MBEDTLS_AES_SETKEY_ENC_ALT */
  43767. #if defined(MBEDTLS_AES_SETKEY_DEC_ALT)
  43768. "MBEDTLS_AES_SETKEY_DEC_ALT",
  43769. #endif /* MBEDTLS_AES_SETKEY_DEC_ALT */
  43770. #if defined(MBEDTLS_AES_ENCRYPT_ALT)
  43771. "MBEDTLS_AES_ENCRYPT_ALT",
  43772. #endif /* MBEDTLS_AES_ENCRYPT_ALT */
  43773. #if defined(MBEDTLS_AES_DECRYPT_ALT)
  43774. "MBEDTLS_AES_DECRYPT_ALT",
  43775. #endif /* MBEDTLS_AES_DECRYPT_ALT */
  43776. #if defined(MBEDTLS_ENTROPY_HARDWARE_ALT)
  43777. "MBEDTLS_ENTROPY_HARDWARE_ALT",
  43778. #endif /* MBEDTLS_ENTROPY_HARDWARE_ALT */
  43779. #if defined(MBEDTLS_AES_ROM_TABLES)
  43780. "MBEDTLS_AES_ROM_TABLES",
  43781. #endif /* MBEDTLS_AES_ROM_TABLES */
  43782. #if defined(MBEDTLS_CAMELLIA_SMALL_MEMORY)
  43783. "MBEDTLS_CAMELLIA_SMALL_MEMORY",
  43784. #endif /* MBEDTLS_CAMELLIA_SMALL_MEMORY */
  43785. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  43786. "MBEDTLS_CIPHER_MODE_CBC",
  43787. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  43788. #if defined(MBEDTLS_CIPHER_MODE_CFB)
  43789. "MBEDTLS_CIPHER_MODE_CFB",
  43790. #endif /* MBEDTLS_CIPHER_MODE_CFB */
  43791. #if defined(MBEDTLS_CIPHER_MODE_CTR)
  43792. "MBEDTLS_CIPHER_MODE_CTR",
  43793. #endif /* MBEDTLS_CIPHER_MODE_CTR */
  43794. #if defined(MBEDTLS_CIPHER_NULL_CIPHER)
  43795. "MBEDTLS_CIPHER_NULL_CIPHER",
  43796. #endif /* MBEDTLS_CIPHER_NULL_CIPHER */
  43797. #if defined(MBEDTLS_CIPHER_PADDING_PKCS7)
  43798. "MBEDTLS_CIPHER_PADDING_PKCS7",
  43799. #endif /* MBEDTLS_CIPHER_PADDING_PKCS7 */
  43800. #if defined(MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS)
  43801. "MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS",
  43802. #endif /* MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS */
  43803. #if defined(MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN)
  43804. "MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN",
  43805. #endif /* MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN */
  43806. #if defined(MBEDTLS_CIPHER_PADDING_ZEROS)
  43807. "MBEDTLS_CIPHER_PADDING_ZEROS",
  43808. #endif /* MBEDTLS_CIPHER_PADDING_ZEROS */
  43809. #if defined(MBEDTLS_ENABLE_WEAK_CIPHERSUITES)
  43810. "MBEDTLS_ENABLE_WEAK_CIPHERSUITES",
  43811. #endif /* MBEDTLS_ENABLE_WEAK_CIPHERSUITES */
  43812. #if defined(MBEDTLS_REMOVE_ARC4_CIPHERSUITES)
  43813. "MBEDTLS_REMOVE_ARC4_CIPHERSUITES",
  43814. #endif /* MBEDTLS_REMOVE_ARC4_CIPHERSUITES */
  43815. #if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED)
  43816. "MBEDTLS_ECP_DP_SECP192R1_ENABLED",
  43817. #endif /* MBEDTLS_ECP_DP_SECP192R1_ENABLED */
  43818. #if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED)
  43819. "MBEDTLS_ECP_DP_SECP224R1_ENABLED",
  43820. #endif /* MBEDTLS_ECP_DP_SECP224R1_ENABLED */
  43821. #if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED)
  43822. "MBEDTLS_ECP_DP_SECP256R1_ENABLED",
  43823. #endif /* MBEDTLS_ECP_DP_SECP256R1_ENABLED */
  43824. #if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED)
  43825. "MBEDTLS_ECP_DP_SECP384R1_ENABLED",
  43826. #endif /* MBEDTLS_ECP_DP_SECP384R1_ENABLED */
  43827. #if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED)
  43828. "MBEDTLS_ECP_DP_SECP521R1_ENABLED",
  43829. #endif /* MBEDTLS_ECP_DP_SECP521R1_ENABLED */
  43830. #if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED)
  43831. "MBEDTLS_ECP_DP_SECP192K1_ENABLED",
  43832. #endif /* MBEDTLS_ECP_DP_SECP192K1_ENABLED */
  43833. #if defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED)
  43834. "MBEDTLS_ECP_DP_SECP224K1_ENABLED",
  43835. #endif /* MBEDTLS_ECP_DP_SECP224K1_ENABLED */
  43836. #if defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED)
  43837. "MBEDTLS_ECP_DP_SECP256K1_ENABLED",
  43838. #endif /* MBEDTLS_ECP_DP_SECP256K1_ENABLED */
  43839. #if defined(MBEDTLS_ECP_DP_BP256R1_ENABLED)
  43840. "MBEDTLS_ECP_DP_BP256R1_ENABLED",
  43841. #endif /* MBEDTLS_ECP_DP_BP256R1_ENABLED */
  43842. #if defined(MBEDTLS_ECP_DP_BP384R1_ENABLED)
  43843. "MBEDTLS_ECP_DP_BP384R1_ENABLED",
  43844. #endif /* MBEDTLS_ECP_DP_BP384R1_ENABLED */
  43845. #if defined(MBEDTLS_ECP_DP_BP512R1_ENABLED)
  43846. "MBEDTLS_ECP_DP_BP512R1_ENABLED",
  43847. #endif /* MBEDTLS_ECP_DP_BP512R1_ENABLED */
  43848. #if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED)
  43849. "MBEDTLS_ECP_DP_CURVE25519_ENABLED",
  43850. #endif /* MBEDTLS_ECP_DP_CURVE25519_ENABLED */
  43851. #if defined(MBEDTLS_ECP_NIST_OPTIM)
  43852. "MBEDTLS_ECP_NIST_OPTIM",
  43853. #endif /* MBEDTLS_ECP_NIST_OPTIM */
  43854. #if defined(MBEDTLS_ECDSA_DETERMINISTIC)
  43855. "MBEDTLS_ECDSA_DETERMINISTIC",
  43856. #endif /* MBEDTLS_ECDSA_DETERMINISTIC */
  43857. #if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
  43858. "MBEDTLS_KEY_EXCHANGE_PSK_ENABLED",
  43859. #endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */
  43860. #if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
  43861. "MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED",
  43862. #endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
  43863. #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
  43864. "MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED",
  43865. #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
  43866. #if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
  43867. "MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED",
  43868. #endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
  43869. #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
  43870. "MBEDTLS_KEY_EXCHANGE_RSA_ENABLED",
  43871. #endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
  43872. #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED)
  43873. "MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED",
  43874. #endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */
  43875. #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
  43876. "MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED",
  43877. #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
  43878. #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
  43879. "MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED",
  43880. #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
  43881. #if defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
  43882. "MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED",
  43883. #endif /* MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
  43884. #if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED)
  43885. "MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED",
  43886. #endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED */
  43887. #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
  43888. "MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED",
  43889. #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
  43890. #if defined(MBEDTLS_PK_PARSE_EC_EXTENDED)
  43891. "MBEDTLS_PK_PARSE_EC_EXTENDED",
  43892. #endif /* MBEDTLS_PK_PARSE_EC_EXTENDED */
  43893. #if defined(MBEDTLS_ERROR_STRERROR_DUMMY)
  43894. "MBEDTLS_ERROR_STRERROR_DUMMY",
  43895. #endif /* MBEDTLS_ERROR_STRERROR_DUMMY */
  43896. #if defined(MBEDTLS_GENPRIME)
  43897. "MBEDTLS_GENPRIME",
  43898. #endif /* MBEDTLS_GENPRIME */
  43899. #if defined(MBEDTLS_FS_IO)
  43900. "MBEDTLS_FS_IO",
  43901. #endif /* MBEDTLS_FS_IO */
  43902. #if defined(MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES)
  43903. "MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES",
  43904. #endif /* MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES */
  43905. #if defined(MBEDTLS_NO_PLATFORM_ENTROPY)
  43906. "MBEDTLS_NO_PLATFORM_ENTROPY",
  43907. #endif /* MBEDTLS_NO_PLATFORM_ENTROPY */
  43908. #if defined(MBEDTLS_ENTROPY_FORCE_SHA256)
  43909. "MBEDTLS_ENTROPY_FORCE_SHA256",
  43910. #endif /* MBEDTLS_ENTROPY_FORCE_SHA256 */
  43911. #if defined(MBEDTLS_MEMORY_DEBUG)
  43912. "MBEDTLS_MEMORY_DEBUG",
  43913. #endif /* MBEDTLS_MEMORY_DEBUG */
  43914. #if defined(MBEDTLS_MEMORY_BACKTRACE)
  43915. "MBEDTLS_MEMORY_BACKTRACE",
  43916. #endif /* MBEDTLS_MEMORY_BACKTRACE */
  43917. #if defined(MBEDTLS_PK_RSA_ALT_SUPPORT)
  43918. "MBEDTLS_PK_RSA_ALT_SUPPORT",
  43919. #endif /* MBEDTLS_PK_RSA_ALT_SUPPORT */
  43920. #if defined(MBEDTLS_PKCS1_V15)
  43921. "MBEDTLS_PKCS1_V15",
  43922. #endif /* MBEDTLS_PKCS1_V15 */
  43923. #if defined(MBEDTLS_PKCS1_V21)
  43924. "MBEDTLS_PKCS1_V21",
  43925. #endif /* MBEDTLS_PKCS1_V21 */
  43926. #if defined(MBEDTLS_RSA_NO_CRT)
  43927. "MBEDTLS_RSA_NO_CRT",
  43928. #endif /* MBEDTLS_RSA_NO_CRT */
  43929. #if defined(MBEDTLS_SELF_TEST)
  43930. "MBEDTLS_SELF_TEST",
  43931. #endif /* MBEDTLS_SELF_TEST */
  43932. #if defined(MBEDTLS_SHA256_SMALLER)
  43933. "MBEDTLS_SHA256_SMALLER",
  43934. #endif /* MBEDTLS_SHA256_SMALLER */
  43935. #if defined(MBEDTLS_SSL_AEAD_RANDOM_IV)
  43936. "MBEDTLS_SSL_AEAD_RANDOM_IV",
  43937. #endif /* MBEDTLS_SSL_AEAD_RANDOM_IV */
  43938. #if defined(MBEDTLS_SSL_ALL_ALERT_MESSAGES)
  43939. "MBEDTLS_SSL_ALL_ALERT_MESSAGES",
  43940. #endif /* MBEDTLS_SSL_ALL_ALERT_MESSAGES */
  43941. #if defined(MBEDTLS_SSL_DEBUG_ALL)
  43942. "MBEDTLS_SSL_DEBUG_ALL",
  43943. #endif /* MBEDTLS_SSL_DEBUG_ALL */
  43944. #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
  43945. "MBEDTLS_SSL_ENCRYPT_THEN_MAC",
  43946. #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
  43947. #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
  43948. "MBEDTLS_SSL_EXTENDED_MASTER_SECRET",
  43949. #endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
  43950. #if defined(MBEDTLS_SSL_FALLBACK_SCSV)
  43951. "MBEDTLS_SSL_FALLBACK_SCSV",
  43952. #endif /* MBEDTLS_SSL_FALLBACK_SCSV */
  43953. #if defined(MBEDTLS_SSL_HW_RECORD_ACCEL)
  43954. "MBEDTLS_SSL_HW_RECORD_ACCEL",
  43955. #endif /* MBEDTLS_SSL_HW_RECORD_ACCEL */
  43956. #if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING)
  43957. "MBEDTLS_SSL_CBC_RECORD_SPLITTING",
  43958. #endif /* MBEDTLS_SSL_CBC_RECORD_SPLITTING */
  43959. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  43960. "MBEDTLS_SSL_RENEGOTIATION",
  43961. #endif /* MBEDTLS_SSL_RENEGOTIATION */
  43962. #if defined(MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO)
  43963. "MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO",
  43964. #endif /* MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO */
  43965. #if defined(MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE)
  43966. "MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE",
  43967. #endif /* MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE */
  43968. #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
  43969. "MBEDTLS_SSL_MAX_FRAGMENT_LENGTH",
  43970. #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
  43971. #if defined(MBEDTLS_SSL_PROTO_SSL3)
  43972. "MBEDTLS_SSL_PROTO_SSL3",
  43973. #endif /* MBEDTLS_SSL_PROTO_SSL3 */
  43974. #if defined(MBEDTLS_SSL_PROTO_TLS1)
  43975. "MBEDTLS_SSL_PROTO_TLS1",
  43976. #endif /* MBEDTLS_SSL_PROTO_TLS1 */
  43977. #if defined(MBEDTLS_SSL_PROTO_TLS1_1)
  43978. "MBEDTLS_SSL_PROTO_TLS1_1",
  43979. #endif /* MBEDTLS_SSL_PROTO_TLS1_1 */
  43980. #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
  43981. "MBEDTLS_SSL_PROTO_TLS1_2",
  43982. #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
  43983. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  43984. "MBEDTLS_SSL_PROTO_DTLS",
  43985. #endif /* MBEDTLS_SSL_PROTO_DTLS */
  43986. #if defined(MBEDTLS_SSL_ALPN)
  43987. "MBEDTLS_SSL_ALPN",
  43988. #endif /* MBEDTLS_SSL_ALPN */
  43989. #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
  43990. "MBEDTLS_SSL_DTLS_ANTI_REPLAY",
  43991. #endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY */
  43992. #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
  43993. "MBEDTLS_SSL_DTLS_HELLO_VERIFY",
  43994. #endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
  43995. #if defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE)
  43996. "MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE",
  43997. #endif /* MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE */
  43998. #if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT)
  43999. "MBEDTLS_SSL_DTLS_BADMAC_LIMIT",
  44000. #endif /* MBEDTLS_SSL_DTLS_BADMAC_LIMIT */
  44001. #if defined(MBEDTLS_SSL_SESSION_TICKETS)
  44002. "MBEDTLS_SSL_SESSION_TICKETS",
  44003. #endif /* MBEDTLS_SSL_SESSION_TICKETS */
  44004. #if defined(MBEDTLS_SSL_EXPORT_KEYS)
  44005. "MBEDTLS_SSL_EXPORT_KEYS",
  44006. #endif /* MBEDTLS_SSL_EXPORT_KEYS */
  44007. #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
  44008. "MBEDTLS_SSL_SERVER_NAME_INDICATION",
  44009. #endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
  44010. #if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
  44011. "MBEDTLS_SSL_TRUNCATED_HMAC",
  44012. #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
  44013. #if defined(MBEDTLS_THREADING_ALT)
  44014. "MBEDTLS_THREADING_ALT",
  44015. #endif /* MBEDTLS_THREADING_ALT */
  44016. #if defined(MBEDTLS_THREADING_PTHREAD)
  44017. "MBEDTLS_THREADING_PTHREAD",
  44018. #endif /* MBEDTLS_THREADING_PTHREAD */
  44019. #if defined(MBEDTLS_VERSION_FEATURES)
  44020. "MBEDTLS_VERSION_FEATURES",
  44021. #endif /* MBEDTLS_VERSION_FEATURES */
  44022. #if defined(MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3)
  44023. "MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3",
  44024. #endif /* MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3 */
  44025. #if defined(MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION)
  44026. "MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION",
  44027. #endif /* MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION */
  44028. #if defined(MBEDTLS_X509_CHECK_KEY_USAGE)
  44029. "MBEDTLS_X509_CHECK_KEY_USAGE",
  44030. #endif /* MBEDTLS_X509_CHECK_KEY_USAGE */
  44031. #if defined(MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE)
  44032. "MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE",
  44033. #endif /* MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE */
  44034. #if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT)
  44035. "MBEDTLS_X509_RSASSA_PSS_SUPPORT",
  44036. #endif /* MBEDTLS_X509_RSASSA_PSS_SUPPORT */
  44037. #if defined(MBEDTLS_ZLIB_SUPPORT)
  44038. "MBEDTLS_ZLIB_SUPPORT",
  44039. #endif /* MBEDTLS_ZLIB_SUPPORT */
  44040. #if defined(MBEDTLS_AESNI_C)
  44041. "MBEDTLS_AESNI_C",
  44042. #endif /* MBEDTLS_AESNI_C */
  44043. #if defined(MBEDTLS_AES_C)
  44044. "MBEDTLS_AES_C",
  44045. #endif /* MBEDTLS_AES_C */
  44046. #if defined(MBEDTLS_ARC4_C)
  44047. "MBEDTLS_ARC4_C",
  44048. #endif /* MBEDTLS_ARC4_C */
  44049. #if defined(MBEDTLS_ASN1_PARSE_C)
  44050. "MBEDTLS_ASN1_PARSE_C",
  44051. #endif /* MBEDTLS_ASN1_PARSE_C */
  44052. #if defined(MBEDTLS_ASN1_WRITE_C)
  44053. "MBEDTLS_ASN1_WRITE_C",
  44054. #endif /* MBEDTLS_ASN1_WRITE_C */
  44055. #if defined(MBEDTLS_BASE64_C)
  44056. "MBEDTLS_BASE64_C",
  44057. #endif /* MBEDTLS_BASE64_C */
  44058. #if defined(MBEDTLS_BIGNUM_C)
  44059. "MBEDTLS_BIGNUM_C",
  44060. #endif /* MBEDTLS_BIGNUM_C */
  44061. #if defined(MBEDTLS_BLOWFISH_C)
  44062. "MBEDTLS_BLOWFISH_C",
  44063. #endif /* MBEDTLS_BLOWFISH_C */
  44064. #if defined(MBEDTLS_CAMELLIA_C)
  44065. "MBEDTLS_CAMELLIA_C",
  44066. #endif /* MBEDTLS_CAMELLIA_C */
  44067. #if defined(MBEDTLS_CCM_C)
  44068. "MBEDTLS_CCM_C",
  44069. #endif /* MBEDTLS_CCM_C */
  44070. #if defined(MBEDTLS_CERTS_C)
  44071. "MBEDTLS_CERTS_C",
  44072. #endif /* MBEDTLS_CERTS_C */
  44073. #if defined(MBEDTLS_CIPHER_C)
  44074. "MBEDTLS_CIPHER_C",
  44075. #endif /* MBEDTLS_CIPHER_C */
  44076. #if defined(MBEDTLS_CTR_DRBG_C)
  44077. "MBEDTLS_CTR_DRBG_C",
  44078. #endif /* MBEDTLS_CTR_DRBG_C */
  44079. #if defined(MBEDTLS_DEBUG_C)
  44080. "MBEDTLS_DEBUG_C",
  44081. #endif /* MBEDTLS_DEBUG_C */
  44082. #if defined(MBEDTLS_DES_C)
  44083. "MBEDTLS_DES_C",
  44084. #endif /* MBEDTLS_DES_C */
  44085. #if defined(MBEDTLS_DHM_C)
  44086. "MBEDTLS_DHM_C",
  44087. #endif /* MBEDTLS_DHM_C */
  44088. #if defined(MBEDTLS_ECDH_C)
  44089. "MBEDTLS_ECDH_C",
  44090. #endif /* MBEDTLS_ECDH_C */
  44091. #if defined(MBEDTLS_ECDSA_C)
  44092. "MBEDTLS_ECDSA_C",
  44093. #endif /* MBEDTLS_ECDSA_C */
  44094. #if defined(MBEDTLS_ECJPAKE_C)
  44095. "MBEDTLS_ECJPAKE_C",
  44096. #endif /* MBEDTLS_ECJPAKE_C */
  44097. #if defined(MBEDTLS_ECP_C)
  44098. "MBEDTLS_ECP_C",
  44099. #endif /* MBEDTLS_ECP_C */
  44100. #if defined(MBEDTLS_ENTROPY_C)
  44101. "MBEDTLS_ENTROPY_C",
  44102. #endif /* MBEDTLS_ENTROPY_C */
  44103. #if defined(MBEDTLS_ERROR_C)
  44104. "MBEDTLS_ERROR_C",
  44105. #endif /* MBEDTLS_ERROR_C */
  44106. #if defined(MBEDTLS_GCM_C)
  44107. "MBEDTLS_GCM_C",
  44108. #endif /* MBEDTLS_GCM_C */
  44109. #if defined(MBEDTLS_HAVEGE_C)
  44110. "MBEDTLS_HAVEGE_C",
  44111. #endif /* MBEDTLS_HAVEGE_C */
  44112. #if defined(MBEDTLS_HMAC_DRBG_C)
  44113. "MBEDTLS_HMAC_DRBG_C",
  44114. #endif /* MBEDTLS_HMAC_DRBG_C */
  44115. #if defined(MBEDTLS_MD_C)
  44116. "MBEDTLS_MD_C",
  44117. #endif /* MBEDTLS_MD_C */
  44118. #if defined(MBEDTLS_MD2_C)
  44119. "MBEDTLS_MD2_C",
  44120. #endif /* MBEDTLS_MD2_C */
  44121. #if defined(MBEDTLS_MD4_C)
  44122. "MBEDTLS_MD4_C",
  44123. #endif /* MBEDTLS_MD4_C */
  44124. #if defined(MBEDTLS_MD5_C)
  44125. "MBEDTLS_MD5_C",
  44126. #endif /* MBEDTLS_MD5_C */
  44127. #if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C)
  44128. "MBEDTLS_MEMORY_BUFFER_ALLOC_C",
  44129. #endif /* MBEDTLS_MEMORY_BUFFER_ALLOC_C */
  44130. #if defined(MBEDTLS_NET_C)
  44131. "MBEDTLS_NET_C",
  44132. #endif /* MBEDTLS_NET_C */
  44133. #if defined(MBEDTLS_OID_C)
  44134. "MBEDTLS_OID_C",
  44135. #endif /* MBEDTLS_OID_C */
  44136. #if defined(MBEDTLS_PADLOCK_C)
  44137. "MBEDTLS_PADLOCK_C",
  44138. #endif /* MBEDTLS_PADLOCK_C */
  44139. #if defined(MBEDTLS_PEM_PARSE_C)
  44140. "MBEDTLS_PEM_PARSE_C",
  44141. #endif /* MBEDTLS_PEM_PARSE_C */
  44142. #if defined(MBEDTLS_PEM_WRITE_C)
  44143. "MBEDTLS_PEM_WRITE_C",
  44144. #endif /* MBEDTLS_PEM_WRITE_C */
  44145. #if defined(MBEDTLS_PK_C)
  44146. "MBEDTLS_PK_C",
  44147. #endif /* MBEDTLS_PK_C */
  44148. #if defined(MBEDTLS_PK_PARSE_C)
  44149. "MBEDTLS_PK_PARSE_C",
  44150. #endif /* MBEDTLS_PK_PARSE_C */
  44151. #if defined(MBEDTLS_PK_WRITE_C)
  44152. "MBEDTLS_PK_WRITE_C",
  44153. #endif /* MBEDTLS_PK_WRITE_C */
  44154. #if defined(MBEDTLS_PKCS5_C)
  44155. "MBEDTLS_PKCS5_C",
  44156. #endif /* MBEDTLS_PKCS5_C */
  44157. #if defined(MBEDTLS_PKCS11_C)
  44158. "MBEDTLS_PKCS11_C",
  44159. #endif /* MBEDTLS_PKCS11_C */
  44160. #if defined(MBEDTLS_PKCS12_C)
  44161. "MBEDTLS_PKCS12_C",
  44162. #endif /* MBEDTLS_PKCS12_C */
  44163. #if defined(MBEDTLS_PLATFORM_C)
  44164. "MBEDTLS_PLATFORM_C",
  44165. #endif /* MBEDTLS_PLATFORM_C */
  44166. #if defined(MBEDTLS_RIPEMD160_C)
  44167. "MBEDTLS_RIPEMD160_C",
  44168. #endif /* MBEDTLS_RIPEMD160_C */
  44169. #if defined(MBEDTLS_RSA_C)
  44170. "MBEDTLS_RSA_C",
  44171. #endif /* MBEDTLS_RSA_C */
  44172. #if defined(MBEDTLS_SHA1_C)
  44173. "MBEDTLS_SHA1_C",
  44174. #endif /* MBEDTLS_SHA1_C */
  44175. #if defined(MBEDTLS_SHA256_C)
  44176. "MBEDTLS_SHA256_C",
  44177. #endif /* MBEDTLS_SHA256_C */
  44178. #if defined(MBEDTLS_SHA512_C)
  44179. "MBEDTLS_SHA512_C",
  44180. #endif /* MBEDTLS_SHA512_C */
  44181. #if defined(MBEDTLS_SSL_CACHE_C)
  44182. "MBEDTLS_SSL_CACHE_C",
  44183. #endif /* MBEDTLS_SSL_CACHE_C */
  44184. #if defined(MBEDTLS_SSL_COOKIE_C)
  44185. "MBEDTLS_SSL_COOKIE_C",
  44186. #endif /* MBEDTLS_SSL_COOKIE_C */
  44187. #if defined(MBEDTLS_SSL_TICKET_C)
  44188. "MBEDTLS_SSL_TICKET_C",
  44189. #endif /* MBEDTLS_SSL_TICKET_C */
  44190. #if defined(MBEDTLS_SSL_CLI_C)
  44191. "MBEDTLS_SSL_CLI_C",
  44192. #endif /* MBEDTLS_SSL_CLI_C */
  44193. #if defined(MBEDTLS_SSL_SRV_C)
  44194. "MBEDTLS_SSL_SRV_C",
  44195. #endif /* MBEDTLS_SSL_SRV_C */
  44196. #if defined(MBEDTLS_SSL_TLS_C)
  44197. "MBEDTLS_SSL_TLS_C",
  44198. #endif /* MBEDTLS_SSL_TLS_C */
  44199. #if defined(MBEDTLS_THREADING_C)
  44200. "MBEDTLS_THREADING_C",
  44201. #endif /* MBEDTLS_THREADING_C */
  44202. #if defined(MBEDTLS_TIMING_C)
  44203. "MBEDTLS_TIMING_C",
  44204. #endif /* MBEDTLS_TIMING_C */
  44205. #if defined(MBEDTLS_VERSION_C)
  44206. "MBEDTLS_VERSION_C",
  44207. #endif /* MBEDTLS_VERSION_C */
  44208. #if defined(MBEDTLS_X509_USE_C)
  44209. "MBEDTLS_X509_USE_C",
  44210. #endif /* MBEDTLS_X509_USE_C */
  44211. #if defined(MBEDTLS_X509_CRT_PARSE_C)
  44212. "MBEDTLS_X509_CRT_PARSE_C",
  44213. #endif /* MBEDTLS_X509_CRT_PARSE_C */
  44214. #if defined(MBEDTLS_X509_CRL_PARSE_C)
  44215. "MBEDTLS_X509_CRL_PARSE_C",
  44216. #endif /* MBEDTLS_X509_CRL_PARSE_C */
  44217. #if defined(MBEDTLS_X509_CSR_PARSE_C)
  44218. "MBEDTLS_X509_CSR_PARSE_C",
  44219. #endif /* MBEDTLS_X509_CSR_PARSE_C */
  44220. #if defined(MBEDTLS_X509_CREATE_C)
  44221. "MBEDTLS_X509_CREATE_C",
  44222. #endif /* MBEDTLS_X509_CREATE_C */
  44223. #if defined(MBEDTLS_X509_CRT_WRITE_C)
  44224. "MBEDTLS_X509_CRT_WRITE_C",
  44225. #endif /* MBEDTLS_X509_CRT_WRITE_C */
  44226. #if defined(MBEDTLS_X509_CSR_WRITE_C)
  44227. "MBEDTLS_X509_CSR_WRITE_C",
  44228. #endif /* MBEDTLS_X509_CSR_WRITE_C */
  44229. #if defined(MBEDTLS_XTEA_C)
  44230. "MBEDTLS_XTEA_C",
  44231. #endif /* MBEDTLS_XTEA_C */
  44232. #endif /* MBEDTLS_VERSION_FEATURES */
  44233. NULL
  44234. };
  44235. int mbedtls_version_check_feature( const char *feature )
  44236. {
  44237. const char **idx = features;
  44238. if( *idx == NULL )
  44239. return( -2 );
  44240. if( feature == NULL )
  44241. return( -1 );
  44242. while( *idx != NULL )
  44243. {
  44244. if( !strcmp( *idx, feature ) )
  44245. return( 0 );
  44246. idx++;
  44247. }
  44248. return( -1 );
  44249. }
  44250. #endif /* MBEDTLS_VERSION_C */
  44251. /********* Start of file library/x509.c ************/
  44252. /*
  44253. * X.509 common functions for parsing and verification
  44254. *
  44255. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  44256. * SPDX-License-Identifier: Apache-2.0
  44257. *
  44258. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  44259. * not use this file except in compliance with the License.
  44260. * You may obtain a copy of the License at
  44261. *
  44262. * http://www.apache.org/licenses/LICENSE-2.0
  44263. *
  44264. * Unless required by applicable law or agreed to in writing, software
  44265. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  44266. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  44267. * See the License for the specific language governing permissions and
  44268. * limitations under the License.
  44269. *
  44270. * This file is part of mbed TLS (https://tls.mbed.org)
  44271. */
  44272. /*
  44273. * The ITU-T X.509 standard defines a certificate format for PKI.
  44274. *
  44275. * http://www.ietf.org/rfc/rfc5280.txt (Certificates and CRLs)
  44276. * http://www.ietf.org/rfc/rfc3279.txt (Alg IDs for CRLs)
  44277. * http://www.ietf.org/rfc/rfc2986.txt (CSRs, aka PKCS#10)
  44278. *
  44279. * http://www.itu.int/ITU-T/studygroups/com17/languages/X.680-0207.pdf
  44280. * http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf
  44281. */
  44282. #if !defined(MBEDTLS_CONFIG_FILE)
  44283. #else
  44284. #endif
  44285. #if defined(MBEDTLS_X509_USE_C)
  44286. #include <stdio.h>
  44287. #include <string.h>
  44288. #if defined(MBEDTLS_PEM_PARSE_C)
  44289. #endif
  44290. #if defined(MBEDTLS_PLATFORM_C)
  44291. #else
  44292. #include <stdio.h>
  44293. #include <stdlib.h>
  44294. #define mbedtls_free free
  44295. #define mbedtls_calloc calloc
  44296. #define mbedtls_printf printf
  44297. #define mbedtls_snprintf snprintf
  44298. #endif
  44299. #if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32)
  44300. #include <windows.h>
  44301. #else
  44302. #include <time.h>
  44303. #endif
  44304. #if defined(MBEDTLS_FS_IO)
  44305. #include <stdio.h>
  44306. #if !defined(_WIN32)
  44307. #include <sys/types.h>
  44308. #include <sys/stat.h>
  44309. #include <dirent.h>
  44310. #endif
  44311. #endif
  44312. #define CHECK(code) if( ( ret = code ) != 0 ){ return( ret ); }
  44313. /*
  44314. * CertificateSerialNumber ::= INTEGER
  44315. */
  44316. int mbedtls_x509_get_serial( unsigned char **p, const unsigned char *end,
  44317. mbedtls_x509_buf *serial )
  44318. {
  44319. int ret;
  44320. if( ( end - *p ) < 1 )
  44321. return( MBEDTLS_ERR_X509_INVALID_SERIAL +
  44322. MBEDTLS_ERR_ASN1_OUT_OF_DATA );
  44323. if( **p != ( MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_PRIMITIVE | 2 ) &&
  44324. **p != MBEDTLS_ASN1_INTEGER )
  44325. return( MBEDTLS_ERR_X509_INVALID_SERIAL +
  44326. MBEDTLS_ERR_ASN1_UNEXPECTED_TAG );
  44327. serial->tag = *(*p)++;
  44328. if( ( ret = mbedtls_asn1_get_len( p, end, &serial->len ) ) != 0 )
  44329. return( MBEDTLS_ERR_X509_INVALID_SERIAL + ret );
  44330. serial->p = *p;
  44331. *p += serial->len;
  44332. return( 0 );
  44333. }
  44334. /* Get an algorithm identifier without parameters (eg for signatures)
  44335. *
  44336. * AlgorithmIdentifier ::= SEQUENCE {
  44337. * algorithm OBJECT IDENTIFIER,
  44338. * parameters ANY DEFINED BY algorithm OPTIONAL }
  44339. */
  44340. int mbedtls_x509_get_alg_null( unsigned char **p, const unsigned char *end,
  44341. mbedtls_x509_buf *alg )
  44342. {
  44343. int ret;
  44344. if( ( ret = mbedtls_asn1_get_alg_null( p, end, alg ) ) != 0 )
  44345. return( MBEDTLS_ERR_X509_INVALID_ALG + ret );
  44346. return( 0 );
  44347. }
  44348. /*
  44349. * Parse an algorithm identifier with (optional) paramaters
  44350. */
  44351. int mbedtls_x509_get_alg( unsigned char **p, const unsigned char *end,
  44352. mbedtls_x509_buf *alg, mbedtls_x509_buf *params )
  44353. {
  44354. int ret;
  44355. if( ( ret = mbedtls_asn1_get_alg( p, end, alg, params ) ) != 0 )
  44356. return( MBEDTLS_ERR_X509_INVALID_ALG + ret );
  44357. return( 0 );
  44358. }
  44359. #if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT)
  44360. /*
  44361. * HashAlgorithm ::= AlgorithmIdentifier
  44362. *
  44363. * AlgorithmIdentifier ::= SEQUENCE {
  44364. * algorithm OBJECT IDENTIFIER,
  44365. * parameters ANY DEFINED BY algorithm OPTIONAL }
  44366. *
  44367. * For HashAlgorithm, parameters MUST be NULL or absent.
  44368. */
  44369. static int x509_get_hash_alg( const mbedtls_x509_buf *alg, mbedtls_md_type_t *md_alg )
  44370. {
  44371. int ret;
  44372. unsigned char *p;
  44373. const unsigned char *end;
  44374. mbedtls_x509_buf md_oid;
  44375. size_t len;
  44376. /* Make sure we got a SEQUENCE and setup bounds */
  44377. if( alg->tag != ( MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) )
  44378. return( MBEDTLS_ERR_X509_INVALID_ALG +
  44379. MBEDTLS_ERR_ASN1_UNEXPECTED_TAG );
  44380. p = (unsigned char *) alg->p;
  44381. end = p + alg->len;
  44382. if( p >= end )
  44383. return( MBEDTLS_ERR_X509_INVALID_ALG +
  44384. MBEDTLS_ERR_ASN1_OUT_OF_DATA );
  44385. /* Parse md_oid */
  44386. md_oid.tag = *p;
  44387. if( ( ret = mbedtls_asn1_get_tag( &p, end, &md_oid.len, MBEDTLS_ASN1_OID ) ) != 0 )
  44388. return( MBEDTLS_ERR_X509_INVALID_ALG + ret );
  44389. md_oid.p = p;
  44390. p += md_oid.len;
  44391. /* Get md_alg from md_oid */
  44392. if( ( ret = mbedtls_oid_get_md_alg( &md_oid, md_alg ) ) != 0 )
  44393. return( MBEDTLS_ERR_X509_INVALID_ALG + ret );
  44394. /* Make sure params is absent of NULL */
  44395. if( p == end )
  44396. return( 0 );
  44397. if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_NULL ) ) != 0 || len != 0 )
  44398. return( MBEDTLS_ERR_X509_INVALID_ALG + ret );
  44399. if( p != end )
  44400. return( MBEDTLS_ERR_X509_INVALID_ALG +
  44401. MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
  44402. return( 0 );
  44403. }
  44404. /*
  44405. * RSASSA-PSS-params ::= SEQUENCE {
  44406. * hashAlgorithm [0] HashAlgorithm DEFAULT sha1Identifier,
  44407. * maskGenAlgorithm [1] MaskGenAlgorithm DEFAULT mgf1SHA1Identifier,
  44408. * saltLength [2] INTEGER DEFAULT 20,
  44409. * trailerField [3] INTEGER DEFAULT 1 }
  44410. * -- Note that the tags in this Sequence are explicit.
  44411. *
  44412. * RFC 4055 (which defines use of RSASSA-PSS in PKIX) states that the value
  44413. * of trailerField MUST be 1, and PKCS#1 v2.2 doesn't even define any other
  44414. * option. Enfore this at parsing time.
  44415. */
  44416. int mbedtls_x509_get_rsassa_pss_params( const mbedtls_x509_buf *params,
  44417. mbedtls_md_type_t *md_alg, mbedtls_md_type_t *mgf_md,
  44418. int *salt_len )
  44419. {
  44420. int ret;
  44421. unsigned char *p;
  44422. const unsigned char *end, *end2;
  44423. size_t len;
  44424. mbedtls_x509_buf alg_id, alg_params;
  44425. /* First set everything to defaults */
  44426. *md_alg = MBEDTLS_MD_SHA1;
  44427. *mgf_md = MBEDTLS_MD_SHA1;
  44428. *salt_len = 20;
  44429. /* Make sure params is a SEQUENCE and setup bounds */
  44430. if( params->tag != ( MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) )
  44431. return( MBEDTLS_ERR_X509_INVALID_ALG +
  44432. MBEDTLS_ERR_ASN1_UNEXPECTED_TAG );
  44433. p = (unsigned char *) params->p;
  44434. end = p + params->len;
  44435. if( p == end )
  44436. return( 0 );
  44437. /*
  44438. * HashAlgorithm
  44439. */
  44440. if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,
  44441. MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | 0 ) ) == 0 )
  44442. {
  44443. end2 = p + len;
  44444. /* HashAlgorithm ::= AlgorithmIdentifier (without parameters) */
  44445. if( ( ret = mbedtls_x509_get_alg_null( &p, end2, &alg_id ) ) != 0 )
  44446. return( ret );
  44447. if( ( ret = mbedtls_oid_get_md_alg( &alg_id, md_alg ) ) != 0 )
  44448. return( MBEDTLS_ERR_X509_INVALID_ALG + ret );
  44449. if( p != end2 )
  44450. return( MBEDTLS_ERR_X509_INVALID_ALG +
  44451. MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
  44452. }
  44453. else if( ret != MBEDTLS_ERR_ASN1_UNEXPECTED_TAG )
  44454. return( MBEDTLS_ERR_X509_INVALID_ALG + ret );
  44455. if( p == end )
  44456. return( 0 );
  44457. /*
  44458. * MaskGenAlgorithm
  44459. */
  44460. if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,
  44461. MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | 1 ) ) == 0 )
  44462. {
  44463. end2 = p + len;
  44464. /* MaskGenAlgorithm ::= AlgorithmIdentifier (params = HashAlgorithm) */
  44465. if( ( ret = mbedtls_x509_get_alg( &p, end2, &alg_id, &alg_params ) ) != 0 )
  44466. return( ret );
  44467. /* Only MFG1 is recognised for now */
  44468. if( MBEDTLS_OID_CMP( MBEDTLS_OID_MGF1, &alg_id ) != 0 )
  44469. return( MBEDTLS_ERR_X509_FEATURE_UNAVAILABLE +
  44470. MBEDTLS_ERR_OID_NOT_FOUND );
  44471. /* Parse HashAlgorithm */
  44472. if( ( ret = x509_get_hash_alg( &alg_params, mgf_md ) ) != 0 )
  44473. return( ret );
  44474. if( p != end2 )
  44475. return( MBEDTLS_ERR_X509_INVALID_ALG +
  44476. MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
  44477. }
  44478. else if( ret != MBEDTLS_ERR_ASN1_UNEXPECTED_TAG )
  44479. return( MBEDTLS_ERR_X509_INVALID_ALG + ret );
  44480. if( p == end )
  44481. return( 0 );
  44482. /*
  44483. * salt_len
  44484. */
  44485. if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,
  44486. MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | 2 ) ) == 0 )
  44487. {
  44488. end2 = p + len;
  44489. if( ( ret = mbedtls_asn1_get_int( &p, end2, salt_len ) ) != 0 )
  44490. return( MBEDTLS_ERR_X509_INVALID_ALG + ret );
  44491. if( p != end2 )
  44492. return( MBEDTLS_ERR_X509_INVALID_ALG +
  44493. MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
  44494. }
  44495. else if( ret != MBEDTLS_ERR_ASN1_UNEXPECTED_TAG )
  44496. return( MBEDTLS_ERR_X509_INVALID_ALG + ret );
  44497. if( p == end )
  44498. return( 0 );
  44499. /*
  44500. * trailer_field (if present, must be 1)
  44501. */
  44502. if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,
  44503. MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | 3 ) ) == 0 )
  44504. {
  44505. int trailer_field;
  44506. end2 = p + len;
  44507. if( ( ret = mbedtls_asn1_get_int( &p, end2, &trailer_field ) ) != 0 )
  44508. return( MBEDTLS_ERR_X509_INVALID_ALG + ret );
  44509. if( p != end2 )
  44510. return( MBEDTLS_ERR_X509_INVALID_ALG +
  44511. MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
  44512. if( trailer_field != 1 )
  44513. return( MBEDTLS_ERR_X509_INVALID_ALG );
  44514. }
  44515. else if( ret != MBEDTLS_ERR_ASN1_UNEXPECTED_TAG )
  44516. return( MBEDTLS_ERR_X509_INVALID_ALG + ret );
  44517. if( p != end )
  44518. return( MBEDTLS_ERR_X509_INVALID_ALG +
  44519. MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
  44520. return( 0 );
  44521. }
  44522. #endif /* MBEDTLS_X509_RSASSA_PSS_SUPPORT */
  44523. /*
  44524. * AttributeTypeAndValue ::= SEQUENCE {
  44525. * type AttributeType,
  44526. * value AttributeValue }
  44527. *
  44528. * AttributeType ::= OBJECT IDENTIFIER
  44529. *
  44530. * AttributeValue ::= ANY DEFINED BY AttributeType
  44531. */
  44532. static int x509_get_attr_type_value( unsigned char **p,
  44533. const unsigned char *end,
  44534. mbedtls_x509_name *cur )
  44535. {
  44536. int ret;
  44537. size_t len;
  44538. mbedtls_x509_buf *oid;
  44539. mbedtls_x509_buf *val;
  44540. if( ( ret = mbedtls_asn1_get_tag( p, end, &len,
  44541. MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )
  44542. return( MBEDTLS_ERR_X509_INVALID_NAME + ret );
  44543. if( ( end - *p ) < 1 )
  44544. return( MBEDTLS_ERR_X509_INVALID_NAME +
  44545. MBEDTLS_ERR_ASN1_OUT_OF_DATA );
  44546. oid = &cur->oid;
  44547. oid->tag = **p;
  44548. if( ( ret = mbedtls_asn1_get_tag( p, end, &oid->len, MBEDTLS_ASN1_OID ) ) != 0 )
  44549. return( MBEDTLS_ERR_X509_INVALID_NAME + ret );
  44550. oid->p = *p;
  44551. *p += oid->len;
  44552. if( ( end - *p ) < 1 )
  44553. return( MBEDTLS_ERR_X509_INVALID_NAME +
  44554. MBEDTLS_ERR_ASN1_OUT_OF_DATA );
  44555. if( **p != MBEDTLS_ASN1_BMP_STRING && **p != MBEDTLS_ASN1_UTF8_STRING &&
  44556. **p != MBEDTLS_ASN1_T61_STRING && **p != MBEDTLS_ASN1_PRINTABLE_STRING &&
  44557. **p != MBEDTLS_ASN1_IA5_STRING && **p != MBEDTLS_ASN1_UNIVERSAL_STRING &&
  44558. **p != MBEDTLS_ASN1_BIT_STRING )
  44559. return( MBEDTLS_ERR_X509_INVALID_NAME +
  44560. MBEDTLS_ERR_ASN1_UNEXPECTED_TAG );
  44561. val = &cur->val;
  44562. val->tag = *(*p)++;
  44563. if( ( ret = mbedtls_asn1_get_len( p, end, &val->len ) ) != 0 )
  44564. return( MBEDTLS_ERR_X509_INVALID_NAME + ret );
  44565. val->p = *p;
  44566. *p += val->len;
  44567. cur->next = NULL;
  44568. return( 0 );
  44569. }
  44570. /*
  44571. * Name ::= CHOICE { -- only one possibility for now --
  44572. * rdnSequence RDNSequence }
  44573. *
  44574. * RDNSequence ::= SEQUENCE OF RelativeDistinguishedName
  44575. *
  44576. * RelativeDistinguishedName ::=
  44577. * SET OF AttributeTypeAndValue
  44578. *
  44579. * AttributeTypeAndValue ::= SEQUENCE {
  44580. * type AttributeType,
  44581. * value AttributeValue }
  44582. *
  44583. * AttributeType ::= OBJECT IDENTIFIER
  44584. *
  44585. * AttributeValue ::= ANY DEFINED BY AttributeType
  44586. *
  44587. * The data structure is optimized for the common case where each RDN has only
  44588. * one element, which is represented as a list of AttributeTypeAndValue.
  44589. * For the general case we still use a flat list, but we mark elements of the
  44590. * same set so that they are "merged" together in the functions that consume
  44591. * this list, eg mbedtls_x509_dn_gets().
  44592. */
  44593. int mbedtls_x509_get_name( unsigned char **p, const unsigned char *end,
  44594. mbedtls_x509_name *cur )
  44595. {
  44596. int ret;
  44597. size_t set_len;
  44598. const unsigned char *end_set;
  44599. /* don't use recursion, we'd risk stack overflow if not optimized */
  44600. while( 1 )
  44601. {
  44602. /*
  44603. * parse SET
  44604. */
  44605. if( ( ret = mbedtls_asn1_get_tag( p, end, &set_len,
  44606. MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SET ) ) != 0 )
  44607. return( MBEDTLS_ERR_X509_INVALID_NAME + ret );
  44608. end_set = *p + set_len;
  44609. while( 1 )
  44610. {
  44611. if( ( ret = x509_get_attr_type_value( p, end_set, cur ) ) != 0 )
  44612. return( ret );
  44613. if( *p == end_set )
  44614. break;
  44615. /* Mark this item as being no the only one in a set */
  44616. cur->next_merged = 1;
  44617. cur->next = mbedtls_calloc( 1, sizeof( mbedtls_x509_name ) );
  44618. if( cur->next == NULL )
  44619. return( MBEDTLS_ERR_X509_ALLOC_FAILED );
  44620. cur = cur->next;
  44621. }
  44622. /*
  44623. * continue until end of SEQUENCE is reached
  44624. */
  44625. if( *p == end )
  44626. return( 0 );
  44627. cur->next = mbedtls_calloc( 1, sizeof( mbedtls_x509_name ) );
  44628. if( cur->next == NULL )
  44629. return( MBEDTLS_ERR_X509_ALLOC_FAILED );
  44630. cur = cur->next;
  44631. }
  44632. }
  44633. static int x509_parse_int(unsigned char **p, unsigned n, int *res){
  44634. *res = 0;
  44635. for( ; n > 0; --n ){
  44636. if( ( **p < '0') || ( **p > '9' ) ) return MBEDTLS_ERR_X509_INVALID_DATE;
  44637. *res *= 10;
  44638. *res += (*(*p)++ - '0');
  44639. }
  44640. return 0;
  44641. }
  44642. /*
  44643. * Time ::= CHOICE {
  44644. * utcTime UTCTime,
  44645. * generalTime GeneralizedTime }
  44646. */
  44647. int mbedtls_x509_get_time( unsigned char **p, const unsigned char *end,
  44648. mbedtls_x509_time *time )
  44649. {
  44650. int ret;
  44651. size_t len;
  44652. unsigned char tag;
  44653. if( ( end - *p ) < 1 )
  44654. return( MBEDTLS_ERR_X509_INVALID_DATE +
  44655. MBEDTLS_ERR_ASN1_OUT_OF_DATA );
  44656. tag = **p;
  44657. if( tag == MBEDTLS_ASN1_UTC_TIME )
  44658. {
  44659. (*p)++;
  44660. ret = mbedtls_asn1_get_len( p, end, &len );
  44661. if( ret != 0 )
  44662. return( MBEDTLS_ERR_X509_INVALID_DATE + ret );
  44663. CHECK( x509_parse_int( p, 2, &time->year ) );
  44664. CHECK( x509_parse_int( p, 2, &time->mon ) );
  44665. CHECK( x509_parse_int( p, 2, &time->day ) );
  44666. CHECK( x509_parse_int( p, 2, &time->hour ) );
  44667. CHECK( x509_parse_int( p, 2, &time->min ) );
  44668. if( len > 10 )
  44669. CHECK( x509_parse_int( p, 2, &time->sec ) );
  44670. if( len > 12 && *(*p)++ != 'Z' )
  44671. return( MBEDTLS_ERR_X509_INVALID_DATE );
  44672. time->year += 100 * ( time->year < 50 );
  44673. time->year += 1900;
  44674. return( 0 );
  44675. }
  44676. else if( tag == MBEDTLS_ASN1_GENERALIZED_TIME )
  44677. {
  44678. (*p)++;
  44679. ret = mbedtls_asn1_get_len( p, end, &len );
  44680. if( ret != 0 )
  44681. return( MBEDTLS_ERR_X509_INVALID_DATE + ret );
  44682. CHECK( x509_parse_int( p, 4, &time->year ) );
  44683. CHECK( x509_parse_int( p, 2, &time->mon ) );
  44684. CHECK( x509_parse_int( p, 2, &time->day ) );
  44685. CHECK( x509_parse_int( p, 2, &time->hour ) );
  44686. CHECK( x509_parse_int( p, 2, &time->min ) );
  44687. if( len > 12 )
  44688. CHECK( x509_parse_int( p, 2, &time->sec ) );
  44689. if( len > 14 && *(*p)++ != 'Z' )
  44690. return( MBEDTLS_ERR_X509_INVALID_DATE );
  44691. return( 0 );
  44692. }
  44693. else
  44694. return( MBEDTLS_ERR_X509_INVALID_DATE +
  44695. MBEDTLS_ERR_ASN1_UNEXPECTED_TAG );
  44696. }
  44697. int mbedtls_x509_get_sig( unsigned char **p, const unsigned char *end, mbedtls_x509_buf *sig )
  44698. {
  44699. int ret;
  44700. size_t len;
  44701. if( ( end - *p ) < 1 )
  44702. return( MBEDTLS_ERR_X509_INVALID_SIGNATURE +
  44703. MBEDTLS_ERR_ASN1_OUT_OF_DATA );
  44704. sig->tag = **p;
  44705. if( ( ret = mbedtls_asn1_get_bitstring_null( p, end, &len ) ) != 0 )
  44706. return( MBEDTLS_ERR_X509_INVALID_SIGNATURE + ret );
  44707. sig->len = len;
  44708. sig->p = *p;
  44709. *p += len;
  44710. return( 0 );
  44711. }
  44712. /*
  44713. * Get signature algorithm from alg OID and optional parameters
  44714. */
  44715. int mbedtls_x509_get_sig_alg( const mbedtls_x509_buf *sig_oid, const mbedtls_x509_buf *sig_params,
  44716. mbedtls_md_type_t *md_alg, mbedtls_pk_type_t *pk_alg,
  44717. void **sig_opts )
  44718. {
  44719. int ret;
  44720. if( *sig_opts != NULL )
  44721. return( MBEDTLS_ERR_X509_BAD_INPUT_DATA );
  44722. if( ( ret = mbedtls_oid_get_sig_alg( sig_oid, md_alg, pk_alg ) ) != 0 )
  44723. return( MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG + ret );
  44724. #if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT)
  44725. if( *pk_alg == MBEDTLS_PK_RSASSA_PSS )
  44726. {
  44727. mbedtls_pk_rsassa_pss_options *pss_opts;
  44728. pss_opts = mbedtls_calloc( 1, sizeof( mbedtls_pk_rsassa_pss_options ) );
  44729. if( pss_opts == NULL )
  44730. return( MBEDTLS_ERR_X509_ALLOC_FAILED );
  44731. ret = mbedtls_x509_get_rsassa_pss_params( sig_params,
  44732. md_alg,
  44733. &pss_opts->mgf1_hash_id,
  44734. &pss_opts->expected_salt_len );
  44735. if( ret != 0 )
  44736. {
  44737. mbedtls_free( pss_opts );
  44738. return( ret );
  44739. }
  44740. *sig_opts = (void *) pss_opts;
  44741. }
  44742. else
  44743. #endif /* MBEDTLS_X509_RSASSA_PSS_SUPPORT */
  44744. {
  44745. /* Make sure parameters are absent or NULL */
  44746. if( ( sig_params->tag != MBEDTLS_ASN1_NULL && sig_params->tag != 0 ) ||
  44747. sig_params->len != 0 )
  44748. return( MBEDTLS_ERR_X509_INVALID_ALG );
  44749. }
  44750. return( 0 );
  44751. }
  44752. /*
  44753. * X.509 Extensions (No parsing of extensions, pointer should
  44754. * be either manually updated or extensions should be parsed!
  44755. */
  44756. int mbedtls_x509_get_ext( unsigned char **p, const unsigned char *end,
  44757. mbedtls_x509_buf *ext, int tag )
  44758. {
  44759. int ret;
  44760. size_t len;
  44761. if( *p == end )
  44762. return( 0 );
  44763. ext->tag = **p;
  44764. if( ( ret = mbedtls_asn1_get_tag( p, end, &ext->len,
  44765. MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | tag ) ) != 0 )
  44766. return( ret );
  44767. ext->p = *p;
  44768. end = *p + ext->len;
  44769. /*
  44770. * Extensions ::= SEQUENCE SIZE (1..MAX) OF Extension
  44771. *
  44772. * Extension ::= SEQUENCE {
  44773. * extnID OBJECT IDENTIFIER,
  44774. * critical BOOLEAN DEFAULT FALSE,
  44775. * extnValue OCTET STRING }
  44776. */
  44777. if( ( ret = mbedtls_asn1_get_tag( p, end, &len,
  44778. MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )
  44779. return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret );
  44780. if( end != *p + len )
  44781. return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS +
  44782. MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
  44783. return( 0 );
  44784. }
  44785. /*
  44786. * Store the name in printable form into buf; no more
  44787. * than size characters will be written
  44788. */
  44789. int mbedtls_x509_dn_gets( char *buf, size_t size, const mbedtls_x509_name *dn )
  44790. {
  44791. int ret;
  44792. size_t i, n;
  44793. unsigned char c, merge = 0;
  44794. const mbedtls_x509_name *name;
  44795. const char *short_name = NULL;
  44796. char s[MBEDTLS_X509_MAX_DN_NAME_SIZE], *p;
  44797. memset( s, 0, sizeof( s ) );
  44798. name = dn;
  44799. p = buf;
  44800. n = size;
  44801. while( name != NULL )
  44802. {
  44803. if( !name->oid.p )
  44804. {
  44805. name = name->next;
  44806. continue;
  44807. }
  44808. if( name != dn )
  44809. {
  44810. ret = mbedtls_snprintf( p, n, merge ? " + " : ", " );
  44811. MBEDTLS_X509_SAFE_SNPRINTF;
  44812. }
  44813. ret = mbedtls_oid_get_attr_short_name( &name->oid, &short_name );
  44814. if( ret == 0 )
  44815. ret = mbedtls_snprintf( p, n, "%s=", short_name );
  44816. else
  44817. ret = mbedtls_snprintf( p, n, "\?\?=" );
  44818. MBEDTLS_X509_SAFE_SNPRINTF;
  44819. for( i = 0; i < name->val.len; i++ )
  44820. {
  44821. if( i >= sizeof( s ) - 1 )
  44822. break;
  44823. c = name->val.p[i];
  44824. if( c < 32 || c == 127 || ( c > 128 && c < 160 ) )
  44825. s[i] = '?';
  44826. else s[i] = c;
  44827. }
  44828. s[i] = '\0';
  44829. ret = mbedtls_snprintf( p, n, "%s", s );
  44830. MBEDTLS_X509_SAFE_SNPRINTF;
  44831. merge = name->next_merged;
  44832. name = name->next;
  44833. }
  44834. return( (int) ( size - n ) );
  44835. }
  44836. /*
  44837. * Store the serial in printable form into buf; no more
  44838. * than size characters will be written
  44839. */
  44840. int mbedtls_x509_serial_gets( char *buf, size_t size, const mbedtls_x509_buf *serial )
  44841. {
  44842. int ret;
  44843. size_t i, n, nr;
  44844. char *p;
  44845. p = buf;
  44846. n = size;
  44847. nr = ( serial->len <= 32 )
  44848. ? serial->len : 28;
  44849. for( i = 0; i < nr; i++ )
  44850. {
  44851. if( i == 0 && nr > 1 && serial->p[i] == 0x0 )
  44852. continue;
  44853. ret = mbedtls_snprintf( p, n, "%02X%s",
  44854. serial->p[i], ( i < nr - 1 ) ? ":" : "" );
  44855. MBEDTLS_X509_SAFE_SNPRINTF;
  44856. }
  44857. if( nr != serial->len )
  44858. {
  44859. ret = mbedtls_snprintf( p, n, "...." );
  44860. MBEDTLS_X509_SAFE_SNPRINTF;
  44861. }
  44862. return( (int) ( size - n ) );
  44863. }
  44864. /*
  44865. * Helper for writing signature algorithms
  44866. */
  44867. int mbedtls_x509_sig_alg_gets( char *buf, size_t size, const mbedtls_x509_buf *sig_oid,
  44868. mbedtls_pk_type_t pk_alg, mbedtls_md_type_t md_alg,
  44869. const void *sig_opts )
  44870. {
  44871. int ret;
  44872. char *p = buf;
  44873. size_t n = size;
  44874. const char *desc = NULL;
  44875. ret = mbedtls_oid_get_sig_alg_desc( sig_oid, &desc );
  44876. if( ret != 0 )
  44877. ret = mbedtls_snprintf( p, n, "???" );
  44878. else
  44879. ret = mbedtls_snprintf( p, n, "%s", desc );
  44880. MBEDTLS_X509_SAFE_SNPRINTF;
  44881. #if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT)
  44882. if( pk_alg == MBEDTLS_PK_RSASSA_PSS )
  44883. {
  44884. const mbedtls_pk_rsassa_pss_options *pss_opts;
  44885. const mbedtls_md_info_t *md_info, *mgf_md_info;
  44886. pss_opts = (const mbedtls_pk_rsassa_pss_options *) sig_opts;
  44887. md_info = mbedtls_md_info_from_type( md_alg );
  44888. mgf_md_info = mbedtls_md_info_from_type( pss_opts->mgf1_hash_id );
  44889. ret = mbedtls_snprintf( p, n, " (%s, MGF1-%s, 0x%02X)",
  44890. md_info ? mbedtls_md_get_name( md_info ) : "???",
  44891. mgf_md_info ? mbedtls_md_get_name( mgf_md_info ) : "???",
  44892. pss_opts->expected_salt_len );
  44893. MBEDTLS_X509_SAFE_SNPRINTF;
  44894. }
  44895. #else
  44896. ((void) pk_alg);
  44897. ((void) md_alg);
  44898. ((void) sig_opts);
  44899. #endif /* MBEDTLS_X509_RSASSA_PSS_SUPPORT */
  44900. return( (int)( size - n ) );
  44901. }
  44902. /*
  44903. * Helper for writing "RSA key size", "EC key size", etc
  44904. */
  44905. int mbedtls_x509_key_size_helper( char *buf, size_t buf_size, const char *name )
  44906. {
  44907. char *p = buf;
  44908. size_t n = buf_size;
  44909. int ret;
  44910. ret = mbedtls_snprintf( p, n, "%s key size", name );
  44911. MBEDTLS_X509_SAFE_SNPRINTF;
  44912. return( 0 );
  44913. }
  44914. #if defined(MBEDTLS_HAVE_TIME_DATE)
  44915. /*
  44916. * Set the time structure to the current time.
  44917. * Return 0 on success, non-zero on failure.
  44918. */
  44919. #if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32)
  44920. static int x509_get_current_time( mbedtls_x509_time *now )
  44921. {
  44922. SYSTEMTIME st;
  44923. GetSystemTime( &st );
  44924. now->year = st.wYear;
  44925. now->mon = st.wMonth;
  44926. now->day = st.wDay;
  44927. now->hour = st.wHour;
  44928. now->min = st.wMinute;
  44929. now->sec = st.wSecond;
  44930. return( 0 );
  44931. }
  44932. #else
  44933. static int x509_get_current_time( mbedtls_x509_time *now )
  44934. {
  44935. struct tm *lt;
  44936. time_t tt;
  44937. int ret = 0;
  44938. #if defined(MBEDTLS_THREADING_C)
  44939. if( mbedtls_mutex_lock( &mbedtls_threading_gmtime_mutex ) != 0 )
  44940. return( MBEDTLS_ERR_THREADING_MUTEX_ERROR );
  44941. #endif
  44942. tt = time( NULL );
  44943. lt = gmtime( &tt );
  44944. if( lt == NULL )
  44945. ret = -1;
  44946. else
  44947. {
  44948. now->year = lt->tm_year + 1900;
  44949. now->mon = lt->tm_mon + 1;
  44950. now->day = lt->tm_mday;
  44951. now->hour = lt->tm_hour;
  44952. now->min = lt->tm_min;
  44953. now->sec = lt->tm_sec;
  44954. }
  44955. #if defined(MBEDTLS_THREADING_C)
  44956. if( mbedtls_mutex_unlock( &mbedtls_threading_gmtime_mutex ) != 0 )
  44957. return( MBEDTLS_ERR_THREADING_MUTEX_ERROR );
  44958. #endif
  44959. return( ret );
  44960. }
  44961. #endif /* _WIN32 && !EFIX64 && !EFI32 */
  44962. /*
  44963. * Return 0 if before <= after, 1 otherwise
  44964. */
  44965. static int x509_check_time( const mbedtls_x509_time *before, const mbedtls_x509_time *after )
  44966. {
  44967. if( before->year > after->year )
  44968. return( 1 );
  44969. if( before->year == after->year &&
  44970. before->mon > after->mon )
  44971. return( 1 );
  44972. if( before->year == after->year &&
  44973. before->mon == after->mon &&
  44974. before->day > after->day )
  44975. return( 1 );
  44976. if( before->year == after->year &&
  44977. before->mon == after->mon &&
  44978. before->day == after->day &&
  44979. before->hour > after->hour )
  44980. return( 1 );
  44981. if( before->year == after->year &&
  44982. before->mon == after->mon &&
  44983. before->day == after->day &&
  44984. before->hour == after->hour &&
  44985. before->min > after->min )
  44986. return( 1 );
  44987. if( before->year == after->year &&
  44988. before->mon == after->mon &&
  44989. before->day == after->day &&
  44990. before->hour == after->hour &&
  44991. before->min == after->min &&
  44992. before->sec > after->sec )
  44993. return( 1 );
  44994. return( 0 );
  44995. }
  44996. int mbedtls_x509_time_is_past( const mbedtls_x509_time *to )
  44997. {
  44998. mbedtls_x509_time now;
  44999. if( x509_get_current_time( &now ) != 0 )
  45000. return( 1 );
  45001. return( x509_check_time( &now, to ) );
  45002. }
  45003. int mbedtls_x509_time_is_future( const mbedtls_x509_time *from )
  45004. {
  45005. mbedtls_x509_time now;
  45006. if( x509_get_current_time( &now ) != 0 )
  45007. return( 1 );
  45008. return( x509_check_time( from, &now ) );
  45009. }
  45010. #else /* MBEDTLS_HAVE_TIME_DATE */
  45011. int mbedtls_x509_time_is_past( const mbedtls_x509_time *to )
  45012. {
  45013. ((void) to);
  45014. return( 0 );
  45015. }
  45016. int mbedtls_x509_time_is_future( const mbedtls_x509_time *from )
  45017. {
  45018. ((void) from);
  45019. return( 0 );
  45020. }
  45021. #endif /* MBEDTLS_HAVE_TIME_DATE */
  45022. #if defined(MBEDTLS_SELF_TEST)
  45023. /*
  45024. * Checkup routine
  45025. */
  45026. int mbedtls_x509_self_test( int verbose )
  45027. {
  45028. #if defined(MBEDTLS_CERTS_C) && defined(MBEDTLS_SHA1_C)
  45029. int ret;
  45030. uint32_t flags;
  45031. mbedtls_x509_crt cacert;
  45032. mbedtls_x509_crt clicert;
  45033. if( verbose != 0 )
  45034. mbedtls_printf( " X.509 certificate load: " );
  45035. mbedtls_x509_crt_init( &clicert );
  45036. ret = mbedtls_x509_crt_parse( &clicert, (const unsigned char *) mbedtls_test_cli_crt,
  45037. mbedtls_test_cli_crt_len );
  45038. if( ret != 0 )
  45039. {
  45040. if( verbose != 0 )
  45041. mbedtls_printf( "failed\n" );
  45042. return( ret );
  45043. }
  45044. mbedtls_x509_crt_init( &cacert );
  45045. ret = mbedtls_x509_crt_parse( &cacert, (const unsigned char *) mbedtls_test_ca_crt,
  45046. mbedtls_test_ca_crt_len );
  45047. if( ret != 0 )
  45048. {
  45049. if( verbose != 0 )
  45050. mbedtls_printf( "failed\n" );
  45051. return( ret );
  45052. }
  45053. if( verbose != 0 )
  45054. mbedtls_printf( "passed\n X.509 signature verify: ");
  45055. ret = mbedtls_x509_crt_verify( &clicert, &cacert, NULL, NULL, &flags, NULL, NULL );
  45056. if( ret != 0 )
  45057. {
  45058. if( verbose != 0 )
  45059. mbedtls_printf( "failed\n" );
  45060. return( ret );
  45061. }
  45062. if( verbose != 0 )
  45063. mbedtls_printf( "passed\n\n");
  45064. mbedtls_x509_crt_free( &cacert );
  45065. mbedtls_x509_crt_free( &clicert );
  45066. return( 0 );
  45067. #else
  45068. ((void) verbose);
  45069. return( 0 );
  45070. #endif /* MBEDTLS_CERTS_C && MBEDTLS_SHA1_C */
  45071. }
  45072. #endif /* MBEDTLS_SELF_TEST */
  45073. /* Amalgamated Release Mappings */
  45074. #undef SAFE_SNPRINTF
  45075. #endif /* MBEDTLS_X509_USE_C */
  45076. /********* Start of file library/x509_create.c ************/
  45077. /*
  45078. * X.509 base functions for creating certificates / CSRs
  45079. *
  45080. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  45081. * SPDX-License-Identifier: Apache-2.0
  45082. *
  45083. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  45084. * not use this file except in compliance with the License.
  45085. * You may obtain a copy of the License at
  45086. *
  45087. * http://www.apache.org/licenses/LICENSE-2.0
  45088. *
  45089. * Unless required by applicable law or agreed to in writing, software
  45090. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  45091. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  45092. * See the License for the specific language governing permissions and
  45093. * limitations under the License.
  45094. *
  45095. * This file is part of mbed TLS (https://tls.mbed.org)
  45096. */
  45097. #if !defined(MBEDTLS_CONFIG_FILE)
  45098. #else
  45099. #endif
  45100. #if defined(MBEDTLS_X509_CREATE_C)
  45101. #include <string.h>
  45102. typedef struct {
  45103. const char *name;
  45104. size_t name_len;
  45105. const char*oid;
  45106. } x509_attr_descriptor_t;
  45107. #define ADD_STRLEN( s ) s, sizeof( s ) - 1
  45108. static const x509_attr_descriptor_t x509_attrs[] =
  45109. {
  45110. { ADD_STRLEN( "CN" ), MBEDTLS_OID_AT_CN },
  45111. { ADD_STRLEN( "commonName" ), MBEDTLS_OID_AT_CN },
  45112. { ADD_STRLEN( "C" ), MBEDTLS_OID_AT_COUNTRY },
  45113. { ADD_STRLEN( "countryName" ), MBEDTLS_OID_AT_COUNTRY },
  45114. { ADD_STRLEN( "O" ), MBEDTLS_OID_AT_ORGANIZATION },
  45115. { ADD_STRLEN( "organizationName" ), MBEDTLS_OID_AT_ORGANIZATION },
  45116. { ADD_STRLEN( "L" ), MBEDTLS_OID_AT_LOCALITY },
  45117. { ADD_STRLEN( "locality" ), MBEDTLS_OID_AT_LOCALITY },
  45118. { ADD_STRLEN( "R" ), MBEDTLS_OID_PKCS9_EMAIL },
  45119. { ADD_STRLEN( "OU" ), MBEDTLS_OID_AT_ORG_UNIT },
  45120. { ADD_STRLEN( "organizationalUnitName" ), MBEDTLS_OID_AT_ORG_UNIT },
  45121. { ADD_STRLEN( "ST" ), MBEDTLS_OID_AT_STATE },
  45122. { ADD_STRLEN( "stateOrProvinceName" ), MBEDTLS_OID_AT_STATE },
  45123. { ADD_STRLEN( "emailAddress" ), MBEDTLS_OID_PKCS9_EMAIL },
  45124. { ADD_STRLEN( "serialNumber" ), MBEDTLS_OID_AT_SERIAL_NUMBER },
  45125. { ADD_STRLEN( "postalAddress" ), MBEDTLS_OID_AT_POSTAL_ADDRESS },
  45126. { ADD_STRLEN( "postalCode" ), MBEDTLS_OID_AT_POSTAL_CODE },
  45127. { ADD_STRLEN( "dnQualifier" ), MBEDTLS_OID_AT_DN_QUALIFIER },
  45128. { ADD_STRLEN( "title" ), MBEDTLS_OID_AT_TITLE },
  45129. { ADD_STRLEN( "surName" ), MBEDTLS_OID_AT_SUR_NAME },
  45130. { ADD_STRLEN( "SN" ), MBEDTLS_OID_AT_SUR_NAME },
  45131. { ADD_STRLEN( "givenName" ), MBEDTLS_OID_AT_GIVEN_NAME },
  45132. { ADD_STRLEN( "GN" ), MBEDTLS_OID_AT_GIVEN_NAME },
  45133. { ADD_STRLEN( "initials" ), MBEDTLS_OID_AT_INITIALS },
  45134. { ADD_STRLEN( "pseudonym" ), MBEDTLS_OID_AT_PSEUDONYM },
  45135. { ADD_STRLEN( "generationQualifier" ), MBEDTLS_OID_AT_GENERATION_QUALIFIER },
  45136. { ADD_STRLEN( "domainComponent" ), MBEDTLS_OID_DOMAIN_COMPONENT },
  45137. { ADD_STRLEN( "DC" ), MBEDTLS_OID_DOMAIN_COMPONENT },
  45138. { NULL, 0, NULL }
  45139. };
  45140. static const char *x509_at_oid_from_name( const char *name, size_t name_len )
  45141. {
  45142. const x509_attr_descriptor_t *cur;
  45143. for( cur = x509_attrs; cur->name != NULL; cur++ )
  45144. if( cur->name_len == name_len &&
  45145. strncmp( cur->name, name, name_len ) == 0 )
  45146. break;
  45147. return( cur->oid );
  45148. }
  45149. int mbedtls_x509_string_to_names( mbedtls_asn1_named_data **head, const char *name )
  45150. {
  45151. int ret = 0;
  45152. const char *s = name, *c = s;
  45153. const char *end = s + strlen( s );
  45154. const char *oid = NULL;
  45155. int in_tag = 1;
  45156. char data[MBEDTLS_X509_MAX_DN_NAME_SIZE];
  45157. char *d = data;
  45158. /* Clear existing chain if present */
  45159. mbedtls_asn1_free_named_data_list( head );
  45160. while( c <= end )
  45161. {
  45162. if( in_tag && *c == '=' )
  45163. {
  45164. if( ( oid = x509_at_oid_from_name( s, c - s ) ) == NULL )
  45165. {
  45166. ret = MBEDTLS_ERR_X509_UNKNOWN_OID;
  45167. goto exit;
  45168. }
  45169. s = c + 1;
  45170. in_tag = 0;
  45171. d = data;
  45172. }
  45173. if( !in_tag && *c == '\\' && c != end )
  45174. {
  45175. c++;
  45176. /* Check for valid escaped characters */
  45177. if( c == end || *c != ',' )
  45178. {
  45179. ret = MBEDTLS_ERR_X509_INVALID_NAME;
  45180. goto exit;
  45181. }
  45182. }
  45183. else if( !in_tag && ( *c == ',' || c == end ) )
  45184. {
  45185. if( mbedtls_asn1_store_named_data( head, oid, strlen( oid ),
  45186. (unsigned char *) data,
  45187. d - data ) == NULL )
  45188. {
  45189. return( MBEDTLS_ERR_X509_ALLOC_FAILED );
  45190. }
  45191. while( c < end && *(c + 1) == ' ' )
  45192. c++;
  45193. s = c + 1;
  45194. in_tag = 1;
  45195. }
  45196. if( !in_tag && s != c + 1 )
  45197. {
  45198. *(d++) = *c;
  45199. if( d - data == MBEDTLS_X509_MAX_DN_NAME_SIZE )
  45200. {
  45201. ret = MBEDTLS_ERR_X509_INVALID_NAME;
  45202. goto exit;
  45203. }
  45204. }
  45205. c++;
  45206. }
  45207. exit:
  45208. return( ret );
  45209. }
  45210. /* The first byte of the value in the mbedtls_asn1_named_data structure is reserved
  45211. * to store the critical boolean for us
  45212. */
  45213. int mbedtls_x509_set_extension( mbedtls_asn1_named_data **head, const char *oid, size_t oid_len,
  45214. int critical, const unsigned char *val, size_t val_len )
  45215. {
  45216. mbedtls_asn1_named_data *cur;
  45217. if( ( cur = mbedtls_asn1_store_named_data( head, oid, oid_len,
  45218. NULL, val_len + 1 ) ) == NULL )
  45219. {
  45220. return( MBEDTLS_ERR_X509_ALLOC_FAILED );
  45221. }
  45222. cur->val.p[0] = critical;
  45223. memcpy( cur->val.p + 1, val, val_len );
  45224. return( 0 );
  45225. }
  45226. /*
  45227. * RelativeDistinguishedName ::=
  45228. * SET OF AttributeTypeAndValue
  45229. *
  45230. * AttributeTypeAndValue ::= SEQUENCE {
  45231. * type AttributeType,
  45232. * value AttributeValue }
  45233. *
  45234. * AttributeType ::= OBJECT IDENTIFIER
  45235. *
  45236. * AttributeValue ::= ANY DEFINED BY AttributeType
  45237. */
  45238. static int x509_write_name( unsigned char **p, unsigned char *start,
  45239. const char *oid, size_t oid_len,
  45240. const unsigned char *name, size_t name_len )
  45241. {
  45242. int ret;
  45243. size_t len = 0;
  45244. // Write PrintableString for all except MBEDTLS_OID_PKCS9_EMAIL
  45245. //
  45246. if( MBEDTLS_OID_SIZE( MBEDTLS_OID_PKCS9_EMAIL ) == oid_len &&
  45247. memcmp( oid, MBEDTLS_OID_PKCS9_EMAIL, oid_len ) == 0 )
  45248. {
  45249. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_ia5_string( p, start,
  45250. (const char *) name,
  45251. name_len ) );
  45252. }
  45253. else
  45254. {
  45255. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_printable_string( p, start,
  45256. (const char *) name,
  45257. name_len ) );
  45258. }
  45259. // Write OID
  45260. //
  45261. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_oid( p, start, oid, oid_len ) );
  45262. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) );
  45263. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_CONSTRUCTED |
  45264. MBEDTLS_ASN1_SEQUENCE ) );
  45265. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) );
  45266. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_CONSTRUCTED |
  45267. MBEDTLS_ASN1_SET ) );
  45268. return( (int) len );
  45269. }
  45270. int mbedtls_x509_write_names( unsigned char **p, unsigned char *start,
  45271. mbedtls_asn1_named_data *first )
  45272. {
  45273. int ret;
  45274. size_t len = 0;
  45275. mbedtls_asn1_named_data *cur = first;
  45276. while( cur != NULL )
  45277. {
  45278. MBEDTLS_ASN1_CHK_ADD( len, x509_write_name( p, start, (char *) cur->oid.p,
  45279. cur->oid.len,
  45280. cur->val.p, cur->val.len ) );
  45281. cur = cur->next;
  45282. }
  45283. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) );
  45284. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_CONSTRUCTED |
  45285. MBEDTLS_ASN1_SEQUENCE ) );
  45286. return( (int) len );
  45287. }
  45288. int mbedtls_x509_write_sig( unsigned char **p, unsigned char *start,
  45289. const char *oid, size_t oid_len,
  45290. unsigned char *sig, size_t size )
  45291. {
  45292. int ret;
  45293. size_t len = 0;
  45294. if( *p < start || (size_t)( *p - start ) < size )
  45295. return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );
  45296. len = size;
  45297. (*p) -= len;
  45298. memcpy( *p, sig, len );
  45299. if( *p - start < 1 )
  45300. return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );
  45301. *--(*p) = 0;
  45302. len += 1;
  45303. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) );
  45304. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_BIT_STRING ) );
  45305. // Write OID
  45306. //
  45307. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_algorithm_identifier( p, start, oid,
  45308. oid_len, 0 ) );
  45309. return( (int) len );
  45310. }
  45311. static int x509_write_extension( unsigned char **p, unsigned char *start,
  45312. mbedtls_asn1_named_data *ext )
  45313. {
  45314. int ret;
  45315. size_t len = 0;
  45316. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_raw_buffer( p, start, ext->val.p + 1,
  45317. ext->val.len - 1 ) );
  45318. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, ext->val.len - 1 ) );
  45319. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_OCTET_STRING ) );
  45320. if( ext->val.p[0] != 0 )
  45321. {
  45322. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_bool( p, start, 1 ) );
  45323. }
  45324. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_raw_buffer( p, start, ext->oid.p,
  45325. ext->oid.len ) );
  45326. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, ext->oid.len ) );
  45327. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_OID ) );
  45328. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) );
  45329. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_CONSTRUCTED |
  45330. MBEDTLS_ASN1_SEQUENCE ) );
  45331. return( (int) len );
  45332. }
  45333. /*
  45334. * Extension ::= SEQUENCE {
  45335. * extnID OBJECT IDENTIFIER,
  45336. * critical BOOLEAN DEFAULT FALSE,
  45337. * extnValue OCTET STRING
  45338. * -- contains the DER encoding of an ASN.1 value
  45339. * -- corresponding to the extension type identified
  45340. * -- by extnID
  45341. * }
  45342. */
  45343. int mbedtls_x509_write_extensions( unsigned char **p, unsigned char *start,
  45344. mbedtls_asn1_named_data *first )
  45345. {
  45346. int ret;
  45347. size_t len = 0;
  45348. mbedtls_asn1_named_data *cur_ext = first;
  45349. while( cur_ext != NULL )
  45350. {
  45351. MBEDTLS_ASN1_CHK_ADD( len, x509_write_extension( p, start, cur_ext ) );
  45352. cur_ext = cur_ext->next;
  45353. }
  45354. return( (int) len );
  45355. }
  45356. #endif /* MBEDTLS_X509_CREATE_C */
  45357. /********* Start of file library/x509_crl.c ************/
  45358. /*
  45359. * X.509 Certidicate Revocation List (CRL) parsing
  45360. *
  45361. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  45362. * SPDX-License-Identifier: Apache-2.0
  45363. *
  45364. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  45365. * not use this file except in compliance with the License.
  45366. * You may obtain a copy of the License at
  45367. *
  45368. * http://www.apache.org/licenses/LICENSE-2.0
  45369. *
  45370. * Unless required by applicable law or agreed to in writing, software
  45371. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  45372. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  45373. * See the License for the specific language governing permissions and
  45374. * limitations under the License.
  45375. *
  45376. * This file is part of mbed TLS (https://tls.mbed.org)
  45377. */
  45378. /*
  45379. * The ITU-T X.509 standard defines a certificate format for PKI.
  45380. *
  45381. * http://www.ietf.org/rfc/rfc5280.txt (Certificates and CRLs)
  45382. * http://www.ietf.org/rfc/rfc3279.txt (Alg IDs for CRLs)
  45383. * http://www.ietf.org/rfc/rfc2986.txt (CSRs, aka PKCS#10)
  45384. *
  45385. * http://www.itu.int/ITU-T/studygroups/com17/languages/X.680-0207.pdf
  45386. * http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf
  45387. */
  45388. #if !defined(MBEDTLS_CONFIG_FILE)
  45389. #else
  45390. #endif
  45391. #if defined(MBEDTLS_X509_CRL_PARSE_C)
  45392. #include <string.h>
  45393. #if defined(MBEDTLS_PEM_PARSE_C)
  45394. #endif
  45395. #if defined(MBEDTLS_PLATFORM_C)
  45396. #else
  45397. #include <stdlib.h>
  45398. #include <stdio.h>
  45399. #define mbedtls_free free
  45400. #define mbedtls_calloc calloc
  45401. #define mbedtls_snprintf snprintf
  45402. #endif
  45403. #if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32)
  45404. #include <windows.h>
  45405. #else
  45406. #include <time.h>
  45407. #endif
  45408. #if defined(MBEDTLS_FS_IO) || defined(EFIX64) || defined(EFI32)
  45409. #include <stdio.h>
  45410. #endif
  45411. /* Implementation that should never be optimized out by the compiler */
  45412. static void x509_crl_zeroize( void *v, size_t n ) {
  45413. volatile unsigned char *p = v; while( n-- ) *p++ = 0;
  45414. }
  45415. /*
  45416. * Version ::= INTEGER { v1(0), v2(1) }
  45417. */
  45418. static int x509_crl_get_version( unsigned char **p,
  45419. const unsigned char *end,
  45420. int *ver )
  45421. {
  45422. int ret;
  45423. if( ( ret = mbedtls_asn1_get_int( p, end, ver ) ) != 0 )
  45424. {
  45425. if( ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG )
  45426. {
  45427. *ver = 0;
  45428. return( 0 );
  45429. }
  45430. return( MBEDTLS_ERR_X509_INVALID_VERSION + ret );
  45431. }
  45432. return( 0 );
  45433. }
  45434. /*
  45435. * X.509 CRL v2 extensions (no extensions parsed yet.)
  45436. */
  45437. static int x509_get_crl_ext( unsigned char **p,
  45438. const unsigned char *end,
  45439. mbedtls_x509_buf *ext )
  45440. {
  45441. int ret;
  45442. size_t len = 0;
  45443. /* Get explicit tag */
  45444. if( ( ret = mbedtls_x509_get_ext( p, end, ext, 0) ) != 0 )
  45445. {
  45446. if( ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG )
  45447. return( 0 );
  45448. return( ret );
  45449. }
  45450. while( *p < end )
  45451. {
  45452. if( ( ret = mbedtls_asn1_get_tag( p, end, &len,
  45453. MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )
  45454. return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret );
  45455. *p += len;
  45456. }
  45457. if( *p != end )
  45458. return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS +
  45459. MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
  45460. return( 0 );
  45461. }
  45462. /*
  45463. * X.509 CRL v2 entry extensions (no extensions parsed yet.)
  45464. */
  45465. static int x509_get_crl_entry_ext( unsigned char **p,
  45466. const unsigned char *end,
  45467. mbedtls_x509_buf *ext )
  45468. {
  45469. int ret;
  45470. size_t len = 0;
  45471. /* OPTIONAL */
  45472. if( end <= *p )
  45473. return( 0 );
  45474. ext->tag = **p;
  45475. ext->p = *p;
  45476. /*
  45477. * Get CRL-entry extension sequence header
  45478. * crlEntryExtensions Extensions OPTIONAL -- if present, MUST be v2
  45479. */
  45480. if( ( ret = mbedtls_asn1_get_tag( p, end, &ext->len,
  45481. MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )
  45482. {
  45483. if( ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG )
  45484. {
  45485. ext->p = NULL;
  45486. return( 0 );
  45487. }
  45488. return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret );
  45489. }
  45490. end = *p + ext->len;
  45491. if( end != *p + ext->len )
  45492. return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS +
  45493. MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
  45494. while( *p < end )
  45495. {
  45496. if( ( ret = mbedtls_asn1_get_tag( p, end, &len,
  45497. MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )
  45498. return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret );
  45499. *p += len;
  45500. }
  45501. if( *p != end )
  45502. return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS +
  45503. MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
  45504. return( 0 );
  45505. }
  45506. /*
  45507. * X.509 CRL Entries
  45508. */
  45509. static int x509_get_entries( unsigned char **p,
  45510. const unsigned char *end,
  45511. mbedtls_x509_crl_entry *entry )
  45512. {
  45513. int ret;
  45514. size_t entry_len;
  45515. mbedtls_x509_crl_entry *cur_entry = entry;
  45516. if( *p == end )
  45517. return( 0 );
  45518. if( ( ret = mbedtls_asn1_get_tag( p, end, &entry_len,
  45519. MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED ) ) != 0 )
  45520. {
  45521. if( ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG )
  45522. return( 0 );
  45523. return( ret );
  45524. }
  45525. end = *p + entry_len;
  45526. while( *p < end )
  45527. {
  45528. size_t len2;
  45529. const unsigned char *end2;
  45530. if( ( ret = mbedtls_asn1_get_tag( p, end, &len2,
  45531. MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED ) ) != 0 )
  45532. {
  45533. return( ret );
  45534. }
  45535. cur_entry->raw.tag = **p;
  45536. cur_entry->raw.p = *p;
  45537. cur_entry->raw.len = len2;
  45538. end2 = *p + len2;
  45539. if( ( ret = mbedtls_x509_get_serial( p, end2, &cur_entry->serial ) ) != 0 )
  45540. return( ret );
  45541. if( ( ret = mbedtls_x509_get_time( p, end2,
  45542. &cur_entry->revocation_date ) ) != 0 )
  45543. return( ret );
  45544. if( ( ret = x509_get_crl_entry_ext( p, end2,
  45545. &cur_entry->entry_ext ) ) != 0 )
  45546. return( ret );
  45547. if( *p < end )
  45548. {
  45549. cur_entry->next = mbedtls_calloc( 1, sizeof( mbedtls_x509_crl_entry ) );
  45550. if( cur_entry->next == NULL )
  45551. return( MBEDTLS_ERR_X509_ALLOC_FAILED );
  45552. cur_entry = cur_entry->next;
  45553. }
  45554. }
  45555. return( 0 );
  45556. }
  45557. /*
  45558. * Parse one CRLs in DER format and append it to the chained list
  45559. */
  45560. int mbedtls_x509_crl_parse_der( mbedtls_x509_crl *chain,
  45561. const unsigned char *buf, size_t buflen )
  45562. {
  45563. int ret;
  45564. size_t len;
  45565. unsigned char *p, *end;
  45566. mbedtls_x509_buf sig_params1, sig_params2, sig_oid2;
  45567. mbedtls_x509_crl *crl = chain;
  45568. /*
  45569. * Check for valid input
  45570. */
  45571. if( crl == NULL || buf == NULL )
  45572. return( MBEDTLS_ERR_X509_BAD_INPUT_DATA );
  45573. memset( &sig_params1, 0, sizeof( mbedtls_x509_buf ) );
  45574. memset( &sig_params2, 0, sizeof( mbedtls_x509_buf ) );
  45575. memset( &sig_oid2, 0, sizeof( mbedtls_x509_buf ) );
  45576. /*
  45577. * Add new CRL on the end of the chain if needed.
  45578. */
  45579. while( crl->version != 0 && crl->next != NULL )
  45580. crl = crl->next;
  45581. if( crl->version != 0 && crl->next == NULL )
  45582. {
  45583. crl->next = mbedtls_calloc( 1, sizeof( mbedtls_x509_crl ) );
  45584. if( crl->next == NULL )
  45585. {
  45586. mbedtls_x509_crl_free( crl );
  45587. return( MBEDTLS_ERR_X509_ALLOC_FAILED );
  45588. }
  45589. mbedtls_x509_crl_init( crl->next );
  45590. crl = crl->next;
  45591. }
  45592. /*
  45593. * Copy raw DER-encoded CRL
  45594. */
  45595. if( ( p = mbedtls_calloc( 1, buflen ) ) == NULL )
  45596. return( MBEDTLS_ERR_X509_ALLOC_FAILED );
  45597. memcpy( p, buf, buflen );
  45598. crl->raw.p = p;
  45599. crl->raw.len = buflen;
  45600. end = p + buflen;
  45601. /*
  45602. * CertificateList ::= SEQUENCE {
  45603. * tbsCertList TBSCertList,
  45604. * signatureAlgorithm AlgorithmIdentifier,
  45605. * signatureValue BIT STRING }
  45606. */
  45607. if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,
  45608. MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )
  45609. {
  45610. mbedtls_x509_crl_free( crl );
  45611. return( MBEDTLS_ERR_X509_INVALID_FORMAT );
  45612. }
  45613. if( len != (size_t) ( end - p ) )
  45614. {
  45615. mbedtls_x509_crl_free( crl );
  45616. return( MBEDTLS_ERR_X509_INVALID_FORMAT +
  45617. MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
  45618. }
  45619. /*
  45620. * TBSCertList ::= SEQUENCE {
  45621. */
  45622. crl->tbs.p = p;
  45623. if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,
  45624. MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )
  45625. {
  45626. mbedtls_x509_crl_free( crl );
  45627. return( MBEDTLS_ERR_X509_INVALID_FORMAT + ret );
  45628. }
  45629. end = p + len;
  45630. crl->tbs.len = end - crl->tbs.p;
  45631. /*
  45632. * Version ::= INTEGER OPTIONAL { v1(0), v2(1) }
  45633. * -- if present, MUST be v2
  45634. *
  45635. * signature AlgorithmIdentifier
  45636. */
  45637. if( ( ret = x509_crl_get_version( &p, end, &crl->version ) ) != 0 ||
  45638. ( ret = mbedtls_x509_get_alg( &p, end, &crl->sig_oid, &sig_params1 ) ) != 0 )
  45639. {
  45640. mbedtls_x509_crl_free( crl );
  45641. return( ret );
  45642. }
  45643. crl->version++;
  45644. if( crl->version > 2 )
  45645. {
  45646. mbedtls_x509_crl_free( crl );
  45647. return( MBEDTLS_ERR_X509_UNKNOWN_VERSION );
  45648. }
  45649. if( ( ret = mbedtls_x509_get_sig_alg( &crl->sig_oid, &sig_params1,
  45650. &crl->sig_md, &crl->sig_pk,
  45651. &crl->sig_opts ) ) != 0 )
  45652. {
  45653. mbedtls_x509_crl_free( crl );
  45654. return( MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG );
  45655. }
  45656. /*
  45657. * issuer Name
  45658. */
  45659. crl->issuer_raw.p = p;
  45660. if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,
  45661. MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )
  45662. {
  45663. mbedtls_x509_crl_free( crl );
  45664. return( MBEDTLS_ERR_X509_INVALID_FORMAT + ret );
  45665. }
  45666. if( ( ret = mbedtls_x509_get_name( &p, p + len, &crl->issuer ) ) != 0 )
  45667. {
  45668. mbedtls_x509_crl_free( crl );
  45669. return( ret );
  45670. }
  45671. crl->issuer_raw.len = p - crl->issuer_raw.p;
  45672. /*
  45673. * thisUpdate Time
  45674. * nextUpdate Time OPTIONAL
  45675. */
  45676. if( ( ret = mbedtls_x509_get_time( &p, end, &crl->this_update ) ) != 0 )
  45677. {
  45678. mbedtls_x509_crl_free( crl );
  45679. return( ret );
  45680. }
  45681. if( ( ret = mbedtls_x509_get_time( &p, end, &crl->next_update ) ) != 0 )
  45682. {
  45683. if( ret != ( MBEDTLS_ERR_X509_INVALID_DATE +
  45684. MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ) &&
  45685. ret != ( MBEDTLS_ERR_X509_INVALID_DATE +
  45686. MBEDTLS_ERR_ASN1_OUT_OF_DATA ) )
  45687. {
  45688. mbedtls_x509_crl_free( crl );
  45689. return( ret );
  45690. }
  45691. }
  45692. /*
  45693. * revokedCertificates SEQUENCE OF SEQUENCE {
  45694. * userCertificate CertificateSerialNumber,
  45695. * revocationDate Time,
  45696. * crlEntryExtensions Extensions OPTIONAL
  45697. * -- if present, MUST be v2
  45698. * } OPTIONAL
  45699. */
  45700. if( ( ret = x509_get_entries( &p, end, &crl->entry ) ) != 0 )
  45701. {
  45702. mbedtls_x509_crl_free( crl );
  45703. return( ret );
  45704. }
  45705. /*
  45706. * crlExtensions EXPLICIT Extensions OPTIONAL
  45707. * -- if present, MUST be v2
  45708. */
  45709. if( crl->version == 2 )
  45710. {
  45711. ret = x509_get_crl_ext( &p, end, &crl->crl_ext );
  45712. if( ret != 0 )
  45713. {
  45714. mbedtls_x509_crl_free( crl );
  45715. return( ret );
  45716. }
  45717. }
  45718. if( p != end )
  45719. {
  45720. mbedtls_x509_crl_free( crl );
  45721. return( MBEDTLS_ERR_X509_INVALID_FORMAT +
  45722. MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
  45723. }
  45724. end = crl->raw.p + crl->raw.len;
  45725. /*
  45726. * signatureAlgorithm AlgorithmIdentifier,
  45727. * signatureValue BIT STRING
  45728. */
  45729. if( ( ret = mbedtls_x509_get_alg( &p, end, &sig_oid2, &sig_params2 ) ) != 0 )
  45730. {
  45731. mbedtls_x509_crl_free( crl );
  45732. return( ret );
  45733. }
  45734. if( crl->sig_oid.len != sig_oid2.len ||
  45735. memcmp( crl->sig_oid.p, sig_oid2.p, crl->sig_oid.len ) != 0 ||
  45736. sig_params1.len != sig_params2.len ||
  45737. ( sig_params1.len != 0 &&
  45738. memcmp( sig_params1.p, sig_params2.p, sig_params1.len ) != 0 ) )
  45739. {
  45740. mbedtls_x509_crl_free( crl );
  45741. return( MBEDTLS_ERR_X509_SIG_MISMATCH );
  45742. }
  45743. if( ( ret = mbedtls_x509_get_sig( &p, end, &crl->sig ) ) != 0 )
  45744. {
  45745. mbedtls_x509_crl_free( crl );
  45746. return( ret );
  45747. }
  45748. if( p != end )
  45749. {
  45750. mbedtls_x509_crl_free( crl );
  45751. return( MBEDTLS_ERR_X509_INVALID_FORMAT +
  45752. MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
  45753. }
  45754. return( 0 );
  45755. }
  45756. /*
  45757. * Parse one or more CRLs and add them to the chained list
  45758. */
  45759. int mbedtls_x509_crl_parse( mbedtls_x509_crl *chain, const unsigned char *buf, size_t buflen )
  45760. {
  45761. #if defined(MBEDTLS_PEM_PARSE_C)
  45762. int ret;
  45763. size_t use_len;
  45764. mbedtls_pem_context pem;
  45765. int is_pem = 0;
  45766. if( chain == NULL || buf == NULL )
  45767. return( MBEDTLS_ERR_X509_BAD_INPUT_DATA );
  45768. do
  45769. {
  45770. mbedtls_pem_init( &pem );
  45771. /* Avoid calling mbedtls_pem_read_buffer() on non-null-terminated string */
  45772. if( buflen == 0 || buf[buflen - 1] != '\0' )
  45773. ret = MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT;
  45774. else
  45775. ret = mbedtls_pem_read_buffer( &pem,
  45776. "-----BEGIN X509 CRL-----",
  45777. "-----END X509 CRL-----",
  45778. buf, NULL, 0, &use_len );
  45779. if( ret == 0 )
  45780. {
  45781. /*
  45782. * Was PEM encoded
  45783. */
  45784. is_pem = 1;
  45785. buflen -= use_len;
  45786. buf += use_len;
  45787. if( ( ret = mbedtls_x509_crl_parse_der( chain,
  45788. pem.buf, pem.buflen ) ) != 0 )
  45789. {
  45790. return( ret );
  45791. }
  45792. mbedtls_pem_free( &pem );
  45793. }
  45794. else if( ret != MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT )
  45795. {
  45796. mbedtls_pem_free( &pem );
  45797. return( ret );
  45798. }
  45799. }
  45800. /* In the PEM case, buflen is 1 at the end, for the terminated NULL byte.
  45801. * And a valid CRL cannot be less than 1 byte anyway. */
  45802. while( is_pem && buflen > 1 );
  45803. if( is_pem )
  45804. return( 0 );
  45805. else
  45806. #endif /* MBEDTLS_PEM_PARSE_C */
  45807. return( mbedtls_x509_crl_parse_der( chain, buf, buflen ) );
  45808. }
  45809. #if defined(MBEDTLS_FS_IO)
  45810. /*
  45811. * Load one or more CRLs and add them to the chained list
  45812. */
  45813. int mbedtls_x509_crl_parse_file( mbedtls_x509_crl *chain, const char *path )
  45814. {
  45815. int ret;
  45816. size_t n;
  45817. unsigned char *buf;
  45818. if( ( ret = mbedtls_pk_load_file( path, &buf, &n ) ) != 0 )
  45819. return( ret );
  45820. ret = mbedtls_x509_crl_parse( chain, buf, n );
  45821. x509_crl_zeroize( buf, n );
  45822. mbedtls_free( buf );
  45823. return( ret );
  45824. }
  45825. #endif /* MBEDTLS_FS_IO */
  45826. /*
  45827. * Return an informational string about the certificate.
  45828. */
  45829. #define BEFORE_COLON 14
  45830. #define BC "14"
  45831. /*
  45832. * Return an informational string about the CRL.
  45833. */
  45834. int mbedtls_x509_crl_info( char *buf, size_t size, const char *prefix,
  45835. const mbedtls_x509_crl *crl )
  45836. {
  45837. int ret;
  45838. size_t n;
  45839. char *p;
  45840. const mbedtls_x509_crl_entry *entry;
  45841. p = buf;
  45842. n = size;
  45843. ret = mbedtls_snprintf( p, n, "%sCRL version : %d",
  45844. prefix, crl->version );
  45845. MBEDTLS_X509_SAFE_SNPRINTF;
  45846. ret = mbedtls_snprintf( p, n, "\n%sissuer name : ", prefix );
  45847. MBEDTLS_X509_SAFE_SNPRINTF;
  45848. ret = mbedtls_x509_dn_gets( p, n, &crl->issuer );
  45849. MBEDTLS_X509_SAFE_SNPRINTF;
  45850. ret = mbedtls_snprintf( p, n, "\n%sthis update : " \
  45851. "%04d-%02d-%02d %02d:%02d:%02d", prefix,
  45852. crl->this_update.year, crl->this_update.mon,
  45853. crl->this_update.day, crl->this_update.hour,
  45854. crl->this_update.min, crl->this_update.sec );
  45855. MBEDTLS_X509_SAFE_SNPRINTF;
  45856. ret = mbedtls_snprintf( p, n, "\n%snext update : " \
  45857. "%04d-%02d-%02d %02d:%02d:%02d", prefix,
  45858. crl->next_update.year, crl->next_update.mon,
  45859. crl->next_update.day, crl->next_update.hour,
  45860. crl->next_update.min, crl->next_update.sec );
  45861. MBEDTLS_X509_SAFE_SNPRINTF;
  45862. entry = &crl->entry;
  45863. ret = mbedtls_snprintf( p, n, "\n%sRevoked certificates:",
  45864. prefix );
  45865. MBEDTLS_X509_SAFE_SNPRINTF;
  45866. while( entry != NULL && entry->raw.len != 0 )
  45867. {
  45868. ret = mbedtls_snprintf( p, n, "\n%sserial number: ",
  45869. prefix );
  45870. MBEDTLS_X509_SAFE_SNPRINTF;
  45871. ret = mbedtls_x509_serial_gets( p, n, &entry->serial );
  45872. MBEDTLS_X509_SAFE_SNPRINTF;
  45873. ret = mbedtls_snprintf( p, n, " revocation date: " \
  45874. "%04d-%02d-%02d %02d:%02d:%02d",
  45875. entry->revocation_date.year, entry->revocation_date.mon,
  45876. entry->revocation_date.day, entry->revocation_date.hour,
  45877. entry->revocation_date.min, entry->revocation_date.sec );
  45878. MBEDTLS_X509_SAFE_SNPRINTF;
  45879. entry = entry->next;
  45880. }
  45881. ret = mbedtls_snprintf( p, n, "\n%ssigned using : ", prefix );
  45882. MBEDTLS_X509_SAFE_SNPRINTF;
  45883. ret = mbedtls_x509_sig_alg_gets( p, n, &crl->sig_oid, crl->sig_pk, crl->sig_md,
  45884. crl->sig_opts );
  45885. MBEDTLS_X509_SAFE_SNPRINTF;
  45886. ret = mbedtls_snprintf( p, n, "\n" );
  45887. MBEDTLS_X509_SAFE_SNPRINTF;
  45888. return( (int) ( size - n ) );
  45889. }
  45890. /*
  45891. * Initialize a CRL chain
  45892. */
  45893. void mbedtls_x509_crl_init( mbedtls_x509_crl *crl )
  45894. {
  45895. memset( crl, 0, sizeof(mbedtls_x509_crl) );
  45896. }
  45897. /*
  45898. * Unallocate all CRL data
  45899. */
  45900. void mbedtls_x509_crl_free( mbedtls_x509_crl *crl )
  45901. {
  45902. mbedtls_x509_crl *crl_cur = crl;
  45903. mbedtls_x509_crl *crl_prv;
  45904. mbedtls_x509_name *name_cur;
  45905. mbedtls_x509_name *name_prv;
  45906. mbedtls_x509_crl_entry *entry_cur;
  45907. mbedtls_x509_crl_entry *entry_prv;
  45908. if( crl == NULL )
  45909. return;
  45910. do
  45911. {
  45912. #if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT)
  45913. mbedtls_free( crl_cur->sig_opts );
  45914. #endif
  45915. name_cur = crl_cur->issuer.next;
  45916. while( name_cur != NULL )
  45917. {
  45918. name_prv = name_cur;
  45919. name_cur = name_cur->next;
  45920. x509_crl_zeroize( name_prv, sizeof( mbedtls_x509_name ) );
  45921. mbedtls_free( name_prv );
  45922. }
  45923. entry_cur = crl_cur->entry.next;
  45924. while( entry_cur != NULL )
  45925. {
  45926. entry_prv = entry_cur;
  45927. entry_cur = entry_cur->next;
  45928. x509_crl_zeroize( entry_prv, sizeof( mbedtls_x509_crl_entry ) );
  45929. mbedtls_free( entry_prv );
  45930. }
  45931. if( crl_cur->raw.p != NULL )
  45932. {
  45933. x509_crl_zeroize( crl_cur->raw.p, crl_cur->raw.len );
  45934. mbedtls_free( crl_cur->raw.p );
  45935. }
  45936. crl_cur = crl_cur->next;
  45937. }
  45938. while( crl_cur != NULL );
  45939. crl_cur = crl;
  45940. do
  45941. {
  45942. crl_prv = crl_cur;
  45943. crl_cur = crl_cur->next;
  45944. x509_crl_zeroize( crl_prv, sizeof( mbedtls_x509_crl ) );
  45945. if( crl_prv != crl )
  45946. mbedtls_free( crl_prv );
  45947. }
  45948. while( crl_cur != NULL );
  45949. }
  45950. /* Amalgamated Release Mappings */
  45951. #undef SAFE_SNPRINTF
  45952. #undef BEFORE_COLON
  45953. #undef BC
  45954. #endif /* MBEDTLS_X509_CRL_PARSE_C */
  45955. /********* Start of file library/x509_crt.c ************/
  45956. /*
  45957. * X.509 certificate parsing and verification
  45958. *
  45959. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  45960. * SPDX-License-Identifier: Apache-2.0
  45961. *
  45962. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  45963. * not use this file except in compliance with the License.
  45964. * You may obtain a copy of the License at
  45965. *
  45966. * http://www.apache.org/licenses/LICENSE-2.0
  45967. *
  45968. * Unless required by applicable law or agreed to in writing, software
  45969. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  45970. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  45971. * See the License for the specific language governing permissions and
  45972. * limitations under the License.
  45973. *
  45974. * This file is part of mbed TLS (https://tls.mbed.org)
  45975. */
  45976. /*
  45977. * The ITU-T X.509 standard defines a certificate format for PKI.
  45978. *
  45979. * http://www.ietf.org/rfc/rfc5280.txt (Certificates and CRLs)
  45980. * http://www.ietf.org/rfc/rfc3279.txt (Alg IDs for CRLs)
  45981. * http://www.ietf.org/rfc/rfc2986.txt (CSRs, aka PKCS#10)
  45982. *
  45983. * http://www.itu.int/ITU-T/studygroups/com17/languages/X.680-0207.pdf
  45984. * http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf
  45985. */
  45986. #if !defined(MBEDTLS_CONFIG_FILE)
  45987. #else
  45988. #endif
  45989. #if defined(MBEDTLS_X509_CRT_PARSE_C)
  45990. #include <stdio.h>
  45991. #include <string.h>
  45992. #if defined(MBEDTLS_PEM_PARSE_C)
  45993. #endif
  45994. #if defined(MBEDTLS_PLATFORM_C)
  45995. #else
  45996. #include <stdlib.h>
  45997. #define mbedtls_free free
  45998. #define mbedtls_calloc calloc
  45999. #define mbedtls_snprintf snprintf
  46000. #endif
  46001. #if defined(MBEDTLS_THREADING_C)
  46002. #endif
  46003. #if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32)
  46004. #include <windows.h>
  46005. #else
  46006. #include <time.h>
  46007. #endif
  46008. #if defined(MBEDTLS_FS_IO)
  46009. #include <stdio.h>
  46010. #if !defined(_WIN32) || defined(EFIX64) || defined(EFI32)
  46011. #include <sys/types.h>
  46012. #include <sys/stat.h>
  46013. #include <dirent.h>
  46014. #endif /* !_WIN32 || EFIX64 || EFI32 */
  46015. #endif
  46016. /* Implementation that should never be optimized out by the compiler */
  46017. static void x509_crt_zeroize( void *v, size_t n ) {
  46018. volatile unsigned char *p = v; while( n-- ) *p++ = 0;
  46019. }
  46020. /*
  46021. * Default profile
  46022. */
  46023. const mbedtls_x509_crt_profile mbedtls_x509_crt_profile_default =
  46024. {
  46025. /* Hashes from SHA-1 and above */
  46026. MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA1 ) |
  46027. MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_RIPEMD160 ) |
  46028. MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA224 ) |
  46029. MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA256 ) |
  46030. MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA384 ) |
  46031. MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA512 ),
  46032. 0xFFFFFFF, /* Any PK alg */
  46033. 0xFFFFFFF, /* Any curve */
  46034. 2048,
  46035. };
  46036. /*
  46037. * Next-default profile
  46038. */
  46039. const mbedtls_x509_crt_profile mbedtls_x509_crt_profile_next =
  46040. {
  46041. /* Hashes from SHA-256 and above */
  46042. MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA256 ) |
  46043. MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA384 ) |
  46044. MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA512 ),
  46045. 0xFFFFFFF, /* Any PK alg */
  46046. #if defined(MBEDTLS_ECP_C)
  46047. /* Curves at or above 128-bit security level */
  46048. MBEDTLS_X509_ID_FLAG( MBEDTLS_ECP_DP_SECP256R1 ) |
  46049. MBEDTLS_X509_ID_FLAG( MBEDTLS_ECP_DP_SECP384R1 ) |
  46050. MBEDTLS_X509_ID_FLAG( MBEDTLS_ECP_DP_SECP521R1 ) |
  46051. MBEDTLS_X509_ID_FLAG( MBEDTLS_ECP_DP_BP256R1 ) |
  46052. MBEDTLS_X509_ID_FLAG( MBEDTLS_ECP_DP_BP384R1 ) |
  46053. MBEDTLS_X509_ID_FLAG( MBEDTLS_ECP_DP_BP512R1 ) |
  46054. MBEDTLS_X509_ID_FLAG( MBEDTLS_ECP_DP_SECP256K1 ),
  46055. #else
  46056. 0,
  46057. #endif
  46058. 2048,
  46059. };
  46060. /*
  46061. * NSA Suite B Profile
  46062. */
  46063. const mbedtls_x509_crt_profile mbedtls_x509_crt_profile_suiteb =
  46064. {
  46065. /* Only SHA-256 and 384 */
  46066. MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA256 ) |
  46067. MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA384 ),
  46068. /* Only ECDSA */
  46069. MBEDTLS_X509_ID_FLAG( MBEDTLS_PK_ECDSA ),
  46070. #if defined(MBEDTLS_ECP_C)
  46071. /* Only NIST P-256 and P-384 */
  46072. MBEDTLS_X509_ID_FLAG( MBEDTLS_ECP_DP_SECP256R1 ) |
  46073. MBEDTLS_X509_ID_FLAG( MBEDTLS_ECP_DP_SECP384R1 ),
  46074. #else
  46075. 0,
  46076. #endif
  46077. 0,
  46078. };
  46079. /*
  46080. * Check md_alg against profile
  46081. * Return 0 if md_alg acceptable for this profile, -1 otherwise
  46082. */
  46083. static int x509_profile_check_md_alg( const mbedtls_x509_crt_profile *profile,
  46084. mbedtls_md_type_t md_alg )
  46085. {
  46086. if( ( profile->allowed_mds & MBEDTLS_X509_ID_FLAG( md_alg ) ) != 0 )
  46087. return( 0 );
  46088. return( -1 );
  46089. }
  46090. /*
  46091. * Check pk_alg against profile
  46092. * Return 0 if pk_alg acceptable for this profile, -1 otherwise
  46093. */
  46094. static int x509_profile_check_pk_alg( const mbedtls_x509_crt_profile *profile,
  46095. mbedtls_pk_type_t pk_alg )
  46096. {
  46097. if( ( profile->allowed_pks & MBEDTLS_X509_ID_FLAG( pk_alg ) ) != 0 )
  46098. return( 0 );
  46099. return( -1 );
  46100. }
  46101. /*
  46102. * Check key against profile
  46103. * Return 0 if pk_alg acceptable for this profile, -1 otherwise
  46104. */
  46105. static int x509_profile_check_key( const mbedtls_x509_crt_profile *profile,
  46106. mbedtls_pk_type_t pk_alg,
  46107. const mbedtls_pk_context *pk )
  46108. {
  46109. #if defined(MBEDTLS_RSA_C)
  46110. if( pk_alg == MBEDTLS_PK_RSA || pk_alg == MBEDTLS_PK_RSASSA_PSS )
  46111. {
  46112. if( mbedtls_pk_get_bitlen( pk ) >= profile->rsa_min_bitlen )
  46113. return( 0 );
  46114. return( -1 );
  46115. }
  46116. #endif
  46117. #if defined(MBEDTLS_ECP_C)
  46118. if( pk_alg == MBEDTLS_PK_ECDSA ||
  46119. pk_alg == MBEDTLS_PK_ECKEY ||
  46120. pk_alg == MBEDTLS_PK_ECKEY_DH )
  46121. {
  46122. mbedtls_ecp_group_id gid = mbedtls_pk_ec( *pk )->grp.id;
  46123. if( ( profile->allowed_curves & MBEDTLS_X509_ID_FLAG( gid ) ) != 0 )
  46124. return( 0 );
  46125. return( -1 );
  46126. }
  46127. #endif
  46128. return( -1 );
  46129. }
  46130. /*
  46131. * Version ::= INTEGER { v1(0), v2(1), v3(2) }
  46132. */
  46133. static int x509_get_version( unsigned char **p,
  46134. const unsigned char *end,
  46135. int *ver )
  46136. {
  46137. int ret;
  46138. size_t len;
  46139. if( ( ret = mbedtls_asn1_get_tag( p, end, &len,
  46140. MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | 0 ) ) != 0 )
  46141. {
  46142. if( ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG )
  46143. {
  46144. *ver = 0;
  46145. return( 0 );
  46146. }
  46147. return( ret );
  46148. }
  46149. end = *p + len;
  46150. if( ( ret = mbedtls_asn1_get_int( p, end, ver ) ) != 0 )
  46151. return( MBEDTLS_ERR_X509_INVALID_VERSION + ret );
  46152. if( *p != end )
  46153. return( MBEDTLS_ERR_X509_INVALID_VERSION +
  46154. MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
  46155. return( 0 );
  46156. }
  46157. /*
  46158. * Validity ::= SEQUENCE {
  46159. * notBefore Time,
  46160. * notAfter Time }
  46161. */
  46162. static int x509_get_dates( unsigned char **p,
  46163. const unsigned char *end,
  46164. mbedtls_x509_time *from,
  46165. mbedtls_x509_time *to )
  46166. {
  46167. int ret;
  46168. size_t len;
  46169. if( ( ret = mbedtls_asn1_get_tag( p, end, &len,
  46170. MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )
  46171. return( MBEDTLS_ERR_X509_INVALID_DATE + ret );
  46172. end = *p + len;
  46173. if( ( ret = mbedtls_x509_get_time( p, end, from ) ) != 0 )
  46174. return( ret );
  46175. if( ( ret = mbedtls_x509_get_time( p, end, to ) ) != 0 )
  46176. return( ret );
  46177. if( *p != end )
  46178. return( MBEDTLS_ERR_X509_INVALID_DATE +
  46179. MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
  46180. return( 0 );
  46181. }
  46182. /*
  46183. * X.509 v2/v3 unique identifier (not parsed)
  46184. */
  46185. static int x509_get_uid( unsigned char **p,
  46186. const unsigned char *end,
  46187. mbedtls_x509_buf *uid, int n )
  46188. {
  46189. int ret;
  46190. if( *p == end )
  46191. return( 0 );
  46192. uid->tag = **p;
  46193. if( ( ret = mbedtls_asn1_get_tag( p, end, &uid->len,
  46194. MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | n ) ) != 0 )
  46195. {
  46196. if( ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG )
  46197. return( 0 );
  46198. return( ret );
  46199. }
  46200. uid->p = *p;
  46201. *p += uid->len;
  46202. return( 0 );
  46203. }
  46204. static int x509_get_basic_constraints( unsigned char **p,
  46205. const unsigned char *end,
  46206. int *ca_istrue,
  46207. int *max_pathlen )
  46208. {
  46209. int ret;
  46210. size_t len;
  46211. /*
  46212. * BasicConstraints ::= SEQUENCE {
  46213. * cA BOOLEAN DEFAULT FALSE,
  46214. * pathLenConstraint INTEGER (0..MAX) OPTIONAL }
  46215. */
  46216. *ca_istrue = 0; /* DEFAULT FALSE */
  46217. *max_pathlen = 0; /* endless */
  46218. if( ( ret = mbedtls_asn1_get_tag( p, end, &len,
  46219. MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )
  46220. return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret );
  46221. if( *p == end )
  46222. return( 0 );
  46223. if( ( ret = mbedtls_asn1_get_bool( p, end, ca_istrue ) ) != 0 )
  46224. {
  46225. if( ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG )
  46226. ret = mbedtls_asn1_get_int( p, end, ca_istrue );
  46227. if( ret != 0 )
  46228. return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret );
  46229. if( *ca_istrue != 0 )
  46230. *ca_istrue = 1;
  46231. }
  46232. if( *p == end )
  46233. return( 0 );
  46234. if( ( ret = mbedtls_asn1_get_int( p, end, max_pathlen ) ) != 0 )
  46235. return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret );
  46236. if( *p != end )
  46237. return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS +
  46238. MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
  46239. (*max_pathlen)++;
  46240. return( 0 );
  46241. }
  46242. static int x509_get_ns_cert_type( unsigned char **p,
  46243. const unsigned char *end,
  46244. unsigned char *ns_cert_type)
  46245. {
  46246. int ret;
  46247. mbedtls_x509_bitstring bs = { 0, 0, NULL };
  46248. if( ( ret = mbedtls_asn1_get_bitstring( p, end, &bs ) ) != 0 )
  46249. return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret );
  46250. if( bs.len != 1 )
  46251. return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS +
  46252. MBEDTLS_ERR_ASN1_INVALID_LENGTH );
  46253. /* Get actual bitstring */
  46254. *ns_cert_type = *bs.p;
  46255. return( 0 );
  46256. }
  46257. static int x509_get_key_usage( unsigned char **p,
  46258. const unsigned char *end,
  46259. unsigned int *key_usage)
  46260. {
  46261. int ret;
  46262. size_t i;
  46263. mbedtls_x509_bitstring bs = { 0, 0, NULL };
  46264. if( ( ret = mbedtls_asn1_get_bitstring( p, end, &bs ) ) != 0 )
  46265. return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret );
  46266. if( bs.len < 1 )
  46267. return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS +
  46268. MBEDTLS_ERR_ASN1_INVALID_LENGTH );
  46269. /* Get actual bitstring */
  46270. *key_usage = 0;
  46271. for( i = 0; i < bs.len && i < sizeof( unsigned int ); i++ )
  46272. {
  46273. *key_usage |= (unsigned int) bs.p[i] << (8*i);
  46274. }
  46275. return( 0 );
  46276. }
  46277. /*
  46278. * ExtKeyUsageSyntax ::= SEQUENCE SIZE (1..MAX) OF KeyPurposeId
  46279. *
  46280. * KeyPurposeId ::= OBJECT IDENTIFIER
  46281. */
  46282. static int x509_get_ext_key_usage( unsigned char **p,
  46283. const unsigned char *end,
  46284. mbedtls_x509_sequence *ext_key_usage)
  46285. {
  46286. int ret;
  46287. if( ( ret = mbedtls_asn1_get_sequence_of( p, end, ext_key_usage, MBEDTLS_ASN1_OID ) ) != 0 )
  46288. return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret );
  46289. /* Sequence length must be >= 1 */
  46290. if( ext_key_usage->buf.p == NULL )
  46291. return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS +
  46292. MBEDTLS_ERR_ASN1_INVALID_LENGTH );
  46293. return( 0 );
  46294. }
  46295. /*
  46296. * SubjectAltName ::= GeneralNames
  46297. *
  46298. * GeneralNames ::= SEQUENCE SIZE (1..MAX) OF GeneralName
  46299. *
  46300. * GeneralName ::= CHOICE {
  46301. * otherName [0] OtherName,
  46302. * rfc822Name [1] IA5String,
  46303. * dNSName [2] IA5String,
  46304. * x400Address [3] ORAddress,
  46305. * directoryName [4] Name,
  46306. * ediPartyName [5] EDIPartyName,
  46307. * uniformResourceIdentifier [6] IA5String,
  46308. * iPAddress [7] OCTET STRING,
  46309. * registeredID [8] OBJECT IDENTIFIER }
  46310. *
  46311. * OtherName ::= SEQUENCE {
  46312. * type-id OBJECT IDENTIFIER,
  46313. * value [0] EXPLICIT ANY DEFINED BY type-id }
  46314. *
  46315. * EDIPartyName ::= SEQUENCE {
  46316. * nameAssigner [0] DirectoryString OPTIONAL,
  46317. * partyName [1] DirectoryString }
  46318. *
  46319. * NOTE: we only parse and use dNSName at this point.
  46320. */
  46321. static int x509_get_subject_alt_name( unsigned char **p,
  46322. const unsigned char *end,
  46323. mbedtls_x509_sequence *subject_alt_name )
  46324. {
  46325. int ret;
  46326. size_t len, tag_len;
  46327. mbedtls_asn1_buf *buf;
  46328. unsigned char tag;
  46329. mbedtls_asn1_sequence *cur = subject_alt_name;
  46330. /* Get main sequence tag */
  46331. if( ( ret = mbedtls_asn1_get_tag( p, end, &len,
  46332. MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )
  46333. return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret );
  46334. if( *p + len != end )
  46335. return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS +
  46336. MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
  46337. while( *p < end )
  46338. {
  46339. if( ( end - *p ) < 1 )
  46340. return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS +
  46341. MBEDTLS_ERR_ASN1_OUT_OF_DATA );
  46342. tag = **p;
  46343. (*p)++;
  46344. if( ( ret = mbedtls_asn1_get_len( p, end, &tag_len ) ) != 0 )
  46345. return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret );
  46346. if( ( tag & MBEDTLS_ASN1_CONTEXT_SPECIFIC ) != MBEDTLS_ASN1_CONTEXT_SPECIFIC )
  46347. return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS +
  46348. MBEDTLS_ERR_ASN1_UNEXPECTED_TAG );
  46349. /* Skip everything but DNS name */
  46350. if( tag != ( MBEDTLS_ASN1_CONTEXT_SPECIFIC | 2 ) )
  46351. {
  46352. *p += tag_len;
  46353. continue;
  46354. }
  46355. /* Allocate and assign next pointer */
  46356. if( cur->buf.p != NULL )
  46357. {
  46358. if( cur->next != NULL )
  46359. return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS );
  46360. cur->next = mbedtls_calloc( 1, sizeof( mbedtls_asn1_sequence ) );
  46361. if( cur->next == NULL )
  46362. return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS +
  46363. MBEDTLS_ERR_ASN1_ALLOC_FAILED );
  46364. cur = cur->next;
  46365. }
  46366. buf = &(cur->buf);
  46367. buf->tag = tag;
  46368. buf->p = *p;
  46369. buf->len = tag_len;
  46370. *p += buf->len;
  46371. }
  46372. /* Set final sequence entry's next pointer to NULL */
  46373. cur->next = NULL;
  46374. if( *p != end )
  46375. return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS +
  46376. MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
  46377. return( 0 );
  46378. }
  46379. /*
  46380. * X.509 v3 extensions
  46381. *
  46382. * TODO: Perform all of the basic constraints tests required by the RFC
  46383. * TODO: Set values for undetected extensions to a sane default?
  46384. *
  46385. */
  46386. static int x509_get_crt_ext( unsigned char **p,
  46387. const unsigned char *end,
  46388. mbedtls_x509_crt *crt )
  46389. {
  46390. int ret;
  46391. size_t len;
  46392. unsigned char *end_ext_data, *end_ext_octet;
  46393. if( ( ret = mbedtls_x509_get_ext( p, end, &crt->v3_ext, 3 ) ) != 0 )
  46394. {
  46395. if( ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG )
  46396. return( 0 );
  46397. return( ret );
  46398. }
  46399. while( *p < end )
  46400. {
  46401. /*
  46402. * Extension ::= SEQUENCE {
  46403. * extnID OBJECT IDENTIFIER,
  46404. * critical BOOLEAN DEFAULT FALSE,
  46405. * extnValue OCTET STRING }
  46406. */
  46407. mbedtls_x509_buf extn_oid = {0, 0, NULL};
  46408. int is_critical = 0; /* DEFAULT FALSE */
  46409. int ext_type = 0;
  46410. if( ( ret = mbedtls_asn1_get_tag( p, end, &len,
  46411. MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )
  46412. return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret );
  46413. end_ext_data = *p + len;
  46414. /* Get extension ID */
  46415. extn_oid.tag = **p;
  46416. if( ( ret = mbedtls_asn1_get_tag( p, end, &extn_oid.len, MBEDTLS_ASN1_OID ) ) != 0 )
  46417. return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret );
  46418. extn_oid.p = *p;
  46419. *p += extn_oid.len;
  46420. if( ( end - *p ) < 1 )
  46421. return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS +
  46422. MBEDTLS_ERR_ASN1_OUT_OF_DATA );
  46423. /* Get optional critical */
  46424. if( ( ret = mbedtls_asn1_get_bool( p, end_ext_data, &is_critical ) ) != 0 &&
  46425. ( ret != MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ) )
  46426. return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret );
  46427. /* Data should be octet string type */
  46428. if( ( ret = mbedtls_asn1_get_tag( p, end_ext_data, &len,
  46429. MBEDTLS_ASN1_OCTET_STRING ) ) != 0 )
  46430. return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret );
  46431. end_ext_octet = *p + len;
  46432. if( end_ext_octet != end_ext_data )
  46433. return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS +
  46434. MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
  46435. /*
  46436. * Detect supported extensions
  46437. */
  46438. ret = mbedtls_oid_get_x509_ext_type( &extn_oid, &ext_type );
  46439. if( ret != 0 )
  46440. {
  46441. /* No parser found, skip extension */
  46442. *p = end_ext_octet;
  46443. #if !defined(MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION)
  46444. if( is_critical )
  46445. {
  46446. /* Data is marked as critical: fail */
  46447. return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS +
  46448. MBEDTLS_ERR_ASN1_UNEXPECTED_TAG );
  46449. }
  46450. #endif
  46451. continue;
  46452. }
  46453. /* Forbid repeated extensions */
  46454. if( ( crt->ext_types & ext_type ) != 0 )
  46455. return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS );
  46456. crt->ext_types |= ext_type;
  46457. switch( ext_type )
  46458. {
  46459. case MBEDTLS_X509_EXT_BASIC_CONSTRAINTS:
  46460. /* Parse basic constraints */
  46461. if( ( ret = x509_get_basic_constraints( p, end_ext_octet,
  46462. &crt->ca_istrue, &crt->max_pathlen ) ) != 0 )
  46463. return( ret );
  46464. break;
  46465. case MBEDTLS_X509_EXT_KEY_USAGE:
  46466. /* Parse key usage */
  46467. if( ( ret = x509_get_key_usage( p, end_ext_octet,
  46468. &crt->key_usage ) ) != 0 )
  46469. return( ret );
  46470. break;
  46471. case MBEDTLS_X509_EXT_EXTENDED_KEY_USAGE:
  46472. /* Parse extended key usage */
  46473. if( ( ret = x509_get_ext_key_usage( p, end_ext_octet,
  46474. &crt->ext_key_usage ) ) != 0 )
  46475. return( ret );
  46476. break;
  46477. case MBEDTLS_X509_EXT_SUBJECT_ALT_NAME:
  46478. /* Parse subject alt name */
  46479. if( ( ret = x509_get_subject_alt_name( p, end_ext_octet,
  46480. &crt->subject_alt_names ) ) != 0 )
  46481. return( ret );
  46482. break;
  46483. case MBEDTLS_X509_EXT_NS_CERT_TYPE:
  46484. /* Parse netscape certificate type */
  46485. if( ( ret = x509_get_ns_cert_type( p, end_ext_octet,
  46486. &crt->ns_cert_type ) ) != 0 )
  46487. return( ret );
  46488. break;
  46489. default:
  46490. return( MBEDTLS_ERR_X509_FEATURE_UNAVAILABLE );
  46491. }
  46492. }
  46493. if( *p != end )
  46494. return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS +
  46495. MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
  46496. return( 0 );
  46497. }
  46498. /*
  46499. * Parse and fill a single X.509 certificate in DER format
  46500. */
  46501. static int x509_crt_parse_der_core( mbedtls_x509_crt *crt, const unsigned char *buf,
  46502. size_t buflen )
  46503. {
  46504. int ret;
  46505. size_t len;
  46506. unsigned char *p, *end, *crt_end;
  46507. mbedtls_x509_buf sig_params1, sig_params2, sig_oid2;
  46508. memset( &sig_params1, 0, sizeof( mbedtls_x509_buf ) );
  46509. memset( &sig_params2, 0, sizeof( mbedtls_x509_buf ) );
  46510. memset( &sig_oid2, 0, sizeof( mbedtls_x509_buf ) );
  46511. /*
  46512. * Check for valid input
  46513. */
  46514. if( crt == NULL || buf == NULL )
  46515. return( MBEDTLS_ERR_X509_BAD_INPUT_DATA );
  46516. p = mbedtls_calloc( 1, len = buflen );
  46517. if( p == NULL )
  46518. return( MBEDTLS_ERR_X509_ALLOC_FAILED );
  46519. memcpy( p, buf, buflen );
  46520. crt->raw.p = p;
  46521. crt->raw.len = len;
  46522. end = p + len;
  46523. /*
  46524. * Certificate ::= SEQUENCE {
  46525. * tbsCertificate TBSCertificate,
  46526. * signatureAlgorithm AlgorithmIdentifier,
  46527. * signatureValue BIT STRING }
  46528. */
  46529. if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,
  46530. MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )
  46531. {
  46532. mbedtls_x509_crt_free( crt );
  46533. return( MBEDTLS_ERR_X509_INVALID_FORMAT );
  46534. }
  46535. if( len > (size_t) ( end - p ) )
  46536. {
  46537. mbedtls_x509_crt_free( crt );
  46538. return( MBEDTLS_ERR_X509_INVALID_FORMAT +
  46539. MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
  46540. }
  46541. crt_end = p + len;
  46542. /*
  46543. * TBSCertificate ::= SEQUENCE {
  46544. */
  46545. crt->tbs.p = p;
  46546. if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,
  46547. MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )
  46548. {
  46549. mbedtls_x509_crt_free( crt );
  46550. return( MBEDTLS_ERR_X509_INVALID_FORMAT + ret );
  46551. }
  46552. end = p + len;
  46553. crt->tbs.len = end - crt->tbs.p;
  46554. /*
  46555. * Version ::= INTEGER { v1(0), v2(1), v3(2) }
  46556. *
  46557. * CertificateSerialNumber ::= INTEGER
  46558. *
  46559. * signature AlgorithmIdentifier
  46560. */
  46561. if( ( ret = x509_get_version( &p, end, &crt->version ) ) != 0 ||
  46562. ( ret = mbedtls_x509_get_serial( &p, end, &crt->serial ) ) != 0 ||
  46563. ( ret = mbedtls_x509_get_alg( &p, end, &crt->sig_oid,
  46564. &sig_params1 ) ) != 0 )
  46565. {
  46566. mbedtls_x509_crt_free( crt );
  46567. return( ret );
  46568. }
  46569. crt->version++;
  46570. if( crt->version > 3 )
  46571. {
  46572. mbedtls_x509_crt_free( crt );
  46573. return( MBEDTLS_ERR_X509_UNKNOWN_VERSION );
  46574. }
  46575. if( ( ret = mbedtls_x509_get_sig_alg( &crt->sig_oid, &sig_params1,
  46576. &crt->sig_md, &crt->sig_pk,
  46577. &crt->sig_opts ) ) != 0 )
  46578. {
  46579. mbedtls_x509_crt_free( crt );
  46580. return( ret );
  46581. }
  46582. /*
  46583. * issuer Name
  46584. */
  46585. crt->issuer_raw.p = p;
  46586. if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,
  46587. MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )
  46588. {
  46589. mbedtls_x509_crt_free( crt );
  46590. return( MBEDTLS_ERR_X509_INVALID_FORMAT + ret );
  46591. }
  46592. if( ( ret = mbedtls_x509_get_name( &p, p + len, &crt->issuer ) ) != 0 )
  46593. {
  46594. mbedtls_x509_crt_free( crt );
  46595. return( ret );
  46596. }
  46597. crt->issuer_raw.len = p - crt->issuer_raw.p;
  46598. /*
  46599. * Validity ::= SEQUENCE {
  46600. * notBefore Time,
  46601. * notAfter Time }
  46602. *
  46603. */
  46604. if( ( ret = x509_get_dates( &p, end, &crt->valid_from,
  46605. &crt->valid_to ) ) != 0 )
  46606. {
  46607. mbedtls_x509_crt_free( crt );
  46608. return( ret );
  46609. }
  46610. /*
  46611. * subject Name
  46612. */
  46613. crt->subject_raw.p = p;
  46614. if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,
  46615. MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )
  46616. {
  46617. mbedtls_x509_crt_free( crt );
  46618. return( MBEDTLS_ERR_X509_INVALID_FORMAT + ret );
  46619. }
  46620. if( len && ( ret = mbedtls_x509_get_name( &p, p + len, &crt->subject ) ) != 0 )
  46621. {
  46622. mbedtls_x509_crt_free( crt );
  46623. return( ret );
  46624. }
  46625. crt->subject_raw.len = p - crt->subject_raw.p;
  46626. /*
  46627. * SubjectPublicKeyInfo
  46628. */
  46629. if( ( ret = mbedtls_pk_parse_subpubkey( &p, end, &crt->pk ) ) != 0 )
  46630. {
  46631. mbedtls_x509_crt_free( crt );
  46632. return( ret );
  46633. }
  46634. /*
  46635. * issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL,
  46636. * -- If present, version shall be v2 or v3
  46637. * subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL,
  46638. * -- If present, version shall be v2 or v3
  46639. * extensions [3] EXPLICIT Extensions OPTIONAL
  46640. * -- If present, version shall be v3
  46641. */
  46642. if( crt->version == 2 || crt->version == 3 )
  46643. {
  46644. ret = x509_get_uid( &p, end, &crt->issuer_id, 1 );
  46645. if( ret != 0 )
  46646. {
  46647. mbedtls_x509_crt_free( crt );
  46648. return( ret );
  46649. }
  46650. }
  46651. if( crt->version == 2 || crt->version == 3 )
  46652. {
  46653. ret = x509_get_uid( &p, end, &crt->subject_id, 2 );
  46654. if( ret != 0 )
  46655. {
  46656. mbedtls_x509_crt_free( crt );
  46657. return( ret );
  46658. }
  46659. }
  46660. #if !defined(MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3)
  46661. if( crt->version == 3 )
  46662. #endif
  46663. {
  46664. ret = x509_get_crt_ext( &p, end, crt );
  46665. if( ret != 0 )
  46666. {
  46667. mbedtls_x509_crt_free( crt );
  46668. return( ret );
  46669. }
  46670. }
  46671. if( p != end )
  46672. {
  46673. mbedtls_x509_crt_free( crt );
  46674. return( MBEDTLS_ERR_X509_INVALID_FORMAT +
  46675. MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
  46676. }
  46677. end = crt_end;
  46678. /*
  46679. * }
  46680. * -- end of TBSCertificate
  46681. *
  46682. * signatureAlgorithm AlgorithmIdentifier,
  46683. * signatureValue BIT STRING
  46684. */
  46685. if( ( ret = mbedtls_x509_get_alg( &p, end, &sig_oid2, &sig_params2 ) ) != 0 )
  46686. {
  46687. mbedtls_x509_crt_free( crt );
  46688. return( ret );
  46689. }
  46690. if( crt->sig_oid.len != sig_oid2.len ||
  46691. memcmp( crt->sig_oid.p, sig_oid2.p, crt->sig_oid.len ) != 0 ||
  46692. sig_params1.len != sig_params2.len ||
  46693. ( sig_params1.len != 0 &&
  46694. memcmp( sig_params1.p, sig_params2.p, sig_params1.len ) != 0 ) )
  46695. {
  46696. mbedtls_x509_crt_free( crt );
  46697. return( MBEDTLS_ERR_X509_SIG_MISMATCH );
  46698. }
  46699. if( ( ret = mbedtls_x509_get_sig( &p, end, &crt->sig ) ) != 0 )
  46700. {
  46701. mbedtls_x509_crt_free( crt );
  46702. return( ret );
  46703. }
  46704. if( p != end )
  46705. {
  46706. mbedtls_x509_crt_free( crt );
  46707. return( MBEDTLS_ERR_X509_INVALID_FORMAT +
  46708. MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
  46709. }
  46710. return( 0 );
  46711. }
  46712. /*
  46713. * Parse one X.509 certificate in DER format from a buffer and add them to a
  46714. * chained list
  46715. */
  46716. int mbedtls_x509_crt_parse_der( mbedtls_x509_crt *chain, const unsigned char *buf,
  46717. size_t buflen )
  46718. {
  46719. int ret;
  46720. mbedtls_x509_crt *crt = chain, *prev = NULL;
  46721. /*
  46722. * Check for valid input
  46723. */
  46724. if( crt == NULL || buf == NULL )
  46725. return( MBEDTLS_ERR_X509_BAD_INPUT_DATA );
  46726. while( crt->version != 0 && crt->next != NULL )
  46727. {
  46728. prev = crt;
  46729. crt = crt->next;
  46730. }
  46731. /*
  46732. * Add new certificate on the end of the chain if needed.
  46733. */
  46734. if( crt->version != 0 && crt->next == NULL )
  46735. {
  46736. crt->next = mbedtls_calloc( 1, sizeof( mbedtls_x509_crt ) );
  46737. if( crt->next == NULL )
  46738. return( MBEDTLS_ERR_X509_ALLOC_FAILED );
  46739. prev = crt;
  46740. mbedtls_x509_crt_init( crt->next );
  46741. crt = crt->next;
  46742. }
  46743. if( ( ret = x509_crt_parse_der_core( crt, buf, buflen ) ) != 0 )
  46744. {
  46745. if( prev )
  46746. prev->next = NULL;
  46747. if( crt != chain )
  46748. mbedtls_free( crt );
  46749. return( ret );
  46750. }
  46751. return( 0 );
  46752. }
  46753. /*
  46754. * Parse one or more PEM certificates from a buffer and add them to the chained
  46755. * list
  46756. */
  46757. int mbedtls_x509_crt_parse( mbedtls_x509_crt *chain, const unsigned char *buf, size_t buflen )
  46758. {
  46759. int success = 0, first_error = 0, total_failed = 0;
  46760. int buf_format = MBEDTLS_X509_FORMAT_DER;
  46761. /*
  46762. * Check for valid input
  46763. */
  46764. if( chain == NULL || buf == NULL )
  46765. return( MBEDTLS_ERR_X509_BAD_INPUT_DATA );
  46766. /*
  46767. * Determine buffer content. Buffer contains either one DER certificate or
  46768. * one or more PEM certificates.
  46769. */
  46770. #if defined(MBEDTLS_PEM_PARSE_C)
  46771. if( buflen != 0 && buf[buflen - 1] == '\0' &&
  46772. strstr( (const char *) buf, "-----BEGIN CERTIFICATE-----" ) != NULL )
  46773. {
  46774. buf_format = MBEDTLS_X509_FORMAT_PEM;
  46775. }
  46776. #endif
  46777. if( buf_format == MBEDTLS_X509_FORMAT_DER )
  46778. return mbedtls_x509_crt_parse_der( chain, buf, buflen );
  46779. #if defined(MBEDTLS_PEM_PARSE_C)
  46780. if( buf_format == MBEDTLS_X509_FORMAT_PEM )
  46781. {
  46782. int ret;
  46783. mbedtls_pem_context pem;
  46784. /* 1 rather than 0 since the terminating NULL byte is counted in */
  46785. while( buflen > 1 )
  46786. {
  46787. size_t use_len;
  46788. mbedtls_pem_init( &pem );
  46789. /* If we get there, we know the string is null-terminated */
  46790. ret = mbedtls_pem_read_buffer( &pem,
  46791. "-----BEGIN CERTIFICATE-----",
  46792. "-----END CERTIFICATE-----",
  46793. buf, NULL, 0, &use_len );
  46794. if( ret == 0 )
  46795. {
  46796. /*
  46797. * Was PEM encoded
  46798. */
  46799. buflen -= use_len;
  46800. buf += use_len;
  46801. }
  46802. else if( ret == MBEDTLS_ERR_PEM_BAD_INPUT_DATA )
  46803. {
  46804. return( ret );
  46805. }
  46806. else if( ret != MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT )
  46807. {
  46808. mbedtls_pem_free( &pem );
  46809. /*
  46810. * PEM header and footer were found
  46811. */
  46812. buflen -= use_len;
  46813. buf += use_len;
  46814. if( first_error == 0 )
  46815. first_error = ret;
  46816. total_failed++;
  46817. continue;
  46818. }
  46819. else
  46820. break;
  46821. ret = mbedtls_x509_crt_parse_der( chain, pem.buf, pem.buflen );
  46822. mbedtls_pem_free( &pem );
  46823. if( ret != 0 )
  46824. {
  46825. /*
  46826. * Quit parsing on a memory error
  46827. */
  46828. if( ret == MBEDTLS_ERR_X509_ALLOC_FAILED )
  46829. return( ret );
  46830. if( first_error == 0 )
  46831. first_error = ret;
  46832. total_failed++;
  46833. continue;
  46834. }
  46835. success = 1;
  46836. }
  46837. }
  46838. #endif /* MBEDTLS_PEM_PARSE_C */
  46839. if( success )
  46840. return( total_failed );
  46841. else if( first_error )
  46842. return( first_error );
  46843. else
  46844. return( MBEDTLS_ERR_X509_CERT_UNKNOWN_FORMAT );
  46845. }
  46846. #if defined(MBEDTLS_FS_IO)
  46847. /*
  46848. * Load one or more certificates and add them to the chained list
  46849. */
  46850. int mbedtls_x509_crt_parse_file( mbedtls_x509_crt *chain, const char *path )
  46851. {
  46852. int ret;
  46853. size_t n;
  46854. unsigned char *buf;
  46855. if( ( ret = mbedtls_pk_load_file( path, &buf, &n ) ) != 0 )
  46856. return( ret );
  46857. ret = mbedtls_x509_crt_parse( chain, buf, n );
  46858. x509_crt_zeroize( buf, n );
  46859. mbedtls_free( buf );
  46860. return( ret );
  46861. }
  46862. int mbedtls_x509_crt_parse_path( mbedtls_x509_crt *chain, const char *path )
  46863. {
  46864. int ret = 0;
  46865. #if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32)
  46866. int w_ret;
  46867. WCHAR szDir[MAX_PATH];
  46868. char filename[MAX_PATH];
  46869. char *p;
  46870. size_t len = strlen( path );
  46871. WIN32_FIND_DATAW file_data;
  46872. HANDLE hFind;
  46873. if( len > MAX_PATH - 3 )
  46874. return( MBEDTLS_ERR_X509_BAD_INPUT_DATA );
  46875. memset( szDir, 0, sizeof(szDir) );
  46876. memset( filename, 0, MAX_PATH );
  46877. memcpy( filename, path, len );
  46878. filename[len++] = '\\';
  46879. p = filename + len;
  46880. filename[len++] = '*';
  46881. w_ret = MultiByteToWideChar( CP_ACP, 0, filename, len, szDir,
  46882. MAX_PATH - 3 );
  46883. if( w_ret == 0 )
  46884. return( MBEDTLS_ERR_X509_BAD_INPUT_DATA );
  46885. hFind = FindFirstFileW( szDir, &file_data );
  46886. if( hFind == INVALID_HANDLE_VALUE )
  46887. return( MBEDTLS_ERR_X509_FILE_IO_ERROR );
  46888. len = MAX_PATH - len;
  46889. do
  46890. {
  46891. memset( p, 0, len );
  46892. if( file_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
  46893. continue;
  46894. w_ret = WideCharToMultiByte( CP_ACP, 0, file_data.cFileName,
  46895. lstrlenW( file_data.cFileName ),
  46896. p, (int) len - 1,
  46897. NULL, NULL );
  46898. if( w_ret == 0 )
  46899. return( MBEDTLS_ERR_X509_FILE_IO_ERROR );
  46900. w_ret = mbedtls_x509_crt_parse_file( chain, filename );
  46901. if( w_ret < 0 )
  46902. ret++;
  46903. else
  46904. ret += w_ret;
  46905. }
  46906. while( FindNextFileW( hFind, &file_data ) != 0 );
  46907. if( GetLastError() != ERROR_NO_MORE_FILES )
  46908. ret = MBEDTLS_ERR_X509_FILE_IO_ERROR;
  46909. FindClose( hFind );
  46910. #else /* _WIN32 */
  46911. int t_ret;
  46912. struct stat sb;
  46913. struct dirent *entry;
  46914. char entry_name[255];
  46915. DIR *dir = opendir( path );
  46916. if( dir == NULL )
  46917. return( MBEDTLS_ERR_X509_FILE_IO_ERROR );
  46918. #if defined(MBEDTLS_THREADING_PTHREAD)
  46919. if( ( ret = mbedtls_mutex_lock( &mbedtls_threading_readdir_mutex ) ) != 0 )
  46920. {
  46921. closedir( dir );
  46922. return( ret );
  46923. }
  46924. #endif
  46925. while( ( entry = readdir( dir ) ) != NULL )
  46926. {
  46927. mbedtls_snprintf( entry_name, sizeof entry_name, "%s/%s", path, entry->d_name );
  46928. if( stat( entry_name, &sb ) == -1 )
  46929. {
  46930. closedir( dir );
  46931. ret = MBEDTLS_ERR_X509_FILE_IO_ERROR;
  46932. goto cleanup;
  46933. }
  46934. if( !S_ISREG( sb.st_mode ) )
  46935. continue;
  46936. // Ignore parse errors
  46937. //
  46938. t_ret = mbedtls_x509_crt_parse_file( chain, entry_name );
  46939. if( t_ret < 0 )
  46940. ret++;
  46941. else
  46942. ret += t_ret;
  46943. }
  46944. closedir( dir );
  46945. cleanup:
  46946. #if defined(MBEDTLS_THREADING_PTHREAD)
  46947. if( mbedtls_mutex_unlock( &mbedtls_threading_readdir_mutex ) != 0 )
  46948. ret = MBEDTLS_ERR_THREADING_MUTEX_ERROR;
  46949. #endif
  46950. #endif /* _WIN32 */
  46951. return( ret );
  46952. }
  46953. #endif /* MBEDTLS_FS_IO */
  46954. static int x509_info_subject_alt_name( char **buf, size_t *size,
  46955. const mbedtls_x509_sequence *subject_alt_name )
  46956. {
  46957. size_t i;
  46958. size_t n = *size;
  46959. char *p = *buf;
  46960. const mbedtls_x509_sequence *cur = subject_alt_name;
  46961. const char *sep = "";
  46962. size_t sep_len = 0;
  46963. while( cur != NULL )
  46964. {
  46965. if( cur->buf.len + sep_len >= n )
  46966. {
  46967. *p = '\0';
  46968. return( MBEDTLS_ERR_X509_BUFFER_TOO_SMALL );
  46969. }
  46970. n -= cur->buf.len + sep_len;
  46971. for( i = 0; i < sep_len; i++ )
  46972. *p++ = sep[i];
  46973. for( i = 0; i < cur->buf.len; i++ )
  46974. *p++ = cur->buf.p[i];
  46975. sep = ", ";
  46976. sep_len = 2;
  46977. cur = cur->next;
  46978. }
  46979. *p = '\0';
  46980. *size = n;
  46981. *buf = p;
  46982. return( 0 );
  46983. }
  46984. #define PRINT_ITEM(i) \
  46985. { \
  46986. ret = mbedtls_snprintf( p, n, "%s" i, sep ); \
  46987. MBEDTLS_X509_SAFE_SNPRINTF; \
  46988. sep = ", "; \
  46989. }
  46990. #define CERT_TYPE(type,name) \
  46991. if( ns_cert_type & type ) \
  46992. PRINT_ITEM( name );
  46993. static int x509_info_cert_type( char **buf, size_t *size,
  46994. unsigned char ns_cert_type )
  46995. {
  46996. int ret;
  46997. size_t n = *size;
  46998. char *p = *buf;
  46999. const char *sep = "";
  47000. CERT_TYPE( MBEDTLS_X509_NS_CERT_TYPE_SSL_CLIENT, "SSL Client" );
  47001. CERT_TYPE( MBEDTLS_X509_NS_CERT_TYPE_SSL_SERVER, "SSL Server" );
  47002. CERT_TYPE( MBEDTLS_X509_NS_CERT_TYPE_EMAIL, "Email" );
  47003. CERT_TYPE( MBEDTLS_X509_NS_CERT_TYPE_OBJECT_SIGNING, "Object Signing" );
  47004. CERT_TYPE( MBEDTLS_X509_NS_CERT_TYPE_RESERVED, "Reserved" );
  47005. CERT_TYPE( MBEDTLS_X509_NS_CERT_TYPE_SSL_CA, "SSL CA" );
  47006. CERT_TYPE( MBEDTLS_X509_NS_CERT_TYPE_EMAIL_CA, "Email CA" );
  47007. CERT_TYPE( MBEDTLS_X509_NS_CERT_TYPE_OBJECT_SIGNING_CA, "Object Signing CA" );
  47008. *size = n;
  47009. *buf = p;
  47010. return( 0 );
  47011. }
  47012. #define KEY_USAGE(code,name) \
  47013. if( key_usage & code ) \
  47014. PRINT_ITEM( name );
  47015. static int x509_info_key_usage( char **buf, size_t *size,
  47016. unsigned int key_usage )
  47017. {
  47018. int ret;
  47019. size_t n = *size;
  47020. char *p = *buf;
  47021. const char *sep = "";
  47022. KEY_USAGE( MBEDTLS_X509_KU_DIGITAL_SIGNATURE, "Digital Signature" );
  47023. KEY_USAGE( MBEDTLS_X509_KU_NON_REPUDIATION, "Non Repudiation" );
  47024. KEY_USAGE( MBEDTLS_X509_KU_KEY_ENCIPHERMENT, "Key Encipherment" );
  47025. KEY_USAGE( MBEDTLS_X509_KU_DATA_ENCIPHERMENT, "Data Encipherment" );
  47026. KEY_USAGE( MBEDTLS_X509_KU_KEY_AGREEMENT, "Key Agreement" );
  47027. KEY_USAGE( MBEDTLS_X509_KU_KEY_CERT_SIGN, "Key Cert Sign" );
  47028. KEY_USAGE( MBEDTLS_X509_KU_CRL_SIGN, "CRL Sign" );
  47029. KEY_USAGE( MBEDTLS_X509_KU_ENCIPHER_ONLY, "Encipher Only" );
  47030. KEY_USAGE( MBEDTLS_X509_KU_DECIPHER_ONLY, "Decipher Only" );
  47031. *size = n;
  47032. *buf = p;
  47033. return( 0 );
  47034. }
  47035. static int x509_info_ext_key_usage( char **buf, size_t *size,
  47036. const mbedtls_x509_sequence *extended_key_usage )
  47037. {
  47038. int ret;
  47039. const char *desc;
  47040. size_t n = *size;
  47041. char *p = *buf;
  47042. const mbedtls_x509_sequence *cur = extended_key_usage;
  47043. const char *sep = "";
  47044. while( cur != NULL )
  47045. {
  47046. if( mbedtls_oid_get_extended_key_usage( &cur->buf, &desc ) != 0 )
  47047. desc = "???";
  47048. ret = mbedtls_snprintf( p, n, "%s%s", sep, desc );
  47049. MBEDTLS_X509_SAFE_SNPRINTF;
  47050. sep = ", ";
  47051. cur = cur->next;
  47052. }
  47053. *size = n;
  47054. *buf = p;
  47055. return( 0 );
  47056. }
  47057. /*
  47058. * Return an informational string about the certificate.
  47059. */
  47060. #define BEFORE_COLON 18
  47061. #define BC "18"
  47062. int mbedtls_x509_crt_info( char *buf, size_t size, const char *prefix,
  47063. const mbedtls_x509_crt *crt )
  47064. {
  47065. int ret;
  47066. size_t n;
  47067. char *p;
  47068. char key_size_str[BEFORE_COLON];
  47069. p = buf;
  47070. n = size;
  47071. ret = mbedtls_snprintf( p, n, "%scert. version : %d\n",
  47072. prefix, crt->version );
  47073. MBEDTLS_X509_SAFE_SNPRINTF;
  47074. ret = mbedtls_snprintf( p, n, "%sserial number : ",
  47075. prefix );
  47076. MBEDTLS_X509_SAFE_SNPRINTF;
  47077. ret = mbedtls_x509_serial_gets( p, n, &crt->serial );
  47078. MBEDTLS_X509_SAFE_SNPRINTF;
  47079. ret = mbedtls_snprintf( p, n, "\n%sissuer name : ", prefix );
  47080. MBEDTLS_X509_SAFE_SNPRINTF;
  47081. ret = mbedtls_x509_dn_gets( p, n, &crt->issuer );
  47082. MBEDTLS_X509_SAFE_SNPRINTF;
  47083. ret = mbedtls_snprintf( p, n, "\n%ssubject name : ", prefix );
  47084. MBEDTLS_X509_SAFE_SNPRINTF;
  47085. ret = mbedtls_x509_dn_gets( p, n, &crt->subject );
  47086. MBEDTLS_X509_SAFE_SNPRINTF;
  47087. ret = mbedtls_snprintf( p, n, "\n%sissued on : " \
  47088. "%04d-%02d-%02d %02d:%02d:%02d", prefix,
  47089. crt->valid_from.year, crt->valid_from.mon,
  47090. crt->valid_from.day, crt->valid_from.hour,
  47091. crt->valid_from.min, crt->valid_from.sec );
  47092. MBEDTLS_X509_SAFE_SNPRINTF;
  47093. ret = mbedtls_snprintf( p, n, "\n%sexpires on : " \
  47094. "%04d-%02d-%02d %02d:%02d:%02d", prefix,
  47095. crt->valid_to.year, crt->valid_to.mon,
  47096. crt->valid_to.day, crt->valid_to.hour,
  47097. crt->valid_to.min, crt->valid_to.sec );
  47098. MBEDTLS_X509_SAFE_SNPRINTF;
  47099. ret = mbedtls_snprintf( p, n, "\n%ssigned using : ", prefix );
  47100. MBEDTLS_X509_SAFE_SNPRINTF;
  47101. ret = mbedtls_x509_sig_alg_gets( p, n, &crt->sig_oid, crt->sig_pk,
  47102. crt->sig_md, crt->sig_opts );
  47103. MBEDTLS_X509_SAFE_SNPRINTF;
  47104. /* Key size */
  47105. if( ( ret = mbedtls_x509_key_size_helper( key_size_str, BEFORE_COLON,
  47106. mbedtls_pk_get_name( &crt->pk ) ) ) != 0 )
  47107. {
  47108. return( ret );
  47109. }
  47110. ret = mbedtls_snprintf( p, n, "\n%s%-" BC "s: %d bits", prefix, key_size_str,
  47111. (int) mbedtls_pk_get_bitlen( &crt->pk ) );
  47112. MBEDTLS_X509_SAFE_SNPRINTF;
  47113. /*
  47114. * Optional extensions
  47115. */
  47116. if( crt->ext_types & MBEDTLS_X509_EXT_BASIC_CONSTRAINTS )
  47117. {
  47118. ret = mbedtls_snprintf( p, n, "\n%sbasic constraints : CA=%s", prefix,
  47119. crt->ca_istrue ? "true" : "false" );
  47120. MBEDTLS_X509_SAFE_SNPRINTF;
  47121. if( crt->max_pathlen > 0 )
  47122. {
  47123. ret = mbedtls_snprintf( p, n, ", max_pathlen=%d", crt->max_pathlen - 1 );
  47124. MBEDTLS_X509_SAFE_SNPRINTF;
  47125. }
  47126. }
  47127. if( crt->ext_types & MBEDTLS_X509_EXT_SUBJECT_ALT_NAME )
  47128. {
  47129. ret = mbedtls_snprintf( p, n, "\n%ssubject alt name : ", prefix );
  47130. MBEDTLS_X509_SAFE_SNPRINTF;
  47131. if( ( ret = x509_info_subject_alt_name( &p, &n,
  47132. &crt->subject_alt_names ) ) != 0 )
  47133. return( ret );
  47134. }
  47135. if( crt->ext_types & MBEDTLS_X509_EXT_NS_CERT_TYPE )
  47136. {
  47137. ret = mbedtls_snprintf( p, n, "\n%scert. type : ", prefix );
  47138. MBEDTLS_X509_SAFE_SNPRINTF;
  47139. if( ( ret = x509_info_cert_type( &p, &n, crt->ns_cert_type ) ) != 0 )
  47140. return( ret );
  47141. }
  47142. if( crt->ext_types & MBEDTLS_X509_EXT_KEY_USAGE )
  47143. {
  47144. ret = mbedtls_snprintf( p, n, "\n%skey usage : ", prefix );
  47145. MBEDTLS_X509_SAFE_SNPRINTF;
  47146. if( ( ret = x509_info_key_usage( &p, &n, crt->key_usage ) ) != 0 )
  47147. return( ret );
  47148. }
  47149. if( crt->ext_types & MBEDTLS_X509_EXT_EXTENDED_KEY_USAGE )
  47150. {
  47151. ret = mbedtls_snprintf( p, n, "\n%sext key usage : ", prefix );
  47152. MBEDTLS_X509_SAFE_SNPRINTF;
  47153. if( ( ret = x509_info_ext_key_usage( &p, &n,
  47154. &crt->ext_key_usage ) ) != 0 )
  47155. return( ret );
  47156. }
  47157. ret = mbedtls_snprintf( p, n, "\n" );
  47158. MBEDTLS_X509_SAFE_SNPRINTF;
  47159. return( (int) ( size - n ) );
  47160. }
  47161. struct x509_crt_verify_string {
  47162. int code;
  47163. const char *string;
  47164. };
  47165. static const struct x509_crt_verify_string x509_crt_verify_strings[] = {
  47166. { MBEDTLS_X509_BADCERT_EXPIRED, "The certificate validity has expired" },
  47167. { MBEDTLS_X509_BADCERT_REVOKED, "The certificate has been revoked (is on a CRL)" },
  47168. { MBEDTLS_X509_BADCERT_CN_MISMATCH, "The certificate Common Name (CN) does not match with the expected CN" },
  47169. { MBEDTLS_X509_BADCERT_NOT_TRUSTED, "The certificate is not correctly signed by the trusted CA" },
  47170. { MBEDTLS_X509_BADCRL_NOT_TRUSTED, "The CRL is not correctly signed by the trusted CA" },
  47171. { MBEDTLS_X509_BADCRL_EXPIRED, "The CRL is expired" },
  47172. { MBEDTLS_X509_BADCERT_MISSING, "Certificate was missing" },
  47173. { MBEDTLS_X509_BADCERT_SKIP_VERIFY, "Certificate verification was skipped" },
  47174. { MBEDTLS_X509_BADCERT_OTHER, "Other reason (can be used by verify callback)" },
  47175. { MBEDTLS_X509_BADCERT_FUTURE, "The certificate validity starts in the future" },
  47176. { MBEDTLS_X509_BADCRL_FUTURE, "The CRL is from the future" },
  47177. { MBEDTLS_X509_BADCERT_KEY_USAGE, "Usage does not match the keyUsage extension" },
  47178. { MBEDTLS_X509_BADCERT_EXT_KEY_USAGE, "Usage does not match the extendedKeyUsage extension" },
  47179. { MBEDTLS_X509_BADCERT_NS_CERT_TYPE, "Usage does not match the nsCertType extension" },
  47180. { MBEDTLS_X509_BADCERT_BAD_MD, "The certificate is signed with an unacceptable hash." },
  47181. { MBEDTLS_X509_BADCERT_BAD_PK, "The certificate is signed with an unacceptable PK alg (eg RSA vs ECDSA)." },
  47182. { MBEDTLS_X509_BADCERT_BAD_KEY, "The certificate is signed with an unacceptable key (eg bad curve, RSA too short)." },
  47183. { MBEDTLS_X509_BADCRL_BAD_MD, "The CRL is signed with an unacceptable hash." },
  47184. { MBEDTLS_X509_BADCRL_BAD_PK, "The CRL is signed with an unacceptable PK alg (eg RSA vs ECDSA)." },
  47185. { MBEDTLS_X509_BADCRL_BAD_KEY, "The CRL is signed with an unacceptable key (eg bad curve, RSA too short)." },
  47186. { 0, NULL }
  47187. };
  47188. int mbedtls_x509_crt_verify_info( char *buf, size_t size, const char *prefix,
  47189. uint32_t flags )
  47190. {
  47191. int ret;
  47192. const struct x509_crt_verify_string *cur;
  47193. char *p = buf;
  47194. size_t n = size;
  47195. for( cur = x509_crt_verify_strings; cur->string != NULL ; cur++ )
  47196. {
  47197. if( ( flags & cur->code ) == 0 )
  47198. continue;
  47199. ret = mbedtls_snprintf( p, n, "%s%s\n", prefix, cur->string );
  47200. MBEDTLS_X509_SAFE_SNPRINTF;
  47201. flags ^= cur->code;
  47202. }
  47203. if( flags != 0 )
  47204. {
  47205. ret = mbedtls_snprintf( p, n, "%sUnknown reason "
  47206. "(this should not happen)\n", prefix );
  47207. MBEDTLS_X509_SAFE_SNPRINTF;
  47208. }
  47209. return( (int) ( size - n ) );
  47210. }
  47211. #if defined(MBEDTLS_X509_CHECK_KEY_USAGE)
  47212. int mbedtls_x509_crt_check_key_usage( const mbedtls_x509_crt *crt,
  47213. unsigned int usage )
  47214. {
  47215. unsigned int usage_must, usage_may;
  47216. unsigned int may_mask = MBEDTLS_X509_KU_ENCIPHER_ONLY
  47217. | MBEDTLS_X509_KU_DECIPHER_ONLY;
  47218. if( ( crt->ext_types & MBEDTLS_X509_EXT_KEY_USAGE ) == 0 )
  47219. return( 0 );
  47220. usage_must = usage & ~may_mask;
  47221. if( ( ( crt->key_usage & ~may_mask ) & usage_must ) != usage_must )
  47222. return( MBEDTLS_ERR_X509_BAD_INPUT_DATA );
  47223. usage_may = usage & may_mask;
  47224. if( ( ( crt->key_usage & may_mask ) | usage_may ) != usage_may )
  47225. return( MBEDTLS_ERR_X509_BAD_INPUT_DATA );
  47226. return( 0 );
  47227. }
  47228. #endif
  47229. #if defined(MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE)
  47230. int mbedtls_x509_crt_check_extended_key_usage( const mbedtls_x509_crt *crt,
  47231. const char *usage_oid,
  47232. size_t usage_len )
  47233. {
  47234. const mbedtls_x509_sequence *cur;
  47235. /* Extension is not mandatory, absent means no restriction */
  47236. if( ( crt->ext_types & MBEDTLS_X509_EXT_EXTENDED_KEY_USAGE ) == 0 )
  47237. return( 0 );
  47238. /*
  47239. * Look for the requested usage (or wildcard ANY) in our list
  47240. */
  47241. for( cur = &crt->ext_key_usage; cur != NULL; cur = cur->next )
  47242. {
  47243. const mbedtls_x509_buf *cur_oid = &cur->buf;
  47244. if( cur_oid->len == usage_len &&
  47245. memcmp( cur_oid->p, usage_oid, usage_len ) == 0 )
  47246. {
  47247. return( 0 );
  47248. }
  47249. if( MBEDTLS_OID_CMP( MBEDTLS_OID_ANY_EXTENDED_KEY_USAGE, cur_oid ) == 0 )
  47250. return( 0 );
  47251. }
  47252. return( MBEDTLS_ERR_X509_BAD_INPUT_DATA );
  47253. }
  47254. #endif /* MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE */
  47255. #if defined(MBEDTLS_X509_CRL_PARSE_C)
  47256. /*
  47257. * Return 1 if the certificate is revoked, or 0 otherwise.
  47258. */
  47259. int mbedtls_x509_crt_is_revoked( const mbedtls_x509_crt *crt, const mbedtls_x509_crl *crl )
  47260. {
  47261. const mbedtls_x509_crl_entry *cur = &crl->entry;
  47262. while( cur != NULL && cur->serial.len != 0 )
  47263. {
  47264. if( crt->serial.len == cur->serial.len &&
  47265. memcmp( crt->serial.p, cur->serial.p, crt->serial.len ) == 0 )
  47266. {
  47267. if( mbedtls_x509_time_is_past( &cur->revocation_date ) )
  47268. return( 1 );
  47269. }
  47270. cur = cur->next;
  47271. }
  47272. return( 0 );
  47273. }
  47274. /*
  47275. * Check that the given certificate is valid according to the CRL.
  47276. */
  47277. static int x509_crt_verifycrl( mbedtls_x509_crt *crt, mbedtls_x509_crt *ca,
  47278. mbedtls_x509_crl *crl_list,
  47279. const mbedtls_x509_crt_profile *profile )
  47280. {
  47281. int flags = 0;
  47282. unsigned char hash[MBEDTLS_MD_MAX_SIZE];
  47283. const mbedtls_md_info_t *md_info;
  47284. if( ca == NULL )
  47285. return( flags );
  47286. /*
  47287. * TODO: What happens if no CRL is present?
  47288. * Suggestion: Revocation state should be unknown if no CRL is present.
  47289. * For backwards compatibility this is not yet implemented.
  47290. */
  47291. while( crl_list != NULL )
  47292. {
  47293. if( crl_list->version == 0 ||
  47294. crl_list->issuer_raw.len != ca->subject_raw.len ||
  47295. memcmp( crl_list->issuer_raw.p, ca->subject_raw.p,
  47296. crl_list->issuer_raw.len ) != 0 )
  47297. {
  47298. crl_list = crl_list->next;
  47299. continue;
  47300. }
  47301. /*
  47302. * Check if the CA is configured to sign CRLs
  47303. */
  47304. #if defined(MBEDTLS_X509_CHECK_KEY_USAGE)
  47305. if( mbedtls_x509_crt_check_key_usage( ca, MBEDTLS_X509_KU_CRL_SIGN ) != 0 )
  47306. {
  47307. flags |= MBEDTLS_X509_BADCRL_NOT_TRUSTED;
  47308. break;
  47309. }
  47310. #endif
  47311. /*
  47312. * Check if CRL is correctly signed by the trusted CA
  47313. */
  47314. if( x509_profile_check_md_alg( profile, crl_list->sig_md ) != 0 )
  47315. flags |= MBEDTLS_X509_BADCRL_BAD_MD;
  47316. if( x509_profile_check_pk_alg( profile, crl_list->sig_pk ) != 0 )
  47317. flags |= MBEDTLS_X509_BADCRL_BAD_PK;
  47318. md_info = mbedtls_md_info_from_type( crl_list->sig_md );
  47319. if( md_info == NULL )
  47320. {
  47321. /*
  47322. * Cannot check 'unknown' hash
  47323. */
  47324. flags |= MBEDTLS_X509_BADCRL_NOT_TRUSTED;
  47325. break;
  47326. }
  47327. mbedtls_md( md_info, crl_list->tbs.p, crl_list->tbs.len, hash );
  47328. if( x509_profile_check_key( profile, crl_list->sig_pk, &ca->pk ) != 0 )
  47329. flags |= MBEDTLS_X509_BADCERT_BAD_KEY;
  47330. if( mbedtls_pk_verify_ext( crl_list->sig_pk, crl_list->sig_opts, &ca->pk,
  47331. crl_list->sig_md, hash, mbedtls_md_get_size( md_info ),
  47332. crl_list->sig.p, crl_list->sig.len ) != 0 )
  47333. {
  47334. flags |= MBEDTLS_X509_BADCRL_NOT_TRUSTED;
  47335. break;
  47336. }
  47337. /*
  47338. * Check for validity of CRL (Do not drop out)
  47339. */
  47340. if( mbedtls_x509_time_is_past( &crl_list->next_update ) )
  47341. flags |= MBEDTLS_X509_BADCRL_EXPIRED;
  47342. if( mbedtls_x509_time_is_future( &crl_list->this_update ) )
  47343. flags |= MBEDTLS_X509_BADCRL_FUTURE;
  47344. /*
  47345. * Check if certificate is revoked
  47346. */
  47347. if( mbedtls_x509_crt_is_revoked( crt, crl_list ) )
  47348. {
  47349. flags |= MBEDTLS_X509_BADCERT_REVOKED;
  47350. break;
  47351. }
  47352. crl_list = crl_list->next;
  47353. }
  47354. return( flags );
  47355. }
  47356. #endif /* MBEDTLS_X509_CRL_PARSE_C */
  47357. /*
  47358. * Like memcmp, but case-insensitive and always returns -1 if different
  47359. */
  47360. static int x509_memcasecmp( const void *s1, const void *s2, size_t len )
  47361. {
  47362. size_t i;
  47363. unsigned char diff;
  47364. const unsigned char *n1 = s1, *n2 = s2;
  47365. for( i = 0; i < len; i++ )
  47366. {
  47367. diff = n1[i] ^ n2[i];
  47368. if( diff == 0 )
  47369. continue;
  47370. if( diff == 32 &&
  47371. ( ( n1[i] >= 'a' && n1[i] <= 'z' ) ||
  47372. ( n1[i] >= 'A' && n1[i] <= 'Z' ) ) )
  47373. {
  47374. continue;
  47375. }
  47376. return( -1 );
  47377. }
  47378. return( 0 );
  47379. }
  47380. /*
  47381. * Return 0 if name matches wildcard, -1 otherwise
  47382. */
  47383. static int x509_check_wildcard( const char *cn, mbedtls_x509_buf *name )
  47384. {
  47385. size_t i;
  47386. size_t cn_idx = 0, cn_len = strlen( cn );
  47387. if( name->len < 3 || name->p[0] != '*' || name->p[1] != '.' )
  47388. return( 0 );
  47389. for( i = 0; i < cn_len; ++i )
  47390. {
  47391. if( cn[i] == '.' )
  47392. {
  47393. cn_idx = i;
  47394. break;
  47395. }
  47396. }
  47397. if( cn_idx == 0 )
  47398. return( -1 );
  47399. if( cn_len - cn_idx == name->len - 1 &&
  47400. x509_memcasecmp( name->p + 1, cn + cn_idx, name->len - 1 ) == 0 )
  47401. {
  47402. return( 0 );
  47403. }
  47404. return( -1 );
  47405. }
  47406. /*
  47407. * Compare two X.509 strings, case-insensitive, and allowing for some encoding
  47408. * variations (but not all).
  47409. *
  47410. * Return 0 if equal, -1 otherwise.
  47411. */
  47412. static int x509_string_cmp( const mbedtls_x509_buf *a, const mbedtls_x509_buf *b )
  47413. {
  47414. if( a->tag == b->tag &&
  47415. a->len == b->len &&
  47416. memcmp( a->p, b->p, b->len ) == 0 )
  47417. {
  47418. return( 0 );
  47419. }
  47420. if( ( a->tag == MBEDTLS_ASN1_UTF8_STRING || a->tag == MBEDTLS_ASN1_PRINTABLE_STRING ) &&
  47421. ( b->tag == MBEDTLS_ASN1_UTF8_STRING || b->tag == MBEDTLS_ASN1_PRINTABLE_STRING ) &&
  47422. a->len == b->len &&
  47423. x509_memcasecmp( a->p, b->p, b->len ) == 0 )
  47424. {
  47425. return( 0 );
  47426. }
  47427. return( -1 );
  47428. }
  47429. /*
  47430. * Compare two X.509 Names (aka rdnSequence).
  47431. *
  47432. * See RFC 5280 section 7.1, though we don't implement the whole algorithm:
  47433. * we sometimes return unequal when the full algorithm would return equal,
  47434. * but never the other way. (In particular, we don't do Unicode normalisation
  47435. * or space folding.)
  47436. *
  47437. * Return 0 if equal, -1 otherwise.
  47438. */
  47439. static int x509_name_cmp( const mbedtls_x509_name *a, const mbedtls_x509_name *b )
  47440. {
  47441. /* Avoid recursion, it might not be optimised by the compiler */
  47442. while( a != NULL || b != NULL )
  47443. {
  47444. if( a == NULL || b == NULL )
  47445. return( -1 );
  47446. /* type */
  47447. if( a->oid.tag != b->oid.tag ||
  47448. a->oid.len != b->oid.len ||
  47449. memcmp( a->oid.p, b->oid.p, b->oid.len ) != 0 )
  47450. {
  47451. return( -1 );
  47452. }
  47453. /* value */
  47454. if( x509_string_cmp( &a->val, &b->val ) != 0 )
  47455. return( -1 );
  47456. /* structure of the list of sets */
  47457. if( a->next_merged != b->next_merged )
  47458. return( -1 );
  47459. a = a->next;
  47460. b = b->next;
  47461. }
  47462. /* a == NULL == b */
  47463. return( 0 );
  47464. }
  47465. /*
  47466. * Check if 'parent' is a suitable parent (signing CA) for 'child'.
  47467. * Return 0 if yes, -1 if not.
  47468. *
  47469. * top means parent is a locally-trusted certificate
  47470. * bottom means child is the end entity cert
  47471. */
  47472. static int x509_crt_check_parent( const mbedtls_x509_crt *child,
  47473. const mbedtls_x509_crt *parent,
  47474. int top, int bottom )
  47475. {
  47476. int need_ca_bit;
  47477. /* Parent must be the issuer */
  47478. if( x509_name_cmp( &child->issuer, &parent->subject ) != 0 )
  47479. return( -1 );
  47480. /* Parent must have the basicConstraints CA bit set as a general rule */
  47481. need_ca_bit = 1;
  47482. /* Exception: v1/v2 certificates that are locally trusted. */
  47483. if( top && parent->version < 3 )
  47484. need_ca_bit = 0;
  47485. /* Exception: self-signed end-entity certs that are locally trusted. */
  47486. if( top && bottom &&
  47487. child->raw.len == parent->raw.len &&
  47488. memcmp( child->raw.p, parent->raw.p, child->raw.len ) == 0 )
  47489. {
  47490. need_ca_bit = 0;
  47491. }
  47492. if( need_ca_bit && ! parent->ca_istrue )
  47493. return( -1 );
  47494. #if defined(MBEDTLS_X509_CHECK_KEY_USAGE)
  47495. if( need_ca_bit &&
  47496. mbedtls_x509_crt_check_key_usage( parent, MBEDTLS_X509_KU_KEY_CERT_SIGN ) != 0 )
  47497. {
  47498. return( -1 );
  47499. }
  47500. #endif
  47501. return( 0 );
  47502. }
  47503. static int x509_crt_verify_top(
  47504. mbedtls_x509_crt *child, mbedtls_x509_crt *trust_ca,
  47505. mbedtls_x509_crl *ca_crl,
  47506. const mbedtls_x509_crt_profile *profile,
  47507. int path_cnt, int self_cnt, uint32_t *flags,
  47508. int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *),
  47509. void *p_vrfy )
  47510. {
  47511. int ret;
  47512. uint32_t ca_flags = 0;
  47513. int check_path_cnt;
  47514. unsigned char hash[MBEDTLS_MD_MAX_SIZE];
  47515. const mbedtls_md_info_t *md_info;
  47516. if( mbedtls_x509_time_is_past( &child->valid_to ) )
  47517. *flags |= MBEDTLS_X509_BADCERT_EXPIRED;
  47518. if( mbedtls_x509_time_is_future( &child->valid_from ) )
  47519. *flags |= MBEDTLS_X509_BADCERT_FUTURE;
  47520. if( x509_profile_check_md_alg( profile, child->sig_md ) != 0 )
  47521. *flags |= MBEDTLS_X509_BADCERT_BAD_MD;
  47522. if( x509_profile_check_pk_alg( profile, child->sig_pk ) != 0 )
  47523. *flags |= MBEDTLS_X509_BADCERT_BAD_PK;
  47524. /*
  47525. * Child is the top of the chain. Check against the trust_ca list.
  47526. */
  47527. *flags |= MBEDTLS_X509_BADCERT_NOT_TRUSTED;
  47528. md_info = mbedtls_md_info_from_type( child->sig_md );
  47529. if( md_info == NULL )
  47530. {
  47531. /*
  47532. * Cannot check 'unknown', no need to try any CA
  47533. */
  47534. trust_ca = NULL;
  47535. }
  47536. else
  47537. mbedtls_md( md_info, child->tbs.p, child->tbs.len, hash );
  47538. for( /* trust_ca */ ; trust_ca != NULL; trust_ca = trust_ca->next )
  47539. {
  47540. if( x509_crt_check_parent( child, trust_ca, 1, path_cnt == 0 ) != 0 )
  47541. continue;
  47542. check_path_cnt = path_cnt + 1;
  47543. /*
  47544. * Reduce check_path_cnt to check against if top of the chain is
  47545. * the same as the trusted CA
  47546. */
  47547. if( child->subject_raw.len == trust_ca->subject_raw.len &&
  47548. memcmp( child->subject_raw.p, trust_ca->subject_raw.p,
  47549. child->issuer_raw.len ) == 0 )
  47550. {
  47551. check_path_cnt--;
  47552. }
  47553. /* Self signed certificates do not count towards the limit */
  47554. if( trust_ca->max_pathlen > 0 &&
  47555. trust_ca->max_pathlen < check_path_cnt - self_cnt )
  47556. {
  47557. continue;
  47558. }
  47559. if( mbedtls_pk_verify_ext( child->sig_pk, child->sig_opts, &trust_ca->pk,
  47560. child->sig_md, hash, mbedtls_md_get_size( md_info ),
  47561. child->sig.p, child->sig.len ) != 0 )
  47562. {
  47563. continue;
  47564. }
  47565. /*
  47566. * Top of chain is signed by a trusted CA
  47567. */
  47568. *flags &= ~MBEDTLS_X509_BADCERT_NOT_TRUSTED;
  47569. if( x509_profile_check_key( profile, child->sig_pk, &trust_ca->pk ) != 0 )
  47570. *flags |= MBEDTLS_X509_BADCERT_BAD_KEY;
  47571. break;
  47572. }
  47573. /*
  47574. * If top of chain is not the same as the trusted CA send a verify request
  47575. * to the callback for any issues with validity and CRL presence for the
  47576. * trusted CA certificate.
  47577. */
  47578. if( trust_ca != NULL &&
  47579. ( child->subject_raw.len != trust_ca->subject_raw.len ||
  47580. memcmp( child->subject_raw.p, trust_ca->subject_raw.p,
  47581. child->issuer_raw.len ) != 0 ) )
  47582. {
  47583. #if defined(MBEDTLS_X509_CRL_PARSE_C)
  47584. /* Check trusted CA's CRL for the chain's top crt */
  47585. *flags |= x509_crt_verifycrl( child, trust_ca, ca_crl, profile );
  47586. #else
  47587. ((void) ca_crl);
  47588. #endif
  47589. if( mbedtls_x509_time_is_past( &trust_ca->valid_to ) )
  47590. ca_flags |= MBEDTLS_X509_BADCERT_EXPIRED;
  47591. if( mbedtls_x509_time_is_future( &trust_ca->valid_from ) )
  47592. ca_flags |= MBEDTLS_X509_BADCERT_FUTURE;
  47593. if( NULL != f_vrfy )
  47594. {
  47595. if( ( ret = f_vrfy( p_vrfy, trust_ca, path_cnt + 1,
  47596. &ca_flags ) ) != 0 )
  47597. {
  47598. return( ret );
  47599. }
  47600. }
  47601. }
  47602. /* Call callback on top cert */
  47603. if( NULL != f_vrfy )
  47604. {
  47605. if( ( ret = f_vrfy( p_vrfy, child, path_cnt, flags ) ) != 0 )
  47606. return( ret );
  47607. }
  47608. *flags |= ca_flags;
  47609. return( 0 );
  47610. }
  47611. static int x509_crt_verify_child(
  47612. mbedtls_x509_crt *child, mbedtls_x509_crt *parent,
  47613. mbedtls_x509_crt *trust_ca, mbedtls_x509_crl *ca_crl,
  47614. const mbedtls_x509_crt_profile *profile,
  47615. int path_cnt, int self_cnt, uint32_t *flags,
  47616. int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *),
  47617. void *p_vrfy )
  47618. {
  47619. int ret;
  47620. uint32_t parent_flags = 0;
  47621. unsigned char hash[MBEDTLS_MD_MAX_SIZE];
  47622. mbedtls_x509_crt *grandparent;
  47623. const mbedtls_md_info_t *md_info;
  47624. /* Counting intermediate self signed certificates */
  47625. if( ( path_cnt != 0 ) && x509_name_cmp( &child->issuer, &child->subject ) == 0 )
  47626. self_cnt++;
  47627. /* path_cnt is 0 for the first intermediate CA */
  47628. if( 1 + path_cnt > MBEDTLS_X509_MAX_INTERMEDIATE_CA )
  47629. {
  47630. *flags |= MBEDTLS_X509_BADCERT_NOT_TRUSTED;
  47631. return( MBEDTLS_ERR_X509_CERT_VERIFY_FAILED );
  47632. }
  47633. if( mbedtls_x509_time_is_past( &child->valid_to ) )
  47634. *flags |= MBEDTLS_X509_BADCERT_EXPIRED;
  47635. if( mbedtls_x509_time_is_future( &child->valid_from ) )
  47636. *flags |= MBEDTLS_X509_BADCERT_FUTURE;
  47637. if( x509_profile_check_md_alg( profile, child->sig_md ) != 0 )
  47638. *flags |= MBEDTLS_X509_BADCERT_BAD_MD;
  47639. if( x509_profile_check_pk_alg( profile, child->sig_pk ) != 0 )
  47640. *flags |= MBEDTLS_X509_BADCERT_BAD_PK;
  47641. md_info = mbedtls_md_info_from_type( child->sig_md );
  47642. if( md_info == NULL )
  47643. {
  47644. /*
  47645. * Cannot check 'unknown' hash
  47646. */
  47647. *flags |= MBEDTLS_X509_BADCERT_NOT_TRUSTED;
  47648. }
  47649. else
  47650. {
  47651. mbedtls_md( md_info, child->tbs.p, child->tbs.len, hash );
  47652. if( x509_profile_check_key( profile, child->sig_pk, &parent->pk ) != 0 )
  47653. *flags |= MBEDTLS_X509_BADCERT_BAD_KEY;
  47654. if( mbedtls_pk_verify_ext( child->sig_pk, child->sig_opts, &parent->pk,
  47655. child->sig_md, hash, mbedtls_md_get_size( md_info ),
  47656. child->sig.p, child->sig.len ) != 0 )
  47657. {
  47658. *flags |= MBEDTLS_X509_BADCERT_NOT_TRUSTED;
  47659. }
  47660. }
  47661. #if defined(MBEDTLS_X509_CRL_PARSE_C)
  47662. /* Check trusted CA's CRL for the given crt */
  47663. *flags |= x509_crt_verifycrl(child, parent, ca_crl, profile );
  47664. #endif
  47665. /* Look for a grandparent in trusted CAs */
  47666. for( grandparent = trust_ca;
  47667. grandparent != NULL;
  47668. grandparent = grandparent->next )
  47669. {
  47670. if( x509_crt_check_parent( parent, grandparent,
  47671. 0, path_cnt == 0 ) == 0 )
  47672. break;
  47673. }
  47674. if( grandparent != NULL )
  47675. {
  47676. ret = x509_crt_verify_top( parent, grandparent, ca_crl, profile,
  47677. path_cnt + 1, self_cnt, &parent_flags, f_vrfy, p_vrfy );
  47678. if( ret != 0 )
  47679. return( ret );
  47680. }
  47681. else
  47682. {
  47683. /* Look for a grandparent upwards the chain */
  47684. for( grandparent = parent->next;
  47685. grandparent != NULL;
  47686. grandparent = grandparent->next )
  47687. {
  47688. /* +2 because the current step is not yet accounted for
  47689. * and because max_pathlen is one higher than it should be.
  47690. * Also self signed certificates do not count to the limit. */
  47691. if( grandparent->max_pathlen > 0 &&
  47692. grandparent->max_pathlen < 2 + path_cnt - self_cnt )
  47693. {
  47694. continue;
  47695. }
  47696. if( x509_crt_check_parent( parent, grandparent,
  47697. 0, path_cnt == 0 ) == 0 )
  47698. break;
  47699. }
  47700. /* Is our parent part of the chain or at the top? */
  47701. if( grandparent != NULL )
  47702. {
  47703. ret = x509_crt_verify_child( parent, grandparent, trust_ca, ca_crl,
  47704. profile, path_cnt + 1, self_cnt, &parent_flags,
  47705. f_vrfy, p_vrfy );
  47706. if( ret != 0 )
  47707. return( ret );
  47708. }
  47709. else
  47710. {
  47711. ret = x509_crt_verify_top( parent, trust_ca, ca_crl, profile,
  47712. path_cnt + 1, self_cnt, &parent_flags,
  47713. f_vrfy, p_vrfy );
  47714. if( ret != 0 )
  47715. return( ret );
  47716. }
  47717. }
  47718. /* child is verified to be a child of the parent, call verify callback */
  47719. if( NULL != f_vrfy )
  47720. if( ( ret = f_vrfy( p_vrfy, child, path_cnt, flags ) ) != 0 )
  47721. return( ret );
  47722. *flags |= parent_flags;
  47723. return( 0 );
  47724. }
  47725. /*
  47726. * Verify the certificate validity
  47727. */
  47728. int mbedtls_x509_crt_verify( mbedtls_x509_crt *crt,
  47729. mbedtls_x509_crt *trust_ca,
  47730. mbedtls_x509_crl *ca_crl,
  47731. const char *cn, uint32_t *flags,
  47732. int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *),
  47733. void *p_vrfy )
  47734. {
  47735. return( mbedtls_x509_crt_verify_with_profile( crt, trust_ca, ca_crl,
  47736. &mbedtls_x509_crt_profile_default, cn, flags, f_vrfy, p_vrfy ) );
  47737. }
  47738. /*
  47739. * Verify the certificate validity, with profile
  47740. */
  47741. int mbedtls_x509_crt_verify_with_profile( mbedtls_x509_crt *crt,
  47742. mbedtls_x509_crt *trust_ca,
  47743. mbedtls_x509_crl *ca_crl,
  47744. const mbedtls_x509_crt_profile *profile,
  47745. const char *cn, uint32_t *flags,
  47746. int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *),
  47747. void *p_vrfy )
  47748. {
  47749. size_t cn_len;
  47750. int ret;
  47751. int pathlen = 0, selfsigned = 0;
  47752. mbedtls_x509_crt *parent;
  47753. mbedtls_x509_name *name;
  47754. mbedtls_x509_sequence *cur = NULL;
  47755. mbedtls_pk_type_t pk_type;
  47756. if( profile == NULL )
  47757. return( MBEDTLS_ERR_X509_BAD_INPUT_DATA );
  47758. *flags = 0;
  47759. if( cn != NULL )
  47760. {
  47761. name = &crt->subject;
  47762. cn_len = strlen( cn );
  47763. if( crt->ext_types & MBEDTLS_X509_EXT_SUBJECT_ALT_NAME )
  47764. {
  47765. cur = &crt->subject_alt_names;
  47766. while( cur != NULL )
  47767. {
  47768. if( cur->buf.len == cn_len &&
  47769. x509_memcasecmp( cn, cur->buf.p, cn_len ) == 0 )
  47770. break;
  47771. if( cur->buf.len > 2 &&
  47772. memcmp( cur->buf.p, "*.", 2 ) == 0 &&
  47773. x509_check_wildcard( cn, &cur->buf ) == 0 )
  47774. {
  47775. break;
  47776. }
  47777. cur = cur->next;
  47778. }
  47779. if( cur == NULL )
  47780. *flags |= MBEDTLS_X509_BADCERT_CN_MISMATCH;
  47781. }
  47782. else
  47783. {
  47784. while( name != NULL )
  47785. {
  47786. if( MBEDTLS_OID_CMP( MBEDTLS_OID_AT_CN, &name->oid ) == 0 )
  47787. {
  47788. if( name->val.len == cn_len &&
  47789. x509_memcasecmp( name->val.p, cn, cn_len ) == 0 )
  47790. break;
  47791. if( name->val.len > 2 &&
  47792. memcmp( name->val.p, "*.", 2 ) == 0 &&
  47793. x509_check_wildcard( cn, &name->val ) == 0 )
  47794. break;
  47795. }
  47796. name = name->next;
  47797. }
  47798. if( name == NULL )
  47799. *flags |= MBEDTLS_X509_BADCERT_CN_MISMATCH;
  47800. }
  47801. }
  47802. /* Check the type and size of the key */
  47803. pk_type = mbedtls_pk_get_type( &crt->pk );
  47804. if( x509_profile_check_pk_alg( profile, pk_type ) != 0 )
  47805. *flags |= MBEDTLS_X509_BADCERT_BAD_PK;
  47806. if( x509_profile_check_key( profile, pk_type, &crt->pk ) != 0 )
  47807. *flags |= MBEDTLS_X509_BADCERT_BAD_KEY;
  47808. /* Look for a parent in trusted CAs */
  47809. for( parent = trust_ca; parent != NULL; parent = parent->next )
  47810. {
  47811. if( x509_crt_check_parent( crt, parent, 0, pathlen == 0 ) == 0 )
  47812. break;
  47813. }
  47814. if( parent != NULL )
  47815. {
  47816. ret = x509_crt_verify_top( crt, parent, ca_crl, profile,
  47817. pathlen, selfsigned, flags, f_vrfy, p_vrfy );
  47818. if( ret != 0 )
  47819. return( ret );
  47820. }
  47821. else
  47822. {
  47823. /* Look for a parent upwards the chain */
  47824. for( parent = crt->next; parent != NULL; parent = parent->next )
  47825. if( x509_crt_check_parent( crt, parent, 0, pathlen == 0 ) == 0 )
  47826. break;
  47827. /* Are we part of the chain or at the top? */
  47828. if( parent != NULL )
  47829. {
  47830. ret = x509_crt_verify_child( crt, parent, trust_ca, ca_crl, profile,
  47831. pathlen, selfsigned, flags, f_vrfy, p_vrfy );
  47832. if( ret != 0 )
  47833. return( ret );
  47834. }
  47835. else
  47836. {
  47837. ret = x509_crt_verify_top( crt, trust_ca, ca_crl, profile,
  47838. pathlen, selfsigned, flags, f_vrfy, p_vrfy );
  47839. if( ret != 0 )
  47840. return( ret );
  47841. }
  47842. }
  47843. if( *flags != 0 )
  47844. return( MBEDTLS_ERR_X509_CERT_VERIFY_FAILED );
  47845. return( 0 );
  47846. }
  47847. /*
  47848. * Initialize a certificate chain
  47849. */
  47850. void mbedtls_x509_crt_init( mbedtls_x509_crt *crt )
  47851. {
  47852. memset( crt, 0, sizeof(mbedtls_x509_crt) );
  47853. }
  47854. /*
  47855. * Unallocate all certificate data
  47856. */
  47857. void mbedtls_x509_crt_free( mbedtls_x509_crt *crt )
  47858. {
  47859. mbedtls_x509_crt *cert_cur = crt;
  47860. mbedtls_x509_crt *cert_prv;
  47861. mbedtls_x509_name *name_cur;
  47862. mbedtls_x509_name *name_prv;
  47863. mbedtls_x509_sequence *seq_cur;
  47864. mbedtls_x509_sequence *seq_prv;
  47865. if( crt == NULL )
  47866. return;
  47867. do
  47868. {
  47869. mbedtls_pk_free( &cert_cur->pk );
  47870. #if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT)
  47871. mbedtls_free( cert_cur->sig_opts );
  47872. #endif
  47873. name_cur = cert_cur->issuer.next;
  47874. while( name_cur != NULL )
  47875. {
  47876. name_prv = name_cur;
  47877. name_cur = name_cur->next;
  47878. x509_crt_zeroize( name_prv, sizeof( mbedtls_x509_name ) );
  47879. mbedtls_free( name_prv );
  47880. }
  47881. name_cur = cert_cur->subject.next;
  47882. while( name_cur != NULL )
  47883. {
  47884. name_prv = name_cur;
  47885. name_cur = name_cur->next;
  47886. x509_crt_zeroize( name_prv, sizeof( mbedtls_x509_name ) );
  47887. mbedtls_free( name_prv );
  47888. }
  47889. seq_cur = cert_cur->ext_key_usage.next;
  47890. while( seq_cur != NULL )
  47891. {
  47892. seq_prv = seq_cur;
  47893. seq_cur = seq_cur->next;
  47894. x509_crt_zeroize( seq_prv, sizeof( mbedtls_x509_sequence ) );
  47895. mbedtls_free( seq_prv );
  47896. }
  47897. seq_cur = cert_cur->subject_alt_names.next;
  47898. while( seq_cur != NULL )
  47899. {
  47900. seq_prv = seq_cur;
  47901. seq_cur = seq_cur->next;
  47902. x509_crt_zeroize( seq_prv, sizeof( mbedtls_x509_sequence ) );
  47903. mbedtls_free( seq_prv );
  47904. }
  47905. if( cert_cur->raw.p != NULL )
  47906. {
  47907. x509_crt_zeroize( cert_cur->raw.p, cert_cur->raw.len );
  47908. mbedtls_free( cert_cur->raw.p );
  47909. }
  47910. cert_cur = cert_cur->next;
  47911. }
  47912. while( cert_cur != NULL );
  47913. cert_cur = crt;
  47914. do
  47915. {
  47916. cert_prv = cert_cur;
  47917. cert_cur = cert_cur->next;
  47918. x509_crt_zeroize( cert_prv, sizeof( mbedtls_x509_crt ) );
  47919. if( cert_prv != crt )
  47920. mbedtls_free( cert_prv );
  47921. }
  47922. while( cert_cur != NULL );
  47923. }
  47924. /* Amalgamated Release Mappings */
  47925. #undef SAFE_SNPRINTF
  47926. #undef BEFORE_COLON
  47927. #undef BC
  47928. #endif /* MBEDTLS_X509_CRT_PARSE_C */
  47929. /********* Start of file library/x509_csr.c ************/
  47930. /*
  47931. * X.509 Certificate Signing Request (CSR) parsing
  47932. *
  47933. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  47934. * SPDX-License-Identifier: Apache-2.0
  47935. *
  47936. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  47937. * not use this file except in compliance with the License.
  47938. * You may obtain a copy of the License at
  47939. *
  47940. * http://www.apache.org/licenses/LICENSE-2.0
  47941. *
  47942. * Unless required by applicable law or agreed to in writing, software
  47943. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  47944. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  47945. * See the License for the specific language governing permissions and
  47946. * limitations under the License.
  47947. *
  47948. * This file is part of mbed TLS (https://tls.mbed.org)
  47949. */
  47950. /*
  47951. * The ITU-T X.509 standard defines a certificate format for PKI.
  47952. *
  47953. * http://www.ietf.org/rfc/rfc5280.txt (Certificates and CRLs)
  47954. * http://www.ietf.org/rfc/rfc3279.txt (Alg IDs for CRLs)
  47955. * http://www.ietf.org/rfc/rfc2986.txt (CSRs, aka PKCS#10)
  47956. *
  47957. * http://www.itu.int/ITU-T/studygroups/com17/languages/X.680-0207.pdf
  47958. * http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf
  47959. */
  47960. #if !defined(MBEDTLS_CONFIG_FILE)
  47961. #else
  47962. #endif
  47963. #if defined(MBEDTLS_X509_CSR_PARSE_C)
  47964. #include <string.h>
  47965. #if defined(MBEDTLS_PEM_PARSE_C)
  47966. #endif
  47967. #if defined(MBEDTLS_PLATFORM_C)
  47968. #else
  47969. #include <stdlib.h>
  47970. #include <stdio.h>
  47971. #define mbedtls_free free
  47972. #define mbedtls_calloc calloc
  47973. #define mbedtls_snprintf snprintf
  47974. #endif
  47975. #if defined(MBEDTLS_FS_IO) || defined(EFIX64) || defined(EFI32)
  47976. #include <stdio.h>
  47977. #endif
  47978. /* Implementation that should never be optimized out by the compiler */
  47979. static void x509_csr_zeroize( void *v, size_t n ) {
  47980. volatile unsigned char *p = v; while( n-- ) *p++ = 0;
  47981. }
  47982. /*
  47983. * Version ::= INTEGER { v1(0) }
  47984. */
  47985. static int x509_csr_get_version( unsigned char **p,
  47986. const unsigned char *end,
  47987. int *ver )
  47988. {
  47989. int ret;
  47990. if( ( ret = mbedtls_asn1_get_int( p, end, ver ) ) != 0 )
  47991. {
  47992. if( ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG )
  47993. {
  47994. *ver = 0;
  47995. return( 0 );
  47996. }
  47997. return( MBEDTLS_ERR_X509_INVALID_VERSION + ret );
  47998. }
  47999. return( 0 );
  48000. }
  48001. /*
  48002. * Parse a CSR in DER format
  48003. */
  48004. int mbedtls_x509_csr_parse_der( mbedtls_x509_csr *csr,
  48005. const unsigned char *buf, size_t buflen )
  48006. {
  48007. int ret;
  48008. size_t len;
  48009. unsigned char *p, *end;
  48010. mbedtls_x509_buf sig_params;
  48011. memset( &sig_params, 0, sizeof( mbedtls_x509_buf ) );
  48012. /*
  48013. * Check for valid input
  48014. */
  48015. if( csr == NULL || buf == NULL )
  48016. return( MBEDTLS_ERR_X509_BAD_INPUT_DATA );
  48017. mbedtls_x509_csr_init( csr );
  48018. /*
  48019. * first copy the raw DER data
  48020. */
  48021. p = mbedtls_calloc( 1, len = buflen );
  48022. if( p == NULL )
  48023. return( MBEDTLS_ERR_X509_ALLOC_FAILED );
  48024. memcpy( p, buf, buflen );
  48025. csr->raw.p = p;
  48026. csr->raw.len = len;
  48027. end = p + len;
  48028. /*
  48029. * CertificationRequest ::= SEQUENCE {
  48030. * certificationRequestInfo CertificationRequestInfo,
  48031. * signatureAlgorithm AlgorithmIdentifier,
  48032. * signature BIT STRING
  48033. * }
  48034. */
  48035. if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,
  48036. MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )
  48037. {
  48038. mbedtls_x509_csr_free( csr );
  48039. return( MBEDTLS_ERR_X509_INVALID_FORMAT );
  48040. }
  48041. if( len != (size_t) ( end - p ) )
  48042. {
  48043. mbedtls_x509_csr_free( csr );
  48044. return( MBEDTLS_ERR_X509_INVALID_FORMAT +
  48045. MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
  48046. }
  48047. /*
  48048. * CertificationRequestInfo ::= SEQUENCE {
  48049. */
  48050. csr->cri.p = p;
  48051. if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,
  48052. MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )
  48053. {
  48054. mbedtls_x509_csr_free( csr );
  48055. return( MBEDTLS_ERR_X509_INVALID_FORMAT + ret );
  48056. }
  48057. end = p + len;
  48058. csr->cri.len = end - csr->cri.p;
  48059. /*
  48060. * Version ::= INTEGER { v1(0) }
  48061. */
  48062. if( ( ret = x509_csr_get_version( &p, end, &csr->version ) ) != 0 )
  48063. {
  48064. mbedtls_x509_csr_free( csr );
  48065. return( ret );
  48066. }
  48067. csr->version++;
  48068. if( csr->version != 1 )
  48069. {
  48070. mbedtls_x509_csr_free( csr );
  48071. return( MBEDTLS_ERR_X509_UNKNOWN_VERSION );
  48072. }
  48073. /*
  48074. * subject Name
  48075. */
  48076. csr->subject_raw.p = p;
  48077. if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,
  48078. MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )
  48079. {
  48080. mbedtls_x509_csr_free( csr );
  48081. return( MBEDTLS_ERR_X509_INVALID_FORMAT + ret );
  48082. }
  48083. if( ( ret = mbedtls_x509_get_name( &p, p + len, &csr->subject ) ) != 0 )
  48084. {
  48085. mbedtls_x509_csr_free( csr );
  48086. return( ret );
  48087. }
  48088. csr->subject_raw.len = p - csr->subject_raw.p;
  48089. /*
  48090. * subjectPKInfo SubjectPublicKeyInfo
  48091. */
  48092. if( ( ret = mbedtls_pk_parse_subpubkey( &p, end, &csr->pk ) ) != 0 )
  48093. {
  48094. mbedtls_x509_csr_free( csr );
  48095. return( ret );
  48096. }
  48097. /*
  48098. * attributes [0] Attributes
  48099. */
  48100. if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,
  48101. MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_CONTEXT_SPECIFIC ) ) != 0 )
  48102. {
  48103. mbedtls_x509_csr_free( csr );
  48104. return( MBEDTLS_ERR_X509_INVALID_FORMAT + ret );
  48105. }
  48106. // TODO Parse Attributes / extension requests
  48107. p += len;
  48108. end = csr->raw.p + csr->raw.len;
  48109. /*
  48110. * signatureAlgorithm AlgorithmIdentifier,
  48111. * signature BIT STRING
  48112. */
  48113. if( ( ret = mbedtls_x509_get_alg( &p, end, &csr->sig_oid, &sig_params ) ) != 0 )
  48114. {
  48115. mbedtls_x509_csr_free( csr );
  48116. return( ret );
  48117. }
  48118. if( ( ret = mbedtls_x509_get_sig_alg( &csr->sig_oid, &sig_params,
  48119. &csr->sig_md, &csr->sig_pk,
  48120. &csr->sig_opts ) ) != 0 )
  48121. {
  48122. mbedtls_x509_csr_free( csr );
  48123. return( MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG );
  48124. }
  48125. if( ( ret = mbedtls_x509_get_sig( &p, end, &csr->sig ) ) != 0 )
  48126. {
  48127. mbedtls_x509_csr_free( csr );
  48128. return( ret );
  48129. }
  48130. if( p != end )
  48131. {
  48132. mbedtls_x509_csr_free( csr );
  48133. return( MBEDTLS_ERR_X509_INVALID_FORMAT +
  48134. MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
  48135. }
  48136. return( 0 );
  48137. }
  48138. /*
  48139. * Parse a CSR, allowing for PEM or raw DER encoding
  48140. */
  48141. int mbedtls_x509_csr_parse( mbedtls_x509_csr *csr, const unsigned char *buf, size_t buflen )
  48142. {
  48143. int ret;
  48144. #if defined(MBEDTLS_PEM_PARSE_C)
  48145. size_t use_len;
  48146. mbedtls_pem_context pem;
  48147. #endif
  48148. /*
  48149. * Check for valid input
  48150. */
  48151. if( csr == NULL || buf == NULL )
  48152. return( MBEDTLS_ERR_X509_BAD_INPUT_DATA );
  48153. #if defined(MBEDTLS_PEM_PARSE_C)
  48154. mbedtls_pem_init( &pem );
  48155. /* Avoid calling mbedtls_pem_read_buffer() on non-null-terminated string */
  48156. if( buflen == 0 || buf[buflen - 1] != '\0' )
  48157. ret = MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT;
  48158. else
  48159. ret = mbedtls_pem_read_buffer( &pem,
  48160. "-----BEGIN CERTIFICATE REQUEST-----",
  48161. "-----END CERTIFICATE REQUEST-----",
  48162. buf, NULL, 0, &use_len );
  48163. if( ret == 0 )
  48164. {
  48165. /*
  48166. * Was PEM encoded, parse the result
  48167. */
  48168. if( ( ret = mbedtls_x509_csr_parse_der( csr, pem.buf, pem.buflen ) ) != 0 )
  48169. return( ret );
  48170. mbedtls_pem_free( &pem );
  48171. return( 0 );
  48172. }
  48173. else if( ret != MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT )
  48174. {
  48175. mbedtls_pem_free( &pem );
  48176. return( ret );
  48177. }
  48178. else
  48179. #endif /* MBEDTLS_PEM_PARSE_C */
  48180. return( mbedtls_x509_csr_parse_der( csr, buf, buflen ) );
  48181. }
  48182. #if defined(MBEDTLS_FS_IO)
  48183. /*
  48184. * Load a CSR into the structure
  48185. */
  48186. int mbedtls_x509_csr_parse_file( mbedtls_x509_csr *csr, const char *path )
  48187. {
  48188. int ret;
  48189. size_t n;
  48190. unsigned char *buf;
  48191. if( ( ret = mbedtls_pk_load_file( path, &buf, &n ) ) != 0 )
  48192. return( ret );
  48193. ret = mbedtls_x509_csr_parse( csr, buf, n );
  48194. x509_csr_zeroize( buf, n );
  48195. mbedtls_free( buf );
  48196. return( ret );
  48197. }
  48198. #endif /* MBEDTLS_FS_IO */
  48199. #define BEFORE_COLON 14
  48200. #define BC "14"
  48201. /*
  48202. * Return an informational string about the CSR.
  48203. */
  48204. int mbedtls_x509_csr_info( char *buf, size_t size, const char *prefix,
  48205. const mbedtls_x509_csr *csr )
  48206. {
  48207. int ret;
  48208. size_t n;
  48209. char *p;
  48210. char key_size_str[BEFORE_COLON];
  48211. p = buf;
  48212. n = size;
  48213. ret = mbedtls_snprintf( p, n, "%sCSR version : %d",
  48214. prefix, csr->version );
  48215. MBEDTLS_X509_SAFE_SNPRINTF;
  48216. ret = mbedtls_snprintf( p, n, "\n%ssubject name : ", prefix );
  48217. MBEDTLS_X509_SAFE_SNPRINTF;
  48218. ret = mbedtls_x509_dn_gets( p, n, &csr->subject );
  48219. MBEDTLS_X509_SAFE_SNPRINTF;
  48220. ret = mbedtls_snprintf( p, n, "\n%ssigned using : ", prefix );
  48221. MBEDTLS_X509_SAFE_SNPRINTF;
  48222. ret = mbedtls_x509_sig_alg_gets( p, n, &csr->sig_oid, csr->sig_pk, csr->sig_md,
  48223. csr->sig_opts );
  48224. MBEDTLS_X509_SAFE_SNPRINTF;
  48225. if( ( ret = mbedtls_x509_key_size_helper( key_size_str, BEFORE_COLON,
  48226. mbedtls_pk_get_name( &csr->pk ) ) ) != 0 )
  48227. {
  48228. return( ret );
  48229. }
  48230. ret = mbedtls_snprintf( p, n, "\n%s%-" BC "s: %d bits\n", prefix, key_size_str,
  48231. (int) mbedtls_pk_get_bitlen( &csr->pk ) );
  48232. MBEDTLS_X509_SAFE_SNPRINTF;
  48233. return( (int) ( size - n ) );
  48234. }
  48235. /*
  48236. * Initialize a CSR
  48237. */
  48238. void mbedtls_x509_csr_init( mbedtls_x509_csr *csr )
  48239. {
  48240. memset( csr, 0, sizeof(mbedtls_x509_csr) );
  48241. }
  48242. /*
  48243. * Unallocate all CSR data
  48244. */
  48245. void mbedtls_x509_csr_free( mbedtls_x509_csr *csr )
  48246. {
  48247. mbedtls_x509_name *name_cur;
  48248. mbedtls_x509_name *name_prv;
  48249. if( csr == NULL )
  48250. return;
  48251. mbedtls_pk_free( &csr->pk );
  48252. #if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT)
  48253. mbedtls_free( csr->sig_opts );
  48254. #endif
  48255. name_cur = csr->subject.next;
  48256. while( name_cur != NULL )
  48257. {
  48258. name_prv = name_cur;
  48259. name_cur = name_cur->next;
  48260. x509_csr_zeroize( name_prv, sizeof( mbedtls_x509_name ) );
  48261. mbedtls_free( name_prv );
  48262. }
  48263. if( csr->raw.p != NULL )
  48264. {
  48265. x509_csr_zeroize( csr->raw.p, csr->raw.len );
  48266. mbedtls_free( csr->raw.p );
  48267. }
  48268. x509_csr_zeroize( csr, sizeof( mbedtls_x509_csr ) );
  48269. }
  48270. /* Amalgamated Release Mappings */
  48271. #undef SAFE_SNPRINTF
  48272. #undef BEFORE_COLON
  48273. #undef BC
  48274. #endif /* MBEDTLS_X509_CSR_PARSE_C */
  48275. /********* Start of file library/x509write_crt.c ************/
  48276. /*
  48277. * X.509 certificate writing
  48278. *
  48279. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  48280. * SPDX-License-Identifier: Apache-2.0
  48281. *
  48282. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  48283. * not use this file except in compliance with the License.
  48284. * You may obtain a copy of the License at
  48285. *
  48286. * http://www.apache.org/licenses/LICENSE-2.0
  48287. *
  48288. * Unless required by applicable law or agreed to in writing, software
  48289. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  48290. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  48291. * See the License for the specific language governing permissions and
  48292. * limitations under the License.
  48293. *
  48294. * This file is part of mbed TLS (https://tls.mbed.org)
  48295. */
  48296. /*
  48297. * References:
  48298. * - certificates: RFC 5280, updated by RFC 6818
  48299. * - CSRs: PKCS#10 v1.7 aka RFC 2986
  48300. * - attributes: PKCS#9 v2.0 aka RFC 2985
  48301. */
  48302. #if !defined(MBEDTLS_CONFIG_FILE)
  48303. #else
  48304. #endif
  48305. #if defined(MBEDTLS_X509_CRT_WRITE_C)
  48306. #include <string.h>
  48307. #if defined(MBEDTLS_PEM_WRITE_C)
  48308. #endif /* MBEDTLS_PEM_WRITE_C */
  48309. /* Implementation that should never be optimized out by the compiler */
  48310. static void x509_write_crt_zeroize( void *v, size_t n ) {
  48311. volatile unsigned char *p = v; while( n-- ) *p++ = 0;
  48312. }
  48313. void mbedtls_x509write_crt_init( mbedtls_x509write_cert *ctx )
  48314. {
  48315. memset( ctx, 0, sizeof(mbedtls_x509write_cert) );
  48316. mbedtls_mpi_init( &ctx->serial );
  48317. ctx->version = MBEDTLS_X509_CRT_VERSION_3;
  48318. }
  48319. void mbedtls_x509write_crt_free( mbedtls_x509write_cert *ctx )
  48320. {
  48321. mbedtls_mpi_free( &ctx->serial );
  48322. mbedtls_asn1_free_named_data_list( &ctx->subject );
  48323. mbedtls_asn1_free_named_data_list( &ctx->issuer );
  48324. mbedtls_asn1_free_named_data_list( &ctx->extensions );
  48325. x509_write_crt_zeroize( ctx, sizeof(mbedtls_x509write_cert) );
  48326. }
  48327. void mbedtls_x509write_crt_set_version( mbedtls_x509write_cert *ctx, int version )
  48328. {
  48329. ctx->version = version;
  48330. }
  48331. void mbedtls_x509write_crt_set_md_alg( mbedtls_x509write_cert *ctx, mbedtls_md_type_t md_alg )
  48332. {
  48333. ctx->md_alg = md_alg;
  48334. }
  48335. void mbedtls_x509write_crt_set_subject_key( mbedtls_x509write_cert *ctx, mbedtls_pk_context *key )
  48336. {
  48337. ctx->subject_key = key;
  48338. }
  48339. void mbedtls_x509write_crt_set_issuer_key( mbedtls_x509write_cert *ctx, mbedtls_pk_context *key )
  48340. {
  48341. ctx->issuer_key = key;
  48342. }
  48343. int mbedtls_x509write_crt_set_subject_name( mbedtls_x509write_cert *ctx,
  48344. const char *subject_name )
  48345. {
  48346. return mbedtls_x509_string_to_names( &ctx->subject, subject_name );
  48347. }
  48348. int mbedtls_x509write_crt_set_issuer_name( mbedtls_x509write_cert *ctx,
  48349. const char *issuer_name )
  48350. {
  48351. return mbedtls_x509_string_to_names( &ctx->issuer, issuer_name );
  48352. }
  48353. int mbedtls_x509write_crt_set_serial( mbedtls_x509write_cert *ctx, const mbedtls_mpi *serial )
  48354. {
  48355. int ret;
  48356. if( ( ret = mbedtls_mpi_copy( &ctx->serial, serial ) ) != 0 )
  48357. return( ret );
  48358. return( 0 );
  48359. }
  48360. int mbedtls_x509write_crt_set_validity( mbedtls_x509write_cert *ctx, const char *not_before,
  48361. const char *not_after )
  48362. {
  48363. if( strlen( not_before ) != MBEDTLS_X509_RFC5280_UTC_TIME_LEN - 1 ||
  48364. strlen( not_after ) != MBEDTLS_X509_RFC5280_UTC_TIME_LEN - 1 )
  48365. {
  48366. return( MBEDTLS_ERR_X509_BAD_INPUT_DATA );
  48367. }
  48368. strncpy( ctx->not_before, not_before, MBEDTLS_X509_RFC5280_UTC_TIME_LEN );
  48369. strncpy( ctx->not_after , not_after , MBEDTLS_X509_RFC5280_UTC_TIME_LEN );
  48370. ctx->not_before[MBEDTLS_X509_RFC5280_UTC_TIME_LEN - 1] = 'Z';
  48371. ctx->not_after[MBEDTLS_X509_RFC5280_UTC_TIME_LEN - 1] = 'Z';
  48372. return( 0 );
  48373. }
  48374. int mbedtls_x509write_crt_set_extension( mbedtls_x509write_cert *ctx,
  48375. const char *oid, size_t oid_len,
  48376. int critical,
  48377. const unsigned char *val, size_t val_len )
  48378. {
  48379. return mbedtls_x509_set_extension( &ctx->extensions, oid, oid_len,
  48380. critical, val, val_len );
  48381. }
  48382. int mbedtls_x509write_crt_set_basic_constraints( mbedtls_x509write_cert *ctx,
  48383. int is_ca, int max_pathlen )
  48384. {
  48385. int ret;
  48386. unsigned char buf[9];
  48387. unsigned char *c = buf + sizeof(buf);
  48388. size_t len = 0;
  48389. memset( buf, 0, sizeof(buf) );
  48390. if( is_ca && max_pathlen > 127 )
  48391. return( MBEDTLS_ERR_X509_BAD_INPUT_DATA );
  48392. if( is_ca )
  48393. {
  48394. if( max_pathlen >= 0 )
  48395. {
  48396. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_int( &c, buf, max_pathlen ) );
  48397. }
  48398. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_bool( &c, buf, 1 ) );
  48399. }
  48400. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, buf, len ) );
  48401. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, buf, MBEDTLS_ASN1_CONSTRUCTED |
  48402. MBEDTLS_ASN1_SEQUENCE ) );
  48403. return mbedtls_x509write_crt_set_extension( ctx, MBEDTLS_OID_BASIC_CONSTRAINTS,
  48404. MBEDTLS_OID_SIZE( MBEDTLS_OID_BASIC_CONSTRAINTS ),
  48405. 0, buf + sizeof(buf) - len, len );
  48406. }
  48407. #if defined(MBEDTLS_SHA1_C)
  48408. int mbedtls_x509write_crt_set_subject_key_identifier( mbedtls_x509write_cert *ctx )
  48409. {
  48410. int ret;
  48411. unsigned char buf[MBEDTLS_MPI_MAX_SIZE * 2 + 20]; /* tag, length + 2xMPI */
  48412. unsigned char *c = buf + sizeof(buf);
  48413. size_t len = 0;
  48414. memset( buf, 0, sizeof(buf) );
  48415. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_pk_write_pubkey( &c, buf, ctx->subject_key ) );
  48416. mbedtls_sha1( buf + sizeof(buf) - len, len, buf + sizeof(buf) - 20 );
  48417. c = buf + sizeof(buf) - 20;
  48418. len = 20;
  48419. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, buf, len ) );
  48420. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, buf, MBEDTLS_ASN1_OCTET_STRING ) );
  48421. return mbedtls_x509write_crt_set_extension( ctx, MBEDTLS_OID_SUBJECT_KEY_IDENTIFIER,
  48422. MBEDTLS_OID_SIZE( MBEDTLS_OID_SUBJECT_KEY_IDENTIFIER ),
  48423. 0, buf + sizeof(buf) - len, len );
  48424. }
  48425. int mbedtls_x509write_crt_set_authority_key_identifier( mbedtls_x509write_cert *ctx )
  48426. {
  48427. int ret;
  48428. unsigned char buf[MBEDTLS_MPI_MAX_SIZE * 2 + 20]; /* tag, length + 2xMPI */
  48429. unsigned char *c = buf + sizeof(buf);
  48430. size_t len = 0;
  48431. memset( buf, 0, sizeof(buf) );
  48432. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_pk_write_pubkey( &c, buf, ctx->issuer_key ) );
  48433. mbedtls_sha1( buf + sizeof(buf) - len, len, buf + sizeof(buf) - 20 );
  48434. c = buf + sizeof(buf) - 20;
  48435. len = 20;
  48436. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, buf, len ) );
  48437. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, buf, MBEDTLS_ASN1_CONTEXT_SPECIFIC | 0 ) );
  48438. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, buf, len ) );
  48439. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, buf, MBEDTLS_ASN1_CONSTRUCTED |
  48440. MBEDTLS_ASN1_SEQUENCE ) );
  48441. return mbedtls_x509write_crt_set_extension( ctx, MBEDTLS_OID_AUTHORITY_KEY_IDENTIFIER,
  48442. MBEDTLS_OID_SIZE( MBEDTLS_OID_AUTHORITY_KEY_IDENTIFIER ),
  48443. 0, buf + sizeof(buf) - len, len );
  48444. }
  48445. #endif /* MBEDTLS_SHA1_C */
  48446. int mbedtls_x509write_crt_set_key_usage( mbedtls_x509write_cert *ctx,
  48447. unsigned int key_usage )
  48448. {
  48449. unsigned char buf[4], ku;
  48450. unsigned char *c;
  48451. int ret;
  48452. /* We currently only support 7 bits, from 0x80 to 0x02 */
  48453. if( ( key_usage & ~0xfe ) != 0 )
  48454. return( MBEDTLS_ERR_X509_FEATURE_UNAVAILABLE );
  48455. c = buf + 4;
  48456. ku = (unsigned char) key_usage;
  48457. if( ( ret = mbedtls_asn1_write_bitstring( &c, buf, &ku, 7 ) ) != 4 )
  48458. return( ret );
  48459. ret = mbedtls_x509write_crt_set_extension( ctx, MBEDTLS_OID_KEY_USAGE,
  48460. MBEDTLS_OID_SIZE( MBEDTLS_OID_KEY_USAGE ),
  48461. 1, buf, 4 );
  48462. if( ret != 0 )
  48463. return( ret );
  48464. return( 0 );
  48465. }
  48466. int mbedtls_x509write_crt_set_ns_cert_type( mbedtls_x509write_cert *ctx,
  48467. unsigned char ns_cert_type )
  48468. {
  48469. unsigned char buf[4];
  48470. unsigned char *c;
  48471. int ret;
  48472. c = buf + 4;
  48473. if( ( ret = mbedtls_asn1_write_bitstring( &c, buf, &ns_cert_type, 8 ) ) != 4 )
  48474. return( ret );
  48475. ret = mbedtls_x509write_crt_set_extension( ctx, MBEDTLS_OID_NS_CERT_TYPE,
  48476. MBEDTLS_OID_SIZE( MBEDTLS_OID_NS_CERT_TYPE ),
  48477. 0, buf, 4 );
  48478. if( ret != 0 )
  48479. return( ret );
  48480. return( 0 );
  48481. }
  48482. static int x509_write_time( unsigned char **p, unsigned char *start,
  48483. const char *time, size_t size )
  48484. {
  48485. int ret;
  48486. size_t len = 0;
  48487. /*
  48488. * write MBEDTLS_ASN1_UTC_TIME if year < 2050 (2 bytes shorter)
  48489. */
  48490. if( time[0] == '2' && time[1] == '0' && time [2] < '5' )
  48491. {
  48492. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_raw_buffer( p, start,
  48493. (const unsigned char *) time + 2,
  48494. size - 2 ) );
  48495. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) );
  48496. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_UTC_TIME ) );
  48497. }
  48498. else
  48499. {
  48500. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_raw_buffer( p, start,
  48501. (const unsigned char *) time,
  48502. size ) );
  48503. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) );
  48504. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_GENERALIZED_TIME ) );
  48505. }
  48506. return( (int) len );
  48507. }
  48508. int mbedtls_x509write_crt_der( mbedtls_x509write_cert *ctx, unsigned char *buf, size_t size,
  48509. int (*f_rng)(void *, unsigned char *, size_t),
  48510. void *p_rng )
  48511. {
  48512. int ret;
  48513. const char *sig_oid;
  48514. size_t sig_oid_len = 0;
  48515. unsigned char *c, *c2;
  48516. unsigned char hash[64];
  48517. unsigned char sig[MBEDTLS_MPI_MAX_SIZE];
  48518. unsigned char tmp_buf[2048];
  48519. size_t sub_len = 0, pub_len = 0, sig_and_oid_len = 0, sig_len;
  48520. size_t len = 0;
  48521. mbedtls_pk_type_t pk_alg;
  48522. /*
  48523. * Prepare data to be signed in tmp_buf
  48524. */
  48525. c = tmp_buf + sizeof( tmp_buf );
  48526. /* Signature algorithm needed in TBS, and later for actual signature */
  48527. pk_alg = mbedtls_pk_get_type( ctx->issuer_key );
  48528. if( pk_alg == MBEDTLS_PK_ECKEY )
  48529. pk_alg = MBEDTLS_PK_ECDSA;
  48530. if( ( ret = mbedtls_oid_get_oid_by_sig_alg( pk_alg, ctx->md_alg,
  48531. &sig_oid, &sig_oid_len ) ) != 0 )
  48532. {
  48533. return( ret );
  48534. }
  48535. /*
  48536. * Extensions ::= SEQUENCE SIZE (1..MAX) OF Extension
  48537. */
  48538. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_x509_write_extensions( &c, tmp_buf, ctx->extensions ) );
  48539. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, tmp_buf, len ) );
  48540. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, tmp_buf, MBEDTLS_ASN1_CONSTRUCTED |
  48541. MBEDTLS_ASN1_SEQUENCE ) );
  48542. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, tmp_buf, len ) );
  48543. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, tmp_buf, MBEDTLS_ASN1_CONTEXT_SPECIFIC |
  48544. MBEDTLS_ASN1_CONSTRUCTED | 3 ) );
  48545. /*
  48546. * SubjectPublicKeyInfo
  48547. */
  48548. MBEDTLS_ASN1_CHK_ADD( pub_len, mbedtls_pk_write_pubkey_der( ctx->subject_key,
  48549. tmp_buf, c - tmp_buf ) );
  48550. c -= pub_len;
  48551. len += pub_len;
  48552. /*
  48553. * Subject ::= Name
  48554. */
  48555. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_x509_write_names( &c, tmp_buf, ctx->subject ) );
  48556. /*
  48557. * Validity ::= SEQUENCE {
  48558. * notBefore Time,
  48559. * notAfter Time }
  48560. */
  48561. sub_len = 0;
  48562. MBEDTLS_ASN1_CHK_ADD( sub_len, x509_write_time( &c, tmp_buf, ctx->not_after,
  48563. MBEDTLS_X509_RFC5280_UTC_TIME_LEN ) );
  48564. MBEDTLS_ASN1_CHK_ADD( sub_len, x509_write_time( &c, tmp_buf, ctx->not_before,
  48565. MBEDTLS_X509_RFC5280_UTC_TIME_LEN ) );
  48566. len += sub_len;
  48567. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, tmp_buf, sub_len ) );
  48568. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, tmp_buf, MBEDTLS_ASN1_CONSTRUCTED |
  48569. MBEDTLS_ASN1_SEQUENCE ) );
  48570. /*
  48571. * Issuer ::= Name
  48572. */
  48573. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_x509_write_names( &c, tmp_buf, ctx->issuer ) );
  48574. /*
  48575. * Signature ::= AlgorithmIdentifier
  48576. */
  48577. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_algorithm_identifier( &c, tmp_buf,
  48578. sig_oid, strlen( sig_oid ), 0 ) );
  48579. /*
  48580. * Serial ::= INTEGER
  48581. */
  48582. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_mpi( &c, tmp_buf, &ctx->serial ) );
  48583. /*
  48584. * Version ::= INTEGER { v1(0), v2(1), v3(2) }
  48585. */
  48586. sub_len = 0;
  48587. MBEDTLS_ASN1_CHK_ADD( sub_len, mbedtls_asn1_write_int( &c, tmp_buf, ctx->version ) );
  48588. len += sub_len;
  48589. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, tmp_buf, sub_len ) );
  48590. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, tmp_buf, MBEDTLS_ASN1_CONTEXT_SPECIFIC |
  48591. MBEDTLS_ASN1_CONSTRUCTED | 0 ) );
  48592. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, tmp_buf, len ) );
  48593. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, tmp_buf, MBEDTLS_ASN1_CONSTRUCTED |
  48594. MBEDTLS_ASN1_SEQUENCE ) );
  48595. /*
  48596. * Make signature
  48597. */
  48598. mbedtls_md( mbedtls_md_info_from_type( ctx->md_alg ), c, len, hash );
  48599. if( ( ret = mbedtls_pk_sign( ctx->issuer_key, ctx->md_alg, hash, 0, sig, &sig_len,
  48600. f_rng, p_rng ) ) != 0 )
  48601. {
  48602. return( ret );
  48603. }
  48604. /*
  48605. * Write data to output buffer
  48606. */
  48607. c2 = buf + size;
  48608. MBEDTLS_ASN1_CHK_ADD( sig_and_oid_len, mbedtls_x509_write_sig( &c2, buf,
  48609. sig_oid, sig_oid_len, sig, sig_len ) );
  48610. c2 -= len;
  48611. memcpy( c2, c, len );
  48612. len += sig_and_oid_len;
  48613. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c2, buf, len ) );
  48614. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c2, buf, MBEDTLS_ASN1_CONSTRUCTED |
  48615. MBEDTLS_ASN1_SEQUENCE ) );
  48616. return( (int) len );
  48617. }
  48618. #define PEM_BEGIN_CRT "-----BEGIN CERTIFICATE-----\n"
  48619. #define PEM_END_CRT "-----END CERTIFICATE-----\n"
  48620. #if defined(MBEDTLS_PEM_WRITE_C)
  48621. int mbedtls_x509write_crt_pem( mbedtls_x509write_cert *crt, unsigned char *buf, size_t size,
  48622. int (*f_rng)(void *, unsigned char *, size_t),
  48623. void *p_rng )
  48624. {
  48625. int ret;
  48626. unsigned char output_buf[4096];
  48627. size_t olen = 0;
  48628. if( ( ret = mbedtls_x509write_crt_der( crt, output_buf, sizeof(output_buf),
  48629. f_rng, p_rng ) ) < 0 )
  48630. {
  48631. return( ret );
  48632. }
  48633. if( ( ret = mbedtls_pem_write_buffer( PEM_BEGIN_CRT, PEM_END_CRT,
  48634. output_buf + sizeof(output_buf) - ret,
  48635. ret, buf, size, &olen ) ) != 0 )
  48636. {
  48637. return( ret );
  48638. }
  48639. return( 0 );
  48640. }
  48641. #endif /* MBEDTLS_PEM_WRITE_C */
  48642. #endif /* MBEDTLS_X509_CRT_WRITE_C */
  48643. /********* Start of file library/x509write_csr.c ************/
  48644. /*
  48645. * X.509 Certificate Signing Request writing
  48646. *
  48647. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  48648. * SPDX-License-Identifier: Apache-2.0
  48649. *
  48650. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  48651. * not use this file except in compliance with the License.
  48652. * You may obtain a copy of the License at
  48653. *
  48654. * http://www.apache.org/licenses/LICENSE-2.0
  48655. *
  48656. * Unless required by applicable law or agreed to in writing, software
  48657. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  48658. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  48659. * See the License for the specific language governing permissions and
  48660. * limitations under the License.
  48661. *
  48662. * This file is part of mbed TLS (https://tls.mbed.org)
  48663. */
  48664. /*
  48665. * References:
  48666. * - CSRs: PKCS#10 v1.7 aka RFC 2986
  48667. * - attributes: PKCS#9 v2.0 aka RFC 2985
  48668. */
  48669. #if !defined(MBEDTLS_CONFIG_FILE)
  48670. #else
  48671. #endif
  48672. #if defined(MBEDTLS_X509_CSR_WRITE_C)
  48673. #include <string.h>
  48674. #include <stdlib.h>
  48675. #if defined(MBEDTLS_PEM_WRITE_C)
  48676. #endif
  48677. /* Implementation that should never be optimized out by the compiler */
  48678. static void x509_write_csr_zeroize( void *v, size_t n ) {
  48679. volatile unsigned char *p = v; while( n-- ) *p++ = 0;
  48680. }
  48681. void mbedtls_x509write_csr_init( mbedtls_x509write_csr *ctx )
  48682. {
  48683. memset( ctx, 0, sizeof(mbedtls_x509write_csr) );
  48684. }
  48685. void mbedtls_x509write_csr_free( mbedtls_x509write_csr *ctx )
  48686. {
  48687. mbedtls_asn1_free_named_data_list( &ctx->subject );
  48688. mbedtls_asn1_free_named_data_list( &ctx->extensions );
  48689. x509_write_csr_zeroize( ctx, sizeof(mbedtls_x509write_csr) );
  48690. }
  48691. void mbedtls_x509write_csr_set_md_alg( mbedtls_x509write_csr *ctx, mbedtls_md_type_t md_alg )
  48692. {
  48693. ctx->md_alg = md_alg;
  48694. }
  48695. void mbedtls_x509write_csr_set_key( mbedtls_x509write_csr *ctx, mbedtls_pk_context *key )
  48696. {
  48697. ctx->key = key;
  48698. }
  48699. int mbedtls_x509write_csr_set_subject_name( mbedtls_x509write_csr *ctx,
  48700. const char *subject_name )
  48701. {
  48702. return mbedtls_x509_string_to_names( &ctx->subject, subject_name );
  48703. }
  48704. int mbedtls_x509write_csr_set_extension( mbedtls_x509write_csr *ctx,
  48705. const char *oid, size_t oid_len,
  48706. const unsigned char *val, size_t val_len )
  48707. {
  48708. return mbedtls_x509_set_extension( &ctx->extensions, oid, oid_len,
  48709. 0, val, val_len );
  48710. }
  48711. int mbedtls_x509write_csr_set_key_usage( mbedtls_x509write_csr *ctx, unsigned char key_usage )
  48712. {
  48713. unsigned char buf[4];
  48714. unsigned char *c;
  48715. int ret;
  48716. c = buf + 4;
  48717. if( ( ret = mbedtls_asn1_write_bitstring( &c, buf, &key_usage, 7 ) ) != 4 )
  48718. return( ret );
  48719. ret = mbedtls_x509write_csr_set_extension( ctx, MBEDTLS_OID_KEY_USAGE,
  48720. MBEDTLS_OID_SIZE( MBEDTLS_OID_KEY_USAGE ),
  48721. buf, 4 );
  48722. if( ret != 0 )
  48723. return( ret );
  48724. return( 0 );
  48725. }
  48726. int mbedtls_x509write_csr_set_ns_cert_type( mbedtls_x509write_csr *ctx,
  48727. unsigned char ns_cert_type )
  48728. {
  48729. unsigned char buf[4];
  48730. unsigned char *c;
  48731. int ret;
  48732. c = buf + 4;
  48733. if( ( ret = mbedtls_asn1_write_bitstring( &c, buf, &ns_cert_type, 8 ) ) != 4 )
  48734. return( ret );
  48735. ret = mbedtls_x509write_csr_set_extension( ctx, MBEDTLS_OID_NS_CERT_TYPE,
  48736. MBEDTLS_OID_SIZE( MBEDTLS_OID_NS_CERT_TYPE ),
  48737. buf, 4 );
  48738. if( ret != 0 )
  48739. return( ret );
  48740. return( 0 );
  48741. }
  48742. int mbedtls_x509write_csr_der( mbedtls_x509write_csr *ctx, unsigned char *buf, size_t size,
  48743. int (*f_rng)(void *, unsigned char *, size_t),
  48744. void *p_rng )
  48745. {
  48746. int ret;
  48747. const char *sig_oid;
  48748. size_t sig_oid_len = 0;
  48749. unsigned char *c, *c2;
  48750. unsigned char hash[64];
  48751. unsigned char sig[MBEDTLS_MPI_MAX_SIZE];
  48752. unsigned char tmp_buf[2048];
  48753. size_t pub_len = 0, sig_and_oid_len = 0, sig_len;
  48754. size_t len = 0;
  48755. mbedtls_pk_type_t pk_alg;
  48756. /*
  48757. * Prepare data to be signed in tmp_buf
  48758. */
  48759. c = tmp_buf + sizeof( tmp_buf );
  48760. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_x509_write_extensions( &c, tmp_buf, ctx->extensions ) );
  48761. if( len )
  48762. {
  48763. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, tmp_buf, len ) );
  48764. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, tmp_buf, MBEDTLS_ASN1_CONSTRUCTED |
  48765. MBEDTLS_ASN1_SEQUENCE ) );
  48766. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, tmp_buf, len ) );
  48767. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, tmp_buf, MBEDTLS_ASN1_CONSTRUCTED |
  48768. MBEDTLS_ASN1_SET ) );
  48769. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_oid( &c, tmp_buf, MBEDTLS_OID_PKCS9_CSR_EXT_REQ,
  48770. MBEDTLS_OID_SIZE( MBEDTLS_OID_PKCS9_CSR_EXT_REQ ) ) );
  48771. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, tmp_buf, len ) );
  48772. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, tmp_buf, MBEDTLS_ASN1_CONSTRUCTED |
  48773. MBEDTLS_ASN1_SEQUENCE ) );
  48774. }
  48775. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, tmp_buf, len ) );
  48776. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, tmp_buf, MBEDTLS_ASN1_CONSTRUCTED |
  48777. MBEDTLS_ASN1_CONTEXT_SPECIFIC ) );
  48778. MBEDTLS_ASN1_CHK_ADD( pub_len, mbedtls_pk_write_pubkey_der( ctx->key,
  48779. tmp_buf, c - tmp_buf ) );
  48780. c -= pub_len;
  48781. len += pub_len;
  48782. /*
  48783. * Subject ::= Name
  48784. */
  48785. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_x509_write_names( &c, tmp_buf, ctx->subject ) );
  48786. /*
  48787. * Version ::= INTEGER { v1(0), v2(1), v3(2) }
  48788. */
  48789. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_int( &c, tmp_buf, 0 ) );
  48790. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, tmp_buf, len ) );
  48791. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, tmp_buf, MBEDTLS_ASN1_CONSTRUCTED |
  48792. MBEDTLS_ASN1_SEQUENCE ) );
  48793. /*
  48794. * Prepare signature
  48795. */
  48796. mbedtls_md( mbedtls_md_info_from_type( ctx->md_alg ), c, len, hash );
  48797. pk_alg = mbedtls_pk_get_type( ctx->key );
  48798. if( pk_alg == MBEDTLS_PK_ECKEY )
  48799. pk_alg = MBEDTLS_PK_ECDSA;
  48800. if( ( ret = mbedtls_pk_sign( ctx->key, ctx->md_alg, hash, 0, sig, &sig_len,
  48801. f_rng, p_rng ) ) != 0 ||
  48802. ( ret = mbedtls_oid_get_oid_by_sig_alg( pk_alg, ctx->md_alg,
  48803. &sig_oid, &sig_oid_len ) ) != 0 )
  48804. {
  48805. return( ret );
  48806. }
  48807. /*
  48808. * Write data to output buffer
  48809. */
  48810. c2 = buf + size;
  48811. MBEDTLS_ASN1_CHK_ADD( sig_and_oid_len, mbedtls_x509_write_sig( &c2, buf,
  48812. sig_oid, sig_oid_len, sig, sig_len ) );
  48813. c2 -= len;
  48814. memcpy( c2, c, len );
  48815. len += sig_and_oid_len;
  48816. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c2, buf, len ) );
  48817. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c2, buf, MBEDTLS_ASN1_CONSTRUCTED |
  48818. MBEDTLS_ASN1_SEQUENCE ) );
  48819. return( (int) len );
  48820. }
  48821. #define PEM_BEGIN_CSR "-----BEGIN CERTIFICATE REQUEST-----\n"
  48822. #define PEM_END_CSR "-----END CERTIFICATE REQUEST-----\n"
  48823. #if defined(MBEDTLS_PEM_WRITE_C)
  48824. int mbedtls_x509write_csr_pem( mbedtls_x509write_csr *ctx, unsigned char *buf, size_t size,
  48825. int (*f_rng)(void *, unsigned char *, size_t),
  48826. void *p_rng )
  48827. {
  48828. int ret;
  48829. unsigned char output_buf[4096];
  48830. size_t olen = 0;
  48831. if( ( ret = mbedtls_x509write_csr_der( ctx, output_buf, sizeof(output_buf),
  48832. f_rng, p_rng ) ) < 0 )
  48833. {
  48834. return( ret );
  48835. }
  48836. if( ( ret = mbedtls_pem_write_buffer( PEM_BEGIN_CSR, PEM_END_CSR,
  48837. output_buf + sizeof(output_buf) - ret,
  48838. ret, buf, size, &olen ) ) != 0 )
  48839. {
  48840. return( ret );
  48841. }
  48842. return( 0 );
  48843. }
  48844. #endif /* MBEDTLS_PEM_WRITE_C */
  48845. #endif /* MBEDTLS_X509_CSR_WRITE_C */
  48846. /********* Start of file library/xtea.c ************/
  48847. /*
  48848. * An 32-bit implementation of the XTEA algorithm
  48849. *
  48850. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  48851. * SPDX-License-Identifier: Apache-2.0
  48852. *
  48853. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  48854. * not use this file except in compliance with the License.
  48855. * You may obtain a copy of the License at
  48856. *
  48857. * http://www.apache.org/licenses/LICENSE-2.0
  48858. *
  48859. * Unless required by applicable law or agreed to in writing, software
  48860. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  48861. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  48862. * See the License for the specific language governing permissions and
  48863. * limitations under the License.
  48864. *
  48865. * This file is part of mbed TLS (https://tls.mbed.org)
  48866. */
  48867. #if !defined(MBEDTLS_CONFIG_FILE)
  48868. #else
  48869. #endif
  48870. #if defined(MBEDTLS_XTEA_C)
  48871. #include <string.h>
  48872. #if defined(MBEDTLS_SELF_TEST)
  48873. #if defined(MBEDTLS_PLATFORM_C)
  48874. #else
  48875. #include <stdio.h>
  48876. #define mbedtls_printf printf
  48877. #endif /* MBEDTLS_PLATFORM_C */
  48878. #endif /* MBEDTLS_SELF_TEST */
  48879. #if !defined(MBEDTLS_XTEA_ALT)
  48880. /* Implementation that should never be optimized out by the compiler */
  48881. static void xtea_zeroize( void *v, size_t n ) {
  48882. volatile unsigned char *p = v; while( n-- ) *p++ = 0;
  48883. }
  48884. /*
  48885. * 32-bit integer manipulation macros (big endian)
  48886. */
  48887. #ifndef GET_UINT32_BE
  48888. #define GET_UINT32_BE(n,b,i) \
  48889. { \
  48890. (n) = ( (uint32_t) (b)[(i) ] << 24 ) \
  48891. | ( (uint32_t) (b)[(i) + 1] << 16 ) \
  48892. | ( (uint32_t) (b)[(i) + 2] << 8 ) \
  48893. | ( (uint32_t) (b)[(i) + 3] ); \
  48894. }
  48895. #endif
  48896. #ifndef PUT_UINT32_BE
  48897. #define PUT_UINT32_BE(n,b,i) \
  48898. { \
  48899. (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
  48900. (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \
  48901. (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \
  48902. (b)[(i) + 3] = (unsigned char) ( (n) ); \
  48903. }
  48904. #endif
  48905. void mbedtls_xtea_init( mbedtls_xtea_context *ctx )
  48906. {
  48907. memset( ctx, 0, sizeof( mbedtls_xtea_context ) );
  48908. }
  48909. void mbedtls_xtea_free( mbedtls_xtea_context *ctx )
  48910. {
  48911. if( ctx == NULL )
  48912. return;
  48913. xtea_zeroize( ctx, sizeof( mbedtls_xtea_context ) );
  48914. }
  48915. /*
  48916. * XTEA key schedule
  48917. */
  48918. void mbedtls_xtea_setup( mbedtls_xtea_context *ctx, const unsigned char key[16] )
  48919. {
  48920. int i;
  48921. memset( ctx, 0, sizeof(mbedtls_xtea_context) );
  48922. for( i = 0; i < 4; i++ )
  48923. {
  48924. GET_UINT32_BE( ctx->k[i], key, i << 2 );
  48925. }
  48926. }
  48927. /*
  48928. * XTEA encrypt function
  48929. */
  48930. int mbedtls_xtea_crypt_ecb( mbedtls_xtea_context *ctx, int mode,
  48931. const unsigned char input[8], unsigned char output[8])
  48932. {
  48933. uint32_t *k, v0, v1, i;
  48934. k = ctx->k;
  48935. GET_UINT32_BE( v0, input, 0 );
  48936. GET_UINT32_BE( v1, input, 4 );
  48937. if( mode == MBEDTLS_XTEA_ENCRYPT )
  48938. {
  48939. uint32_t sum = 0, delta = 0x9E3779B9;
  48940. for( i = 0; i < 32; i++ )
  48941. {
  48942. v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]);
  48943. sum += delta;
  48944. v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum>>11) & 3]);
  48945. }
  48946. }
  48947. else /* MBEDTLS_XTEA_DECRYPT */
  48948. {
  48949. uint32_t delta = 0x9E3779B9, sum = delta * 32;
  48950. for( i = 0; i < 32; i++ )
  48951. {
  48952. v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum>>11) & 3]);
  48953. sum -= delta;
  48954. v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]);
  48955. }
  48956. }
  48957. PUT_UINT32_BE( v0, output, 0 );
  48958. PUT_UINT32_BE( v1, output, 4 );
  48959. return( 0 );
  48960. }
  48961. #if defined(MBEDTLS_CIPHER_MODE_CBC)
  48962. /*
  48963. * XTEA-CBC buffer encryption/decryption
  48964. */
  48965. int mbedtls_xtea_crypt_cbc( mbedtls_xtea_context *ctx, int mode, size_t length,
  48966. unsigned char iv[8], const unsigned char *input,
  48967. unsigned char *output)
  48968. {
  48969. int i;
  48970. unsigned char temp[8];
  48971. if( length % 8 )
  48972. return( MBEDTLS_ERR_XTEA_INVALID_INPUT_LENGTH );
  48973. if( mode == MBEDTLS_XTEA_DECRYPT )
  48974. {
  48975. while( length > 0 )
  48976. {
  48977. memcpy( temp, input, 8 );
  48978. mbedtls_xtea_crypt_ecb( ctx, mode, input, output );
  48979. for( i = 0; i < 8; i++ )
  48980. output[i] = (unsigned char)( output[i] ^ iv[i] );
  48981. memcpy( iv, temp, 8 );
  48982. input += 8;
  48983. output += 8;
  48984. length -= 8;
  48985. }
  48986. }
  48987. else
  48988. {
  48989. while( length > 0 )
  48990. {
  48991. for( i = 0; i < 8; i++ )
  48992. output[i] = (unsigned char)( input[i] ^ iv[i] );
  48993. mbedtls_xtea_crypt_ecb( ctx, mode, output, output );
  48994. memcpy( iv, output, 8 );
  48995. input += 8;
  48996. output += 8;
  48997. length -= 8;
  48998. }
  48999. }
  49000. return( 0 );
  49001. }
  49002. #endif /* MBEDTLS_CIPHER_MODE_CBC */
  49003. #endif /* !MBEDTLS_XTEA_ALT */
  49004. #if defined(MBEDTLS_SELF_TEST)
  49005. /*
  49006. * XTEA tests vectors (non-official)
  49007. */
  49008. static const unsigned char xtea_test_key[6][16] =
  49009. {
  49010. { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
  49011. 0x0c, 0x0d, 0x0e, 0x0f },
  49012. { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
  49013. 0x0c, 0x0d, 0x0e, 0x0f },
  49014. { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
  49015. 0x0c, 0x0d, 0x0e, 0x0f },
  49016. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  49017. 0x00, 0x00, 0x00, 0x00 },
  49018. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  49019. 0x00, 0x00, 0x00, 0x00 },
  49020. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  49021. 0x00, 0x00, 0x00, 0x00 }
  49022. };
  49023. static const unsigned char xtea_test_pt[6][8] =
  49024. {
  49025. { 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48 },
  49026. { 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41 },
  49027. { 0x5a, 0x5b, 0x6e, 0x27, 0x89, 0x48, 0xd7, 0x7f },
  49028. { 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48 },
  49029. { 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41 },
  49030. { 0x70, 0xe1, 0x22, 0x5d, 0x6e, 0x4e, 0x76, 0x55 }
  49031. };
  49032. static const unsigned char xtea_test_ct[6][8] =
  49033. {
  49034. { 0x49, 0x7d, 0xf3, 0xd0, 0x72, 0x61, 0x2c, 0xb5 },
  49035. { 0xe7, 0x8f, 0x2d, 0x13, 0x74, 0x43, 0x41, 0xd8 },
  49036. { 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41 },
  49037. { 0xa0, 0x39, 0x05, 0x89, 0xf8, 0xb8, 0xef, 0xa5 },
  49038. { 0xed, 0x23, 0x37, 0x5a, 0x82, 0x1a, 0x8c, 0x2d },
  49039. { 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41 }
  49040. };
  49041. /*
  49042. * Checkup routine
  49043. */
  49044. int mbedtls_xtea_self_test( int verbose )
  49045. {
  49046. int i, ret = 0;
  49047. unsigned char buf[8];
  49048. mbedtls_xtea_context ctx;
  49049. mbedtls_xtea_init( &ctx );
  49050. for( i = 0; i < 6; i++ )
  49051. {
  49052. if( verbose != 0 )
  49053. mbedtls_printf( " XTEA test #%d: ", i + 1 );
  49054. memcpy( buf, xtea_test_pt[i], 8 );
  49055. mbedtls_xtea_setup( &ctx, xtea_test_key[i] );
  49056. mbedtls_xtea_crypt_ecb( &ctx, MBEDTLS_XTEA_ENCRYPT, buf, buf );
  49057. if( memcmp( buf, xtea_test_ct[i], 8 ) != 0 )
  49058. {
  49059. if( verbose != 0 )
  49060. mbedtls_printf( "failed\n" );
  49061. ret = 1;
  49062. goto exit;
  49063. }
  49064. if( verbose != 0 )
  49065. mbedtls_printf( "passed\n" );
  49066. }
  49067. if( verbose != 0 )
  49068. mbedtls_printf( "\n" );
  49069. exit:
  49070. mbedtls_xtea_free( &ctx );
  49071. return( ret );
  49072. }
  49073. #endif /* MBEDTLS_SELF_TEST */
  49074. #endif /* MBEDTLS_XTEA_C */
  49075. #endif /* ME_COM_MBEDTLS */