aes_gcm_x86_asm.S 418 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234112351123611237112381123911240112411124211243112441124511246112471124811249112501125111252112531125411255112561125711258112591126011261112621126311264112651126611267112681126911270112711127211273112741127511276112771127811279112801128111282112831128411285112861128711288112891129011291112921129311294112951129611297112981129911300113011130211303113041130511306113071130811309113101131111312113131131411315113161131711318113191132011321113221132311324113251132611327113281132911330113311133211333113341133511336113371133811339113401134111342113431134411345113461134711348113491135011351113521135311354113551135611357113581135911360113611136211363113641136511366113671136811369113701137111372113731137411375113761137711378113791138011381113821138311384113851138611387113881138911390113911139211393113941139511396113971139811399114001140111402114031140411405114061140711408114091141011411114121141311414114151141611417114181141911420114211142211423114241142511426114271142811429114301143111432114331143411435114361143711438114391144011441114421144311444114451144611447114481144911450114511145211453114541145511456114571145811459114601146111462114631146411465114661146711468114691147011471114721147311474114751147611477114781147911480114811148211483114841148511486114871148811489114901149111492114931149411495114961149711498114991150011501115021150311504115051150611507115081150911510115111151211513115141151511516115171151811519115201152111522115231152411525115261152711528115291153011531115321153311534115351153611537115381153911540115411154211543115441154511546115471154811549115501155111552115531155411555115561155711558115591156011561115621156311564115651156611567115681156911570115711157211573115741157511576115771157811579115801158111582115831158411585115861158711588115891159011591115921159311594115951159611597115981159911600116011160211603116041160511606116071160811609116101161111612116131161411615116161161711618116191162011621116221162311624116251162611627116281162911630116311163211633116341163511636116371163811639116401164111642116431164411645116461164711648116491165011651116521165311654116551165611657116581165911660116611166211663116641166511666116671166811669116701167111672116731167411675116761167711678116791168011681116821168311684116851168611687116881168911690116911169211693116941169511696116971169811699117001170111702117031170411705117061170711708117091171011711117121171311714117151171611717117181171911720117211172211723117241172511726117271172811729117301173111732117331173411735117361173711738117391174011741117421174311744117451174611747117481174911750117511175211753117541175511756117571175811759117601176111762117631176411765117661176711768117691177011771117721177311774117751177611777117781177911780117811178211783117841178511786117871178811789117901179111792117931179411795117961179711798117991180011801118021180311804118051180611807118081180911810118111181211813118141181511816118171181811819118201182111822118231182411825118261182711828118291183011831118321183311834118351183611837118381183911840118411184211843118441184511846118471184811849118501185111852118531185411855118561185711858118591186011861118621186311864118651186611867118681186911870118711187211873118741187511876118771187811879118801188111882118831188411885118861188711888118891189011891118921189311894118951189611897118981189911900119011190211903119041190511906119071190811909119101191111912119131191411915119161191711918119191192011921119221192311924119251192611927119281192911930119311193211933119341193511936119371193811939119401194111942119431194411945119461194711948119491195011951119521195311954119551195611957119581195911960119611196211963119641196511966119671196811969119701197111972119731197411975119761197711978119791198011981119821198311984119851198611987119881198911990119911199211993119941199511996119971199811999120001200112002120031200412005120061200712008120091201012011120121201312014120151201612017120181201912020120211202212023120241202512026120271202812029120301203112032120331203412035120361203712038120391204012041120421204312044120451204612047120481204912050120511205212053120541205512056120571205812059120601206112062120631206412065120661206712068120691207012071120721207312074120751207612077120781207912080120811208212083120841208512086120871208812089120901209112092120931209412095120961209712098120991210012101121021210312104121051210612107121081210912110121111211212113121141211512116121171211812119121201212112122121231212412125121261212712128121291213012131121321213312134121351213612137121381213912140121411214212143121441214512146121471214812149121501215112152121531215412155121561215712158121591216012161121621216312164121651216612167121681216912170121711217212173121741217512176121771217812179121801218112182121831218412185121861218712188121891219012191121921219312194121951219612197121981219912200122011220212203122041220512206122071220812209122101221112212122131221412215122161221712218122191222012221122221222312224122251222612227122281222912230122311223212233122341223512236122371223812239122401224112242122431224412245122461224712248122491225012251122521225312254122551225612257122581225912260122611226212263122641226512266122671226812269122701227112272122731227412275122761227712278122791228012281122821228312284122851228612287122881228912290122911229212293122941229512296122971229812299123001230112302123031230412305123061230712308123091231012311123121231312314123151231612317123181231912320123211232212323123241232512326123271232812329123301233112332123331233412335123361233712338123391234012341123421234312344123451234612347123481234912350123511235212353123541235512356123571235812359123601236112362123631236412365123661236712368123691237012371123721237312374123751237612377123781237912380123811238212383123841238512386123871238812389123901239112392123931239412395123961239712398123991240012401124021240312404124051240612407124081240912410124111241212413124141241512416124171241812419124201242112422124231242412425124261242712428124291243012431124321243312434124351243612437124381243912440124411244212443124441244512446124471244812449124501245112452124531245412455124561245712458124591246012461124621246312464124651246612467124681246912470124711247212473124741247512476124771247812479124801248112482124831248412485124861248712488124891249012491124921249312494124951249612497124981249912500125011250212503125041250512506125071250812509125101251112512125131251412515125161251712518125191252012521125221252312524125251252612527125281252912530125311253212533125341253512536125371253812539125401254112542125431254412545125461254712548125491255012551125521255312554125551255612557125581255912560125611256212563125641256512566125671256812569125701257112572125731257412575125761257712578125791258012581125821258312584125851258612587125881258912590125911259212593125941259512596125971259812599126001260112602126031260412605126061260712608126091261012611126121261312614126151261612617126181261912620126211262212623126241262512626126271262812629126301263112632126331263412635126361263712638126391264012641126421264312644126451264612647126481264912650126511265212653126541265512656126571265812659126601266112662126631266412665126661266712668126691267012671126721267312674126751267612677126781267912680126811268212683126841268512686126871268812689126901269112692126931269412695126961269712698126991270012701127021270312704127051270612707127081270912710127111271212713127141271512716127171271812719127201272112722127231272412725127261272712728127291273012731127321273312734127351273612737127381273912740127411274212743127441274512746127471274812749127501275112752127531275412755127561275712758127591276012761127621276312764127651276612767127681276912770127711277212773127741277512776127771277812779127801278112782127831278412785127861278712788127891279012791127921279312794127951279612797127981279912800128011280212803128041280512806128071280812809128101281112812128131281412815128161281712818128191282012821128221282312824128251282612827128281282912830128311283212833128341283512836128371283812839128401284112842128431284412845128461284712848128491285012851128521285312854128551285612857128581285912860128611286212863128641286512866128671286812869128701287112872128731287412875128761287712878128791288012881128821288312884128851288612887128881288912890128911289212893128941289512896128971289812899129001290112902129031290412905129061290712908129091291012911129121291312914129151291612917129181291912920129211292212923129241292512926129271292812929129301293112932129331293412935129361293712938129391294012941129421294312944129451294612947129481294912950129511295212953129541295512956129571295812959129601296112962
  1. /* aes_gcm_x86_asm
  2. *
  3. * Copyright (C) 2006-2022 wolfSSL Inc.
  4. *
  5. * This file is part of wolfSSL.
  6. *
  7. * wolfSSL is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License, or
  10. * (at your option) any later version.
  11. *
  12. * wolfSSL is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
  20. */
  21. #ifdef WOLFSSL_USER_SETTINGS
  22. #include "wolfssl/wolfcrypt/settings.h"
  23. #endif
  24. #ifndef HAVE_INTEL_AVX1
  25. #define HAVE_INTEL_AVX1
  26. #endif /* HAVE_INTEL_AVX1 */
  27. #ifndef NO_AVX2_SUPPORT
  28. #define HAVE_INTEL_AVX2
  29. #endif /* NO_AVX2_SUPPORT */
  30. .type data, @object
  31. L_aes_gcm_one:
  32. .long 0x0,0x0,0x1,0x0
  33. .type data, @object
  34. L_aes_gcm_two:
  35. .long 0x0,0x0,0x2,0x0
  36. .type data, @object
  37. L_aes_gcm_three:
  38. .long 0x0,0x0,0x3,0x0
  39. .type data, @object
  40. L_aes_gcm_four:
  41. .long 0x0,0x0,0x4,0x0
  42. .type data, @object
  43. L_aes_gcm_bswap_epi64:
  44. .long 0x4050607,0x10203,0xc0d0e0f,0x8090a0b
  45. .type data, @object
  46. L_aes_gcm_bswap_mask:
  47. .long 0xc0d0e0f,0x8090a0b,0x4050607,0x10203
  48. .type data, @object
  49. L_aes_gcm_mod2_128:
  50. .long 0x1,0x0,0x0,0xc2000000
  51. .type data, @object
  52. L_aes_gcm_avx1_one:
  53. .long 0x0,0x0,0x1,0x0
  54. .type data, @object
  55. L_aes_gcm_avx1_two:
  56. .long 0x0,0x0,0x2,0x0
  57. .type data, @object
  58. L_aes_gcm_avx1_three:
  59. .long 0x0,0x0,0x3,0x0
  60. .type data, @object
  61. L_aes_gcm_avx1_four:
  62. .long 0x0,0x0,0x4,0x0
  63. .type data, @object
  64. L_aes_gcm_avx1_bswap_epi64:
  65. .long 0x4050607,0x10203,0xc0d0e0f,0x8090a0b
  66. .type data, @object
  67. L_aes_gcm_avx1_bswap_mask:
  68. .long 0xc0d0e0f,0x8090a0b,0x4050607,0x10203
  69. .type data, @object
  70. L_aes_gcm_avx1_mod2_128:
  71. .long 0x1,0x0,0x0,0xc2000000
  72. .type data, @object
  73. L_aes_gcm_avx2_one:
  74. .long 0x0,0x0,0x1,0x0
  75. .type data, @object
  76. L_aes_gcm_avx2_two:
  77. .long 0x0,0x0,0x2,0x0
  78. .type data, @object
  79. L_aes_gcm_avx2_three:
  80. .long 0x0,0x0,0x3,0x0
  81. .type data, @object
  82. L_aes_gcm_avx2_four:
  83. .long 0x0,0x0,0x4,0x0
  84. .type data, @object
  85. L_avx2_aes_gcm_bswap_one:
  86. .long 0x0,0x0,0x0,0x1000000
  87. .type data, @object
  88. L_aes_gcm_avx2_bswap_epi64:
  89. .long 0x4050607,0x10203,0xc0d0e0f,0x8090a0b
  90. .type data, @object
  91. L_aes_gcm_avx2_bswap_mask:
  92. .long 0xc0d0e0f,0x8090a0b,0x4050607,0x10203
  93. .type data, @object
  94. L_aes_gcm_avx2_mod2_128:
  95. .long 0x1,0x0,0x0,0xc2000000
  96. .text
  97. .globl AES_GCM_encrypt
  98. .type AES_GCM_encrypt,@function
  99. .align 16
  100. AES_GCM_encrypt:
  101. pushl %ebx
  102. pushl %esi
  103. pushl %edi
  104. pushl %ebp
  105. subl $0x70, %esp
  106. movl 144(%esp), %esi
  107. movl 168(%esp), %ebp
  108. movl 160(%esp), %edx
  109. pxor %xmm0, %xmm0
  110. pxor %xmm2, %xmm2
  111. cmpl $12, %edx
  112. jne L_AES_GCM_encrypt_iv_not_12
  113. # # Calculate values when IV is 12 bytes
  114. # Set counter based on IV
  115. movl $0x1000000, %ecx
  116. pinsrd $0x00, (%esi), %xmm0
  117. pinsrd $0x01, 4(%esi), %xmm0
  118. pinsrd $2, 8(%esi), %xmm0
  119. pinsrd $3, %ecx, %xmm0
  120. # H = Encrypt X(=0) and T = Encrypt counter
  121. movdqa %xmm0, %xmm5
  122. movdqa (%ebp), %xmm1
  123. pxor %xmm1, %xmm5
  124. movdqa 16(%ebp), %xmm3
  125. aesenc %xmm3, %xmm1
  126. aesenc %xmm3, %xmm5
  127. movdqa 32(%ebp), %xmm3
  128. aesenc %xmm3, %xmm1
  129. aesenc %xmm3, %xmm5
  130. movdqa 48(%ebp), %xmm3
  131. aesenc %xmm3, %xmm1
  132. aesenc %xmm3, %xmm5
  133. movdqa 64(%ebp), %xmm3
  134. aesenc %xmm3, %xmm1
  135. aesenc %xmm3, %xmm5
  136. movdqa 80(%ebp), %xmm3
  137. aesenc %xmm3, %xmm1
  138. aesenc %xmm3, %xmm5
  139. movdqa 96(%ebp), %xmm3
  140. aesenc %xmm3, %xmm1
  141. aesenc %xmm3, %xmm5
  142. movdqa 112(%ebp), %xmm3
  143. aesenc %xmm3, %xmm1
  144. aesenc %xmm3, %xmm5
  145. movdqa 128(%ebp), %xmm3
  146. aesenc %xmm3, %xmm1
  147. aesenc %xmm3, %xmm5
  148. movdqa 144(%ebp), %xmm3
  149. aesenc %xmm3, %xmm1
  150. aesenc %xmm3, %xmm5
  151. cmpl $11, 172(%esp)
  152. movdqa 160(%ebp), %xmm3
  153. jl L_AES_GCM_encrypt_calc_iv_12_last
  154. aesenc %xmm3, %xmm1
  155. aesenc %xmm3, %xmm5
  156. movdqa 176(%ebp), %xmm3
  157. aesenc %xmm3, %xmm1
  158. aesenc %xmm3, %xmm5
  159. cmpl $13, 172(%esp)
  160. movdqa 192(%ebp), %xmm3
  161. jl L_AES_GCM_encrypt_calc_iv_12_last
  162. aesenc %xmm3, %xmm1
  163. aesenc %xmm3, %xmm5
  164. movdqa 208(%ebp), %xmm3
  165. aesenc %xmm3, %xmm1
  166. aesenc %xmm3, %xmm5
  167. movdqa 224(%ebp), %xmm3
  168. L_AES_GCM_encrypt_calc_iv_12_last:
  169. aesenclast %xmm3, %xmm1
  170. aesenclast %xmm3, %xmm5
  171. pshufb L_aes_gcm_bswap_mask, %xmm1
  172. movdqu %xmm5, 80(%esp)
  173. jmp L_AES_GCM_encrypt_iv_done
  174. L_AES_GCM_encrypt_iv_not_12:
  175. # Calculate values when IV is not 12 bytes
  176. # H = Encrypt X(=0)
  177. movdqa (%ebp), %xmm1
  178. aesenc 16(%ebp), %xmm1
  179. aesenc 32(%ebp), %xmm1
  180. aesenc 48(%ebp), %xmm1
  181. aesenc 64(%ebp), %xmm1
  182. aesenc 80(%ebp), %xmm1
  183. aesenc 96(%ebp), %xmm1
  184. aesenc 112(%ebp), %xmm1
  185. aesenc 128(%ebp), %xmm1
  186. aesenc 144(%ebp), %xmm1
  187. cmpl $11, 172(%esp)
  188. movdqa 160(%ebp), %xmm5
  189. jl L_AES_GCM_encrypt_calc_iv_1_aesenc_avx_last
  190. aesenc %xmm5, %xmm1
  191. aesenc 176(%ebp), %xmm1
  192. cmpl $13, 172(%esp)
  193. movdqa 192(%ebp), %xmm5
  194. jl L_AES_GCM_encrypt_calc_iv_1_aesenc_avx_last
  195. aesenc %xmm5, %xmm1
  196. aesenc 208(%ebp), %xmm1
  197. movdqa 224(%ebp), %xmm5
  198. L_AES_GCM_encrypt_calc_iv_1_aesenc_avx_last:
  199. aesenclast %xmm5, %xmm1
  200. pshufb L_aes_gcm_bswap_mask, %xmm1
  201. # Calc counter
  202. # Initialization vector
  203. cmpl $0x00, %edx
  204. movl $0x00, %ecx
  205. je L_AES_GCM_encrypt_calc_iv_done
  206. cmpl $16, %edx
  207. jl L_AES_GCM_encrypt_calc_iv_lt16
  208. andl $0xfffffff0, %edx
  209. L_AES_GCM_encrypt_calc_iv_16_loop:
  210. movdqu (%esi,%ecx,1), %xmm4
  211. pshufb L_aes_gcm_bswap_mask, %xmm4
  212. pxor %xmm4, %xmm0
  213. pshufd $0x4e, %xmm0, %xmm5
  214. pshufd $0x4e, %xmm1, %xmm6
  215. movdqa %xmm1, %xmm7
  216. movdqa %xmm1, %xmm4
  217. pclmulqdq $0x11, %xmm0, %xmm7
  218. pclmulqdq $0x00, %xmm0, %xmm4
  219. pxor %xmm0, %xmm5
  220. pxor %xmm1, %xmm6
  221. pclmulqdq $0x00, %xmm6, %xmm5
  222. pxor %xmm4, %xmm5
  223. pxor %xmm7, %xmm5
  224. movdqa %xmm5, %xmm6
  225. movdqa %xmm4, %xmm3
  226. movdqa %xmm7, %xmm0
  227. pslldq $8, %xmm6
  228. psrldq $8, %xmm5
  229. pxor %xmm6, %xmm3
  230. pxor %xmm5, %xmm0
  231. movdqa %xmm3, %xmm4
  232. movdqa %xmm0, %xmm5
  233. psrld $31, %xmm4
  234. psrld $31, %xmm5
  235. pslld $0x01, %xmm3
  236. pslld $0x01, %xmm0
  237. movdqa %xmm4, %xmm6
  238. pslldq $4, %xmm4
  239. psrldq $12, %xmm6
  240. pslldq $4, %xmm5
  241. por %xmm6, %xmm0
  242. por %xmm4, %xmm3
  243. por %xmm5, %xmm0
  244. movdqa %xmm3, %xmm4
  245. movdqa %xmm3, %xmm5
  246. movdqa %xmm3, %xmm6
  247. pslld $31, %xmm4
  248. pslld $30, %xmm5
  249. pslld $25, %xmm6
  250. pxor %xmm5, %xmm4
  251. pxor %xmm6, %xmm4
  252. movdqa %xmm4, %xmm5
  253. psrldq $4, %xmm5
  254. pslldq $12, %xmm4
  255. pxor %xmm4, %xmm3
  256. movdqa %xmm3, %xmm6
  257. movdqa %xmm3, %xmm7
  258. movdqa %xmm3, %xmm4
  259. psrld $0x01, %xmm6
  260. psrld $2, %xmm7
  261. psrld $7, %xmm4
  262. pxor %xmm7, %xmm6
  263. pxor %xmm4, %xmm6
  264. pxor %xmm5, %xmm6
  265. pxor %xmm3, %xmm6
  266. pxor %xmm6, %xmm0
  267. addl $16, %ecx
  268. cmpl %edx, %ecx
  269. jl L_AES_GCM_encrypt_calc_iv_16_loop
  270. movl 160(%esp), %edx
  271. cmpl %edx, %ecx
  272. je L_AES_GCM_encrypt_calc_iv_done
  273. L_AES_GCM_encrypt_calc_iv_lt16:
  274. subl $16, %esp
  275. pxor %xmm4, %xmm4
  276. xorl %ebx, %ebx
  277. movdqu %xmm4, (%esp)
  278. L_AES_GCM_encrypt_calc_iv_loop:
  279. movzbl (%esi,%ecx,1), %eax
  280. movb %al, (%esp,%ebx,1)
  281. incl %ecx
  282. incl %ebx
  283. cmpl %edx, %ecx
  284. jl L_AES_GCM_encrypt_calc_iv_loop
  285. movdqu (%esp), %xmm4
  286. addl $16, %esp
  287. pshufb L_aes_gcm_bswap_mask, %xmm4
  288. pxor %xmm4, %xmm0
  289. pshufd $0x4e, %xmm0, %xmm5
  290. pshufd $0x4e, %xmm1, %xmm6
  291. movdqa %xmm1, %xmm7
  292. movdqa %xmm1, %xmm4
  293. pclmulqdq $0x11, %xmm0, %xmm7
  294. pclmulqdq $0x00, %xmm0, %xmm4
  295. pxor %xmm0, %xmm5
  296. pxor %xmm1, %xmm6
  297. pclmulqdq $0x00, %xmm6, %xmm5
  298. pxor %xmm4, %xmm5
  299. pxor %xmm7, %xmm5
  300. movdqa %xmm5, %xmm6
  301. movdqa %xmm4, %xmm3
  302. movdqa %xmm7, %xmm0
  303. pslldq $8, %xmm6
  304. psrldq $8, %xmm5
  305. pxor %xmm6, %xmm3
  306. pxor %xmm5, %xmm0
  307. movdqa %xmm3, %xmm4
  308. movdqa %xmm0, %xmm5
  309. psrld $31, %xmm4
  310. psrld $31, %xmm5
  311. pslld $0x01, %xmm3
  312. pslld $0x01, %xmm0
  313. movdqa %xmm4, %xmm6
  314. pslldq $4, %xmm4
  315. psrldq $12, %xmm6
  316. pslldq $4, %xmm5
  317. por %xmm6, %xmm0
  318. por %xmm4, %xmm3
  319. por %xmm5, %xmm0
  320. movdqa %xmm3, %xmm4
  321. movdqa %xmm3, %xmm5
  322. movdqa %xmm3, %xmm6
  323. pslld $31, %xmm4
  324. pslld $30, %xmm5
  325. pslld $25, %xmm6
  326. pxor %xmm5, %xmm4
  327. pxor %xmm6, %xmm4
  328. movdqa %xmm4, %xmm5
  329. psrldq $4, %xmm5
  330. pslldq $12, %xmm4
  331. pxor %xmm4, %xmm3
  332. movdqa %xmm3, %xmm6
  333. movdqa %xmm3, %xmm7
  334. movdqa %xmm3, %xmm4
  335. psrld $0x01, %xmm6
  336. psrld $2, %xmm7
  337. psrld $7, %xmm4
  338. pxor %xmm7, %xmm6
  339. pxor %xmm4, %xmm6
  340. pxor %xmm5, %xmm6
  341. pxor %xmm3, %xmm6
  342. pxor %xmm6, %xmm0
  343. L_AES_GCM_encrypt_calc_iv_done:
  344. # T = Encrypt counter
  345. pxor %xmm4, %xmm4
  346. shll $3, %edx
  347. pinsrd $0x00, %edx, %xmm4
  348. pxor %xmm4, %xmm0
  349. pshufd $0x4e, %xmm0, %xmm5
  350. pshufd $0x4e, %xmm1, %xmm6
  351. movdqa %xmm1, %xmm7
  352. movdqa %xmm1, %xmm4
  353. pclmulqdq $0x11, %xmm0, %xmm7
  354. pclmulqdq $0x00, %xmm0, %xmm4
  355. pxor %xmm0, %xmm5
  356. pxor %xmm1, %xmm6
  357. pclmulqdq $0x00, %xmm6, %xmm5
  358. pxor %xmm4, %xmm5
  359. pxor %xmm7, %xmm5
  360. movdqa %xmm5, %xmm6
  361. movdqa %xmm4, %xmm3
  362. movdqa %xmm7, %xmm0
  363. pslldq $8, %xmm6
  364. psrldq $8, %xmm5
  365. pxor %xmm6, %xmm3
  366. pxor %xmm5, %xmm0
  367. movdqa %xmm3, %xmm4
  368. movdqa %xmm0, %xmm5
  369. psrld $31, %xmm4
  370. psrld $31, %xmm5
  371. pslld $0x01, %xmm3
  372. pslld $0x01, %xmm0
  373. movdqa %xmm4, %xmm6
  374. pslldq $4, %xmm4
  375. psrldq $12, %xmm6
  376. pslldq $4, %xmm5
  377. por %xmm6, %xmm0
  378. por %xmm4, %xmm3
  379. por %xmm5, %xmm0
  380. movdqa %xmm3, %xmm4
  381. movdqa %xmm3, %xmm5
  382. movdqa %xmm3, %xmm6
  383. pslld $31, %xmm4
  384. pslld $30, %xmm5
  385. pslld $25, %xmm6
  386. pxor %xmm5, %xmm4
  387. pxor %xmm6, %xmm4
  388. movdqa %xmm4, %xmm5
  389. psrldq $4, %xmm5
  390. pslldq $12, %xmm4
  391. pxor %xmm4, %xmm3
  392. movdqa %xmm3, %xmm6
  393. movdqa %xmm3, %xmm7
  394. movdqa %xmm3, %xmm4
  395. psrld $0x01, %xmm6
  396. psrld $2, %xmm7
  397. psrld $7, %xmm4
  398. pxor %xmm7, %xmm6
  399. pxor %xmm4, %xmm6
  400. pxor %xmm5, %xmm6
  401. pxor %xmm3, %xmm6
  402. pxor %xmm6, %xmm0
  403. pshufb L_aes_gcm_bswap_mask, %xmm0
  404. # Encrypt counter
  405. movdqa (%ebp), %xmm4
  406. pxor %xmm0, %xmm4
  407. aesenc 16(%ebp), %xmm4
  408. aesenc 32(%ebp), %xmm4
  409. aesenc 48(%ebp), %xmm4
  410. aesenc 64(%ebp), %xmm4
  411. aesenc 80(%ebp), %xmm4
  412. aesenc 96(%ebp), %xmm4
  413. aesenc 112(%ebp), %xmm4
  414. aesenc 128(%ebp), %xmm4
  415. aesenc 144(%ebp), %xmm4
  416. cmpl $11, 172(%esp)
  417. movdqa 160(%ebp), %xmm5
  418. jl L_AES_GCM_encrypt_calc_iv_2_aesenc_avx_last
  419. aesenc %xmm5, %xmm4
  420. aesenc 176(%ebp), %xmm4
  421. cmpl $13, 172(%esp)
  422. movdqa 192(%ebp), %xmm5
  423. jl L_AES_GCM_encrypt_calc_iv_2_aesenc_avx_last
  424. aesenc %xmm5, %xmm4
  425. aesenc 208(%ebp), %xmm4
  426. movdqa 224(%ebp), %xmm5
  427. L_AES_GCM_encrypt_calc_iv_2_aesenc_avx_last:
  428. aesenclast %xmm5, %xmm4
  429. movdqu %xmm4, 80(%esp)
  430. L_AES_GCM_encrypt_iv_done:
  431. movl 140(%esp), %esi
  432. # Additional authentication data
  433. movl 156(%esp), %edx
  434. cmpl $0x00, %edx
  435. je L_AES_GCM_encrypt_calc_aad_done
  436. xorl %ecx, %ecx
  437. cmpl $16, %edx
  438. jl L_AES_GCM_encrypt_calc_aad_lt16
  439. andl $0xfffffff0, %edx
  440. L_AES_GCM_encrypt_calc_aad_16_loop:
  441. movdqu (%esi,%ecx,1), %xmm4
  442. pshufb L_aes_gcm_bswap_mask, %xmm4
  443. pxor %xmm4, %xmm2
  444. pshufd $0x4e, %xmm2, %xmm5
  445. pshufd $0x4e, %xmm1, %xmm6
  446. movdqa %xmm1, %xmm7
  447. movdqa %xmm1, %xmm4
  448. pclmulqdq $0x11, %xmm2, %xmm7
  449. pclmulqdq $0x00, %xmm2, %xmm4
  450. pxor %xmm2, %xmm5
  451. pxor %xmm1, %xmm6
  452. pclmulqdq $0x00, %xmm6, %xmm5
  453. pxor %xmm4, %xmm5
  454. pxor %xmm7, %xmm5
  455. movdqa %xmm5, %xmm6
  456. movdqa %xmm4, %xmm3
  457. movdqa %xmm7, %xmm2
  458. pslldq $8, %xmm6
  459. psrldq $8, %xmm5
  460. pxor %xmm6, %xmm3
  461. pxor %xmm5, %xmm2
  462. movdqa %xmm3, %xmm4
  463. movdqa %xmm2, %xmm5
  464. psrld $31, %xmm4
  465. psrld $31, %xmm5
  466. pslld $0x01, %xmm3
  467. pslld $0x01, %xmm2
  468. movdqa %xmm4, %xmm6
  469. pslldq $4, %xmm4
  470. psrldq $12, %xmm6
  471. pslldq $4, %xmm5
  472. por %xmm6, %xmm2
  473. por %xmm4, %xmm3
  474. por %xmm5, %xmm2
  475. movdqa %xmm3, %xmm4
  476. movdqa %xmm3, %xmm5
  477. movdqa %xmm3, %xmm6
  478. pslld $31, %xmm4
  479. pslld $30, %xmm5
  480. pslld $25, %xmm6
  481. pxor %xmm5, %xmm4
  482. pxor %xmm6, %xmm4
  483. movdqa %xmm4, %xmm5
  484. psrldq $4, %xmm5
  485. pslldq $12, %xmm4
  486. pxor %xmm4, %xmm3
  487. movdqa %xmm3, %xmm6
  488. movdqa %xmm3, %xmm7
  489. movdqa %xmm3, %xmm4
  490. psrld $0x01, %xmm6
  491. psrld $2, %xmm7
  492. psrld $7, %xmm4
  493. pxor %xmm7, %xmm6
  494. pxor %xmm4, %xmm6
  495. pxor %xmm5, %xmm6
  496. pxor %xmm3, %xmm6
  497. pxor %xmm6, %xmm2
  498. addl $16, %ecx
  499. cmpl %edx, %ecx
  500. jl L_AES_GCM_encrypt_calc_aad_16_loop
  501. movl 156(%esp), %edx
  502. cmpl %edx, %ecx
  503. je L_AES_GCM_encrypt_calc_aad_done
  504. L_AES_GCM_encrypt_calc_aad_lt16:
  505. subl $16, %esp
  506. pxor %xmm4, %xmm4
  507. xorl %ebx, %ebx
  508. movdqu %xmm4, (%esp)
  509. L_AES_GCM_encrypt_calc_aad_loop:
  510. movzbl (%esi,%ecx,1), %eax
  511. movb %al, (%esp,%ebx,1)
  512. incl %ecx
  513. incl %ebx
  514. cmpl %edx, %ecx
  515. jl L_AES_GCM_encrypt_calc_aad_loop
  516. movdqu (%esp), %xmm4
  517. addl $16, %esp
  518. pshufb L_aes_gcm_bswap_mask, %xmm4
  519. pxor %xmm4, %xmm2
  520. pshufd $0x4e, %xmm2, %xmm5
  521. pshufd $0x4e, %xmm1, %xmm6
  522. movdqa %xmm1, %xmm7
  523. movdqa %xmm1, %xmm4
  524. pclmulqdq $0x11, %xmm2, %xmm7
  525. pclmulqdq $0x00, %xmm2, %xmm4
  526. pxor %xmm2, %xmm5
  527. pxor %xmm1, %xmm6
  528. pclmulqdq $0x00, %xmm6, %xmm5
  529. pxor %xmm4, %xmm5
  530. pxor %xmm7, %xmm5
  531. movdqa %xmm5, %xmm6
  532. movdqa %xmm4, %xmm3
  533. movdqa %xmm7, %xmm2
  534. pslldq $8, %xmm6
  535. psrldq $8, %xmm5
  536. pxor %xmm6, %xmm3
  537. pxor %xmm5, %xmm2
  538. movdqa %xmm3, %xmm4
  539. movdqa %xmm2, %xmm5
  540. psrld $31, %xmm4
  541. psrld $31, %xmm5
  542. pslld $0x01, %xmm3
  543. pslld $0x01, %xmm2
  544. movdqa %xmm4, %xmm6
  545. pslldq $4, %xmm4
  546. psrldq $12, %xmm6
  547. pslldq $4, %xmm5
  548. por %xmm6, %xmm2
  549. por %xmm4, %xmm3
  550. por %xmm5, %xmm2
  551. movdqa %xmm3, %xmm4
  552. movdqa %xmm3, %xmm5
  553. movdqa %xmm3, %xmm6
  554. pslld $31, %xmm4
  555. pslld $30, %xmm5
  556. pslld $25, %xmm6
  557. pxor %xmm5, %xmm4
  558. pxor %xmm6, %xmm4
  559. movdqa %xmm4, %xmm5
  560. psrldq $4, %xmm5
  561. pslldq $12, %xmm4
  562. pxor %xmm4, %xmm3
  563. movdqa %xmm3, %xmm6
  564. movdqa %xmm3, %xmm7
  565. movdqa %xmm3, %xmm4
  566. psrld $0x01, %xmm6
  567. psrld $2, %xmm7
  568. psrld $7, %xmm4
  569. pxor %xmm7, %xmm6
  570. pxor %xmm4, %xmm6
  571. pxor %xmm5, %xmm6
  572. pxor %xmm3, %xmm6
  573. pxor %xmm6, %xmm2
  574. L_AES_GCM_encrypt_calc_aad_done:
  575. movdqu %xmm2, 96(%esp)
  576. movl 132(%esp), %esi
  577. movl 136(%esp), %edi
  578. # Calculate counter and H
  579. pshufb L_aes_gcm_bswap_epi64, %xmm0
  580. movdqa %xmm1, %xmm5
  581. paddd L_aes_gcm_one, %xmm0
  582. movdqa %xmm1, %xmm4
  583. movdqu %xmm0, 64(%esp)
  584. psrlq $63, %xmm5
  585. psllq $0x01, %xmm4
  586. pslldq $8, %xmm5
  587. por %xmm5, %xmm4
  588. pshufd $0xff, %xmm1, %xmm1
  589. psrad $31, %xmm1
  590. pand L_aes_gcm_mod2_128, %xmm1
  591. pxor %xmm4, %xmm1
  592. xorl %ebx, %ebx
  593. movl 152(%esp), %eax
  594. cmpl $0x40, %eax
  595. jl L_AES_GCM_encrypt_done_64
  596. andl $0xffffffc0, %eax
  597. movdqa %xmm2, %xmm6
  598. # H ^ 1
  599. movdqu %xmm1, (%esp)
  600. # H ^ 2
  601. pshufd $0x4e, %xmm1, %xmm5
  602. pshufd $0x4e, %xmm1, %xmm6
  603. movdqa %xmm1, %xmm7
  604. movdqa %xmm1, %xmm4
  605. pclmulqdq $0x11, %xmm1, %xmm7
  606. pclmulqdq $0x00, %xmm1, %xmm4
  607. pxor %xmm1, %xmm5
  608. pxor %xmm1, %xmm6
  609. pclmulqdq $0x00, %xmm6, %xmm5
  610. pxor %xmm4, %xmm5
  611. pxor %xmm7, %xmm5
  612. movdqa %xmm5, %xmm6
  613. movdqa %xmm7, %xmm0
  614. pslldq $8, %xmm6
  615. psrldq $8, %xmm5
  616. pxor %xmm6, %xmm4
  617. pxor %xmm5, %xmm0
  618. movdqa %xmm4, %xmm5
  619. movdqa %xmm4, %xmm6
  620. movdqa %xmm4, %xmm7
  621. pslld $31, %xmm5
  622. pslld $30, %xmm6
  623. pslld $25, %xmm7
  624. pxor %xmm6, %xmm5
  625. pxor %xmm7, %xmm5
  626. movdqa %xmm5, %xmm7
  627. psrldq $4, %xmm7
  628. pslldq $12, %xmm5
  629. pxor %xmm5, %xmm4
  630. movdqa %xmm4, %xmm5
  631. movdqa %xmm4, %xmm6
  632. psrld $0x01, %xmm5
  633. psrld $2, %xmm6
  634. pxor %xmm6, %xmm5
  635. pxor %xmm4, %xmm5
  636. psrld $7, %xmm4
  637. pxor %xmm7, %xmm5
  638. pxor %xmm4, %xmm5
  639. pxor %xmm5, %xmm0
  640. movdqu %xmm0, 16(%esp)
  641. # H ^ 3
  642. pshufd $0x4e, %xmm1, %xmm5
  643. pshufd $0x4e, %xmm0, %xmm6
  644. movdqa %xmm0, %xmm7
  645. movdqa %xmm0, %xmm4
  646. pclmulqdq $0x11, %xmm1, %xmm7
  647. pclmulqdq $0x00, %xmm1, %xmm4
  648. pxor %xmm1, %xmm5
  649. pxor %xmm0, %xmm6
  650. pclmulqdq $0x00, %xmm6, %xmm5
  651. pxor %xmm4, %xmm5
  652. pxor %xmm7, %xmm5
  653. movdqa %xmm5, %xmm6
  654. movdqa %xmm7, %xmm3
  655. pslldq $8, %xmm6
  656. psrldq $8, %xmm5
  657. pxor %xmm6, %xmm4
  658. pxor %xmm5, %xmm3
  659. movdqa %xmm4, %xmm5
  660. movdqa %xmm4, %xmm6
  661. movdqa %xmm4, %xmm7
  662. pslld $31, %xmm5
  663. pslld $30, %xmm6
  664. pslld $25, %xmm7
  665. pxor %xmm6, %xmm5
  666. pxor %xmm7, %xmm5
  667. movdqa %xmm5, %xmm7
  668. psrldq $4, %xmm7
  669. pslldq $12, %xmm5
  670. pxor %xmm5, %xmm4
  671. movdqa %xmm4, %xmm5
  672. movdqa %xmm4, %xmm6
  673. psrld $0x01, %xmm5
  674. psrld $2, %xmm6
  675. pxor %xmm6, %xmm5
  676. pxor %xmm4, %xmm5
  677. psrld $7, %xmm4
  678. pxor %xmm7, %xmm5
  679. pxor %xmm4, %xmm5
  680. pxor %xmm5, %xmm3
  681. movdqu %xmm3, 32(%esp)
  682. # H ^ 4
  683. pshufd $0x4e, %xmm0, %xmm5
  684. pshufd $0x4e, %xmm0, %xmm6
  685. movdqa %xmm0, %xmm7
  686. movdqa %xmm0, %xmm4
  687. pclmulqdq $0x11, %xmm0, %xmm7
  688. pclmulqdq $0x00, %xmm0, %xmm4
  689. pxor %xmm0, %xmm5
  690. pxor %xmm0, %xmm6
  691. pclmulqdq $0x00, %xmm6, %xmm5
  692. pxor %xmm4, %xmm5
  693. pxor %xmm7, %xmm5
  694. movdqa %xmm5, %xmm6
  695. movdqa %xmm7, %xmm3
  696. pslldq $8, %xmm6
  697. psrldq $8, %xmm5
  698. pxor %xmm6, %xmm4
  699. pxor %xmm5, %xmm3
  700. movdqa %xmm4, %xmm5
  701. movdqa %xmm4, %xmm6
  702. movdqa %xmm4, %xmm7
  703. pslld $31, %xmm5
  704. pslld $30, %xmm6
  705. pslld $25, %xmm7
  706. pxor %xmm6, %xmm5
  707. pxor %xmm7, %xmm5
  708. movdqa %xmm5, %xmm7
  709. psrldq $4, %xmm7
  710. pslldq $12, %xmm5
  711. pxor %xmm5, %xmm4
  712. movdqa %xmm4, %xmm5
  713. movdqa %xmm4, %xmm6
  714. psrld $0x01, %xmm5
  715. psrld $2, %xmm6
  716. pxor %xmm6, %xmm5
  717. pxor %xmm4, %xmm5
  718. psrld $7, %xmm4
  719. pxor %xmm7, %xmm5
  720. pxor %xmm4, %xmm5
  721. pxor %xmm5, %xmm3
  722. movdqu %xmm3, 48(%esp)
  723. # First 64 bytes of input
  724. # Encrypt 64 bytes of counter
  725. movdqu 64(%esp), %xmm4
  726. movdqa L_aes_gcm_bswap_epi64, %xmm3
  727. movdqa %xmm4, %xmm5
  728. movdqa %xmm4, %xmm6
  729. movdqa %xmm4, %xmm7
  730. pshufb %xmm3, %xmm4
  731. paddd L_aes_gcm_one, %xmm5
  732. pshufb %xmm3, %xmm5
  733. paddd L_aes_gcm_two, %xmm6
  734. pshufb %xmm3, %xmm6
  735. paddd L_aes_gcm_three, %xmm7
  736. pshufb %xmm3, %xmm7
  737. movdqu 64(%esp), %xmm3
  738. paddd L_aes_gcm_four, %xmm3
  739. movdqu %xmm3, 64(%esp)
  740. movdqa (%ebp), %xmm3
  741. pxor %xmm3, %xmm4
  742. pxor %xmm3, %xmm5
  743. pxor %xmm3, %xmm6
  744. pxor %xmm3, %xmm7
  745. movdqa 16(%ebp), %xmm3
  746. aesenc %xmm3, %xmm4
  747. aesenc %xmm3, %xmm5
  748. aesenc %xmm3, %xmm6
  749. aesenc %xmm3, %xmm7
  750. movdqa 32(%ebp), %xmm3
  751. aesenc %xmm3, %xmm4
  752. aesenc %xmm3, %xmm5
  753. aesenc %xmm3, %xmm6
  754. aesenc %xmm3, %xmm7
  755. movdqa 48(%ebp), %xmm3
  756. aesenc %xmm3, %xmm4
  757. aesenc %xmm3, %xmm5
  758. aesenc %xmm3, %xmm6
  759. aesenc %xmm3, %xmm7
  760. movdqa 64(%ebp), %xmm3
  761. aesenc %xmm3, %xmm4
  762. aesenc %xmm3, %xmm5
  763. aesenc %xmm3, %xmm6
  764. aesenc %xmm3, %xmm7
  765. movdqa 80(%ebp), %xmm3
  766. aesenc %xmm3, %xmm4
  767. aesenc %xmm3, %xmm5
  768. aesenc %xmm3, %xmm6
  769. aesenc %xmm3, %xmm7
  770. movdqa 96(%ebp), %xmm3
  771. aesenc %xmm3, %xmm4
  772. aesenc %xmm3, %xmm5
  773. aesenc %xmm3, %xmm6
  774. aesenc %xmm3, %xmm7
  775. movdqa 112(%ebp), %xmm3
  776. aesenc %xmm3, %xmm4
  777. aesenc %xmm3, %xmm5
  778. aesenc %xmm3, %xmm6
  779. aesenc %xmm3, %xmm7
  780. movdqa 128(%ebp), %xmm3
  781. aesenc %xmm3, %xmm4
  782. aesenc %xmm3, %xmm5
  783. aesenc %xmm3, %xmm6
  784. aesenc %xmm3, %xmm7
  785. movdqa 144(%ebp), %xmm3
  786. aesenc %xmm3, %xmm4
  787. aesenc %xmm3, %xmm5
  788. aesenc %xmm3, %xmm6
  789. aesenc %xmm3, %xmm7
  790. cmpl $11, 172(%esp)
  791. movdqa 160(%ebp), %xmm3
  792. jl L_AES_GCM_encrypt_enc_done
  793. aesenc %xmm3, %xmm4
  794. aesenc %xmm3, %xmm5
  795. aesenc %xmm3, %xmm6
  796. aesenc %xmm3, %xmm7
  797. movdqa 176(%ebp), %xmm3
  798. aesenc %xmm3, %xmm4
  799. aesenc %xmm3, %xmm5
  800. aesenc %xmm3, %xmm6
  801. aesenc %xmm3, %xmm7
  802. cmpl $13, 172(%esp)
  803. movdqa 192(%ebp), %xmm3
  804. jl L_AES_GCM_encrypt_enc_done
  805. aesenc %xmm3, %xmm4
  806. aesenc %xmm3, %xmm5
  807. aesenc %xmm3, %xmm6
  808. aesenc %xmm3, %xmm7
  809. movdqa 208(%ebp), %xmm3
  810. aesenc %xmm3, %xmm4
  811. aesenc %xmm3, %xmm5
  812. aesenc %xmm3, %xmm6
  813. aesenc %xmm3, %xmm7
  814. movdqa 224(%ebp), %xmm3
  815. L_AES_GCM_encrypt_enc_done:
  816. aesenclast %xmm3, %xmm4
  817. aesenclast %xmm3, %xmm5
  818. movdqu (%esi), %xmm0
  819. movdqu 16(%esi), %xmm1
  820. pxor %xmm0, %xmm4
  821. pxor %xmm1, %xmm5
  822. movdqu %xmm4, (%edi)
  823. movdqu %xmm5, 16(%edi)
  824. aesenclast %xmm3, %xmm6
  825. aesenclast %xmm3, %xmm7
  826. movdqu 32(%esi), %xmm0
  827. movdqu 48(%esi), %xmm1
  828. pxor %xmm0, %xmm6
  829. pxor %xmm1, %xmm7
  830. movdqu %xmm6, 32(%edi)
  831. movdqu %xmm7, 48(%edi)
  832. cmpl $0x40, %eax
  833. movl $0x40, %ebx
  834. movl %esi, %ecx
  835. movl %edi, %edx
  836. jle L_AES_GCM_encrypt_end_64
  837. # More 64 bytes of input
  838. L_AES_GCM_encrypt_ghash_64:
  839. leal (%esi,%ebx,1), %ecx
  840. leal (%edi,%ebx,1), %edx
  841. # Encrypt 64 bytes of counter
  842. movdqu 64(%esp), %xmm4
  843. movdqa L_aes_gcm_bswap_epi64, %xmm3
  844. movdqa %xmm4, %xmm5
  845. movdqa %xmm4, %xmm6
  846. movdqa %xmm4, %xmm7
  847. pshufb %xmm3, %xmm4
  848. paddd L_aes_gcm_one, %xmm5
  849. pshufb %xmm3, %xmm5
  850. paddd L_aes_gcm_two, %xmm6
  851. pshufb %xmm3, %xmm6
  852. paddd L_aes_gcm_three, %xmm7
  853. pshufb %xmm3, %xmm7
  854. movdqu 64(%esp), %xmm3
  855. paddd L_aes_gcm_four, %xmm3
  856. movdqu %xmm3, 64(%esp)
  857. movdqa (%ebp), %xmm3
  858. pxor %xmm3, %xmm4
  859. pxor %xmm3, %xmm5
  860. pxor %xmm3, %xmm6
  861. pxor %xmm3, %xmm7
  862. movdqa 16(%ebp), %xmm3
  863. aesenc %xmm3, %xmm4
  864. aesenc %xmm3, %xmm5
  865. aesenc %xmm3, %xmm6
  866. aesenc %xmm3, %xmm7
  867. movdqa 32(%ebp), %xmm3
  868. aesenc %xmm3, %xmm4
  869. aesenc %xmm3, %xmm5
  870. aesenc %xmm3, %xmm6
  871. aesenc %xmm3, %xmm7
  872. movdqa 48(%ebp), %xmm3
  873. aesenc %xmm3, %xmm4
  874. aesenc %xmm3, %xmm5
  875. aesenc %xmm3, %xmm6
  876. aesenc %xmm3, %xmm7
  877. movdqa 64(%ebp), %xmm3
  878. aesenc %xmm3, %xmm4
  879. aesenc %xmm3, %xmm5
  880. aesenc %xmm3, %xmm6
  881. aesenc %xmm3, %xmm7
  882. movdqa 80(%ebp), %xmm3
  883. aesenc %xmm3, %xmm4
  884. aesenc %xmm3, %xmm5
  885. aesenc %xmm3, %xmm6
  886. aesenc %xmm3, %xmm7
  887. movdqa 96(%ebp), %xmm3
  888. aesenc %xmm3, %xmm4
  889. aesenc %xmm3, %xmm5
  890. aesenc %xmm3, %xmm6
  891. aesenc %xmm3, %xmm7
  892. movdqa 112(%ebp), %xmm3
  893. aesenc %xmm3, %xmm4
  894. aesenc %xmm3, %xmm5
  895. aesenc %xmm3, %xmm6
  896. aesenc %xmm3, %xmm7
  897. movdqa 128(%ebp), %xmm3
  898. aesenc %xmm3, %xmm4
  899. aesenc %xmm3, %xmm5
  900. aesenc %xmm3, %xmm6
  901. aesenc %xmm3, %xmm7
  902. movdqa 144(%ebp), %xmm3
  903. aesenc %xmm3, %xmm4
  904. aesenc %xmm3, %xmm5
  905. aesenc %xmm3, %xmm6
  906. aesenc %xmm3, %xmm7
  907. cmpl $11, 172(%esp)
  908. movdqa 160(%ebp), %xmm3
  909. jl L_AES_GCM_encrypt_aesenc_64_ghash_avx_done
  910. aesenc %xmm3, %xmm4
  911. aesenc %xmm3, %xmm5
  912. aesenc %xmm3, %xmm6
  913. aesenc %xmm3, %xmm7
  914. movdqa 176(%ebp), %xmm3
  915. aesenc %xmm3, %xmm4
  916. aesenc %xmm3, %xmm5
  917. aesenc %xmm3, %xmm6
  918. aesenc %xmm3, %xmm7
  919. cmpl $13, 172(%esp)
  920. movdqa 192(%ebp), %xmm3
  921. jl L_AES_GCM_encrypt_aesenc_64_ghash_avx_done
  922. aesenc %xmm3, %xmm4
  923. aesenc %xmm3, %xmm5
  924. aesenc %xmm3, %xmm6
  925. aesenc %xmm3, %xmm7
  926. movdqa 208(%ebp), %xmm3
  927. aesenc %xmm3, %xmm4
  928. aesenc %xmm3, %xmm5
  929. aesenc %xmm3, %xmm6
  930. aesenc %xmm3, %xmm7
  931. movdqa 224(%ebp), %xmm3
  932. L_AES_GCM_encrypt_aesenc_64_ghash_avx_done:
  933. aesenclast %xmm3, %xmm4
  934. aesenclast %xmm3, %xmm5
  935. movdqu (%ecx), %xmm0
  936. movdqu 16(%ecx), %xmm1
  937. pxor %xmm0, %xmm4
  938. pxor %xmm1, %xmm5
  939. movdqu %xmm4, (%edx)
  940. movdqu %xmm5, 16(%edx)
  941. aesenclast %xmm3, %xmm6
  942. aesenclast %xmm3, %xmm7
  943. movdqu 32(%ecx), %xmm0
  944. movdqu 48(%ecx), %xmm1
  945. pxor %xmm0, %xmm6
  946. pxor %xmm1, %xmm7
  947. movdqu %xmm6, 32(%edx)
  948. movdqu %xmm7, 48(%edx)
  949. # ghash encrypted counter
  950. movdqu 96(%esp), %xmm6
  951. movdqu 48(%esp), %xmm3
  952. movdqu -64(%edx), %xmm4
  953. pshufb L_aes_gcm_bswap_mask, %xmm4
  954. pxor %xmm6, %xmm4
  955. pshufd $0x4e, %xmm3, %xmm5
  956. pshufd $0x4e, %xmm4, %xmm1
  957. pxor %xmm3, %xmm5
  958. pxor %xmm4, %xmm1
  959. movdqa %xmm4, %xmm7
  960. pclmulqdq $0x11, %xmm3, %xmm7
  961. movdqa %xmm4, %xmm6
  962. pclmulqdq $0x00, %xmm3, %xmm6
  963. pclmulqdq $0x00, %xmm1, %xmm5
  964. pxor %xmm6, %xmm5
  965. pxor %xmm7, %xmm5
  966. movdqu 32(%esp), %xmm3
  967. movdqu -48(%edx), %xmm4
  968. pshufd $0x4e, %xmm3, %xmm0
  969. pshufb L_aes_gcm_bswap_mask, %xmm4
  970. pxor %xmm3, %xmm0
  971. pshufd $0x4e, %xmm4, %xmm1
  972. pxor %xmm4, %xmm1
  973. movdqa %xmm4, %xmm2
  974. pclmulqdq $0x11, %xmm3, %xmm2
  975. pclmulqdq $0x00, %xmm4, %xmm3
  976. pclmulqdq $0x00, %xmm1, %xmm0
  977. pxor %xmm3, %xmm5
  978. pxor %xmm3, %xmm6
  979. pxor %xmm2, %xmm5
  980. pxor %xmm2, %xmm7
  981. pxor %xmm0, %xmm5
  982. movdqu 16(%esp), %xmm3
  983. movdqu -32(%edx), %xmm4
  984. pshufd $0x4e, %xmm3, %xmm0
  985. pshufb L_aes_gcm_bswap_mask, %xmm4
  986. pxor %xmm3, %xmm0
  987. pshufd $0x4e, %xmm4, %xmm1
  988. pxor %xmm4, %xmm1
  989. movdqa %xmm4, %xmm2
  990. pclmulqdq $0x11, %xmm3, %xmm2
  991. pclmulqdq $0x00, %xmm4, %xmm3
  992. pclmulqdq $0x00, %xmm1, %xmm0
  993. pxor %xmm3, %xmm5
  994. pxor %xmm3, %xmm6
  995. pxor %xmm2, %xmm5
  996. pxor %xmm2, %xmm7
  997. pxor %xmm0, %xmm5
  998. movdqu (%esp), %xmm3
  999. movdqu -16(%edx), %xmm4
  1000. pshufd $0x4e, %xmm3, %xmm0
  1001. pshufb L_aes_gcm_bswap_mask, %xmm4
  1002. pxor %xmm3, %xmm0
  1003. pshufd $0x4e, %xmm4, %xmm1
  1004. pxor %xmm4, %xmm1
  1005. movdqa %xmm4, %xmm2
  1006. pclmulqdq $0x11, %xmm3, %xmm2
  1007. pclmulqdq $0x00, %xmm4, %xmm3
  1008. pclmulqdq $0x00, %xmm1, %xmm0
  1009. pxor %xmm3, %xmm5
  1010. pxor %xmm3, %xmm6
  1011. pxor %xmm2, %xmm5
  1012. pxor %xmm2, %xmm7
  1013. pxor %xmm0, %xmm5
  1014. movdqa %xmm5, %xmm1
  1015. psrldq $8, %xmm5
  1016. pslldq $8, %xmm1
  1017. pxor %xmm1, %xmm6
  1018. pxor %xmm5, %xmm7
  1019. movdqa %xmm6, %xmm3
  1020. movdqa %xmm6, %xmm0
  1021. movdqa %xmm6, %xmm1
  1022. pslld $31, %xmm3
  1023. pslld $30, %xmm0
  1024. pslld $25, %xmm1
  1025. pxor %xmm0, %xmm3
  1026. pxor %xmm1, %xmm3
  1027. movdqa %xmm3, %xmm0
  1028. pslldq $12, %xmm3
  1029. psrldq $4, %xmm0
  1030. pxor %xmm3, %xmm6
  1031. movdqa %xmm6, %xmm1
  1032. movdqa %xmm6, %xmm5
  1033. movdqa %xmm6, %xmm4
  1034. psrld $0x01, %xmm1
  1035. psrld $2, %xmm5
  1036. psrld $7, %xmm4
  1037. pxor %xmm5, %xmm1
  1038. pxor %xmm4, %xmm1
  1039. pxor %xmm0, %xmm1
  1040. pxor %xmm1, %xmm6
  1041. pxor %xmm7, %xmm6
  1042. movdqu %xmm6, 96(%esp)
  1043. addl $0x40, %ebx
  1044. cmpl %eax, %ebx
  1045. jl L_AES_GCM_encrypt_ghash_64
  1046. L_AES_GCM_encrypt_end_64:
  1047. movdqu 96(%esp), %xmm2
  1048. # Block 1
  1049. movdqa L_aes_gcm_bswap_mask, %xmm4
  1050. movdqu (%edx), %xmm1
  1051. pshufb %xmm4, %xmm1
  1052. movdqu 48(%esp), %xmm3
  1053. pxor %xmm2, %xmm1
  1054. pshufd $0x4e, %xmm1, %xmm5
  1055. pshufd $0x4e, %xmm3, %xmm6
  1056. movdqa %xmm3, %xmm7
  1057. movdqa %xmm3, %xmm4
  1058. pclmulqdq $0x11, %xmm1, %xmm7
  1059. pclmulqdq $0x00, %xmm1, %xmm4
  1060. pxor %xmm1, %xmm5
  1061. pxor %xmm3, %xmm6
  1062. pclmulqdq $0x00, %xmm6, %xmm5
  1063. pxor %xmm4, %xmm5
  1064. pxor %xmm7, %xmm5
  1065. movdqa %xmm5, %xmm6
  1066. movdqa %xmm4, %xmm0
  1067. movdqa %xmm7, %xmm2
  1068. pslldq $8, %xmm6
  1069. psrldq $8, %xmm5
  1070. pxor %xmm6, %xmm0
  1071. pxor %xmm5, %xmm2
  1072. # Block 2
  1073. movdqa L_aes_gcm_bswap_mask, %xmm4
  1074. movdqu 16(%edx), %xmm1
  1075. pshufb %xmm4, %xmm1
  1076. movdqu 32(%esp), %xmm3
  1077. pshufd $0x4e, %xmm1, %xmm5
  1078. pshufd $0x4e, %xmm3, %xmm6
  1079. movdqa %xmm3, %xmm7
  1080. movdqa %xmm3, %xmm4
  1081. pclmulqdq $0x11, %xmm1, %xmm7
  1082. pclmulqdq $0x00, %xmm1, %xmm4
  1083. pxor %xmm1, %xmm5
  1084. pxor %xmm3, %xmm6
  1085. pclmulqdq $0x00, %xmm6, %xmm5
  1086. pxor %xmm4, %xmm5
  1087. pxor %xmm7, %xmm5
  1088. movdqa %xmm5, %xmm6
  1089. pxor %xmm4, %xmm0
  1090. pxor %xmm7, %xmm2
  1091. pslldq $8, %xmm6
  1092. psrldq $8, %xmm5
  1093. pxor %xmm6, %xmm0
  1094. pxor %xmm5, %xmm2
  1095. # Block 3
  1096. movdqa L_aes_gcm_bswap_mask, %xmm4
  1097. movdqu 32(%edx), %xmm1
  1098. pshufb %xmm4, %xmm1
  1099. movdqu 16(%esp), %xmm3
  1100. pshufd $0x4e, %xmm1, %xmm5
  1101. pshufd $0x4e, %xmm3, %xmm6
  1102. movdqa %xmm3, %xmm7
  1103. movdqa %xmm3, %xmm4
  1104. pclmulqdq $0x11, %xmm1, %xmm7
  1105. pclmulqdq $0x00, %xmm1, %xmm4
  1106. pxor %xmm1, %xmm5
  1107. pxor %xmm3, %xmm6
  1108. pclmulqdq $0x00, %xmm6, %xmm5
  1109. pxor %xmm4, %xmm5
  1110. pxor %xmm7, %xmm5
  1111. movdqa %xmm5, %xmm6
  1112. pxor %xmm4, %xmm0
  1113. pxor %xmm7, %xmm2
  1114. pslldq $8, %xmm6
  1115. psrldq $8, %xmm5
  1116. pxor %xmm6, %xmm0
  1117. pxor %xmm5, %xmm2
  1118. # Block 4
  1119. movdqa L_aes_gcm_bswap_mask, %xmm4
  1120. movdqu 48(%edx), %xmm1
  1121. pshufb %xmm4, %xmm1
  1122. movdqu (%esp), %xmm3
  1123. pshufd $0x4e, %xmm1, %xmm5
  1124. pshufd $0x4e, %xmm3, %xmm6
  1125. movdqa %xmm3, %xmm7
  1126. movdqa %xmm3, %xmm4
  1127. pclmulqdq $0x11, %xmm1, %xmm7
  1128. pclmulqdq $0x00, %xmm1, %xmm4
  1129. pxor %xmm1, %xmm5
  1130. pxor %xmm3, %xmm6
  1131. pclmulqdq $0x00, %xmm6, %xmm5
  1132. pxor %xmm4, %xmm5
  1133. pxor %xmm7, %xmm5
  1134. movdqa %xmm5, %xmm6
  1135. pxor %xmm4, %xmm0
  1136. pxor %xmm7, %xmm2
  1137. pslldq $8, %xmm6
  1138. psrldq $8, %xmm5
  1139. pxor %xmm6, %xmm0
  1140. pxor %xmm5, %xmm2
  1141. movdqa %xmm0, %xmm4
  1142. movdqa %xmm0, %xmm5
  1143. movdqa %xmm0, %xmm6
  1144. pslld $31, %xmm4
  1145. pslld $30, %xmm5
  1146. pslld $25, %xmm6
  1147. pxor %xmm5, %xmm4
  1148. pxor %xmm6, %xmm4
  1149. movdqa %xmm4, %xmm5
  1150. psrldq $4, %xmm5
  1151. pslldq $12, %xmm4
  1152. pxor %xmm4, %xmm0
  1153. movdqa %xmm0, %xmm6
  1154. movdqa %xmm0, %xmm7
  1155. movdqa %xmm0, %xmm4
  1156. psrld $0x01, %xmm6
  1157. psrld $2, %xmm7
  1158. psrld $7, %xmm4
  1159. pxor %xmm7, %xmm6
  1160. pxor %xmm4, %xmm6
  1161. pxor %xmm5, %xmm6
  1162. pxor %xmm0, %xmm6
  1163. pxor %xmm6, %xmm2
  1164. movdqu (%esp), %xmm1
  1165. L_AES_GCM_encrypt_done_64:
  1166. movl 152(%esp), %edx
  1167. cmpl %edx, %ebx
  1168. jge L_AES_GCM_encrypt_done_enc
  1169. movl 152(%esp), %eax
  1170. andl $0xfffffff0, %eax
  1171. cmpl %eax, %ebx
  1172. jge L_AES_GCM_encrypt_last_block_done
  1173. leal (%esi,%ebx,1), %ecx
  1174. leal (%edi,%ebx,1), %edx
  1175. movdqu 64(%esp), %xmm4
  1176. movdqa %xmm4, %xmm5
  1177. pshufb L_aes_gcm_bswap_epi64, %xmm4
  1178. paddd L_aes_gcm_one, %xmm5
  1179. pxor (%ebp), %xmm4
  1180. movdqu %xmm5, 64(%esp)
  1181. aesenc 16(%ebp), %xmm4
  1182. aesenc 32(%ebp), %xmm4
  1183. aesenc 48(%ebp), %xmm4
  1184. aesenc 64(%ebp), %xmm4
  1185. aesenc 80(%ebp), %xmm4
  1186. aesenc 96(%ebp), %xmm4
  1187. aesenc 112(%ebp), %xmm4
  1188. aesenc 128(%ebp), %xmm4
  1189. aesenc 144(%ebp), %xmm4
  1190. cmpl $11, 172(%esp)
  1191. movdqa 160(%ebp), %xmm5
  1192. jl L_AES_GCM_encrypt_aesenc_block_aesenc_avx_last
  1193. aesenc %xmm5, %xmm4
  1194. aesenc 176(%ebp), %xmm4
  1195. cmpl $13, 172(%esp)
  1196. movdqa 192(%ebp), %xmm5
  1197. jl L_AES_GCM_encrypt_aesenc_block_aesenc_avx_last
  1198. aesenc %xmm5, %xmm4
  1199. aesenc 208(%ebp), %xmm4
  1200. movdqa 224(%ebp), %xmm5
  1201. L_AES_GCM_encrypt_aesenc_block_aesenc_avx_last:
  1202. aesenclast %xmm5, %xmm4
  1203. movdqu (%ecx), %xmm5
  1204. pxor %xmm5, %xmm4
  1205. movdqu %xmm4, (%edx)
  1206. pshufb L_aes_gcm_bswap_mask, %xmm4
  1207. pxor %xmm4, %xmm2
  1208. addl $16, %ebx
  1209. cmpl %eax, %ebx
  1210. jge L_AES_GCM_encrypt_last_block_ghash
  1211. L_AES_GCM_encrypt_last_block_start:
  1212. leal (%esi,%ebx,1), %ecx
  1213. leal (%edi,%ebx,1), %edx
  1214. movdqu 64(%esp), %xmm4
  1215. movdqa %xmm4, %xmm5
  1216. pshufb L_aes_gcm_bswap_epi64, %xmm4
  1217. paddd L_aes_gcm_one, %xmm5
  1218. pxor (%ebp), %xmm4
  1219. movdqu %xmm5, 64(%esp)
  1220. movdqu %xmm2, %xmm0
  1221. pclmulqdq $16, %xmm1, %xmm0
  1222. aesenc 16(%ebp), %xmm4
  1223. aesenc 32(%ebp), %xmm4
  1224. movdqu %xmm2, %xmm3
  1225. pclmulqdq $0x01, %xmm1, %xmm3
  1226. aesenc 48(%ebp), %xmm4
  1227. aesenc 64(%ebp), %xmm4
  1228. aesenc 80(%ebp), %xmm4
  1229. movdqu %xmm2, %xmm5
  1230. pclmulqdq $0x11, %xmm1, %xmm5
  1231. aesenc 96(%ebp), %xmm4
  1232. pxor %xmm3, %xmm0
  1233. movdqa %xmm0, %xmm6
  1234. psrldq $8, %xmm0
  1235. pslldq $8, %xmm6
  1236. aesenc 112(%ebp), %xmm4
  1237. movdqu %xmm2, %xmm3
  1238. pclmulqdq $0x00, %xmm1, %xmm3
  1239. pxor %xmm3, %xmm6
  1240. pxor %xmm0, %xmm5
  1241. movdqa L_aes_gcm_mod2_128, %xmm7
  1242. movdqa %xmm6, %xmm3
  1243. pclmulqdq $16, %xmm7, %xmm3
  1244. aesenc 128(%ebp), %xmm4
  1245. pshufd $0x4e, %xmm6, %xmm0
  1246. pxor %xmm3, %xmm0
  1247. movdqa %xmm0, %xmm3
  1248. pclmulqdq $16, %xmm7, %xmm3
  1249. aesenc 144(%ebp), %xmm4
  1250. pshufd $0x4e, %xmm0, %xmm2
  1251. pxor %xmm3, %xmm2
  1252. pxor %xmm5, %xmm2
  1253. cmpl $11, 172(%esp)
  1254. movdqa 160(%ebp), %xmm5
  1255. jl L_AES_GCM_encrypt_aesenc_gfmul_last
  1256. aesenc %xmm5, %xmm4
  1257. aesenc 176(%ebp), %xmm4
  1258. cmpl $13, 172(%esp)
  1259. movdqa 192(%ebp), %xmm5
  1260. jl L_AES_GCM_encrypt_aesenc_gfmul_last
  1261. aesenc %xmm5, %xmm4
  1262. aesenc 208(%ebp), %xmm4
  1263. movdqa 224(%ebp), %xmm5
  1264. L_AES_GCM_encrypt_aesenc_gfmul_last:
  1265. aesenclast %xmm5, %xmm4
  1266. movdqu (%ecx), %xmm5
  1267. pxor %xmm5, %xmm4
  1268. movdqu %xmm4, (%edx)
  1269. pshufb L_aes_gcm_bswap_mask, %xmm4
  1270. pxor %xmm4, %xmm2
  1271. addl $16, %ebx
  1272. cmpl %eax, %ebx
  1273. jl L_AES_GCM_encrypt_last_block_start
  1274. L_AES_GCM_encrypt_last_block_ghash:
  1275. pshufd $0x4e, %xmm1, %xmm5
  1276. pshufd $0x4e, %xmm2, %xmm6
  1277. movdqa %xmm2, %xmm7
  1278. movdqa %xmm2, %xmm4
  1279. pclmulqdq $0x11, %xmm1, %xmm7
  1280. pclmulqdq $0x00, %xmm1, %xmm4
  1281. pxor %xmm1, %xmm5
  1282. pxor %xmm2, %xmm6
  1283. pclmulqdq $0x00, %xmm6, %xmm5
  1284. pxor %xmm4, %xmm5
  1285. pxor %xmm7, %xmm5
  1286. movdqa %xmm5, %xmm6
  1287. movdqa %xmm7, %xmm2
  1288. pslldq $8, %xmm6
  1289. psrldq $8, %xmm5
  1290. pxor %xmm6, %xmm4
  1291. pxor %xmm5, %xmm2
  1292. movdqa %xmm4, %xmm5
  1293. movdqa %xmm4, %xmm6
  1294. movdqa %xmm4, %xmm7
  1295. pslld $31, %xmm5
  1296. pslld $30, %xmm6
  1297. pslld $25, %xmm7
  1298. pxor %xmm6, %xmm5
  1299. pxor %xmm7, %xmm5
  1300. movdqa %xmm5, %xmm7
  1301. psrldq $4, %xmm7
  1302. pslldq $12, %xmm5
  1303. pxor %xmm5, %xmm4
  1304. movdqa %xmm4, %xmm5
  1305. movdqa %xmm4, %xmm6
  1306. psrld $0x01, %xmm5
  1307. psrld $2, %xmm6
  1308. pxor %xmm6, %xmm5
  1309. pxor %xmm4, %xmm5
  1310. psrld $7, %xmm4
  1311. pxor %xmm7, %xmm5
  1312. pxor %xmm4, %xmm5
  1313. pxor %xmm5, %xmm2
  1314. L_AES_GCM_encrypt_last_block_done:
  1315. movl 152(%esp), %ecx
  1316. movl %ecx, %edx
  1317. andl $15, %ecx
  1318. jz L_AES_GCM_encrypt_aesenc_last15_enc_avx_done
  1319. movdqu 64(%esp), %xmm0
  1320. pshufb L_aes_gcm_bswap_epi64, %xmm0
  1321. pxor (%ebp), %xmm0
  1322. aesenc 16(%ebp), %xmm0
  1323. aesenc 32(%ebp), %xmm0
  1324. aesenc 48(%ebp), %xmm0
  1325. aesenc 64(%ebp), %xmm0
  1326. aesenc 80(%ebp), %xmm0
  1327. aesenc 96(%ebp), %xmm0
  1328. aesenc 112(%ebp), %xmm0
  1329. aesenc 128(%ebp), %xmm0
  1330. aesenc 144(%ebp), %xmm0
  1331. cmpl $11, 172(%esp)
  1332. movdqa 160(%ebp), %xmm5
  1333. jl L_AES_GCM_encrypt_aesenc_last15_enc_avx_aesenc_avx_last
  1334. aesenc %xmm5, %xmm0
  1335. aesenc 176(%ebp), %xmm0
  1336. cmpl $13, 172(%esp)
  1337. movdqa 192(%ebp), %xmm5
  1338. jl L_AES_GCM_encrypt_aesenc_last15_enc_avx_aesenc_avx_last
  1339. aesenc %xmm5, %xmm0
  1340. aesenc 208(%ebp), %xmm0
  1341. movdqa 224(%ebp), %xmm5
  1342. L_AES_GCM_encrypt_aesenc_last15_enc_avx_aesenc_avx_last:
  1343. aesenclast %xmm5, %xmm0
  1344. subl $16, %esp
  1345. xorl %ecx, %ecx
  1346. movdqu %xmm0, (%esp)
  1347. L_AES_GCM_encrypt_aesenc_last15_enc_avx_loop:
  1348. movzbl (%esi,%ebx,1), %eax
  1349. xorb (%esp,%ecx,1), %al
  1350. movb %al, (%edi,%ebx,1)
  1351. movb %al, (%esp,%ecx,1)
  1352. incl %ebx
  1353. incl %ecx
  1354. cmpl %edx, %ebx
  1355. jl L_AES_GCM_encrypt_aesenc_last15_enc_avx_loop
  1356. xorl %eax, %eax
  1357. cmpl $16, %ecx
  1358. je L_AES_GCM_encrypt_aesenc_last15_enc_avx_finish_enc
  1359. L_AES_GCM_encrypt_aesenc_last15_enc_avx_byte_loop:
  1360. movb %al, (%esp,%ecx,1)
  1361. incl %ecx
  1362. cmpl $16, %ecx
  1363. jl L_AES_GCM_encrypt_aesenc_last15_enc_avx_byte_loop
  1364. L_AES_GCM_encrypt_aesenc_last15_enc_avx_finish_enc:
  1365. movdqu (%esp), %xmm0
  1366. addl $16, %esp
  1367. pshufb L_aes_gcm_bswap_mask, %xmm0
  1368. pxor %xmm0, %xmm2
  1369. pshufd $0x4e, %xmm1, %xmm5
  1370. pshufd $0x4e, %xmm2, %xmm6
  1371. movdqa %xmm2, %xmm7
  1372. movdqa %xmm2, %xmm4
  1373. pclmulqdq $0x11, %xmm1, %xmm7
  1374. pclmulqdq $0x00, %xmm1, %xmm4
  1375. pxor %xmm1, %xmm5
  1376. pxor %xmm2, %xmm6
  1377. pclmulqdq $0x00, %xmm6, %xmm5
  1378. pxor %xmm4, %xmm5
  1379. pxor %xmm7, %xmm5
  1380. movdqa %xmm5, %xmm6
  1381. movdqa %xmm7, %xmm2
  1382. pslldq $8, %xmm6
  1383. psrldq $8, %xmm5
  1384. pxor %xmm6, %xmm4
  1385. pxor %xmm5, %xmm2
  1386. movdqa %xmm4, %xmm5
  1387. movdqa %xmm4, %xmm6
  1388. movdqa %xmm4, %xmm7
  1389. pslld $31, %xmm5
  1390. pslld $30, %xmm6
  1391. pslld $25, %xmm7
  1392. pxor %xmm6, %xmm5
  1393. pxor %xmm7, %xmm5
  1394. movdqa %xmm5, %xmm7
  1395. psrldq $4, %xmm7
  1396. pslldq $12, %xmm5
  1397. pxor %xmm5, %xmm4
  1398. movdqa %xmm4, %xmm5
  1399. movdqa %xmm4, %xmm6
  1400. psrld $0x01, %xmm5
  1401. psrld $2, %xmm6
  1402. pxor %xmm6, %xmm5
  1403. pxor %xmm4, %xmm5
  1404. psrld $7, %xmm4
  1405. pxor %xmm7, %xmm5
  1406. pxor %xmm4, %xmm5
  1407. pxor %xmm5, %xmm2
  1408. L_AES_GCM_encrypt_aesenc_last15_enc_avx_done:
  1409. L_AES_GCM_encrypt_done_enc:
  1410. movl 148(%esp), %edi
  1411. movl 164(%esp), %ebx
  1412. movl 152(%esp), %edx
  1413. movl 156(%esp), %ecx
  1414. shll $3, %edx
  1415. shll $3, %ecx
  1416. pinsrd $0x00, %edx, %xmm4
  1417. pinsrd $2, %ecx, %xmm4
  1418. movl 152(%esp), %edx
  1419. movl 156(%esp), %ecx
  1420. shrl $29, %edx
  1421. shrl $29, %ecx
  1422. pinsrd $0x01, %edx, %xmm4
  1423. pinsrd $3, %ecx, %xmm4
  1424. pxor %xmm4, %xmm2
  1425. pshufd $0x4e, %xmm1, %xmm5
  1426. pshufd $0x4e, %xmm2, %xmm6
  1427. movdqa %xmm2, %xmm7
  1428. movdqa %xmm2, %xmm4
  1429. pclmulqdq $0x11, %xmm1, %xmm7
  1430. pclmulqdq $0x00, %xmm1, %xmm4
  1431. pxor %xmm1, %xmm5
  1432. pxor %xmm2, %xmm6
  1433. pclmulqdq $0x00, %xmm6, %xmm5
  1434. pxor %xmm4, %xmm5
  1435. pxor %xmm7, %xmm5
  1436. movdqa %xmm5, %xmm6
  1437. movdqa %xmm7, %xmm2
  1438. pslldq $8, %xmm6
  1439. psrldq $8, %xmm5
  1440. pxor %xmm6, %xmm4
  1441. pxor %xmm5, %xmm2
  1442. movdqa %xmm4, %xmm5
  1443. movdqa %xmm4, %xmm6
  1444. movdqa %xmm4, %xmm7
  1445. pslld $31, %xmm5
  1446. pslld $30, %xmm6
  1447. pslld $25, %xmm7
  1448. pxor %xmm6, %xmm5
  1449. pxor %xmm7, %xmm5
  1450. movdqa %xmm5, %xmm7
  1451. psrldq $4, %xmm7
  1452. pslldq $12, %xmm5
  1453. pxor %xmm5, %xmm4
  1454. movdqa %xmm4, %xmm5
  1455. movdqa %xmm4, %xmm6
  1456. psrld $0x01, %xmm5
  1457. psrld $2, %xmm6
  1458. pxor %xmm6, %xmm5
  1459. pxor %xmm4, %xmm5
  1460. psrld $7, %xmm4
  1461. pxor %xmm7, %xmm5
  1462. pxor %xmm4, %xmm5
  1463. pxor %xmm5, %xmm2
  1464. pshufb L_aes_gcm_bswap_mask, %xmm2
  1465. movdqu 80(%esp), %xmm4
  1466. pxor %xmm2, %xmm4
  1467. cmpl $16, %ebx
  1468. je L_AES_GCM_encrypt_store_tag_16
  1469. xorl %ecx, %ecx
  1470. movdqu %xmm4, (%esp)
  1471. L_AES_GCM_encrypt_store_tag_loop:
  1472. movzbl (%esp,%ecx,1), %eax
  1473. movb %al, (%edi,%ecx,1)
  1474. incl %ecx
  1475. cmpl %ebx, %ecx
  1476. jne L_AES_GCM_encrypt_store_tag_loop
  1477. jmp L_AES_GCM_encrypt_store_tag_done
  1478. L_AES_GCM_encrypt_store_tag_16:
  1479. movdqu %xmm4, (%edi)
  1480. L_AES_GCM_encrypt_store_tag_done:
  1481. addl $0x70, %esp
  1482. popl %ebp
  1483. popl %edi
  1484. popl %esi
  1485. popl %ebx
  1486. ret
  1487. .size AES_GCM_encrypt,.-AES_GCM_encrypt
  1488. .text
  1489. .globl AES_GCM_decrypt
  1490. .type AES_GCM_decrypt,@function
  1491. .align 16
  1492. AES_GCM_decrypt:
  1493. pushl %ebx
  1494. pushl %esi
  1495. pushl %edi
  1496. pushl %ebp
  1497. subl $0xb0, %esp
  1498. movl 208(%esp), %esi
  1499. movl 232(%esp), %ebp
  1500. movl 224(%esp), %edx
  1501. pxor %xmm0, %xmm0
  1502. pxor %xmm2, %xmm2
  1503. cmpl $12, %edx
  1504. jne L_AES_GCM_decrypt_iv_not_12
  1505. # # Calculate values when IV is 12 bytes
  1506. # Set counter based on IV
  1507. movl $0x1000000, %ecx
  1508. pinsrd $0x00, (%esi), %xmm0
  1509. pinsrd $0x01, 4(%esi), %xmm0
  1510. pinsrd $2, 8(%esi), %xmm0
  1511. pinsrd $3, %ecx, %xmm0
  1512. # H = Encrypt X(=0) and T = Encrypt counter
  1513. movdqa %xmm0, %xmm5
  1514. movdqa (%ebp), %xmm1
  1515. pxor %xmm1, %xmm5
  1516. movdqa 16(%ebp), %xmm3
  1517. aesenc %xmm3, %xmm1
  1518. aesenc %xmm3, %xmm5
  1519. movdqa 32(%ebp), %xmm3
  1520. aesenc %xmm3, %xmm1
  1521. aesenc %xmm3, %xmm5
  1522. movdqa 48(%ebp), %xmm3
  1523. aesenc %xmm3, %xmm1
  1524. aesenc %xmm3, %xmm5
  1525. movdqa 64(%ebp), %xmm3
  1526. aesenc %xmm3, %xmm1
  1527. aesenc %xmm3, %xmm5
  1528. movdqa 80(%ebp), %xmm3
  1529. aesenc %xmm3, %xmm1
  1530. aesenc %xmm3, %xmm5
  1531. movdqa 96(%ebp), %xmm3
  1532. aesenc %xmm3, %xmm1
  1533. aesenc %xmm3, %xmm5
  1534. movdqa 112(%ebp), %xmm3
  1535. aesenc %xmm3, %xmm1
  1536. aesenc %xmm3, %xmm5
  1537. movdqa 128(%ebp), %xmm3
  1538. aesenc %xmm3, %xmm1
  1539. aesenc %xmm3, %xmm5
  1540. movdqa 144(%ebp), %xmm3
  1541. aesenc %xmm3, %xmm1
  1542. aesenc %xmm3, %xmm5
  1543. cmpl $11, 236(%esp)
  1544. movdqa 160(%ebp), %xmm3
  1545. jl L_AES_GCM_decrypt_calc_iv_12_last
  1546. aesenc %xmm3, %xmm1
  1547. aesenc %xmm3, %xmm5
  1548. movdqa 176(%ebp), %xmm3
  1549. aesenc %xmm3, %xmm1
  1550. aesenc %xmm3, %xmm5
  1551. cmpl $13, 236(%esp)
  1552. movdqa 192(%ebp), %xmm3
  1553. jl L_AES_GCM_decrypt_calc_iv_12_last
  1554. aesenc %xmm3, %xmm1
  1555. aesenc %xmm3, %xmm5
  1556. movdqa 208(%ebp), %xmm3
  1557. aesenc %xmm3, %xmm1
  1558. aesenc %xmm3, %xmm5
  1559. movdqa 224(%ebp), %xmm3
  1560. L_AES_GCM_decrypt_calc_iv_12_last:
  1561. aesenclast %xmm3, %xmm1
  1562. aesenclast %xmm3, %xmm5
  1563. pshufb L_aes_gcm_bswap_mask, %xmm1
  1564. movdqu %xmm5, 80(%esp)
  1565. jmp L_AES_GCM_decrypt_iv_done
  1566. L_AES_GCM_decrypt_iv_not_12:
  1567. # Calculate values when IV is not 12 bytes
  1568. # H = Encrypt X(=0)
  1569. movdqa (%ebp), %xmm1
  1570. aesenc 16(%ebp), %xmm1
  1571. aesenc 32(%ebp), %xmm1
  1572. aesenc 48(%ebp), %xmm1
  1573. aesenc 64(%ebp), %xmm1
  1574. aesenc 80(%ebp), %xmm1
  1575. aesenc 96(%ebp), %xmm1
  1576. aesenc 112(%ebp), %xmm1
  1577. aesenc 128(%ebp), %xmm1
  1578. aesenc 144(%ebp), %xmm1
  1579. cmpl $11, 236(%esp)
  1580. movdqa 160(%ebp), %xmm5
  1581. jl L_AES_GCM_decrypt_calc_iv_1_aesenc_avx_last
  1582. aesenc %xmm5, %xmm1
  1583. aesenc 176(%ebp), %xmm1
  1584. cmpl $13, 236(%esp)
  1585. movdqa 192(%ebp), %xmm5
  1586. jl L_AES_GCM_decrypt_calc_iv_1_aesenc_avx_last
  1587. aesenc %xmm5, %xmm1
  1588. aesenc 208(%ebp), %xmm1
  1589. movdqa 224(%ebp), %xmm5
  1590. L_AES_GCM_decrypt_calc_iv_1_aesenc_avx_last:
  1591. aesenclast %xmm5, %xmm1
  1592. pshufb L_aes_gcm_bswap_mask, %xmm1
  1593. # Calc counter
  1594. # Initialization vector
  1595. cmpl $0x00, %edx
  1596. movl $0x00, %ecx
  1597. je L_AES_GCM_decrypt_calc_iv_done
  1598. cmpl $16, %edx
  1599. jl L_AES_GCM_decrypt_calc_iv_lt16
  1600. andl $0xfffffff0, %edx
  1601. L_AES_GCM_decrypt_calc_iv_16_loop:
  1602. movdqu (%esi,%ecx,1), %xmm4
  1603. pshufb L_aes_gcm_bswap_mask, %xmm4
  1604. pxor %xmm4, %xmm0
  1605. pshufd $0x4e, %xmm0, %xmm5
  1606. pshufd $0x4e, %xmm1, %xmm6
  1607. movdqa %xmm1, %xmm7
  1608. movdqa %xmm1, %xmm4
  1609. pclmulqdq $0x11, %xmm0, %xmm7
  1610. pclmulqdq $0x00, %xmm0, %xmm4
  1611. pxor %xmm0, %xmm5
  1612. pxor %xmm1, %xmm6
  1613. pclmulqdq $0x00, %xmm6, %xmm5
  1614. pxor %xmm4, %xmm5
  1615. pxor %xmm7, %xmm5
  1616. movdqa %xmm5, %xmm6
  1617. movdqa %xmm4, %xmm3
  1618. movdqa %xmm7, %xmm0
  1619. pslldq $8, %xmm6
  1620. psrldq $8, %xmm5
  1621. pxor %xmm6, %xmm3
  1622. pxor %xmm5, %xmm0
  1623. movdqa %xmm3, %xmm4
  1624. movdqa %xmm0, %xmm5
  1625. psrld $31, %xmm4
  1626. psrld $31, %xmm5
  1627. pslld $0x01, %xmm3
  1628. pslld $0x01, %xmm0
  1629. movdqa %xmm4, %xmm6
  1630. pslldq $4, %xmm4
  1631. psrldq $12, %xmm6
  1632. pslldq $4, %xmm5
  1633. por %xmm6, %xmm0
  1634. por %xmm4, %xmm3
  1635. por %xmm5, %xmm0
  1636. movdqa %xmm3, %xmm4
  1637. movdqa %xmm3, %xmm5
  1638. movdqa %xmm3, %xmm6
  1639. pslld $31, %xmm4
  1640. pslld $30, %xmm5
  1641. pslld $25, %xmm6
  1642. pxor %xmm5, %xmm4
  1643. pxor %xmm6, %xmm4
  1644. movdqa %xmm4, %xmm5
  1645. psrldq $4, %xmm5
  1646. pslldq $12, %xmm4
  1647. pxor %xmm4, %xmm3
  1648. movdqa %xmm3, %xmm6
  1649. movdqa %xmm3, %xmm7
  1650. movdqa %xmm3, %xmm4
  1651. psrld $0x01, %xmm6
  1652. psrld $2, %xmm7
  1653. psrld $7, %xmm4
  1654. pxor %xmm7, %xmm6
  1655. pxor %xmm4, %xmm6
  1656. pxor %xmm5, %xmm6
  1657. pxor %xmm3, %xmm6
  1658. pxor %xmm6, %xmm0
  1659. addl $16, %ecx
  1660. cmpl %edx, %ecx
  1661. jl L_AES_GCM_decrypt_calc_iv_16_loop
  1662. movl 224(%esp), %edx
  1663. cmpl %edx, %ecx
  1664. je L_AES_GCM_decrypt_calc_iv_done
  1665. L_AES_GCM_decrypt_calc_iv_lt16:
  1666. subl $16, %esp
  1667. pxor %xmm4, %xmm4
  1668. xorl %ebx, %ebx
  1669. movdqu %xmm4, (%esp)
  1670. L_AES_GCM_decrypt_calc_iv_loop:
  1671. movzbl (%esi,%ecx,1), %eax
  1672. movb %al, (%esp,%ebx,1)
  1673. incl %ecx
  1674. incl %ebx
  1675. cmpl %edx, %ecx
  1676. jl L_AES_GCM_decrypt_calc_iv_loop
  1677. movdqu (%esp), %xmm4
  1678. addl $16, %esp
  1679. pshufb L_aes_gcm_bswap_mask, %xmm4
  1680. pxor %xmm4, %xmm0
  1681. pshufd $0x4e, %xmm0, %xmm5
  1682. pshufd $0x4e, %xmm1, %xmm6
  1683. movdqa %xmm1, %xmm7
  1684. movdqa %xmm1, %xmm4
  1685. pclmulqdq $0x11, %xmm0, %xmm7
  1686. pclmulqdq $0x00, %xmm0, %xmm4
  1687. pxor %xmm0, %xmm5
  1688. pxor %xmm1, %xmm6
  1689. pclmulqdq $0x00, %xmm6, %xmm5
  1690. pxor %xmm4, %xmm5
  1691. pxor %xmm7, %xmm5
  1692. movdqa %xmm5, %xmm6
  1693. movdqa %xmm4, %xmm3
  1694. movdqa %xmm7, %xmm0
  1695. pslldq $8, %xmm6
  1696. psrldq $8, %xmm5
  1697. pxor %xmm6, %xmm3
  1698. pxor %xmm5, %xmm0
  1699. movdqa %xmm3, %xmm4
  1700. movdqa %xmm0, %xmm5
  1701. psrld $31, %xmm4
  1702. psrld $31, %xmm5
  1703. pslld $0x01, %xmm3
  1704. pslld $0x01, %xmm0
  1705. movdqa %xmm4, %xmm6
  1706. pslldq $4, %xmm4
  1707. psrldq $12, %xmm6
  1708. pslldq $4, %xmm5
  1709. por %xmm6, %xmm0
  1710. por %xmm4, %xmm3
  1711. por %xmm5, %xmm0
  1712. movdqa %xmm3, %xmm4
  1713. movdqa %xmm3, %xmm5
  1714. movdqa %xmm3, %xmm6
  1715. pslld $31, %xmm4
  1716. pslld $30, %xmm5
  1717. pslld $25, %xmm6
  1718. pxor %xmm5, %xmm4
  1719. pxor %xmm6, %xmm4
  1720. movdqa %xmm4, %xmm5
  1721. psrldq $4, %xmm5
  1722. pslldq $12, %xmm4
  1723. pxor %xmm4, %xmm3
  1724. movdqa %xmm3, %xmm6
  1725. movdqa %xmm3, %xmm7
  1726. movdqa %xmm3, %xmm4
  1727. psrld $0x01, %xmm6
  1728. psrld $2, %xmm7
  1729. psrld $7, %xmm4
  1730. pxor %xmm7, %xmm6
  1731. pxor %xmm4, %xmm6
  1732. pxor %xmm5, %xmm6
  1733. pxor %xmm3, %xmm6
  1734. pxor %xmm6, %xmm0
  1735. L_AES_GCM_decrypt_calc_iv_done:
  1736. # T = Encrypt counter
  1737. pxor %xmm4, %xmm4
  1738. shll $3, %edx
  1739. pinsrd $0x00, %edx, %xmm4
  1740. pxor %xmm4, %xmm0
  1741. pshufd $0x4e, %xmm0, %xmm5
  1742. pshufd $0x4e, %xmm1, %xmm6
  1743. movdqa %xmm1, %xmm7
  1744. movdqa %xmm1, %xmm4
  1745. pclmulqdq $0x11, %xmm0, %xmm7
  1746. pclmulqdq $0x00, %xmm0, %xmm4
  1747. pxor %xmm0, %xmm5
  1748. pxor %xmm1, %xmm6
  1749. pclmulqdq $0x00, %xmm6, %xmm5
  1750. pxor %xmm4, %xmm5
  1751. pxor %xmm7, %xmm5
  1752. movdqa %xmm5, %xmm6
  1753. movdqa %xmm4, %xmm3
  1754. movdqa %xmm7, %xmm0
  1755. pslldq $8, %xmm6
  1756. psrldq $8, %xmm5
  1757. pxor %xmm6, %xmm3
  1758. pxor %xmm5, %xmm0
  1759. movdqa %xmm3, %xmm4
  1760. movdqa %xmm0, %xmm5
  1761. psrld $31, %xmm4
  1762. psrld $31, %xmm5
  1763. pslld $0x01, %xmm3
  1764. pslld $0x01, %xmm0
  1765. movdqa %xmm4, %xmm6
  1766. pslldq $4, %xmm4
  1767. psrldq $12, %xmm6
  1768. pslldq $4, %xmm5
  1769. por %xmm6, %xmm0
  1770. por %xmm4, %xmm3
  1771. por %xmm5, %xmm0
  1772. movdqa %xmm3, %xmm4
  1773. movdqa %xmm3, %xmm5
  1774. movdqa %xmm3, %xmm6
  1775. pslld $31, %xmm4
  1776. pslld $30, %xmm5
  1777. pslld $25, %xmm6
  1778. pxor %xmm5, %xmm4
  1779. pxor %xmm6, %xmm4
  1780. movdqa %xmm4, %xmm5
  1781. psrldq $4, %xmm5
  1782. pslldq $12, %xmm4
  1783. pxor %xmm4, %xmm3
  1784. movdqa %xmm3, %xmm6
  1785. movdqa %xmm3, %xmm7
  1786. movdqa %xmm3, %xmm4
  1787. psrld $0x01, %xmm6
  1788. psrld $2, %xmm7
  1789. psrld $7, %xmm4
  1790. pxor %xmm7, %xmm6
  1791. pxor %xmm4, %xmm6
  1792. pxor %xmm5, %xmm6
  1793. pxor %xmm3, %xmm6
  1794. pxor %xmm6, %xmm0
  1795. pshufb L_aes_gcm_bswap_mask, %xmm0
  1796. # Encrypt counter
  1797. movdqa (%ebp), %xmm4
  1798. pxor %xmm0, %xmm4
  1799. aesenc 16(%ebp), %xmm4
  1800. aesenc 32(%ebp), %xmm4
  1801. aesenc 48(%ebp), %xmm4
  1802. aesenc 64(%ebp), %xmm4
  1803. aesenc 80(%ebp), %xmm4
  1804. aesenc 96(%ebp), %xmm4
  1805. aesenc 112(%ebp), %xmm4
  1806. aesenc 128(%ebp), %xmm4
  1807. aesenc 144(%ebp), %xmm4
  1808. cmpl $11, 236(%esp)
  1809. movdqa 160(%ebp), %xmm5
  1810. jl L_AES_GCM_decrypt_calc_iv_2_aesenc_avx_last
  1811. aesenc %xmm5, %xmm4
  1812. aesenc 176(%ebp), %xmm4
  1813. cmpl $13, 236(%esp)
  1814. movdqa 192(%ebp), %xmm5
  1815. jl L_AES_GCM_decrypt_calc_iv_2_aesenc_avx_last
  1816. aesenc %xmm5, %xmm4
  1817. aesenc 208(%ebp), %xmm4
  1818. movdqa 224(%ebp), %xmm5
  1819. L_AES_GCM_decrypt_calc_iv_2_aesenc_avx_last:
  1820. aesenclast %xmm5, %xmm4
  1821. movdqu %xmm4, 80(%esp)
  1822. L_AES_GCM_decrypt_iv_done:
  1823. movl 204(%esp), %esi
  1824. # Additional authentication data
  1825. movl 220(%esp), %edx
  1826. cmpl $0x00, %edx
  1827. je L_AES_GCM_decrypt_calc_aad_done
  1828. xorl %ecx, %ecx
  1829. cmpl $16, %edx
  1830. jl L_AES_GCM_decrypt_calc_aad_lt16
  1831. andl $0xfffffff0, %edx
  1832. L_AES_GCM_decrypt_calc_aad_16_loop:
  1833. movdqu (%esi,%ecx,1), %xmm4
  1834. pshufb L_aes_gcm_bswap_mask, %xmm4
  1835. pxor %xmm4, %xmm2
  1836. pshufd $0x4e, %xmm2, %xmm5
  1837. pshufd $0x4e, %xmm1, %xmm6
  1838. movdqa %xmm1, %xmm7
  1839. movdqa %xmm1, %xmm4
  1840. pclmulqdq $0x11, %xmm2, %xmm7
  1841. pclmulqdq $0x00, %xmm2, %xmm4
  1842. pxor %xmm2, %xmm5
  1843. pxor %xmm1, %xmm6
  1844. pclmulqdq $0x00, %xmm6, %xmm5
  1845. pxor %xmm4, %xmm5
  1846. pxor %xmm7, %xmm5
  1847. movdqa %xmm5, %xmm6
  1848. movdqa %xmm4, %xmm3
  1849. movdqa %xmm7, %xmm2
  1850. pslldq $8, %xmm6
  1851. psrldq $8, %xmm5
  1852. pxor %xmm6, %xmm3
  1853. pxor %xmm5, %xmm2
  1854. movdqa %xmm3, %xmm4
  1855. movdqa %xmm2, %xmm5
  1856. psrld $31, %xmm4
  1857. psrld $31, %xmm5
  1858. pslld $0x01, %xmm3
  1859. pslld $0x01, %xmm2
  1860. movdqa %xmm4, %xmm6
  1861. pslldq $4, %xmm4
  1862. psrldq $12, %xmm6
  1863. pslldq $4, %xmm5
  1864. por %xmm6, %xmm2
  1865. por %xmm4, %xmm3
  1866. por %xmm5, %xmm2
  1867. movdqa %xmm3, %xmm4
  1868. movdqa %xmm3, %xmm5
  1869. movdqa %xmm3, %xmm6
  1870. pslld $31, %xmm4
  1871. pslld $30, %xmm5
  1872. pslld $25, %xmm6
  1873. pxor %xmm5, %xmm4
  1874. pxor %xmm6, %xmm4
  1875. movdqa %xmm4, %xmm5
  1876. psrldq $4, %xmm5
  1877. pslldq $12, %xmm4
  1878. pxor %xmm4, %xmm3
  1879. movdqa %xmm3, %xmm6
  1880. movdqa %xmm3, %xmm7
  1881. movdqa %xmm3, %xmm4
  1882. psrld $0x01, %xmm6
  1883. psrld $2, %xmm7
  1884. psrld $7, %xmm4
  1885. pxor %xmm7, %xmm6
  1886. pxor %xmm4, %xmm6
  1887. pxor %xmm5, %xmm6
  1888. pxor %xmm3, %xmm6
  1889. pxor %xmm6, %xmm2
  1890. addl $16, %ecx
  1891. cmpl %edx, %ecx
  1892. jl L_AES_GCM_decrypt_calc_aad_16_loop
  1893. movl 220(%esp), %edx
  1894. cmpl %edx, %ecx
  1895. je L_AES_GCM_decrypt_calc_aad_done
  1896. L_AES_GCM_decrypt_calc_aad_lt16:
  1897. subl $16, %esp
  1898. pxor %xmm4, %xmm4
  1899. xorl %ebx, %ebx
  1900. movdqu %xmm4, (%esp)
  1901. L_AES_GCM_decrypt_calc_aad_loop:
  1902. movzbl (%esi,%ecx,1), %eax
  1903. movb %al, (%esp,%ebx,1)
  1904. incl %ecx
  1905. incl %ebx
  1906. cmpl %edx, %ecx
  1907. jl L_AES_GCM_decrypt_calc_aad_loop
  1908. movdqu (%esp), %xmm4
  1909. addl $16, %esp
  1910. pshufb L_aes_gcm_bswap_mask, %xmm4
  1911. pxor %xmm4, %xmm2
  1912. pshufd $0x4e, %xmm2, %xmm5
  1913. pshufd $0x4e, %xmm1, %xmm6
  1914. movdqa %xmm1, %xmm7
  1915. movdqa %xmm1, %xmm4
  1916. pclmulqdq $0x11, %xmm2, %xmm7
  1917. pclmulqdq $0x00, %xmm2, %xmm4
  1918. pxor %xmm2, %xmm5
  1919. pxor %xmm1, %xmm6
  1920. pclmulqdq $0x00, %xmm6, %xmm5
  1921. pxor %xmm4, %xmm5
  1922. pxor %xmm7, %xmm5
  1923. movdqa %xmm5, %xmm6
  1924. movdqa %xmm4, %xmm3
  1925. movdqa %xmm7, %xmm2
  1926. pslldq $8, %xmm6
  1927. psrldq $8, %xmm5
  1928. pxor %xmm6, %xmm3
  1929. pxor %xmm5, %xmm2
  1930. movdqa %xmm3, %xmm4
  1931. movdqa %xmm2, %xmm5
  1932. psrld $31, %xmm4
  1933. psrld $31, %xmm5
  1934. pslld $0x01, %xmm3
  1935. pslld $0x01, %xmm2
  1936. movdqa %xmm4, %xmm6
  1937. pslldq $4, %xmm4
  1938. psrldq $12, %xmm6
  1939. pslldq $4, %xmm5
  1940. por %xmm6, %xmm2
  1941. por %xmm4, %xmm3
  1942. por %xmm5, %xmm2
  1943. movdqa %xmm3, %xmm4
  1944. movdqa %xmm3, %xmm5
  1945. movdqa %xmm3, %xmm6
  1946. pslld $31, %xmm4
  1947. pslld $30, %xmm5
  1948. pslld $25, %xmm6
  1949. pxor %xmm5, %xmm4
  1950. pxor %xmm6, %xmm4
  1951. movdqa %xmm4, %xmm5
  1952. psrldq $4, %xmm5
  1953. pslldq $12, %xmm4
  1954. pxor %xmm4, %xmm3
  1955. movdqa %xmm3, %xmm6
  1956. movdqa %xmm3, %xmm7
  1957. movdqa %xmm3, %xmm4
  1958. psrld $0x01, %xmm6
  1959. psrld $2, %xmm7
  1960. psrld $7, %xmm4
  1961. pxor %xmm7, %xmm6
  1962. pxor %xmm4, %xmm6
  1963. pxor %xmm5, %xmm6
  1964. pxor %xmm3, %xmm6
  1965. pxor %xmm6, %xmm2
  1966. L_AES_GCM_decrypt_calc_aad_done:
  1967. movdqu %xmm2, 96(%esp)
  1968. movl 196(%esp), %esi
  1969. movl 200(%esp), %edi
  1970. # Calculate counter and H
  1971. pshufb L_aes_gcm_bswap_epi64, %xmm0
  1972. movdqa %xmm1, %xmm5
  1973. paddd L_aes_gcm_one, %xmm0
  1974. movdqa %xmm1, %xmm4
  1975. movdqu %xmm0, 64(%esp)
  1976. psrlq $63, %xmm5
  1977. psllq $0x01, %xmm4
  1978. pslldq $8, %xmm5
  1979. por %xmm5, %xmm4
  1980. pshufd $0xff, %xmm1, %xmm1
  1981. psrad $31, %xmm1
  1982. pand L_aes_gcm_mod2_128, %xmm1
  1983. pxor %xmm4, %xmm1
  1984. xorl %ebx, %ebx
  1985. cmpl $0x40, 216(%esp)
  1986. movl 216(%esp), %eax
  1987. jl L_AES_GCM_decrypt_done_64
  1988. andl $0xffffffc0, %eax
  1989. movdqa %xmm2, %xmm6
  1990. # H ^ 1
  1991. movdqu %xmm1, (%esp)
  1992. # H ^ 2
  1993. pshufd $0x4e, %xmm1, %xmm5
  1994. pshufd $0x4e, %xmm1, %xmm6
  1995. movdqa %xmm1, %xmm7
  1996. movdqa %xmm1, %xmm4
  1997. pclmulqdq $0x11, %xmm1, %xmm7
  1998. pclmulqdq $0x00, %xmm1, %xmm4
  1999. pxor %xmm1, %xmm5
  2000. pxor %xmm1, %xmm6
  2001. pclmulqdq $0x00, %xmm6, %xmm5
  2002. pxor %xmm4, %xmm5
  2003. pxor %xmm7, %xmm5
  2004. movdqa %xmm5, %xmm6
  2005. movdqa %xmm7, %xmm0
  2006. pslldq $8, %xmm6
  2007. psrldq $8, %xmm5
  2008. pxor %xmm6, %xmm4
  2009. pxor %xmm5, %xmm0
  2010. movdqa %xmm4, %xmm5
  2011. movdqa %xmm4, %xmm6
  2012. movdqa %xmm4, %xmm7
  2013. pslld $31, %xmm5
  2014. pslld $30, %xmm6
  2015. pslld $25, %xmm7
  2016. pxor %xmm6, %xmm5
  2017. pxor %xmm7, %xmm5
  2018. movdqa %xmm5, %xmm7
  2019. psrldq $4, %xmm7
  2020. pslldq $12, %xmm5
  2021. pxor %xmm5, %xmm4
  2022. movdqa %xmm4, %xmm5
  2023. movdqa %xmm4, %xmm6
  2024. psrld $0x01, %xmm5
  2025. psrld $2, %xmm6
  2026. pxor %xmm6, %xmm5
  2027. pxor %xmm4, %xmm5
  2028. psrld $7, %xmm4
  2029. pxor %xmm7, %xmm5
  2030. pxor %xmm4, %xmm5
  2031. pxor %xmm5, %xmm0
  2032. movdqu %xmm0, 16(%esp)
  2033. # H ^ 3
  2034. pshufd $0x4e, %xmm1, %xmm5
  2035. pshufd $0x4e, %xmm0, %xmm6
  2036. movdqa %xmm0, %xmm7
  2037. movdqa %xmm0, %xmm4
  2038. pclmulqdq $0x11, %xmm1, %xmm7
  2039. pclmulqdq $0x00, %xmm1, %xmm4
  2040. pxor %xmm1, %xmm5
  2041. pxor %xmm0, %xmm6
  2042. pclmulqdq $0x00, %xmm6, %xmm5
  2043. pxor %xmm4, %xmm5
  2044. pxor %xmm7, %xmm5
  2045. movdqa %xmm5, %xmm6
  2046. movdqa %xmm7, %xmm3
  2047. pslldq $8, %xmm6
  2048. psrldq $8, %xmm5
  2049. pxor %xmm6, %xmm4
  2050. pxor %xmm5, %xmm3
  2051. movdqa %xmm4, %xmm5
  2052. movdqa %xmm4, %xmm6
  2053. movdqa %xmm4, %xmm7
  2054. pslld $31, %xmm5
  2055. pslld $30, %xmm6
  2056. pslld $25, %xmm7
  2057. pxor %xmm6, %xmm5
  2058. pxor %xmm7, %xmm5
  2059. movdqa %xmm5, %xmm7
  2060. psrldq $4, %xmm7
  2061. pslldq $12, %xmm5
  2062. pxor %xmm5, %xmm4
  2063. movdqa %xmm4, %xmm5
  2064. movdqa %xmm4, %xmm6
  2065. psrld $0x01, %xmm5
  2066. psrld $2, %xmm6
  2067. pxor %xmm6, %xmm5
  2068. pxor %xmm4, %xmm5
  2069. psrld $7, %xmm4
  2070. pxor %xmm7, %xmm5
  2071. pxor %xmm4, %xmm5
  2072. pxor %xmm5, %xmm3
  2073. movdqu %xmm3, 32(%esp)
  2074. # H ^ 4
  2075. pshufd $0x4e, %xmm0, %xmm5
  2076. pshufd $0x4e, %xmm0, %xmm6
  2077. movdqa %xmm0, %xmm7
  2078. movdqa %xmm0, %xmm4
  2079. pclmulqdq $0x11, %xmm0, %xmm7
  2080. pclmulqdq $0x00, %xmm0, %xmm4
  2081. pxor %xmm0, %xmm5
  2082. pxor %xmm0, %xmm6
  2083. pclmulqdq $0x00, %xmm6, %xmm5
  2084. pxor %xmm4, %xmm5
  2085. pxor %xmm7, %xmm5
  2086. movdqa %xmm5, %xmm6
  2087. movdqa %xmm7, %xmm3
  2088. pslldq $8, %xmm6
  2089. psrldq $8, %xmm5
  2090. pxor %xmm6, %xmm4
  2091. pxor %xmm5, %xmm3
  2092. movdqa %xmm4, %xmm5
  2093. movdqa %xmm4, %xmm6
  2094. movdqa %xmm4, %xmm7
  2095. pslld $31, %xmm5
  2096. pslld $30, %xmm6
  2097. pslld $25, %xmm7
  2098. pxor %xmm6, %xmm5
  2099. pxor %xmm7, %xmm5
  2100. movdqa %xmm5, %xmm7
  2101. psrldq $4, %xmm7
  2102. pslldq $12, %xmm5
  2103. pxor %xmm5, %xmm4
  2104. movdqa %xmm4, %xmm5
  2105. movdqa %xmm4, %xmm6
  2106. psrld $0x01, %xmm5
  2107. psrld $2, %xmm6
  2108. pxor %xmm6, %xmm5
  2109. pxor %xmm4, %xmm5
  2110. psrld $7, %xmm4
  2111. pxor %xmm7, %xmm5
  2112. pxor %xmm4, %xmm5
  2113. pxor %xmm5, %xmm3
  2114. movdqu %xmm3, 48(%esp)
  2115. cmpl %esi, %edi
  2116. jne L_AES_GCM_decrypt_ghash_64
  2117. L_AES_GCM_decrypt_ghash_64_inplace:
  2118. leal (%esi,%ebx,1), %ecx
  2119. leal (%edi,%ebx,1), %edx
  2120. # Encrypt 64 bytes of counter
  2121. movdqu 64(%esp), %xmm4
  2122. movdqa L_aes_gcm_bswap_epi64, %xmm3
  2123. movdqa %xmm4, %xmm5
  2124. movdqa %xmm4, %xmm6
  2125. movdqa %xmm4, %xmm7
  2126. pshufb %xmm3, %xmm4
  2127. paddd L_aes_gcm_one, %xmm5
  2128. pshufb %xmm3, %xmm5
  2129. paddd L_aes_gcm_two, %xmm6
  2130. pshufb %xmm3, %xmm6
  2131. paddd L_aes_gcm_three, %xmm7
  2132. pshufb %xmm3, %xmm7
  2133. movdqu 64(%esp), %xmm3
  2134. paddd L_aes_gcm_four, %xmm3
  2135. movdqu %xmm3, 64(%esp)
  2136. movdqa (%ebp), %xmm3
  2137. pxor %xmm3, %xmm4
  2138. pxor %xmm3, %xmm5
  2139. pxor %xmm3, %xmm6
  2140. pxor %xmm3, %xmm7
  2141. movdqa 16(%ebp), %xmm3
  2142. aesenc %xmm3, %xmm4
  2143. aesenc %xmm3, %xmm5
  2144. aesenc %xmm3, %xmm6
  2145. aesenc %xmm3, %xmm7
  2146. movdqa 32(%ebp), %xmm3
  2147. aesenc %xmm3, %xmm4
  2148. aesenc %xmm3, %xmm5
  2149. aesenc %xmm3, %xmm6
  2150. aesenc %xmm3, %xmm7
  2151. movdqa 48(%ebp), %xmm3
  2152. aesenc %xmm3, %xmm4
  2153. aesenc %xmm3, %xmm5
  2154. aesenc %xmm3, %xmm6
  2155. aesenc %xmm3, %xmm7
  2156. movdqa 64(%ebp), %xmm3
  2157. aesenc %xmm3, %xmm4
  2158. aesenc %xmm3, %xmm5
  2159. aesenc %xmm3, %xmm6
  2160. aesenc %xmm3, %xmm7
  2161. movdqa 80(%ebp), %xmm3
  2162. aesenc %xmm3, %xmm4
  2163. aesenc %xmm3, %xmm5
  2164. aesenc %xmm3, %xmm6
  2165. aesenc %xmm3, %xmm7
  2166. movdqa 96(%ebp), %xmm3
  2167. aesenc %xmm3, %xmm4
  2168. aesenc %xmm3, %xmm5
  2169. aesenc %xmm3, %xmm6
  2170. aesenc %xmm3, %xmm7
  2171. movdqa 112(%ebp), %xmm3
  2172. aesenc %xmm3, %xmm4
  2173. aesenc %xmm3, %xmm5
  2174. aesenc %xmm3, %xmm6
  2175. aesenc %xmm3, %xmm7
  2176. movdqa 128(%ebp), %xmm3
  2177. aesenc %xmm3, %xmm4
  2178. aesenc %xmm3, %xmm5
  2179. aesenc %xmm3, %xmm6
  2180. aesenc %xmm3, %xmm7
  2181. movdqa 144(%ebp), %xmm3
  2182. aesenc %xmm3, %xmm4
  2183. aesenc %xmm3, %xmm5
  2184. aesenc %xmm3, %xmm6
  2185. aesenc %xmm3, %xmm7
  2186. cmpl $11, 236(%esp)
  2187. movdqa 160(%ebp), %xmm3
  2188. jl L_AES_GCM_decryptinplace_aesenc_64_ghash_avx_done
  2189. aesenc %xmm3, %xmm4
  2190. aesenc %xmm3, %xmm5
  2191. aesenc %xmm3, %xmm6
  2192. aesenc %xmm3, %xmm7
  2193. movdqa 176(%ebp), %xmm3
  2194. aesenc %xmm3, %xmm4
  2195. aesenc %xmm3, %xmm5
  2196. aesenc %xmm3, %xmm6
  2197. aesenc %xmm3, %xmm7
  2198. cmpl $13, 236(%esp)
  2199. movdqa 192(%ebp), %xmm3
  2200. jl L_AES_GCM_decryptinplace_aesenc_64_ghash_avx_done
  2201. aesenc %xmm3, %xmm4
  2202. aesenc %xmm3, %xmm5
  2203. aesenc %xmm3, %xmm6
  2204. aesenc %xmm3, %xmm7
  2205. movdqa 208(%ebp), %xmm3
  2206. aesenc %xmm3, %xmm4
  2207. aesenc %xmm3, %xmm5
  2208. aesenc %xmm3, %xmm6
  2209. aesenc %xmm3, %xmm7
  2210. movdqa 224(%ebp), %xmm3
  2211. L_AES_GCM_decryptinplace_aesenc_64_ghash_avx_done:
  2212. aesenclast %xmm3, %xmm4
  2213. aesenclast %xmm3, %xmm5
  2214. movdqu (%ecx), %xmm0
  2215. movdqu 16(%ecx), %xmm1
  2216. pxor %xmm0, %xmm4
  2217. pxor %xmm1, %xmm5
  2218. movdqu %xmm0, 112(%esp)
  2219. movdqu %xmm1, 128(%esp)
  2220. movdqu %xmm4, (%edx)
  2221. movdqu %xmm5, 16(%edx)
  2222. aesenclast %xmm3, %xmm6
  2223. aesenclast %xmm3, %xmm7
  2224. movdqu 32(%ecx), %xmm0
  2225. movdqu 48(%ecx), %xmm1
  2226. pxor %xmm0, %xmm6
  2227. pxor %xmm1, %xmm7
  2228. movdqu %xmm0, 144(%esp)
  2229. movdqu %xmm1, 160(%esp)
  2230. movdqu %xmm6, 32(%edx)
  2231. movdqu %xmm7, 48(%edx)
  2232. # ghash encrypted counter
  2233. movdqu 96(%esp), %xmm6
  2234. movdqu 48(%esp), %xmm3
  2235. movdqu 112(%esp), %xmm4
  2236. pshufb L_aes_gcm_bswap_mask, %xmm4
  2237. pxor %xmm6, %xmm4
  2238. pshufd $0x4e, %xmm3, %xmm5
  2239. pshufd $0x4e, %xmm4, %xmm1
  2240. pxor %xmm3, %xmm5
  2241. pxor %xmm4, %xmm1
  2242. movdqa %xmm4, %xmm7
  2243. pclmulqdq $0x11, %xmm3, %xmm7
  2244. movdqa %xmm4, %xmm6
  2245. pclmulqdq $0x00, %xmm3, %xmm6
  2246. pclmulqdq $0x00, %xmm1, %xmm5
  2247. pxor %xmm6, %xmm5
  2248. pxor %xmm7, %xmm5
  2249. movdqu 32(%esp), %xmm3
  2250. movdqu 128(%esp), %xmm4
  2251. pshufd $0x4e, %xmm3, %xmm0
  2252. pshufb L_aes_gcm_bswap_mask, %xmm4
  2253. pxor %xmm3, %xmm0
  2254. pshufd $0x4e, %xmm4, %xmm1
  2255. pxor %xmm4, %xmm1
  2256. movdqa %xmm4, %xmm2
  2257. pclmulqdq $0x11, %xmm3, %xmm2
  2258. pclmulqdq $0x00, %xmm4, %xmm3
  2259. pclmulqdq $0x00, %xmm1, %xmm0
  2260. pxor %xmm3, %xmm5
  2261. pxor %xmm3, %xmm6
  2262. pxor %xmm2, %xmm5
  2263. pxor %xmm2, %xmm7
  2264. pxor %xmm0, %xmm5
  2265. movdqu 16(%esp), %xmm3
  2266. movdqu 144(%esp), %xmm4
  2267. pshufd $0x4e, %xmm3, %xmm0
  2268. pshufb L_aes_gcm_bswap_mask, %xmm4
  2269. pxor %xmm3, %xmm0
  2270. pshufd $0x4e, %xmm4, %xmm1
  2271. pxor %xmm4, %xmm1
  2272. movdqa %xmm4, %xmm2
  2273. pclmulqdq $0x11, %xmm3, %xmm2
  2274. pclmulqdq $0x00, %xmm4, %xmm3
  2275. pclmulqdq $0x00, %xmm1, %xmm0
  2276. pxor %xmm3, %xmm5
  2277. pxor %xmm3, %xmm6
  2278. pxor %xmm2, %xmm5
  2279. pxor %xmm2, %xmm7
  2280. pxor %xmm0, %xmm5
  2281. movdqu (%esp), %xmm3
  2282. movdqu 160(%esp), %xmm4
  2283. pshufd $0x4e, %xmm3, %xmm0
  2284. pshufb L_aes_gcm_bswap_mask, %xmm4
  2285. pxor %xmm3, %xmm0
  2286. pshufd $0x4e, %xmm4, %xmm1
  2287. pxor %xmm4, %xmm1
  2288. movdqa %xmm4, %xmm2
  2289. pclmulqdq $0x11, %xmm3, %xmm2
  2290. pclmulqdq $0x00, %xmm4, %xmm3
  2291. pclmulqdq $0x00, %xmm1, %xmm0
  2292. pxor %xmm3, %xmm5
  2293. pxor %xmm3, %xmm6
  2294. pxor %xmm2, %xmm5
  2295. pxor %xmm2, %xmm7
  2296. pxor %xmm0, %xmm5
  2297. movdqa %xmm5, %xmm1
  2298. psrldq $8, %xmm5
  2299. pslldq $8, %xmm1
  2300. pxor %xmm1, %xmm6
  2301. pxor %xmm5, %xmm7
  2302. movdqa %xmm6, %xmm3
  2303. movdqa %xmm6, %xmm0
  2304. movdqa %xmm6, %xmm1
  2305. pslld $31, %xmm3
  2306. pslld $30, %xmm0
  2307. pslld $25, %xmm1
  2308. pxor %xmm0, %xmm3
  2309. pxor %xmm1, %xmm3
  2310. movdqa %xmm3, %xmm0
  2311. pslldq $12, %xmm3
  2312. psrldq $4, %xmm0
  2313. pxor %xmm3, %xmm6
  2314. movdqa %xmm6, %xmm1
  2315. movdqa %xmm6, %xmm5
  2316. movdqa %xmm6, %xmm4
  2317. psrld $0x01, %xmm1
  2318. psrld $2, %xmm5
  2319. psrld $7, %xmm4
  2320. pxor %xmm5, %xmm1
  2321. pxor %xmm4, %xmm1
  2322. pxor %xmm0, %xmm1
  2323. pxor %xmm1, %xmm6
  2324. pxor %xmm7, %xmm6
  2325. movdqu %xmm6, 96(%esp)
  2326. addl $0x40, %ebx
  2327. cmpl %eax, %ebx
  2328. jl L_AES_GCM_decrypt_ghash_64_inplace
  2329. jmp L_AES_GCM_decrypt_ghash_64_done
  2330. L_AES_GCM_decrypt_ghash_64:
  2331. leal (%esi,%ebx,1), %ecx
  2332. leal (%edi,%ebx,1), %edx
  2333. # Encrypt 64 bytes of counter
  2334. movdqu 64(%esp), %xmm4
  2335. movdqa L_aes_gcm_bswap_epi64, %xmm3
  2336. movdqa %xmm4, %xmm5
  2337. movdqa %xmm4, %xmm6
  2338. movdqa %xmm4, %xmm7
  2339. pshufb %xmm3, %xmm4
  2340. paddd L_aes_gcm_one, %xmm5
  2341. pshufb %xmm3, %xmm5
  2342. paddd L_aes_gcm_two, %xmm6
  2343. pshufb %xmm3, %xmm6
  2344. paddd L_aes_gcm_three, %xmm7
  2345. pshufb %xmm3, %xmm7
  2346. movdqu 64(%esp), %xmm3
  2347. paddd L_aes_gcm_four, %xmm3
  2348. movdqu %xmm3, 64(%esp)
  2349. movdqa (%ebp), %xmm3
  2350. pxor %xmm3, %xmm4
  2351. pxor %xmm3, %xmm5
  2352. pxor %xmm3, %xmm6
  2353. pxor %xmm3, %xmm7
  2354. movdqa 16(%ebp), %xmm3
  2355. aesenc %xmm3, %xmm4
  2356. aesenc %xmm3, %xmm5
  2357. aesenc %xmm3, %xmm6
  2358. aesenc %xmm3, %xmm7
  2359. movdqa 32(%ebp), %xmm3
  2360. aesenc %xmm3, %xmm4
  2361. aesenc %xmm3, %xmm5
  2362. aesenc %xmm3, %xmm6
  2363. aesenc %xmm3, %xmm7
  2364. movdqa 48(%ebp), %xmm3
  2365. aesenc %xmm3, %xmm4
  2366. aesenc %xmm3, %xmm5
  2367. aesenc %xmm3, %xmm6
  2368. aesenc %xmm3, %xmm7
  2369. movdqa 64(%ebp), %xmm3
  2370. aesenc %xmm3, %xmm4
  2371. aesenc %xmm3, %xmm5
  2372. aesenc %xmm3, %xmm6
  2373. aesenc %xmm3, %xmm7
  2374. movdqa 80(%ebp), %xmm3
  2375. aesenc %xmm3, %xmm4
  2376. aesenc %xmm3, %xmm5
  2377. aesenc %xmm3, %xmm6
  2378. aesenc %xmm3, %xmm7
  2379. movdqa 96(%ebp), %xmm3
  2380. aesenc %xmm3, %xmm4
  2381. aesenc %xmm3, %xmm5
  2382. aesenc %xmm3, %xmm6
  2383. aesenc %xmm3, %xmm7
  2384. movdqa 112(%ebp), %xmm3
  2385. aesenc %xmm3, %xmm4
  2386. aesenc %xmm3, %xmm5
  2387. aesenc %xmm3, %xmm6
  2388. aesenc %xmm3, %xmm7
  2389. movdqa 128(%ebp), %xmm3
  2390. aesenc %xmm3, %xmm4
  2391. aesenc %xmm3, %xmm5
  2392. aesenc %xmm3, %xmm6
  2393. aesenc %xmm3, %xmm7
  2394. movdqa 144(%ebp), %xmm3
  2395. aesenc %xmm3, %xmm4
  2396. aesenc %xmm3, %xmm5
  2397. aesenc %xmm3, %xmm6
  2398. aesenc %xmm3, %xmm7
  2399. cmpl $11, 236(%esp)
  2400. movdqa 160(%ebp), %xmm3
  2401. jl L_AES_GCM_decrypt_aesenc_64_ghash_avx_done
  2402. aesenc %xmm3, %xmm4
  2403. aesenc %xmm3, %xmm5
  2404. aesenc %xmm3, %xmm6
  2405. aesenc %xmm3, %xmm7
  2406. movdqa 176(%ebp), %xmm3
  2407. aesenc %xmm3, %xmm4
  2408. aesenc %xmm3, %xmm5
  2409. aesenc %xmm3, %xmm6
  2410. aesenc %xmm3, %xmm7
  2411. cmpl $13, 236(%esp)
  2412. movdqa 192(%ebp), %xmm3
  2413. jl L_AES_GCM_decrypt_aesenc_64_ghash_avx_done
  2414. aesenc %xmm3, %xmm4
  2415. aesenc %xmm3, %xmm5
  2416. aesenc %xmm3, %xmm6
  2417. aesenc %xmm3, %xmm7
  2418. movdqa 208(%ebp), %xmm3
  2419. aesenc %xmm3, %xmm4
  2420. aesenc %xmm3, %xmm5
  2421. aesenc %xmm3, %xmm6
  2422. aesenc %xmm3, %xmm7
  2423. movdqa 224(%ebp), %xmm3
  2424. L_AES_GCM_decrypt_aesenc_64_ghash_avx_done:
  2425. aesenclast %xmm3, %xmm4
  2426. aesenclast %xmm3, %xmm5
  2427. movdqu (%ecx), %xmm0
  2428. movdqu 16(%ecx), %xmm1
  2429. pxor %xmm0, %xmm4
  2430. pxor %xmm1, %xmm5
  2431. movdqu %xmm0, (%ecx)
  2432. movdqu %xmm1, 16(%ecx)
  2433. movdqu %xmm4, (%edx)
  2434. movdqu %xmm5, 16(%edx)
  2435. aesenclast %xmm3, %xmm6
  2436. aesenclast %xmm3, %xmm7
  2437. movdqu 32(%ecx), %xmm0
  2438. movdqu 48(%ecx), %xmm1
  2439. pxor %xmm0, %xmm6
  2440. pxor %xmm1, %xmm7
  2441. movdqu %xmm0, 32(%ecx)
  2442. movdqu %xmm1, 48(%ecx)
  2443. movdqu %xmm6, 32(%edx)
  2444. movdqu %xmm7, 48(%edx)
  2445. # ghash encrypted counter
  2446. movdqu 96(%esp), %xmm6
  2447. movdqu 48(%esp), %xmm3
  2448. movdqu (%ecx), %xmm4
  2449. pshufb L_aes_gcm_bswap_mask, %xmm4
  2450. pxor %xmm6, %xmm4
  2451. pshufd $0x4e, %xmm3, %xmm5
  2452. pshufd $0x4e, %xmm4, %xmm1
  2453. pxor %xmm3, %xmm5
  2454. pxor %xmm4, %xmm1
  2455. movdqa %xmm4, %xmm7
  2456. pclmulqdq $0x11, %xmm3, %xmm7
  2457. movdqa %xmm4, %xmm6
  2458. pclmulqdq $0x00, %xmm3, %xmm6
  2459. pclmulqdq $0x00, %xmm1, %xmm5
  2460. pxor %xmm6, %xmm5
  2461. pxor %xmm7, %xmm5
  2462. movdqu 32(%esp), %xmm3
  2463. movdqu 16(%ecx), %xmm4
  2464. pshufd $0x4e, %xmm3, %xmm0
  2465. pshufb L_aes_gcm_bswap_mask, %xmm4
  2466. pxor %xmm3, %xmm0
  2467. pshufd $0x4e, %xmm4, %xmm1
  2468. pxor %xmm4, %xmm1
  2469. movdqa %xmm4, %xmm2
  2470. pclmulqdq $0x11, %xmm3, %xmm2
  2471. pclmulqdq $0x00, %xmm4, %xmm3
  2472. pclmulqdq $0x00, %xmm1, %xmm0
  2473. pxor %xmm3, %xmm5
  2474. pxor %xmm3, %xmm6
  2475. pxor %xmm2, %xmm5
  2476. pxor %xmm2, %xmm7
  2477. pxor %xmm0, %xmm5
  2478. movdqu 16(%esp), %xmm3
  2479. movdqu 32(%ecx), %xmm4
  2480. pshufd $0x4e, %xmm3, %xmm0
  2481. pshufb L_aes_gcm_bswap_mask, %xmm4
  2482. pxor %xmm3, %xmm0
  2483. pshufd $0x4e, %xmm4, %xmm1
  2484. pxor %xmm4, %xmm1
  2485. movdqa %xmm4, %xmm2
  2486. pclmulqdq $0x11, %xmm3, %xmm2
  2487. pclmulqdq $0x00, %xmm4, %xmm3
  2488. pclmulqdq $0x00, %xmm1, %xmm0
  2489. pxor %xmm3, %xmm5
  2490. pxor %xmm3, %xmm6
  2491. pxor %xmm2, %xmm5
  2492. pxor %xmm2, %xmm7
  2493. pxor %xmm0, %xmm5
  2494. movdqu (%esp), %xmm3
  2495. movdqu 48(%ecx), %xmm4
  2496. pshufd $0x4e, %xmm3, %xmm0
  2497. pshufb L_aes_gcm_bswap_mask, %xmm4
  2498. pxor %xmm3, %xmm0
  2499. pshufd $0x4e, %xmm4, %xmm1
  2500. pxor %xmm4, %xmm1
  2501. movdqa %xmm4, %xmm2
  2502. pclmulqdq $0x11, %xmm3, %xmm2
  2503. pclmulqdq $0x00, %xmm4, %xmm3
  2504. pclmulqdq $0x00, %xmm1, %xmm0
  2505. pxor %xmm3, %xmm5
  2506. pxor %xmm3, %xmm6
  2507. pxor %xmm2, %xmm5
  2508. pxor %xmm2, %xmm7
  2509. pxor %xmm0, %xmm5
  2510. movdqa %xmm5, %xmm1
  2511. psrldq $8, %xmm5
  2512. pslldq $8, %xmm1
  2513. pxor %xmm1, %xmm6
  2514. pxor %xmm5, %xmm7
  2515. movdqa %xmm6, %xmm3
  2516. movdqa %xmm6, %xmm0
  2517. movdqa %xmm6, %xmm1
  2518. pslld $31, %xmm3
  2519. pslld $30, %xmm0
  2520. pslld $25, %xmm1
  2521. pxor %xmm0, %xmm3
  2522. pxor %xmm1, %xmm3
  2523. movdqa %xmm3, %xmm0
  2524. pslldq $12, %xmm3
  2525. psrldq $4, %xmm0
  2526. pxor %xmm3, %xmm6
  2527. movdqa %xmm6, %xmm1
  2528. movdqa %xmm6, %xmm5
  2529. movdqa %xmm6, %xmm4
  2530. psrld $0x01, %xmm1
  2531. psrld $2, %xmm5
  2532. psrld $7, %xmm4
  2533. pxor %xmm5, %xmm1
  2534. pxor %xmm4, %xmm1
  2535. pxor %xmm0, %xmm1
  2536. pxor %xmm1, %xmm6
  2537. pxor %xmm7, %xmm6
  2538. movdqu %xmm6, 96(%esp)
  2539. addl $0x40, %ebx
  2540. cmpl %eax, %ebx
  2541. jl L_AES_GCM_decrypt_ghash_64
  2542. L_AES_GCM_decrypt_ghash_64_done:
  2543. movdqa %xmm6, %xmm2
  2544. movdqu (%esp), %xmm1
  2545. L_AES_GCM_decrypt_done_64:
  2546. movl 216(%esp), %edx
  2547. cmpl %edx, %ebx
  2548. jge L_AES_GCM_decrypt_done_dec
  2549. movl 216(%esp), %eax
  2550. andl $0xfffffff0, %eax
  2551. cmpl %eax, %ebx
  2552. jge L_AES_GCM_decrypt_last_block_done
  2553. L_AES_GCM_decrypt_last_block_start:
  2554. leal (%esi,%ebx,1), %ecx
  2555. leal (%edi,%ebx,1), %edx
  2556. movdqu (%ecx), %xmm5
  2557. pshufb L_aes_gcm_bswap_mask, %xmm5
  2558. pxor %xmm2, %xmm5
  2559. movdqu %xmm5, (%esp)
  2560. movdqu 64(%esp), %xmm4
  2561. movdqa %xmm4, %xmm5
  2562. pshufb L_aes_gcm_bswap_epi64, %xmm4
  2563. paddd L_aes_gcm_one, %xmm5
  2564. pxor (%ebp), %xmm4
  2565. movdqu %xmm5, 64(%esp)
  2566. movdqu (%esp), %xmm0
  2567. pclmulqdq $16, %xmm1, %xmm0
  2568. aesenc 16(%ebp), %xmm4
  2569. aesenc 32(%ebp), %xmm4
  2570. movdqu (%esp), %xmm3
  2571. pclmulqdq $0x01, %xmm1, %xmm3
  2572. aesenc 48(%ebp), %xmm4
  2573. aesenc 64(%ebp), %xmm4
  2574. aesenc 80(%ebp), %xmm4
  2575. movdqu (%esp), %xmm5
  2576. pclmulqdq $0x11, %xmm1, %xmm5
  2577. aesenc 96(%ebp), %xmm4
  2578. pxor %xmm3, %xmm0
  2579. movdqa %xmm0, %xmm6
  2580. psrldq $8, %xmm0
  2581. pslldq $8, %xmm6
  2582. aesenc 112(%ebp), %xmm4
  2583. movdqu (%esp), %xmm3
  2584. pclmulqdq $0x00, %xmm1, %xmm3
  2585. pxor %xmm3, %xmm6
  2586. pxor %xmm0, %xmm5
  2587. movdqa L_aes_gcm_mod2_128, %xmm7
  2588. movdqa %xmm6, %xmm3
  2589. pclmulqdq $16, %xmm7, %xmm3
  2590. aesenc 128(%ebp), %xmm4
  2591. pshufd $0x4e, %xmm6, %xmm0
  2592. pxor %xmm3, %xmm0
  2593. movdqa %xmm0, %xmm3
  2594. pclmulqdq $16, %xmm7, %xmm3
  2595. aesenc 144(%ebp), %xmm4
  2596. pshufd $0x4e, %xmm0, %xmm2
  2597. pxor %xmm3, %xmm2
  2598. pxor %xmm5, %xmm2
  2599. cmpl $11, 236(%esp)
  2600. movdqa 160(%ebp), %xmm5
  2601. jl L_AES_GCM_decrypt_aesenc_gfmul_last
  2602. aesenc %xmm5, %xmm4
  2603. aesenc 176(%ebp), %xmm4
  2604. cmpl $13, 236(%esp)
  2605. movdqa 192(%ebp), %xmm5
  2606. jl L_AES_GCM_decrypt_aesenc_gfmul_last
  2607. aesenc %xmm5, %xmm4
  2608. aesenc 208(%ebp), %xmm4
  2609. movdqa 224(%ebp), %xmm5
  2610. L_AES_GCM_decrypt_aesenc_gfmul_last:
  2611. aesenclast %xmm5, %xmm4
  2612. movdqu (%ecx), %xmm5
  2613. pxor %xmm5, %xmm4
  2614. movdqu %xmm4, (%edx)
  2615. addl $16, %ebx
  2616. cmpl %eax, %ebx
  2617. jl L_AES_GCM_decrypt_last_block_start
  2618. L_AES_GCM_decrypt_last_block_done:
  2619. movl 216(%esp), %ecx
  2620. movl %ecx, %edx
  2621. andl $15, %ecx
  2622. jz L_AES_GCM_decrypt_aesenc_last15_dec_avx_done
  2623. movdqu 64(%esp), %xmm0
  2624. pshufb L_aes_gcm_bswap_epi64, %xmm0
  2625. pxor (%ebp), %xmm0
  2626. aesenc 16(%ebp), %xmm0
  2627. aesenc 32(%ebp), %xmm0
  2628. aesenc 48(%ebp), %xmm0
  2629. aesenc 64(%ebp), %xmm0
  2630. aesenc 80(%ebp), %xmm0
  2631. aesenc 96(%ebp), %xmm0
  2632. aesenc 112(%ebp), %xmm0
  2633. aesenc 128(%ebp), %xmm0
  2634. aesenc 144(%ebp), %xmm0
  2635. cmpl $11, 236(%esp)
  2636. movdqa 160(%ebp), %xmm5
  2637. jl L_AES_GCM_decrypt_aesenc_last15_dec_avx_aesenc_avx_last
  2638. aesenc %xmm5, %xmm0
  2639. aesenc 176(%ebp), %xmm0
  2640. cmpl $13, 236(%esp)
  2641. movdqa 192(%ebp), %xmm5
  2642. jl L_AES_GCM_decrypt_aesenc_last15_dec_avx_aesenc_avx_last
  2643. aesenc %xmm5, %xmm0
  2644. aesenc 208(%ebp), %xmm0
  2645. movdqa 224(%ebp), %xmm5
  2646. L_AES_GCM_decrypt_aesenc_last15_dec_avx_aesenc_avx_last:
  2647. aesenclast %xmm5, %xmm0
  2648. subl $32, %esp
  2649. xorl %ecx, %ecx
  2650. movdqu %xmm0, (%esp)
  2651. pxor %xmm4, %xmm4
  2652. movdqu %xmm4, 16(%esp)
  2653. L_AES_GCM_decrypt_aesenc_last15_dec_avx_loop:
  2654. movzbl (%esi,%ebx,1), %eax
  2655. movb %al, 16(%esp,%ecx,1)
  2656. xorb (%esp,%ecx,1), %al
  2657. movb %al, (%edi,%ebx,1)
  2658. incl %ebx
  2659. incl %ecx
  2660. cmpl %edx, %ebx
  2661. jl L_AES_GCM_decrypt_aesenc_last15_dec_avx_loop
  2662. movdqu 16(%esp), %xmm0
  2663. addl $32, %esp
  2664. pshufb L_aes_gcm_bswap_mask, %xmm0
  2665. pxor %xmm0, %xmm2
  2666. pshufd $0x4e, %xmm1, %xmm5
  2667. pshufd $0x4e, %xmm2, %xmm6
  2668. movdqa %xmm2, %xmm7
  2669. movdqa %xmm2, %xmm4
  2670. pclmulqdq $0x11, %xmm1, %xmm7
  2671. pclmulqdq $0x00, %xmm1, %xmm4
  2672. pxor %xmm1, %xmm5
  2673. pxor %xmm2, %xmm6
  2674. pclmulqdq $0x00, %xmm6, %xmm5
  2675. pxor %xmm4, %xmm5
  2676. pxor %xmm7, %xmm5
  2677. movdqa %xmm5, %xmm6
  2678. movdqa %xmm7, %xmm2
  2679. pslldq $8, %xmm6
  2680. psrldq $8, %xmm5
  2681. pxor %xmm6, %xmm4
  2682. pxor %xmm5, %xmm2
  2683. movdqa %xmm4, %xmm5
  2684. movdqa %xmm4, %xmm6
  2685. movdqa %xmm4, %xmm7
  2686. pslld $31, %xmm5
  2687. pslld $30, %xmm6
  2688. pslld $25, %xmm7
  2689. pxor %xmm6, %xmm5
  2690. pxor %xmm7, %xmm5
  2691. movdqa %xmm5, %xmm7
  2692. psrldq $4, %xmm7
  2693. pslldq $12, %xmm5
  2694. pxor %xmm5, %xmm4
  2695. movdqa %xmm4, %xmm5
  2696. movdqa %xmm4, %xmm6
  2697. psrld $0x01, %xmm5
  2698. psrld $2, %xmm6
  2699. pxor %xmm6, %xmm5
  2700. pxor %xmm4, %xmm5
  2701. psrld $7, %xmm4
  2702. pxor %xmm7, %xmm5
  2703. pxor %xmm4, %xmm5
  2704. pxor %xmm5, %xmm2
  2705. L_AES_GCM_decrypt_aesenc_last15_dec_avx_done:
  2706. L_AES_GCM_decrypt_done_dec:
  2707. movl 212(%esp), %esi
  2708. movl 228(%esp), %ebp
  2709. movl 216(%esp), %edx
  2710. movl 220(%esp), %ecx
  2711. shll $3, %edx
  2712. shll $3, %ecx
  2713. pinsrd $0x00, %edx, %xmm4
  2714. pinsrd $2, %ecx, %xmm4
  2715. movl 216(%esp), %edx
  2716. movl 220(%esp), %ecx
  2717. shrl $29, %edx
  2718. shrl $29, %ecx
  2719. pinsrd $0x01, %edx, %xmm4
  2720. pinsrd $3, %ecx, %xmm4
  2721. pxor %xmm4, %xmm2
  2722. pshufd $0x4e, %xmm1, %xmm5
  2723. pshufd $0x4e, %xmm2, %xmm6
  2724. movdqa %xmm2, %xmm7
  2725. movdqa %xmm2, %xmm4
  2726. pclmulqdq $0x11, %xmm1, %xmm7
  2727. pclmulqdq $0x00, %xmm1, %xmm4
  2728. pxor %xmm1, %xmm5
  2729. pxor %xmm2, %xmm6
  2730. pclmulqdq $0x00, %xmm6, %xmm5
  2731. pxor %xmm4, %xmm5
  2732. pxor %xmm7, %xmm5
  2733. movdqa %xmm5, %xmm6
  2734. movdqa %xmm7, %xmm2
  2735. pslldq $8, %xmm6
  2736. psrldq $8, %xmm5
  2737. pxor %xmm6, %xmm4
  2738. pxor %xmm5, %xmm2
  2739. movdqa %xmm4, %xmm5
  2740. movdqa %xmm4, %xmm6
  2741. movdqa %xmm4, %xmm7
  2742. pslld $31, %xmm5
  2743. pslld $30, %xmm6
  2744. pslld $25, %xmm7
  2745. pxor %xmm6, %xmm5
  2746. pxor %xmm7, %xmm5
  2747. movdqa %xmm5, %xmm7
  2748. psrldq $4, %xmm7
  2749. pslldq $12, %xmm5
  2750. pxor %xmm5, %xmm4
  2751. movdqa %xmm4, %xmm5
  2752. movdqa %xmm4, %xmm6
  2753. psrld $0x01, %xmm5
  2754. psrld $2, %xmm6
  2755. pxor %xmm6, %xmm5
  2756. pxor %xmm4, %xmm5
  2757. psrld $7, %xmm4
  2758. pxor %xmm7, %xmm5
  2759. pxor %xmm4, %xmm5
  2760. pxor %xmm5, %xmm2
  2761. pshufb L_aes_gcm_bswap_mask, %xmm2
  2762. movdqu 80(%esp), %xmm4
  2763. pxor %xmm2, %xmm4
  2764. movl 240(%esp), %edi
  2765. cmpl $16, %ebp
  2766. je L_AES_GCM_decrypt_cmp_tag_16
  2767. subl $16, %esp
  2768. xorl %ecx, %ecx
  2769. xorl %ebx, %ebx
  2770. movdqu %xmm4, (%esp)
  2771. L_AES_GCM_decrypt_cmp_tag_loop:
  2772. movzbl (%esp,%ecx,1), %eax
  2773. xorb (%esi,%ecx,1), %al
  2774. orb %al, %bl
  2775. incl %ecx
  2776. cmpl %ebp, %ecx
  2777. jne L_AES_GCM_decrypt_cmp_tag_loop
  2778. cmpb $0x00, %bl
  2779. sete %bl
  2780. addl $16, %esp
  2781. xorl %ecx, %ecx
  2782. jmp L_AES_GCM_decrypt_cmp_tag_done
  2783. L_AES_GCM_decrypt_cmp_tag_16:
  2784. movdqu (%esi), %xmm5
  2785. pcmpeqb %xmm5, %xmm4
  2786. pmovmskb %xmm4, %edx
  2787. # %%edx == 0xFFFF then return 1 else => return 0
  2788. xorl %ebx, %ebx
  2789. cmpl $0xffff, %edx
  2790. sete %bl
  2791. L_AES_GCM_decrypt_cmp_tag_done:
  2792. movl %ebx, (%edi)
  2793. addl $0xb0, %esp
  2794. popl %ebp
  2795. popl %edi
  2796. popl %esi
  2797. popl %ebx
  2798. ret
  2799. .size AES_GCM_decrypt,.-AES_GCM_decrypt
  2800. #ifdef WOLFSSL_AESGCM_STREAM
  2801. .text
  2802. .globl AES_GCM_init_aesni
  2803. .type AES_GCM_init_aesni,@function
  2804. .align 16
  2805. AES_GCM_init_aesni:
  2806. pushl %ebx
  2807. pushl %esi
  2808. pushl %edi
  2809. pushl %ebp
  2810. subl $16, %esp
  2811. movl 36(%esp), %ebp
  2812. movl 44(%esp), %esi
  2813. movl 60(%esp), %edi
  2814. pxor %xmm4, %xmm4
  2815. movl 48(%esp), %edx
  2816. cmpl $12, %edx
  2817. jne L_AES_GCM_init_aesni_iv_not_12
  2818. # # Calculate values when IV is 12 bytes
  2819. # Set counter based on IV
  2820. movl $0x1000000, %ecx
  2821. pinsrd $0x00, (%esi), %xmm4
  2822. pinsrd $0x01, 4(%esi), %xmm4
  2823. pinsrd $2, 8(%esi), %xmm4
  2824. pinsrd $3, %ecx, %xmm4
  2825. # H = Encrypt X(=0) and T = Encrypt counter
  2826. movdqa %xmm4, %xmm1
  2827. movdqa (%ebp), %xmm5
  2828. pxor %xmm5, %xmm1
  2829. movdqa 16(%ebp), %xmm7
  2830. aesenc %xmm7, %xmm5
  2831. aesenc %xmm7, %xmm1
  2832. movdqa 32(%ebp), %xmm7
  2833. aesenc %xmm7, %xmm5
  2834. aesenc %xmm7, %xmm1
  2835. movdqa 48(%ebp), %xmm7
  2836. aesenc %xmm7, %xmm5
  2837. aesenc %xmm7, %xmm1
  2838. movdqa 64(%ebp), %xmm7
  2839. aesenc %xmm7, %xmm5
  2840. aesenc %xmm7, %xmm1
  2841. movdqa 80(%ebp), %xmm7
  2842. aesenc %xmm7, %xmm5
  2843. aesenc %xmm7, %xmm1
  2844. movdqa 96(%ebp), %xmm7
  2845. aesenc %xmm7, %xmm5
  2846. aesenc %xmm7, %xmm1
  2847. movdqa 112(%ebp), %xmm7
  2848. aesenc %xmm7, %xmm5
  2849. aesenc %xmm7, %xmm1
  2850. movdqa 128(%ebp), %xmm7
  2851. aesenc %xmm7, %xmm5
  2852. aesenc %xmm7, %xmm1
  2853. movdqa 144(%ebp), %xmm7
  2854. aesenc %xmm7, %xmm5
  2855. aesenc %xmm7, %xmm1
  2856. cmpl $11, 40(%esp)
  2857. movdqa 160(%ebp), %xmm7
  2858. jl L_AES_GCM_init_aesni_calc_iv_12_last
  2859. aesenc %xmm7, %xmm5
  2860. aesenc %xmm7, %xmm1
  2861. movdqa 176(%ebp), %xmm7
  2862. aesenc %xmm7, %xmm5
  2863. aesenc %xmm7, %xmm1
  2864. cmpl $13, 40(%esp)
  2865. movdqa 192(%ebp), %xmm7
  2866. jl L_AES_GCM_init_aesni_calc_iv_12_last
  2867. aesenc %xmm7, %xmm5
  2868. aesenc %xmm7, %xmm1
  2869. movdqa 208(%ebp), %xmm7
  2870. aesenc %xmm7, %xmm5
  2871. aesenc %xmm7, %xmm1
  2872. movdqa 224(%ebp), %xmm7
  2873. L_AES_GCM_init_aesni_calc_iv_12_last:
  2874. aesenclast %xmm7, %xmm5
  2875. aesenclast %xmm7, %xmm1
  2876. pshufb L_aes_gcm_bswap_mask, %xmm5
  2877. movdqu %xmm1, (%edi)
  2878. jmp L_AES_GCM_init_aesni_iv_done
  2879. L_AES_GCM_init_aesni_iv_not_12:
  2880. # Calculate values when IV is not 12 bytes
  2881. # H = Encrypt X(=0)
  2882. movdqa (%ebp), %xmm5
  2883. aesenc 16(%ebp), %xmm5
  2884. aesenc 32(%ebp), %xmm5
  2885. aesenc 48(%ebp), %xmm5
  2886. aesenc 64(%ebp), %xmm5
  2887. aesenc 80(%ebp), %xmm5
  2888. aesenc 96(%ebp), %xmm5
  2889. aesenc 112(%ebp), %xmm5
  2890. aesenc 128(%ebp), %xmm5
  2891. aesenc 144(%ebp), %xmm5
  2892. cmpl $11, 40(%esp)
  2893. movdqa 160(%ebp), %xmm1
  2894. jl L_AES_GCM_init_aesni_calc_iv_1_aesenc_avx_last
  2895. aesenc %xmm1, %xmm5
  2896. aesenc 176(%ebp), %xmm5
  2897. cmpl $13, 40(%esp)
  2898. movdqa 192(%ebp), %xmm1
  2899. jl L_AES_GCM_init_aesni_calc_iv_1_aesenc_avx_last
  2900. aesenc %xmm1, %xmm5
  2901. aesenc 208(%ebp), %xmm5
  2902. movdqa 224(%ebp), %xmm1
  2903. L_AES_GCM_init_aesni_calc_iv_1_aesenc_avx_last:
  2904. aesenclast %xmm1, %xmm5
  2905. pshufb L_aes_gcm_bswap_mask, %xmm5
  2906. # Calc counter
  2907. # Initialization vector
  2908. cmpl $0x00, %edx
  2909. movl $0x00, %ecx
  2910. je L_AES_GCM_init_aesni_calc_iv_done
  2911. cmpl $16, %edx
  2912. jl L_AES_GCM_init_aesni_calc_iv_lt16
  2913. andl $0xfffffff0, %edx
  2914. L_AES_GCM_init_aesni_calc_iv_16_loop:
  2915. movdqu (%esi,%ecx,1), %xmm0
  2916. pshufb L_aes_gcm_bswap_mask, %xmm0
  2917. pxor %xmm0, %xmm4
  2918. pshufd $0x4e, %xmm4, %xmm1
  2919. pshufd $0x4e, %xmm5, %xmm2
  2920. movdqa %xmm5, %xmm3
  2921. movdqa %xmm5, %xmm0
  2922. pclmulqdq $0x11, %xmm4, %xmm3
  2923. pclmulqdq $0x00, %xmm4, %xmm0
  2924. pxor %xmm4, %xmm1
  2925. pxor %xmm5, %xmm2
  2926. pclmulqdq $0x00, %xmm2, %xmm1
  2927. pxor %xmm0, %xmm1
  2928. pxor %xmm3, %xmm1
  2929. movdqa %xmm1, %xmm2
  2930. movdqa %xmm0, %xmm7
  2931. movdqa %xmm3, %xmm4
  2932. pslldq $8, %xmm2
  2933. psrldq $8, %xmm1
  2934. pxor %xmm2, %xmm7
  2935. pxor %xmm1, %xmm4
  2936. movdqa %xmm7, %xmm0
  2937. movdqa %xmm4, %xmm1
  2938. psrld $31, %xmm0
  2939. psrld $31, %xmm1
  2940. pslld $0x01, %xmm7
  2941. pslld $0x01, %xmm4
  2942. movdqa %xmm0, %xmm2
  2943. pslldq $4, %xmm0
  2944. psrldq $12, %xmm2
  2945. pslldq $4, %xmm1
  2946. por %xmm2, %xmm4
  2947. por %xmm0, %xmm7
  2948. por %xmm1, %xmm4
  2949. movdqa %xmm7, %xmm0
  2950. movdqa %xmm7, %xmm1
  2951. movdqa %xmm7, %xmm2
  2952. pslld $31, %xmm0
  2953. pslld $30, %xmm1
  2954. pslld $25, %xmm2
  2955. pxor %xmm1, %xmm0
  2956. pxor %xmm2, %xmm0
  2957. movdqa %xmm0, %xmm1
  2958. psrldq $4, %xmm1
  2959. pslldq $12, %xmm0
  2960. pxor %xmm0, %xmm7
  2961. movdqa %xmm7, %xmm2
  2962. movdqa %xmm7, %xmm3
  2963. movdqa %xmm7, %xmm0
  2964. psrld $0x01, %xmm2
  2965. psrld $2, %xmm3
  2966. psrld $7, %xmm0
  2967. pxor %xmm3, %xmm2
  2968. pxor %xmm0, %xmm2
  2969. pxor %xmm1, %xmm2
  2970. pxor %xmm7, %xmm2
  2971. pxor %xmm2, %xmm4
  2972. addl $16, %ecx
  2973. cmpl %edx, %ecx
  2974. jl L_AES_GCM_init_aesni_calc_iv_16_loop
  2975. movl 48(%esp), %edx
  2976. cmpl %edx, %ecx
  2977. je L_AES_GCM_init_aesni_calc_iv_done
  2978. L_AES_GCM_init_aesni_calc_iv_lt16:
  2979. subl $16, %esp
  2980. pxor %xmm0, %xmm0
  2981. xorl %ebx, %ebx
  2982. movdqu %xmm0, (%esp)
  2983. L_AES_GCM_init_aesni_calc_iv_loop:
  2984. movzbl (%esi,%ecx,1), %eax
  2985. movb %al, (%esp,%ebx,1)
  2986. incl %ecx
  2987. incl %ebx
  2988. cmpl %edx, %ecx
  2989. jl L_AES_GCM_init_aesni_calc_iv_loop
  2990. movdqu (%esp), %xmm0
  2991. addl $16, %esp
  2992. pshufb L_aes_gcm_bswap_mask, %xmm0
  2993. pxor %xmm0, %xmm4
  2994. pshufd $0x4e, %xmm4, %xmm1
  2995. pshufd $0x4e, %xmm5, %xmm2
  2996. movdqa %xmm5, %xmm3
  2997. movdqa %xmm5, %xmm0
  2998. pclmulqdq $0x11, %xmm4, %xmm3
  2999. pclmulqdq $0x00, %xmm4, %xmm0
  3000. pxor %xmm4, %xmm1
  3001. pxor %xmm5, %xmm2
  3002. pclmulqdq $0x00, %xmm2, %xmm1
  3003. pxor %xmm0, %xmm1
  3004. pxor %xmm3, %xmm1
  3005. movdqa %xmm1, %xmm2
  3006. movdqa %xmm0, %xmm7
  3007. movdqa %xmm3, %xmm4
  3008. pslldq $8, %xmm2
  3009. psrldq $8, %xmm1
  3010. pxor %xmm2, %xmm7
  3011. pxor %xmm1, %xmm4
  3012. movdqa %xmm7, %xmm0
  3013. movdqa %xmm4, %xmm1
  3014. psrld $31, %xmm0
  3015. psrld $31, %xmm1
  3016. pslld $0x01, %xmm7
  3017. pslld $0x01, %xmm4
  3018. movdqa %xmm0, %xmm2
  3019. pslldq $4, %xmm0
  3020. psrldq $12, %xmm2
  3021. pslldq $4, %xmm1
  3022. por %xmm2, %xmm4
  3023. por %xmm0, %xmm7
  3024. por %xmm1, %xmm4
  3025. movdqa %xmm7, %xmm0
  3026. movdqa %xmm7, %xmm1
  3027. movdqa %xmm7, %xmm2
  3028. pslld $31, %xmm0
  3029. pslld $30, %xmm1
  3030. pslld $25, %xmm2
  3031. pxor %xmm1, %xmm0
  3032. pxor %xmm2, %xmm0
  3033. movdqa %xmm0, %xmm1
  3034. psrldq $4, %xmm1
  3035. pslldq $12, %xmm0
  3036. pxor %xmm0, %xmm7
  3037. movdqa %xmm7, %xmm2
  3038. movdqa %xmm7, %xmm3
  3039. movdqa %xmm7, %xmm0
  3040. psrld $0x01, %xmm2
  3041. psrld $2, %xmm3
  3042. psrld $7, %xmm0
  3043. pxor %xmm3, %xmm2
  3044. pxor %xmm0, %xmm2
  3045. pxor %xmm1, %xmm2
  3046. pxor %xmm7, %xmm2
  3047. pxor %xmm2, %xmm4
  3048. L_AES_GCM_init_aesni_calc_iv_done:
  3049. # T = Encrypt counter
  3050. pxor %xmm0, %xmm0
  3051. shll $3, %edx
  3052. pinsrd $0x00, %edx, %xmm0
  3053. pxor %xmm0, %xmm4
  3054. pshufd $0x4e, %xmm4, %xmm1
  3055. pshufd $0x4e, %xmm5, %xmm2
  3056. movdqa %xmm5, %xmm3
  3057. movdqa %xmm5, %xmm0
  3058. pclmulqdq $0x11, %xmm4, %xmm3
  3059. pclmulqdq $0x00, %xmm4, %xmm0
  3060. pxor %xmm4, %xmm1
  3061. pxor %xmm5, %xmm2
  3062. pclmulqdq $0x00, %xmm2, %xmm1
  3063. pxor %xmm0, %xmm1
  3064. pxor %xmm3, %xmm1
  3065. movdqa %xmm1, %xmm2
  3066. movdqa %xmm0, %xmm7
  3067. movdqa %xmm3, %xmm4
  3068. pslldq $8, %xmm2
  3069. psrldq $8, %xmm1
  3070. pxor %xmm2, %xmm7
  3071. pxor %xmm1, %xmm4
  3072. movdqa %xmm7, %xmm0
  3073. movdqa %xmm4, %xmm1
  3074. psrld $31, %xmm0
  3075. psrld $31, %xmm1
  3076. pslld $0x01, %xmm7
  3077. pslld $0x01, %xmm4
  3078. movdqa %xmm0, %xmm2
  3079. pslldq $4, %xmm0
  3080. psrldq $12, %xmm2
  3081. pslldq $4, %xmm1
  3082. por %xmm2, %xmm4
  3083. por %xmm0, %xmm7
  3084. por %xmm1, %xmm4
  3085. movdqa %xmm7, %xmm0
  3086. movdqa %xmm7, %xmm1
  3087. movdqa %xmm7, %xmm2
  3088. pslld $31, %xmm0
  3089. pslld $30, %xmm1
  3090. pslld $25, %xmm2
  3091. pxor %xmm1, %xmm0
  3092. pxor %xmm2, %xmm0
  3093. movdqa %xmm0, %xmm1
  3094. psrldq $4, %xmm1
  3095. pslldq $12, %xmm0
  3096. pxor %xmm0, %xmm7
  3097. movdqa %xmm7, %xmm2
  3098. movdqa %xmm7, %xmm3
  3099. movdqa %xmm7, %xmm0
  3100. psrld $0x01, %xmm2
  3101. psrld $2, %xmm3
  3102. psrld $7, %xmm0
  3103. pxor %xmm3, %xmm2
  3104. pxor %xmm0, %xmm2
  3105. pxor %xmm1, %xmm2
  3106. pxor %xmm7, %xmm2
  3107. pxor %xmm2, %xmm4
  3108. pshufb L_aes_gcm_bswap_mask, %xmm4
  3109. # Encrypt counter
  3110. movdqa (%ebp), %xmm0
  3111. pxor %xmm4, %xmm0
  3112. aesenc 16(%ebp), %xmm0
  3113. aesenc 32(%ebp), %xmm0
  3114. aesenc 48(%ebp), %xmm0
  3115. aesenc 64(%ebp), %xmm0
  3116. aesenc 80(%ebp), %xmm0
  3117. aesenc 96(%ebp), %xmm0
  3118. aesenc 112(%ebp), %xmm0
  3119. aesenc 128(%ebp), %xmm0
  3120. aesenc 144(%ebp), %xmm0
  3121. cmpl $11, 40(%esp)
  3122. movdqa 160(%ebp), %xmm1
  3123. jl L_AES_GCM_init_aesni_calc_iv_2_aesenc_avx_last
  3124. aesenc %xmm1, %xmm0
  3125. aesenc 176(%ebp), %xmm0
  3126. cmpl $13, 40(%esp)
  3127. movdqa 192(%ebp), %xmm1
  3128. jl L_AES_GCM_init_aesni_calc_iv_2_aesenc_avx_last
  3129. aesenc %xmm1, %xmm0
  3130. aesenc 208(%ebp), %xmm0
  3131. movdqa 224(%ebp), %xmm1
  3132. L_AES_GCM_init_aesni_calc_iv_2_aesenc_avx_last:
  3133. aesenclast %xmm1, %xmm0
  3134. movdqu %xmm0, (%edi)
  3135. L_AES_GCM_init_aesni_iv_done:
  3136. movl 52(%esp), %ebp
  3137. movl 56(%esp), %edi
  3138. pshufb L_aes_gcm_bswap_epi64, %xmm4
  3139. paddd L_aes_gcm_one, %xmm4
  3140. movdqa %xmm5, (%ebp)
  3141. movdqa %xmm4, (%edi)
  3142. addl $16, %esp
  3143. popl %ebp
  3144. popl %edi
  3145. popl %esi
  3146. popl %ebx
  3147. ret
  3148. .size AES_GCM_init_aesni,.-AES_GCM_init_aesni
  3149. .text
  3150. .globl AES_GCM_aad_update_aesni
  3151. .type AES_GCM_aad_update_aesni,@function
  3152. .align 16
  3153. AES_GCM_aad_update_aesni:
  3154. pushl %esi
  3155. pushl %edi
  3156. movl 12(%esp), %esi
  3157. movl 16(%esp), %edx
  3158. movl 20(%esp), %edi
  3159. movl 24(%esp), %eax
  3160. movdqa (%edi), %xmm5
  3161. movdqa (%eax), %xmm6
  3162. xorl %ecx, %ecx
  3163. L_AES_GCM_aad_update_aesni_16_loop:
  3164. movdqu (%esi,%ecx,1), %xmm0
  3165. pshufb L_aes_gcm_bswap_mask, %xmm0
  3166. pxor %xmm0, %xmm5
  3167. pshufd $0x4e, %xmm5, %xmm1
  3168. pshufd $0x4e, %xmm6, %xmm2
  3169. movdqa %xmm6, %xmm3
  3170. movdqa %xmm6, %xmm0
  3171. pclmulqdq $0x11, %xmm5, %xmm3
  3172. pclmulqdq $0x00, %xmm5, %xmm0
  3173. pxor %xmm5, %xmm1
  3174. pxor %xmm6, %xmm2
  3175. pclmulqdq $0x00, %xmm2, %xmm1
  3176. pxor %xmm0, %xmm1
  3177. pxor %xmm3, %xmm1
  3178. movdqa %xmm1, %xmm2
  3179. movdqa %xmm0, %xmm4
  3180. movdqa %xmm3, %xmm5
  3181. pslldq $8, %xmm2
  3182. psrldq $8, %xmm1
  3183. pxor %xmm2, %xmm4
  3184. pxor %xmm1, %xmm5
  3185. movdqa %xmm4, %xmm0
  3186. movdqa %xmm5, %xmm1
  3187. psrld $31, %xmm0
  3188. psrld $31, %xmm1
  3189. pslld $0x01, %xmm4
  3190. pslld $0x01, %xmm5
  3191. movdqa %xmm0, %xmm2
  3192. pslldq $4, %xmm0
  3193. psrldq $12, %xmm2
  3194. pslldq $4, %xmm1
  3195. por %xmm2, %xmm5
  3196. por %xmm0, %xmm4
  3197. por %xmm1, %xmm5
  3198. movdqa %xmm4, %xmm0
  3199. movdqa %xmm4, %xmm1
  3200. movdqa %xmm4, %xmm2
  3201. pslld $31, %xmm0
  3202. pslld $30, %xmm1
  3203. pslld $25, %xmm2
  3204. pxor %xmm1, %xmm0
  3205. pxor %xmm2, %xmm0
  3206. movdqa %xmm0, %xmm1
  3207. psrldq $4, %xmm1
  3208. pslldq $12, %xmm0
  3209. pxor %xmm0, %xmm4
  3210. movdqa %xmm4, %xmm2
  3211. movdqa %xmm4, %xmm3
  3212. movdqa %xmm4, %xmm0
  3213. psrld $0x01, %xmm2
  3214. psrld $2, %xmm3
  3215. psrld $7, %xmm0
  3216. pxor %xmm3, %xmm2
  3217. pxor %xmm0, %xmm2
  3218. pxor %xmm1, %xmm2
  3219. pxor %xmm4, %xmm2
  3220. pxor %xmm2, %xmm5
  3221. addl $16, %ecx
  3222. cmpl %edx, %ecx
  3223. jl L_AES_GCM_aad_update_aesni_16_loop
  3224. movdqa %xmm5, (%edi)
  3225. popl %edi
  3226. popl %esi
  3227. ret
  3228. .size AES_GCM_aad_update_aesni,.-AES_GCM_aad_update_aesni
  3229. .text
  3230. .globl AES_GCM_encrypt_block_aesni
  3231. .type AES_GCM_encrypt_block_aesni,@function
  3232. .align 16
  3233. AES_GCM_encrypt_block_aesni:
  3234. pushl %esi
  3235. pushl %edi
  3236. movl 12(%esp), %ecx
  3237. movl 16(%esp), %eax
  3238. movl 20(%esp), %edi
  3239. movl 24(%esp), %esi
  3240. movl 28(%esp), %edx
  3241. movdqu (%edx), %xmm0
  3242. movdqa %xmm0, %xmm1
  3243. pshufb L_aes_gcm_bswap_epi64, %xmm0
  3244. paddd L_aes_gcm_one, %xmm1
  3245. pxor (%ecx), %xmm0
  3246. movdqu %xmm1, (%edx)
  3247. aesenc 16(%ecx), %xmm0
  3248. aesenc 32(%ecx), %xmm0
  3249. aesenc 48(%ecx), %xmm0
  3250. aesenc 64(%ecx), %xmm0
  3251. aesenc 80(%ecx), %xmm0
  3252. aesenc 96(%ecx), %xmm0
  3253. aesenc 112(%ecx), %xmm0
  3254. aesenc 128(%ecx), %xmm0
  3255. aesenc 144(%ecx), %xmm0
  3256. cmpl $11, %eax
  3257. movdqa 160(%ecx), %xmm1
  3258. jl L_AES_GCM_encrypt_block_aesni_aesenc_block_aesenc_avx_last
  3259. aesenc %xmm1, %xmm0
  3260. aesenc 176(%ecx), %xmm0
  3261. cmpl $13, %eax
  3262. movdqa 192(%ecx), %xmm1
  3263. jl L_AES_GCM_encrypt_block_aesni_aesenc_block_aesenc_avx_last
  3264. aesenc %xmm1, %xmm0
  3265. aesenc 208(%ecx), %xmm0
  3266. movdqa 224(%ecx), %xmm1
  3267. L_AES_GCM_encrypt_block_aesni_aesenc_block_aesenc_avx_last:
  3268. aesenclast %xmm1, %xmm0
  3269. movdqu (%esi), %xmm1
  3270. pxor %xmm1, %xmm0
  3271. movdqu %xmm0, (%edi)
  3272. pshufb L_aes_gcm_bswap_mask, %xmm0
  3273. popl %edi
  3274. popl %esi
  3275. ret
  3276. .size AES_GCM_encrypt_block_aesni,.-AES_GCM_encrypt_block_aesni
  3277. .text
  3278. .globl AES_GCM_ghash_block_aesni
  3279. .type AES_GCM_ghash_block_aesni,@function
  3280. .align 16
  3281. AES_GCM_ghash_block_aesni:
  3282. movl 4(%esp), %edx
  3283. movl 8(%esp), %eax
  3284. movl 12(%esp), %ecx
  3285. movdqa (%eax), %xmm4
  3286. movdqa (%ecx), %xmm5
  3287. movdqu (%edx), %xmm0
  3288. pshufb L_aes_gcm_bswap_mask, %xmm0
  3289. pxor %xmm0, %xmm4
  3290. pshufd $0x4e, %xmm4, %xmm1
  3291. pshufd $0x4e, %xmm5, %xmm2
  3292. movdqa %xmm5, %xmm3
  3293. movdqa %xmm5, %xmm0
  3294. pclmulqdq $0x11, %xmm4, %xmm3
  3295. pclmulqdq $0x00, %xmm4, %xmm0
  3296. pxor %xmm4, %xmm1
  3297. pxor %xmm5, %xmm2
  3298. pclmulqdq $0x00, %xmm2, %xmm1
  3299. pxor %xmm0, %xmm1
  3300. pxor %xmm3, %xmm1
  3301. movdqa %xmm1, %xmm2
  3302. movdqa %xmm0, %xmm6
  3303. movdqa %xmm3, %xmm4
  3304. pslldq $8, %xmm2
  3305. psrldq $8, %xmm1
  3306. pxor %xmm2, %xmm6
  3307. pxor %xmm1, %xmm4
  3308. movdqa %xmm6, %xmm0
  3309. movdqa %xmm4, %xmm1
  3310. psrld $31, %xmm0
  3311. psrld $31, %xmm1
  3312. pslld $0x01, %xmm6
  3313. pslld $0x01, %xmm4
  3314. movdqa %xmm0, %xmm2
  3315. pslldq $4, %xmm0
  3316. psrldq $12, %xmm2
  3317. pslldq $4, %xmm1
  3318. por %xmm2, %xmm4
  3319. por %xmm0, %xmm6
  3320. por %xmm1, %xmm4
  3321. movdqa %xmm6, %xmm0
  3322. movdqa %xmm6, %xmm1
  3323. movdqa %xmm6, %xmm2
  3324. pslld $31, %xmm0
  3325. pslld $30, %xmm1
  3326. pslld $25, %xmm2
  3327. pxor %xmm1, %xmm0
  3328. pxor %xmm2, %xmm0
  3329. movdqa %xmm0, %xmm1
  3330. psrldq $4, %xmm1
  3331. pslldq $12, %xmm0
  3332. pxor %xmm0, %xmm6
  3333. movdqa %xmm6, %xmm2
  3334. movdqa %xmm6, %xmm3
  3335. movdqa %xmm6, %xmm0
  3336. psrld $0x01, %xmm2
  3337. psrld $2, %xmm3
  3338. psrld $7, %xmm0
  3339. pxor %xmm3, %xmm2
  3340. pxor %xmm0, %xmm2
  3341. pxor %xmm1, %xmm2
  3342. pxor %xmm6, %xmm2
  3343. pxor %xmm2, %xmm4
  3344. movdqa %xmm4, (%eax)
  3345. ret
  3346. .size AES_GCM_ghash_block_aesni,.-AES_GCM_ghash_block_aesni
  3347. .text
  3348. .globl AES_GCM_encrypt_update_aesni
  3349. .type AES_GCM_encrypt_update_aesni,@function
  3350. .align 16
  3351. AES_GCM_encrypt_update_aesni:
  3352. pushl %ebx
  3353. pushl %esi
  3354. pushl %edi
  3355. pushl %ebp
  3356. subl $0x60, %esp
  3357. movl 144(%esp), %esi
  3358. movdqa (%esi), %xmm4
  3359. movdqu %xmm4, 64(%esp)
  3360. movl 136(%esp), %esi
  3361. movl 140(%esp), %ebp
  3362. movdqa (%esi), %xmm6
  3363. movdqa (%ebp), %xmm5
  3364. movdqu %xmm6, 80(%esp)
  3365. movl 116(%esp), %ebp
  3366. movl 124(%esp), %edi
  3367. movl 128(%esp), %esi
  3368. movdqa %xmm5, %xmm1
  3369. movdqa %xmm5, %xmm0
  3370. psrlq $63, %xmm1
  3371. psllq $0x01, %xmm0
  3372. pslldq $8, %xmm1
  3373. por %xmm1, %xmm0
  3374. pshufd $0xff, %xmm5, %xmm5
  3375. psrad $31, %xmm5
  3376. pand L_aes_gcm_mod2_128, %xmm5
  3377. pxor %xmm0, %xmm5
  3378. xorl %ebx, %ebx
  3379. cmpl $0x40, 132(%esp)
  3380. movl 132(%esp), %eax
  3381. jl L_AES_GCM_encrypt_update_aesni_done_64
  3382. andl $0xffffffc0, %eax
  3383. movdqa %xmm6, %xmm2
  3384. # H ^ 1
  3385. movdqu %xmm5, (%esp)
  3386. # H ^ 2
  3387. pshufd $0x4e, %xmm5, %xmm1
  3388. pshufd $0x4e, %xmm5, %xmm2
  3389. movdqa %xmm5, %xmm3
  3390. movdqa %xmm5, %xmm0
  3391. pclmulqdq $0x11, %xmm5, %xmm3
  3392. pclmulqdq $0x00, %xmm5, %xmm0
  3393. pxor %xmm5, %xmm1
  3394. pxor %xmm5, %xmm2
  3395. pclmulqdq $0x00, %xmm2, %xmm1
  3396. pxor %xmm0, %xmm1
  3397. pxor %xmm3, %xmm1
  3398. movdqa %xmm1, %xmm2
  3399. movdqa %xmm3, %xmm4
  3400. pslldq $8, %xmm2
  3401. psrldq $8, %xmm1
  3402. pxor %xmm2, %xmm0
  3403. pxor %xmm1, %xmm4
  3404. movdqa %xmm0, %xmm1
  3405. movdqa %xmm0, %xmm2
  3406. movdqa %xmm0, %xmm3
  3407. pslld $31, %xmm1
  3408. pslld $30, %xmm2
  3409. pslld $25, %xmm3
  3410. pxor %xmm2, %xmm1
  3411. pxor %xmm3, %xmm1
  3412. movdqa %xmm1, %xmm3
  3413. psrldq $4, %xmm3
  3414. pslldq $12, %xmm1
  3415. pxor %xmm1, %xmm0
  3416. movdqa %xmm0, %xmm1
  3417. movdqa %xmm0, %xmm2
  3418. psrld $0x01, %xmm1
  3419. psrld $2, %xmm2
  3420. pxor %xmm2, %xmm1
  3421. pxor %xmm0, %xmm1
  3422. psrld $7, %xmm0
  3423. pxor %xmm3, %xmm1
  3424. pxor %xmm0, %xmm1
  3425. pxor %xmm1, %xmm4
  3426. movdqu %xmm4, 16(%esp)
  3427. # H ^ 3
  3428. pshufd $0x4e, %xmm5, %xmm1
  3429. pshufd $0x4e, %xmm4, %xmm2
  3430. movdqa %xmm4, %xmm3
  3431. movdqa %xmm4, %xmm0
  3432. pclmulqdq $0x11, %xmm5, %xmm3
  3433. pclmulqdq $0x00, %xmm5, %xmm0
  3434. pxor %xmm5, %xmm1
  3435. pxor %xmm4, %xmm2
  3436. pclmulqdq $0x00, %xmm2, %xmm1
  3437. pxor %xmm0, %xmm1
  3438. pxor %xmm3, %xmm1
  3439. movdqa %xmm1, %xmm2
  3440. movdqa %xmm3, %xmm7
  3441. pslldq $8, %xmm2
  3442. psrldq $8, %xmm1
  3443. pxor %xmm2, %xmm0
  3444. pxor %xmm1, %xmm7
  3445. movdqa %xmm0, %xmm1
  3446. movdqa %xmm0, %xmm2
  3447. movdqa %xmm0, %xmm3
  3448. pslld $31, %xmm1
  3449. pslld $30, %xmm2
  3450. pslld $25, %xmm3
  3451. pxor %xmm2, %xmm1
  3452. pxor %xmm3, %xmm1
  3453. movdqa %xmm1, %xmm3
  3454. psrldq $4, %xmm3
  3455. pslldq $12, %xmm1
  3456. pxor %xmm1, %xmm0
  3457. movdqa %xmm0, %xmm1
  3458. movdqa %xmm0, %xmm2
  3459. psrld $0x01, %xmm1
  3460. psrld $2, %xmm2
  3461. pxor %xmm2, %xmm1
  3462. pxor %xmm0, %xmm1
  3463. psrld $7, %xmm0
  3464. pxor %xmm3, %xmm1
  3465. pxor %xmm0, %xmm1
  3466. pxor %xmm1, %xmm7
  3467. movdqu %xmm7, 32(%esp)
  3468. # H ^ 4
  3469. pshufd $0x4e, %xmm4, %xmm1
  3470. pshufd $0x4e, %xmm4, %xmm2
  3471. movdqa %xmm4, %xmm3
  3472. movdqa %xmm4, %xmm0
  3473. pclmulqdq $0x11, %xmm4, %xmm3
  3474. pclmulqdq $0x00, %xmm4, %xmm0
  3475. pxor %xmm4, %xmm1
  3476. pxor %xmm4, %xmm2
  3477. pclmulqdq $0x00, %xmm2, %xmm1
  3478. pxor %xmm0, %xmm1
  3479. pxor %xmm3, %xmm1
  3480. movdqa %xmm1, %xmm2
  3481. movdqa %xmm3, %xmm7
  3482. pslldq $8, %xmm2
  3483. psrldq $8, %xmm1
  3484. pxor %xmm2, %xmm0
  3485. pxor %xmm1, %xmm7
  3486. movdqa %xmm0, %xmm1
  3487. movdqa %xmm0, %xmm2
  3488. movdqa %xmm0, %xmm3
  3489. pslld $31, %xmm1
  3490. pslld $30, %xmm2
  3491. pslld $25, %xmm3
  3492. pxor %xmm2, %xmm1
  3493. pxor %xmm3, %xmm1
  3494. movdqa %xmm1, %xmm3
  3495. psrldq $4, %xmm3
  3496. pslldq $12, %xmm1
  3497. pxor %xmm1, %xmm0
  3498. movdqa %xmm0, %xmm1
  3499. movdqa %xmm0, %xmm2
  3500. psrld $0x01, %xmm1
  3501. psrld $2, %xmm2
  3502. pxor %xmm2, %xmm1
  3503. pxor %xmm0, %xmm1
  3504. psrld $7, %xmm0
  3505. pxor %xmm3, %xmm1
  3506. pxor %xmm0, %xmm1
  3507. pxor %xmm1, %xmm7
  3508. movdqu %xmm7, 48(%esp)
  3509. # First 64 bytes of input
  3510. # Encrypt 64 bytes of counter
  3511. movdqu 64(%esp), %xmm0
  3512. movdqa L_aes_gcm_bswap_epi64, %xmm7
  3513. movdqa %xmm0, %xmm1
  3514. movdqa %xmm0, %xmm2
  3515. movdqa %xmm0, %xmm3
  3516. pshufb %xmm7, %xmm0
  3517. paddd L_aes_gcm_one, %xmm1
  3518. pshufb %xmm7, %xmm1
  3519. paddd L_aes_gcm_two, %xmm2
  3520. pshufb %xmm7, %xmm2
  3521. paddd L_aes_gcm_three, %xmm3
  3522. pshufb %xmm7, %xmm3
  3523. movdqu 64(%esp), %xmm7
  3524. paddd L_aes_gcm_four, %xmm7
  3525. movdqu %xmm7, 64(%esp)
  3526. movdqa (%ebp), %xmm7
  3527. pxor %xmm7, %xmm0
  3528. pxor %xmm7, %xmm1
  3529. pxor %xmm7, %xmm2
  3530. pxor %xmm7, %xmm3
  3531. movdqa 16(%ebp), %xmm7
  3532. aesenc %xmm7, %xmm0
  3533. aesenc %xmm7, %xmm1
  3534. aesenc %xmm7, %xmm2
  3535. aesenc %xmm7, %xmm3
  3536. movdqa 32(%ebp), %xmm7
  3537. aesenc %xmm7, %xmm0
  3538. aesenc %xmm7, %xmm1
  3539. aesenc %xmm7, %xmm2
  3540. aesenc %xmm7, %xmm3
  3541. movdqa 48(%ebp), %xmm7
  3542. aesenc %xmm7, %xmm0
  3543. aesenc %xmm7, %xmm1
  3544. aesenc %xmm7, %xmm2
  3545. aesenc %xmm7, %xmm3
  3546. movdqa 64(%ebp), %xmm7
  3547. aesenc %xmm7, %xmm0
  3548. aesenc %xmm7, %xmm1
  3549. aesenc %xmm7, %xmm2
  3550. aesenc %xmm7, %xmm3
  3551. movdqa 80(%ebp), %xmm7
  3552. aesenc %xmm7, %xmm0
  3553. aesenc %xmm7, %xmm1
  3554. aesenc %xmm7, %xmm2
  3555. aesenc %xmm7, %xmm3
  3556. movdqa 96(%ebp), %xmm7
  3557. aesenc %xmm7, %xmm0
  3558. aesenc %xmm7, %xmm1
  3559. aesenc %xmm7, %xmm2
  3560. aesenc %xmm7, %xmm3
  3561. movdqa 112(%ebp), %xmm7
  3562. aesenc %xmm7, %xmm0
  3563. aesenc %xmm7, %xmm1
  3564. aesenc %xmm7, %xmm2
  3565. aesenc %xmm7, %xmm3
  3566. movdqa 128(%ebp), %xmm7
  3567. aesenc %xmm7, %xmm0
  3568. aesenc %xmm7, %xmm1
  3569. aesenc %xmm7, %xmm2
  3570. aesenc %xmm7, %xmm3
  3571. movdqa 144(%ebp), %xmm7
  3572. aesenc %xmm7, %xmm0
  3573. aesenc %xmm7, %xmm1
  3574. aesenc %xmm7, %xmm2
  3575. aesenc %xmm7, %xmm3
  3576. cmpl $11, 120(%esp)
  3577. movdqa 160(%ebp), %xmm7
  3578. jl L_AES_GCM_encrypt_update_aesni_enc_done
  3579. aesenc %xmm7, %xmm0
  3580. aesenc %xmm7, %xmm1
  3581. aesenc %xmm7, %xmm2
  3582. aesenc %xmm7, %xmm3
  3583. movdqa 176(%ebp), %xmm7
  3584. aesenc %xmm7, %xmm0
  3585. aesenc %xmm7, %xmm1
  3586. aesenc %xmm7, %xmm2
  3587. aesenc %xmm7, %xmm3
  3588. cmpl $13, 120(%esp)
  3589. movdqa 192(%ebp), %xmm7
  3590. jl L_AES_GCM_encrypt_update_aesni_enc_done
  3591. aesenc %xmm7, %xmm0
  3592. aesenc %xmm7, %xmm1
  3593. aesenc %xmm7, %xmm2
  3594. aesenc %xmm7, %xmm3
  3595. movdqa 208(%ebp), %xmm7
  3596. aesenc %xmm7, %xmm0
  3597. aesenc %xmm7, %xmm1
  3598. aesenc %xmm7, %xmm2
  3599. aesenc %xmm7, %xmm3
  3600. movdqa 224(%ebp), %xmm7
  3601. L_AES_GCM_encrypt_update_aesni_enc_done:
  3602. aesenclast %xmm7, %xmm0
  3603. aesenclast %xmm7, %xmm1
  3604. movdqu (%esi), %xmm4
  3605. movdqu 16(%esi), %xmm5
  3606. pxor %xmm4, %xmm0
  3607. pxor %xmm5, %xmm1
  3608. movdqu %xmm0, (%edi)
  3609. movdqu %xmm1, 16(%edi)
  3610. aesenclast %xmm7, %xmm2
  3611. aesenclast %xmm7, %xmm3
  3612. movdqu 32(%esi), %xmm4
  3613. movdqu 48(%esi), %xmm5
  3614. pxor %xmm4, %xmm2
  3615. pxor %xmm5, %xmm3
  3616. movdqu %xmm2, 32(%edi)
  3617. movdqu %xmm3, 48(%edi)
  3618. cmpl $0x40, %eax
  3619. movl $0x40, %ebx
  3620. jle L_AES_GCM_encrypt_update_aesni_end_64
  3621. # More 64 bytes of input
  3622. L_AES_GCM_encrypt_update_aesni_ghash_64:
  3623. leal (%esi,%ebx,1), %ecx
  3624. leal (%edi,%ebx,1), %edx
  3625. # Encrypt 64 bytes of counter
  3626. movdqu 64(%esp), %xmm0
  3627. movdqa L_aes_gcm_bswap_epi64, %xmm7
  3628. movdqa %xmm0, %xmm1
  3629. movdqa %xmm0, %xmm2
  3630. movdqa %xmm0, %xmm3
  3631. pshufb %xmm7, %xmm0
  3632. paddd L_aes_gcm_one, %xmm1
  3633. pshufb %xmm7, %xmm1
  3634. paddd L_aes_gcm_two, %xmm2
  3635. pshufb %xmm7, %xmm2
  3636. paddd L_aes_gcm_three, %xmm3
  3637. pshufb %xmm7, %xmm3
  3638. movdqu 64(%esp), %xmm7
  3639. paddd L_aes_gcm_four, %xmm7
  3640. movdqu %xmm7, 64(%esp)
  3641. movdqa (%ebp), %xmm7
  3642. pxor %xmm7, %xmm0
  3643. pxor %xmm7, %xmm1
  3644. pxor %xmm7, %xmm2
  3645. pxor %xmm7, %xmm3
  3646. movdqa 16(%ebp), %xmm7
  3647. aesenc %xmm7, %xmm0
  3648. aesenc %xmm7, %xmm1
  3649. aesenc %xmm7, %xmm2
  3650. aesenc %xmm7, %xmm3
  3651. movdqa 32(%ebp), %xmm7
  3652. aesenc %xmm7, %xmm0
  3653. aesenc %xmm7, %xmm1
  3654. aesenc %xmm7, %xmm2
  3655. aesenc %xmm7, %xmm3
  3656. movdqa 48(%ebp), %xmm7
  3657. aesenc %xmm7, %xmm0
  3658. aesenc %xmm7, %xmm1
  3659. aesenc %xmm7, %xmm2
  3660. aesenc %xmm7, %xmm3
  3661. movdqa 64(%ebp), %xmm7
  3662. aesenc %xmm7, %xmm0
  3663. aesenc %xmm7, %xmm1
  3664. aesenc %xmm7, %xmm2
  3665. aesenc %xmm7, %xmm3
  3666. movdqa 80(%ebp), %xmm7
  3667. aesenc %xmm7, %xmm0
  3668. aesenc %xmm7, %xmm1
  3669. aesenc %xmm7, %xmm2
  3670. aesenc %xmm7, %xmm3
  3671. movdqa 96(%ebp), %xmm7
  3672. aesenc %xmm7, %xmm0
  3673. aesenc %xmm7, %xmm1
  3674. aesenc %xmm7, %xmm2
  3675. aesenc %xmm7, %xmm3
  3676. movdqa 112(%ebp), %xmm7
  3677. aesenc %xmm7, %xmm0
  3678. aesenc %xmm7, %xmm1
  3679. aesenc %xmm7, %xmm2
  3680. aesenc %xmm7, %xmm3
  3681. movdqa 128(%ebp), %xmm7
  3682. aesenc %xmm7, %xmm0
  3683. aesenc %xmm7, %xmm1
  3684. aesenc %xmm7, %xmm2
  3685. aesenc %xmm7, %xmm3
  3686. movdqa 144(%ebp), %xmm7
  3687. aesenc %xmm7, %xmm0
  3688. aesenc %xmm7, %xmm1
  3689. aesenc %xmm7, %xmm2
  3690. aesenc %xmm7, %xmm3
  3691. cmpl $11, 120(%esp)
  3692. movdqa 160(%ebp), %xmm7
  3693. jl L_AES_GCM_encrypt_update_aesni_aesenc_64_ghash_avx_done
  3694. aesenc %xmm7, %xmm0
  3695. aesenc %xmm7, %xmm1
  3696. aesenc %xmm7, %xmm2
  3697. aesenc %xmm7, %xmm3
  3698. movdqa 176(%ebp), %xmm7
  3699. aesenc %xmm7, %xmm0
  3700. aesenc %xmm7, %xmm1
  3701. aesenc %xmm7, %xmm2
  3702. aesenc %xmm7, %xmm3
  3703. cmpl $13, 120(%esp)
  3704. movdqa 192(%ebp), %xmm7
  3705. jl L_AES_GCM_encrypt_update_aesni_aesenc_64_ghash_avx_done
  3706. aesenc %xmm7, %xmm0
  3707. aesenc %xmm7, %xmm1
  3708. aesenc %xmm7, %xmm2
  3709. aesenc %xmm7, %xmm3
  3710. movdqa 208(%ebp), %xmm7
  3711. aesenc %xmm7, %xmm0
  3712. aesenc %xmm7, %xmm1
  3713. aesenc %xmm7, %xmm2
  3714. aesenc %xmm7, %xmm3
  3715. movdqa 224(%ebp), %xmm7
  3716. L_AES_GCM_encrypt_update_aesni_aesenc_64_ghash_avx_done:
  3717. aesenclast %xmm7, %xmm0
  3718. aesenclast %xmm7, %xmm1
  3719. movdqu (%ecx), %xmm4
  3720. movdqu 16(%ecx), %xmm5
  3721. pxor %xmm4, %xmm0
  3722. pxor %xmm5, %xmm1
  3723. movdqu %xmm0, (%edx)
  3724. movdqu %xmm1, 16(%edx)
  3725. aesenclast %xmm7, %xmm2
  3726. aesenclast %xmm7, %xmm3
  3727. movdqu 32(%ecx), %xmm4
  3728. movdqu 48(%ecx), %xmm5
  3729. pxor %xmm4, %xmm2
  3730. pxor %xmm5, %xmm3
  3731. movdqu %xmm2, 32(%edx)
  3732. movdqu %xmm3, 48(%edx)
  3733. # ghash encrypted counter
  3734. movdqu 80(%esp), %xmm2
  3735. movdqu 48(%esp), %xmm7
  3736. movdqu -64(%edx), %xmm0
  3737. pshufb L_aes_gcm_bswap_mask, %xmm0
  3738. pxor %xmm2, %xmm0
  3739. pshufd $0x4e, %xmm7, %xmm1
  3740. pshufd $0x4e, %xmm0, %xmm5
  3741. pxor %xmm7, %xmm1
  3742. pxor %xmm0, %xmm5
  3743. movdqa %xmm0, %xmm3
  3744. pclmulqdq $0x11, %xmm7, %xmm3
  3745. movdqa %xmm0, %xmm2
  3746. pclmulqdq $0x00, %xmm7, %xmm2
  3747. pclmulqdq $0x00, %xmm5, %xmm1
  3748. pxor %xmm2, %xmm1
  3749. pxor %xmm3, %xmm1
  3750. movdqu 32(%esp), %xmm7
  3751. movdqu -48(%edx), %xmm0
  3752. pshufd $0x4e, %xmm7, %xmm4
  3753. pshufb L_aes_gcm_bswap_mask, %xmm0
  3754. pxor %xmm7, %xmm4
  3755. pshufd $0x4e, %xmm0, %xmm5
  3756. pxor %xmm0, %xmm5
  3757. movdqa %xmm0, %xmm6
  3758. pclmulqdq $0x11, %xmm7, %xmm6
  3759. pclmulqdq $0x00, %xmm0, %xmm7
  3760. pclmulqdq $0x00, %xmm5, %xmm4
  3761. pxor %xmm7, %xmm1
  3762. pxor %xmm7, %xmm2
  3763. pxor %xmm6, %xmm1
  3764. pxor %xmm6, %xmm3
  3765. pxor %xmm4, %xmm1
  3766. movdqu 16(%esp), %xmm7
  3767. movdqu -32(%edx), %xmm0
  3768. pshufd $0x4e, %xmm7, %xmm4
  3769. pshufb L_aes_gcm_bswap_mask, %xmm0
  3770. pxor %xmm7, %xmm4
  3771. pshufd $0x4e, %xmm0, %xmm5
  3772. pxor %xmm0, %xmm5
  3773. movdqa %xmm0, %xmm6
  3774. pclmulqdq $0x11, %xmm7, %xmm6
  3775. pclmulqdq $0x00, %xmm0, %xmm7
  3776. pclmulqdq $0x00, %xmm5, %xmm4
  3777. pxor %xmm7, %xmm1
  3778. pxor %xmm7, %xmm2
  3779. pxor %xmm6, %xmm1
  3780. pxor %xmm6, %xmm3
  3781. pxor %xmm4, %xmm1
  3782. movdqu (%esp), %xmm7
  3783. movdqu -16(%edx), %xmm0
  3784. pshufd $0x4e, %xmm7, %xmm4
  3785. pshufb L_aes_gcm_bswap_mask, %xmm0
  3786. pxor %xmm7, %xmm4
  3787. pshufd $0x4e, %xmm0, %xmm5
  3788. pxor %xmm0, %xmm5
  3789. movdqa %xmm0, %xmm6
  3790. pclmulqdq $0x11, %xmm7, %xmm6
  3791. pclmulqdq $0x00, %xmm0, %xmm7
  3792. pclmulqdq $0x00, %xmm5, %xmm4
  3793. pxor %xmm7, %xmm1
  3794. pxor %xmm7, %xmm2
  3795. pxor %xmm6, %xmm1
  3796. pxor %xmm6, %xmm3
  3797. pxor %xmm4, %xmm1
  3798. movdqa %xmm1, %xmm5
  3799. psrldq $8, %xmm1
  3800. pslldq $8, %xmm5
  3801. pxor %xmm5, %xmm2
  3802. pxor %xmm1, %xmm3
  3803. movdqa %xmm2, %xmm7
  3804. movdqa %xmm2, %xmm4
  3805. movdqa %xmm2, %xmm5
  3806. pslld $31, %xmm7
  3807. pslld $30, %xmm4
  3808. pslld $25, %xmm5
  3809. pxor %xmm4, %xmm7
  3810. pxor %xmm5, %xmm7
  3811. movdqa %xmm7, %xmm4
  3812. pslldq $12, %xmm7
  3813. psrldq $4, %xmm4
  3814. pxor %xmm7, %xmm2
  3815. movdqa %xmm2, %xmm5
  3816. movdqa %xmm2, %xmm1
  3817. movdqa %xmm2, %xmm0
  3818. psrld $0x01, %xmm5
  3819. psrld $2, %xmm1
  3820. psrld $7, %xmm0
  3821. pxor %xmm1, %xmm5
  3822. pxor %xmm0, %xmm5
  3823. pxor %xmm4, %xmm5
  3824. pxor %xmm5, %xmm2
  3825. pxor %xmm3, %xmm2
  3826. movdqu %xmm2, 80(%esp)
  3827. addl $0x40, %ebx
  3828. cmpl %eax, %ebx
  3829. jl L_AES_GCM_encrypt_update_aesni_ghash_64
  3830. L_AES_GCM_encrypt_update_aesni_end_64:
  3831. movdqu 80(%esp), %xmm6
  3832. # Block 1
  3833. movdqa L_aes_gcm_bswap_mask, %xmm0
  3834. movdqu (%edx), %xmm5
  3835. pshufb %xmm0, %xmm5
  3836. movdqu 48(%esp), %xmm7
  3837. pxor %xmm6, %xmm5
  3838. pshufd $0x4e, %xmm5, %xmm1
  3839. pshufd $0x4e, %xmm7, %xmm2
  3840. movdqa %xmm7, %xmm3
  3841. movdqa %xmm7, %xmm0
  3842. pclmulqdq $0x11, %xmm5, %xmm3
  3843. pclmulqdq $0x00, %xmm5, %xmm0
  3844. pxor %xmm5, %xmm1
  3845. pxor %xmm7, %xmm2
  3846. pclmulqdq $0x00, %xmm2, %xmm1
  3847. pxor %xmm0, %xmm1
  3848. pxor %xmm3, %xmm1
  3849. movdqa %xmm1, %xmm2
  3850. movdqa %xmm0, %xmm4
  3851. movdqa %xmm3, %xmm6
  3852. pslldq $8, %xmm2
  3853. psrldq $8, %xmm1
  3854. pxor %xmm2, %xmm4
  3855. pxor %xmm1, %xmm6
  3856. # Block 2
  3857. movdqa L_aes_gcm_bswap_mask, %xmm0
  3858. movdqu 16(%edx), %xmm5
  3859. pshufb %xmm0, %xmm5
  3860. movdqu 32(%esp), %xmm7
  3861. pshufd $0x4e, %xmm5, %xmm1
  3862. pshufd $0x4e, %xmm7, %xmm2
  3863. movdqa %xmm7, %xmm3
  3864. movdqa %xmm7, %xmm0
  3865. pclmulqdq $0x11, %xmm5, %xmm3
  3866. pclmulqdq $0x00, %xmm5, %xmm0
  3867. pxor %xmm5, %xmm1
  3868. pxor %xmm7, %xmm2
  3869. pclmulqdq $0x00, %xmm2, %xmm1
  3870. pxor %xmm0, %xmm1
  3871. pxor %xmm3, %xmm1
  3872. movdqa %xmm1, %xmm2
  3873. pxor %xmm0, %xmm4
  3874. pxor %xmm3, %xmm6
  3875. pslldq $8, %xmm2
  3876. psrldq $8, %xmm1
  3877. pxor %xmm2, %xmm4
  3878. pxor %xmm1, %xmm6
  3879. # Block 3
  3880. movdqa L_aes_gcm_bswap_mask, %xmm0
  3881. movdqu 32(%edx), %xmm5
  3882. pshufb %xmm0, %xmm5
  3883. movdqu 16(%esp), %xmm7
  3884. pshufd $0x4e, %xmm5, %xmm1
  3885. pshufd $0x4e, %xmm7, %xmm2
  3886. movdqa %xmm7, %xmm3
  3887. movdqa %xmm7, %xmm0
  3888. pclmulqdq $0x11, %xmm5, %xmm3
  3889. pclmulqdq $0x00, %xmm5, %xmm0
  3890. pxor %xmm5, %xmm1
  3891. pxor %xmm7, %xmm2
  3892. pclmulqdq $0x00, %xmm2, %xmm1
  3893. pxor %xmm0, %xmm1
  3894. pxor %xmm3, %xmm1
  3895. movdqa %xmm1, %xmm2
  3896. pxor %xmm0, %xmm4
  3897. pxor %xmm3, %xmm6
  3898. pslldq $8, %xmm2
  3899. psrldq $8, %xmm1
  3900. pxor %xmm2, %xmm4
  3901. pxor %xmm1, %xmm6
  3902. # Block 4
  3903. movdqa L_aes_gcm_bswap_mask, %xmm0
  3904. movdqu 48(%edx), %xmm5
  3905. pshufb %xmm0, %xmm5
  3906. movdqu (%esp), %xmm7
  3907. pshufd $0x4e, %xmm5, %xmm1
  3908. pshufd $0x4e, %xmm7, %xmm2
  3909. movdqa %xmm7, %xmm3
  3910. movdqa %xmm7, %xmm0
  3911. pclmulqdq $0x11, %xmm5, %xmm3
  3912. pclmulqdq $0x00, %xmm5, %xmm0
  3913. pxor %xmm5, %xmm1
  3914. pxor %xmm7, %xmm2
  3915. pclmulqdq $0x00, %xmm2, %xmm1
  3916. pxor %xmm0, %xmm1
  3917. pxor %xmm3, %xmm1
  3918. movdqa %xmm1, %xmm2
  3919. pxor %xmm0, %xmm4
  3920. pxor %xmm3, %xmm6
  3921. pslldq $8, %xmm2
  3922. psrldq $8, %xmm1
  3923. pxor %xmm2, %xmm4
  3924. pxor %xmm1, %xmm6
  3925. movdqa %xmm4, %xmm0
  3926. movdqa %xmm4, %xmm1
  3927. movdqa %xmm4, %xmm2
  3928. pslld $31, %xmm0
  3929. pslld $30, %xmm1
  3930. pslld $25, %xmm2
  3931. pxor %xmm1, %xmm0
  3932. pxor %xmm2, %xmm0
  3933. movdqa %xmm0, %xmm1
  3934. psrldq $4, %xmm1
  3935. pslldq $12, %xmm0
  3936. pxor %xmm0, %xmm4
  3937. movdqa %xmm4, %xmm2
  3938. movdqa %xmm4, %xmm3
  3939. movdqa %xmm4, %xmm0
  3940. psrld $0x01, %xmm2
  3941. psrld $2, %xmm3
  3942. psrld $7, %xmm0
  3943. pxor %xmm3, %xmm2
  3944. pxor %xmm0, %xmm2
  3945. pxor %xmm1, %xmm2
  3946. pxor %xmm4, %xmm2
  3947. pxor %xmm2, %xmm6
  3948. movdqu (%esp), %xmm5
  3949. L_AES_GCM_encrypt_update_aesni_done_64:
  3950. movl 132(%esp), %edx
  3951. cmpl %edx, %ebx
  3952. jge L_AES_GCM_encrypt_update_aesni_done_enc
  3953. movl 132(%esp), %eax
  3954. andl $0xfffffff0, %eax
  3955. cmpl %eax, %ebx
  3956. jge L_AES_GCM_encrypt_update_aesni_last_block_done
  3957. leal (%esi,%ebx,1), %ecx
  3958. leal (%edi,%ebx,1), %edx
  3959. movdqu 64(%esp), %xmm0
  3960. movdqa %xmm0, %xmm1
  3961. pshufb L_aes_gcm_bswap_epi64, %xmm0
  3962. paddd L_aes_gcm_one, %xmm1
  3963. pxor (%ebp), %xmm0
  3964. movdqu %xmm1, 64(%esp)
  3965. aesenc 16(%ebp), %xmm0
  3966. aesenc 32(%ebp), %xmm0
  3967. aesenc 48(%ebp), %xmm0
  3968. aesenc 64(%ebp), %xmm0
  3969. aesenc 80(%ebp), %xmm0
  3970. aesenc 96(%ebp), %xmm0
  3971. aesenc 112(%ebp), %xmm0
  3972. aesenc 128(%ebp), %xmm0
  3973. aesenc 144(%ebp), %xmm0
  3974. cmpl $11, 120(%esp)
  3975. movdqa 160(%ebp), %xmm1
  3976. jl L_AES_GCM_encrypt_update_aesni_aesenc_block_aesenc_avx_last
  3977. aesenc %xmm1, %xmm0
  3978. aesenc 176(%ebp), %xmm0
  3979. cmpl $13, 120(%esp)
  3980. movdqa 192(%ebp), %xmm1
  3981. jl L_AES_GCM_encrypt_update_aesni_aesenc_block_aesenc_avx_last
  3982. aesenc %xmm1, %xmm0
  3983. aesenc 208(%ebp), %xmm0
  3984. movdqa 224(%ebp), %xmm1
  3985. L_AES_GCM_encrypt_update_aesni_aesenc_block_aesenc_avx_last:
  3986. aesenclast %xmm1, %xmm0
  3987. movdqu (%ecx), %xmm1
  3988. pxor %xmm1, %xmm0
  3989. movdqu %xmm0, (%edx)
  3990. pshufb L_aes_gcm_bswap_mask, %xmm0
  3991. pxor %xmm0, %xmm6
  3992. addl $16, %ebx
  3993. cmpl %eax, %ebx
  3994. jge L_AES_GCM_encrypt_update_aesni_last_block_ghash
  3995. L_AES_GCM_encrypt_update_aesni_last_block_start:
  3996. leal (%esi,%ebx,1), %ecx
  3997. leal (%edi,%ebx,1), %edx
  3998. movdqu 64(%esp), %xmm0
  3999. movdqa %xmm0, %xmm1
  4000. pshufb L_aes_gcm_bswap_epi64, %xmm0
  4001. paddd L_aes_gcm_one, %xmm1
  4002. pxor (%ebp), %xmm0
  4003. movdqu %xmm1, 64(%esp)
  4004. movdqu %xmm6, %xmm4
  4005. pclmulqdq $16, %xmm5, %xmm4
  4006. aesenc 16(%ebp), %xmm0
  4007. aesenc 32(%ebp), %xmm0
  4008. movdqu %xmm6, %xmm7
  4009. pclmulqdq $0x01, %xmm5, %xmm7
  4010. aesenc 48(%ebp), %xmm0
  4011. aesenc 64(%ebp), %xmm0
  4012. aesenc 80(%ebp), %xmm0
  4013. movdqu %xmm6, %xmm1
  4014. pclmulqdq $0x11, %xmm5, %xmm1
  4015. aesenc 96(%ebp), %xmm0
  4016. pxor %xmm7, %xmm4
  4017. movdqa %xmm4, %xmm2
  4018. psrldq $8, %xmm4
  4019. pslldq $8, %xmm2
  4020. aesenc 112(%ebp), %xmm0
  4021. movdqu %xmm6, %xmm7
  4022. pclmulqdq $0x00, %xmm5, %xmm7
  4023. pxor %xmm7, %xmm2
  4024. pxor %xmm4, %xmm1
  4025. movdqa L_aes_gcm_mod2_128, %xmm3
  4026. movdqa %xmm2, %xmm7
  4027. pclmulqdq $16, %xmm3, %xmm7
  4028. aesenc 128(%ebp), %xmm0
  4029. pshufd $0x4e, %xmm2, %xmm4
  4030. pxor %xmm7, %xmm4
  4031. movdqa %xmm4, %xmm7
  4032. pclmulqdq $16, %xmm3, %xmm7
  4033. aesenc 144(%ebp), %xmm0
  4034. pshufd $0x4e, %xmm4, %xmm6
  4035. pxor %xmm7, %xmm6
  4036. pxor %xmm1, %xmm6
  4037. cmpl $11, 120(%esp)
  4038. movdqa 160(%ebp), %xmm1
  4039. jl L_AES_GCM_encrypt_update_aesni_aesenc_gfmul_last
  4040. aesenc %xmm1, %xmm0
  4041. aesenc 176(%ebp), %xmm0
  4042. cmpl $13, 120(%esp)
  4043. movdqa 192(%ebp), %xmm1
  4044. jl L_AES_GCM_encrypt_update_aesni_aesenc_gfmul_last
  4045. aesenc %xmm1, %xmm0
  4046. aesenc 208(%ebp), %xmm0
  4047. movdqa 224(%ebp), %xmm1
  4048. L_AES_GCM_encrypt_update_aesni_aesenc_gfmul_last:
  4049. aesenclast %xmm1, %xmm0
  4050. movdqu (%ecx), %xmm1
  4051. pxor %xmm1, %xmm0
  4052. movdqu %xmm0, (%edx)
  4053. pshufb L_aes_gcm_bswap_mask, %xmm0
  4054. pxor %xmm0, %xmm6
  4055. addl $16, %ebx
  4056. cmpl %eax, %ebx
  4057. jl L_AES_GCM_encrypt_update_aesni_last_block_start
  4058. L_AES_GCM_encrypt_update_aesni_last_block_ghash:
  4059. pshufd $0x4e, %xmm5, %xmm1
  4060. pshufd $0x4e, %xmm6, %xmm2
  4061. movdqa %xmm6, %xmm3
  4062. movdqa %xmm6, %xmm0
  4063. pclmulqdq $0x11, %xmm5, %xmm3
  4064. pclmulqdq $0x00, %xmm5, %xmm0
  4065. pxor %xmm5, %xmm1
  4066. pxor %xmm6, %xmm2
  4067. pclmulqdq $0x00, %xmm2, %xmm1
  4068. pxor %xmm0, %xmm1
  4069. pxor %xmm3, %xmm1
  4070. movdqa %xmm1, %xmm2
  4071. movdqa %xmm3, %xmm6
  4072. pslldq $8, %xmm2
  4073. psrldq $8, %xmm1
  4074. pxor %xmm2, %xmm0
  4075. pxor %xmm1, %xmm6
  4076. movdqa %xmm0, %xmm1
  4077. movdqa %xmm0, %xmm2
  4078. movdqa %xmm0, %xmm3
  4079. pslld $31, %xmm1
  4080. pslld $30, %xmm2
  4081. pslld $25, %xmm3
  4082. pxor %xmm2, %xmm1
  4083. pxor %xmm3, %xmm1
  4084. movdqa %xmm1, %xmm3
  4085. psrldq $4, %xmm3
  4086. pslldq $12, %xmm1
  4087. pxor %xmm1, %xmm0
  4088. movdqa %xmm0, %xmm1
  4089. movdqa %xmm0, %xmm2
  4090. psrld $0x01, %xmm1
  4091. psrld $2, %xmm2
  4092. pxor %xmm2, %xmm1
  4093. pxor %xmm0, %xmm1
  4094. psrld $7, %xmm0
  4095. pxor %xmm3, %xmm1
  4096. pxor %xmm0, %xmm1
  4097. pxor %xmm1, %xmm6
  4098. L_AES_GCM_encrypt_update_aesni_last_block_done:
  4099. L_AES_GCM_encrypt_update_aesni_done_enc:
  4100. movl 136(%esp), %esi
  4101. movl 144(%esp), %edi
  4102. movdqu 64(%esp), %xmm4
  4103. movdqa %xmm6, (%esi)
  4104. movdqu %xmm4, (%edi)
  4105. addl $0x60, %esp
  4106. popl %ebp
  4107. popl %edi
  4108. popl %esi
  4109. popl %ebx
  4110. ret
  4111. .size AES_GCM_encrypt_update_aesni,.-AES_GCM_encrypt_update_aesni
  4112. .text
  4113. .globl AES_GCM_encrypt_final_aesni
  4114. .type AES_GCM_encrypt_final_aesni,@function
  4115. .align 16
  4116. AES_GCM_encrypt_final_aesni:
  4117. pushl %esi
  4118. pushl %edi
  4119. pushl %ebp
  4120. subl $16, %esp
  4121. movl 32(%esp), %ebp
  4122. movl 52(%esp), %esi
  4123. movl 56(%esp), %edi
  4124. movdqa (%ebp), %xmm4
  4125. movdqa (%esi), %xmm5
  4126. movdqa (%edi), %xmm6
  4127. movdqa %xmm5, %xmm1
  4128. movdqa %xmm5, %xmm0
  4129. psrlq $63, %xmm1
  4130. psllq $0x01, %xmm0
  4131. pslldq $8, %xmm1
  4132. por %xmm1, %xmm0
  4133. pshufd $0xff, %xmm5, %xmm5
  4134. psrad $31, %xmm5
  4135. pand L_aes_gcm_mod2_128, %xmm5
  4136. pxor %xmm0, %xmm5
  4137. movl 44(%esp), %edx
  4138. movl 48(%esp), %ecx
  4139. shll $3, %edx
  4140. shll $3, %ecx
  4141. pinsrd $0x00, %edx, %xmm0
  4142. pinsrd $2, %ecx, %xmm0
  4143. movl 44(%esp), %edx
  4144. movl 48(%esp), %ecx
  4145. shrl $29, %edx
  4146. shrl $29, %ecx
  4147. pinsrd $0x01, %edx, %xmm0
  4148. pinsrd $3, %ecx, %xmm0
  4149. pxor %xmm0, %xmm4
  4150. pshufd $0x4e, %xmm5, %xmm1
  4151. pshufd $0x4e, %xmm4, %xmm2
  4152. movdqa %xmm4, %xmm3
  4153. movdqa %xmm4, %xmm0
  4154. pclmulqdq $0x11, %xmm5, %xmm3
  4155. pclmulqdq $0x00, %xmm5, %xmm0
  4156. pxor %xmm5, %xmm1
  4157. pxor %xmm4, %xmm2
  4158. pclmulqdq $0x00, %xmm2, %xmm1
  4159. pxor %xmm0, %xmm1
  4160. pxor %xmm3, %xmm1
  4161. movdqa %xmm1, %xmm2
  4162. movdqa %xmm3, %xmm4
  4163. pslldq $8, %xmm2
  4164. psrldq $8, %xmm1
  4165. pxor %xmm2, %xmm0
  4166. pxor %xmm1, %xmm4
  4167. movdqa %xmm0, %xmm1
  4168. movdqa %xmm0, %xmm2
  4169. movdqa %xmm0, %xmm3
  4170. pslld $31, %xmm1
  4171. pslld $30, %xmm2
  4172. pslld $25, %xmm3
  4173. pxor %xmm2, %xmm1
  4174. pxor %xmm3, %xmm1
  4175. movdqa %xmm1, %xmm3
  4176. psrldq $4, %xmm3
  4177. pslldq $12, %xmm1
  4178. pxor %xmm1, %xmm0
  4179. movdqa %xmm0, %xmm1
  4180. movdqa %xmm0, %xmm2
  4181. psrld $0x01, %xmm1
  4182. psrld $2, %xmm2
  4183. pxor %xmm2, %xmm1
  4184. pxor %xmm0, %xmm1
  4185. psrld $7, %xmm0
  4186. pxor %xmm3, %xmm1
  4187. pxor %xmm0, %xmm1
  4188. pxor %xmm1, %xmm4
  4189. pshufb L_aes_gcm_bswap_mask, %xmm4
  4190. movdqu %xmm6, %xmm0
  4191. pxor %xmm4, %xmm0
  4192. movl 36(%esp), %edi
  4193. cmpl $16, 40(%esp)
  4194. je L_AES_GCM_encrypt_final_aesni_store_tag_16
  4195. xorl %ecx, %ecx
  4196. movdqu %xmm0, (%esp)
  4197. L_AES_GCM_encrypt_final_aesni_store_tag_loop:
  4198. movzbl (%esp,%ecx,1), %eax
  4199. movb %al, (%edi,%ecx,1)
  4200. incl %ecx
  4201. cmpl 40(%esp), %ecx
  4202. jne L_AES_GCM_encrypt_final_aesni_store_tag_loop
  4203. jmp L_AES_GCM_encrypt_final_aesni_store_tag_done
  4204. L_AES_GCM_encrypt_final_aesni_store_tag_16:
  4205. movdqu %xmm0, (%edi)
  4206. L_AES_GCM_encrypt_final_aesni_store_tag_done:
  4207. addl $16, %esp
  4208. popl %ebp
  4209. popl %edi
  4210. popl %esi
  4211. ret
  4212. .size AES_GCM_encrypt_final_aesni,.-AES_GCM_encrypt_final_aesni
  4213. .text
  4214. .globl AES_GCM_decrypt_update_aesni
  4215. .type AES_GCM_decrypt_update_aesni,@function
  4216. .align 16
  4217. AES_GCM_decrypt_update_aesni:
  4218. pushl %ebx
  4219. pushl %esi
  4220. pushl %edi
  4221. pushl %ebp
  4222. subl $0xa0, %esp
  4223. movl 208(%esp), %esi
  4224. movdqa (%esi), %xmm4
  4225. movdqu %xmm4, 64(%esp)
  4226. movl 200(%esp), %esi
  4227. movl 204(%esp), %ebp
  4228. movdqa (%esi), %xmm6
  4229. movdqa (%ebp), %xmm5
  4230. movdqu %xmm6, 80(%esp)
  4231. movl 180(%esp), %ebp
  4232. movl 188(%esp), %edi
  4233. movl 192(%esp), %esi
  4234. movdqa %xmm5, %xmm1
  4235. movdqa %xmm5, %xmm0
  4236. psrlq $63, %xmm1
  4237. psllq $0x01, %xmm0
  4238. pslldq $8, %xmm1
  4239. por %xmm1, %xmm0
  4240. pshufd $0xff, %xmm5, %xmm5
  4241. psrad $31, %xmm5
  4242. pand L_aes_gcm_mod2_128, %xmm5
  4243. pxor %xmm0, %xmm5
  4244. xorl %ebx, %ebx
  4245. cmpl $0x40, 196(%esp)
  4246. movl 196(%esp), %eax
  4247. jl L_AES_GCM_decrypt_update_aesni_done_64
  4248. andl $0xffffffc0, %eax
  4249. movdqa %xmm6, %xmm2
  4250. # H ^ 1
  4251. movdqu %xmm5, (%esp)
  4252. # H ^ 2
  4253. pshufd $0x4e, %xmm5, %xmm1
  4254. pshufd $0x4e, %xmm5, %xmm2
  4255. movdqa %xmm5, %xmm3
  4256. movdqa %xmm5, %xmm0
  4257. pclmulqdq $0x11, %xmm5, %xmm3
  4258. pclmulqdq $0x00, %xmm5, %xmm0
  4259. pxor %xmm5, %xmm1
  4260. pxor %xmm5, %xmm2
  4261. pclmulqdq $0x00, %xmm2, %xmm1
  4262. pxor %xmm0, %xmm1
  4263. pxor %xmm3, %xmm1
  4264. movdqa %xmm1, %xmm2
  4265. movdqa %xmm3, %xmm4
  4266. pslldq $8, %xmm2
  4267. psrldq $8, %xmm1
  4268. pxor %xmm2, %xmm0
  4269. pxor %xmm1, %xmm4
  4270. movdqa %xmm0, %xmm1
  4271. movdqa %xmm0, %xmm2
  4272. movdqa %xmm0, %xmm3
  4273. pslld $31, %xmm1
  4274. pslld $30, %xmm2
  4275. pslld $25, %xmm3
  4276. pxor %xmm2, %xmm1
  4277. pxor %xmm3, %xmm1
  4278. movdqa %xmm1, %xmm3
  4279. psrldq $4, %xmm3
  4280. pslldq $12, %xmm1
  4281. pxor %xmm1, %xmm0
  4282. movdqa %xmm0, %xmm1
  4283. movdqa %xmm0, %xmm2
  4284. psrld $0x01, %xmm1
  4285. psrld $2, %xmm2
  4286. pxor %xmm2, %xmm1
  4287. pxor %xmm0, %xmm1
  4288. psrld $7, %xmm0
  4289. pxor %xmm3, %xmm1
  4290. pxor %xmm0, %xmm1
  4291. pxor %xmm1, %xmm4
  4292. movdqu %xmm4, 16(%esp)
  4293. # H ^ 3
  4294. pshufd $0x4e, %xmm5, %xmm1
  4295. pshufd $0x4e, %xmm4, %xmm2
  4296. movdqa %xmm4, %xmm3
  4297. movdqa %xmm4, %xmm0
  4298. pclmulqdq $0x11, %xmm5, %xmm3
  4299. pclmulqdq $0x00, %xmm5, %xmm0
  4300. pxor %xmm5, %xmm1
  4301. pxor %xmm4, %xmm2
  4302. pclmulqdq $0x00, %xmm2, %xmm1
  4303. pxor %xmm0, %xmm1
  4304. pxor %xmm3, %xmm1
  4305. movdqa %xmm1, %xmm2
  4306. movdqa %xmm3, %xmm7
  4307. pslldq $8, %xmm2
  4308. psrldq $8, %xmm1
  4309. pxor %xmm2, %xmm0
  4310. pxor %xmm1, %xmm7
  4311. movdqa %xmm0, %xmm1
  4312. movdqa %xmm0, %xmm2
  4313. movdqa %xmm0, %xmm3
  4314. pslld $31, %xmm1
  4315. pslld $30, %xmm2
  4316. pslld $25, %xmm3
  4317. pxor %xmm2, %xmm1
  4318. pxor %xmm3, %xmm1
  4319. movdqa %xmm1, %xmm3
  4320. psrldq $4, %xmm3
  4321. pslldq $12, %xmm1
  4322. pxor %xmm1, %xmm0
  4323. movdqa %xmm0, %xmm1
  4324. movdqa %xmm0, %xmm2
  4325. psrld $0x01, %xmm1
  4326. psrld $2, %xmm2
  4327. pxor %xmm2, %xmm1
  4328. pxor %xmm0, %xmm1
  4329. psrld $7, %xmm0
  4330. pxor %xmm3, %xmm1
  4331. pxor %xmm0, %xmm1
  4332. pxor %xmm1, %xmm7
  4333. movdqu %xmm7, 32(%esp)
  4334. # H ^ 4
  4335. pshufd $0x4e, %xmm4, %xmm1
  4336. pshufd $0x4e, %xmm4, %xmm2
  4337. movdqa %xmm4, %xmm3
  4338. movdqa %xmm4, %xmm0
  4339. pclmulqdq $0x11, %xmm4, %xmm3
  4340. pclmulqdq $0x00, %xmm4, %xmm0
  4341. pxor %xmm4, %xmm1
  4342. pxor %xmm4, %xmm2
  4343. pclmulqdq $0x00, %xmm2, %xmm1
  4344. pxor %xmm0, %xmm1
  4345. pxor %xmm3, %xmm1
  4346. movdqa %xmm1, %xmm2
  4347. movdqa %xmm3, %xmm7
  4348. pslldq $8, %xmm2
  4349. psrldq $8, %xmm1
  4350. pxor %xmm2, %xmm0
  4351. pxor %xmm1, %xmm7
  4352. movdqa %xmm0, %xmm1
  4353. movdqa %xmm0, %xmm2
  4354. movdqa %xmm0, %xmm3
  4355. pslld $31, %xmm1
  4356. pslld $30, %xmm2
  4357. pslld $25, %xmm3
  4358. pxor %xmm2, %xmm1
  4359. pxor %xmm3, %xmm1
  4360. movdqa %xmm1, %xmm3
  4361. psrldq $4, %xmm3
  4362. pslldq $12, %xmm1
  4363. pxor %xmm1, %xmm0
  4364. movdqa %xmm0, %xmm1
  4365. movdqa %xmm0, %xmm2
  4366. psrld $0x01, %xmm1
  4367. psrld $2, %xmm2
  4368. pxor %xmm2, %xmm1
  4369. pxor %xmm0, %xmm1
  4370. psrld $7, %xmm0
  4371. pxor %xmm3, %xmm1
  4372. pxor %xmm0, %xmm1
  4373. pxor %xmm1, %xmm7
  4374. movdqu %xmm7, 48(%esp)
  4375. cmpl %esi, %edi
  4376. jne L_AES_GCM_decrypt_update_aesni_ghash_64
  4377. L_AES_GCM_decrypt_update_aesni_ghash_64_inplace:
  4378. leal (%esi,%ebx,1), %ecx
  4379. leal (%edi,%ebx,1), %edx
  4380. # Encrypt 64 bytes of counter
  4381. movdqu 64(%esp), %xmm0
  4382. movdqa L_aes_gcm_bswap_epi64, %xmm7
  4383. movdqa %xmm0, %xmm1
  4384. movdqa %xmm0, %xmm2
  4385. movdqa %xmm0, %xmm3
  4386. pshufb %xmm7, %xmm0
  4387. paddd L_aes_gcm_one, %xmm1
  4388. pshufb %xmm7, %xmm1
  4389. paddd L_aes_gcm_two, %xmm2
  4390. pshufb %xmm7, %xmm2
  4391. paddd L_aes_gcm_three, %xmm3
  4392. pshufb %xmm7, %xmm3
  4393. movdqu 64(%esp), %xmm7
  4394. paddd L_aes_gcm_four, %xmm7
  4395. movdqu %xmm7, 64(%esp)
  4396. movdqa (%ebp), %xmm7
  4397. pxor %xmm7, %xmm0
  4398. pxor %xmm7, %xmm1
  4399. pxor %xmm7, %xmm2
  4400. pxor %xmm7, %xmm3
  4401. movdqa 16(%ebp), %xmm7
  4402. aesenc %xmm7, %xmm0
  4403. aesenc %xmm7, %xmm1
  4404. aesenc %xmm7, %xmm2
  4405. aesenc %xmm7, %xmm3
  4406. movdqa 32(%ebp), %xmm7
  4407. aesenc %xmm7, %xmm0
  4408. aesenc %xmm7, %xmm1
  4409. aesenc %xmm7, %xmm2
  4410. aesenc %xmm7, %xmm3
  4411. movdqa 48(%ebp), %xmm7
  4412. aesenc %xmm7, %xmm0
  4413. aesenc %xmm7, %xmm1
  4414. aesenc %xmm7, %xmm2
  4415. aesenc %xmm7, %xmm3
  4416. movdqa 64(%ebp), %xmm7
  4417. aesenc %xmm7, %xmm0
  4418. aesenc %xmm7, %xmm1
  4419. aesenc %xmm7, %xmm2
  4420. aesenc %xmm7, %xmm3
  4421. movdqa 80(%ebp), %xmm7
  4422. aesenc %xmm7, %xmm0
  4423. aesenc %xmm7, %xmm1
  4424. aesenc %xmm7, %xmm2
  4425. aesenc %xmm7, %xmm3
  4426. movdqa 96(%ebp), %xmm7
  4427. aesenc %xmm7, %xmm0
  4428. aesenc %xmm7, %xmm1
  4429. aesenc %xmm7, %xmm2
  4430. aesenc %xmm7, %xmm3
  4431. movdqa 112(%ebp), %xmm7
  4432. aesenc %xmm7, %xmm0
  4433. aesenc %xmm7, %xmm1
  4434. aesenc %xmm7, %xmm2
  4435. aesenc %xmm7, %xmm3
  4436. movdqa 128(%ebp), %xmm7
  4437. aesenc %xmm7, %xmm0
  4438. aesenc %xmm7, %xmm1
  4439. aesenc %xmm7, %xmm2
  4440. aesenc %xmm7, %xmm3
  4441. movdqa 144(%ebp), %xmm7
  4442. aesenc %xmm7, %xmm0
  4443. aesenc %xmm7, %xmm1
  4444. aesenc %xmm7, %xmm2
  4445. aesenc %xmm7, %xmm3
  4446. cmpl $11, 184(%esp)
  4447. movdqa 160(%ebp), %xmm7
  4448. jl L_AES_GCM_decrypt_update_aesniinplace_aesenc_64_ghash_avx_done
  4449. aesenc %xmm7, %xmm0
  4450. aesenc %xmm7, %xmm1
  4451. aesenc %xmm7, %xmm2
  4452. aesenc %xmm7, %xmm3
  4453. movdqa 176(%ebp), %xmm7
  4454. aesenc %xmm7, %xmm0
  4455. aesenc %xmm7, %xmm1
  4456. aesenc %xmm7, %xmm2
  4457. aesenc %xmm7, %xmm3
  4458. cmpl $13, 184(%esp)
  4459. movdqa 192(%ebp), %xmm7
  4460. jl L_AES_GCM_decrypt_update_aesniinplace_aesenc_64_ghash_avx_done
  4461. aesenc %xmm7, %xmm0
  4462. aesenc %xmm7, %xmm1
  4463. aesenc %xmm7, %xmm2
  4464. aesenc %xmm7, %xmm3
  4465. movdqa 208(%ebp), %xmm7
  4466. aesenc %xmm7, %xmm0
  4467. aesenc %xmm7, %xmm1
  4468. aesenc %xmm7, %xmm2
  4469. aesenc %xmm7, %xmm3
  4470. movdqa 224(%ebp), %xmm7
  4471. L_AES_GCM_decrypt_update_aesniinplace_aesenc_64_ghash_avx_done:
  4472. aesenclast %xmm7, %xmm0
  4473. aesenclast %xmm7, %xmm1
  4474. movdqu (%ecx), %xmm4
  4475. movdqu 16(%ecx), %xmm5
  4476. pxor %xmm4, %xmm0
  4477. pxor %xmm5, %xmm1
  4478. movdqu %xmm4, 96(%esp)
  4479. movdqu %xmm5, 112(%esp)
  4480. movdqu %xmm0, (%edx)
  4481. movdqu %xmm1, 16(%edx)
  4482. aesenclast %xmm7, %xmm2
  4483. aesenclast %xmm7, %xmm3
  4484. movdqu 32(%ecx), %xmm4
  4485. movdqu 48(%ecx), %xmm5
  4486. pxor %xmm4, %xmm2
  4487. pxor %xmm5, %xmm3
  4488. movdqu %xmm4, 128(%esp)
  4489. movdqu %xmm5, 144(%esp)
  4490. movdqu %xmm2, 32(%edx)
  4491. movdqu %xmm3, 48(%edx)
  4492. # ghash encrypted counter
  4493. movdqu 80(%esp), %xmm2
  4494. movdqu 48(%esp), %xmm7
  4495. movdqu 96(%esp), %xmm0
  4496. pshufb L_aes_gcm_bswap_mask, %xmm0
  4497. pxor %xmm2, %xmm0
  4498. pshufd $0x4e, %xmm7, %xmm1
  4499. pshufd $0x4e, %xmm0, %xmm5
  4500. pxor %xmm7, %xmm1
  4501. pxor %xmm0, %xmm5
  4502. movdqa %xmm0, %xmm3
  4503. pclmulqdq $0x11, %xmm7, %xmm3
  4504. movdqa %xmm0, %xmm2
  4505. pclmulqdq $0x00, %xmm7, %xmm2
  4506. pclmulqdq $0x00, %xmm5, %xmm1
  4507. pxor %xmm2, %xmm1
  4508. pxor %xmm3, %xmm1
  4509. movdqu 32(%esp), %xmm7
  4510. movdqu 112(%esp), %xmm0
  4511. pshufd $0x4e, %xmm7, %xmm4
  4512. pshufb L_aes_gcm_bswap_mask, %xmm0
  4513. pxor %xmm7, %xmm4
  4514. pshufd $0x4e, %xmm0, %xmm5
  4515. pxor %xmm0, %xmm5
  4516. movdqa %xmm0, %xmm6
  4517. pclmulqdq $0x11, %xmm7, %xmm6
  4518. pclmulqdq $0x00, %xmm0, %xmm7
  4519. pclmulqdq $0x00, %xmm5, %xmm4
  4520. pxor %xmm7, %xmm1
  4521. pxor %xmm7, %xmm2
  4522. pxor %xmm6, %xmm1
  4523. pxor %xmm6, %xmm3
  4524. pxor %xmm4, %xmm1
  4525. movdqu 16(%esp), %xmm7
  4526. movdqu 128(%esp), %xmm0
  4527. pshufd $0x4e, %xmm7, %xmm4
  4528. pshufb L_aes_gcm_bswap_mask, %xmm0
  4529. pxor %xmm7, %xmm4
  4530. pshufd $0x4e, %xmm0, %xmm5
  4531. pxor %xmm0, %xmm5
  4532. movdqa %xmm0, %xmm6
  4533. pclmulqdq $0x11, %xmm7, %xmm6
  4534. pclmulqdq $0x00, %xmm0, %xmm7
  4535. pclmulqdq $0x00, %xmm5, %xmm4
  4536. pxor %xmm7, %xmm1
  4537. pxor %xmm7, %xmm2
  4538. pxor %xmm6, %xmm1
  4539. pxor %xmm6, %xmm3
  4540. pxor %xmm4, %xmm1
  4541. movdqu (%esp), %xmm7
  4542. movdqu 144(%esp), %xmm0
  4543. pshufd $0x4e, %xmm7, %xmm4
  4544. pshufb L_aes_gcm_bswap_mask, %xmm0
  4545. pxor %xmm7, %xmm4
  4546. pshufd $0x4e, %xmm0, %xmm5
  4547. pxor %xmm0, %xmm5
  4548. movdqa %xmm0, %xmm6
  4549. pclmulqdq $0x11, %xmm7, %xmm6
  4550. pclmulqdq $0x00, %xmm0, %xmm7
  4551. pclmulqdq $0x00, %xmm5, %xmm4
  4552. pxor %xmm7, %xmm1
  4553. pxor %xmm7, %xmm2
  4554. pxor %xmm6, %xmm1
  4555. pxor %xmm6, %xmm3
  4556. pxor %xmm4, %xmm1
  4557. movdqa %xmm1, %xmm5
  4558. psrldq $8, %xmm1
  4559. pslldq $8, %xmm5
  4560. pxor %xmm5, %xmm2
  4561. pxor %xmm1, %xmm3
  4562. movdqa %xmm2, %xmm7
  4563. movdqa %xmm2, %xmm4
  4564. movdqa %xmm2, %xmm5
  4565. pslld $31, %xmm7
  4566. pslld $30, %xmm4
  4567. pslld $25, %xmm5
  4568. pxor %xmm4, %xmm7
  4569. pxor %xmm5, %xmm7
  4570. movdqa %xmm7, %xmm4
  4571. pslldq $12, %xmm7
  4572. psrldq $4, %xmm4
  4573. pxor %xmm7, %xmm2
  4574. movdqa %xmm2, %xmm5
  4575. movdqa %xmm2, %xmm1
  4576. movdqa %xmm2, %xmm0
  4577. psrld $0x01, %xmm5
  4578. psrld $2, %xmm1
  4579. psrld $7, %xmm0
  4580. pxor %xmm1, %xmm5
  4581. pxor %xmm0, %xmm5
  4582. pxor %xmm4, %xmm5
  4583. pxor %xmm5, %xmm2
  4584. pxor %xmm3, %xmm2
  4585. movdqu %xmm2, 80(%esp)
  4586. addl $0x40, %ebx
  4587. cmpl %eax, %ebx
  4588. jl L_AES_GCM_decrypt_update_aesni_ghash_64_inplace
  4589. jmp L_AES_GCM_decrypt_update_aesni_ghash_64_done
  4590. L_AES_GCM_decrypt_update_aesni_ghash_64:
  4591. leal (%esi,%ebx,1), %ecx
  4592. leal (%edi,%ebx,1), %edx
  4593. # Encrypt 64 bytes of counter
  4594. movdqu 64(%esp), %xmm0
  4595. movdqa L_aes_gcm_bswap_epi64, %xmm7
  4596. movdqa %xmm0, %xmm1
  4597. movdqa %xmm0, %xmm2
  4598. movdqa %xmm0, %xmm3
  4599. pshufb %xmm7, %xmm0
  4600. paddd L_aes_gcm_one, %xmm1
  4601. pshufb %xmm7, %xmm1
  4602. paddd L_aes_gcm_two, %xmm2
  4603. pshufb %xmm7, %xmm2
  4604. paddd L_aes_gcm_three, %xmm3
  4605. pshufb %xmm7, %xmm3
  4606. movdqu 64(%esp), %xmm7
  4607. paddd L_aes_gcm_four, %xmm7
  4608. movdqu %xmm7, 64(%esp)
  4609. movdqa (%ebp), %xmm7
  4610. pxor %xmm7, %xmm0
  4611. pxor %xmm7, %xmm1
  4612. pxor %xmm7, %xmm2
  4613. pxor %xmm7, %xmm3
  4614. movdqa 16(%ebp), %xmm7
  4615. aesenc %xmm7, %xmm0
  4616. aesenc %xmm7, %xmm1
  4617. aesenc %xmm7, %xmm2
  4618. aesenc %xmm7, %xmm3
  4619. movdqa 32(%ebp), %xmm7
  4620. aesenc %xmm7, %xmm0
  4621. aesenc %xmm7, %xmm1
  4622. aesenc %xmm7, %xmm2
  4623. aesenc %xmm7, %xmm3
  4624. movdqa 48(%ebp), %xmm7
  4625. aesenc %xmm7, %xmm0
  4626. aesenc %xmm7, %xmm1
  4627. aesenc %xmm7, %xmm2
  4628. aesenc %xmm7, %xmm3
  4629. movdqa 64(%ebp), %xmm7
  4630. aesenc %xmm7, %xmm0
  4631. aesenc %xmm7, %xmm1
  4632. aesenc %xmm7, %xmm2
  4633. aesenc %xmm7, %xmm3
  4634. movdqa 80(%ebp), %xmm7
  4635. aesenc %xmm7, %xmm0
  4636. aesenc %xmm7, %xmm1
  4637. aesenc %xmm7, %xmm2
  4638. aesenc %xmm7, %xmm3
  4639. movdqa 96(%ebp), %xmm7
  4640. aesenc %xmm7, %xmm0
  4641. aesenc %xmm7, %xmm1
  4642. aesenc %xmm7, %xmm2
  4643. aesenc %xmm7, %xmm3
  4644. movdqa 112(%ebp), %xmm7
  4645. aesenc %xmm7, %xmm0
  4646. aesenc %xmm7, %xmm1
  4647. aesenc %xmm7, %xmm2
  4648. aesenc %xmm7, %xmm3
  4649. movdqa 128(%ebp), %xmm7
  4650. aesenc %xmm7, %xmm0
  4651. aesenc %xmm7, %xmm1
  4652. aesenc %xmm7, %xmm2
  4653. aesenc %xmm7, %xmm3
  4654. movdqa 144(%ebp), %xmm7
  4655. aesenc %xmm7, %xmm0
  4656. aesenc %xmm7, %xmm1
  4657. aesenc %xmm7, %xmm2
  4658. aesenc %xmm7, %xmm3
  4659. cmpl $11, 184(%esp)
  4660. movdqa 160(%ebp), %xmm7
  4661. jl L_AES_GCM_decrypt_update_aesni_aesenc_64_ghash_avx_done
  4662. aesenc %xmm7, %xmm0
  4663. aesenc %xmm7, %xmm1
  4664. aesenc %xmm7, %xmm2
  4665. aesenc %xmm7, %xmm3
  4666. movdqa 176(%ebp), %xmm7
  4667. aesenc %xmm7, %xmm0
  4668. aesenc %xmm7, %xmm1
  4669. aesenc %xmm7, %xmm2
  4670. aesenc %xmm7, %xmm3
  4671. cmpl $13, 184(%esp)
  4672. movdqa 192(%ebp), %xmm7
  4673. jl L_AES_GCM_decrypt_update_aesni_aesenc_64_ghash_avx_done
  4674. aesenc %xmm7, %xmm0
  4675. aesenc %xmm7, %xmm1
  4676. aesenc %xmm7, %xmm2
  4677. aesenc %xmm7, %xmm3
  4678. movdqa 208(%ebp), %xmm7
  4679. aesenc %xmm7, %xmm0
  4680. aesenc %xmm7, %xmm1
  4681. aesenc %xmm7, %xmm2
  4682. aesenc %xmm7, %xmm3
  4683. movdqa 224(%ebp), %xmm7
  4684. L_AES_GCM_decrypt_update_aesni_aesenc_64_ghash_avx_done:
  4685. aesenclast %xmm7, %xmm0
  4686. aesenclast %xmm7, %xmm1
  4687. movdqu (%ecx), %xmm4
  4688. movdqu 16(%ecx), %xmm5
  4689. pxor %xmm4, %xmm0
  4690. pxor %xmm5, %xmm1
  4691. movdqu %xmm4, (%ecx)
  4692. movdqu %xmm5, 16(%ecx)
  4693. movdqu %xmm0, (%edx)
  4694. movdqu %xmm1, 16(%edx)
  4695. aesenclast %xmm7, %xmm2
  4696. aesenclast %xmm7, %xmm3
  4697. movdqu 32(%ecx), %xmm4
  4698. movdqu 48(%ecx), %xmm5
  4699. pxor %xmm4, %xmm2
  4700. pxor %xmm5, %xmm3
  4701. movdqu %xmm4, 32(%ecx)
  4702. movdqu %xmm5, 48(%ecx)
  4703. movdqu %xmm2, 32(%edx)
  4704. movdqu %xmm3, 48(%edx)
  4705. # ghash encrypted counter
  4706. movdqu 80(%esp), %xmm2
  4707. movdqu 48(%esp), %xmm7
  4708. movdqu (%ecx), %xmm0
  4709. pshufb L_aes_gcm_bswap_mask, %xmm0
  4710. pxor %xmm2, %xmm0
  4711. pshufd $0x4e, %xmm7, %xmm1
  4712. pshufd $0x4e, %xmm0, %xmm5
  4713. pxor %xmm7, %xmm1
  4714. pxor %xmm0, %xmm5
  4715. movdqa %xmm0, %xmm3
  4716. pclmulqdq $0x11, %xmm7, %xmm3
  4717. movdqa %xmm0, %xmm2
  4718. pclmulqdq $0x00, %xmm7, %xmm2
  4719. pclmulqdq $0x00, %xmm5, %xmm1
  4720. pxor %xmm2, %xmm1
  4721. pxor %xmm3, %xmm1
  4722. movdqu 32(%esp), %xmm7
  4723. movdqu 16(%ecx), %xmm0
  4724. pshufd $0x4e, %xmm7, %xmm4
  4725. pshufb L_aes_gcm_bswap_mask, %xmm0
  4726. pxor %xmm7, %xmm4
  4727. pshufd $0x4e, %xmm0, %xmm5
  4728. pxor %xmm0, %xmm5
  4729. movdqa %xmm0, %xmm6
  4730. pclmulqdq $0x11, %xmm7, %xmm6
  4731. pclmulqdq $0x00, %xmm0, %xmm7
  4732. pclmulqdq $0x00, %xmm5, %xmm4
  4733. pxor %xmm7, %xmm1
  4734. pxor %xmm7, %xmm2
  4735. pxor %xmm6, %xmm1
  4736. pxor %xmm6, %xmm3
  4737. pxor %xmm4, %xmm1
  4738. movdqu 16(%esp), %xmm7
  4739. movdqu 32(%ecx), %xmm0
  4740. pshufd $0x4e, %xmm7, %xmm4
  4741. pshufb L_aes_gcm_bswap_mask, %xmm0
  4742. pxor %xmm7, %xmm4
  4743. pshufd $0x4e, %xmm0, %xmm5
  4744. pxor %xmm0, %xmm5
  4745. movdqa %xmm0, %xmm6
  4746. pclmulqdq $0x11, %xmm7, %xmm6
  4747. pclmulqdq $0x00, %xmm0, %xmm7
  4748. pclmulqdq $0x00, %xmm5, %xmm4
  4749. pxor %xmm7, %xmm1
  4750. pxor %xmm7, %xmm2
  4751. pxor %xmm6, %xmm1
  4752. pxor %xmm6, %xmm3
  4753. pxor %xmm4, %xmm1
  4754. movdqu (%esp), %xmm7
  4755. movdqu 48(%ecx), %xmm0
  4756. pshufd $0x4e, %xmm7, %xmm4
  4757. pshufb L_aes_gcm_bswap_mask, %xmm0
  4758. pxor %xmm7, %xmm4
  4759. pshufd $0x4e, %xmm0, %xmm5
  4760. pxor %xmm0, %xmm5
  4761. movdqa %xmm0, %xmm6
  4762. pclmulqdq $0x11, %xmm7, %xmm6
  4763. pclmulqdq $0x00, %xmm0, %xmm7
  4764. pclmulqdq $0x00, %xmm5, %xmm4
  4765. pxor %xmm7, %xmm1
  4766. pxor %xmm7, %xmm2
  4767. pxor %xmm6, %xmm1
  4768. pxor %xmm6, %xmm3
  4769. pxor %xmm4, %xmm1
  4770. movdqa %xmm1, %xmm5
  4771. psrldq $8, %xmm1
  4772. pslldq $8, %xmm5
  4773. pxor %xmm5, %xmm2
  4774. pxor %xmm1, %xmm3
  4775. movdqa %xmm2, %xmm7
  4776. movdqa %xmm2, %xmm4
  4777. movdqa %xmm2, %xmm5
  4778. pslld $31, %xmm7
  4779. pslld $30, %xmm4
  4780. pslld $25, %xmm5
  4781. pxor %xmm4, %xmm7
  4782. pxor %xmm5, %xmm7
  4783. movdqa %xmm7, %xmm4
  4784. pslldq $12, %xmm7
  4785. psrldq $4, %xmm4
  4786. pxor %xmm7, %xmm2
  4787. movdqa %xmm2, %xmm5
  4788. movdqa %xmm2, %xmm1
  4789. movdqa %xmm2, %xmm0
  4790. psrld $0x01, %xmm5
  4791. psrld $2, %xmm1
  4792. psrld $7, %xmm0
  4793. pxor %xmm1, %xmm5
  4794. pxor %xmm0, %xmm5
  4795. pxor %xmm4, %xmm5
  4796. pxor %xmm5, %xmm2
  4797. pxor %xmm3, %xmm2
  4798. movdqu %xmm2, 80(%esp)
  4799. addl $0x40, %ebx
  4800. cmpl %eax, %ebx
  4801. jl L_AES_GCM_decrypt_update_aesni_ghash_64
  4802. L_AES_GCM_decrypt_update_aesni_ghash_64_done:
  4803. movdqa %xmm2, %xmm6
  4804. movdqu (%esp), %xmm5
  4805. L_AES_GCM_decrypt_update_aesni_done_64:
  4806. movl 196(%esp), %edx
  4807. cmpl %edx, %ebx
  4808. jge L_AES_GCM_decrypt_update_aesni_done_dec
  4809. movl 196(%esp), %eax
  4810. andl $0xfffffff0, %eax
  4811. cmpl %eax, %ebx
  4812. jge L_AES_GCM_decrypt_update_aesni_last_block_done
  4813. L_AES_GCM_decrypt_update_aesni_last_block_start:
  4814. leal (%esi,%ebx,1), %ecx
  4815. leal (%edi,%ebx,1), %edx
  4816. movdqu (%ecx), %xmm1
  4817. pshufb L_aes_gcm_bswap_mask, %xmm1
  4818. pxor %xmm6, %xmm1
  4819. movdqu %xmm1, (%esp)
  4820. movdqu 64(%esp), %xmm0
  4821. movdqa %xmm0, %xmm1
  4822. pshufb L_aes_gcm_bswap_epi64, %xmm0
  4823. paddd L_aes_gcm_one, %xmm1
  4824. pxor (%ebp), %xmm0
  4825. movdqu %xmm1, 64(%esp)
  4826. movdqu (%esp), %xmm4
  4827. pclmulqdq $16, %xmm5, %xmm4
  4828. aesenc 16(%ebp), %xmm0
  4829. aesenc 32(%ebp), %xmm0
  4830. movdqu (%esp), %xmm7
  4831. pclmulqdq $0x01, %xmm5, %xmm7
  4832. aesenc 48(%ebp), %xmm0
  4833. aesenc 64(%ebp), %xmm0
  4834. aesenc 80(%ebp), %xmm0
  4835. movdqu (%esp), %xmm1
  4836. pclmulqdq $0x11, %xmm5, %xmm1
  4837. aesenc 96(%ebp), %xmm0
  4838. pxor %xmm7, %xmm4
  4839. movdqa %xmm4, %xmm2
  4840. psrldq $8, %xmm4
  4841. pslldq $8, %xmm2
  4842. aesenc 112(%ebp), %xmm0
  4843. movdqu (%esp), %xmm7
  4844. pclmulqdq $0x00, %xmm5, %xmm7
  4845. pxor %xmm7, %xmm2
  4846. pxor %xmm4, %xmm1
  4847. movdqa L_aes_gcm_mod2_128, %xmm3
  4848. movdqa %xmm2, %xmm7
  4849. pclmulqdq $16, %xmm3, %xmm7
  4850. aesenc 128(%ebp), %xmm0
  4851. pshufd $0x4e, %xmm2, %xmm4
  4852. pxor %xmm7, %xmm4
  4853. movdqa %xmm4, %xmm7
  4854. pclmulqdq $16, %xmm3, %xmm7
  4855. aesenc 144(%ebp), %xmm0
  4856. pshufd $0x4e, %xmm4, %xmm6
  4857. pxor %xmm7, %xmm6
  4858. pxor %xmm1, %xmm6
  4859. cmpl $11, 184(%esp)
  4860. movdqa 160(%ebp), %xmm1
  4861. jl L_AES_GCM_decrypt_update_aesni_aesenc_gfmul_last
  4862. aesenc %xmm1, %xmm0
  4863. aesenc 176(%ebp), %xmm0
  4864. cmpl $13, 184(%esp)
  4865. movdqa 192(%ebp), %xmm1
  4866. jl L_AES_GCM_decrypt_update_aesni_aesenc_gfmul_last
  4867. aesenc %xmm1, %xmm0
  4868. aesenc 208(%ebp), %xmm0
  4869. movdqa 224(%ebp), %xmm1
  4870. L_AES_GCM_decrypt_update_aesni_aesenc_gfmul_last:
  4871. aesenclast %xmm1, %xmm0
  4872. movdqu (%ecx), %xmm1
  4873. pxor %xmm1, %xmm0
  4874. movdqu %xmm0, (%edx)
  4875. addl $16, %ebx
  4876. cmpl %eax, %ebx
  4877. jl L_AES_GCM_decrypt_update_aesni_last_block_start
  4878. L_AES_GCM_decrypt_update_aesni_last_block_done:
  4879. L_AES_GCM_decrypt_update_aesni_done_dec:
  4880. movl 200(%esp), %esi
  4881. movl 208(%esp), %edi
  4882. movdqu 64(%esp), %xmm4
  4883. movdqa %xmm6, (%esi)
  4884. movdqu %xmm4, (%edi)
  4885. addl $0xa0, %esp
  4886. popl %ebp
  4887. popl %edi
  4888. popl %esi
  4889. popl %ebx
  4890. ret
  4891. .size AES_GCM_decrypt_update_aesni,.-AES_GCM_decrypt_update_aesni
  4892. .text
  4893. .globl AES_GCM_decrypt_final_aesni
  4894. .type AES_GCM_decrypt_final_aesni,@function
  4895. .align 16
  4896. AES_GCM_decrypt_final_aesni:
  4897. pushl %ebx
  4898. pushl %esi
  4899. pushl %edi
  4900. pushl %ebp
  4901. subl $16, %esp
  4902. movl 36(%esp), %ebp
  4903. movl 56(%esp), %esi
  4904. movl 60(%esp), %edi
  4905. movdqa (%ebp), %xmm6
  4906. movdqa (%esi), %xmm5
  4907. movdqa (%edi), %xmm7
  4908. movdqa %xmm5, %xmm1
  4909. movdqa %xmm5, %xmm0
  4910. psrlq $63, %xmm1
  4911. psllq $0x01, %xmm0
  4912. pslldq $8, %xmm1
  4913. por %xmm1, %xmm0
  4914. pshufd $0xff, %xmm5, %xmm5
  4915. psrad $31, %xmm5
  4916. pand L_aes_gcm_mod2_128, %xmm5
  4917. pxor %xmm0, %xmm5
  4918. movl 48(%esp), %edx
  4919. movl 52(%esp), %ecx
  4920. shll $3, %edx
  4921. shll $3, %ecx
  4922. pinsrd $0x00, %edx, %xmm0
  4923. pinsrd $2, %ecx, %xmm0
  4924. movl 48(%esp), %edx
  4925. movl 52(%esp), %ecx
  4926. shrl $29, %edx
  4927. shrl $29, %ecx
  4928. pinsrd $0x01, %edx, %xmm0
  4929. pinsrd $3, %ecx, %xmm0
  4930. pxor %xmm0, %xmm6
  4931. pshufd $0x4e, %xmm5, %xmm1
  4932. pshufd $0x4e, %xmm6, %xmm2
  4933. movdqa %xmm6, %xmm3
  4934. movdqa %xmm6, %xmm0
  4935. pclmulqdq $0x11, %xmm5, %xmm3
  4936. pclmulqdq $0x00, %xmm5, %xmm0
  4937. pxor %xmm5, %xmm1
  4938. pxor %xmm6, %xmm2
  4939. pclmulqdq $0x00, %xmm2, %xmm1
  4940. pxor %xmm0, %xmm1
  4941. pxor %xmm3, %xmm1
  4942. movdqa %xmm1, %xmm2
  4943. movdqa %xmm3, %xmm6
  4944. pslldq $8, %xmm2
  4945. psrldq $8, %xmm1
  4946. pxor %xmm2, %xmm0
  4947. pxor %xmm1, %xmm6
  4948. movdqa %xmm0, %xmm1
  4949. movdqa %xmm0, %xmm2
  4950. movdqa %xmm0, %xmm3
  4951. pslld $31, %xmm1
  4952. pslld $30, %xmm2
  4953. pslld $25, %xmm3
  4954. pxor %xmm2, %xmm1
  4955. pxor %xmm3, %xmm1
  4956. movdqa %xmm1, %xmm3
  4957. psrldq $4, %xmm3
  4958. pslldq $12, %xmm1
  4959. pxor %xmm1, %xmm0
  4960. movdqa %xmm0, %xmm1
  4961. movdqa %xmm0, %xmm2
  4962. psrld $0x01, %xmm1
  4963. psrld $2, %xmm2
  4964. pxor %xmm2, %xmm1
  4965. pxor %xmm0, %xmm1
  4966. psrld $7, %xmm0
  4967. pxor %xmm3, %xmm1
  4968. pxor %xmm0, %xmm1
  4969. pxor %xmm1, %xmm6
  4970. pshufb L_aes_gcm_bswap_mask, %xmm6
  4971. movdqu %xmm7, %xmm0
  4972. pxor %xmm6, %xmm0
  4973. movl 40(%esp), %esi
  4974. movl 64(%esp), %edi
  4975. cmpl $16, 44(%esp)
  4976. je L_AES_GCM_decrypt_final_aesni_cmp_tag_16
  4977. subl $16, %esp
  4978. xorl %ecx, %ecx
  4979. xorl %ebx, %ebx
  4980. movdqu %xmm0, (%esp)
  4981. L_AES_GCM_decrypt_final_aesni_cmp_tag_loop:
  4982. movzbl (%esp,%ecx,1), %eax
  4983. xorb (%esi,%ecx,1), %al
  4984. orb %al, %bl
  4985. incl %ecx
  4986. cmpl 44(%esp), %ecx
  4987. jne L_AES_GCM_decrypt_final_aesni_cmp_tag_loop
  4988. cmpb $0x00, %bl
  4989. sete %bl
  4990. addl $16, %esp
  4991. xorl %ecx, %ecx
  4992. jmp L_AES_GCM_decrypt_final_aesni_cmp_tag_done
  4993. L_AES_GCM_decrypt_final_aesni_cmp_tag_16:
  4994. movdqu (%esi), %xmm1
  4995. pcmpeqb %xmm1, %xmm0
  4996. pmovmskb %xmm0, %edx
  4997. # %%edx == 0xFFFF then return 1 else => return 0
  4998. xorl %ebx, %ebx
  4999. cmpl $0xffff, %edx
  5000. sete %bl
  5001. L_AES_GCM_decrypt_final_aesni_cmp_tag_done:
  5002. movl %ebx, (%edi)
  5003. addl $16, %esp
  5004. popl %ebp
  5005. popl %edi
  5006. popl %esi
  5007. popl %ebx
  5008. ret
  5009. .size AES_GCM_decrypt_final_aesni,.-AES_GCM_decrypt_final_aesni
  5010. #endif /* WOLFSSL_AESGCM_STREAM */
  5011. #ifdef HAVE_INTEL_AVX1
  5012. .text
  5013. .globl AES_GCM_encrypt_avx1
  5014. .type AES_GCM_encrypt_avx1,@function
  5015. .align 16
  5016. AES_GCM_encrypt_avx1:
  5017. pushl %ebx
  5018. pushl %esi
  5019. pushl %edi
  5020. pushl %ebp
  5021. subl $0x70, %esp
  5022. movl 144(%esp), %esi
  5023. movl 168(%esp), %ebp
  5024. movl 160(%esp), %edx
  5025. vpxor %xmm0, %xmm0, %xmm0
  5026. vpxor %xmm2, %xmm2, %xmm2
  5027. cmpl $12, %edx
  5028. jne L_AES_GCM_encrypt_avx1_iv_not_12
  5029. # # Calculate values when IV is 12 bytes
  5030. # Set counter based on IV
  5031. movl $0x1000000, %ecx
  5032. vpinsrd $0x00, (%esi), %xmm0, %xmm0
  5033. vpinsrd $0x01, 4(%esi), %xmm0, %xmm0
  5034. vpinsrd $2, 8(%esi), %xmm0, %xmm0
  5035. vpinsrd $3, %ecx, %xmm0, %xmm0
  5036. # H = Encrypt X(=0) and T = Encrypt counter
  5037. vmovdqa (%ebp), %xmm1
  5038. vpxor %xmm1, %xmm0, %xmm5
  5039. vmovdqa 16(%ebp), %xmm3
  5040. vaesenc %xmm3, %xmm1, %xmm1
  5041. vaesenc %xmm3, %xmm5, %xmm5
  5042. vmovdqa 32(%ebp), %xmm3
  5043. vaesenc %xmm3, %xmm1, %xmm1
  5044. vaesenc %xmm3, %xmm5, %xmm5
  5045. vmovdqa 48(%ebp), %xmm3
  5046. vaesenc %xmm3, %xmm1, %xmm1
  5047. vaesenc %xmm3, %xmm5, %xmm5
  5048. vmovdqa 64(%ebp), %xmm3
  5049. vaesenc %xmm3, %xmm1, %xmm1
  5050. vaesenc %xmm3, %xmm5, %xmm5
  5051. vmovdqa 80(%ebp), %xmm3
  5052. vaesenc %xmm3, %xmm1, %xmm1
  5053. vaesenc %xmm3, %xmm5, %xmm5
  5054. vmovdqa 96(%ebp), %xmm3
  5055. vaesenc %xmm3, %xmm1, %xmm1
  5056. vaesenc %xmm3, %xmm5, %xmm5
  5057. vmovdqa 112(%ebp), %xmm3
  5058. vaesenc %xmm3, %xmm1, %xmm1
  5059. vaesenc %xmm3, %xmm5, %xmm5
  5060. vmovdqa 128(%ebp), %xmm3
  5061. vaesenc %xmm3, %xmm1, %xmm1
  5062. vaesenc %xmm3, %xmm5, %xmm5
  5063. vmovdqa 144(%ebp), %xmm3
  5064. vaesenc %xmm3, %xmm1, %xmm1
  5065. vaesenc %xmm3, %xmm5, %xmm5
  5066. cmpl $11, 172(%esp)
  5067. vmovdqa 160(%ebp), %xmm3
  5068. jl L_AES_GCM_encrypt_avx1_calc_iv_12_last
  5069. vaesenc %xmm3, %xmm1, %xmm1
  5070. vaesenc %xmm3, %xmm5, %xmm5
  5071. vmovdqa 176(%ebp), %xmm3
  5072. vaesenc %xmm3, %xmm1, %xmm1
  5073. vaesenc %xmm3, %xmm5, %xmm5
  5074. cmpl $13, 172(%esp)
  5075. vmovdqa 192(%ebp), %xmm3
  5076. jl L_AES_GCM_encrypt_avx1_calc_iv_12_last
  5077. vaesenc %xmm3, %xmm1, %xmm1
  5078. vaesenc %xmm3, %xmm5, %xmm5
  5079. vmovdqa 208(%ebp), %xmm3
  5080. vaesenc %xmm3, %xmm1, %xmm1
  5081. vaesenc %xmm3, %xmm5, %xmm5
  5082. vmovdqa 224(%ebp), %xmm3
  5083. L_AES_GCM_encrypt_avx1_calc_iv_12_last:
  5084. vaesenclast %xmm3, %xmm1, %xmm1
  5085. vaesenclast %xmm3, %xmm5, %xmm5
  5086. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm1, %xmm1
  5087. vmovdqu %xmm5, 80(%esp)
  5088. jmp L_AES_GCM_encrypt_avx1_iv_done
  5089. L_AES_GCM_encrypt_avx1_iv_not_12:
  5090. # Calculate values when IV is not 12 bytes
  5091. # H = Encrypt X(=0)
  5092. vmovdqa (%ebp), %xmm1
  5093. vaesenc 16(%ebp), %xmm1, %xmm1
  5094. vaesenc 32(%ebp), %xmm1, %xmm1
  5095. vaesenc 48(%ebp), %xmm1, %xmm1
  5096. vaesenc 64(%ebp), %xmm1, %xmm1
  5097. vaesenc 80(%ebp), %xmm1, %xmm1
  5098. vaesenc 96(%ebp), %xmm1, %xmm1
  5099. vaesenc 112(%ebp), %xmm1, %xmm1
  5100. vaesenc 128(%ebp), %xmm1, %xmm1
  5101. vaesenc 144(%ebp), %xmm1, %xmm1
  5102. cmpl $11, 172(%esp)
  5103. vmovdqa 160(%ebp), %xmm5
  5104. jl L_AES_GCM_encrypt_avx1_calc_iv_1_aesenc_avx_last
  5105. vaesenc %xmm5, %xmm1, %xmm1
  5106. vaesenc 176(%ebp), %xmm1, %xmm1
  5107. cmpl $13, 172(%esp)
  5108. vmovdqa 192(%ebp), %xmm5
  5109. jl L_AES_GCM_encrypt_avx1_calc_iv_1_aesenc_avx_last
  5110. vaesenc %xmm5, %xmm1, %xmm1
  5111. vaesenc 208(%ebp), %xmm1, %xmm1
  5112. vmovdqa 224(%ebp), %xmm5
  5113. L_AES_GCM_encrypt_avx1_calc_iv_1_aesenc_avx_last:
  5114. vaesenclast %xmm5, %xmm1, %xmm1
  5115. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm1, %xmm1
  5116. # Calc counter
  5117. # Initialization vector
  5118. cmpl $0x00, %edx
  5119. movl $0x00, %ecx
  5120. je L_AES_GCM_encrypt_avx1_calc_iv_done
  5121. cmpl $16, %edx
  5122. jl L_AES_GCM_encrypt_avx1_calc_iv_lt16
  5123. andl $0xfffffff0, %edx
  5124. L_AES_GCM_encrypt_avx1_calc_iv_16_loop:
  5125. vmovdqu (%esi,%ecx,1), %xmm4
  5126. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm4, %xmm4
  5127. vpxor %xmm4, %xmm0, %xmm0
  5128. # ghash_gfmul_avx
  5129. vpshufd $0x4e, %xmm0, %xmm5
  5130. vpshufd $0x4e, %xmm1, %xmm6
  5131. vpclmulqdq $0x11, %xmm0, %xmm1, %xmm7
  5132. vpclmulqdq $0x00, %xmm0, %xmm1, %xmm4
  5133. vpxor %xmm0, %xmm5, %xmm5
  5134. vpxor %xmm1, %xmm6, %xmm6
  5135. vpclmulqdq $0x00, %xmm6, %xmm5, %xmm5
  5136. vpxor %xmm4, %xmm5, %xmm5
  5137. vpxor %xmm7, %xmm5, %xmm5
  5138. vmovdqa %xmm4, %xmm3
  5139. vmovdqa %xmm7, %xmm0
  5140. vpslldq $8, %xmm5, %xmm6
  5141. vpsrldq $8, %xmm5, %xmm5
  5142. vpxor %xmm6, %xmm3, %xmm3
  5143. vpxor %xmm5, %xmm0, %xmm0
  5144. vpsrld $31, %xmm3, %xmm4
  5145. vpsrld $31, %xmm0, %xmm5
  5146. vpslld $0x01, %xmm3, %xmm3
  5147. vpslld $0x01, %xmm0, %xmm0
  5148. vpsrldq $12, %xmm4, %xmm6
  5149. vpslldq $4, %xmm4, %xmm4
  5150. vpslldq $4, %xmm5, %xmm5
  5151. vpor %xmm6, %xmm0, %xmm0
  5152. vpor %xmm4, %xmm3, %xmm3
  5153. vpor %xmm5, %xmm0, %xmm0
  5154. vpslld $31, %xmm3, %xmm4
  5155. vpslld $30, %xmm3, %xmm5
  5156. vpslld $25, %xmm3, %xmm6
  5157. vpxor %xmm5, %xmm4, %xmm4
  5158. vpxor %xmm6, %xmm4, %xmm4
  5159. vmovdqa %xmm4, %xmm5
  5160. vpsrldq $4, %xmm5, %xmm5
  5161. vpslldq $12, %xmm4, %xmm4
  5162. vpxor %xmm4, %xmm3, %xmm3
  5163. vpsrld $0x01, %xmm3, %xmm6
  5164. vpsrld $2, %xmm3, %xmm7
  5165. vpsrld $7, %xmm3, %xmm4
  5166. vpxor %xmm7, %xmm6, %xmm6
  5167. vpxor %xmm4, %xmm6, %xmm6
  5168. vpxor %xmm5, %xmm6, %xmm6
  5169. vpxor %xmm3, %xmm6, %xmm6
  5170. vpxor %xmm6, %xmm0, %xmm0
  5171. addl $16, %ecx
  5172. cmpl %edx, %ecx
  5173. jl L_AES_GCM_encrypt_avx1_calc_iv_16_loop
  5174. movl 160(%esp), %edx
  5175. cmpl %edx, %ecx
  5176. je L_AES_GCM_encrypt_avx1_calc_iv_done
  5177. L_AES_GCM_encrypt_avx1_calc_iv_lt16:
  5178. subl $16, %esp
  5179. vpxor %xmm4, %xmm4, %xmm4
  5180. xorl %ebx, %ebx
  5181. vmovdqu %xmm4, (%esp)
  5182. L_AES_GCM_encrypt_avx1_calc_iv_loop:
  5183. movzbl (%esi,%ecx,1), %eax
  5184. movb %al, (%esp,%ebx,1)
  5185. incl %ecx
  5186. incl %ebx
  5187. cmpl %edx, %ecx
  5188. jl L_AES_GCM_encrypt_avx1_calc_iv_loop
  5189. vmovdqu (%esp), %xmm4
  5190. addl $16, %esp
  5191. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm4, %xmm4
  5192. vpxor %xmm4, %xmm0, %xmm0
  5193. # ghash_gfmul_avx
  5194. vpshufd $0x4e, %xmm0, %xmm5
  5195. vpshufd $0x4e, %xmm1, %xmm6
  5196. vpclmulqdq $0x11, %xmm0, %xmm1, %xmm7
  5197. vpclmulqdq $0x00, %xmm0, %xmm1, %xmm4
  5198. vpxor %xmm0, %xmm5, %xmm5
  5199. vpxor %xmm1, %xmm6, %xmm6
  5200. vpclmulqdq $0x00, %xmm6, %xmm5, %xmm5
  5201. vpxor %xmm4, %xmm5, %xmm5
  5202. vpxor %xmm7, %xmm5, %xmm5
  5203. vmovdqa %xmm4, %xmm3
  5204. vmovdqa %xmm7, %xmm0
  5205. vpslldq $8, %xmm5, %xmm6
  5206. vpsrldq $8, %xmm5, %xmm5
  5207. vpxor %xmm6, %xmm3, %xmm3
  5208. vpxor %xmm5, %xmm0, %xmm0
  5209. vpsrld $31, %xmm3, %xmm4
  5210. vpsrld $31, %xmm0, %xmm5
  5211. vpslld $0x01, %xmm3, %xmm3
  5212. vpslld $0x01, %xmm0, %xmm0
  5213. vpsrldq $12, %xmm4, %xmm6
  5214. vpslldq $4, %xmm4, %xmm4
  5215. vpslldq $4, %xmm5, %xmm5
  5216. vpor %xmm6, %xmm0, %xmm0
  5217. vpor %xmm4, %xmm3, %xmm3
  5218. vpor %xmm5, %xmm0, %xmm0
  5219. vpslld $31, %xmm3, %xmm4
  5220. vpslld $30, %xmm3, %xmm5
  5221. vpslld $25, %xmm3, %xmm6
  5222. vpxor %xmm5, %xmm4, %xmm4
  5223. vpxor %xmm6, %xmm4, %xmm4
  5224. vmovdqa %xmm4, %xmm5
  5225. vpsrldq $4, %xmm5, %xmm5
  5226. vpslldq $12, %xmm4, %xmm4
  5227. vpxor %xmm4, %xmm3, %xmm3
  5228. vpsrld $0x01, %xmm3, %xmm6
  5229. vpsrld $2, %xmm3, %xmm7
  5230. vpsrld $7, %xmm3, %xmm4
  5231. vpxor %xmm7, %xmm6, %xmm6
  5232. vpxor %xmm4, %xmm6, %xmm6
  5233. vpxor %xmm5, %xmm6, %xmm6
  5234. vpxor %xmm3, %xmm6, %xmm6
  5235. vpxor %xmm6, %xmm0, %xmm0
  5236. L_AES_GCM_encrypt_avx1_calc_iv_done:
  5237. # T = Encrypt counter
  5238. vpxor %xmm4, %xmm4, %xmm4
  5239. shll $3, %edx
  5240. vpinsrd $0x00, %edx, %xmm4, %xmm4
  5241. vpxor %xmm4, %xmm0, %xmm0
  5242. # ghash_gfmul_avx
  5243. vpshufd $0x4e, %xmm0, %xmm5
  5244. vpshufd $0x4e, %xmm1, %xmm6
  5245. vpclmulqdq $0x11, %xmm0, %xmm1, %xmm7
  5246. vpclmulqdq $0x00, %xmm0, %xmm1, %xmm4
  5247. vpxor %xmm0, %xmm5, %xmm5
  5248. vpxor %xmm1, %xmm6, %xmm6
  5249. vpclmulqdq $0x00, %xmm6, %xmm5, %xmm5
  5250. vpxor %xmm4, %xmm5, %xmm5
  5251. vpxor %xmm7, %xmm5, %xmm5
  5252. vmovdqa %xmm4, %xmm3
  5253. vmovdqa %xmm7, %xmm0
  5254. vpslldq $8, %xmm5, %xmm6
  5255. vpsrldq $8, %xmm5, %xmm5
  5256. vpxor %xmm6, %xmm3, %xmm3
  5257. vpxor %xmm5, %xmm0, %xmm0
  5258. vpsrld $31, %xmm3, %xmm4
  5259. vpsrld $31, %xmm0, %xmm5
  5260. vpslld $0x01, %xmm3, %xmm3
  5261. vpslld $0x01, %xmm0, %xmm0
  5262. vpsrldq $12, %xmm4, %xmm6
  5263. vpslldq $4, %xmm4, %xmm4
  5264. vpslldq $4, %xmm5, %xmm5
  5265. vpor %xmm6, %xmm0, %xmm0
  5266. vpor %xmm4, %xmm3, %xmm3
  5267. vpor %xmm5, %xmm0, %xmm0
  5268. vpslld $31, %xmm3, %xmm4
  5269. vpslld $30, %xmm3, %xmm5
  5270. vpslld $25, %xmm3, %xmm6
  5271. vpxor %xmm5, %xmm4, %xmm4
  5272. vpxor %xmm6, %xmm4, %xmm4
  5273. vmovdqa %xmm4, %xmm5
  5274. vpsrldq $4, %xmm5, %xmm5
  5275. vpslldq $12, %xmm4, %xmm4
  5276. vpxor %xmm4, %xmm3, %xmm3
  5277. vpsrld $0x01, %xmm3, %xmm6
  5278. vpsrld $2, %xmm3, %xmm7
  5279. vpsrld $7, %xmm3, %xmm4
  5280. vpxor %xmm7, %xmm6, %xmm6
  5281. vpxor %xmm4, %xmm6, %xmm6
  5282. vpxor %xmm5, %xmm6, %xmm6
  5283. vpxor %xmm3, %xmm6, %xmm6
  5284. vpxor %xmm6, %xmm0, %xmm0
  5285. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm0, %xmm0
  5286. # Encrypt counter
  5287. vmovdqa (%ebp), %xmm4
  5288. vpxor %xmm0, %xmm4, %xmm4
  5289. vaesenc 16(%ebp), %xmm4, %xmm4
  5290. vaesenc 32(%ebp), %xmm4, %xmm4
  5291. vaesenc 48(%ebp), %xmm4, %xmm4
  5292. vaesenc 64(%ebp), %xmm4, %xmm4
  5293. vaesenc 80(%ebp), %xmm4, %xmm4
  5294. vaesenc 96(%ebp), %xmm4, %xmm4
  5295. vaesenc 112(%ebp), %xmm4, %xmm4
  5296. vaesenc 128(%ebp), %xmm4, %xmm4
  5297. vaesenc 144(%ebp), %xmm4, %xmm4
  5298. cmpl $11, 172(%esp)
  5299. vmovdqa 160(%ebp), %xmm5
  5300. jl L_AES_GCM_encrypt_avx1_calc_iv_2_aesenc_avx_last
  5301. vaesenc %xmm5, %xmm4, %xmm4
  5302. vaesenc 176(%ebp), %xmm4, %xmm4
  5303. cmpl $13, 172(%esp)
  5304. vmovdqa 192(%ebp), %xmm5
  5305. jl L_AES_GCM_encrypt_avx1_calc_iv_2_aesenc_avx_last
  5306. vaesenc %xmm5, %xmm4, %xmm4
  5307. vaesenc 208(%ebp), %xmm4, %xmm4
  5308. vmovdqa 224(%ebp), %xmm5
  5309. L_AES_GCM_encrypt_avx1_calc_iv_2_aesenc_avx_last:
  5310. vaesenclast %xmm5, %xmm4, %xmm4
  5311. vmovdqu %xmm4, 80(%esp)
  5312. L_AES_GCM_encrypt_avx1_iv_done:
  5313. movl 140(%esp), %esi
  5314. # Additional authentication data
  5315. movl 156(%esp), %edx
  5316. cmpl $0x00, %edx
  5317. je L_AES_GCM_encrypt_avx1_calc_aad_done
  5318. xorl %ecx, %ecx
  5319. cmpl $16, %edx
  5320. jl L_AES_GCM_encrypt_avx1_calc_aad_lt16
  5321. andl $0xfffffff0, %edx
  5322. L_AES_GCM_encrypt_avx1_calc_aad_16_loop:
  5323. vmovdqu (%esi,%ecx,1), %xmm4
  5324. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm4, %xmm4
  5325. vpxor %xmm4, %xmm2, %xmm2
  5326. # ghash_gfmul_avx
  5327. vpshufd $0x4e, %xmm2, %xmm5
  5328. vpshufd $0x4e, %xmm1, %xmm6
  5329. vpclmulqdq $0x11, %xmm2, %xmm1, %xmm7
  5330. vpclmulqdq $0x00, %xmm2, %xmm1, %xmm4
  5331. vpxor %xmm2, %xmm5, %xmm5
  5332. vpxor %xmm1, %xmm6, %xmm6
  5333. vpclmulqdq $0x00, %xmm6, %xmm5, %xmm5
  5334. vpxor %xmm4, %xmm5, %xmm5
  5335. vpxor %xmm7, %xmm5, %xmm5
  5336. vmovdqa %xmm4, %xmm3
  5337. vmovdqa %xmm7, %xmm2
  5338. vpslldq $8, %xmm5, %xmm6
  5339. vpsrldq $8, %xmm5, %xmm5
  5340. vpxor %xmm6, %xmm3, %xmm3
  5341. vpxor %xmm5, %xmm2, %xmm2
  5342. vpsrld $31, %xmm3, %xmm4
  5343. vpsrld $31, %xmm2, %xmm5
  5344. vpslld $0x01, %xmm3, %xmm3
  5345. vpslld $0x01, %xmm2, %xmm2
  5346. vpsrldq $12, %xmm4, %xmm6
  5347. vpslldq $4, %xmm4, %xmm4
  5348. vpslldq $4, %xmm5, %xmm5
  5349. vpor %xmm6, %xmm2, %xmm2
  5350. vpor %xmm4, %xmm3, %xmm3
  5351. vpor %xmm5, %xmm2, %xmm2
  5352. vpslld $31, %xmm3, %xmm4
  5353. vpslld $30, %xmm3, %xmm5
  5354. vpslld $25, %xmm3, %xmm6
  5355. vpxor %xmm5, %xmm4, %xmm4
  5356. vpxor %xmm6, %xmm4, %xmm4
  5357. vmovdqa %xmm4, %xmm5
  5358. vpsrldq $4, %xmm5, %xmm5
  5359. vpslldq $12, %xmm4, %xmm4
  5360. vpxor %xmm4, %xmm3, %xmm3
  5361. vpsrld $0x01, %xmm3, %xmm6
  5362. vpsrld $2, %xmm3, %xmm7
  5363. vpsrld $7, %xmm3, %xmm4
  5364. vpxor %xmm7, %xmm6, %xmm6
  5365. vpxor %xmm4, %xmm6, %xmm6
  5366. vpxor %xmm5, %xmm6, %xmm6
  5367. vpxor %xmm3, %xmm6, %xmm6
  5368. vpxor %xmm6, %xmm2, %xmm2
  5369. addl $16, %ecx
  5370. cmpl %edx, %ecx
  5371. jl L_AES_GCM_encrypt_avx1_calc_aad_16_loop
  5372. movl 156(%esp), %edx
  5373. cmpl %edx, %ecx
  5374. je L_AES_GCM_encrypt_avx1_calc_aad_done
  5375. L_AES_GCM_encrypt_avx1_calc_aad_lt16:
  5376. subl $16, %esp
  5377. vpxor %xmm4, %xmm4, %xmm4
  5378. xorl %ebx, %ebx
  5379. vmovdqu %xmm4, (%esp)
  5380. L_AES_GCM_encrypt_avx1_calc_aad_loop:
  5381. movzbl (%esi,%ecx,1), %eax
  5382. movb %al, (%esp,%ebx,1)
  5383. incl %ecx
  5384. incl %ebx
  5385. cmpl %edx, %ecx
  5386. jl L_AES_GCM_encrypt_avx1_calc_aad_loop
  5387. vmovdqu (%esp), %xmm4
  5388. addl $16, %esp
  5389. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm4, %xmm4
  5390. vpxor %xmm4, %xmm2, %xmm2
  5391. # ghash_gfmul_avx
  5392. vpshufd $0x4e, %xmm2, %xmm5
  5393. vpshufd $0x4e, %xmm1, %xmm6
  5394. vpclmulqdq $0x11, %xmm2, %xmm1, %xmm7
  5395. vpclmulqdq $0x00, %xmm2, %xmm1, %xmm4
  5396. vpxor %xmm2, %xmm5, %xmm5
  5397. vpxor %xmm1, %xmm6, %xmm6
  5398. vpclmulqdq $0x00, %xmm6, %xmm5, %xmm5
  5399. vpxor %xmm4, %xmm5, %xmm5
  5400. vpxor %xmm7, %xmm5, %xmm5
  5401. vmovdqa %xmm4, %xmm3
  5402. vmovdqa %xmm7, %xmm2
  5403. vpslldq $8, %xmm5, %xmm6
  5404. vpsrldq $8, %xmm5, %xmm5
  5405. vpxor %xmm6, %xmm3, %xmm3
  5406. vpxor %xmm5, %xmm2, %xmm2
  5407. vpsrld $31, %xmm3, %xmm4
  5408. vpsrld $31, %xmm2, %xmm5
  5409. vpslld $0x01, %xmm3, %xmm3
  5410. vpslld $0x01, %xmm2, %xmm2
  5411. vpsrldq $12, %xmm4, %xmm6
  5412. vpslldq $4, %xmm4, %xmm4
  5413. vpslldq $4, %xmm5, %xmm5
  5414. vpor %xmm6, %xmm2, %xmm2
  5415. vpor %xmm4, %xmm3, %xmm3
  5416. vpor %xmm5, %xmm2, %xmm2
  5417. vpslld $31, %xmm3, %xmm4
  5418. vpslld $30, %xmm3, %xmm5
  5419. vpslld $25, %xmm3, %xmm6
  5420. vpxor %xmm5, %xmm4, %xmm4
  5421. vpxor %xmm6, %xmm4, %xmm4
  5422. vmovdqa %xmm4, %xmm5
  5423. vpsrldq $4, %xmm5, %xmm5
  5424. vpslldq $12, %xmm4, %xmm4
  5425. vpxor %xmm4, %xmm3, %xmm3
  5426. vpsrld $0x01, %xmm3, %xmm6
  5427. vpsrld $2, %xmm3, %xmm7
  5428. vpsrld $7, %xmm3, %xmm4
  5429. vpxor %xmm7, %xmm6, %xmm6
  5430. vpxor %xmm4, %xmm6, %xmm6
  5431. vpxor %xmm5, %xmm6, %xmm6
  5432. vpxor %xmm3, %xmm6, %xmm6
  5433. vpxor %xmm6, %xmm2, %xmm2
  5434. L_AES_GCM_encrypt_avx1_calc_aad_done:
  5435. vmovdqu %xmm2, 96(%esp)
  5436. movl 132(%esp), %esi
  5437. movl 136(%esp), %edi
  5438. # Calculate counter and H
  5439. vpsrlq $63, %xmm1, %xmm5
  5440. vpsllq $0x01, %xmm1, %xmm4
  5441. vpslldq $8, %xmm5, %xmm5
  5442. vpor %xmm5, %xmm4, %xmm4
  5443. vpshufd $0xff, %xmm1, %xmm1
  5444. vpsrad $31, %xmm1, %xmm1
  5445. vpshufb L_aes_gcm_avx1_bswap_epi64, %xmm0, %xmm0
  5446. vpand L_aes_gcm_avx1_mod2_128, %xmm1, %xmm1
  5447. vpaddd L_aes_gcm_avx1_one, %xmm0, %xmm0
  5448. vpxor %xmm4, %xmm1, %xmm1
  5449. vmovdqu %xmm0, 64(%esp)
  5450. xorl %ebx, %ebx
  5451. cmpl $0x40, 152(%esp)
  5452. movl 152(%esp), %eax
  5453. jl L_AES_GCM_encrypt_avx1_done_64
  5454. andl $0xffffffc0, %eax
  5455. vmovdqa %xmm2, %xmm6
  5456. # H ^ 1
  5457. vmovdqu %xmm1, (%esp)
  5458. # H ^ 2
  5459. vpclmulqdq $0x00, %xmm1, %xmm1, %xmm4
  5460. vpclmulqdq $0x11, %xmm1, %xmm1, %xmm0
  5461. vpslld $31, %xmm4, %xmm5
  5462. vpslld $30, %xmm4, %xmm6
  5463. vpslld $25, %xmm4, %xmm7
  5464. vpxor %xmm6, %xmm5, %xmm5
  5465. vpxor %xmm7, %xmm5, %xmm5
  5466. vpsrldq $4, %xmm5, %xmm7
  5467. vpslldq $12, %xmm5, %xmm5
  5468. vpxor %xmm5, %xmm4, %xmm4
  5469. vpsrld $0x01, %xmm4, %xmm5
  5470. vpsrld $2, %xmm4, %xmm6
  5471. vpxor %xmm6, %xmm5, %xmm5
  5472. vpxor %xmm4, %xmm5, %xmm5
  5473. vpsrld $7, %xmm4, %xmm4
  5474. vpxor %xmm7, %xmm5, %xmm5
  5475. vpxor %xmm4, %xmm5, %xmm5
  5476. vpxor %xmm5, %xmm0, %xmm0
  5477. vmovdqu %xmm0, 16(%esp)
  5478. # H ^ 3
  5479. # ghash_gfmul_red_avx
  5480. vpshufd $0x4e, %xmm1, %xmm5
  5481. vpshufd $0x4e, %xmm0, %xmm6
  5482. vpclmulqdq $0x11, %xmm1, %xmm0, %xmm7
  5483. vpclmulqdq $0x00, %xmm1, %xmm0, %xmm4
  5484. vpxor %xmm1, %xmm5, %xmm5
  5485. vpxor %xmm0, %xmm6, %xmm6
  5486. vpclmulqdq $0x00, %xmm6, %xmm5, %xmm5
  5487. vpxor %xmm4, %xmm5, %xmm5
  5488. vpxor %xmm7, %xmm5, %xmm5
  5489. vpslldq $8, %xmm5, %xmm6
  5490. vpsrldq $8, %xmm5, %xmm5
  5491. vpxor %xmm6, %xmm4, %xmm4
  5492. vpxor %xmm5, %xmm7, %xmm3
  5493. vpslld $31, %xmm4, %xmm5
  5494. vpslld $30, %xmm4, %xmm6
  5495. vpslld $25, %xmm4, %xmm7
  5496. vpxor %xmm6, %xmm5, %xmm5
  5497. vpxor %xmm7, %xmm5, %xmm5
  5498. vpsrldq $4, %xmm5, %xmm7
  5499. vpslldq $12, %xmm5, %xmm5
  5500. vpxor %xmm5, %xmm4, %xmm4
  5501. vpsrld $0x01, %xmm4, %xmm5
  5502. vpsrld $2, %xmm4, %xmm6
  5503. vpxor %xmm6, %xmm5, %xmm5
  5504. vpxor %xmm4, %xmm5, %xmm5
  5505. vpsrld $7, %xmm4, %xmm4
  5506. vpxor %xmm7, %xmm5, %xmm5
  5507. vpxor %xmm4, %xmm5, %xmm5
  5508. vpxor %xmm5, %xmm3, %xmm3
  5509. vmovdqu %xmm3, 32(%esp)
  5510. # H ^ 4
  5511. vpclmulqdq $0x00, %xmm0, %xmm0, %xmm4
  5512. vpclmulqdq $0x11, %xmm0, %xmm0, %xmm3
  5513. vpslld $31, %xmm4, %xmm5
  5514. vpslld $30, %xmm4, %xmm6
  5515. vpslld $25, %xmm4, %xmm7
  5516. vpxor %xmm6, %xmm5, %xmm5
  5517. vpxor %xmm7, %xmm5, %xmm5
  5518. vpsrldq $4, %xmm5, %xmm7
  5519. vpslldq $12, %xmm5, %xmm5
  5520. vpxor %xmm5, %xmm4, %xmm4
  5521. vpsrld $0x01, %xmm4, %xmm5
  5522. vpsrld $2, %xmm4, %xmm6
  5523. vpxor %xmm6, %xmm5, %xmm5
  5524. vpxor %xmm4, %xmm5, %xmm5
  5525. vpsrld $7, %xmm4, %xmm4
  5526. vpxor %xmm7, %xmm5, %xmm5
  5527. vpxor %xmm4, %xmm5, %xmm5
  5528. vpxor %xmm5, %xmm3, %xmm3
  5529. vmovdqu %xmm3, 48(%esp)
  5530. # First 64 bytes of input
  5531. vmovdqu 64(%esp), %xmm4
  5532. vmovdqa L_aes_gcm_avx1_bswap_epi64, %xmm3
  5533. vpaddd L_aes_gcm_avx1_one, %xmm4, %xmm5
  5534. vpshufb %xmm3, %xmm5, %xmm5
  5535. vpaddd L_aes_gcm_avx1_two, %xmm4, %xmm6
  5536. vpshufb %xmm3, %xmm6, %xmm6
  5537. vpaddd L_aes_gcm_avx1_three, %xmm4, %xmm7
  5538. vpshufb %xmm3, %xmm7, %xmm7
  5539. vpshufb %xmm3, %xmm4, %xmm4
  5540. vmovdqu 64(%esp), %xmm3
  5541. vpaddd L_aes_gcm_avx1_four, %xmm3, %xmm3
  5542. vmovdqu %xmm3, 64(%esp)
  5543. vmovdqa (%ebp), %xmm3
  5544. vpxor %xmm3, %xmm4, %xmm4
  5545. vpxor %xmm3, %xmm5, %xmm5
  5546. vpxor %xmm3, %xmm6, %xmm6
  5547. vpxor %xmm3, %xmm7, %xmm7
  5548. vmovdqa 16(%ebp), %xmm3
  5549. vaesenc %xmm3, %xmm4, %xmm4
  5550. vaesenc %xmm3, %xmm5, %xmm5
  5551. vaesenc %xmm3, %xmm6, %xmm6
  5552. vaesenc %xmm3, %xmm7, %xmm7
  5553. vmovdqa 32(%ebp), %xmm3
  5554. vaesenc %xmm3, %xmm4, %xmm4
  5555. vaesenc %xmm3, %xmm5, %xmm5
  5556. vaesenc %xmm3, %xmm6, %xmm6
  5557. vaesenc %xmm3, %xmm7, %xmm7
  5558. vmovdqa 48(%ebp), %xmm3
  5559. vaesenc %xmm3, %xmm4, %xmm4
  5560. vaesenc %xmm3, %xmm5, %xmm5
  5561. vaesenc %xmm3, %xmm6, %xmm6
  5562. vaesenc %xmm3, %xmm7, %xmm7
  5563. vmovdqa 64(%ebp), %xmm3
  5564. vaesenc %xmm3, %xmm4, %xmm4
  5565. vaesenc %xmm3, %xmm5, %xmm5
  5566. vaesenc %xmm3, %xmm6, %xmm6
  5567. vaesenc %xmm3, %xmm7, %xmm7
  5568. vmovdqa 80(%ebp), %xmm3
  5569. vaesenc %xmm3, %xmm4, %xmm4
  5570. vaesenc %xmm3, %xmm5, %xmm5
  5571. vaesenc %xmm3, %xmm6, %xmm6
  5572. vaesenc %xmm3, %xmm7, %xmm7
  5573. vmovdqa 96(%ebp), %xmm3
  5574. vaesenc %xmm3, %xmm4, %xmm4
  5575. vaesenc %xmm3, %xmm5, %xmm5
  5576. vaesenc %xmm3, %xmm6, %xmm6
  5577. vaesenc %xmm3, %xmm7, %xmm7
  5578. vmovdqa 112(%ebp), %xmm3
  5579. vaesenc %xmm3, %xmm4, %xmm4
  5580. vaesenc %xmm3, %xmm5, %xmm5
  5581. vaesenc %xmm3, %xmm6, %xmm6
  5582. vaesenc %xmm3, %xmm7, %xmm7
  5583. vmovdqa 128(%ebp), %xmm3
  5584. vaesenc %xmm3, %xmm4, %xmm4
  5585. vaesenc %xmm3, %xmm5, %xmm5
  5586. vaesenc %xmm3, %xmm6, %xmm6
  5587. vaesenc %xmm3, %xmm7, %xmm7
  5588. vmovdqa 144(%ebp), %xmm3
  5589. vaesenc %xmm3, %xmm4, %xmm4
  5590. vaesenc %xmm3, %xmm5, %xmm5
  5591. vaesenc %xmm3, %xmm6, %xmm6
  5592. vaesenc %xmm3, %xmm7, %xmm7
  5593. cmpl $11, 172(%esp)
  5594. vmovdqa 160(%ebp), %xmm3
  5595. jl L_AES_GCM_encrypt_avx1_aesenc_64_enc_done
  5596. vaesenc %xmm3, %xmm4, %xmm4
  5597. vaesenc %xmm3, %xmm5, %xmm5
  5598. vaesenc %xmm3, %xmm6, %xmm6
  5599. vaesenc %xmm3, %xmm7, %xmm7
  5600. vmovdqa 176(%ebp), %xmm3
  5601. vaesenc %xmm3, %xmm4, %xmm4
  5602. vaesenc %xmm3, %xmm5, %xmm5
  5603. vaesenc %xmm3, %xmm6, %xmm6
  5604. vaesenc %xmm3, %xmm7, %xmm7
  5605. cmpl $13, 172(%esp)
  5606. vmovdqa 192(%ebp), %xmm3
  5607. jl L_AES_GCM_encrypt_avx1_aesenc_64_enc_done
  5608. vaesenc %xmm3, %xmm4, %xmm4
  5609. vaesenc %xmm3, %xmm5, %xmm5
  5610. vaesenc %xmm3, %xmm6, %xmm6
  5611. vaesenc %xmm3, %xmm7, %xmm7
  5612. vmovdqa 208(%ebp), %xmm3
  5613. vaesenc %xmm3, %xmm4, %xmm4
  5614. vaesenc %xmm3, %xmm5, %xmm5
  5615. vaesenc %xmm3, %xmm6, %xmm6
  5616. vaesenc %xmm3, %xmm7, %xmm7
  5617. vmovdqa 224(%ebp), %xmm3
  5618. L_AES_GCM_encrypt_avx1_aesenc_64_enc_done:
  5619. vaesenclast %xmm3, %xmm4, %xmm4
  5620. vaesenclast %xmm3, %xmm5, %xmm5
  5621. vmovdqu (%esi), %xmm0
  5622. vmovdqu 16(%esi), %xmm1
  5623. vpxor %xmm0, %xmm4, %xmm4
  5624. vpxor %xmm1, %xmm5, %xmm5
  5625. vmovdqu %xmm0, (%esi)
  5626. vmovdqu %xmm1, 16(%esi)
  5627. vmovdqu %xmm4, (%edi)
  5628. vmovdqu %xmm5, 16(%edi)
  5629. vaesenclast %xmm3, %xmm6, %xmm6
  5630. vaesenclast %xmm3, %xmm7, %xmm7
  5631. vmovdqu 32(%esi), %xmm0
  5632. vmovdqu 48(%esi), %xmm1
  5633. vpxor %xmm0, %xmm6, %xmm6
  5634. vpxor %xmm1, %xmm7, %xmm7
  5635. vmovdqu %xmm0, 32(%esi)
  5636. vmovdqu %xmm1, 48(%esi)
  5637. vmovdqu %xmm6, 32(%edi)
  5638. vmovdqu %xmm7, 48(%edi)
  5639. cmpl $0x40, %eax
  5640. movl $0x40, %ebx
  5641. movl %esi, %ecx
  5642. movl %edi, %edx
  5643. jle L_AES_GCM_encrypt_avx1_end_64
  5644. # More 64 bytes of input
  5645. L_AES_GCM_encrypt_avx1_ghash_64:
  5646. leal (%esi,%ebx,1), %ecx
  5647. leal (%edi,%ebx,1), %edx
  5648. vmovdqu 64(%esp), %xmm4
  5649. vmovdqa L_aes_gcm_avx1_bswap_epi64, %xmm3
  5650. vpaddd L_aes_gcm_avx1_one, %xmm4, %xmm5
  5651. vpshufb %xmm3, %xmm5, %xmm5
  5652. vpaddd L_aes_gcm_avx1_two, %xmm4, %xmm6
  5653. vpshufb %xmm3, %xmm6, %xmm6
  5654. vpaddd L_aes_gcm_avx1_three, %xmm4, %xmm7
  5655. vpshufb %xmm3, %xmm7, %xmm7
  5656. vpshufb %xmm3, %xmm4, %xmm4
  5657. vmovdqu 64(%esp), %xmm3
  5658. vpaddd L_aes_gcm_avx1_four, %xmm3, %xmm3
  5659. vmovdqu %xmm3, 64(%esp)
  5660. vmovdqa (%ebp), %xmm3
  5661. vpxor %xmm3, %xmm4, %xmm4
  5662. vpxor %xmm3, %xmm5, %xmm5
  5663. vpxor %xmm3, %xmm6, %xmm6
  5664. vpxor %xmm3, %xmm7, %xmm7
  5665. vmovdqa 16(%ebp), %xmm3
  5666. vaesenc %xmm3, %xmm4, %xmm4
  5667. vaesenc %xmm3, %xmm5, %xmm5
  5668. vaesenc %xmm3, %xmm6, %xmm6
  5669. vaesenc %xmm3, %xmm7, %xmm7
  5670. vmovdqa 32(%ebp), %xmm3
  5671. vaesenc %xmm3, %xmm4, %xmm4
  5672. vaesenc %xmm3, %xmm5, %xmm5
  5673. vaesenc %xmm3, %xmm6, %xmm6
  5674. vaesenc %xmm3, %xmm7, %xmm7
  5675. vmovdqa 48(%ebp), %xmm3
  5676. vaesenc %xmm3, %xmm4, %xmm4
  5677. vaesenc %xmm3, %xmm5, %xmm5
  5678. vaesenc %xmm3, %xmm6, %xmm6
  5679. vaesenc %xmm3, %xmm7, %xmm7
  5680. vmovdqa 64(%ebp), %xmm3
  5681. vaesenc %xmm3, %xmm4, %xmm4
  5682. vaesenc %xmm3, %xmm5, %xmm5
  5683. vaesenc %xmm3, %xmm6, %xmm6
  5684. vaesenc %xmm3, %xmm7, %xmm7
  5685. vmovdqa 80(%ebp), %xmm3
  5686. vaesenc %xmm3, %xmm4, %xmm4
  5687. vaesenc %xmm3, %xmm5, %xmm5
  5688. vaesenc %xmm3, %xmm6, %xmm6
  5689. vaesenc %xmm3, %xmm7, %xmm7
  5690. vmovdqa 96(%ebp), %xmm3
  5691. vaesenc %xmm3, %xmm4, %xmm4
  5692. vaesenc %xmm3, %xmm5, %xmm5
  5693. vaesenc %xmm3, %xmm6, %xmm6
  5694. vaesenc %xmm3, %xmm7, %xmm7
  5695. vmovdqa 112(%ebp), %xmm3
  5696. vaesenc %xmm3, %xmm4, %xmm4
  5697. vaesenc %xmm3, %xmm5, %xmm5
  5698. vaesenc %xmm3, %xmm6, %xmm6
  5699. vaesenc %xmm3, %xmm7, %xmm7
  5700. vmovdqa 128(%ebp), %xmm3
  5701. vaesenc %xmm3, %xmm4, %xmm4
  5702. vaesenc %xmm3, %xmm5, %xmm5
  5703. vaesenc %xmm3, %xmm6, %xmm6
  5704. vaesenc %xmm3, %xmm7, %xmm7
  5705. vmovdqa 144(%ebp), %xmm3
  5706. vaesenc %xmm3, %xmm4, %xmm4
  5707. vaesenc %xmm3, %xmm5, %xmm5
  5708. vaesenc %xmm3, %xmm6, %xmm6
  5709. vaesenc %xmm3, %xmm7, %xmm7
  5710. cmpl $11, 172(%esp)
  5711. vmovdqa 160(%ebp), %xmm3
  5712. jl L_AES_GCM_encrypt_avx1_aesenc_64_ghash_avx_aesenc_64_enc_done
  5713. vaesenc %xmm3, %xmm4, %xmm4
  5714. vaesenc %xmm3, %xmm5, %xmm5
  5715. vaesenc %xmm3, %xmm6, %xmm6
  5716. vaesenc %xmm3, %xmm7, %xmm7
  5717. vmovdqa 176(%ebp), %xmm3
  5718. vaesenc %xmm3, %xmm4, %xmm4
  5719. vaesenc %xmm3, %xmm5, %xmm5
  5720. vaesenc %xmm3, %xmm6, %xmm6
  5721. vaesenc %xmm3, %xmm7, %xmm7
  5722. cmpl $13, 172(%esp)
  5723. vmovdqa 192(%ebp), %xmm3
  5724. jl L_AES_GCM_encrypt_avx1_aesenc_64_ghash_avx_aesenc_64_enc_done
  5725. vaesenc %xmm3, %xmm4, %xmm4
  5726. vaesenc %xmm3, %xmm5, %xmm5
  5727. vaesenc %xmm3, %xmm6, %xmm6
  5728. vaesenc %xmm3, %xmm7, %xmm7
  5729. vmovdqa 208(%ebp), %xmm3
  5730. vaesenc %xmm3, %xmm4, %xmm4
  5731. vaesenc %xmm3, %xmm5, %xmm5
  5732. vaesenc %xmm3, %xmm6, %xmm6
  5733. vaesenc %xmm3, %xmm7, %xmm7
  5734. vmovdqa 224(%ebp), %xmm3
  5735. L_AES_GCM_encrypt_avx1_aesenc_64_ghash_avx_aesenc_64_enc_done:
  5736. vaesenclast %xmm3, %xmm4, %xmm4
  5737. vaesenclast %xmm3, %xmm5, %xmm5
  5738. vmovdqu (%ecx), %xmm0
  5739. vmovdqu 16(%ecx), %xmm1
  5740. vpxor %xmm0, %xmm4, %xmm4
  5741. vpxor %xmm1, %xmm5, %xmm5
  5742. vmovdqu %xmm4, (%edx)
  5743. vmovdqu %xmm5, 16(%edx)
  5744. vaesenclast %xmm3, %xmm6, %xmm6
  5745. vaesenclast %xmm3, %xmm7, %xmm7
  5746. vmovdqu 32(%ecx), %xmm0
  5747. vmovdqu 48(%ecx), %xmm1
  5748. vpxor %xmm0, %xmm6, %xmm6
  5749. vpxor %xmm1, %xmm7, %xmm7
  5750. vmovdqu %xmm6, 32(%edx)
  5751. vmovdqu %xmm7, 48(%edx)
  5752. # ghash encrypted counter
  5753. vmovdqu 96(%esp), %xmm6
  5754. vmovdqu 48(%esp), %xmm3
  5755. vmovdqu -64(%edx), %xmm4
  5756. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm4, %xmm4
  5757. vpxor %xmm6, %xmm4, %xmm4
  5758. vpshufd $0x4e, %xmm3, %xmm5
  5759. vpshufd $0x4e, %xmm4, %xmm1
  5760. vpxor %xmm3, %xmm5, %xmm5
  5761. vpxor %xmm4, %xmm1, %xmm1
  5762. vpclmulqdq $0x11, %xmm3, %xmm4, %xmm7
  5763. vpclmulqdq $0x00, %xmm3, %xmm4, %xmm6
  5764. vpclmulqdq $0x00, %xmm1, %xmm5, %xmm5
  5765. vpxor %xmm6, %xmm5, %xmm5
  5766. vpxor %xmm7, %xmm5, %xmm5
  5767. vmovdqu 32(%esp), %xmm3
  5768. vmovdqu -48(%edx), %xmm4
  5769. vpshufd $0x4e, %xmm3, %xmm0
  5770. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm4, %xmm4
  5771. vpxor %xmm3, %xmm0, %xmm0
  5772. vpshufd $0x4e, %xmm4, %xmm1
  5773. vpxor %xmm4, %xmm1, %xmm1
  5774. vpclmulqdq $0x11, %xmm3, %xmm4, %xmm2
  5775. vpclmulqdq $0x00, %xmm3, %xmm4, %xmm3
  5776. vpclmulqdq $0x00, %xmm1, %xmm0, %xmm0
  5777. vpxor %xmm3, %xmm5, %xmm5
  5778. vpxor %xmm3, %xmm6, %xmm6
  5779. vpxor %xmm2, %xmm5, %xmm5
  5780. vpxor %xmm2, %xmm7, %xmm7
  5781. vpxor %xmm0, %xmm5, %xmm5
  5782. vmovdqu 16(%esp), %xmm3
  5783. vmovdqu -32(%edx), %xmm4
  5784. vpshufd $0x4e, %xmm3, %xmm0
  5785. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm4, %xmm4
  5786. vpxor %xmm3, %xmm0, %xmm0
  5787. vpshufd $0x4e, %xmm4, %xmm1
  5788. vpxor %xmm4, %xmm1, %xmm1
  5789. vpclmulqdq $0x11, %xmm3, %xmm4, %xmm2
  5790. vpclmulqdq $0x00, %xmm3, %xmm4, %xmm3
  5791. vpclmulqdq $0x00, %xmm1, %xmm0, %xmm0
  5792. vpxor %xmm3, %xmm5, %xmm5
  5793. vpxor %xmm3, %xmm6, %xmm6
  5794. vpxor %xmm2, %xmm5, %xmm5
  5795. vpxor %xmm2, %xmm7, %xmm7
  5796. vpxor %xmm0, %xmm5, %xmm5
  5797. vmovdqu (%esp), %xmm3
  5798. vmovdqu -16(%edx), %xmm4
  5799. vpshufd $0x4e, %xmm3, %xmm0
  5800. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm4, %xmm4
  5801. vpxor %xmm3, %xmm0, %xmm0
  5802. vpshufd $0x4e, %xmm4, %xmm1
  5803. vpxor %xmm4, %xmm1, %xmm1
  5804. vpclmulqdq $0x11, %xmm3, %xmm4, %xmm2
  5805. vpclmulqdq $0x00, %xmm3, %xmm4, %xmm3
  5806. vpclmulqdq $0x00, %xmm1, %xmm0, %xmm0
  5807. vpxor %xmm3, %xmm5, %xmm5
  5808. vpxor %xmm3, %xmm6, %xmm6
  5809. vpxor %xmm2, %xmm5, %xmm5
  5810. vpxor %xmm2, %xmm7, %xmm7
  5811. vpxor %xmm0, %xmm5, %xmm5
  5812. vpslldq $8, %xmm5, %xmm1
  5813. vpsrldq $8, %xmm5, %xmm5
  5814. vpxor %xmm1, %xmm6, %xmm6
  5815. vpxor %xmm5, %xmm7, %xmm7
  5816. vpslld $31, %xmm6, %xmm3
  5817. vpslld $30, %xmm6, %xmm0
  5818. vpslld $25, %xmm6, %xmm1
  5819. vpxor %xmm0, %xmm3, %xmm3
  5820. vpxor %xmm1, %xmm3, %xmm3
  5821. vpsrldq $4, %xmm3, %xmm0
  5822. vpslldq $12, %xmm3, %xmm3
  5823. vpxor %xmm3, %xmm6, %xmm6
  5824. vpsrld $0x01, %xmm6, %xmm1
  5825. vpsrld $2, %xmm6, %xmm5
  5826. vpsrld $7, %xmm6, %xmm4
  5827. vpxor %xmm5, %xmm1, %xmm1
  5828. vpxor %xmm4, %xmm1, %xmm1
  5829. vpxor %xmm0, %xmm1, %xmm1
  5830. vpxor %xmm1, %xmm6, %xmm6
  5831. vpxor %xmm7, %xmm6, %xmm6
  5832. vmovdqu %xmm6, 96(%esp)
  5833. addl $0x40, %ebx
  5834. cmpl %eax, %ebx
  5835. jl L_AES_GCM_encrypt_avx1_ghash_64
  5836. L_AES_GCM_encrypt_avx1_end_64:
  5837. vmovdqu 96(%esp), %xmm2
  5838. # Block 1
  5839. vmovdqa L_aes_gcm_avx1_bswap_mask, %xmm4
  5840. vmovdqa (%edx), %xmm1
  5841. vpshufb %xmm4, %xmm1, %xmm1
  5842. vmovdqu 48(%esp), %xmm3
  5843. vpxor %xmm2, %xmm1, %xmm1
  5844. # ghash_gfmul_avx
  5845. vpshufd $0x4e, %xmm1, %xmm5
  5846. vpshufd $0x4e, %xmm3, %xmm6
  5847. vpclmulqdq $0x11, %xmm1, %xmm3, %xmm7
  5848. vpclmulqdq $0x00, %xmm1, %xmm3, %xmm4
  5849. vpxor %xmm1, %xmm5, %xmm5
  5850. vpxor %xmm3, %xmm6, %xmm6
  5851. vpclmulqdq $0x00, %xmm6, %xmm5, %xmm5
  5852. vpxor %xmm4, %xmm5, %xmm5
  5853. vpxor %xmm7, %xmm5, %xmm5
  5854. vmovdqa %xmm4, %xmm0
  5855. vmovdqa %xmm7, %xmm2
  5856. vpslldq $8, %xmm5, %xmm6
  5857. vpsrldq $8, %xmm5, %xmm5
  5858. vpxor %xmm6, %xmm0, %xmm0
  5859. vpxor %xmm5, %xmm2, %xmm2
  5860. # Block 2
  5861. vmovdqa L_aes_gcm_avx1_bswap_mask, %xmm4
  5862. vmovdqa 16(%edx), %xmm1
  5863. vpshufb %xmm4, %xmm1, %xmm1
  5864. vmovdqu 32(%esp), %xmm3
  5865. # ghash_gfmul_xor_avx
  5866. vpshufd $0x4e, %xmm1, %xmm5
  5867. vpshufd $0x4e, %xmm3, %xmm6
  5868. vpclmulqdq $0x11, %xmm1, %xmm3, %xmm7
  5869. vpclmulqdq $0x00, %xmm1, %xmm3, %xmm4
  5870. vpxor %xmm1, %xmm5, %xmm5
  5871. vpxor %xmm3, %xmm6, %xmm6
  5872. vpclmulqdq $0x00, %xmm6, %xmm5, %xmm5
  5873. vpxor %xmm4, %xmm5, %xmm5
  5874. vpxor %xmm7, %xmm5, %xmm5
  5875. vpxor %xmm4, %xmm0, %xmm0
  5876. vpxor %xmm7, %xmm2, %xmm2
  5877. vpslldq $8, %xmm5, %xmm6
  5878. vpsrldq $8, %xmm5, %xmm5
  5879. vpxor %xmm6, %xmm0, %xmm0
  5880. vpxor %xmm5, %xmm2, %xmm2
  5881. # Block 3
  5882. vmovdqa L_aes_gcm_avx1_bswap_mask, %xmm4
  5883. vmovdqa 32(%edx), %xmm1
  5884. vpshufb %xmm4, %xmm1, %xmm1
  5885. vmovdqu 16(%esp), %xmm3
  5886. # ghash_gfmul_xor_avx
  5887. vpshufd $0x4e, %xmm1, %xmm5
  5888. vpshufd $0x4e, %xmm3, %xmm6
  5889. vpclmulqdq $0x11, %xmm1, %xmm3, %xmm7
  5890. vpclmulqdq $0x00, %xmm1, %xmm3, %xmm4
  5891. vpxor %xmm1, %xmm5, %xmm5
  5892. vpxor %xmm3, %xmm6, %xmm6
  5893. vpclmulqdq $0x00, %xmm6, %xmm5, %xmm5
  5894. vpxor %xmm4, %xmm5, %xmm5
  5895. vpxor %xmm7, %xmm5, %xmm5
  5896. vpxor %xmm4, %xmm0, %xmm0
  5897. vpxor %xmm7, %xmm2, %xmm2
  5898. vpslldq $8, %xmm5, %xmm6
  5899. vpsrldq $8, %xmm5, %xmm5
  5900. vpxor %xmm6, %xmm0, %xmm0
  5901. vpxor %xmm5, %xmm2, %xmm2
  5902. # Block 4
  5903. vmovdqa L_aes_gcm_avx1_bswap_mask, %xmm4
  5904. vmovdqa 48(%edx), %xmm1
  5905. vpshufb %xmm4, %xmm1, %xmm1
  5906. vmovdqu (%esp), %xmm3
  5907. # ghash_gfmul_xor_avx
  5908. vpshufd $0x4e, %xmm1, %xmm5
  5909. vpshufd $0x4e, %xmm3, %xmm6
  5910. vpclmulqdq $0x11, %xmm1, %xmm3, %xmm7
  5911. vpclmulqdq $0x00, %xmm1, %xmm3, %xmm4
  5912. vpxor %xmm1, %xmm5, %xmm5
  5913. vpxor %xmm3, %xmm6, %xmm6
  5914. vpclmulqdq $0x00, %xmm6, %xmm5, %xmm5
  5915. vpxor %xmm4, %xmm5, %xmm5
  5916. vpxor %xmm7, %xmm5, %xmm5
  5917. vpxor %xmm4, %xmm0, %xmm0
  5918. vpxor %xmm7, %xmm2, %xmm2
  5919. vpslldq $8, %xmm5, %xmm6
  5920. vpsrldq $8, %xmm5, %xmm5
  5921. vpxor %xmm6, %xmm0, %xmm0
  5922. vpxor %xmm5, %xmm2, %xmm2
  5923. vpslld $31, %xmm0, %xmm4
  5924. vpslld $30, %xmm0, %xmm5
  5925. vpslld $25, %xmm0, %xmm6
  5926. vpxor %xmm5, %xmm4, %xmm4
  5927. vpxor %xmm6, %xmm4, %xmm4
  5928. vmovdqa %xmm4, %xmm5
  5929. vpsrldq $4, %xmm5, %xmm5
  5930. vpslldq $12, %xmm4, %xmm4
  5931. vpxor %xmm4, %xmm0, %xmm0
  5932. vpsrld $0x01, %xmm0, %xmm6
  5933. vpsrld $2, %xmm0, %xmm7
  5934. vpsrld $7, %xmm0, %xmm4
  5935. vpxor %xmm7, %xmm6, %xmm6
  5936. vpxor %xmm4, %xmm6, %xmm6
  5937. vpxor %xmm5, %xmm6, %xmm6
  5938. vpxor %xmm0, %xmm6, %xmm6
  5939. vpxor %xmm6, %xmm2, %xmm2
  5940. vmovdqu (%esp), %xmm1
  5941. L_AES_GCM_encrypt_avx1_done_64:
  5942. movl 152(%esp), %edx
  5943. cmpl %edx, %ebx
  5944. jge L_AES_GCM_encrypt_avx1_done_enc
  5945. movl 152(%esp), %eax
  5946. andl $0xfffffff0, %eax
  5947. cmpl %eax, %ebx
  5948. jge L_AES_GCM_encrypt_avx1_last_block_done
  5949. leal (%esi,%ebx,1), %ecx
  5950. leal (%edi,%ebx,1), %edx
  5951. vmovdqu 64(%esp), %xmm5
  5952. vpshufb L_aes_gcm_avx1_bswap_epi64, %xmm5, %xmm4
  5953. vpaddd L_aes_gcm_avx1_one, %xmm5, %xmm5
  5954. vmovdqu %xmm5, 64(%esp)
  5955. vpxor (%ebp), %xmm4, %xmm4
  5956. vaesenc 16(%ebp), %xmm4, %xmm4
  5957. vaesenc 32(%ebp), %xmm4, %xmm4
  5958. vaesenc 48(%ebp), %xmm4, %xmm4
  5959. vaesenc 64(%ebp), %xmm4, %xmm4
  5960. vaesenc 80(%ebp), %xmm4, %xmm4
  5961. vaesenc 96(%ebp), %xmm4, %xmm4
  5962. vaesenc 112(%ebp), %xmm4, %xmm4
  5963. vaesenc 128(%ebp), %xmm4, %xmm4
  5964. vaesenc 144(%ebp), %xmm4, %xmm4
  5965. cmpl $11, 172(%esp)
  5966. vmovdqa 160(%ebp), %xmm5
  5967. jl L_AES_GCM_encrypt_avx1_aesenc_block_aesenc_avx_last
  5968. vaesenc %xmm5, %xmm4, %xmm4
  5969. vaesenc 176(%ebp), %xmm4, %xmm4
  5970. cmpl $13, 172(%esp)
  5971. vmovdqa 192(%ebp), %xmm5
  5972. jl L_AES_GCM_encrypt_avx1_aesenc_block_aesenc_avx_last
  5973. vaesenc %xmm5, %xmm4, %xmm4
  5974. vaesenc 208(%ebp), %xmm4, %xmm4
  5975. vmovdqa 224(%ebp), %xmm5
  5976. L_AES_GCM_encrypt_avx1_aesenc_block_aesenc_avx_last:
  5977. vaesenclast %xmm5, %xmm4, %xmm4
  5978. vmovdqu (%ecx), %xmm5
  5979. vpxor %xmm5, %xmm4, %xmm4
  5980. vmovdqu %xmm4, (%edx)
  5981. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm4, %xmm4
  5982. vpxor %xmm4, %xmm2, %xmm2
  5983. addl $16, %ebx
  5984. cmpl %eax, %ebx
  5985. jge L_AES_GCM_encrypt_avx1_last_block_ghash
  5986. L_AES_GCM_encrypt_avx1_last_block_start:
  5987. leal (%esi,%ebx,1), %ecx
  5988. leal (%edi,%ebx,1), %edx
  5989. vmovdqu 64(%esp), %xmm5
  5990. vmovdqu %xmm2, %xmm7
  5991. vpshufb L_aes_gcm_avx1_bswap_epi64, %xmm5, %xmm4
  5992. vpaddd L_aes_gcm_avx1_one, %xmm5, %xmm5
  5993. vmovdqu %xmm5, 64(%esp)
  5994. vpxor (%ebp), %xmm4, %xmm4
  5995. vpclmulqdq $16, %xmm1, %xmm7, %xmm0
  5996. vaesenc 16(%ebp), %xmm4, %xmm4
  5997. vaesenc 32(%ebp), %xmm4, %xmm4
  5998. vpclmulqdq $0x01, %xmm1, %xmm7, %xmm3
  5999. vaesenc 48(%ebp), %xmm4, %xmm4
  6000. vaesenc 64(%ebp), %xmm4, %xmm4
  6001. vaesenc 80(%ebp), %xmm4, %xmm4
  6002. vpclmulqdq $0x11, %xmm1, %xmm7, %xmm5
  6003. vaesenc 96(%ebp), %xmm4, %xmm4
  6004. vpxor %xmm3, %xmm0, %xmm0
  6005. vpslldq $8, %xmm0, %xmm6
  6006. vpsrldq $8, %xmm0, %xmm0
  6007. vaesenc 112(%ebp), %xmm4, %xmm4
  6008. vpclmulqdq $0x00, %xmm1, %xmm7, %xmm3
  6009. vpxor %xmm3, %xmm6, %xmm6
  6010. vpxor %xmm0, %xmm5, %xmm5
  6011. vmovdqa L_aes_gcm_avx1_mod2_128, %xmm7
  6012. vpclmulqdq $16, %xmm7, %xmm6, %xmm3
  6013. vaesenc 128(%ebp), %xmm4, %xmm4
  6014. vpshufd $0x4e, %xmm6, %xmm0
  6015. vpxor %xmm3, %xmm0, %xmm0
  6016. vpclmulqdq $16, %xmm7, %xmm0, %xmm3
  6017. vaesenc 144(%ebp), %xmm4, %xmm4
  6018. vpshufd $0x4e, %xmm0, %xmm2
  6019. vpxor %xmm3, %xmm2, %xmm2
  6020. vpxor %xmm5, %xmm2, %xmm2
  6021. cmpl $11, 172(%esp)
  6022. vmovdqa 160(%ebp), %xmm5
  6023. jl L_AES_GCM_encrypt_avx1_aesenc_gfmul_last
  6024. vaesenc %xmm5, %xmm4, %xmm4
  6025. vaesenc 176(%ebp), %xmm4, %xmm4
  6026. cmpl $13, 172(%esp)
  6027. vmovdqa 192(%ebp), %xmm5
  6028. jl L_AES_GCM_encrypt_avx1_aesenc_gfmul_last
  6029. vaesenc %xmm5, %xmm4, %xmm4
  6030. vaesenc 208(%ebp), %xmm4, %xmm4
  6031. vmovdqa 224(%ebp), %xmm5
  6032. L_AES_GCM_encrypt_avx1_aesenc_gfmul_last:
  6033. vaesenclast %xmm5, %xmm4, %xmm4
  6034. vmovdqu (%ecx), %xmm5
  6035. vpxor %xmm5, %xmm4, %xmm4
  6036. vmovdqu %xmm4, (%edx)
  6037. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm4, %xmm4
  6038. addl $16, %ebx
  6039. vpxor %xmm4, %xmm2, %xmm2
  6040. cmpl %eax, %ebx
  6041. jl L_AES_GCM_encrypt_avx1_last_block_start
  6042. L_AES_GCM_encrypt_avx1_last_block_ghash:
  6043. # ghash_gfmul_red_avx
  6044. vpshufd $0x4e, %xmm1, %xmm5
  6045. vpshufd $0x4e, %xmm2, %xmm6
  6046. vpclmulqdq $0x11, %xmm1, %xmm2, %xmm7
  6047. vpclmulqdq $0x00, %xmm1, %xmm2, %xmm4
  6048. vpxor %xmm1, %xmm5, %xmm5
  6049. vpxor %xmm2, %xmm6, %xmm6
  6050. vpclmulqdq $0x00, %xmm6, %xmm5, %xmm5
  6051. vpxor %xmm4, %xmm5, %xmm5
  6052. vpxor %xmm7, %xmm5, %xmm5
  6053. vpslldq $8, %xmm5, %xmm6
  6054. vpsrldq $8, %xmm5, %xmm5
  6055. vpxor %xmm6, %xmm4, %xmm4
  6056. vpxor %xmm5, %xmm7, %xmm2
  6057. vpslld $31, %xmm4, %xmm5
  6058. vpslld $30, %xmm4, %xmm6
  6059. vpslld $25, %xmm4, %xmm7
  6060. vpxor %xmm6, %xmm5, %xmm5
  6061. vpxor %xmm7, %xmm5, %xmm5
  6062. vpsrldq $4, %xmm5, %xmm7
  6063. vpslldq $12, %xmm5, %xmm5
  6064. vpxor %xmm5, %xmm4, %xmm4
  6065. vpsrld $0x01, %xmm4, %xmm5
  6066. vpsrld $2, %xmm4, %xmm6
  6067. vpxor %xmm6, %xmm5, %xmm5
  6068. vpxor %xmm4, %xmm5, %xmm5
  6069. vpsrld $7, %xmm4, %xmm4
  6070. vpxor %xmm7, %xmm5, %xmm5
  6071. vpxor %xmm4, %xmm5, %xmm5
  6072. vpxor %xmm5, %xmm2, %xmm2
  6073. L_AES_GCM_encrypt_avx1_last_block_done:
  6074. movl 152(%esp), %ecx
  6075. movl %ecx, %edx
  6076. andl $15, %ecx
  6077. jz L_AES_GCM_encrypt_avx1_aesenc_last15_enc_avx_done
  6078. vmovdqu 64(%esp), %xmm0
  6079. vpshufb L_aes_gcm_avx1_bswap_epi64, %xmm0, %xmm0
  6080. vpxor (%ebp), %xmm0, %xmm0
  6081. vaesenc 16(%ebp), %xmm0, %xmm0
  6082. vaesenc 32(%ebp), %xmm0, %xmm0
  6083. vaesenc 48(%ebp), %xmm0, %xmm0
  6084. vaesenc 64(%ebp), %xmm0, %xmm0
  6085. vaesenc 80(%ebp), %xmm0, %xmm0
  6086. vaesenc 96(%ebp), %xmm0, %xmm0
  6087. vaesenc 112(%ebp), %xmm0, %xmm0
  6088. vaesenc 128(%ebp), %xmm0, %xmm0
  6089. vaesenc 144(%ebp), %xmm0, %xmm0
  6090. cmpl $11, 172(%esp)
  6091. vmovdqa 160(%ebp), %xmm5
  6092. jl L_AES_GCM_encrypt_avx1_aesenc_last15_enc_avx_aesenc_avx_last
  6093. vaesenc %xmm5, %xmm0, %xmm0
  6094. vaesenc 176(%ebp), %xmm0, %xmm0
  6095. cmpl $13, 172(%esp)
  6096. vmovdqa 192(%ebp), %xmm5
  6097. jl L_AES_GCM_encrypt_avx1_aesenc_last15_enc_avx_aesenc_avx_last
  6098. vaesenc %xmm5, %xmm0, %xmm0
  6099. vaesenc 208(%ebp), %xmm0, %xmm0
  6100. vmovdqa 224(%ebp), %xmm5
  6101. L_AES_GCM_encrypt_avx1_aesenc_last15_enc_avx_aesenc_avx_last:
  6102. vaesenclast %xmm5, %xmm0, %xmm0
  6103. subl $16, %esp
  6104. xorl %ecx, %ecx
  6105. vmovdqu %xmm0, (%esp)
  6106. L_AES_GCM_encrypt_avx1_aesenc_last15_enc_avx_loop:
  6107. movzbl (%esi,%ebx,1), %eax
  6108. xorb (%esp,%ecx,1), %al
  6109. movb %al, (%edi,%ebx,1)
  6110. movb %al, (%esp,%ecx,1)
  6111. incl %ebx
  6112. incl %ecx
  6113. cmpl %edx, %ebx
  6114. jl L_AES_GCM_encrypt_avx1_aesenc_last15_enc_avx_loop
  6115. xorl %eax, %eax
  6116. cmpl $16, %ecx
  6117. je L_AES_GCM_encrypt_avx1_aesenc_last15_enc_avx_finish_enc
  6118. L_AES_GCM_encrypt_avx1_aesenc_last15_enc_avx_byte_loop:
  6119. movb %al, (%esp,%ecx,1)
  6120. incl %ecx
  6121. cmpl $16, %ecx
  6122. jl L_AES_GCM_encrypt_avx1_aesenc_last15_enc_avx_byte_loop
  6123. L_AES_GCM_encrypt_avx1_aesenc_last15_enc_avx_finish_enc:
  6124. vmovdqu (%esp), %xmm0
  6125. addl $16, %esp
  6126. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm0, %xmm0
  6127. vpxor %xmm0, %xmm2, %xmm2
  6128. # ghash_gfmul_red_avx
  6129. vpshufd $0x4e, %xmm1, %xmm5
  6130. vpshufd $0x4e, %xmm2, %xmm6
  6131. vpclmulqdq $0x11, %xmm1, %xmm2, %xmm7
  6132. vpclmulqdq $0x00, %xmm1, %xmm2, %xmm4
  6133. vpxor %xmm1, %xmm5, %xmm5
  6134. vpxor %xmm2, %xmm6, %xmm6
  6135. vpclmulqdq $0x00, %xmm6, %xmm5, %xmm5
  6136. vpxor %xmm4, %xmm5, %xmm5
  6137. vpxor %xmm7, %xmm5, %xmm5
  6138. vpslldq $8, %xmm5, %xmm6
  6139. vpsrldq $8, %xmm5, %xmm5
  6140. vpxor %xmm6, %xmm4, %xmm4
  6141. vpxor %xmm5, %xmm7, %xmm2
  6142. vpslld $31, %xmm4, %xmm5
  6143. vpslld $30, %xmm4, %xmm6
  6144. vpslld $25, %xmm4, %xmm7
  6145. vpxor %xmm6, %xmm5, %xmm5
  6146. vpxor %xmm7, %xmm5, %xmm5
  6147. vpsrldq $4, %xmm5, %xmm7
  6148. vpslldq $12, %xmm5, %xmm5
  6149. vpxor %xmm5, %xmm4, %xmm4
  6150. vpsrld $0x01, %xmm4, %xmm5
  6151. vpsrld $2, %xmm4, %xmm6
  6152. vpxor %xmm6, %xmm5, %xmm5
  6153. vpxor %xmm4, %xmm5, %xmm5
  6154. vpsrld $7, %xmm4, %xmm4
  6155. vpxor %xmm7, %xmm5, %xmm5
  6156. vpxor %xmm4, %xmm5, %xmm5
  6157. vpxor %xmm5, %xmm2, %xmm2
  6158. L_AES_GCM_encrypt_avx1_aesenc_last15_enc_avx_done:
  6159. L_AES_GCM_encrypt_avx1_done_enc:
  6160. movl 148(%esp), %edi
  6161. movl 164(%esp), %ebx
  6162. movl 152(%esp), %edx
  6163. movl 156(%esp), %ecx
  6164. shll $3, %edx
  6165. shll $3, %ecx
  6166. vpinsrd $0x00, %edx, %xmm4, %xmm4
  6167. vpinsrd $2, %ecx, %xmm4, %xmm4
  6168. movl 152(%esp), %edx
  6169. movl 156(%esp), %ecx
  6170. shrl $29, %edx
  6171. shrl $29, %ecx
  6172. vpinsrd $0x01, %edx, %xmm4, %xmm4
  6173. vpinsrd $3, %ecx, %xmm4, %xmm4
  6174. vpxor %xmm4, %xmm2, %xmm2
  6175. # ghash_gfmul_red_avx
  6176. vpshufd $0x4e, %xmm1, %xmm5
  6177. vpshufd $0x4e, %xmm2, %xmm6
  6178. vpclmulqdq $0x11, %xmm1, %xmm2, %xmm7
  6179. vpclmulqdq $0x00, %xmm1, %xmm2, %xmm4
  6180. vpxor %xmm1, %xmm5, %xmm5
  6181. vpxor %xmm2, %xmm6, %xmm6
  6182. vpclmulqdq $0x00, %xmm6, %xmm5, %xmm5
  6183. vpxor %xmm4, %xmm5, %xmm5
  6184. vpxor %xmm7, %xmm5, %xmm5
  6185. vpslldq $8, %xmm5, %xmm6
  6186. vpsrldq $8, %xmm5, %xmm5
  6187. vpxor %xmm6, %xmm4, %xmm4
  6188. vpxor %xmm5, %xmm7, %xmm2
  6189. vpslld $31, %xmm4, %xmm5
  6190. vpslld $30, %xmm4, %xmm6
  6191. vpslld $25, %xmm4, %xmm7
  6192. vpxor %xmm6, %xmm5, %xmm5
  6193. vpxor %xmm7, %xmm5, %xmm5
  6194. vpsrldq $4, %xmm5, %xmm7
  6195. vpslldq $12, %xmm5, %xmm5
  6196. vpxor %xmm5, %xmm4, %xmm4
  6197. vpsrld $0x01, %xmm4, %xmm5
  6198. vpsrld $2, %xmm4, %xmm6
  6199. vpxor %xmm6, %xmm5, %xmm5
  6200. vpxor %xmm4, %xmm5, %xmm5
  6201. vpsrld $7, %xmm4, %xmm4
  6202. vpxor %xmm7, %xmm5, %xmm5
  6203. vpxor %xmm4, %xmm5, %xmm5
  6204. vpxor %xmm5, %xmm2, %xmm2
  6205. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm2, %xmm2
  6206. vpxor 80(%esp), %xmm2, %xmm4
  6207. cmpl $16, %ebx
  6208. je L_AES_GCM_encrypt_avx1_store_tag_16
  6209. xorl %ecx, %ecx
  6210. vmovdqu %xmm4, (%esp)
  6211. L_AES_GCM_encrypt_avx1_store_tag_loop:
  6212. movzbl (%esp,%ecx,1), %eax
  6213. movb %al, (%edi,%ecx,1)
  6214. incl %ecx
  6215. cmpl %ebx, %ecx
  6216. jne L_AES_GCM_encrypt_avx1_store_tag_loop
  6217. jmp L_AES_GCM_encrypt_avx1_store_tag_done
  6218. L_AES_GCM_encrypt_avx1_store_tag_16:
  6219. vmovdqu %xmm4, (%edi)
  6220. L_AES_GCM_encrypt_avx1_store_tag_done:
  6221. addl $0x70, %esp
  6222. popl %ebp
  6223. popl %edi
  6224. popl %esi
  6225. popl %ebx
  6226. ret
  6227. .size AES_GCM_encrypt_avx1,.-AES_GCM_encrypt_avx1
  6228. .text
  6229. .globl AES_GCM_decrypt_avx1
  6230. .type AES_GCM_decrypt_avx1,@function
  6231. .align 16
  6232. AES_GCM_decrypt_avx1:
  6233. pushl %ebx
  6234. pushl %esi
  6235. pushl %edi
  6236. pushl %ebp
  6237. subl $0xb0, %esp
  6238. movl 208(%esp), %esi
  6239. movl 232(%esp), %ebp
  6240. movl 224(%esp), %edx
  6241. vpxor %xmm0, %xmm0, %xmm0
  6242. vpxor %xmm2, %xmm2, %xmm2
  6243. cmpl $12, %edx
  6244. jne L_AES_GCM_decrypt_avx1_iv_not_12
  6245. # # Calculate values when IV is 12 bytes
  6246. # Set counter based on IV
  6247. movl $0x1000000, %ecx
  6248. vpinsrd $0x00, (%esi), %xmm0, %xmm0
  6249. vpinsrd $0x01, 4(%esi), %xmm0, %xmm0
  6250. vpinsrd $2, 8(%esi), %xmm0, %xmm0
  6251. vpinsrd $3, %ecx, %xmm0, %xmm0
  6252. # H = Encrypt X(=0) and T = Encrypt counter
  6253. vmovdqa (%ebp), %xmm1
  6254. vpxor %xmm1, %xmm0, %xmm5
  6255. vmovdqa 16(%ebp), %xmm3
  6256. vaesenc %xmm3, %xmm1, %xmm1
  6257. vaesenc %xmm3, %xmm5, %xmm5
  6258. vmovdqa 32(%ebp), %xmm3
  6259. vaesenc %xmm3, %xmm1, %xmm1
  6260. vaesenc %xmm3, %xmm5, %xmm5
  6261. vmovdqa 48(%ebp), %xmm3
  6262. vaesenc %xmm3, %xmm1, %xmm1
  6263. vaesenc %xmm3, %xmm5, %xmm5
  6264. vmovdqa 64(%ebp), %xmm3
  6265. vaesenc %xmm3, %xmm1, %xmm1
  6266. vaesenc %xmm3, %xmm5, %xmm5
  6267. vmovdqa 80(%ebp), %xmm3
  6268. vaesenc %xmm3, %xmm1, %xmm1
  6269. vaesenc %xmm3, %xmm5, %xmm5
  6270. vmovdqa 96(%ebp), %xmm3
  6271. vaesenc %xmm3, %xmm1, %xmm1
  6272. vaesenc %xmm3, %xmm5, %xmm5
  6273. vmovdqa 112(%ebp), %xmm3
  6274. vaesenc %xmm3, %xmm1, %xmm1
  6275. vaesenc %xmm3, %xmm5, %xmm5
  6276. vmovdqa 128(%ebp), %xmm3
  6277. vaesenc %xmm3, %xmm1, %xmm1
  6278. vaesenc %xmm3, %xmm5, %xmm5
  6279. vmovdqa 144(%ebp), %xmm3
  6280. vaesenc %xmm3, %xmm1, %xmm1
  6281. vaesenc %xmm3, %xmm5, %xmm5
  6282. cmpl $11, 236(%esp)
  6283. vmovdqa 160(%ebp), %xmm3
  6284. jl L_AES_GCM_decrypt_avx1_calc_iv_12_last
  6285. vaesenc %xmm3, %xmm1, %xmm1
  6286. vaesenc %xmm3, %xmm5, %xmm5
  6287. vmovdqa 176(%ebp), %xmm3
  6288. vaesenc %xmm3, %xmm1, %xmm1
  6289. vaesenc %xmm3, %xmm5, %xmm5
  6290. cmpl $13, 236(%esp)
  6291. vmovdqa 192(%ebp), %xmm3
  6292. jl L_AES_GCM_decrypt_avx1_calc_iv_12_last
  6293. vaesenc %xmm3, %xmm1, %xmm1
  6294. vaesenc %xmm3, %xmm5, %xmm5
  6295. vmovdqa 208(%ebp), %xmm3
  6296. vaesenc %xmm3, %xmm1, %xmm1
  6297. vaesenc %xmm3, %xmm5, %xmm5
  6298. vmovdqa 224(%ebp), %xmm3
  6299. L_AES_GCM_decrypt_avx1_calc_iv_12_last:
  6300. vaesenclast %xmm3, %xmm1, %xmm1
  6301. vaesenclast %xmm3, %xmm5, %xmm5
  6302. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm1, %xmm1
  6303. vmovdqu %xmm5, 80(%esp)
  6304. jmp L_AES_GCM_decrypt_avx1_iv_done
  6305. L_AES_GCM_decrypt_avx1_iv_not_12:
  6306. # Calculate values when IV is not 12 bytes
  6307. # H = Encrypt X(=0)
  6308. vmovdqa (%ebp), %xmm1
  6309. vaesenc 16(%ebp), %xmm1, %xmm1
  6310. vaesenc 32(%ebp), %xmm1, %xmm1
  6311. vaesenc 48(%ebp), %xmm1, %xmm1
  6312. vaesenc 64(%ebp), %xmm1, %xmm1
  6313. vaesenc 80(%ebp), %xmm1, %xmm1
  6314. vaesenc 96(%ebp), %xmm1, %xmm1
  6315. vaesenc 112(%ebp), %xmm1, %xmm1
  6316. vaesenc 128(%ebp), %xmm1, %xmm1
  6317. vaesenc 144(%ebp), %xmm1, %xmm1
  6318. cmpl $11, 236(%esp)
  6319. vmovdqa 160(%ebp), %xmm5
  6320. jl L_AES_GCM_decrypt_avx1_calc_iv_1_aesenc_avx_last
  6321. vaesenc %xmm5, %xmm1, %xmm1
  6322. vaesenc 176(%ebp), %xmm1, %xmm1
  6323. cmpl $13, 236(%esp)
  6324. vmovdqa 192(%ebp), %xmm5
  6325. jl L_AES_GCM_decrypt_avx1_calc_iv_1_aesenc_avx_last
  6326. vaesenc %xmm5, %xmm1, %xmm1
  6327. vaesenc 208(%ebp), %xmm1, %xmm1
  6328. vmovdqa 224(%ebp), %xmm5
  6329. L_AES_GCM_decrypt_avx1_calc_iv_1_aesenc_avx_last:
  6330. vaesenclast %xmm5, %xmm1, %xmm1
  6331. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm1, %xmm1
  6332. # Calc counter
  6333. # Initialization vector
  6334. cmpl $0x00, %edx
  6335. movl $0x00, %ecx
  6336. je L_AES_GCM_decrypt_avx1_calc_iv_done
  6337. cmpl $16, %edx
  6338. jl L_AES_GCM_decrypt_avx1_calc_iv_lt16
  6339. andl $0xfffffff0, %edx
  6340. L_AES_GCM_decrypt_avx1_calc_iv_16_loop:
  6341. vmovdqu (%esi,%ecx,1), %xmm4
  6342. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm4, %xmm4
  6343. vpxor %xmm4, %xmm0, %xmm0
  6344. # ghash_gfmul_avx
  6345. vpshufd $0x4e, %xmm0, %xmm5
  6346. vpshufd $0x4e, %xmm1, %xmm6
  6347. vpclmulqdq $0x11, %xmm0, %xmm1, %xmm7
  6348. vpclmulqdq $0x00, %xmm0, %xmm1, %xmm4
  6349. vpxor %xmm0, %xmm5, %xmm5
  6350. vpxor %xmm1, %xmm6, %xmm6
  6351. vpclmulqdq $0x00, %xmm6, %xmm5, %xmm5
  6352. vpxor %xmm4, %xmm5, %xmm5
  6353. vpxor %xmm7, %xmm5, %xmm5
  6354. vmovdqa %xmm4, %xmm3
  6355. vmovdqa %xmm7, %xmm0
  6356. vpslldq $8, %xmm5, %xmm6
  6357. vpsrldq $8, %xmm5, %xmm5
  6358. vpxor %xmm6, %xmm3, %xmm3
  6359. vpxor %xmm5, %xmm0, %xmm0
  6360. vpsrld $31, %xmm3, %xmm4
  6361. vpsrld $31, %xmm0, %xmm5
  6362. vpslld $0x01, %xmm3, %xmm3
  6363. vpslld $0x01, %xmm0, %xmm0
  6364. vpsrldq $12, %xmm4, %xmm6
  6365. vpslldq $4, %xmm4, %xmm4
  6366. vpslldq $4, %xmm5, %xmm5
  6367. vpor %xmm6, %xmm0, %xmm0
  6368. vpor %xmm4, %xmm3, %xmm3
  6369. vpor %xmm5, %xmm0, %xmm0
  6370. vpslld $31, %xmm3, %xmm4
  6371. vpslld $30, %xmm3, %xmm5
  6372. vpslld $25, %xmm3, %xmm6
  6373. vpxor %xmm5, %xmm4, %xmm4
  6374. vpxor %xmm6, %xmm4, %xmm4
  6375. vmovdqa %xmm4, %xmm5
  6376. vpsrldq $4, %xmm5, %xmm5
  6377. vpslldq $12, %xmm4, %xmm4
  6378. vpxor %xmm4, %xmm3, %xmm3
  6379. vpsrld $0x01, %xmm3, %xmm6
  6380. vpsrld $2, %xmm3, %xmm7
  6381. vpsrld $7, %xmm3, %xmm4
  6382. vpxor %xmm7, %xmm6, %xmm6
  6383. vpxor %xmm4, %xmm6, %xmm6
  6384. vpxor %xmm5, %xmm6, %xmm6
  6385. vpxor %xmm3, %xmm6, %xmm6
  6386. vpxor %xmm6, %xmm0, %xmm0
  6387. addl $16, %ecx
  6388. cmpl %edx, %ecx
  6389. jl L_AES_GCM_decrypt_avx1_calc_iv_16_loop
  6390. movl 224(%esp), %edx
  6391. cmpl %edx, %ecx
  6392. je L_AES_GCM_decrypt_avx1_calc_iv_done
  6393. L_AES_GCM_decrypt_avx1_calc_iv_lt16:
  6394. subl $16, %esp
  6395. vpxor %xmm4, %xmm4, %xmm4
  6396. xorl %ebx, %ebx
  6397. vmovdqu %xmm4, (%esp)
  6398. L_AES_GCM_decrypt_avx1_calc_iv_loop:
  6399. movzbl (%esi,%ecx,1), %eax
  6400. movb %al, (%esp,%ebx,1)
  6401. incl %ecx
  6402. incl %ebx
  6403. cmpl %edx, %ecx
  6404. jl L_AES_GCM_decrypt_avx1_calc_iv_loop
  6405. vmovdqu (%esp), %xmm4
  6406. addl $16, %esp
  6407. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm4, %xmm4
  6408. vpxor %xmm4, %xmm0, %xmm0
  6409. # ghash_gfmul_avx
  6410. vpshufd $0x4e, %xmm0, %xmm5
  6411. vpshufd $0x4e, %xmm1, %xmm6
  6412. vpclmulqdq $0x11, %xmm0, %xmm1, %xmm7
  6413. vpclmulqdq $0x00, %xmm0, %xmm1, %xmm4
  6414. vpxor %xmm0, %xmm5, %xmm5
  6415. vpxor %xmm1, %xmm6, %xmm6
  6416. vpclmulqdq $0x00, %xmm6, %xmm5, %xmm5
  6417. vpxor %xmm4, %xmm5, %xmm5
  6418. vpxor %xmm7, %xmm5, %xmm5
  6419. vmovdqa %xmm4, %xmm3
  6420. vmovdqa %xmm7, %xmm0
  6421. vpslldq $8, %xmm5, %xmm6
  6422. vpsrldq $8, %xmm5, %xmm5
  6423. vpxor %xmm6, %xmm3, %xmm3
  6424. vpxor %xmm5, %xmm0, %xmm0
  6425. vpsrld $31, %xmm3, %xmm4
  6426. vpsrld $31, %xmm0, %xmm5
  6427. vpslld $0x01, %xmm3, %xmm3
  6428. vpslld $0x01, %xmm0, %xmm0
  6429. vpsrldq $12, %xmm4, %xmm6
  6430. vpslldq $4, %xmm4, %xmm4
  6431. vpslldq $4, %xmm5, %xmm5
  6432. vpor %xmm6, %xmm0, %xmm0
  6433. vpor %xmm4, %xmm3, %xmm3
  6434. vpor %xmm5, %xmm0, %xmm0
  6435. vpslld $31, %xmm3, %xmm4
  6436. vpslld $30, %xmm3, %xmm5
  6437. vpslld $25, %xmm3, %xmm6
  6438. vpxor %xmm5, %xmm4, %xmm4
  6439. vpxor %xmm6, %xmm4, %xmm4
  6440. vmovdqa %xmm4, %xmm5
  6441. vpsrldq $4, %xmm5, %xmm5
  6442. vpslldq $12, %xmm4, %xmm4
  6443. vpxor %xmm4, %xmm3, %xmm3
  6444. vpsrld $0x01, %xmm3, %xmm6
  6445. vpsrld $2, %xmm3, %xmm7
  6446. vpsrld $7, %xmm3, %xmm4
  6447. vpxor %xmm7, %xmm6, %xmm6
  6448. vpxor %xmm4, %xmm6, %xmm6
  6449. vpxor %xmm5, %xmm6, %xmm6
  6450. vpxor %xmm3, %xmm6, %xmm6
  6451. vpxor %xmm6, %xmm0, %xmm0
  6452. L_AES_GCM_decrypt_avx1_calc_iv_done:
  6453. # T = Encrypt counter
  6454. vpxor %xmm4, %xmm4, %xmm4
  6455. shll $3, %edx
  6456. vpinsrd $0x00, %edx, %xmm4, %xmm4
  6457. vpxor %xmm4, %xmm0, %xmm0
  6458. # ghash_gfmul_avx
  6459. vpshufd $0x4e, %xmm0, %xmm5
  6460. vpshufd $0x4e, %xmm1, %xmm6
  6461. vpclmulqdq $0x11, %xmm0, %xmm1, %xmm7
  6462. vpclmulqdq $0x00, %xmm0, %xmm1, %xmm4
  6463. vpxor %xmm0, %xmm5, %xmm5
  6464. vpxor %xmm1, %xmm6, %xmm6
  6465. vpclmulqdq $0x00, %xmm6, %xmm5, %xmm5
  6466. vpxor %xmm4, %xmm5, %xmm5
  6467. vpxor %xmm7, %xmm5, %xmm5
  6468. vmovdqa %xmm4, %xmm3
  6469. vmovdqa %xmm7, %xmm0
  6470. vpslldq $8, %xmm5, %xmm6
  6471. vpsrldq $8, %xmm5, %xmm5
  6472. vpxor %xmm6, %xmm3, %xmm3
  6473. vpxor %xmm5, %xmm0, %xmm0
  6474. vpsrld $31, %xmm3, %xmm4
  6475. vpsrld $31, %xmm0, %xmm5
  6476. vpslld $0x01, %xmm3, %xmm3
  6477. vpslld $0x01, %xmm0, %xmm0
  6478. vpsrldq $12, %xmm4, %xmm6
  6479. vpslldq $4, %xmm4, %xmm4
  6480. vpslldq $4, %xmm5, %xmm5
  6481. vpor %xmm6, %xmm0, %xmm0
  6482. vpor %xmm4, %xmm3, %xmm3
  6483. vpor %xmm5, %xmm0, %xmm0
  6484. vpslld $31, %xmm3, %xmm4
  6485. vpslld $30, %xmm3, %xmm5
  6486. vpslld $25, %xmm3, %xmm6
  6487. vpxor %xmm5, %xmm4, %xmm4
  6488. vpxor %xmm6, %xmm4, %xmm4
  6489. vmovdqa %xmm4, %xmm5
  6490. vpsrldq $4, %xmm5, %xmm5
  6491. vpslldq $12, %xmm4, %xmm4
  6492. vpxor %xmm4, %xmm3, %xmm3
  6493. vpsrld $0x01, %xmm3, %xmm6
  6494. vpsrld $2, %xmm3, %xmm7
  6495. vpsrld $7, %xmm3, %xmm4
  6496. vpxor %xmm7, %xmm6, %xmm6
  6497. vpxor %xmm4, %xmm6, %xmm6
  6498. vpxor %xmm5, %xmm6, %xmm6
  6499. vpxor %xmm3, %xmm6, %xmm6
  6500. vpxor %xmm6, %xmm0, %xmm0
  6501. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm0, %xmm0
  6502. # Encrypt counter
  6503. vmovdqa (%ebp), %xmm4
  6504. vpxor %xmm0, %xmm4, %xmm4
  6505. vaesenc 16(%ebp), %xmm4, %xmm4
  6506. vaesenc 32(%ebp), %xmm4, %xmm4
  6507. vaesenc 48(%ebp), %xmm4, %xmm4
  6508. vaesenc 64(%ebp), %xmm4, %xmm4
  6509. vaesenc 80(%ebp), %xmm4, %xmm4
  6510. vaesenc 96(%ebp), %xmm4, %xmm4
  6511. vaesenc 112(%ebp), %xmm4, %xmm4
  6512. vaesenc 128(%ebp), %xmm4, %xmm4
  6513. vaesenc 144(%ebp), %xmm4, %xmm4
  6514. cmpl $11, 236(%esp)
  6515. vmovdqa 160(%ebp), %xmm5
  6516. jl L_AES_GCM_decrypt_avx1_calc_iv_2_aesenc_avx_last
  6517. vaesenc %xmm5, %xmm4, %xmm4
  6518. vaesenc 176(%ebp), %xmm4, %xmm4
  6519. cmpl $13, 236(%esp)
  6520. vmovdqa 192(%ebp), %xmm5
  6521. jl L_AES_GCM_decrypt_avx1_calc_iv_2_aesenc_avx_last
  6522. vaesenc %xmm5, %xmm4, %xmm4
  6523. vaesenc 208(%ebp), %xmm4, %xmm4
  6524. vmovdqa 224(%ebp), %xmm5
  6525. L_AES_GCM_decrypt_avx1_calc_iv_2_aesenc_avx_last:
  6526. vaesenclast %xmm5, %xmm4, %xmm4
  6527. vmovdqu %xmm4, 80(%esp)
  6528. L_AES_GCM_decrypt_avx1_iv_done:
  6529. movl 204(%esp), %esi
  6530. # Additional authentication data
  6531. movl 220(%esp), %edx
  6532. cmpl $0x00, %edx
  6533. je L_AES_GCM_decrypt_avx1_calc_aad_done
  6534. xorl %ecx, %ecx
  6535. cmpl $16, %edx
  6536. jl L_AES_GCM_decrypt_avx1_calc_aad_lt16
  6537. andl $0xfffffff0, %edx
  6538. L_AES_GCM_decrypt_avx1_calc_aad_16_loop:
  6539. vmovdqu (%esi,%ecx,1), %xmm4
  6540. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm4, %xmm4
  6541. vpxor %xmm4, %xmm2, %xmm2
  6542. # ghash_gfmul_avx
  6543. vpshufd $0x4e, %xmm2, %xmm5
  6544. vpshufd $0x4e, %xmm1, %xmm6
  6545. vpclmulqdq $0x11, %xmm2, %xmm1, %xmm7
  6546. vpclmulqdq $0x00, %xmm2, %xmm1, %xmm4
  6547. vpxor %xmm2, %xmm5, %xmm5
  6548. vpxor %xmm1, %xmm6, %xmm6
  6549. vpclmulqdq $0x00, %xmm6, %xmm5, %xmm5
  6550. vpxor %xmm4, %xmm5, %xmm5
  6551. vpxor %xmm7, %xmm5, %xmm5
  6552. vmovdqa %xmm4, %xmm3
  6553. vmovdqa %xmm7, %xmm2
  6554. vpslldq $8, %xmm5, %xmm6
  6555. vpsrldq $8, %xmm5, %xmm5
  6556. vpxor %xmm6, %xmm3, %xmm3
  6557. vpxor %xmm5, %xmm2, %xmm2
  6558. vpsrld $31, %xmm3, %xmm4
  6559. vpsrld $31, %xmm2, %xmm5
  6560. vpslld $0x01, %xmm3, %xmm3
  6561. vpslld $0x01, %xmm2, %xmm2
  6562. vpsrldq $12, %xmm4, %xmm6
  6563. vpslldq $4, %xmm4, %xmm4
  6564. vpslldq $4, %xmm5, %xmm5
  6565. vpor %xmm6, %xmm2, %xmm2
  6566. vpor %xmm4, %xmm3, %xmm3
  6567. vpor %xmm5, %xmm2, %xmm2
  6568. vpslld $31, %xmm3, %xmm4
  6569. vpslld $30, %xmm3, %xmm5
  6570. vpslld $25, %xmm3, %xmm6
  6571. vpxor %xmm5, %xmm4, %xmm4
  6572. vpxor %xmm6, %xmm4, %xmm4
  6573. vmovdqa %xmm4, %xmm5
  6574. vpsrldq $4, %xmm5, %xmm5
  6575. vpslldq $12, %xmm4, %xmm4
  6576. vpxor %xmm4, %xmm3, %xmm3
  6577. vpsrld $0x01, %xmm3, %xmm6
  6578. vpsrld $2, %xmm3, %xmm7
  6579. vpsrld $7, %xmm3, %xmm4
  6580. vpxor %xmm7, %xmm6, %xmm6
  6581. vpxor %xmm4, %xmm6, %xmm6
  6582. vpxor %xmm5, %xmm6, %xmm6
  6583. vpxor %xmm3, %xmm6, %xmm6
  6584. vpxor %xmm6, %xmm2, %xmm2
  6585. addl $16, %ecx
  6586. cmpl %edx, %ecx
  6587. jl L_AES_GCM_decrypt_avx1_calc_aad_16_loop
  6588. movl 220(%esp), %edx
  6589. cmpl %edx, %ecx
  6590. je L_AES_GCM_decrypt_avx1_calc_aad_done
  6591. L_AES_GCM_decrypt_avx1_calc_aad_lt16:
  6592. subl $16, %esp
  6593. vpxor %xmm4, %xmm4, %xmm4
  6594. xorl %ebx, %ebx
  6595. vmovdqu %xmm4, (%esp)
  6596. L_AES_GCM_decrypt_avx1_calc_aad_loop:
  6597. movzbl (%esi,%ecx,1), %eax
  6598. movb %al, (%esp,%ebx,1)
  6599. incl %ecx
  6600. incl %ebx
  6601. cmpl %edx, %ecx
  6602. jl L_AES_GCM_decrypt_avx1_calc_aad_loop
  6603. vmovdqu (%esp), %xmm4
  6604. addl $16, %esp
  6605. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm4, %xmm4
  6606. vpxor %xmm4, %xmm2, %xmm2
  6607. # ghash_gfmul_avx
  6608. vpshufd $0x4e, %xmm2, %xmm5
  6609. vpshufd $0x4e, %xmm1, %xmm6
  6610. vpclmulqdq $0x11, %xmm2, %xmm1, %xmm7
  6611. vpclmulqdq $0x00, %xmm2, %xmm1, %xmm4
  6612. vpxor %xmm2, %xmm5, %xmm5
  6613. vpxor %xmm1, %xmm6, %xmm6
  6614. vpclmulqdq $0x00, %xmm6, %xmm5, %xmm5
  6615. vpxor %xmm4, %xmm5, %xmm5
  6616. vpxor %xmm7, %xmm5, %xmm5
  6617. vmovdqa %xmm4, %xmm3
  6618. vmovdqa %xmm7, %xmm2
  6619. vpslldq $8, %xmm5, %xmm6
  6620. vpsrldq $8, %xmm5, %xmm5
  6621. vpxor %xmm6, %xmm3, %xmm3
  6622. vpxor %xmm5, %xmm2, %xmm2
  6623. vpsrld $31, %xmm3, %xmm4
  6624. vpsrld $31, %xmm2, %xmm5
  6625. vpslld $0x01, %xmm3, %xmm3
  6626. vpslld $0x01, %xmm2, %xmm2
  6627. vpsrldq $12, %xmm4, %xmm6
  6628. vpslldq $4, %xmm4, %xmm4
  6629. vpslldq $4, %xmm5, %xmm5
  6630. vpor %xmm6, %xmm2, %xmm2
  6631. vpor %xmm4, %xmm3, %xmm3
  6632. vpor %xmm5, %xmm2, %xmm2
  6633. vpslld $31, %xmm3, %xmm4
  6634. vpslld $30, %xmm3, %xmm5
  6635. vpslld $25, %xmm3, %xmm6
  6636. vpxor %xmm5, %xmm4, %xmm4
  6637. vpxor %xmm6, %xmm4, %xmm4
  6638. vmovdqa %xmm4, %xmm5
  6639. vpsrldq $4, %xmm5, %xmm5
  6640. vpslldq $12, %xmm4, %xmm4
  6641. vpxor %xmm4, %xmm3, %xmm3
  6642. vpsrld $0x01, %xmm3, %xmm6
  6643. vpsrld $2, %xmm3, %xmm7
  6644. vpsrld $7, %xmm3, %xmm4
  6645. vpxor %xmm7, %xmm6, %xmm6
  6646. vpxor %xmm4, %xmm6, %xmm6
  6647. vpxor %xmm5, %xmm6, %xmm6
  6648. vpxor %xmm3, %xmm6, %xmm6
  6649. vpxor %xmm6, %xmm2, %xmm2
  6650. L_AES_GCM_decrypt_avx1_calc_aad_done:
  6651. vmovdqu %xmm2, 96(%esp)
  6652. movl 196(%esp), %esi
  6653. movl 200(%esp), %edi
  6654. # Calculate counter and H
  6655. vpsrlq $63, %xmm1, %xmm5
  6656. vpsllq $0x01, %xmm1, %xmm4
  6657. vpslldq $8, %xmm5, %xmm5
  6658. vpor %xmm5, %xmm4, %xmm4
  6659. vpshufd $0xff, %xmm1, %xmm1
  6660. vpsrad $31, %xmm1, %xmm1
  6661. vpshufb L_aes_gcm_avx1_bswap_epi64, %xmm0, %xmm0
  6662. vpand L_aes_gcm_avx1_mod2_128, %xmm1, %xmm1
  6663. vpaddd L_aes_gcm_avx1_one, %xmm0, %xmm0
  6664. vpxor %xmm4, %xmm1, %xmm1
  6665. vmovdqu %xmm0, 64(%esp)
  6666. xorl %ebx, %ebx
  6667. cmpl $0x40, 216(%esp)
  6668. movl 216(%esp), %eax
  6669. jl L_AES_GCM_decrypt_avx1_done_64
  6670. andl $0xffffffc0, %eax
  6671. vmovdqa %xmm2, %xmm6
  6672. # H ^ 1
  6673. vmovdqu %xmm1, (%esp)
  6674. # H ^ 2
  6675. vpclmulqdq $0x00, %xmm1, %xmm1, %xmm4
  6676. vpclmulqdq $0x11, %xmm1, %xmm1, %xmm0
  6677. vpslld $31, %xmm4, %xmm5
  6678. vpslld $30, %xmm4, %xmm6
  6679. vpslld $25, %xmm4, %xmm7
  6680. vpxor %xmm6, %xmm5, %xmm5
  6681. vpxor %xmm7, %xmm5, %xmm5
  6682. vpsrldq $4, %xmm5, %xmm7
  6683. vpslldq $12, %xmm5, %xmm5
  6684. vpxor %xmm5, %xmm4, %xmm4
  6685. vpsrld $0x01, %xmm4, %xmm5
  6686. vpsrld $2, %xmm4, %xmm6
  6687. vpxor %xmm6, %xmm5, %xmm5
  6688. vpxor %xmm4, %xmm5, %xmm5
  6689. vpsrld $7, %xmm4, %xmm4
  6690. vpxor %xmm7, %xmm5, %xmm5
  6691. vpxor %xmm4, %xmm5, %xmm5
  6692. vpxor %xmm5, %xmm0, %xmm0
  6693. vmovdqu %xmm0, 16(%esp)
  6694. # H ^ 3
  6695. # ghash_gfmul_red_avx
  6696. vpshufd $0x4e, %xmm1, %xmm5
  6697. vpshufd $0x4e, %xmm0, %xmm6
  6698. vpclmulqdq $0x11, %xmm1, %xmm0, %xmm7
  6699. vpclmulqdq $0x00, %xmm1, %xmm0, %xmm4
  6700. vpxor %xmm1, %xmm5, %xmm5
  6701. vpxor %xmm0, %xmm6, %xmm6
  6702. vpclmulqdq $0x00, %xmm6, %xmm5, %xmm5
  6703. vpxor %xmm4, %xmm5, %xmm5
  6704. vpxor %xmm7, %xmm5, %xmm5
  6705. vpslldq $8, %xmm5, %xmm6
  6706. vpsrldq $8, %xmm5, %xmm5
  6707. vpxor %xmm6, %xmm4, %xmm4
  6708. vpxor %xmm5, %xmm7, %xmm3
  6709. vpslld $31, %xmm4, %xmm5
  6710. vpslld $30, %xmm4, %xmm6
  6711. vpslld $25, %xmm4, %xmm7
  6712. vpxor %xmm6, %xmm5, %xmm5
  6713. vpxor %xmm7, %xmm5, %xmm5
  6714. vpsrldq $4, %xmm5, %xmm7
  6715. vpslldq $12, %xmm5, %xmm5
  6716. vpxor %xmm5, %xmm4, %xmm4
  6717. vpsrld $0x01, %xmm4, %xmm5
  6718. vpsrld $2, %xmm4, %xmm6
  6719. vpxor %xmm6, %xmm5, %xmm5
  6720. vpxor %xmm4, %xmm5, %xmm5
  6721. vpsrld $7, %xmm4, %xmm4
  6722. vpxor %xmm7, %xmm5, %xmm5
  6723. vpxor %xmm4, %xmm5, %xmm5
  6724. vpxor %xmm5, %xmm3, %xmm3
  6725. vmovdqu %xmm3, 32(%esp)
  6726. # H ^ 4
  6727. vpclmulqdq $0x00, %xmm0, %xmm0, %xmm4
  6728. vpclmulqdq $0x11, %xmm0, %xmm0, %xmm3
  6729. vpslld $31, %xmm4, %xmm5
  6730. vpslld $30, %xmm4, %xmm6
  6731. vpslld $25, %xmm4, %xmm7
  6732. vpxor %xmm6, %xmm5, %xmm5
  6733. vpxor %xmm7, %xmm5, %xmm5
  6734. vpsrldq $4, %xmm5, %xmm7
  6735. vpslldq $12, %xmm5, %xmm5
  6736. vpxor %xmm5, %xmm4, %xmm4
  6737. vpsrld $0x01, %xmm4, %xmm5
  6738. vpsrld $2, %xmm4, %xmm6
  6739. vpxor %xmm6, %xmm5, %xmm5
  6740. vpxor %xmm4, %xmm5, %xmm5
  6741. vpsrld $7, %xmm4, %xmm4
  6742. vpxor %xmm7, %xmm5, %xmm5
  6743. vpxor %xmm4, %xmm5, %xmm5
  6744. vpxor %xmm5, %xmm3, %xmm3
  6745. vmovdqu %xmm3, 48(%esp)
  6746. cmpl %esi, %edi
  6747. jne L_AES_GCM_decrypt_avx1_ghash_64
  6748. L_AES_GCM_decrypt_avx1_ghash_64_inplace:
  6749. leal (%esi,%ebx,1), %ecx
  6750. leal (%edi,%ebx,1), %edx
  6751. vmovdqu 64(%esp), %xmm4
  6752. vmovdqa L_aes_gcm_avx1_bswap_epi64, %xmm3
  6753. vpaddd L_aes_gcm_avx1_one, %xmm4, %xmm5
  6754. vpshufb %xmm3, %xmm5, %xmm5
  6755. vpaddd L_aes_gcm_avx1_two, %xmm4, %xmm6
  6756. vpshufb %xmm3, %xmm6, %xmm6
  6757. vpaddd L_aes_gcm_avx1_three, %xmm4, %xmm7
  6758. vpshufb %xmm3, %xmm7, %xmm7
  6759. vpshufb %xmm3, %xmm4, %xmm4
  6760. vmovdqu 64(%esp), %xmm3
  6761. vpaddd L_aes_gcm_avx1_four, %xmm3, %xmm3
  6762. vmovdqu %xmm3, 64(%esp)
  6763. vmovdqa (%ebp), %xmm3
  6764. vpxor %xmm3, %xmm4, %xmm4
  6765. vpxor %xmm3, %xmm5, %xmm5
  6766. vpxor %xmm3, %xmm6, %xmm6
  6767. vpxor %xmm3, %xmm7, %xmm7
  6768. vmovdqa 16(%ebp), %xmm3
  6769. vaesenc %xmm3, %xmm4, %xmm4
  6770. vaesenc %xmm3, %xmm5, %xmm5
  6771. vaesenc %xmm3, %xmm6, %xmm6
  6772. vaesenc %xmm3, %xmm7, %xmm7
  6773. vmovdqa 32(%ebp), %xmm3
  6774. vaesenc %xmm3, %xmm4, %xmm4
  6775. vaesenc %xmm3, %xmm5, %xmm5
  6776. vaesenc %xmm3, %xmm6, %xmm6
  6777. vaesenc %xmm3, %xmm7, %xmm7
  6778. vmovdqa 48(%ebp), %xmm3
  6779. vaesenc %xmm3, %xmm4, %xmm4
  6780. vaesenc %xmm3, %xmm5, %xmm5
  6781. vaesenc %xmm3, %xmm6, %xmm6
  6782. vaesenc %xmm3, %xmm7, %xmm7
  6783. vmovdqa 64(%ebp), %xmm3
  6784. vaesenc %xmm3, %xmm4, %xmm4
  6785. vaesenc %xmm3, %xmm5, %xmm5
  6786. vaesenc %xmm3, %xmm6, %xmm6
  6787. vaesenc %xmm3, %xmm7, %xmm7
  6788. vmovdqa 80(%ebp), %xmm3
  6789. vaesenc %xmm3, %xmm4, %xmm4
  6790. vaesenc %xmm3, %xmm5, %xmm5
  6791. vaesenc %xmm3, %xmm6, %xmm6
  6792. vaesenc %xmm3, %xmm7, %xmm7
  6793. vmovdqa 96(%ebp), %xmm3
  6794. vaesenc %xmm3, %xmm4, %xmm4
  6795. vaesenc %xmm3, %xmm5, %xmm5
  6796. vaesenc %xmm3, %xmm6, %xmm6
  6797. vaesenc %xmm3, %xmm7, %xmm7
  6798. vmovdqa 112(%ebp), %xmm3
  6799. vaesenc %xmm3, %xmm4, %xmm4
  6800. vaesenc %xmm3, %xmm5, %xmm5
  6801. vaesenc %xmm3, %xmm6, %xmm6
  6802. vaesenc %xmm3, %xmm7, %xmm7
  6803. vmovdqa 128(%ebp), %xmm3
  6804. vaesenc %xmm3, %xmm4, %xmm4
  6805. vaesenc %xmm3, %xmm5, %xmm5
  6806. vaesenc %xmm3, %xmm6, %xmm6
  6807. vaesenc %xmm3, %xmm7, %xmm7
  6808. vmovdqa 144(%ebp), %xmm3
  6809. vaesenc %xmm3, %xmm4, %xmm4
  6810. vaesenc %xmm3, %xmm5, %xmm5
  6811. vaesenc %xmm3, %xmm6, %xmm6
  6812. vaesenc %xmm3, %xmm7, %xmm7
  6813. cmpl $11, 236(%esp)
  6814. vmovdqa 160(%ebp), %xmm3
  6815. jl L_AES_GCM_decrypt_avx1inplace_aesenc_64_ghash_avx_aesenc_64_enc_done
  6816. vaesenc %xmm3, %xmm4, %xmm4
  6817. vaesenc %xmm3, %xmm5, %xmm5
  6818. vaesenc %xmm3, %xmm6, %xmm6
  6819. vaesenc %xmm3, %xmm7, %xmm7
  6820. vmovdqa 176(%ebp), %xmm3
  6821. vaesenc %xmm3, %xmm4, %xmm4
  6822. vaesenc %xmm3, %xmm5, %xmm5
  6823. vaesenc %xmm3, %xmm6, %xmm6
  6824. vaesenc %xmm3, %xmm7, %xmm7
  6825. cmpl $13, 236(%esp)
  6826. vmovdqa 192(%ebp), %xmm3
  6827. jl L_AES_GCM_decrypt_avx1inplace_aesenc_64_ghash_avx_aesenc_64_enc_done
  6828. vaesenc %xmm3, %xmm4, %xmm4
  6829. vaesenc %xmm3, %xmm5, %xmm5
  6830. vaesenc %xmm3, %xmm6, %xmm6
  6831. vaesenc %xmm3, %xmm7, %xmm7
  6832. vmovdqa 208(%ebp), %xmm3
  6833. vaesenc %xmm3, %xmm4, %xmm4
  6834. vaesenc %xmm3, %xmm5, %xmm5
  6835. vaesenc %xmm3, %xmm6, %xmm6
  6836. vaesenc %xmm3, %xmm7, %xmm7
  6837. vmovdqa 224(%ebp), %xmm3
  6838. L_AES_GCM_decrypt_avx1inplace_aesenc_64_ghash_avx_aesenc_64_enc_done:
  6839. vaesenclast %xmm3, %xmm4, %xmm4
  6840. vaesenclast %xmm3, %xmm5, %xmm5
  6841. vmovdqu (%ecx), %xmm0
  6842. vmovdqu 16(%ecx), %xmm1
  6843. vpxor %xmm0, %xmm4, %xmm4
  6844. vpxor %xmm1, %xmm5, %xmm5
  6845. vmovdqu %xmm0, 112(%esp)
  6846. vmovdqu %xmm1, 128(%esp)
  6847. vmovdqu %xmm4, (%edx)
  6848. vmovdqu %xmm5, 16(%edx)
  6849. vaesenclast %xmm3, %xmm6, %xmm6
  6850. vaesenclast %xmm3, %xmm7, %xmm7
  6851. vmovdqu 32(%ecx), %xmm0
  6852. vmovdqu 48(%ecx), %xmm1
  6853. vpxor %xmm0, %xmm6, %xmm6
  6854. vpxor %xmm1, %xmm7, %xmm7
  6855. vmovdqu %xmm0, 144(%esp)
  6856. vmovdqu %xmm1, 160(%esp)
  6857. vmovdqu %xmm6, 32(%edx)
  6858. vmovdqu %xmm7, 48(%edx)
  6859. # ghash encrypted counter
  6860. vmovdqu 96(%esp), %xmm6
  6861. vmovdqu 48(%esp), %xmm3
  6862. vmovdqu 112(%esp), %xmm4
  6863. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm4, %xmm4
  6864. vpxor %xmm6, %xmm4, %xmm4
  6865. vpshufd $0x4e, %xmm3, %xmm5
  6866. vpshufd $0x4e, %xmm4, %xmm1
  6867. vpxor %xmm3, %xmm5, %xmm5
  6868. vpxor %xmm4, %xmm1, %xmm1
  6869. vpclmulqdq $0x11, %xmm3, %xmm4, %xmm7
  6870. vpclmulqdq $0x00, %xmm3, %xmm4, %xmm6
  6871. vpclmulqdq $0x00, %xmm1, %xmm5, %xmm5
  6872. vpxor %xmm6, %xmm5, %xmm5
  6873. vpxor %xmm7, %xmm5, %xmm5
  6874. vmovdqu 32(%esp), %xmm3
  6875. vmovdqu 128(%esp), %xmm4
  6876. vpshufd $0x4e, %xmm3, %xmm0
  6877. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm4, %xmm4
  6878. vpxor %xmm3, %xmm0, %xmm0
  6879. vpshufd $0x4e, %xmm4, %xmm1
  6880. vpxor %xmm4, %xmm1, %xmm1
  6881. vpclmulqdq $0x11, %xmm3, %xmm4, %xmm2
  6882. vpclmulqdq $0x00, %xmm3, %xmm4, %xmm3
  6883. vpclmulqdq $0x00, %xmm1, %xmm0, %xmm0
  6884. vpxor %xmm3, %xmm5, %xmm5
  6885. vpxor %xmm3, %xmm6, %xmm6
  6886. vpxor %xmm2, %xmm5, %xmm5
  6887. vpxor %xmm2, %xmm7, %xmm7
  6888. vpxor %xmm0, %xmm5, %xmm5
  6889. vmovdqu 16(%esp), %xmm3
  6890. vmovdqu 144(%esp), %xmm4
  6891. vpshufd $0x4e, %xmm3, %xmm0
  6892. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm4, %xmm4
  6893. vpxor %xmm3, %xmm0, %xmm0
  6894. vpshufd $0x4e, %xmm4, %xmm1
  6895. vpxor %xmm4, %xmm1, %xmm1
  6896. vpclmulqdq $0x11, %xmm3, %xmm4, %xmm2
  6897. vpclmulqdq $0x00, %xmm3, %xmm4, %xmm3
  6898. vpclmulqdq $0x00, %xmm1, %xmm0, %xmm0
  6899. vpxor %xmm3, %xmm5, %xmm5
  6900. vpxor %xmm3, %xmm6, %xmm6
  6901. vpxor %xmm2, %xmm5, %xmm5
  6902. vpxor %xmm2, %xmm7, %xmm7
  6903. vpxor %xmm0, %xmm5, %xmm5
  6904. vmovdqu (%esp), %xmm3
  6905. vmovdqu 160(%esp), %xmm4
  6906. vpshufd $0x4e, %xmm3, %xmm0
  6907. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm4, %xmm4
  6908. vpxor %xmm3, %xmm0, %xmm0
  6909. vpshufd $0x4e, %xmm4, %xmm1
  6910. vpxor %xmm4, %xmm1, %xmm1
  6911. vpclmulqdq $0x11, %xmm3, %xmm4, %xmm2
  6912. vpclmulqdq $0x00, %xmm3, %xmm4, %xmm3
  6913. vpclmulqdq $0x00, %xmm1, %xmm0, %xmm0
  6914. vpxor %xmm3, %xmm5, %xmm5
  6915. vpxor %xmm3, %xmm6, %xmm6
  6916. vpxor %xmm2, %xmm5, %xmm5
  6917. vpxor %xmm2, %xmm7, %xmm7
  6918. vpxor %xmm0, %xmm5, %xmm5
  6919. vpslldq $8, %xmm5, %xmm1
  6920. vpsrldq $8, %xmm5, %xmm5
  6921. vpxor %xmm1, %xmm6, %xmm6
  6922. vpxor %xmm5, %xmm7, %xmm7
  6923. vpslld $31, %xmm6, %xmm3
  6924. vpslld $30, %xmm6, %xmm0
  6925. vpslld $25, %xmm6, %xmm1
  6926. vpxor %xmm0, %xmm3, %xmm3
  6927. vpxor %xmm1, %xmm3, %xmm3
  6928. vpsrldq $4, %xmm3, %xmm0
  6929. vpslldq $12, %xmm3, %xmm3
  6930. vpxor %xmm3, %xmm6, %xmm6
  6931. vpsrld $0x01, %xmm6, %xmm1
  6932. vpsrld $2, %xmm6, %xmm5
  6933. vpsrld $7, %xmm6, %xmm4
  6934. vpxor %xmm5, %xmm1, %xmm1
  6935. vpxor %xmm4, %xmm1, %xmm1
  6936. vpxor %xmm0, %xmm1, %xmm1
  6937. vpxor %xmm1, %xmm6, %xmm6
  6938. vpxor %xmm7, %xmm6, %xmm6
  6939. vmovdqu %xmm6, 96(%esp)
  6940. addl $0x40, %ebx
  6941. cmpl %eax, %ebx
  6942. jl L_AES_GCM_decrypt_avx1_ghash_64_inplace
  6943. jmp L_AES_GCM_decrypt_avx1_ghash_64_done
  6944. L_AES_GCM_decrypt_avx1_ghash_64:
  6945. leal (%esi,%ebx,1), %ecx
  6946. leal (%edi,%ebx,1), %edx
  6947. vmovdqu 64(%esp), %xmm4
  6948. vmovdqa L_aes_gcm_avx1_bswap_epi64, %xmm3
  6949. vpaddd L_aes_gcm_avx1_one, %xmm4, %xmm5
  6950. vpshufb %xmm3, %xmm5, %xmm5
  6951. vpaddd L_aes_gcm_avx1_two, %xmm4, %xmm6
  6952. vpshufb %xmm3, %xmm6, %xmm6
  6953. vpaddd L_aes_gcm_avx1_three, %xmm4, %xmm7
  6954. vpshufb %xmm3, %xmm7, %xmm7
  6955. vpshufb %xmm3, %xmm4, %xmm4
  6956. vmovdqu 64(%esp), %xmm3
  6957. vpaddd L_aes_gcm_avx1_four, %xmm3, %xmm3
  6958. vmovdqu %xmm3, 64(%esp)
  6959. vmovdqa (%ebp), %xmm3
  6960. vpxor %xmm3, %xmm4, %xmm4
  6961. vpxor %xmm3, %xmm5, %xmm5
  6962. vpxor %xmm3, %xmm6, %xmm6
  6963. vpxor %xmm3, %xmm7, %xmm7
  6964. vmovdqa 16(%ebp), %xmm3
  6965. vaesenc %xmm3, %xmm4, %xmm4
  6966. vaesenc %xmm3, %xmm5, %xmm5
  6967. vaesenc %xmm3, %xmm6, %xmm6
  6968. vaesenc %xmm3, %xmm7, %xmm7
  6969. vmovdqa 32(%ebp), %xmm3
  6970. vaesenc %xmm3, %xmm4, %xmm4
  6971. vaesenc %xmm3, %xmm5, %xmm5
  6972. vaesenc %xmm3, %xmm6, %xmm6
  6973. vaesenc %xmm3, %xmm7, %xmm7
  6974. vmovdqa 48(%ebp), %xmm3
  6975. vaesenc %xmm3, %xmm4, %xmm4
  6976. vaesenc %xmm3, %xmm5, %xmm5
  6977. vaesenc %xmm3, %xmm6, %xmm6
  6978. vaesenc %xmm3, %xmm7, %xmm7
  6979. vmovdqa 64(%ebp), %xmm3
  6980. vaesenc %xmm3, %xmm4, %xmm4
  6981. vaesenc %xmm3, %xmm5, %xmm5
  6982. vaesenc %xmm3, %xmm6, %xmm6
  6983. vaesenc %xmm3, %xmm7, %xmm7
  6984. vmovdqa 80(%ebp), %xmm3
  6985. vaesenc %xmm3, %xmm4, %xmm4
  6986. vaesenc %xmm3, %xmm5, %xmm5
  6987. vaesenc %xmm3, %xmm6, %xmm6
  6988. vaesenc %xmm3, %xmm7, %xmm7
  6989. vmovdqa 96(%ebp), %xmm3
  6990. vaesenc %xmm3, %xmm4, %xmm4
  6991. vaesenc %xmm3, %xmm5, %xmm5
  6992. vaesenc %xmm3, %xmm6, %xmm6
  6993. vaesenc %xmm3, %xmm7, %xmm7
  6994. vmovdqa 112(%ebp), %xmm3
  6995. vaesenc %xmm3, %xmm4, %xmm4
  6996. vaesenc %xmm3, %xmm5, %xmm5
  6997. vaesenc %xmm3, %xmm6, %xmm6
  6998. vaesenc %xmm3, %xmm7, %xmm7
  6999. vmovdqa 128(%ebp), %xmm3
  7000. vaesenc %xmm3, %xmm4, %xmm4
  7001. vaesenc %xmm3, %xmm5, %xmm5
  7002. vaesenc %xmm3, %xmm6, %xmm6
  7003. vaesenc %xmm3, %xmm7, %xmm7
  7004. vmovdqa 144(%ebp), %xmm3
  7005. vaesenc %xmm3, %xmm4, %xmm4
  7006. vaesenc %xmm3, %xmm5, %xmm5
  7007. vaesenc %xmm3, %xmm6, %xmm6
  7008. vaesenc %xmm3, %xmm7, %xmm7
  7009. cmpl $11, 236(%esp)
  7010. vmovdqa 160(%ebp), %xmm3
  7011. jl L_AES_GCM_decrypt_avx1_aesenc_64_ghash_avx_aesenc_64_enc_done
  7012. vaesenc %xmm3, %xmm4, %xmm4
  7013. vaesenc %xmm3, %xmm5, %xmm5
  7014. vaesenc %xmm3, %xmm6, %xmm6
  7015. vaesenc %xmm3, %xmm7, %xmm7
  7016. vmovdqa 176(%ebp), %xmm3
  7017. vaesenc %xmm3, %xmm4, %xmm4
  7018. vaesenc %xmm3, %xmm5, %xmm5
  7019. vaesenc %xmm3, %xmm6, %xmm6
  7020. vaesenc %xmm3, %xmm7, %xmm7
  7021. cmpl $13, 236(%esp)
  7022. vmovdqa 192(%ebp), %xmm3
  7023. jl L_AES_GCM_decrypt_avx1_aesenc_64_ghash_avx_aesenc_64_enc_done
  7024. vaesenc %xmm3, %xmm4, %xmm4
  7025. vaesenc %xmm3, %xmm5, %xmm5
  7026. vaesenc %xmm3, %xmm6, %xmm6
  7027. vaesenc %xmm3, %xmm7, %xmm7
  7028. vmovdqa 208(%ebp), %xmm3
  7029. vaesenc %xmm3, %xmm4, %xmm4
  7030. vaesenc %xmm3, %xmm5, %xmm5
  7031. vaesenc %xmm3, %xmm6, %xmm6
  7032. vaesenc %xmm3, %xmm7, %xmm7
  7033. vmovdqa 224(%ebp), %xmm3
  7034. L_AES_GCM_decrypt_avx1_aesenc_64_ghash_avx_aesenc_64_enc_done:
  7035. vaesenclast %xmm3, %xmm4, %xmm4
  7036. vaesenclast %xmm3, %xmm5, %xmm5
  7037. vmovdqu (%ecx), %xmm0
  7038. vmovdqu 16(%ecx), %xmm1
  7039. vpxor %xmm0, %xmm4, %xmm4
  7040. vpxor %xmm1, %xmm5, %xmm5
  7041. vmovdqu %xmm0, (%ecx)
  7042. vmovdqu %xmm1, 16(%ecx)
  7043. vmovdqu %xmm4, (%edx)
  7044. vmovdqu %xmm5, 16(%edx)
  7045. vaesenclast %xmm3, %xmm6, %xmm6
  7046. vaesenclast %xmm3, %xmm7, %xmm7
  7047. vmovdqu 32(%ecx), %xmm0
  7048. vmovdqu 48(%ecx), %xmm1
  7049. vpxor %xmm0, %xmm6, %xmm6
  7050. vpxor %xmm1, %xmm7, %xmm7
  7051. vmovdqu %xmm0, 32(%ecx)
  7052. vmovdqu %xmm1, 48(%ecx)
  7053. vmovdqu %xmm6, 32(%edx)
  7054. vmovdqu %xmm7, 48(%edx)
  7055. # ghash encrypted counter
  7056. vmovdqu 96(%esp), %xmm6
  7057. vmovdqu 48(%esp), %xmm3
  7058. vmovdqu (%ecx), %xmm4
  7059. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm4, %xmm4
  7060. vpxor %xmm6, %xmm4, %xmm4
  7061. vpshufd $0x4e, %xmm3, %xmm5
  7062. vpshufd $0x4e, %xmm4, %xmm1
  7063. vpxor %xmm3, %xmm5, %xmm5
  7064. vpxor %xmm4, %xmm1, %xmm1
  7065. vpclmulqdq $0x11, %xmm3, %xmm4, %xmm7
  7066. vpclmulqdq $0x00, %xmm3, %xmm4, %xmm6
  7067. vpclmulqdq $0x00, %xmm1, %xmm5, %xmm5
  7068. vpxor %xmm6, %xmm5, %xmm5
  7069. vpxor %xmm7, %xmm5, %xmm5
  7070. vmovdqu 32(%esp), %xmm3
  7071. vmovdqu 16(%ecx), %xmm4
  7072. vpshufd $0x4e, %xmm3, %xmm0
  7073. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm4, %xmm4
  7074. vpxor %xmm3, %xmm0, %xmm0
  7075. vpshufd $0x4e, %xmm4, %xmm1
  7076. vpxor %xmm4, %xmm1, %xmm1
  7077. vpclmulqdq $0x11, %xmm3, %xmm4, %xmm2
  7078. vpclmulqdq $0x00, %xmm3, %xmm4, %xmm3
  7079. vpclmulqdq $0x00, %xmm1, %xmm0, %xmm0
  7080. vpxor %xmm3, %xmm5, %xmm5
  7081. vpxor %xmm3, %xmm6, %xmm6
  7082. vpxor %xmm2, %xmm5, %xmm5
  7083. vpxor %xmm2, %xmm7, %xmm7
  7084. vpxor %xmm0, %xmm5, %xmm5
  7085. vmovdqu 16(%esp), %xmm3
  7086. vmovdqu 32(%ecx), %xmm4
  7087. vpshufd $0x4e, %xmm3, %xmm0
  7088. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm4, %xmm4
  7089. vpxor %xmm3, %xmm0, %xmm0
  7090. vpshufd $0x4e, %xmm4, %xmm1
  7091. vpxor %xmm4, %xmm1, %xmm1
  7092. vpclmulqdq $0x11, %xmm3, %xmm4, %xmm2
  7093. vpclmulqdq $0x00, %xmm3, %xmm4, %xmm3
  7094. vpclmulqdq $0x00, %xmm1, %xmm0, %xmm0
  7095. vpxor %xmm3, %xmm5, %xmm5
  7096. vpxor %xmm3, %xmm6, %xmm6
  7097. vpxor %xmm2, %xmm5, %xmm5
  7098. vpxor %xmm2, %xmm7, %xmm7
  7099. vpxor %xmm0, %xmm5, %xmm5
  7100. vmovdqu (%esp), %xmm3
  7101. vmovdqu 48(%ecx), %xmm4
  7102. vpshufd $0x4e, %xmm3, %xmm0
  7103. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm4, %xmm4
  7104. vpxor %xmm3, %xmm0, %xmm0
  7105. vpshufd $0x4e, %xmm4, %xmm1
  7106. vpxor %xmm4, %xmm1, %xmm1
  7107. vpclmulqdq $0x11, %xmm3, %xmm4, %xmm2
  7108. vpclmulqdq $0x00, %xmm3, %xmm4, %xmm3
  7109. vpclmulqdq $0x00, %xmm1, %xmm0, %xmm0
  7110. vpxor %xmm3, %xmm5, %xmm5
  7111. vpxor %xmm3, %xmm6, %xmm6
  7112. vpxor %xmm2, %xmm5, %xmm5
  7113. vpxor %xmm2, %xmm7, %xmm7
  7114. vpxor %xmm0, %xmm5, %xmm5
  7115. vpslldq $8, %xmm5, %xmm1
  7116. vpsrldq $8, %xmm5, %xmm5
  7117. vpxor %xmm1, %xmm6, %xmm6
  7118. vpxor %xmm5, %xmm7, %xmm7
  7119. vpslld $31, %xmm6, %xmm3
  7120. vpslld $30, %xmm6, %xmm0
  7121. vpslld $25, %xmm6, %xmm1
  7122. vpxor %xmm0, %xmm3, %xmm3
  7123. vpxor %xmm1, %xmm3, %xmm3
  7124. vpsrldq $4, %xmm3, %xmm0
  7125. vpslldq $12, %xmm3, %xmm3
  7126. vpxor %xmm3, %xmm6, %xmm6
  7127. vpsrld $0x01, %xmm6, %xmm1
  7128. vpsrld $2, %xmm6, %xmm5
  7129. vpsrld $7, %xmm6, %xmm4
  7130. vpxor %xmm5, %xmm1, %xmm1
  7131. vpxor %xmm4, %xmm1, %xmm1
  7132. vpxor %xmm0, %xmm1, %xmm1
  7133. vpxor %xmm1, %xmm6, %xmm6
  7134. vpxor %xmm7, %xmm6, %xmm6
  7135. vmovdqu %xmm6, 96(%esp)
  7136. addl $0x40, %ebx
  7137. cmpl %eax, %ebx
  7138. jl L_AES_GCM_decrypt_avx1_ghash_64
  7139. L_AES_GCM_decrypt_avx1_ghash_64_done:
  7140. vmovdqa %xmm6, %xmm2
  7141. vmovdqu (%esp), %xmm1
  7142. L_AES_GCM_decrypt_avx1_done_64:
  7143. movl 216(%esp), %edx
  7144. cmpl %edx, %ebx
  7145. jge L_AES_GCM_decrypt_avx1_done_dec
  7146. movl 216(%esp), %eax
  7147. andl $0xfffffff0, %eax
  7148. cmpl %eax, %ebx
  7149. jge L_AES_GCM_decrypt_avx1_last_block_done
  7150. L_AES_GCM_decrypt_avx1_last_block_start:
  7151. leal (%esi,%ebx,1), %ecx
  7152. leal (%edi,%ebx,1), %edx
  7153. vmovdqu (%ecx), %xmm7
  7154. pshufb L_aes_gcm_avx1_bswap_mask, %xmm7
  7155. pxor %xmm2, %xmm7
  7156. vmovdqu 64(%esp), %xmm5
  7157. vmovdqu %xmm7, %xmm7
  7158. vpshufb L_aes_gcm_avx1_bswap_epi64, %xmm5, %xmm4
  7159. vpaddd L_aes_gcm_avx1_one, %xmm5, %xmm5
  7160. vmovdqu %xmm5, 64(%esp)
  7161. vpxor (%ebp), %xmm4, %xmm4
  7162. vpclmulqdq $16, %xmm1, %xmm7, %xmm0
  7163. vaesenc 16(%ebp), %xmm4, %xmm4
  7164. vaesenc 32(%ebp), %xmm4, %xmm4
  7165. vpclmulqdq $0x01, %xmm1, %xmm7, %xmm3
  7166. vaesenc 48(%ebp), %xmm4, %xmm4
  7167. vaesenc 64(%ebp), %xmm4, %xmm4
  7168. vaesenc 80(%ebp), %xmm4, %xmm4
  7169. vpclmulqdq $0x11, %xmm1, %xmm7, %xmm5
  7170. vaesenc 96(%ebp), %xmm4, %xmm4
  7171. vpxor %xmm3, %xmm0, %xmm0
  7172. vpslldq $8, %xmm0, %xmm6
  7173. vpsrldq $8, %xmm0, %xmm0
  7174. vaesenc 112(%ebp), %xmm4, %xmm4
  7175. vpclmulqdq $0x00, %xmm1, %xmm7, %xmm3
  7176. vpxor %xmm3, %xmm6, %xmm6
  7177. vpxor %xmm0, %xmm5, %xmm5
  7178. vmovdqa L_aes_gcm_avx1_mod2_128, %xmm7
  7179. vpclmulqdq $16, %xmm7, %xmm6, %xmm3
  7180. vaesenc 128(%ebp), %xmm4, %xmm4
  7181. vpshufd $0x4e, %xmm6, %xmm0
  7182. vpxor %xmm3, %xmm0, %xmm0
  7183. vpclmulqdq $16, %xmm7, %xmm0, %xmm3
  7184. vaesenc 144(%ebp), %xmm4, %xmm4
  7185. vpshufd $0x4e, %xmm0, %xmm2
  7186. vpxor %xmm3, %xmm2, %xmm2
  7187. vpxor %xmm5, %xmm2, %xmm2
  7188. cmpl $11, 236(%esp)
  7189. vmovdqa 160(%ebp), %xmm5
  7190. jl L_AES_GCM_decrypt_avx1_aesenc_gfmul_last
  7191. vaesenc %xmm5, %xmm4, %xmm4
  7192. vaesenc 176(%ebp), %xmm4, %xmm4
  7193. cmpl $13, 236(%esp)
  7194. vmovdqa 192(%ebp), %xmm5
  7195. jl L_AES_GCM_decrypt_avx1_aesenc_gfmul_last
  7196. vaesenc %xmm5, %xmm4, %xmm4
  7197. vaesenc 208(%ebp), %xmm4, %xmm4
  7198. vmovdqa 224(%ebp), %xmm5
  7199. L_AES_GCM_decrypt_avx1_aesenc_gfmul_last:
  7200. vaesenclast %xmm5, %xmm4, %xmm4
  7201. vmovdqu (%ecx), %xmm5
  7202. vpxor %xmm5, %xmm4, %xmm4
  7203. vmovdqu %xmm4, (%edx)
  7204. addl $16, %ebx
  7205. cmpl %eax, %ebx
  7206. jl L_AES_GCM_decrypt_avx1_last_block_start
  7207. L_AES_GCM_decrypt_avx1_last_block_done:
  7208. movl 216(%esp), %ecx
  7209. movl %ecx, %edx
  7210. andl $15, %ecx
  7211. jz L_AES_GCM_decrypt_avx1_aesenc_last15_dec_avx_done
  7212. vmovdqu 64(%esp), %xmm0
  7213. vpshufb L_aes_gcm_avx1_bswap_epi64, %xmm0, %xmm0
  7214. vpxor (%ebp), %xmm0, %xmm0
  7215. vaesenc 16(%ebp), %xmm0, %xmm0
  7216. vaesenc 32(%ebp), %xmm0, %xmm0
  7217. vaesenc 48(%ebp), %xmm0, %xmm0
  7218. vaesenc 64(%ebp), %xmm0, %xmm0
  7219. vaesenc 80(%ebp), %xmm0, %xmm0
  7220. vaesenc 96(%ebp), %xmm0, %xmm0
  7221. vaesenc 112(%ebp), %xmm0, %xmm0
  7222. vaesenc 128(%ebp), %xmm0, %xmm0
  7223. vaesenc 144(%ebp), %xmm0, %xmm0
  7224. cmpl $11, 236(%esp)
  7225. vmovdqa 160(%ebp), %xmm5
  7226. jl L_AES_GCM_decrypt_avx1_aesenc_last15_dec_avx_aesenc_avx_last
  7227. vaesenc %xmm5, %xmm0, %xmm0
  7228. vaesenc 176(%ebp), %xmm0, %xmm0
  7229. cmpl $13, 236(%esp)
  7230. vmovdqa 192(%ebp), %xmm5
  7231. jl L_AES_GCM_decrypt_avx1_aesenc_last15_dec_avx_aesenc_avx_last
  7232. vaesenc %xmm5, %xmm0, %xmm0
  7233. vaesenc 208(%ebp), %xmm0, %xmm0
  7234. vmovdqa 224(%ebp), %xmm5
  7235. L_AES_GCM_decrypt_avx1_aesenc_last15_dec_avx_aesenc_avx_last:
  7236. vaesenclast %xmm5, %xmm0, %xmm0
  7237. subl $32, %esp
  7238. xorl %ecx, %ecx
  7239. vmovdqu %xmm0, (%esp)
  7240. vpxor %xmm4, %xmm4, %xmm4
  7241. vmovdqu %xmm4, 16(%esp)
  7242. L_AES_GCM_decrypt_avx1_aesenc_last15_dec_avx_loop:
  7243. movzbl (%esi,%ebx,1), %eax
  7244. movb %al, 16(%esp,%ecx,1)
  7245. xorb (%esp,%ecx,1), %al
  7246. movb %al, (%edi,%ebx,1)
  7247. incl %ebx
  7248. incl %ecx
  7249. cmpl %edx, %ebx
  7250. jl L_AES_GCM_decrypt_avx1_aesenc_last15_dec_avx_loop
  7251. vmovdqu 16(%esp), %xmm0
  7252. addl $32, %esp
  7253. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm0, %xmm0
  7254. vpxor %xmm0, %xmm2, %xmm2
  7255. # ghash_gfmul_red_avx
  7256. vpshufd $0x4e, %xmm1, %xmm5
  7257. vpshufd $0x4e, %xmm2, %xmm6
  7258. vpclmulqdq $0x11, %xmm1, %xmm2, %xmm7
  7259. vpclmulqdq $0x00, %xmm1, %xmm2, %xmm4
  7260. vpxor %xmm1, %xmm5, %xmm5
  7261. vpxor %xmm2, %xmm6, %xmm6
  7262. vpclmulqdq $0x00, %xmm6, %xmm5, %xmm5
  7263. vpxor %xmm4, %xmm5, %xmm5
  7264. vpxor %xmm7, %xmm5, %xmm5
  7265. vpslldq $8, %xmm5, %xmm6
  7266. vpsrldq $8, %xmm5, %xmm5
  7267. vpxor %xmm6, %xmm4, %xmm4
  7268. vpxor %xmm5, %xmm7, %xmm2
  7269. vpslld $31, %xmm4, %xmm5
  7270. vpslld $30, %xmm4, %xmm6
  7271. vpslld $25, %xmm4, %xmm7
  7272. vpxor %xmm6, %xmm5, %xmm5
  7273. vpxor %xmm7, %xmm5, %xmm5
  7274. vpsrldq $4, %xmm5, %xmm7
  7275. vpslldq $12, %xmm5, %xmm5
  7276. vpxor %xmm5, %xmm4, %xmm4
  7277. vpsrld $0x01, %xmm4, %xmm5
  7278. vpsrld $2, %xmm4, %xmm6
  7279. vpxor %xmm6, %xmm5, %xmm5
  7280. vpxor %xmm4, %xmm5, %xmm5
  7281. vpsrld $7, %xmm4, %xmm4
  7282. vpxor %xmm7, %xmm5, %xmm5
  7283. vpxor %xmm4, %xmm5, %xmm5
  7284. vpxor %xmm5, %xmm2, %xmm2
  7285. L_AES_GCM_decrypt_avx1_aesenc_last15_dec_avx_done:
  7286. L_AES_GCM_decrypt_avx1_done_dec:
  7287. movl 212(%esp), %esi
  7288. movl 228(%esp), %ebp
  7289. movl 216(%esp), %edx
  7290. movl 220(%esp), %ecx
  7291. shll $3, %edx
  7292. shll $3, %ecx
  7293. vpinsrd $0x00, %edx, %xmm4, %xmm4
  7294. vpinsrd $2, %ecx, %xmm4, %xmm4
  7295. movl 216(%esp), %edx
  7296. movl 220(%esp), %ecx
  7297. shrl $29, %edx
  7298. shrl $29, %ecx
  7299. vpinsrd $0x01, %edx, %xmm4, %xmm4
  7300. vpinsrd $3, %ecx, %xmm4, %xmm4
  7301. vpxor %xmm4, %xmm2, %xmm2
  7302. # ghash_gfmul_red_avx
  7303. vpshufd $0x4e, %xmm1, %xmm5
  7304. vpshufd $0x4e, %xmm2, %xmm6
  7305. vpclmulqdq $0x11, %xmm1, %xmm2, %xmm7
  7306. vpclmulqdq $0x00, %xmm1, %xmm2, %xmm4
  7307. vpxor %xmm1, %xmm5, %xmm5
  7308. vpxor %xmm2, %xmm6, %xmm6
  7309. vpclmulqdq $0x00, %xmm6, %xmm5, %xmm5
  7310. vpxor %xmm4, %xmm5, %xmm5
  7311. vpxor %xmm7, %xmm5, %xmm5
  7312. vpslldq $8, %xmm5, %xmm6
  7313. vpsrldq $8, %xmm5, %xmm5
  7314. vpxor %xmm6, %xmm4, %xmm4
  7315. vpxor %xmm5, %xmm7, %xmm2
  7316. vpslld $31, %xmm4, %xmm5
  7317. vpslld $30, %xmm4, %xmm6
  7318. vpslld $25, %xmm4, %xmm7
  7319. vpxor %xmm6, %xmm5, %xmm5
  7320. vpxor %xmm7, %xmm5, %xmm5
  7321. vpsrldq $4, %xmm5, %xmm7
  7322. vpslldq $12, %xmm5, %xmm5
  7323. vpxor %xmm5, %xmm4, %xmm4
  7324. vpsrld $0x01, %xmm4, %xmm5
  7325. vpsrld $2, %xmm4, %xmm6
  7326. vpxor %xmm6, %xmm5, %xmm5
  7327. vpxor %xmm4, %xmm5, %xmm5
  7328. vpsrld $7, %xmm4, %xmm4
  7329. vpxor %xmm7, %xmm5, %xmm5
  7330. vpxor %xmm4, %xmm5, %xmm5
  7331. vpxor %xmm5, %xmm2, %xmm2
  7332. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm2, %xmm2
  7333. vpxor 80(%esp), %xmm2, %xmm4
  7334. movl 240(%esp), %edi
  7335. cmpl $16, %ebp
  7336. je L_AES_GCM_decrypt_avx1_cmp_tag_16
  7337. subl $16, %esp
  7338. xorl %ecx, %ecx
  7339. xorl %ebx, %ebx
  7340. vmovdqu %xmm4, (%esp)
  7341. L_AES_GCM_decrypt_avx1_cmp_tag_loop:
  7342. movzbl (%esp,%ecx,1), %eax
  7343. xorb (%esi,%ecx,1), %al
  7344. orb %al, %bl
  7345. incl %ecx
  7346. cmpl %ebp, %ecx
  7347. jne L_AES_GCM_decrypt_avx1_cmp_tag_loop
  7348. cmpb $0x00, %bl
  7349. sete %bl
  7350. addl $16, %esp
  7351. xorl %ecx, %ecx
  7352. jmp L_AES_GCM_decrypt_avx1_cmp_tag_done
  7353. L_AES_GCM_decrypt_avx1_cmp_tag_16:
  7354. vmovdqu (%esi), %xmm5
  7355. vpcmpeqb %xmm5, %xmm4, %xmm4
  7356. vpmovmskb %xmm4, %edx
  7357. # %%edx == 0xFFFF then return 1 else => return 0
  7358. xorl %ebx, %ebx
  7359. cmpl $0xffff, %edx
  7360. sete %bl
  7361. L_AES_GCM_decrypt_avx1_cmp_tag_done:
  7362. movl %ebx, (%edi)
  7363. addl $0xb0, %esp
  7364. popl %ebp
  7365. popl %edi
  7366. popl %esi
  7367. popl %ebx
  7368. ret
  7369. .size AES_GCM_decrypt_avx1,.-AES_GCM_decrypt_avx1
  7370. #ifdef WOLFSSL_AESGCM_STREAM
  7371. .text
  7372. .globl AES_GCM_init_avx1
  7373. .type AES_GCM_init_avx1,@function
  7374. .align 16
  7375. AES_GCM_init_avx1:
  7376. pushl %ebx
  7377. pushl %esi
  7378. pushl %edi
  7379. pushl %ebp
  7380. subl $16, %esp
  7381. movl 36(%esp), %ebp
  7382. movl 44(%esp), %esi
  7383. movl 60(%esp), %edi
  7384. vpxor %xmm4, %xmm4, %xmm4
  7385. movl 48(%esp), %edx
  7386. cmpl $12, %edx
  7387. jne L_AES_GCM_init_avx1_iv_not_12
  7388. # # Calculate values when IV is 12 bytes
  7389. # Set counter based on IV
  7390. movl $0x1000000, %ecx
  7391. vpinsrd $0x00, (%esi), %xmm4, %xmm4
  7392. vpinsrd $0x01, 4(%esi), %xmm4, %xmm4
  7393. vpinsrd $2, 8(%esi), %xmm4, %xmm4
  7394. vpinsrd $3, %ecx, %xmm4, %xmm4
  7395. # H = Encrypt X(=0) and T = Encrypt counter
  7396. vmovdqa (%ebp), %xmm5
  7397. vpxor %xmm5, %xmm4, %xmm1
  7398. vmovdqa 16(%ebp), %xmm7
  7399. vaesenc %xmm7, %xmm5, %xmm5
  7400. vaesenc %xmm7, %xmm1, %xmm1
  7401. vmovdqa 32(%ebp), %xmm7
  7402. vaesenc %xmm7, %xmm5, %xmm5
  7403. vaesenc %xmm7, %xmm1, %xmm1
  7404. vmovdqa 48(%ebp), %xmm7
  7405. vaesenc %xmm7, %xmm5, %xmm5
  7406. vaesenc %xmm7, %xmm1, %xmm1
  7407. vmovdqa 64(%ebp), %xmm7
  7408. vaesenc %xmm7, %xmm5, %xmm5
  7409. vaesenc %xmm7, %xmm1, %xmm1
  7410. vmovdqa 80(%ebp), %xmm7
  7411. vaesenc %xmm7, %xmm5, %xmm5
  7412. vaesenc %xmm7, %xmm1, %xmm1
  7413. vmovdqa 96(%ebp), %xmm7
  7414. vaesenc %xmm7, %xmm5, %xmm5
  7415. vaesenc %xmm7, %xmm1, %xmm1
  7416. vmovdqa 112(%ebp), %xmm7
  7417. vaesenc %xmm7, %xmm5, %xmm5
  7418. vaesenc %xmm7, %xmm1, %xmm1
  7419. vmovdqa 128(%ebp), %xmm7
  7420. vaesenc %xmm7, %xmm5, %xmm5
  7421. vaesenc %xmm7, %xmm1, %xmm1
  7422. vmovdqa 144(%ebp), %xmm7
  7423. vaesenc %xmm7, %xmm5, %xmm5
  7424. vaesenc %xmm7, %xmm1, %xmm1
  7425. cmpl $11, 40(%esp)
  7426. vmovdqa 160(%ebp), %xmm7
  7427. jl L_AES_GCM_init_avx1_calc_iv_12_last
  7428. vaesenc %xmm7, %xmm5, %xmm5
  7429. vaesenc %xmm7, %xmm1, %xmm1
  7430. vmovdqa 176(%ebp), %xmm7
  7431. vaesenc %xmm7, %xmm5, %xmm5
  7432. vaesenc %xmm7, %xmm1, %xmm1
  7433. cmpl $13, 40(%esp)
  7434. vmovdqa 192(%ebp), %xmm7
  7435. jl L_AES_GCM_init_avx1_calc_iv_12_last
  7436. vaesenc %xmm7, %xmm5, %xmm5
  7437. vaesenc %xmm7, %xmm1, %xmm1
  7438. vmovdqa 208(%ebp), %xmm7
  7439. vaesenc %xmm7, %xmm5, %xmm5
  7440. vaesenc %xmm7, %xmm1, %xmm1
  7441. vmovdqa 224(%ebp), %xmm7
  7442. L_AES_GCM_init_avx1_calc_iv_12_last:
  7443. vaesenclast %xmm7, %xmm5, %xmm5
  7444. vaesenclast %xmm7, %xmm1, %xmm1
  7445. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm5, %xmm5
  7446. vmovdqu %xmm1, (%edi)
  7447. jmp L_AES_GCM_init_avx1_iv_done
  7448. L_AES_GCM_init_avx1_iv_not_12:
  7449. # Calculate values when IV is not 12 bytes
  7450. # H = Encrypt X(=0)
  7451. vmovdqa (%ebp), %xmm5
  7452. vaesenc 16(%ebp), %xmm5, %xmm5
  7453. vaesenc 32(%ebp), %xmm5, %xmm5
  7454. vaesenc 48(%ebp), %xmm5, %xmm5
  7455. vaesenc 64(%ebp), %xmm5, %xmm5
  7456. vaesenc 80(%ebp), %xmm5, %xmm5
  7457. vaesenc 96(%ebp), %xmm5, %xmm5
  7458. vaesenc 112(%ebp), %xmm5, %xmm5
  7459. vaesenc 128(%ebp), %xmm5, %xmm5
  7460. vaesenc 144(%ebp), %xmm5, %xmm5
  7461. cmpl $11, 40(%esp)
  7462. vmovdqa 160(%ebp), %xmm1
  7463. jl L_AES_GCM_init_avx1_calc_iv_1_aesenc_avx_last
  7464. vaesenc %xmm1, %xmm5, %xmm5
  7465. vaesenc 176(%ebp), %xmm5, %xmm5
  7466. cmpl $13, 40(%esp)
  7467. vmovdqa 192(%ebp), %xmm1
  7468. jl L_AES_GCM_init_avx1_calc_iv_1_aesenc_avx_last
  7469. vaesenc %xmm1, %xmm5, %xmm5
  7470. vaesenc 208(%ebp), %xmm5, %xmm5
  7471. vmovdqa 224(%ebp), %xmm1
  7472. L_AES_GCM_init_avx1_calc_iv_1_aesenc_avx_last:
  7473. vaesenclast %xmm1, %xmm5, %xmm5
  7474. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm5, %xmm5
  7475. # Calc counter
  7476. # Initialization vector
  7477. cmpl $0x00, %edx
  7478. movl $0x00, %ecx
  7479. je L_AES_GCM_init_avx1_calc_iv_done
  7480. cmpl $16, %edx
  7481. jl L_AES_GCM_init_avx1_calc_iv_lt16
  7482. andl $0xfffffff0, %edx
  7483. L_AES_GCM_init_avx1_calc_iv_16_loop:
  7484. vmovdqu (%esi,%ecx,1), %xmm0
  7485. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm0, %xmm0
  7486. vpxor %xmm0, %xmm4, %xmm4
  7487. # ghash_gfmul_avx
  7488. vpshufd $0x4e, %xmm4, %xmm1
  7489. vpshufd $0x4e, %xmm5, %xmm2
  7490. vpclmulqdq $0x11, %xmm4, %xmm5, %xmm3
  7491. vpclmulqdq $0x00, %xmm4, %xmm5, %xmm0
  7492. vpxor %xmm4, %xmm1, %xmm1
  7493. vpxor %xmm5, %xmm2, %xmm2
  7494. vpclmulqdq $0x00, %xmm2, %xmm1, %xmm1
  7495. vpxor %xmm0, %xmm1, %xmm1
  7496. vpxor %xmm3, %xmm1, %xmm1
  7497. vmovdqa %xmm0, %xmm7
  7498. vmovdqa %xmm3, %xmm4
  7499. vpslldq $8, %xmm1, %xmm2
  7500. vpsrldq $8, %xmm1, %xmm1
  7501. vpxor %xmm2, %xmm7, %xmm7
  7502. vpxor %xmm1, %xmm4, %xmm4
  7503. vpsrld $31, %xmm7, %xmm0
  7504. vpsrld $31, %xmm4, %xmm1
  7505. vpslld $0x01, %xmm7, %xmm7
  7506. vpslld $0x01, %xmm4, %xmm4
  7507. vpsrldq $12, %xmm0, %xmm2
  7508. vpslldq $4, %xmm0, %xmm0
  7509. vpslldq $4, %xmm1, %xmm1
  7510. vpor %xmm2, %xmm4, %xmm4
  7511. vpor %xmm0, %xmm7, %xmm7
  7512. vpor %xmm1, %xmm4, %xmm4
  7513. vpslld $31, %xmm7, %xmm0
  7514. vpslld $30, %xmm7, %xmm1
  7515. vpslld $25, %xmm7, %xmm2
  7516. vpxor %xmm1, %xmm0, %xmm0
  7517. vpxor %xmm2, %xmm0, %xmm0
  7518. vmovdqa %xmm0, %xmm1
  7519. vpsrldq $4, %xmm1, %xmm1
  7520. vpslldq $12, %xmm0, %xmm0
  7521. vpxor %xmm0, %xmm7, %xmm7
  7522. vpsrld $0x01, %xmm7, %xmm2
  7523. vpsrld $2, %xmm7, %xmm3
  7524. vpsrld $7, %xmm7, %xmm0
  7525. vpxor %xmm3, %xmm2, %xmm2
  7526. vpxor %xmm0, %xmm2, %xmm2
  7527. vpxor %xmm1, %xmm2, %xmm2
  7528. vpxor %xmm7, %xmm2, %xmm2
  7529. vpxor %xmm2, %xmm4, %xmm4
  7530. addl $16, %ecx
  7531. cmpl %edx, %ecx
  7532. jl L_AES_GCM_init_avx1_calc_iv_16_loop
  7533. movl 48(%esp), %edx
  7534. cmpl %edx, %ecx
  7535. je L_AES_GCM_init_avx1_calc_iv_done
  7536. L_AES_GCM_init_avx1_calc_iv_lt16:
  7537. subl $16, %esp
  7538. vpxor %xmm0, %xmm0, %xmm0
  7539. xorl %ebx, %ebx
  7540. vmovdqu %xmm0, (%esp)
  7541. L_AES_GCM_init_avx1_calc_iv_loop:
  7542. movzbl (%esi,%ecx,1), %eax
  7543. movb %al, (%esp,%ebx,1)
  7544. incl %ecx
  7545. incl %ebx
  7546. cmpl %edx, %ecx
  7547. jl L_AES_GCM_init_avx1_calc_iv_loop
  7548. vmovdqu (%esp), %xmm0
  7549. addl $16, %esp
  7550. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm0, %xmm0
  7551. vpxor %xmm0, %xmm4, %xmm4
  7552. # ghash_gfmul_avx
  7553. vpshufd $0x4e, %xmm4, %xmm1
  7554. vpshufd $0x4e, %xmm5, %xmm2
  7555. vpclmulqdq $0x11, %xmm4, %xmm5, %xmm3
  7556. vpclmulqdq $0x00, %xmm4, %xmm5, %xmm0
  7557. vpxor %xmm4, %xmm1, %xmm1
  7558. vpxor %xmm5, %xmm2, %xmm2
  7559. vpclmulqdq $0x00, %xmm2, %xmm1, %xmm1
  7560. vpxor %xmm0, %xmm1, %xmm1
  7561. vpxor %xmm3, %xmm1, %xmm1
  7562. vmovdqa %xmm0, %xmm7
  7563. vmovdqa %xmm3, %xmm4
  7564. vpslldq $8, %xmm1, %xmm2
  7565. vpsrldq $8, %xmm1, %xmm1
  7566. vpxor %xmm2, %xmm7, %xmm7
  7567. vpxor %xmm1, %xmm4, %xmm4
  7568. vpsrld $31, %xmm7, %xmm0
  7569. vpsrld $31, %xmm4, %xmm1
  7570. vpslld $0x01, %xmm7, %xmm7
  7571. vpslld $0x01, %xmm4, %xmm4
  7572. vpsrldq $12, %xmm0, %xmm2
  7573. vpslldq $4, %xmm0, %xmm0
  7574. vpslldq $4, %xmm1, %xmm1
  7575. vpor %xmm2, %xmm4, %xmm4
  7576. vpor %xmm0, %xmm7, %xmm7
  7577. vpor %xmm1, %xmm4, %xmm4
  7578. vpslld $31, %xmm7, %xmm0
  7579. vpslld $30, %xmm7, %xmm1
  7580. vpslld $25, %xmm7, %xmm2
  7581. vpxor %xmm1, %xmm0, %xmm0
  7582. vpxor %xmm2, %xmm0, %xmm0
  7583. vmovdqa %xmm0, %xmm1
  7584. vpsrldq $4, %xmm1, %xmm1
  7585. vpslldq $12, %xmm0, %xmm0
  7586. vpxor %xmm0, %xmm7, %xmm7
  7587. vpsrld $0x01, %xmm7, %xmm2
  7588. vpsrld $2, %xmm7, %xmm3
  7589. vpsrld $7, %xmm7, %xmm0
  7590. vpxor %xmm3, %xmm2, %xmm2
  7591. vpxor %xmm0, %xmm2, %xmm2
  7592. vpxor %xmm1, %xmm2, %xmm2
  7593. vpxor %xmm7, %xmm2, %xmm2
  7594. vpxor %xmm2, %xmm4, %xmm4
  7595. L_AES_GCM_init_avx1_calc_iv_done:
  7596. # T = Encrypt counter
  7597. vpxor %xmm0, %xmm0, %xmm0
  7598. shll $3, %edx
  7599. vpinsrd $0x00, %edx, %xmm0, %xmm0
  7600. vpxor %xmm0, %xmm4, %xmm4
  7601. # ghash_gfmul_avx
  7602. vpshufd $0x4e, %xmm4, %xmm1
  7603. vpshufd $0x4e, %xmm5, %xmm2
  7604. vpclmulqdq $0x11, %xmm4, %xmm5, %xmm3
  7605. vpclmulqdq $0x00, %xmm4, %xmm5, %xmm0
  7606. vpxor %xmm4, %xmm1, %xmm1
  7607. vpxor %xmm5, %xmm2, %xmm2
  7608. vpclmulqdq $0x00, %xmm2, %xmm1, %xmm1
  7609. vpxor %xmm0, %xmm1, %xmm1
  7610. vpxor %xmm3, %xmm1, %xmm1
  7611. vmovdqa %xmm0, %xmm7
  7612. vmovdqa %xmm3, %xmm4
  7613. vpslldq $8, %xmm1, %xmm2
  7614. vpsrldq $8, %xmm1, %xmm1
  7615. vpxor %xmm2, %xmm7, %xmm7
  7616. vpxor %xmm1, %xmm4, %xmm4
  7617. vpsrld $31, %xmm7, %xmm0
  7618. vpsrld $31, %xmm4, %xmm1
  7619. vpslld $0x01, %xmm7, %xmm7
  7620. vpslld $0x01, %xmm4, %xmm4
  7621. vpsrldq $12, %xmm0, %xmm2
  7622. vpslldq $4, %xmm0, %xmm0
  7623. vpslldq $4, %xmm1, %xmm1
  7624. vpor %xmm2, %xmm4, %xmm4
  7625. vpor %xmm0, %xmm7, %xmm7
  7626. vpor %xmm1, %xmm4, %xmm4
  7627. vpslld $31, %xmm7, %xmm0
  7628. vpslld $30, %xmm7, %xmm1
  7629. vpslld $25, %xmm7, %xmm2
  7630. vpxor %xmm1, %xmm0, %xmm0
  7631. vpxor %xmm2, %xmm0, %xmm0
  7632. vmovdqa %xmm0, %xmm1
  7633. vpsrldq $4, %xmm1, %xmm1
  7634. vpslldq $12, %xmm0, %xmm0
  7635. vpxor %xmm0, %xmm7, %xmm7
  7636. vpsrld $0x01, %xmm7, %xmm2
  7637. vpsrld $2, %xmm7, %xmm3
  7638. vpsrld $7, %xmm7, %xmm0
  7639. vpxor %xmm3, %xmm2, %xmm2
  7640. vpxor %xmm0, %xmm2, %xmm2
  7641. vpxor %xmm1, %xmm2, %xmm2
  7642. vpxor %xmm7, %xmm2, %xmm2
  7643. vpxor %xmm2, %xmm4, %xmm4
  7644. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm4, %xmm4
  7645. # Encrypt counter
  7646. vmovdqa (%ebp), %xmm0
  7647. vpxor %xmm4, %xmm0, %xmm0
  7648. vaesenc 16(%ebp), %xmm0, %xmm0
  7649. vaesenc 32(%ebp), %xmm0, %xmm0
  7650. vaesenc 48(%ebp), %xmm0, %xmm0
  7651. vaesenc 64(%ebp), %xmm0, %xmm0
  7652. vaesenc 80(%ebp), %xmm0, %xmm0
  7653. vaesenc 96(%ebp), %xmm0, %xmm0
  7654. vaesenc 112(%ebp), %xmm0, %xmm0
  7655. vaesenc 128(%ebp), %xmm0, %xmm0
  7656. vaesenc 144(%ebp), %xmm0, %xmm0
  7657. cmpl $11, 40(%esp)
  7658. vmovdqa 160(%ebp), %xmm1
  7659. jl L_AES_GCM_init_avx1_calc_iv_2_aesenc_avx_last
  7660. vaesenc %xmm1, %xmm0, %xmm0
  7661. vaesenc 176(%ebp), %xmm0, %xmm0
  7662. cmpl $13, 40(%esp)
  7663. vmovdqa 192(%ebp), %xmm1
  7664. jl L_AES_GCM_init_avx1_calc_iv_2_aesenc_avx_last
  7665. vaesenc %xmm1, %xmm0, %xmm0
  7666. vaesenc 208(%ebp), %xmm0, %xmm0
  7667. vmovdqa 224(%ebp), %xmm1
  7668. L_AES_GCM_init_avx1_calc_iv_2_aesenc_avx_last:
  7669. vaesenclast %xmm1, %xmm0, %xmm0
  7670. vmovdqu %xmm0, (%edi)
  7671. L_AES_GCM_init_avx1_iv_done:
  7672. movl 52(%esp), %ebp
  7673. movl 56(%esp), %edi
  7674. vpshufb L_aes_gcm_avx1_bswap_epi64, %xmm4, %xmm4
  7675. vpaddd L_aes_gcm_avx1_one, %xmm4, %xmm4
  7676. vmovdqa %xmm5, (%ebp)
  7677. vmovdqa %xmm4, (%edi)
  7678. addl $16, %esp
  7679. popl %ebp
  7680. popl %edi
  7681. popl %esi
  7682. popl %ebx
  7683. ret
  7684. .size AES_GCM_init_avx1,.-AES_GCM_init_avx1
  7685. .text
  7686. .globl AES_GCM_aad_update_avx1
  7687. .type AES_GCM_aad_update_avx1,@function
  7688. .align 16
  7689. AES_GCM_aad_update_avx1:
  7690. pushl %esi
  7691. pushl %edi
  7692. movl 12(%esp), %esi
  7693. movl 16(%esp), %edx
  7694. movl 20(%esp), %edi
  7695. movl 24(%esp), %eax
  7696. vmovdqa (%edi), %xmm5
  7697. vmovdqa (%eax), %xmm6
  7698. xorl %ecx, %ecx
  7699. L_AES_GCM_aad_update_avx1_16_loop:
  7700. vmovdqu (%esi,%ecx,1), %xmm0
  7701. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm0, %xmm0
  7702. vpxor %xmm0, %xmm5, %xmm5
  7703. # ghash_gfmul_avx
  7704. vpshufd $0x4e, %xmm5, %xmm1
  7705. vpshufd $0x4e, %xmm6, %xmm2
  7706. vpclmulqdq $0x11, %xmm5, %xmm6, %xmm3
  7707. vpclmulqdq $0x00, %xmm5, %xmm6, %xmm0
  7708. vpxor %xmm5, %xmm1, %xmm1
  7709. vpxor %xmm6, %xmm2, %xmm2
  7710. vpclmulqdq $0x00, %xmm2, %xmm1, %xmm1
  7711. vpxor %xmm0, %xmm1, %xmm1
  7712. vpxor %xmm3, %xmm1, %xmm1
  7713. vmovdqa %xmm0, %xmm4
  7714. vmovdqa %xmm3, %xmm5
  7715. vpslldq $8, %xmm1, %xmm2
  7716. vpsrldq $8, %xmm1, %xmm1
  7717. vpxor %xmm2, %xmm4, %xmm4
  7718. vpxor %xmm1, %xmm5, %xmm5
  7719. vpsrld $31, %xmm4, %xmm0
  7720. vpsrld $31, %xmm5, %xmm1
  7721. vpslld $0x01, %xmm4, %xmm4
  7722. vpslld $0x01, %xmm5, %xmm5
  7723. vpsrldq $12, %xmm0, %xmm2
  7724. vpslldq $4, %xmm0, %xmm0
  7725. vpslldq $4, %xmm1, %xmm1
  7726. vpor %xmm2, %xmm5, %xmm5
  7727. vpor %xmm0, %xmm4, %xmm4
  7728. vpor %xmm1, %xmm5, %xmm5
  7729. vpslld $31, %xmm4, %xmm0
  7730. vpslld $30, %xmm4, %xmm1
  7731. vpslld $25, %xmm4, %xmm2
  7732. vpxor %xmm1, %xmm0, %xmm0
  7733. vpxor %xmm2, %xmm0, %xmm0
  7734. vmovdqa %xmm0, %xmm1
  7735. vpsrldq $4, %xmm1, %xmm1
  7736. vpslldq $12, %xmm0, %xmm0
  7737. vpxor %xmm0, %xmm4, %xmm4
  7738. vpsrld $0x01, %xmm4, %xmm2
  7739. vpsrld $2, %xmm4, %xmm3
  7740. vpsrld $7, %xmm4, %xmm0
  7741. vpxor %xmm3, %xmm2, %xmm2
  7742. vpxor %xmm0, %xmm2, %xmm2
  7743. vpxor %xmm1, %xmm2, %xmm2
  7744. vpxor %xmm4, %xmm2, %xmm2
  7745. vpxor %xmm2, %xmm5, %xmm5
  7746. addl $16, %ecx
  7747. cmpl %edx, %ecx
  7748. jl L_AES_GCM_aad_update_avx1_16_loop
  7749. vmovdqa %xmm5, (%edi)
  7750. popl %edi
  7751. popl %esi
  7752. ret
  7753. .size AES_GCM_aad_update_avx1,.-AES_GCM_aad_update_avx1
  7754. .text
  7755. .globl AES_GCM_encrypt_block_avx1
  7756. .type AES_GCM_encrypt_block_avx1,@function
  7757. .align 16
  7758. AES_GCM_encrypt_block_avx1:
  7759. pushl %esi
  7760. pushl %edi
  7761. movl 12(%esp), %ecx
  7762. movl 16(%esp), %eax
  7763. movl 20(%esp), %edi
  7764. movl 24(%esp), %esi
  7765. movl 28(%esp), %edx
  7766. vmovdqu (%edx), %xmm1
  7767. vpshufb L_aes_gcm_avx1_bswap_epi64, %xmm1, %xmm0
  7768. vpaddd L_aes_gcm_avx1_one, %xmm1, %xmm1
  7769. vmovdqu %xmm1, (%edx)
  7770. vpxor (%ecx), %xmm0, %xmm0
  7771. vaesenc 16(%ecx), %xmm0, %xmm0
  7772. vaesenc 32(%ecx), %xmm0, %xmm0
  7773. vaesenc 48(%ecx), %xmm0, %xmm0
  7774. vaesenc 64(%ecx), %xmm0, %xmm0
  7775. vaesenc 80(%ecx), %xmm0, %xmm0
  7776. vaesenc 96(%ecx), %xmm0, %xmm0
  7777. vaesenc 112(%ecx), %xmm0, %xmm0
  7778. vaesenc 128(%ecx), %xmm0, %xmm0
  7779. vaesenc 144(%ecx), %xmm0, %xmm0
  7780. cmpl $11, %eax
  7781. vmovdqa 160(%ecx), %xmm1
  7782. jl L_AES_GCM_encrypt_block_avx1_aesenc_block_aesenc_avx_last
  7783. vaesenc %xmm1, %xmm0, %xmm0
  7784. vaesenc 176(%ecx), %xmm0, %xmm0
  7785. cmpl $13, %eax
  7786. vmovdqa 192(%ecx), %xmm1
  7787. jl L_AES_GCM_encrypt_block_avx1_aesenc_block_aesenc_avx_last
  7788. vaesenc %xmm1, %xmm0, %xmm0
  7789. vaesenc 208(%ecx), %xmm0, %xmm0
  7790. vmovdqa 224(%ecx), %xmm1
  7791. L_AES_GCM_encrypt_block_avx1_aesenc_block_aesenc_avx_last:
  7792. vaesenclast %xmm1, %xmm0, %xmm0
  7793. vmovdqu (%esi), %xmm1
  7794. vpxor %xmm1, %xmm0, %xmm0
  7795. vmovdqu %xmm0, (%edi)
  7796. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm0, %xmm0
  7797. popl %edi
  7798. popl %esi
  7799. ret
  7800. .size AES_GCM_encrypt_block_avx1,.-AES_GCM_encrypt_block_avx1
  7801. .text
  7802. .globl AES_GCM_ghash_block_avx1
  7803. .type AES_GCM_ghash_block_avx1,@function
  7804. .align 16
  7805. AES_GCM_ghash_block_avx1:
  7806. movl 4(%esp), %edx
  7807. movl 8(%esp), %eax
  7808. movl 12(%esp), %ecx
  7809. vmovdqa (%eax), %xmm4
  7810. vmovdqa (%ecx), %xmm5
  7811. vmovdqu (%edx), %xmm0
  7812. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm0, %xmm0
  7813. vpxor %xmm0, %xmm4, %xmm4
  7814. # ghash_gfmul_avx
  7815. vpshufd $0x4e, %xmm4, %xmm1
  7816. vpshufd $0x4e, %xmm5, %xmm2
  7817. vpclmulqdq $0x11, %xmm4, %xmm5, %xmm3
  7818. vpclmulqdq $0x00, %xmm4, %xmm5, %xmm0
  7819. vpxor %xmm4, %xmm1, %xmm1
  7820. vpxor %xmm5, %xmm2, %xmm2
  7821. vpclmulqdq $0x00, %xmm2, %xmm1, %xmm1
  7822. vpxor %xmm0, %xmm1, %xmm1
  7823. vpxor %xmm3, %xmm1, %xmm1
  7824. vmovdqa %xmm0, %xmm6
  7825. vmovdqa %xmm3, %xmm4
  7826. vpslldq $8, %xmm1, %xmm2
  7827. vpsrldq $8, %xmm1, %xmm1
  7828. vpxor %xmm2, %xmm6, %xmm6
  7829. vpxor %xmm1, %xmm4, %xmm4
  7830. vpsrld $31, %xmm6, %xmm0
  7831. vpsrld $31, %xmm4, %xmm1
  7832. vpslld $0x01, %xmm6, %xmm6
  7833. vpslld $0x01, %xmm4, %xmm4
  7834. vpsrldq $12, %xmm0, %xmm2
  7835. vpslldq $4, %xmm0, %xmm0
  7836. vpslldq $4, %xmm1, %xmm1
  7837. vpor %xmm2, %xmm4, %xmm4
  7838. vpor %xmm0, %xmm6, %xmm6
  7839. vpor %xmm1, %xmm4, %xmm4
  7840. vpslld $31, %xmm6, %xmm0
  7841. vpslld $30, %xmm6, %xmm1
  7842. vpslld $25, %xmm6, %xmm2
  7843. vpxor %xmm1, %xmm0, %xmm0
  7844. vpxor %xmm2, %xmm0, %xmm0
  7845. vmovdqa %xmm0, %xmm1
  7846. vpsrldq $4, %xmm1, %xmm1
  7847. vpslldq $12, %xmm0, %xmm0
  7848. vpxor %xmm0, %xmm6, %xmm6
  7849. vpsrld $0x01, %xmm6, %xmm2
  7850. vpsrld $2, %xmm6, %xmm3
  7851. vpsrld $7, %xmm6, %xmm0
  7852. vpxor %xmm3, %xmm2, %xmm2
  7853. vpxor %xmm0, %xmm2, %xmm2
  7854. vpxor %xmm1, %xmm2, %xmm2
  7855. vpxor %xmm6, %xmm2, %xmm2
  7856. vpxor %xmm2, %xmm4, %xmm4
  7857. vmovdqa %xmm4, (%eax)
  7858. ret
  7859. .size AES_GCM_ghash_block_avx1,.-AES_GCM_ghash_block_avx1
  7860. .text
  7861. .globl AES_GCM_encrypt_update_avx1
  7862. .type AES_GCM_encrypt_update_avx1,@function
  7863. .align 16
  7864. AES_GCM_encrypt_update_avx1:
  7865. pushl %ebx
  7866. pushl %esi
  7867. pushl %edi
  7868. pushl %ebp
  7869. subl $0x60, %esp
  7870. movl 144(%esp), %esi
  7871. vmovdqa (%esi), %xmm4
  7872. vmovdqu %xmm4, 64(%esp)
  7873. movl 136(%esp), %esi
  7874. movl 140(%esp), %ebp
  7875. vmovdqa (%esi), %xmm6
  7876. vmovdqa (%ebp), %xmm5
  7877. vmovdqu %xmm6, 80(%esp)
  7878. movl 116(%esp), %ebp
  7879. movl 124(%esp), %edi
  7880. movl 128(%esp), %esi
  7881. vpsrlq $63, %xmm5, %xmm1
  7882. vpsllq $0x01, %xmm5, %xmm0
  7883. vpslldq $8, %xmm1, %xmm1
  7884. vpor %xmm1, %xmm0, %xmm0
  7885. vpshufd $0xff, %xmm5, %xmm5
  7886. vpsrad $31, %xmm5, %xmm5
  7887. vpand L_aes_gcm_avx1_mod2_128, %xmm5, %xmm5
  7888. vpxor %xmm0, %xmm5, %xmm5
  7889. xorl %ebx, %ebx
  7890. cmpl $0x40, 132(%esp)
  7891. movl 132(%esp), %eax
  7892. jl L_AES_GCM_encrypt_update_avx1_done_64
  7893. andl $0xffffffc0, %eax
  7894. vmovdqa %xmm6, %xmm2
  7895. # H ^ 1
  7896. vmovdqu %xmm5, (%esp)
  7897. # H ^ 2
  7898. vpclmulqdq $0x00, %xmm5, %xmm5, %xmm0
  7899. vpclmulqdq $0x11, %xmm5, %xmm5, %xmm4
  7900. vpslld $31, %xmm0, %xmm1
  7901. vpslld $30, %xmm0, %xmm2
  7902. vpslld $25, %xmm0, %xmm3
  7903. vpxor %xmm2, %xmm1, %xmm1
  7904. vpxor %xmm3, %xmm1, %xmm1
  7905. vpsrldq $4, %xmm1, %xmm3
  7906. vpslldq $12, %xmm1, %xmm1
  7907. vpxor %xmm1, %xmm0, %xmm0
  7908. vpsrld $0x01, %xmm0, %xmm1
  7909. vpsrld $2, %xmm0, %xmm2
  7910. vpxor %xmm2, %xmm1, %xmm1
  7911. vpxor %xmm0, %xmm1, %xmm1
  7912. vpsrld $7, %xmm0, %xmm0
  7913. vpxor %xmm3, %xmm1, %xmm1
  7914. vpxor %xmm0, %xmm1, %xmm1
  7915. vpxor %xmm1, %xmm4, %xmm4
  7916. vmovdqu %xmm4, 16(%esp)
  7917. # H ^ 3
  7918. # ghash_gfmul_red_avx
  7919. vpshufd $0x4e, %xmm5, %xmm1
  7920. vpshufd $0x4e, %xmm4, %xmm2
  7921. vpclmulqdq $0x11, %xmm5, %xmm4, %xmm3
  7922. vpclmulqdq $0x00, %xmm5, %xmm4, %xmm0
  7923. vpxor %xmm5, %xmm1, %xmm1
  7924. vpxor %xmm4, %xmm2, %xmm2
  7925. vpclmulqdq $0x00, %xmm2, %xmm1, %xmm1
  7926. vpxor %xmm0, %xmm1, %xmm1
  7927. vpxor %xmm3, %xmm1, %xmm1
  7928. vpslldq $8, %xmm1, %xmm2
  7929. vpsrldq $8, %xmm1, %xmm1
  7930. vpxor %xmm2, %xmm0, %xmm0
  7931. vpxor %xmm1, %xmm3, %xmm7
  7932. vpslld $31, %xmm0, %xmm1
  7933. vpslld $30, %xmm0, %xmm2
  7934. vpslld $25, %xmm0, %xmm3
  7935. vpxor %xmm2, %xmm1, %xmm1
  7936. vpxor %xmm3, %xmm1, %xmm1
  7937. vpsrldq $4, %xmm1, %xmm3
  7938. vpslldq $12, %xmm1, %xmm1
  7939. vpxor %xmm1, %xmm0, %xmm0
  7940. vpsrld $0x01, %xmm0, %xmm1
  7941. vpsrld $2, %xmm0, %xmm2
  7942. vpxor %xmm2, %xmm1, %xmm1
  7943. vpxor %xmm0, %xmm1, %xmm1
  7944. vpsrld $7, %xmm0, %xmm0
  7945. vpxor %xmm3, %xmm1, %xmm1
  7946. vpxor %xmm0, %xmm1, %xmm1
  7947. vpxor %xmm1, %xmm7, %xmm7
  7948. vmovdqu %xmm7, 32(%esp)
  7949. # H ^ 4
  7950. vpclmulqdq $0x00, %xmm4, %xmm4, %xmm0
  7951. vpclmulqdq $0x11, %xmm4, %xmm4, %xmm7
  7952. vpslld $31, %xmm0, %xmm1
  7953. vpslld $30, %xmm0, %xmm2
  7954. vpslld $25, %xmm0, %xmm3
  7955. vpxor %xmm2, %xmm1, %xmm1
  7956. vpxor %xmm3, %xmm1, %xmm1
  7957. vpsrldq $4, %xmm1, %xmm3
  7958. vpslldq $12, %xmm1, %xmm1
  7959. vpxor %xmm1, %xmm0, %xmm0
  7960. vpsrld $0x01, %xmm0, %xmm1
  7961. vpsrld $2, %xmm0, %xmm2
  7962. vpxor %xmm2, %xmm1, %xmm1
  7963. vpxor %xmm0, %xmm1, %xmm1
  7964. vpsrld $7, %xmm0, %xmm0
  7965. vpxor %xmm3, %xmm1, %xmm1
  7966. vpxor %xmm0, %xmm1, %xmm1
  7967. vpxor %xmm1, %xmm7, %xmm7
  7968. vmovdqu %xmm7, 48(%esp)
  7969. # First 64 bytes of input
  7970. vmovdqu 64(%esp), %xmm0
  7971. vmovdqa L_aes_gcm_avx1_bswap_epi64, %xmm7
  7972. vpaddd L_aes_gcm_avx1_one, %xmm0, %xmm1
  7973. vpshufb %xmm7, %xmm1, %xmm1
  7974. vpaddd L_aes_gcm_avx1_two, %xmm0, %xmm2
  7975. vpshufb %xmm7, %xmm2, %xmm2
  7976. vpaddd L_aes_gcm_avx1_three, %xmm0, %xmm3
  7977. vpshufb %xmm7, %xmm3, %xmm3
  7978. vpshufb %xmm7, %xmm0, %xmm0
  7979. vmovdqu 64(%esp), %xmm7
  7980. vpaddd L_aes_gcm_avx1_four, %xmm7, %xmm7
  7981. vmovdqu %xmm7, 64(%esp)
  7982. vmovdqa (%ebp), %xmm7
  7983. vpxor %xmm7, %xmm0, %xmm0
  7984. vpxor %xmm7, %xmm1, %xmm1
  7985. vpxor %xmm7, %xmm2, %xmm2
  7986. vpxor %xmm7, %xmm3, %xmm3
  7987. vmovdqa 16(%ebp), %xmm7
  7988. vaesenc %xmm7, %xmm0, %xmm0
  7989. vaesenc %xmm7, %xmm1, %xmm1
  7990. vaesenc %xmm7, %xmm2, %xmm2
  7991. vaesenc %xmm7, %xmm3, %xmm3
  7992. vmovdqa 32(%ebp), %xmm7
  7993. vaesenc %xmm7, %xmm0, %xmm0
  7994. vaesenc %xmm7, %xmm1, %xmm1
  7995. vaesenc %xmm7, %xmm2, %xmm2
  7996. vaesenc %xmm7, %xmm3, %xmm3
  7997. vmovdqa 48(%ebp), %xmm7
  7998. vaesenc %xmm7, %xmm0, %xmm0
  7999. vaesenc %xmm7, %xmm1, %xmm1
  8000. vaesenc %xmm7, %xmm2, %xmm2
  8001. vaesenc %xmm7, %xmm3, %xmm3
  8002. vmovdqa 64(%ebp), %xmm7
  8003. vaesenc %xmm7, %xmm0, %xmm0
  8004. vaesenc %xmm7, %xmm1, %xmm1
  8005. vaesenc %xmm7, %xmm2, %xmm2
  8006. vaesenc %xmm7, %xmm3, %xmm3
  8007. vmovdqa 80(%ebp), %xmm7
  8008. vaesenc %xmm7, %xmm0, %xmm0
  8009. vaesenc %xmm7, %xmm1, %xmm1
  8010. vaesenc %xmm7, %xmm2, %xmm2
  8011. vaesenc %xmm7, %xmm3, %xmm3
  8012. vmovdqa 96(%ebp), %xmm7
  8013. vaesenc %xmm7, %xmm0, %xmm0
  8014. vaesenc %xmm7, %xmm1, %xmm1
  8015. vaesenc %xmm7, %xmm2, %xmm2
  8016. vaesenc %xmm7, %xmm3, %xmm3
  8017. vmovdqa 112(%ebp), %xmm7
  8018. vaesenc %xmm7, %xmm0, %xmm0
  8019. vaesenc %xmm7, %xmm1, %xmm1
  8020. vaesenc %xmm7, %xmm2, %xmm2
  8021. vaesenc %xmm7, %xmm3, %xmm3
  8022. vmovdqa 128(%ebp), %xmm7
  8023. vaesenc %xmm7, %xmm0, %xmm0
  8024. vaesenc %xmm7, %xmm1, %xmm1
  8025. vaesenc %xmm7, %xmm2, %xmm2
  8026. vaesenc %xmm7, %xmm3, %xmm3
  8027. vmovdqa 144(%ebp), %xmm7
  8028. vaesenc %xmm7, %xmm0, %xmm0
  8029. vaesenc %xmm7, %xmm1, %xmm1
  8030. vaesenc %xmm7, %xmm2, %xmm2
  8031. vaesenc %xmm7, %xmm3, %xmm3
  8032. cmpl $11, 120(%esp)
  8033. vmovdqa 160(%ebp), %xmm7
  8034. jl L_AES_GCM_encrypt_update_avx1_aesenc_64_enc_done
  8035. vaesenc %xmm7, %xmm0, %xmm0
  8036. vaesenc %xmm7, %xmm1, %xmm1
  8037. vaesenc %xmm7, %xmm2, %xmm2
  8038. vaesenc %xmm7, %xmm3, %xmm3
  8039. vmovdqa 176(%ebp), %xmm7
  8040. vaesenc %xmm7, %xmm0, %xmm0
  8041. vaesenc %xmm7, %xmm1, %xmm1
  8042. vaesenc %xmm7, %xmm2, %xmm2
  8043. vaesenc %xmm7, %xmm3, %xmm3
  8044. cmpl $13, 120(%esp)
  8045. vmovdqa 192(%ebp), %xmm7
  8046. jl L_AES_GCM_encrypt_update_avx1_aesenc_64_enc_done
  8047. vaesenc %xmm7, %xmm0, %xmm0
  8048. vaesenc %xmm7, %xmm1, %xmm1
  8049. vaesenc %xmm7, %xmm2, %xmm2
  8050. vaesenc %xmm7, %xmm3, %xmm3
  8051. vmovdqa 208(%ebp), %xmm7
  8052. vaesenc %xmm7, %xmm0, %xmm0
  8053. vaesenc %xmm7, %xmm1, %xmm1
  8054. vaesenc %xmm7, %xmm2, %xmm2
  8055. vaesenc %xmm7, %xmm3, %xmm3
  8056. vmovdqa 224(%ebp), %xmm7
  8057. L_AES_GCM_encrypt_update_avx1_aesenc_64_enc_done:
  8058. vaesenclast %xmm7, %xmm0, %xmm0
  8059. vaesenclast %xmm7, %xmm1, %xmm1
  8060. vmovdqu (%esi), %xmm4
  8061. vmovdqu 16(%esi), %xmm5
  8062. vpxor %xmm4, %xmm0, %xmm0
  8063. vpxor %xmm5, %xmm1, %xmm1
  8064. vmovdqu %xmm4, (%esi)
  8065. vmovdqu %xmm5, 16(%esi)
  8066. vmovdqu %xmm0, (%edi)
  8067. vmovdqu %xmm1, 16(%edi)
  8068. vaesenclast %xmm7, %xmm2, %xmm2
  8069. vaesenclast %xmm7, %xmm3, %xmm3
  8070. vmovdqu 32(%esi), %xmm4
  8071. vmovdqu 48(%esi), %xmm5
  8072. vpxor %xmm4, %xmm2, %xmm2
  8073. vpxor %xmm5, %xmm3, %xmm3
  8074. vmovdqu %xmm4, 32(%esi)
  8075. vmovdqu %xmm5, 48(%esi)
  8076. vmovdqu %xmm2, 32(%edi)
  8077. vmovdqu %xmm3, 48(%edi)
  8078. cmpl $0x40, %eax
  8079. movl $0x40, %ebx
  8080. movl %esi, %ecx
  8081. movl %edi, %edx
  8082. jle L_AES_GCM_encrypt_update_avx1_end_64
  8083. # More 64 bytes of input
  8084. L_AES_GCM_encrypt_update_avx1_ghash_64:
  8085. leal (%esi,%ebx,1), %ecx
  8086. leal (%edi,%ebx,1), %edx
  8087. vmovdqu 64(%esp), %xmm0
  8088. vmovdqa L_aes_gcm_avx1_bswap_epi64, %xmm7
  8089. vpaddd L_aes_gcm_avx1_one, %xmm0, %xmm1
  8090. vpshufb %xmm7, %xmm1, %xmm1
  8091. vpaddd L_aes_gcm_avx1_two, %xmm0, %xmm2
  8092. vpshufb %xmm7, %xmm2, %xmm2
  8093. vpaddd L_aes_gcm_avx1_three, %xmm0, %xmm3
  8094. vpshufb %xmm7, %xmm3, %xmm3
  8095. vpshufb %xmm7, %xmm0, %xmm0
  8096. vmovdqu 64(%esp), %xmm7
  8097. vpaddd L_aes_gcm_avx1_four, %xmm7, %xmm7
  8098. vmovdqu %xmm7, 64(%esp)
  8099. vmovdqa (%ebp), %xmm7
  8100. vpxor %xmm7, %xmm0, %xmm0
  8101. vpxor %xmm7, %xmm1, %xmm1
  8102. vpxor %xmm7, %xmm2, %xmm2
  8103. vpxor %xmm7, %xmm3, %xmm3
  8104. vmovdqa 16(%ebp), %xmm7
  8105. vaesenc %xmm7, %xmm0, %xmm0
  8106. vaesenc %xmm7, %xmm1, %xmm1
  8107. vaesenc %xmm7, %xmm2, %xmm2
  8108. vaesenc %xmm7, %xmm3, %xmm3
  8109. vmovdqa 32(%ebp), %xmm7
  8110. vaesenc %xmm7, %xmm0, %xmm0
  8111. vaesenc %xmm7, %xmm1, %xmm1
  8112. vaesenc %xmm7, %xmm2, %xmm2
  8113. vaesenc %xmm7, %xmm3, %xmm3
  8114. vmovdqa 48(%ebp), %xmm7
  8115. vaesenc %xmm7, %xmm0, %xmm0
  8116. vaesenc %xmm7, %xmm1, %xmm1
  8117. vaesenc %xmm7, %xmm2, %xmm2
  8118. vaesenc %xmm7, %xmm3, %xmm3
  8119. vmovdqa 64(%ebp), %xmm7
  8120. vaesenc %xmm7, %xmm0, %xmm0
  8121. vaesenc %xmm7, %xmm1, %xmm1
  8122. vaesenc %xmm7, %xmm2, %xmm2
  8123. vaesenc %xmm7, %xmm3, %xmm3
  8124. vmovdqa 80(%ebp), %xmm7
  8125. vaesenc %xmm7, %xmm0, %xmm0
  8126. vaesenc %xmm7, %xmm1, %xmm1
  8127. vaesenc %xmm7, %xmm2, %xmm2
  8128. vaesenc %xmm7, %xmm3, %xmm3
  8129. vmovdqa 96(%ebp), %xmm7
  8130. vaesenc %xmm7, %xmm0, %xmm0
  8131. vaesenc %xmm7, %xmm1, %xmm1
  8132. vaesenc %xmm7, %xmm2, %xmm2
  8133. vaesenc %xmm7, %xmm3, %xmm3
  8134. vmovdqa 112(%ebp), %xmm7
  8135. vaesenc %xmm7, %xmm0, %xmm0
  8136. vaesenc %xmm7, %xmm1, %xmm1
  8137. vaesenc %xmm7, %xmm2, %xmm2
  8138. vaesenc %xmm7, %xmm3, %xmm3
  8139. vmovdqa 128(%ebp), %xmm7
  8140. vaesenc %xmm7, %xmm0, %xmm0
  8141. vaesenc %xmm7, %xmm1, %xmm1
  8142. vaesenc %xmm7, %xmm2, %xmm2
  8143. vaesenc %xmm7, %xmm3, %xmm3
  8144. vmovdqa 144(%ebp), %xmm7
  8145. vaesenc %xmm7, %xmm0, %xmm0
  8146. vaesenc %xmm7, %xmm1, %xmm1
  8147. vaesenc %xmm7, %xmm2, %xmm2
  8148. vaesenc %xmm7, %xmm3, %xmm3
  8149. cmpl $11, 120(%esp)
  8150. vmovdqa 160(%ebp), %xmm7
  8151. jl L_AES_GCM_encrypt_update_avx1_aesenc_64_ghash_avx_aesenc_64_enc_done
  8152. vaesenc %xmm7, %xmm0, %xmm0
  8153. vaesenc %xmm7, %xmm1, %xmm1
  8154. vaesenc %xmm7, %xmm2, %xmm2
  8155. vaesenc %xmm7, %xmm3, %xmm3
  8156. vmovdqa 176(%ebp), %xmm7
  8157. vaesenc %xmm7, %xmm0, %xmm0
  8158. vaesenc %xmm7, %xmm1, %xmm1
  8159. vaesenc %xmm7, %xmm2, %xmm2
  8160. vaesenc %xmm7, %xmm3, %xmm3
  8161. cmpl $13, 120(%esp)
  8162. vmovdqa 192(%ebp), %xmm7
  8163. jl L_AES_GCM_encrypt_update_avx1_aesenc_64_ghash_avx_aesenc_64_enc_done
  8164. vaesenc %xmm7, %xmm0, %xmm0
  8165. vaesenc %xmm7, %xmm1, %xmm1
  8166. vaesenc %xmm7, %xmm2, %xmm2
  8167. vaesenc %xmm7, %xmm3, %xmm3
  8168. vmovdqa 208(%ebp), %xmm7
  8169. vaesenc %xmm7, %xmm0, %xmm0
  8170. vaesenc %xmm7, %xmm1, %xmm1
  8171. vaesenc %xmm7, %xmm2, %xmm2
  8172. vaesenc %xmm7, %xmm3, %xmm3
  8173. vmovdqa 224(%ebp), %xmm7
  8174. L_AES_GCM_encrypt_update_avx1_aesenc_64_ghash_avx_aesenc_64_enc_done:
  8175. vaesenclast %xmm7, %xmm0, %xmm0
  8176. vaesenclast %xmm7, %xmm1, %xmm1
  8177. vmovdqu (%ecx), %xmm4
  8178. vmovdqu 16(%ecx), %xmm5
  8179. vpxor %xmm4, %xmm0, %xmm0
  8180. vpxor %xmm5, %xmm1, %xmm1
  8181. vmovdqu %xmm0, (%edx)
  8182. vmovdqu %xmm1, 16(%edx)
  8183. vaesenclast %xmm7, %xmm2, %xmm2
  8184. vaesenclast %xmm7, %xmm3, %xmm3
  8185. vmovdqu 32(%ecx), %xmm4
  8186. vmovdqu 48(%ecx), %xmm5
  8187. vpxor %xmm4, %xmm2, %xmm2
  8188. vpxor %xmm5, %xmm3, %xmm3
  8189. vmovdqu %xmm2, 32(%edx)
  8190. vmovdqu %xmm3, 48(%edx)
  8191. # ghash encrypted counter
  8192. vmovdqu 80(%esp), %xmm2
  8193. vmovdqu 48(%esp), %xmm7
  8194. vmovdqu -64(%edx), %xmm0
  8195. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm0, %xmm0
  8196. vpxor %xmm2, %xmm0, %xmm0
  8197. vpshufd $0x4e, %xmm7, %xmm1
  8198. vpshufd $0x4e, %xmm0, %xmm5
  8199. vpxor %xmm7, %xmm1, %xmm1
  8200. vpxor %xmm0, %xmm5, %xmm5
  8201. vpclmulqdq $0x11, %xmm7, %xmm0, %xmm3
  8202. vpclmulqdq $0x00, %xmm7, %xmm0, %xmm2
  8203. vpclmulqdq $0x00, %xmm5, %xmm1, %xmm1
  8204. vpxor %xmm2, %xmm1, %xmm1
  8205. vpxor %xmm3, %xmm1, %xmm1
  8206. vmovdqu 32(%esp), %xmm7
  8207. vmovdqu -48(%edx), %xmm0
  8208. vpshufd $0x4e, %xmm7, %xmm4
  8209. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm0, %xmm0
  8210. vpxor %xmm7, %xmm4, %xmm4
  8211. vpshufd $0x4e, %xmm0, %xmm5
  8212. vpxor %xmm0, %xmm5, %xmm5
  8213. vpclmulqdq $0x11, %xmm7, %xmm0, %xmm6
  8214. vpclmulqdq $0x00, %xmm7, %xmm0, %xmm7
  8215. vpclmulqdq $0x00, %xmm5, %xmm4, %xmm4
  8216. vpxor %xmm7, %xmm1, %xmm1
  8217. vpxor %xmm7, %xmm2, %xmm2
  8218. vpxor %xmm6, %xmm1, %xmm1
  8219. vpxor %xmm6, %xmm3, %xmm3
  8220. vpxor %xmm4, %xmm1, %xmm1
  8221. vmovdqu 16(%esp), %xmm7
  8222. vmovdqu -32(%edx), %xmm0
  8223. vpshufd $0x4e, %xmm7, %xmm4
  8224. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm0, %xmm0
  8225. vpxor %xmm7, %xmm4, %xmm4
  8226. vpshufd $0x4e, %xmm0, %xmm5
  8227. vpxor %xmm0, %xmm5, %xmm5
  8228. vpclmulqdq $0x11, %xmm7, %xmm0, %xmm6
  8229. vpclmulqdq $0x00, %xmm7, %xmm0, %xmm7
  8230. vpclmulqdq $0x00, %xmm5, %xmm4, %xmm4
  8231. vpxor %xmm7, %xmm1, %xmm1
  8232. vpxor %xmm7, %xmm2, %xmm2
  8233. vpxor %xmm6, %xmm1, %xmm1
  8234. vpxor %xmm6, %xmm3, %xmm3
  8235. vpxor %xmm4, %xmm1, %xmm1
  8236. vmovdqu (%esp), %xmm7
  8237. vmovdqu -16(%edx), %xmm0
  8238. vpshufd $0x4e, %xmm7, %xmm4
  8239. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm0, %xmm0
  8240. vpxor %xmm7, %xmm4, %xmm4
  8241. vpshufd $0x4e, %xmm0, %xmm5
  8242. vpxor %xmm0, %xmm5, %xmm5
  8243. vpclmulqdq $0x11, %xmm7, %xmm0, %xmm6
  8244. vpclmulqdq $0x00, %xmm7, %xmm0, %xmm7
  8245. vpclmulqdq $0x00, %xmm5, %xmm4, %xmm4
  8246. vpxor %xmm7, %xmm1, %xmm1
  8247. vpxor %xmm7, %xmm2, %xmm2
  8248. vpxor %xmm6, %xmm1, %xmm1
  8249. vpxor %xmm6, %xmm3, %xmm3
  8250. vpxor %xmm4, %xmm1, %xmm1
  8251. vpslldq $8, %xmm1, %xmm5
  8252. vpsrldq $8, %xmm1, %xmm1
  8253. vpxor %xmm5, %xmm2, %xmm2
  8254. vpxor %xmm1, %xmm3, %xmm3
  8255. vpslld $31, %xmm2, %xmm7
  8256. vpslld $30, %xmm2, %xmm4
  8257. vpslld $25, %xmm2, %xmm5
  8258. vpxor %xmm4, %xmm7, %xmm7
  8259. vpxor %xmm5, %xmm7, %xmm7
  8260. vpsrldq $4, %xmm7, %xmm4
  8261. vpslldq $12, %xmm7, %xmm7
  8262. vpxor %xmm7, %xmm2, %xmm2
  8263. vpsrld $0x01, %xmm2, %xmm5
  8264. vpsrld $2, %xmm2, %xmm1
  8265. vpsrld $7, %xmm2, %xmm0
  8266. vpxor %xmm1, %xmm5, %xmm5
  8267. vpxor %xmm0, %xmm5, %xmm5
  8268. vpxor %xmm4, %xmm5, %xmm5
  8269. vpxor %xmm5, %xmm2, %xmm2
  8270. vpxor %xmm3, %xmm2, %xmm2
  8271. vmovdqu %xmm2, 80(%esp)
  8272. addl $0x40, %ebx
  8273. cmpl %eax, %ebx
  8274. jl L_AES_GCM_encrypt_update_avx1_ghash_64
  8275. L_AES_GCM_encrypt_update_avx1_end_64:
  8276. movdqu 80(%esp), %xmm6
  8277. # Block 1
  8278. vmovdqa L_aes_gcm_avx1_bswap_mask, %xmm0
  8279. vmovdqu (%edx), %xmm5
  8280. pshufb %xmm0, %xmm5
  8281. vmovdqu 48(%esp), %xmm7
  8282. pxor %xmm6, %xmm5
  8283. # ghash_gfmul_avx
  8284. vpshufd $0x4e, %xmm5, %xmm1
  8285. vpshufd $0x4e, %xmm7, %xmm2
  8286. vpclmulqdq $0x11, %xmm5, %xmm7, %xmm3
  8287. vpclmulqdq $0x00, %xmm5, %xmm7, %xmm0
  8288. vpxor %xmm5, %xmm1, %xmm1
  8289. vpxor %xmm7, %xmm2, %xmm2
  8290. vpclmulqdq $0x00, %xmm2, %xmm1, %xmm1
  8291. vpxor %xmm0, %xmm1, %xmm1
  8292. vpxor %xmm3, %xmm1, %xmm1
  8293. vmovdqa %xmm0, %xmm4
  8294. vmovdqa %xmm3, %xmm6
  8295. vpslldq $8, %xmm1, %xmm2
  8296. vpsrldq $8, %xmm1, %xmm1
  8297. vpxor %xmm2, %xmm4, %xmm4
  8298. vpxor %xmm1, %xmm6, %xmm6
  8299. # Block 2
  8300. vmovdqa L_aes_gcm_avx1_bswap_mask, %xmm0
  8301. vmovdqu 16(%edx), %xmm5
  8302. pshufb %xmm0, %xmm5
  8303. vmovdqu 32(%esp), %xmm7
  8304. # ghash_gfmul_xor_avx
  8305. vpshufd $0x4e, %xmm5, %xmm1
  8306. vpshufd $0x4e, %xmm7, %xmm2
  8307. vpclmulqdq $0x11, %xmm5, %xmm7, %xmm3
  8308. vpclmulqdq $0x00, %xmm5, %xmm7, %xmm0
  8309. vpxor %xmm5, %xmm1, %xmm1
  8310. vpxor %xmm7, %xmm2, %xmm2
  8311. vpclmulqdq $0x00, %xmm2, %xmm1, %xmm1
  8312. vpxor %xmm0, %xmm1, %xmm1
  8313. vpxor %xmm3, %xmm1, %xmm1
  8314. vpxor %xmm0, %xmm4, %xmm4
  8315. vpxor %xmm3, %xmm6, %xmm6
  8316. vpslldq $8, %xmm1, %xmm2
  8317. vpsrldq $8, %xmm1, %xmm1
  8318. vpxor %xmm2, %xmm4, %xmm4
  8319. vpxor %xmm1, %xmm6, %xmm6
  8320. # Block 3
  8321. vmovdqa L_aes_gcm_avx1_bswap_mask, %xmm0
  8322. vmovdqu 32(%edx), %xmm5
  8323. pshufb %xmm0, %xmm5
  8324. vmovdqu 16(%esp), %xmm7
  8325. # ghash_gfmul_xor_avx
  8326. vpshufd $0x4e, %xmm5, %xmm1
  8327. vpshufd $0x4e, %xmm7, %xmm2
  8328. vpclmulqdq $0x11, %xmm5, %xmm7, %xmm3
  8329. vpclmulqdq $0x00, %xmm5, %xmm7, %xmm0
  8330. vpxor %xmm5, %xmm1, %xmm1
  8331. vpxor %xmm7, %xmm2, %xmm2
  8332. vpclmulqdq $0x00, %xmm2, %xmm1, %xmm1
  8333. vpxor %xmm0, %xmm1, %xmm1
  8334. vpxor %xmm3, %xmm1, %xmm1
  8335. vpxor %xmm0, %xmm4, %xmm4
  8336. vpxor %xmm3, %xmm6, %xmm6
  8337. vpslldq $8, %xmm1, %xmm2
  8338. vpsrldq $8, %xmm1, %xmm1
  8339. vpxor %xmm2, %xmm4, %xmm4
  8340. vpxor %xmm1, %xmm6, %xmm6
  8341. # Block 4
  8342. vmovdqa L_aes_gcm_avx1_bswap_mask, %xmm0
  8343. vmovdqu 48(%edx), %xmm5
  8344. pshufb %xmm0, %xmm5
  8345. vmovdqu (%esp), %xmm7
  8346. # ghash_gfmul_xor_avx
  8347. vpshufd $0x4e, %xmm5, %xmm1
  8348. vpshufd $0x4e, %xmm7, %xmm2
  8349. vpclmulqdq $0x11, %xmm5, %xmm7, %xmm3
  8350. vpclmulqdq $0x00, %xmm5, %xmm7, %xmm0
  8351. vpxor %xmm5, %xmm1, %xmm1
  8352. vpxor %xmm7, %xmm2, %xmm2
  8353. vpclmulqdq $0x00, %xmm2, %xmm1, %xmm1
  8354. vpxor %xmm0, %xmm1, %xmm1
  8355. vpxor %xmm3, %xmm1, %xmm1
  8356. vpxor %xmm0, %xmm4, %xmm4
  8357. vpxor %xmm3, %xmm6, %xmm6
  8358. vpslldq $8, %xmm1, %xmm2
  8359. vpsrldq $8, %xmm1, %xmm1
  8360. vpxor %xmm2, %xmm4, %xmm4
  8361. vpxor %xmm1, %xmm6, %xmm6
  8362. vpslld $31, %xmm4, %xmm0
  8363. vpslld $30, %xmm4, %xmm1
  8364. vpslld $25, %xmm4, %xmm2
  8365. vpxor %xmm1, %xmm0, %xmm0
  8366. vpxor %xmm2, %xmm0, %xmm0
  8367. vmovdqa %xmm0, %xmm1
  8368. vpsrldq $4, %xmm1, %xmm1
  8369. vpslldq $12, %xmm0, %xmm0
  8370. vpxor %xmm0, %xmm4, %xmm4
  8371. vpsrld $0x01, %xmm4, %xmm2
  8372. vpsrld $2, %xmm4, %xmm3
  8373. vpsrld $7, %xmm4, %xmm0
  8374. vpxor %xmm3, %xmm2, %xmm2
  8375. vpxor %xmm0, %xmm2, %xmm2
  8376. vpxor %xmm1, %xmm2, %xmm2
  8377. vpxor %xmm4, %xmm2, %xmm2
  8378. vpxor %xmm2, %xmm6, %xmm6
  8379. vmovdqu (%esp), %xmm5
  8380. L_AES_GCM_encrypt_update_avx1_done_64:
  8381. movl 132(%esp), %edx
  8382. cmpl %edx, %ebx
  8383. jge L_AES_GCM_encrypt_update_avx1_done_enc
  8384. movl 132(%esp), %eax
  8385. andl $0xfffffff0, %eax
  8386. cmpl %eax, %ebx
  8387. jge L_AES_GCM_encrypt_update_avx1_last_block_done
  8388. leal (%esi,%ebx,1), %ecx
  8389. leal (%edi,%ebx,1), %edx
  8390. vmovdqu 64(%esp), %xmm1
  8391. vpshufb L_aes_gcm_avx1_bswap_epi64, %xmm1, %xmm0
  8392. vpaddd L_aes_gcm_avx1_one, %xmm1, %xmm1
  8393. vmovdqu %xmm1, 64(%esp)
  8394. vpxor (%ebp), %xmm0, %xmm0
  8395. vaesenc 16(%ebp), %xmm0, %xmm0
  8396. vaesenc 32(%ebp), %xmm0, %xmm0
  8397. vaesenc 48(%ebp), %xmm0, %xmm0
  8398. vaesenc 64(%ebp), %xmm0, %xmm0
  8399. vaesenc 80(%ebp), %xmm0, %xmm0
  8400. vaesenc 96(%ebp), %xmm0, %xmm0
  8401. vaesenc 112(%ebp), %xmm0, %xmm0
  8402. vaesenc 128(%ebp), %xmm0, %xmm0
  8403. vaesenc 144(%ebp), %xmm0, %xmm0
  8404. cmpl $11, 120(%esp)
  8405. vmovdqa 160(%ebp), %xmm1
  8406. jl L_AES_GCM_encrypt_update_avx1_aesenc_block_aesenc_avx_last
  8407. vaesenc %xmm1, %xmm0, %xmm0
  8408. vaesenc 176(%ebp), %xmm0, %xmm0
  8409. cmpl $13, 120(%esp)
  8410. vmovdqa 192(%ebp), %xmm1
  8411. jl L_AES_GCM_encrypt_update_avx1_aesenc_block_aesenc_avx_last
  8412. vaesenc %xmm1, %xmm0, %xmm0
  8413. vaesenc 208(%ebp), %xmm0, %xmm0
  8414. vmovdqa 224(%ebp), %xmm1
  8415. L_AES_GCM_encrypt_update_avx1_aesenc_block_aesenc_avx_last:
  8416. vaesenclast %xmm1, %xmm0, %xmm0
  8417. vmovdqu (%ecx), %xmm1
  8418. vpxor %xmm1, %xmm0, %xmm0
  8419. vmovdqu %xmm0, (%edx)
  8420. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm0, %xmm0
  8421. vpxor %xmm0, %xmm6, %xmm6
  8422. addl $16, %ebx
  8423. cmpl %eax, %ebx
  8424. jge L_AES_GCM_encrypt_update_avx1_last_block_ghash
  8425. L_AES_GCM_encrypt_update_avx1_last_block_start:
  8426. leal (%esi,%ebx,1), %ecx
  8427. leal (%edi,%ebx,1), %edx
  8428. vmovdqu 64(%esp), %xmm1
  8429. vmovdqu %xmm6, %xmm3
  8430. vpshufb L_aes_gcm_avx1_bswap_epi64, %xmm1, %xmm0
  8431. vpaddd L_aes_gcm_avx1_one, %xmm1, %xmm1
  8432. vmovdqu %xmm1, 64(%esp)
  8433. vpxor (%ebp), %xmm0, %xmm0
  8434. vpclmulqdq $16, %xmm5, %xmm3, %xmm4
  8435. vaesenc 16(%ebp), %xmm0, %xmm0
  8436. vaesenc 32(%ebp), %xmm0, %xmm0
  8437. vpclmulqdq $0x01, %xmm5, %xmm3, %xmm7
  8438. vaesenc 48(%ebp), %xmm0, %xmm0
  8439. vaesenc 64(%ebp), %xmm0, %xmm0
  8440. vaesenc 80(%ebp), %xmm0, %xmm0
  8441. vpclmulqdq $0x11, %xmm5, %xmm3, %xmm1
  8442. vaesenc 96(%ebp), %xmm0, %xmm0
  8443. vpxor %xmm7, %xmm4, %xmm4
  8444. vpslldq $8, %xmm4, %xmm2
  8445. vpsrldq $8, %xmm4, %xmm4
  8446. vaesenc 112(%ebp), %xmm0, %xmm0
  8447. vpclmulqdq $0x00, %xmm5, %xmm3, %xmm7
  8448. vpxor %xmm7, %xmm2, %xmm2
  8449. vpxor %xmm4, %xmm1, %xmm1
  8450. vmovdqa L_aes_gcm_avx1_mod2_128, %xmm3
  8451. vpclmulqdq $16, %xmm3, %xmm2, %xmm7
  8452. vaesenc 128(%ebp), %xmm0, %xmm0
  8453. vpshufd $0x4e, %xmm2, %xmm4
  8454. vpxor %xmm7, %xmm4, %xmm4
  8455. vpclmulqdq $16, %xmm3, %xmm4, %xmm7
  8456. vaesenc 144(%ebp), %xmm0, %xmm0
  8457. vpshufd $0x4e, %xmm4, %xmm6
  8458. vpxor %xmm7, %xmm6, %xmm6
  8459. vpxor %xmm1, %xmm6, %xmm6
  8460. cmpl $11, 120(%esp)
  8461. vmovdqa 160(%ebp), %xmm1
  8462. jl L_AES_GCM_encrypt_update_avx1_aesenc_gfmul_last
  8463. vaesenc %xmm1, %xmm0, %xmm0
  8464. vaesenc 176(%ebp), %xmm0, %xmm0
  8465. cmpl $13, 120(%esp)
  8466. vmovdqa 192(%ebp), %xmm1
  8467. jl L_AES_GCM_encrypt_update_avx1_aesenc_gfmul_last
  8468. vaesenc %xmm1, %xmm0, %xmm0
  8469. vaesenc 208(%ebp), %xmm0, %xmm0
  8470. vmovdqa 224(%ebp), %xmm1
  8471. L_AES_GCM_encrypt_update_avx1_aesenc_gfmul_last:
  8472. vaesenclast %xmm1, %xmm0, %xmm0
  8473. vmovdqu (%ecx), %xmm1
  8474. vpxor %xmm1, %xmm0, %xmm0
  8475. vmovdqu %xmm0, (%edx)
  8476. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm0, %xmm0
  8477. addl $16, %ebx
  8478. vpxor %xmm0, %xmm6, %xmm6
  8479. cmpl %eax, %ebx
  8480. jl L_AES_GCM_encrypt_update_avx1_last_block_start
  8481. L_AES_GCM_encrypt_update_avx1_last_block_ghash:
  8482. # ghash_gfmul_red_avx
  8483. vpshufd $0x4e, %xmm5, %xmm1
  8484. vpshufd $0x4e, %xmm6, %xmm2
  8485. vpclmulqdq $0x11, %xmm5, %xmm6, %xmm3
  8486. vpclmulqdq $0x00, %xmm5, %xmm6, %xmm0
  8487. vpxor %xmm5, %xmm1, %xmm1
  8488. vpxor %xmm6, %xmm2, %xmm2
  8489. vpclmulqdq $0x00, %xmm2, %xmm1, %xmm1
  8490. vpxor %xmm0, %xmm1, %xmm1
  8491. vpxor %xmm3, %xmm1, %xmm1
  8492. vpslldq $8, %xmm1, %xmm2
  8493. vpsrldq $8, %xmm1, %xmm1
  8494. vpxor %xmm2, %xmm0, %xmm0
  8495. vpxor %xmm1, %xmm3, %xmm6
  8496. vpslld $31, %xmm0, %xmm1
  8497. vpslld $30, %xmm0, %xmm2
  8498. vpslld $25, %xmm0, %xmm3
  8499. vpxor %xmm2, %xmm1, %xmm1
  8500. vpxor %xmm3, %xmm1, %xmm1
  8501. vpsrldq $4, %xmm1, %xmm3
  8502. vpslldq $12, %xmm1, %xmm1
  8503. vpxor %xmm1, %xmm0, %xmm0
  8504. vpsrld $0x01, %xmm0, %xmm1
  8505. vpsrld $2, %xmm0, %xmm2
  8506. vpxor %xmm2, %xmm1, %xmm1
  8507. vpxor %xmm0, %xmm1, %xmm1
  8508. vpsrld $7, %xmm0, %xmm0
  8509. vpxor %xmm3, %xmm1, %xmm1
  8510. vpxor %xmm0, %xmm1, %xmm1
  8511. vpxor %xmm1, %xmm6, %xmm6
  8512. L_AES_GCM_encrypt_update_avx1_last_block_done:
  8513. L_AES_GCM_encrypt_update_avx1_done_enc:
  8514. movl 136(%esp), %esi
  8515. movl 144(%esp), %edi
  8516. vmovdqu 64(%esp), %xmm4
  8517. vmovdqa %xmm6, (%esi)
  8518. vmovdqu %xmm4, (%edi)
  8519. addl $0x60, %esp
  8520. popl %ebp
  8521. popl %edi
  8522. popl %esi
  8523. popl %ebx
  8524. ret
  8525. .size AES_GCM_encrypt_update_avx1,.-AES_GCM_encrypt_update_avx1
  8526. .text
  8527. .globl AES_GCM_encrypt_final_avx1
  8528. .type AES_GCM_encrypt_final_avx1,@function
  8529. .align 16
  8530. AES_GCM_encrypt_final_avx1:
  8531. pushl %esi
  8532. pushl %edi
  8533. pushl %ebp
  8534. subl $16, %esp
  8535. movl 32(%esp), %ebp
  8536. movl 52(%esp), %esi
  8537. movl 56(%esp), %edi
  8538. vmovdqa (%ebp), %xmm4
  8539. vmovdqa (%esi), %xmm5
  8540. vmovdqa (%edi), %xmm6
  8541. vpsrlq $63, %xmm5, %xmm1
  8542. vpsllq $0x01, %xmm5, %xmm0
  8543. vpslldq $8, %xmm1, %xmm1
  8544. vpor %xmm1, %xmm0, %xmm0
  8545. vpshufd $0xff, %xmm5, %xmm5
  8546. vpsrad $31, %xmm5, %xmm5
  8547. vpand L_aes_gcm_avx1_mod2_128, %xmm5, %xmm5
  8548. vpxor %xmm0, %xmm5, %xmm5
  8549. movl 44(%esp), %edx
  8550. movl 48(%esp), %ecx
  8551. shll $3, %edx
  8552. shll $3, %ecx
  8553. vpinsrd $0x00, %edx, %xmm0, %xmm0
  8554. vpinsrd $2, %ecx, %xmm0, %xmm0
  8555. movl 44(%esp), %edx
  8556. movl 48(%esp), %ecx
  8557. shrl $29, %edx
  8558. shrl $29, %ecx
  8559. vpinsrd $0x01, %edx, %xmm0, %xmm0
  8560. vpinsrd $3, %ecx, %xmm0, %xmm0
  8561. vpxor %xmm0, %xmm4, %xmm4
  8562. # ghash_gfmul_red_avx
  8563. vpshufd $0x4e, %xmm5, %xmm1
  8564. vpshufd $0x4e, %xmm4, %xmm2
  8565. vpclmulqdq $0x11, %xmm5, %xmm4, %xmm3
  8566. vpclmulqdq $0x00, %xmm5, %xmm4, %xmm0
  8567. vpxor %xmm5, %xmm1, %xmm1
  8568. vpxor %xmm4, %xmm2, %xmm2
  8569. vpclmulqdq $0x00, %xmm2, %xmm1, %xmm1
  8570. vpxor %xmm0, %xmm1, %xmm1
  8571. vpxor %xmm3, %xmm1, %xmm1
  8572. vpslldq $8, %xmm1, %xmm2
  8573. vpsrldq $8, %xmm1, %xmm1
  8574. vpxor %xmm2, %xmm0, %xmm0
  8575. vpxor %xmm1, %xmm3, %xmm4
  8576. vpslld $31, %xmm0, %xmm1
  8577. vpslld $30, %xmm0, %xmm2
  8578. vpslld $25, %xmm0, %xmm3
  8579. vpxor %xmm2, %xmm1, %xmm1
  8580. vpxor %xmm3, %xmm1, %xmm1
  8581. vpsrldq $4, %xmm1, %xmm3
  8582. vpslldq $12, %xmm1, %xmm1
  8583. vpxor %xmm1, %xmm0, %xmm0
  8584. vpsrld $0x01, %xmm0, %xmm1
  8585. vpsrld $2, %xmm0, %xmm2
  8586. vpxor %xmm2, %xmm1, %xmm1
  8587. vpxor %xmm0, %xmm1, %xmm1
  8588. vpsrld $7, %xmm0, %xmm0
  8589. vpxor %xmm3, %xmm1, %xmm1
  8590. vpxor %xmm0, %xmm1, %xmm1
  8591. vpxor %xmm1, %xmm4, %xmm4
  8592. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm4, %xmm4
  8593. vpxor %xmm6, %xmm4, %xmm0
  8594. movl 36(%esp), %edi
  8595. cmpl $16, 40(%esp)
  8596. je L_AES_GCM_encrypt_final_avx1_store_tag_16
  8597. xorl %ecx, %ecx
  8598. vmovdqu %xmm0, (%esp)
  8599. L_AES_GCM_encrypt_final_avx1_store_tag_loop:
  8600. movzbl (%esp,%ecx,1), %eax
  8601. movb %al, (%edi,%ecx,1)
  8602. incl %ecx
  8603. cmpl 40(%esp), %ecx
  8604. jne L_AES_GCM_encrypt_final_avx1_store_tag_loop
  8605. jmp L_AES_GCM_encrypt_final_avx1_store_tag_done
  8606. L_AES_GCM_encrypt_final_avx1_store_tag_16:
  8607. vmovdqu %xmm0, (%edi)
  8608. L_AES_GCM_encrypt_final_avx1_store_tag_done:
  8609. addl $16, %esp
  8610. popl %ebp
  8611. popl %edi
  8612. popl %esi
  8613. ret
  8614. .size AES_GCM_encrypt_final_avx1,.-AES_GCM_encrypt_final_avx1
  8615. .text
  8616. .globl AES_GCM_decrypt_update_avx1
  8617. .type AES_GCM_decrypt_update_avx1,@function
  8618. .align 16
  8619. AES_GCM_decrypt_update_avx1:
  8620. pushl %ebx
  8621. pushl %esi
  8622. pushl %edi
  8623. pushl %ebp
  8624. subl $0xa0, %esp
  8625. movl 208(%esp), %esi
  8626. vmovdqa (%esi), %xmm4
  8627. vmovdqu %xmm4, 64(%esp)
  8628. movl 200(%esp), %esi
  8629. movl 204(%esp), %ebp
  8630. vmovdqa (%esi), %xmm6
  8631. vmovdqa (%ebp), %xmm5
  8632. vmovdqu %xmm6, 80(%esp)
  8633. movl 180(%esp), %ebp
  8634. movl 188(%esp), %edi
  8635. movl 192(%esp), %esi
  8636. vpsrlq $63, %xmm5, %xmm1
  8637. vpsllq $0x01, %xmm5, %xmm0
  8638. vpslldq $8, %xmm1, %xmm1
  8639. vpor %xmm1, %xmm0, %xmm0
  8640. vpshufd $0xff, %xmm5, %xmm5
  8641. vpsrad $31, %xmm5, %xmm5
  8642. vpand L_aes_gcm_avx1_mod2_128, %xmm5, %xmm5
  8643. vpxor %xmm0, %xmm5, %xmm5
  8644. xorl %ebx, %ebx
  8645. cmpl $0x40, 196(%esp)
  8646. movl 196(%esp), %eax
  8647. jl L_AES_GCM_decrypt_update_avx1_done_64
  8648. andl $0xffffffc0, %eax
  8649. vmovdqa %xmm6, %xmm2
  8650. # H ^ 1
  8651. vmovdqu %xmm5, (%esp)
  8652. # H ^ 2
  8653. vpclmulqdq $0x00, %xmm5, %xmm5, %xmm0
  8654. vpclmulqdq $0x11, %xmm5, %xmm5, %xmm4
  8655. vpslld $31, %xmm0, %xmm1
  8656. vpslld $30, %xmm0, %xmm2
  8657. vpslld $25, %xmm0, %xmm3
  8658. vpxor %xmm2, %xmm1, %xmm1
  8659. vpxor %xmm3, %xmm1, %xmm1
  8660. vpsrldq $4, %xmm1, %xmm3
  8661. vpslldq $12, %xmm1, %xmm1
  8662. vpxor %xmm1, %xmm0, %xmm0
  8663. vpsrld $0x01, %xmm0, %xmm1
  8664. vpsrld $2, %xmm0, %xmm2
  8665. vpxor %xmm2, %xmm1, %xmm1
  8666. vpxor %xmm0, %xmm1, %xmm1
  8667. vpsrld $7, %xmm0, %xmm0
  8668. vpxor %xmm3, %xmm1, %xmm1
  8669. vpxor %xmm0, %xmm1, %xmm1
  8670. vpxor %xmm1, %xmm4, %xmm4
  8671. vmovdqu %xmm4, 16(%esp)
  8672. # H ^ 3
  8673. # ghash_gfmul_red_avx
  8674. vpshufd $0x4e, %xmm5, %xmm1
  8675. vpshufd $0x4e, %xmm4, %xmm2
  8676. vpclmulqdq $0x11, %xmm5, %xmm4, %xmm3
  8677. vpclmulqdq $0x00, %xmm5, %xmm4, %xmm0
  8678. vpxor %xmm5, %xmm1, %xmm1
  8679. vpxor %xmm4, %xmm2, %xmm2
  8680. vpclmulqdq $0x00, %xmm2, %xmm1, %xmm1
  8681. vpxor %xmm0, %xmm1, %xmm1
  8682. vpxor %xmm3, %xmm1, %xmm1
  8683. vpslldq $8, %xmm1, %xmm2
  8684. vpsrldq $8, %xmm1, %xmm1
  8685. vpxor %xmm2, %xmm0, %xmm0
  8686. vpxor %xmm1, %xmm3, %xmm7
  8687. vpslld $31, %xmm0, %xmm1
  8688. vpslld $30, %xmm0, %xmm2
  8689. vpslld $25, %xmm0, %xmm3
  8690. vpxor %xmm2, %xmm1, %xmm1
  8691. vpxor %xmm3, %xmm1, %xmm1
  8692. vpsrldq $4, %xmm1, %xmm3
  8693. vpslldq $12, %xmm1, %xmm1
  8694. vpxor %xmm1, %xmm0, %xmm0
  8695. vpsrld $0x01, %xmm0, %xmm1
  8696. vpsrld $2, %xmm0, %xmm2
  8697. vpxor %xmm2, %xmm1, %xmm1
  8698. vpxor %xmm0, %xmm1, %xmm1
  8699. vpsrld $7, %xmm0, %xmm0
  8700. vpxor %xmm3, %xmm1, %xmm1
  8701. vpxor %xmm0, %xmm1, %xmm1
  8702. vpxor %xmm1, %xmm7, %xmm7
  8703. vmovdqu %xmm7, 32(%esp)
  8704. # H ^ 4
  8705. vpclmulqdq $0x00, %xmm4, %xmm4, %xmm0
  8706. vpclmulqdq $0x11, %xmm4, %xmm4, %xmm7
  8707. vpslld $31, %xmm0, %xmm1
  8708. vpslld $30, %xmm0, %xmm2
  8709. vpslld $25, %xmm0, %xmm3
  8710. vpxor %xmm2, %xmm1, %xmm1
  8711. vpxor %xmm3, %xmm1, %xmm1
  8712. vpsrldq $4, %xmm1, %xmm3
  8713. vpslldq $12, %xmm1, %xmm1
  8714. vpxor %xmm1, %xmm0, %xmm0
  8715. vpsrld $0x01, %xmm0, %xmm1
  8716. vpsrld $2, %xmm0, %xmm2
  8717. vpxor %xmm2, %xmm1, %xmm1
  8718. vpxor %xmm0, %xmm1, %xmm1
  8719. vpsrld $7, %xmm0, %xmm0
  8720. vpxor %xmm3, %xmm1, %xmm1
  8721. vpxor %xmm0, %xmm1, %xmm1
  8722. vpxor %xmm1, %xmm7, %xmm7
  8723. vmovdqu %xmm7, 48(%esp)
  8724. cmpl %esi, %edi
  8725. jne L_AES_GCM_decrypt_update_avx1_ghash_64
  8726. L_AES_GCM_decrypt_update_avx1_ghash_64_inplace:
  8727. leal (%esi,%ebx,1), %ecx
  8728. leal (%edi,%ebx,1), %edx
  8729. vmovdqu 64(%esp), %xmm0
  8730. vmovdqa L_aes_gcm_avx1_bswap_epi64, %xmm7
  8731. vpaddd L_aes_gcm_avx1_one, %xmm0, %xmm1
  8732. vpshufb %xmm7, %xmm1, %xmm1
  8733. vpaddd L_aes_gcm_avx1_two, %xmm0, %xmm2
  8734. vpshufb %xmm7, %xmm2, %xmm2
  8735. vpaddd L_aes_gcm_avx1_three, %xmm0, %xmm3
  8736. vpshufb %xmm7, %xmm3, %xmm3
  8737. vpshufb %xmm7, %xmm0, %xmm0
  8738. vmovdqu 64(%esp), %xmm7
  8739. vpaddd L_aes_gcm_avx1_four, %xmm7, %xmm7
  8740. vmovdqu %xmm7, 64(%esp)
  8741. vmovdqa (%ebp), %xmm7
  8742. vpxor %xmm7, %xmm0, %xmm0
  8743. vpxor %xmm7, %xmm1, %xmm1
  8744. vpxor %xmm7, %xmm2, %xmm2
  8745. vpxor %xmm7, %xmm3, %xmm3
  8746. vmovdqa 16(%ebp), %xmm7
  8747. vaesenc %xmm7, %xmm0, %xmm0
  8748. vaesenc %xmm7, %xmm1, %xmm1
  8749. vaesenc %xmm7, %xmm2, %xmm2
  8750. vaesenc %xmm7, %xmm3, %xmm3
  8751. vmovdqa 32(%ebp), %xmm7
  8752. vaesenc %xmm7, %xmm0, %xmm0
  8753. vaesenc %xmm7, %xmm1, %xmm1
  8754. vaesenc %xmm7, %xmm2, %xmm2
  8755. vaesenc %xmm7, %xmm3, %xmm3
  8756. vmovdqa 48(%ebp), %xmm7
  8757. vaesenc %xmm7, %xmm0, %xmm0
  8758. vaesenc %xmm7, %xmm1, %xmm1
  8759. vaesenc %xmm7, %xmm2, %xmm2
  8760. vaesenc %xmm7, %xmm3, %xmm3
  8761. vmovdqa 64(%ebp), %xmm7
  8762. vaesenc %xmm7, %xmm0, %xmm0
  8763. vaesenc %xmm7, %xmm1, %xmm1
  8764. vaesenc %xmm7, %xmm2, %xmm2
  8765. vaesenc %xmm7, %xmm3, %xmm3
  8766. vmovdqa 80(%ebp), %xmm7
  8767. vaesenc %xmm7, %xmm0, %xmm0
  8768. vaesenc %xmm7, %xmm1, %xmm1
  8769. vaesenc %xmm7, %xmm2, %xmm2
  8770. vaesenc %xmm7, %xmm3, %xmm3
  8771. vmovdqa 96(%ebp), %xmm7
  8772. vaesenc %xmm7, %xmm0, %xmm0
  8773. vaesenc %xmm7, %xmm1, %xmm1
  8774. vaesenc %xmm7, %xmm2, %xmm2
  8775. vaesenc %xmm7, %xmm3, %xmm3
  8776. vmovdqa 112(%ebp), %xmm7
  8777. vaesenc %xmm7, %xmm0, %xmm0
  8778. vaesenc %xmm7, %xmm1, %xmm1
  8779. vaesenc %xmm7, %xmm2, %xmm2
  8780. vaesenc %xmm7, %xmm3, %xmm3
  8781. vmovdqa 128(%ebp), %xmm7
  8782. vaesenc %xmm7, %xmm0, %xmm0
  8783. vaesenc %xmm7, %xmm1, %xmm1
  8784. vaesenc %xmm7, %xmm2, %xmm2
  8785. vaesenc %xmm7, %xmm3, %xmm3
  8786. vmovdqa 144(%ebp), %xmm7
  8787. vaesenc %xmm7, %xmm0, %xmm0
  8788. vaesenc %xmm7, %xmm1, %xmm1
  8789. vaesenc %xmm7, %xmm2, %xmm2
  8790. vaesenc %xmm7, %xmm3, %xmm3
  8791. cmpl $11, 184(%esp)
  8792. vmovdqa 160(%ebp), %xmm7
  8793. jl L_AES_GCM_decrypt_update_avx1inplace_aesenc_64_ghash_avx_aesenc_64_enc_done
  8794. vaesenc %xmm7, %xmm0, %xmm0
  8795. vaesenc %xmm7, %xmm1, %xmm1
  8796. vaesenc %xmm7, %xmm2, %xmm2
  8797. vaesenc %xmm7, %xmm3, %xmm3
  8798. vmovdqa 176(%ebp), %xmm7
  8799. vaesenc %xmm7, %xmm0, %xmm0
  8800. vaesenc %xmm7, %xmm1, %xmm1
  8801. vaesenc %xmm7, %xmm2, %xmm2
  8802. vaesenc %xmm7, %xmm3, %xmm3
  8803. cmpl $13, 184(%esp)
  8804. vmovdqa 192(%ebp), %xmm7
  8805. jl L_AES_GCM_decrypt_update_avx1inplace_aesenc_64_ghash_avx_aesenc_64_enc_done
  8806. vaesenc %xmm7, %xmm0, %xmm0
  8807. vaesenc %xmm7, %xmm1, %xmm1
  8808. vaesenc %xmm7, %xmm2, %xmm2
  8809. vaesenc %xmm7, %xmm3, %xmm3
  8810. vmovdqa 208(%ebp), %xmm7
  8811. vaesenc %xmm7, %xmm0, %xmm0
  8812. vaesenc %xmm7, %xmm1, %xmm1
  8813. vaesenc %xmm7, %xmm2, %xmm2
  8814. vaesenc %xmm7, %xmm3, %xmm3
  8815. vmovdqa 224(%ebp), %xmm7
  8816. L_AES_GCM_decrypt_update_avx1inplace_aesenc_64_ghash_avx_aesenc_64_enc_done:
  8817. vaesenclast %xmm7, %xmm0, %xmm0
  8818. vaesenclast %xmm7, %xmm1, %xmm1
  8819. vmovdqu (%ecx), %xmm4
  8820. vmovdqu 16(%ecx), %xmm5
  8821. vpxor %xmm4, %xmm0, %xmm0
  8822. vpxor %xmm5, %xmm1, %xmm1
  8823. vmovdqu %xmm4, 96(%esp)
  8824. vmovdqu %xmm5, 112(%esp)
  8825. vmovdqu %xmm0, (%edx)
  8826. vmovdqu %xmm1, 16(%edx)
  8827. vaesenclast %xmm7, %xmm2, %xmm2
  8828. vaesenclast %xmm7, %xmm3, %xmm3
  8829. vmovdqu 32(%ecx), %xmm4
  8830. vmovdqu 48(%ecx), %xmm5
  8831. vpxor %xmm4, %xmm2, %xmm2
  8832. vpxor %xmm5, %xmm3, %xmm3
  8833. vmovdqu %xmm4, 128(%esp)
  8834. vmovdqu %xmm5, 144(%esp)
  8835. vmovdqu %xmm2, 32(%edx)
  8836. vmovdqu %xmm3, 48(%edx)
  8837. # ghash encrypted counter
  8838. vmovdqu 80(%esp), %xmm2
  8839. vmovdqu 48(%esp), %xmm7
  8840. vmovdqu 96(%esp), %xmm0
  8841. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm0, %xmm0
  8842. vpxor %xmm2, %xmm0, %xmm0
  8843. vpshufd $0x4e, %xmm7, %xmm1
  8844. vpshufd $0x4e, %xmm0, %xmm5
  8845. vpxor %xmm7, %xmm1, %xmm1
  8846. vpxor %xmm0, %xmm5, %xmm5
  8847. vpclmulqdq $0x11, %xmm7, %xmm0, %xmm3
  8848. vpclmulqdq $0x00, %xmm7, %xmm0, %xmm2
  8849. vpclmulqdq $0x00, %xmm5, %xmm1, %xmm1
  8850. vpxor %xmm2, %xmm1, %xmm1
  8851. vpxor %xmm3, %xmm1, %xmm1
  8852. vmovdqu 32(%esp), %xmm7
  8853. vmovdqu 112(%esp), %xmm0
  8854. vpshufd $0x4e, %xmm7, %xmm4
  8855. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm0, %xmm0
  8856. vpxor %xmm7, %xmm4, %xmm4
  8857. vpshufd $0x4e, %xmm0, %xmm5
  8858. vpxor %xmm0, %xmm5, %xmm5
  8859. vpclmulqdq $0x11, %xmm7, %xmm0, %xmm6
  8860. vpclmulqdq $0x00, %xmm7, %xmm0, %xmm7
  8861. vpclmulqdq $0x00, %xmm5, %xmm4, %xmm4
  8862. vpxor %xmm7, %xmm1, %xmm1
  8863. vpxor %xmm7, %xmm2, %xmm2
  8864. vpxor %xmm6, %xmm1, %xmm1
  8865. vpxor %xmm6, %xmm3, %xmm3
  8866. vpxor %xmm4, %xmm1, %xmm1
  8867. vmovdqu 16(%esp), %xmm7
  8868. vmovdqu 128(%esp), %xmm0
  8869. vpshufd $0x4e, %xmm7, %xmm4
  8870. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm0, %xmm0
  8871. vpxor %xmm7, %xmm4, %xmm4
  8872. vpshufd $0x4e, %xmm0, %xmm5
  8873. vpxor %xmm0, %xmm5, %xmm5
  8874. vpclmulqdq $0x11, %xmm7, %xmm0, %xmm6
  8875. vpclmulqdq $0x00, %xmm7, %xmm0, %xmm7
  8876. vpclmulqdq $0x00, %xmm5, %xmm4, %xmm4
  8877. vpxor %xmm7, %xmm1, %xmm1
  8878. vpxor %xmm7, %xmm2, %xmm2
  8879. vpxor %xmm6, %xmm1, %xmm1
  8880. vpxor %xmm6, %xmm3, %xmm3
  8881. vpxor %xmm4, %xmm1, %xmm1
  8882. vmovdqu (%esp), %xmm7
  8883. vmovdqu 144(%esp), %xmm0
  8884. vpshufd $0x4e, %xmm7, %xmm4
  8885. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm0, %xmm0
  8886. vpxor %xmm7, %xmm4, %xmm4
  8887. vpshufd $0x4e, %xmm0, %xmm5
  8888. vpxor %xmm0, %xmm5, %xmm5
  8889. vpclmulqdq $0x11, %xmm7, %xmm0, %xmm6
  8890. vpclmulqdq $0x00, %xmm7, %xmm0, %xmm7
  8891. vpclmulqdq $0x00, %xmm5, %xmm4, %xmm4
  8892. vpxor %xmm7, %xmm1, %xmm1
  8893. vpxor %xmm7, %xmm2, %xmm2
  8894. vpxor %xmm6, %xmm1, %xmm1
  8895. vpxor %xmm6, %xmm3, %xmm3
  8896. vpxor %xmm4, %xmm1, %xmm1
  8897. vpslldq $8, %xmm1, %xmm5
  8898. vpsrldq $8, %xmm1, %xmm1
  8899. vpxor %xmm5, %xmm2, %xmm2
  8900. vpxor %xmm1, %xmm3, %xmm3
  8901. vpslld $31, %xmm2, %xmm7
  8902. vpslld $30, %xmm2, %xmm4
  8903. vpslld $25, %xmm2, %xmm5
  8904. vpxor %xmm4, %xmm7, %xmm7
  8905. vpxor %xmm5, %xmm7, %xmm7
  8906. vpsrldq $4, %xmm7, %xmm4
  8907. vpslldq $12, %xmm7, %xmm7
  8908. vpxor %xmm7, %xmm2, %xmm2
  8909. vpsrld $0x01, %xmm2, %xmm5
  8910. vpsrld $2, %xmm2, %xmm1
  8911. vpsrld $7, %xmm2, %xmm0
  8912. vpxor %xmm1, %xmm5, %xmm5
  8913. vpxor %xmm0, %xmm5, %xmm5
  8914. vpxor %xmm4, %xmm5, %xmm5
  8915. vpxor %xmm5, %xmm2, %xmm2
  8916. vpxor %xmm3, %xmm2, %xmm2
  8917. vmovdqu %xmm2, 80(%esp)
  8918. addl $0x40, %ebx
  8919. cmpl %eax, %ebx
  8920. jl L_AES_GCM_decrypt_update_avx1_ghash_64_inplace
  8921. jmp L_AES_GCM_decrypt_update_avx1_ghash_64_done
  8922. L_AES_GCM_decrypt_update_avx1_ghash_64:
  8923. leal (%esi,%ebx,1), %ecx
  8924. leal (%edi,%ebx,1), %edx
  8925. vmovdqu 64(%esp), %xmm0
  8926. vmovdqa L_aes_gcm_avx1_bswap_epi64, %xmm7
  8927. vpaddd L_aes_gcm_avx1_one, %xmm0, %xmm1
  8928. vpshufb %xmm7, %xmm1, %xmm1
  8929. vpaddd L_aes_gcm_avx1_two, %xmm0, %xmm2
  8930. vpshufb %xmm7, %xmm2, %xmm2
  8931. vpaddd L_aes_gcm_avx1_three, %xmm0, %xmm3
  8932. vpshufb %xmm7, %xmm3, %xmm3
  8933. vpshufb %xmm7, %xmm0, %xmm0
  8934. vmovdqu 64(%esp), %xmm7
  8935. vpaddd L_aes_gcm_avx1_four, %xmm7, %xmm7
  8936. vmovdqu %xmm7, 64(%esp)
  8937. vmovdqa (%ebp), %xmm7
  8938. vpxor %xmm7, %xmm0, %xmm0
  8939. vpxor %xmm7, %xmm1, %xmm1
  8940. vpxor %xmm7, %xmm2, %xmm2
  8941. vpxor %xmm7, %xmm3, %xmm3
  8942. vmovdqa 16(%ebp), %xmm7
  8943. vaesenc %xmm7, %xmm0, %xmm0
  8944. vaesenc %xmm7, %xmm1, %xmm1
  8945. vaesenc %xmm7, %xmm2, %xmm2
  8946. vaesenc %xmm7, %xmm3, %xmm3
  8947. vmovdqa 32(%ebp), %xmm7
  8948. vaesenc %xmm7, %xmm0, %xmm0
  8949. vaesenc %xmm7, %xmm1, %xmm1
  8950. vaesenc %xmm7, %xmm2, %xmm2
  8951. vaesenc %xmm7, %xmm3, %xmm3
  8952. vmovdqa 48(%ebp), %xmm7
  8953. vaesenc %xmm7, %xmm0, %xmm0
  8954. vaesenc %xmm7, %xmm1, %xmm1
  8955. vaesenc %xmm7, %xmm2, %xmm2
  8956. vaesenc %xmm7, %xmm3, %xmm3
  8957. vmovdqa 64(%ebp), %xmm7
  8958. vaesenc %xmm7, %xmm0, %xmm0
  8959. vaesenc %xmm7, %xmm1, %xmm1
  8960. vaesenc %xmm7, %xmm2, %xmm2
  8961. vaesenc %xmm7, %xmm3, %xmm3
  8962. vmovdqa 80(%ebp), %xmm7
  8963. vaesenc %xmm7, %xmm0, %xmm0
  8964. vaesenc %xmm7, %xmm1, %xmm1
  8965. vaesenc %xmm7, %xmm2, %xmm2
  8966. vaesenc %xmm7, %xmm3, %xmm3
  8967. vmovdqa 96(%ebp), %xmm7
  8968. vaesenc %xmm7, %xmm0, %xmm0
  8969. vaesenc %xmm7, %xmm1, %xmm1
  8970. vaesenc %xmm7, %xmm2, %xmm2
  8971. vaesenc %xmm7, %xmm3, %xmm3
  8972. vmovdqa 112(%ebp), %xmm7
  8973. vaesenc %xmm7, %xmm0, %xmm0
  8974. vaesenc %xmm7, %xmm1, %xmm1
  8975. vaesenc %xmm7, %xmm2, %xmm2
  8976. vaesenc %xmm7, %xmm3, %xmm3
  8977. vmovdqa 128(%ebp), %xmm7
  8978. vaesenc %xmm7, %xmm0, %xmm0
  8979. vaesenc %xmm7, %xmm1, %xmm1
  8980. vaesenc %xmm7, %xmm2, %xmm2
  8981. vaesenc %xmm7, %xmm3, %xmm3
  8982. vmovdqa 144(%ebp), %xmm7
  8983. vaesenc %xmm7, %xmm0, %xmm0
  8984. vaesenc %xmm7, %xmm1, %xmm1
  8985. vaesenc %xmm7, %xmm2, %xmm2
  8986. vaesenc %xmm7, %xmm3, %xmm3
  8987. cmpl $11, 184(%esp)
  8988. vmovdqa 160(%ebp), %xmm7
  8989. jl L_AES_GCM_decrypt_update_avx1_aesenc_64_ghash_avx_aesenc_64_enc_done
  8990. vaesenc %xmm7, %xmm0, %xmm0
  8991. vaesenc %xmm7, %xmm1, %xmm1
  8992. vaesenc %xmm7, %xmm2, %xmm2
  8993. vaesenc %xmm7, %xmm3, %xmm3
  8994. vmovdqa 176(%ebp), %xmm7
  8995. vaesenc %xmm7, %xmm0, %xmm0
  8996. vaesenc %xmm7, %xmm1, %xmm1
  8997. vaesenc %xmm7, %xmm2, %xmm2
  8998. vaesenc %xmm7, %xmm3, %xmm3
  8999. cmpl $13, 184(%esp)
  9000. vmovdqa 192(%ebp), %xmm7
  9001. jl L_AES_GCM_decrypt_update_avx1_aesenc_64_ghash_avx_aesenc_64_enc_done
  9002. vaesenc %xmm7, %xmm0, %xmm0
  9003. vaesenc %xmm7, %xmm1, %xmm1
  9004. vaesenc %xmm7, %xmm2, %xmm2
  9005. vaesenc %xmm7, %xmm3, %xmm3
  9006. vmovdqa 208(%ebp), %xmm7
  9007. vaesenc %xmm7, %xmm0, %xmm0
  9008. vaesenc %xmm7, %xmm1, %xmm1
  9009. vaesenc %xmm7, %xmm2, %xmm2
  9010. vaesenc %xmm7, %xmm3, %xmm3
  9011. vmovdqa 224(%ebp), %xmm7
  9012. L_AES_GCM_decrypt_update_avx1_aesenc_64_ghash_avx_aesenc_64_enc_done:
  9013. vaesenclast %xmm7, %xmm0, %xmm0
  9014. vaesenclast %xmm7, %xmm1, %xmm1
  9015. vmovdqu (%ecx), %xmm4
  9016. vmovdqu 16(%ecx), %xmm5
  9017. vpxor %xmm4, %xmm0, %xmm0
  9018. vpxor %xmm5, %xmm1, %xmm1
  9019. vmovdqu %xmm4, (%ecx)
  9020. vmovdqu %xmm5, 16(%ecx)
  9021. vmovdqu %xmm0, (%edx)
  9022. vmovdqu %xmm1, 16(%edx)
  9023. vaesenclast %xmm7, %xmm2, %xmm2
  9024. vaesenclast %xmm7, %xmm3, %xmm3
  9025. vmovdqu 32(%ecx), %xmm4
  9026. vmovdqu 48(%ecx), %xmm5
  9027. vpxor %xmm4, %xmm2, %xmm2
  9028. vpxor %xmm5, %xmm3, %xmm3
  9029. vmovdqu %xmm4, 32(%ecx)
  9030. vmovdqu %xmm5, 48(%ecx)
  9031. vmovdqu %xmm2, 32(%edx)
  9032. vmovdqu %xmm3, 48(%edx)
  9033. # ghash encrypted counter
  9034. vmovdqu 80(%esp), %xmm2
  9035. vmovdqu 48(%esp), %xmm7
  9036. vmovdqu (%ecx), %xmm0
  9037. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm0, %xmm0
  9038. vpxor %xmm2, %xmm0, %xmm0
  9039. vpshufd $0x4e, %xmm7, %xmm1
  9040. vpshufd $0x4e, %xmm0, %xmm5
  9041. vpxor %xmm7, %xmm1, %xmm1
  9042. vpxor %xmm0, %xmm5, %xmm5
  9043. vpclmulqdq $0x11, %xmm7, %xmm0, %xmm3
  9044. vpclmulqdq $0x00, %xmm7, %xmm0, %xmm2
  9045. vpclmulqdq $0x00, %xmm5, %xmm1, %xmm1
  9046. vpxor %xmm2, %xmm1, %xmm1
  9047. vpxor %xmm3, %xmm1, %xmm1
  9048. vmovdqu 32(%esp), %xmm7
  9049. vmovdqu 16(%ecx), %xmm0
  9050. vpshufd $0x4e, %xmm7, %xmm4
  9051. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm0, %xmm0
  9052. vpxor %xmm7, %xmm4, %xmm4
  9053. vpshufd $0x4e, %xmm0, %xmm5
  9054. vpxor %xmm0, %xmm5, %xmm5
  9055. vpclmulqdq $0x11, %xmm7, %xmm0, %xmm6
  9056. vpclmulqdq $0x00, %xmm7, %xmm0, %xmm7
  9057. vpclmulqdq $0x00, %xmm5, %xmm4, %xmm4
  9058. vpxor %xmm7, %xmm1, %xmm1
  9059. vpxor %xmm7, %xmm2, %xmm2
  9060. vpxor %xmm6, %xmm1, %xmm1
  9061. vpxor %xmm6, %xmm3, %xmm3
  9062. vpxor %xmm4, %xmm1, %xmm1
  9063. vmovdqu 16(%esp), %xmm7
  9064. vmovdqu 32(%ecx), %xmm0
  9065. vpshufd $0x4e, %xmm7, %xmm4
  9066. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm0, %xmm0
  9067. vpxor %xmm7, %xmm4, %xmm4
  9068. vpshufd $0x4e, %xmm0, %xmm5
  9069. vpxor %xmm0, %xmm5, %xmm5
  9070. vpclmulqdq $0x11, %xmm7, %xmm0, %xmm6
  9071. vpclmulqdq $0x00, %xmm7, %xmm0, %xmm7
  9072. vpclmulqdq $0x00, %xmm5, %xmm4, %xmm4
  9073. vpxor %xmm7, %xmm1, %xmm1
  9074. vpxor %xmm7, %xmm2, %xmm2
  9075. vpxor %xmm6, %xmm1, %xmm1
  9076. vpxor %xmm6, %xmm3, %xmm3
  9077. vpxor %xmm4, %xmm1, %xmm1
  9078. vmovdqu (%esp), %xmm7
  9079. vmovdqu 48(%ecx), %xmm0
  9080. vpshufd $0x4e, %xmm7, %xmm4
  9081. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm0, %xmm0
  9082. vpxor %xmm7, %xmm4, %xmm4
  9083. vpshufd $0x4e, %xmm0, %xmm5
  9084. vpxor %xmm0, %xmm5, %xmm5
  9085. vpclmulqdq $0x11, %xmm7, %xmm0, %xmm6
  9086. vpclmulqdq $0x00, %xmm7, %xmm0, %xmm7
  9087. vpclmulqdq $0x00, %xmm5, %xmm4, %xmm4
  9088. vpxor %xmm7, %xmm1, %xmm1
  9089. vpxor %xmm7, %xmm2, %xmm2
  9090. vpxor %xmm6, %xmm1, %xmm1
  9091. vpxor %xmm6, %xmm3, %xmm3
  9092. vpxor %xmm4, %xmm1, %xmm1
  9093. vpslldq $8, %xmm1, %xmm5
  9094. vpsrldq $8, %xmm1, %xmm1
  9095. vpxor %xmm5, %xmm2, %xmm2
  9096. vpxor %xmm1, %xmm3, %xmm3
  9097. vpslld $31, %xmm2, %xmm7
  9098. vpslld $30, %xmm2, %xmm4
  9099. vpslld $25, %xmm2, %xmm5
  9100. vpxor %xmm4, %xmm7, %xmm7
  9101. vpxor %xmm5, %xmm7, %xmm7
  9102. vpsrldq $4, %xmm7, %xmm4
  9103. vpslldq $12, %xmm7, %xmm7
  9104. vpxor %xmm7, %xmm2, %xmm2
  9105. vpsrld $0x01, %xmm2, %xmm5
  9106. vpsrld $2, %xmm2, %xmm1
  9107. vpsrld $7, %xmm2, %xmm0
  9108. vpxor %xmm1, %xmm5, %xmm5
  9109. vpxor %xmm0, %xmm5, %xmm5
  9110. vpxor %xmm4, %xmm5, %xmm5
  9111. vpxor %xmm5, %xmm2, %xmm2
  9112. vpxor %xmm3, %xmm2, %xmm2
  9113. vmovdqu %xmm2, 80(%esp)
  9114. addl $0x40, %ebx
  9115. cmpl %eax, %ebx
  9116. jl L_AES_GCM_decrypt_update_avx1_ghash_64
  9117. L_AES_GCM_decrypt_update_avx1_ghash_64_done:
  9118. vmovdqa %xmm2, %xmm6
  9119. vmovdqu (%esp), %xmm5
  9120. L_AES_GCM_decrypt_update_avx1_done_64:
  9121. movl 196(%esp), %edx
  9122. cmpl %edx, %ebx
  9123. jge L_AES_GCM_decrypt_update_avx1_done_dec
  9124. movl 196(%esp), %eax
  9125. andl $0xfffffff0, %eax
  9126. cmpl %eax, %ebx
  9127. jge L_AES_GCM_decrypt_update_avx1_last_block_done
  9128. L_AES_GCM_decrypt_update_avx1_last_block_start:
  9129. leal (%esi,%ebx,1), %ecx
  9130. leal (%edi,%ebx,1), %edx
  9131. vmovdqu (%ecx), %xmm1
  9132. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm1, %xmm1
  9133. vpxor %xmm6, %xmm1, %xmm1
  9134. vmovdqu %xmm1, (%esp)
  9135. vmovdqu 64(%esp), %xmm1
  9136. vmovdqu (%esp), %xmm3
  9137. vpshufb L_aes_gcm_avx1_bswap_epi64, %xmm1, %xmm0
  9138. vpaddd L_aes_gcm_avx1_one, %xmm1, %xmm1
  9139. vmovdqu %xmm1, 64(%esp)
  9140. vpxor (%ebp), %xmm0, %xmm0
  9141. vpclmulqdq $16, %xmm5, %xmm3, %xmm4
  9142. vaesenc 16(%ebp), %xmm0, %xmm0
  9143. vaesenc 32(%ebp), %xmm0, %xmm0
  9144. vpclmulqdq $0x01, %xmm5, %xmm3, %xmm7
  9145. vaesenc 48(%ebp), %xmm0, %xmm0
  9146. vaesenc 64(%ebp), %xmm0, %xmm0
  9147. vaesenc 80(%ebp), %xmm0, %xmm0
  9148. vpclmulqdq $0x11, %xmm5, %xmm3, %xmm1
  9149. vaesenc 96(%ebp), %xmm0, %xmm0
  9150. vpxor %xmm7, %xmm4, %xmm4
  9151. vpslldq $8, %xmm4, %xmm2
  9152. vpsrldq $8, %xmm4, %xmm4
  9153. vaesenc 112(%ebp), %xmm0, %xmm0
  9154. vpclmulqdq $0x00, %xmm5, %xmm3, %xmm7
  9155. vpxor %xmm7, %xmm2, %xmm2
  9156. vpxor %xmm4, %xmm1, %xmm1
  9157. vmovdqa L_aes_gcm_avx1_mod2_128, %xmm3
  9158. vpclmulqdq $16, %xmm3, %xmm2, %xmm7
  9159. vaesenc 128(%ebp), %xmm0, %xmm0
  9160. vpshufd $0x4e, %xmm2, %xmm4
  9161. vpxor %xmm7, %xmm4, %xmm4
  9162. vpclmulqdq $16, %xmm3, %xmm4, %xmm7
  9163. vaesenc 144(%ebp), %xmm0, %xmm0
  9164. vpshufd $0x4e, %xmm4, %xmm6
  9165. vpxor %xmm7, %xmm6, %xmm6
  9166. vpxor %xmm1, %xmm6, %xmm6
  9167. cmpl $11, 184(%esp)
  9168. vmovdqa 160(%ebp), %xmm1
  9169. jl L_AES_GCM_decrypt_update_avx1_aesenc_gfmul_last
  9170. vaesenc %xmm1, %xmm0, %xmm0
  9171. vaesenc 176(%ebp), %xmm0, %xmm0
  9172. cmpl $13, 184(%esp)
  9173. vmovdqa 192(%ebp), %xmm1
  9174. jl L_AES_GCM_decrypt_update_avx1_aesenc_gfmul_last
  9175. vaesenc %xmm1, %xmm0, %xmm0
  9176. vaesenc 208(%ebp), %xmm0, %xmm0
  9177. vmovdqa 224(%ebp), %xmm1
  9178. L_AES_GCM_decrypt_update_avx1_aesenc_gfmul_last:
  9179. vaesenclast %xmm1, %xmm0, %xmm0
  9180. vmovdqu (%ecx), %xmm1
  9181. vpxor %xmm1, %xmm0, %xmm0
  9182. vmovdqu %xmm0, (%edx)
  9183. addl $16, %ebx
  9184. cmpl %eax, %ebx
  9185. jl L_AES_GCM_decrypt_update_avx1_last_block_start
  9186. L_AES_GCM_decrypt_update_avx1_last_block_done:
  9187. L_AES_GCM_decrypt_update_avx1_done_dec:
  9188. movl 200(%esp), %esi
  9189. movl 208(%esp), %edi
  9190. vmovdqu 64(%esp), %xmm4
  9191. vmovdqa %xmm6, (%esi)
  9192. vmovdqu %xmm4, (%edi)
  9193. addl $0xa0, %esp
  9194. popl %ebp
  9195. popl %edi
  9196. popl %esi
  9197. popl %ebx
  9198. ret
  9199. .size AES_GCM_decrypt_update_avx1,.-AES_GCM_decrypt_update_avx1
  9200. .text
  9201. .globl AES_GCM_decrypt_final_avx1
  9202. .type AES_GCM_decrypt_final_avx1,@function
  9203. .align 16
  9204. AES_GCM_decrypt_final_avx1:
  9205. pushl %ebx
  9206. pushl %esi
  9207. pushl %edi
  9208. pushl %ebp
  9209. subl $16, %esp
  9210. movl 36(%esp), %ebp
  9211. movl 56(%esp), %esi
  9212. movl 60(%esp), %edi
  9213. vmovdqa (%ebp), %xmm6
  9214. vmovdqa (%esi), %xmm5
  9215. vmovdqa (%edi), %xmm7
  9216. vpsrlq $63, %xmm5, %xmm1
  9217. vpsllq $0x01, %xmm5, %xmm0
  9218. vpslldq $8, %xmm1, %xmm1
  9219. vpor %xmm1, %xmm0, %xmm0
  9220. vpshufd $0xff, %xmm5, %xmm5
  9221. vpsrad $31, %xmm5, %xmm5
  9222. vpand L_aes_gcm_avx1_mod2_128, %xmm5, %xmm5
  9223. vpxor %xmm0, %xmm5, %xmm5
  9224. movl 48(%esp), %edx
  9225. movl 52(%esp), %ecx
  9226. shll $3, %edx
  9227. shll $3, %ecx
  9228. vpinsrd $0x00, %edx, %xmm0, %xmm0
  9229. vpinsrd $2, %ecx, %xmm0, %xmm0
  9230. movl 48(%esp), %edx
  9231. movl 52(%esp), %ecx
  9232. shrl $29, %edx
  9233. shrl $29, %ecx
  9234. vpinsrd $0x01, %edx, %xmm0, %xmm0
  9235. vpinsrd $3, %ecx, %xmm0, %xmm0
  9236. vpxor %xmm0, %xmm6, %xmm6
  9237. # ghash_gfmul_red_avx
  9238. vpshufd $0x4e, %xmm5, %xmm1
  9239. vpshufd $0x4e, %xmm6, %xmm2
  9240. vpclmulqdq $0x11, %xmm5, %xmm6, %xmm3
  9241. vpclmulqdq $0x00, %xmm5, %xmm6, %xmm0
  9242. vpxor %xmm5, %xmm1, %xmm1
  9243. vpxor %xmm6, %xmm2, %xmm2
  9244. vpclmulqdq $0x00, %xmm2, %xmm1, %xmm1
  9245. vpxor %xmm0, %xmm1, %xmm1
  9246. vpxor %xmm3, %xmm1, %xmm1
  9247. vpslldq $8, %xmm1, %xmm2
  9248. vpsrldq $8, %xmm1, %xmm1
  9249. vpxor %xmm2, %xmm0, %xmm0
  9250. vpxor %xmm1, %xmm3, %xmm6
  9251. vpslld $31, %xmm0, %xmm1
  9252. vpslld $30, %xmm0, %xmm2
  9253. vpslld $25, %xmm0, %xmm3
  9254. vpxor %xmm2, %xmm1, %xmm1
  9255. vpxor %xmm3, %xmm1, %xmm1
  9256. vpsrldq $4, %xmm1, %xmm3
  9257. vpslldq $12, %xmm1, %xmm1
  9258. vpxor %xmm1, %xmm0, %xmm0
  9259. vpsrld $0x01, %xmm0, %xmm1
  9260. vpsrld $2, %xmm0, %xmm2
  9261. vpxor %xmm2, %xmm1, %xmm1
  9262. vpxor %xmm0, %xmm1, %xmm1
  9263. vpsrld $7, %xmm0, %xmm0
  9264. vpxor %xmm3, %xmm1, %xmm1
  9265. vpxor %xmm0, %xmm1, %xmm1
  9266. vpxor %xmm1, %xmm6, %xmm6
  9267. vpshufb L_aes_gcm_avx1_bswap_mask, %xmm6, %xmm6
  9268. vpxor %xmm7, %xmm6, %xmm0
  9269. movl 40(%esp), %esi
  9270. movl 64(%esp), %edi
  9271. cmpl $16, 44(%esp)
  9272. je L_AES_GCM_decrypt_final_avx1_cmp_tag_16
  9273. subl $16, %esp
  9274. xorl %ecx, %ecx
  9275. xorl %ebx, %ebx
  9276. vmovdqu %xmm0, (%esp)
  9277. L_AES_GCM_decrypt_final_avx1_cmp_tag_loop:
  9278. movzbl (%esp,%ecx,1), %eax
  9279. xorb (%esi,%ecx,1), %al
  9280. orb %al, %bl
  9281. incl %ecx
  9282. cmpl 44(%esp), %ecx
  9283. jne L_AES_GCM_decrypt_final_avx1_cmp_tag_loop
  9284. cmpb $0x00, %bl
  9285. sete %bl
  9286. addl $16, %esp
  9287. xorl %ecx, %ecx
  9288. jmp L_AES_GCM_decrypt_final_avx1_cmp_tag_done
  9289. L_AES_GCM_decrypt_final_avx1_cmp_tag_16:
  9290. vmovdqu (%esi), %xmm1
  9291. vpcmpeqb %xmm1, %xmm0, %xmm0
  9292. vpmovmskb %xmm0, %edx
  9293. # %%edx == 0xFFFF then return 1 else => return 0
  9294. xorl %ebx, %ebx
  9295. cmpl $0xffff, %edx
  9296. sete %bl
  9297. L_AES_GCM_decrypt_final_avx1_cmp_tag_done:
  9298. movl %ebx, (%edi)
  9299. addl $16, %esp
  9300. popl %ebp
  9301. popl %edi
  9302. popl %esi
  9303. popl %ebx
  9304. ret
  9305. .size AES_GCM_decrypt_final_avx1,.-AES_GCM_decrypt_final_avx1
  9306. #endif /* WOLFSSL_AESGCM_STREAM */
  9307. #endif /* HAVE_INTEL_AVX1 */
  9308. #ifdef HAVE_INTEL_AVX2
  9309. .text
  9310. .globl AES_GCM_encrypt_avx2
  9311. .type AES_GCM_encrypt_avx2,@function
  9312. .align 16
  9313. AES_GCM_encrypt_avx2:
  9314. pushl %ebx
  9315. pushl %esi
  9316. pushl %edi
  9317. pushl %ebp
  9318. subl $0x70, %esp
  9319. movl 144(%esp), %esi
  9320. movl 168(%esp), %ebp
  9321. movl 160(%esp), %edx
  9322. vpxor %xmm4, %xmm4, %xmm4
  9323. cmpl $12, %edx
  9324. je L_AES_GCM_encrypt_avx2_iv_12
  9325. # Calculate values when IV is not 12 bytes
  9326. # H = Encrypt X(=0)
  9327. vmovdqu (%ebp), %xmm5
  9328. vaesenc 16(%ebp), %xmm5, %xmm5
  9329. vaesenc 32(%ebp), %xmm5, %xmm5
  9330. vaesenc 48(%ebp), %xmm5, %xmm5
  9331. vaesenc 64(%ebp), %xmm5, %xmm5
  9332. vaesenc 80(%ebp), %xmm5, %xmm5
  9333. vaesenc 96(%ebp), %xmm5, %xmm5
  9334. vaesenc 112(%ebp), %xmm5, %xmm5
  9335. vaesenc 128(%ebp), %xmm5, %xmm5
  9336. vaesenc 144(%ebp), %xmm5, %xmm5
  9337. cmpl $11, 172(%esp)
  9338. vmovdqu 160(%ebp), %xmm0
  9339. jl L_AES_GCM_encrypt_avx2_calc_iv_1_aesenc_avx_last
  9340. vaesenc %xmm0, %xmm5, %xmm5
  9341. vaesenc 176(%ebp), %xmm5, %xmm5
  9342. cmpl $13, 172(%esp)
  9343. vmovdqu 192(%ebp), %xmm0
  9344. jl L_AES_GCM_encrypt_avx2_calc_iv_1_aesenc_avx_last
  9345. vaesenc %xmm0, %xmm5, %xmm5
  9346. vaesenc 208(%ebp), %xmm5, %xmm5
  9347. vmovdqu 224(%ebp), %xmm0
  9348. L_AES_GCM_encrypt_avx2_calc_iv_1_aesenc_avx_last:
  9349. vaesenclast %xmm0, %xmm5, %xmm5
  9350. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm5, %xmm5
  9351. # Calc counter
  9352. # Initialization vector
  9353. cmpl $0x00, %edx
  9354. movl $0x00, %ecx
  9355. je L_AES_GCM_encrypt_avx2_calc_iv_done
  9356. cmpl $16, %edx
  9357. jl L_AES_GCM_encrypt_avx2_calc_iv_lt16
  9358. andl $0xfffffff0, %edx
  9359. L_AES_GCM_encrypt_avx2_calc_iv_16_loop:
  9360. vmovdqu (%esi,%ecx,1), %xmm0
  9361. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm0, %xmm0
  9362. vpxor %xmm0, %xmm4, %xmm4
  9363. # ghash_gfmul_avx
  9364. vpclmulqdq $16, %xmm4, %xmm5, %xmm2
  9365. vpclmulqdq $0x01, %xmm4, %xmm5, %xmm1
  9366. vpclmulqdq $0x00, %xmm4, %xmm5, %xmm0
  9367. vpclmulqdq $0x11, %xmm4, %xmm5, %xmm3
  9368. vpxor %xmm1, %xmm2, %xmm2
  9369. vpslldq $8, %xmm2, %xmm1
  9370. vpsrldq $8, %xmm2, %xmm2
  9371. vpxor %xmm1, %xmm0, %xmm7
  9372. vpxor %xmm2, %xmm3, %xmm4
  9373. # ghash_mid
  9374. vpsrld $31, %xmm7, %xmm0
  9375. vpsrld $31, %xmm4, %xmm1
  9376. vpslld $0x01, %xmm7, %xmm7
  9377. vpslld $0x01, %xmm4, %xmm4
  9378. vpsrldq $12, %xmm0, %xmm2
  9379. vpslldq $4, %xmm0, %xmm0
  9380. vpslldq $4, %xmm1, %xmm1
  9381. vpor %xmm2, %xmm4, %xmm4
  9382. vpor %xmm0, %xmm7, %xmm7
  9383. vpor %xmm1, %xmm4, %xmm4
  9384. # ghash_red
  9385. vmovdqu L_aes_gcm_avx2_mod2_128, %xmm2
  9386. vpclmulqdq $16, %xmm2, %xmm7, %xmm0
  9387. vpshufd $0x4e, %xmm7, %xmm1
  9388. vpxor %xmm0, %xmm1, %xmm1
  9389. vpclmulqdq $16, %xmm2, %xmm1, %xmm0
  9390. vpshufd $0x4e, %xmm1, %xmm1
  9391. vpxor %xmm0, %xmm1, %xmm1
  9392. vpxor %xmm1, %xmm4, %xmm4
  9393. addl $16, %ecx
  9394. cmpl %edx, %ecx
  9395. jl L_AES_GCM_encrypt_avx2_calc_iv_16_loop
  9396. movl 160(%esp), %edx
  9397. cmpl %edx, %ecx
  9398. je L_AES_GCM_encrypt_avx2_calc_iv_done
  9399. L_AES_GCM_encrypt_avx2_calc_iv_lt16:
  9400. vpxor %xmm0, %xmm0, %xmm0
  9401. xorl %ebx, %ebx
  9402. vmovdqu %xmm0, (%esp)
  9403. L_AES_GCM_encrypt_avx2_calc_iv_loop:
  9404. movzbl (%esi,%ecx,1), %eax
  9405. movb %al, (%esp,%ebx,1)
  9406. incl %ecx
  9407. incl %ebx
  9408. cmpl %edx, %ecx
  9409. jl L_AES_GCM_encrypt_avx2_calc_iv_loop
  9410. vmovdqu (%esp), %xmm0
  9411. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm0, %xmm0
  9412. vpxor %xmm0, %xmm4, %xmm4
  9413. # ghash_gfmul_avx
  9414. vpclmulqdq $16, %xmm4, %xmm5, %xmm2
  9415. vpclmulqdq $0x01, %xmm4, %xmm5, %xmm1
  9416. vpclmulqdq $0x00, %xmm4, %xmm5, %xmm0
  9417. vpclmulqdq $0x11, %xmm4, %xmm5, %xmm3
  9418. vpxor %xmm1, %xmm2, %xmm2
  9419. vpslldq $8, %xmm2, %xmm1
  9420. vpsrldq $8, %xmm2, %xmm2
  9421. vpxor %xmm1, %xmm0, %xmm7
  9422. vpxor %xmm2, %xmm3, %xmm4
  9423. # ghash_mid
  9424. vpsrld $31, %xmm7, %xmm0
  9425. vpsrld $31, %xmm4, %xmm1
  9426. vpslld $0x01, %xmm7, %xmm7
  9427. vpslld $0x01, %xmm4, %xmm4
  9428. vpsrldq $12, %xmm0, %xmm2
  9429. vpslldq $4, %xmm0, %xmm0
  9430. vpslldq $4, %xmm1, %xmm1
  9431. vpor %xmm2, %xmm4, %xmm4
  9432. vpor %xmm0, %xmm7, %xmm7
  9433. vpor %xmm1, %xmm4, %xmm4
  9434. # ghash_red
  9435. vmovdqu L_aes_gcm_avx2_mod2_128, %xmm2
  9436. vpclmulqdq $16, %xmm2, %xmm7, %xmm0
  9437. vpshufd $0x4e, %xmm7, %xmm1
  9438. vpxor %xmm0, %xmm1, %xmm1
  9439. vpclmulqdq $16, %xmm2, %xmm1, %xmm0
  9440. vpshufd $0x4e, %xmm1, %xmm1
  9441. vpxor %xmm0, %xmm1, %xmm1
  9442. vpxor %xmm1, %xmm4, %xmm4
  9443. L_AES_GCM_encrypt_avx2_calc_iv_done:
  9444. # T = Encrypt counter
  9445. vpxor %xmm0, %xmm0, %xmm0
  9446. shll $3, %edx
  9447. vpinsrd $0x00, %edx, %xmm0, %xmm0
  9448. vpxor %xmm0, %xmm4, %xmm4
  9449. # ghash_gfmul_avx
  9450. vpclmulqdq $16, %xmm4, %xmm5, %xmm2
  9451. vpclmulqdq $0x01, %xmm4, %xmm5, %xmm1
  9452. vpclmulqdq $0x00, %xmm4, %xmm5, %xmm0
  9453. vpclmulqdq $0x11, %xmm4, %xmm5, %xmm3
  9454. vpxor %xmm1, %xmm2, %xmm2
  9455. vpslldq $8, %xmm2, %xmm1
  9456. vpsrldq $8, %xmm2, %xmm2
  9457. vpxor %xmm1, %xmm0, %xmm7
  9458. vpxor %xmm2, %xmm3, %xmm4
  9459. # ghash_mid
  9460. vpsrld $31, %xmm7, %xmm0
  9461. vpsrld $31, %xmm4, %xmm1
  9462. vpslld $0x01, %xmm7, %xmm7
  9463. vpslld $0x01, %xmm4, %xmm4
  9464. vpsrldq $12, %xmm0, %xmm2
  9465. vpslldq $4, %xmm0, %xmm0
  9466. vpslldq $4, %xmm1, %xmm1
  9467. vpor %xmm2, %xmm4, %xmm4
  9468. vpor %xmm0, %xmm7, %xmm7
  9469. vpor %xmm1, %xmm4, %xmm4
  9470. # ghash_red
  9471. vmovdqu L_aes_gcm_avx2_mod2_128, %xmm2
  9472. vpclmulqdq $16, %xmm2, %xmm7, %xmm0
  9473. vpshufd $0x4e, %xmm7, %xmm1
  9474. vpxor %xmm0, %xmm1, %xmm1
  9475. vpclmulqdq $16, %xmm2, %xmm1, %xmm0
  9476. vpshufd $0x4e, %xmm1, %xmm1
  9477. vpxor %xmm0, %xmm1, %xmm1
  9478. vpxor %xmm1, %xmm4, %xmm4
  9479. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm4, %xmm4
  9480. # Encrypt counter
  9481. vmovdqu (%ebp), %xmm6
  9482. vpxor %xmm4, %xmm6, %xmm6
  9483. vaesenc 16(%ebp), %xmm6, %xmm6
  9484. vaesenc 32(%ebp), %xmm6, %xmm6
  9485. vaesenc 48(%ebp), %xmm6, %xmm6
  9486. vaesenc 64(%ebp), %xmm6, %xmm6
  9487. vaesenc 80(%ebp), %xmm6, %xmm6
  9488. vaesenc 96(%ebp), %xmm6, %xmm6
  9489. vaesenc 112(%ebp), %xmm6, %xmm6
  9490. vaesenc 128(%ebp), %xmm6, %xmm6
  9491. vaesenc 144(%ebp), %xmm6, %xmm6
  9492. cmpl $11, 172(%esp)
  9493. vmovdqu 160(%ebp), %xmm0
  9494. jl L_AES_GCM_encrypt_avx2_calc_iv_2_aesenc_avx_last
  9495. vaesenc %xmm0, %xmm6, %xmm6
  9496. vaesenc 176(%ebp), %xmm6, %xmm6
  9497. cmpl $13, 172(%esp)
  9498. vmovdqu 192(%ebp), %xmm0
  9499. jl L_AES_GCM_encrypt_avx2_calc_iv_2_aesenc_avx_last
  9500. vaesenc %xmm0, %xmm6, %xmm6
  9501. vaesenc 208(%ebp), %xmm6, %xmm6
  9502. vmovdqu 224(%ebp), %xmm0
  9503. L_AES_GCM_encrypt_avx2_calc_iv_2_aesenc_avx_last:
  9504. vaesenclast %xmm0, %xmm6, %xmm6
  9505. jmp L_AES_GCM_encrypt_avx2_iv_done
  9506. L_AES_GCM_encrypt_avx2_iv_12:
  9507. # # Calculate values when IV is 12 bytes
  9508. # Set counter based on IV
  9509. vmovdqu L_avx2_aes_gcm_bswap_one, %xmm4
  9510. vmovdqu (%ebp), %xmm5
  9511. vpblendd $7, (%esi), %xmm4, %xmm4
  9512. # H = Encrypt X(=0) and T = Encrypt counter
  9513. vmovdqu 16(%ebp), %xmm7
  9514. vpxor %xmm5, %xmm4, %xmm6
  9515. vaesenc %xmm7, %xmm5, %xmm5
  9516. vaesenc %xmm7, %xmm6, %xmm6
  9517. vmovdqu 32(%ebp), %xmm0
  9518. vaesenc %xmm0, %xmm5, %xmm5
  9519. vaesenc %xmm0, %xmm6, %xmm6
  9520. vmovdqu 48(%ebp), %xmm0
  9521. vaesenc %xmm0, %xmm5, %xmm5
  9522. vaesenc %xmm0, %xmm6, %xmm6
  9523. vmovdqu 64(%ebp), %xmm0
  9524. vaesenc %xmm0, %xmm5, %xmm5
  9525. vaesenc %xmm0, %xmm6, %xmm6
  9526. vmovdqu 80(%ebp), %xmm0
  9527. vaesenc %xmm0, %xmm5, %xmm5
  9528. vaesenc %xmm0, %xmm6, %xmm6
  9529. vmovdqu 96(%ebp), %xmm0
  9530. vaesenc %xmm0, %xmm5, %xmm5
  9531. vaesenc %xmm0, %xmm6, %xmm6
  9532. vmovdqu 112(%ebp), %xmm0
  9533. vaesenc %xmm0, %xmm5, %xmm5
  9534. vaesenc %xmm0, %xmm6, %xmm6
  9535. vmovdqu 128(%ebp), %xmm0
  9536. vaesenc %xmm0, %xmm5, %xmm5
  9537. vaesenc %xmm0, %xmm6, %xmm6
  9538. vmovdqu 144(%ebp), %xmm0
  9539. vaesenc %xmm0, %xmm5, %xmm5
  9540. vaesenc %xmm0, %xmm6, %xmm6
  9541. cmpl $11, 172(%esp)
  9542. vmovdqu 160(%ebp), %xmm0
  9543. jl L_AES_GCM_encrypt_avx2_calc_iv_12_last
  9544. vaesenc %xmm0, %xmm5, %xmm5
  9545. vaesenc %xmm0, %xmm6, %xmm6
  9546. vmovdqu 176(%ebp), %xmm0
  9547. vaesenc %xmm0, %xmm5, %xmm5
  9548. vaesenc %xmm0, %xmm6, %xmm6
  9549. cmpl $13, 172(%esp)
  9550. vmovdqu 192(%ebp), %xmm0
  9551. jl L_AES_GCM_encrypt_avx2_calc_iv_12_last
  9552. vaesenc %xmm0, %xmm5, %xmm5
  9553. vaesenc %xmm0, %xmm6, %xmm6
  9554. vmovdqu 208(%ebp), %xmm0
  9555. vaesenc %xmm0, %xmm5, %xmm5
  9556. vaesenc %xmm0, %xmm6, %xmm6
  9557. vmovdqu 224(%ebp), %xmm0
  9558. L_AES_GCM_encrypt_avx2_calc_iv_12_last:
  9559. vaesenclast %xmm0, %xmm5, %xmm5
  9560. vaesenclast %xmm0, %xmm6, %xmm6
  9561. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm5, %xmm5
  9562. L_AES_GCM_encrypt_avx2_iv_done:
  9563. vmovdqu %xmm6, 80(%esp)
  9564. vpxor %xmm6, %xmm6, %xmm6
  9565. movl 140(%esp), %esi
  9566. # Additional authentication data
  9567. movl 156(%esp), %edx
  9568. cmpl $0x00, %edx
  9569. je L_AES_GCM_encrypt_avx2_calc_aad_done
  9570. xorl %ecx, %ecx
  9571. cmpl $16, %edx
  9572. jl L_AES_GCM_encrypt_avx2_calc_aad_lt16
  9573. andl $0xfffffff0, %edx
  9574. L_AES_GCM_encrypt_avx2_calc_aad_16_loop:
  9575. vmovdqu (%esi,%ecx,1), %xmm0
  9576. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm0, %xmm0
  9577. vpxor %xmm0, %xmm6, %xmm6
  9578. # ghash_gfmul_avx
  9579. vpclmulqdq $16, %xmm6, %xmm5, %xmm2
  9580. vpclmulqdq $0x01, %xmm6, %xmm5, %xmm1
  9581. vpclmulqdq $0x00, %xmm6, %xmm5, %xmm0
  9582. vpclmulqdq $0x11, %xmm6, %xmm5, %xmm3
  9583. vpxor %xmm1, %xmm2, %xmm2
  9584. vpslldq $8, %xmm2, %xmm1
  9585. vpsrldq $8, %xmm2, %xmm2
  9586. vpxor %xmm1, %xmm0, %xmm7
  9587. vpxor %xmm2, %xmm3, %xmm6
  9588. # ghash_mid
  9589. vpsrld $31, %xmm7, %xmm0
  9590. vpsrld $31, %xmm6, %xmm1
  9591. vpslld $0x01, %xmm7, %xmm7
  9592. vpslld $0x01, %xmm6, %xmm6
  9593. vpsrldq $12, %xmm0, %xmm2
  9594. vpslldq $4, %xmm0, %xmm0
  9595. vpslldq $4, %xmm1, %xmm1
  9596. vpor %xmm2, %xmm6, %xmm6
  9597. vpor %xmm0, %xmm7, %xmm7
  9598. vpor %xmm1, %xmm6, %xmm6
  9599. # ghash_red
  9600. vmovdqu L_aes_gcm_avx2_mod2_128, %xmm2
  9601. vpclmulqdq $16, %xmm2, %xmm7, %xmm0
  9602. vpshufd $0x4e, %xmm7, %xmm1
  9603. vpxor %xmm0, %xmm1, %xmm1
  9604. vpclmulqdq $16, %xmm2, %xmm1, %xmm0
  9605. vpshufd $0x4e, %xmm1, %xmm1
  9606. vpxor %xmm0, %xmm1, %xmm1
  9607. vpxor %xmm1, %xmm6, %xmm6
  9608. addl $16, %ecx
  9609. cmpl %edx, %ecx
  9610. jl L_AES_GCM_encrypt_avx2_calc_aad_16_loop
  9611. movl 156(%esp), %edx
  9612. cmpl %edx, %ecx
  9613. je L_AES_GCM_encrypt_avx2_calc_aad_done
  9614. L_AES_GCM_encrypt_avx2_calc_aad_lt16:
  9615. vpxor %xmm0, %xmm0, %xmm0
  9616. xorl %ebx, %ebx
  9617. vmovdqu %xmm0, (%esp)
  9618. L_AES_GCM_encrypt_avx2_calc_aad_loop:
  9619. movzbl (%esi,%ecx,1), %eax
  9620. movb %al, (%esp,%ebx,1)
  9621. incl %ecx
  9622. incl %ebx
  9623. cmpl %edx, %ecx
  9624. jl L_AES_GCM_encrypt_avx2_calc_aad_loop
  9625. vmovdqu (%esp), %xmm0
  9626. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm0, %xmm0
  9627. vpxor %xmm0, %xmm6, %xmm6
  9628. # ghash_gfmul_avx
  9629. vpclmulqdq $16, %xmm6, %xmm5, %xmm2
  9630. vpclmulqdq $0x01, %xmm6, %xmm5, %xmm1
  9631. vpclmulqdq $0x00, %xmm6, %xmm5, %xmm0
  9632. vpclmulqdq $0x11, %xmm6, %xmm5, %xmm3
  9633. vpxor %xmm1, %xmm2, %xmm2
  9634. vpslldq $8, %xmm2, %xmm1
  9635. vpsrldq $8, %xmm2, %xmm2
  9636. vpxor %xmm1, %xmm0, %xmm7
  9637. vpxor %xmm2, %xmm3, %xmm6
  9638. # ghash_mid
  9639. vpsrld $31, %xmm7, %xmm0
  9640. vpsrld $31, %xmm6, %xmm1
  9641. vpslld $0x01, %xmm7, %xmm7
  9642. vpslld $0x01, %xmm6, %xmm6
  9643. vpsrldq $12, %xmm0, %xmm2
  9644. vpslldq $4, %xmm0, %xmm0
  9645. vpslldq $4, %xmm1, %xmm1
  9646. vpor %xmm2, %xmm6, %xmm6
  9647. vpor %xmm0, %xmm7, %xmm7
  9648. vpor %xmm1, %xmm6, %xmm6
  9649. # ghash_red
  9650. vmovdqu L_aes_gcm_avx2_mod2_128, %xmm2
  9651. vpclmulqdq $16, %xmm2, %xmm7, %xmm0
  9652. vpshufd $0x4e, %xmm7, %xmm1
  9653. vpxor %xmm0, %xmm1, %xmm1
  9654. vpclmulqdq $16, %xmm2, %xmm1, %xmm0
  9655. vpshufd $0x4e, %xmm1, %xmm1
  9656. vpxor %xmm0, %xmm1, %xmm1
  9657. vpxor %xmm1, %xmm6, %xmm6
  9658. L_AES_GCM_encrypt_avx2_calc_aad_done:
  9659. movl 132(%esp), %esi
  9660. movl 136(%esp), %edi
  9661. # Calculate counter and H
  9662. vpsrlq $63, %xmm5, %xmm1
  9663. vpsllq $0x01, %xmm5, %xmm0
  9664. vpslldq $8, %xmm1, %xmm1
  9665. vpor %xmm1, %xmm0, %xmm0
  9666. vpshufd $0xff, %xmm5, %xmm5
  9667. vpsrad $31, %xmm5, %xmm5
  9668. vpshufb L_aes_gcm_avx2_bswap_epi64, %xmm4, %xmm4
  9669. vpand L_aes_gcm_avx2_mod2_128, %xmm5, %xmm5
  9670. vpaddd L_aes_gcm_avx2_one, %xmm4, %xmm4
  9671. vpxor %xmm0, %xmm5, %xmm5
  9672. xorl %ebx, %ebx
  9673. cmpl $0x40, 152(%esp)
  9674. movl 152(%esp), %eax
  9675. jl L_AES_GCM_encrypt_avx2_done_64
  9676. andl $0xffffffc0, %eax
  9677. vmovdqu %xmm4, 64(%esp)
  9678. vmovdqu %xmm6, 96(%esp)
  9679. vmovdqu L_aes_gcm_avx2_mod2_128, %xmm3
  9680. # H ^ 1
  9681. vmovdqu %xmm5, (%esp)
  9682. vmovdqu %xmm5, %xmm2
  9683. # H ^ 2
  9684. vpclmulqdq $0x00, %xmm2, %xmm2, %xmm5
  9685. vpclmulqdq $0x11, %xmm2, %xmm2, %xmm6
  9686. vpclmulqdq $16, %xmm3, %xmm5, %xmm4
  9687. vpshufd $0x4e, %xmm5, %xmm5
  9688. vpxor %xmm4, %xmm5, %xmm5
  9689. vpclmulqdq $16, %xmm3, %xmm5, %xmm4
  9690. vpshufd $0x4e, %xmm5, %xmm5
  9691. vpxor %xmm4, %xmm5, %xmm5
  9692. vpxor %xmm5, %xmm6, %xmm0
  9693. vmovdqu %xmm0, 16(%esp)
  9694. # H ^ 3
  9695. # ghash_gfmul_red
  9696. vpclmulqdq $16, %xmm0, %xmm2, %xmm6
  9697. vpclmulqdq $0x01, %xmm0, %xmm2, %xmm5
  9698. vpclmulqdq $0x00, %xmm0, %xmm2, %xmm4
  9699. vpxor %xmm5, %xmm6, %xmm6
  9700. vpslldq $8, %xmm6, %xmm5
  9701. vpsrldq $8, %xmm6, %xmm6
  9702. vpxor %xmm4, %xmm5, %xmm5
  9703. vpclmulqdq $0x11, %xmm0, %xmm2, %xmm1
  9704. vpclmulqdq $16, %xmm3, %xmm5, %xmm4
  9705. vpshufd $0x4e, %xmm5, %xmm5
  9706. vpxor %xmm4, %xmm5, %xmm5
  9707. vpclmulqdq $16, %xmm3, %xmm5, %xmm4
  9708. vpshufd $0x4e, %xmm5, %xmm5
  9709. vpxor %xmm6, %xmm1, %xmm1
  9710. vpxor %xmm5, %xmm1, %xmm1
  9711. vpxor %xmm4, %xmm1, %xmm1
  9712. vmovdqu %xmm1, 32(%esp)
  9713. # H ^ 4
  9714. vpclmulqdq $0x00, %xmm0, %xmm0, %xmm5
  9715. vpclmulqdq $0x11, %xmm0, %xmm0, %xmm6
  9716. vpclmulqdq $16, %xmm3, %xmm5, %xmm4
  9717. vpshufd $0x4e, %xmm5, %xmm5
  9718. vpxor %xmm4, %xmm5, %xmm5
  9719. vpclmulqdq $16, %xmm3, %xmm5, %xmm4
  9720. vpshufd $0x4e, %xmm5, %xmm5
  9721. vpxor %xmm4, %xmm5, %xmm5
  9722. vpxor %xmm5, %xmm6, %xmm2
  9723. vmovdqu %xmm2, 48(%esp)
  9724. vmovdqu 96(%esp), %xmm6
  9725. # First 64 bytes of input
  9726. # aesenc_64
  9727. # aesenc_ctr
  9728. vmovdqu 64(%esp), %xmm4
  9729. vmovdqu L_aes_gcm_avx2_bswap_epi64, %xmm7
  9730. vpaddd L_aes_gcm_avx2_one, %xmm4, %xmm1
  9731. vpshufb %xmm7, %xmm4, %xmm0
  9732. vpaddd L_aes_gcm_avx2_two, %xmm4, %xmm2
  9733. vpshufb %xmm7, %xmm1, %xmm1
  9734. vpaddd L_aes_gcm_avx2_three, %xmm4, %xmm3
  9735. vpshufb %xmm7, %xmm2, %xmm2
  9736. vpaddd L_aes_gcm_avx2_four, %xmm4, %xmm4
  9737. vpshufb %xmm7, %xmm3, %xmm3
  9738. # aesenc_xor
  9739. vmovdqu (%ebp), %xmm7
  9740. vmovdqu %xmm4, 64(%esp)
  9741. vpxor %xmm7, %xmm0, %xmm0
  9742. vpxor %xmm7, %xmm1, %xmm1
  9743. vpxor %xmm7, %xmm2, %xmm2
  9744. vpxor %xmm7, %xmm3, %xmm3
  9745. vmovdqu 16(%ebp), %xmm7
  9746. vaesenc %xmm7, %xmm0, %xmm0
  9747. vaesenc %xmm7, %xmm1, %xmm1
  9748. vaesenc %xmm7, %xmm2, %xmm2
  9749. vaesenc %xmm7, %xmm3, %xmm3
  9750. vmovdqu 32(%ebp), %xmm7
  9751. vaesenc %xmm7, %xmm0, %xmm0
  9752. vaesenc %xmm7, %xmm1, %xmm1
  9753. vaesenc %xmm7, %xmm2, %xmm2
  9754. vaesenc %xmm7, %xmm3, %xmm3
  9755. vmovdqu 48(%ebp), %xmm7
  9756. vaesenc %xmm7, %xmm0, %xmm0
  9757. vaesenc %xmm7, %xmm1, %xmm1
  9758. vaesenc %xmm7, %xmm2, %xmm2
  9759. vaesenc %xmm7, %xmm3, %xmm3
  9760. vmovdqu 64(%ebp), %xmm7
  9761. vaesenc %xmm7, %xmm0, %xmm0
  9762. vaesenc %xmm7, %xmm1, %xmm1
  9763. vaesenc %xmm7, %xmm2, %xmm2
  9764. vaesenc %xmm7, %xmm3, %xmm3
  9765. vmovdqu 80(%ebp), %xmm7
  9766. vaesenc %xmm7, %xmm0, %xmm0
  9767. vaesenc %xmm7, %xmm1, %xmm1
  9768. vaesenc %xmm7, %xmm2, %xmm2
  9769. vaesenc %xmm7, %xmm3, %xmm3
  9770. vmovdqu 96(%ebp), %xmm7
  9771. vaesenc %xmm7, %xmm0, %xmm0
  9772. vaesenc %xmm7, %xmm1, %xmm1
  9773. vaesenc %xmm7, %xmm2, %xmm2
  9774. vaesenc %xmm7, %xmm3, %xmm3
  9775. vmovdqu 112(%ebp), %xmm7
  9776. vaesenc %xmm7, %xmm0, %xmm0
  9777. vaesenc %xmm7, %xmm1, %xmm1
  9778. vaesenc %xmm7, %xmm2, %xmm2
  9779. vaesenc %xmm7, %xmm3, %xmm3
  9780. vmovdqu 128(%ebp), %xmm7
  9781. vaesenc %xmm7, %xmm0, %xmm0
  9782. vaesenc %xmm7, %xmm1, %xmm1
  9783. vaesenc %xmm7, %xmm2, %xmm2
  9784. vaesenc %xmm7, %xmm3, %xmm3
  9785. vmovdqu 144(%ebp), %xmm7
  9786. vaesenc %xmm7, %xmm0, %xmm0
  9787. vaesenc %xmm7, %xmm1, %xmm1
  9788. vaesenc %xmm7, %xmm2, %xmm2
  9789. vaesenc %xmm7, %xmm3, %xmm3
  9790. cmpl $11, 172(%esp)
  9791. vmovdqu 160(%ebp), %xmm7
  9792. jl L_AES_GCM_encrypt_avx2_aesenc_64_enc_done
  9793. vaesenc %xmm7, %xmm0, %xmm0
  9794. vaesenc %xmm7, %xmm1, %xmm1
  9795. vaesenc %xmm7, %xmm2, %xmm2
  9796. vaesenc %xmm7, %xmm3, %xmm3
  9797. vmovdqu 176(%ebp), %xmm7
  9798. vaesenc %xmm7, %xmm0, %xmm0
  9799. vaesenc %xmm7, %xmm1, %xmm1
  9800. vaesenc %xmm7, %xmm2, %xmm2
  9801. vaesenc %xmm7, %xmm3, %xmm3
  9802. cmpl $13, 172(%esp)
  9803. vmovdqu 192(%ebp), %xmm7
  9804. jl L_AES_GCM_encrypt_avx2_aesenc_64_enc_done
  9805. vaesenc %xmm7, %xmm0, %xmm0
  9806. vaesenc %xmm7, %xmm1, %xmm1
  9807. vaesenc %xmm7, %xmm2, %xmm2
  9808. vaesenc %xmm7, %xmm3, %xmm3
  9809. vmovdqu 208(%ebp), %xmm7
  9810. vaesenc %xmm7, %xmm0, %xmm0
  9811. vaesenc %xmm7, %xmm1, %xmm1
  9812. vaesenc %xmm7, %xmm2, %xmm2
  9813. vaesenc %xmm7, %xmm3, %xmm3
  9814. vmovdqu 224(%ebp), %xmm7
  9815. L_AES_GCM_encrypt_avx2_aesenc_64_enc_done:
  9816. # aesenc_last
  9817. vaesenclast %xmm7, %xmm0, %xmm0
  9818. vaesenclast %xmm7, %xmm1, %xmm1
  9819. vaesenclast %xmm7, %xmm2, %xmm2
  9820. vaesenclast %xmm7, %xmm3, %xmm3
  9821. vmovdqu (%esi), %xmm7
  9822. vmovdqu 16(%esi), %xmm4
  9823. vpxor %xmm7, %xmm0, %xmm0
  9824. vpxor %xmm4, %xmm1, %xmm1
  9825. vmovdqu %xmm0, (%edi)
  9826. vmovdqu %xmm1, 16(%edi)
  9827. vmovdqu 32(%esi), %xmm7
  9828. vmovdqu 48(%esi), %xmm4
  9829. vpxor %xmm7, %xmm2, %xmm2
  9830. vpxor %xmm4, %xmm3, %xmm3
  9831. vmovdqu %xmm2, 32(%edi)
  9832. vmovdqu %xmm3, 48(%edi)
  9833. cmpl $0x40, %eax
  9834. movl $0x40, %ebx
  9835. movl %esi, %ecx
  9836. movl %edi, %edx
  9837. jle L_AES_GCM_encrypt_avx2_end_64
  9838. # More 64 bytes of input
  9839. L_AES_GCM_encrypt_avx2_ghash_64:
  9840. # aesenc_64_ghash
  9841. leal (%esi,%ebx,1), %ecx
  9842. leal (%edi,%ebx,1), %edx
  9843. # aesenc_64
  9844. # aesenc_ctr
  9845. vmovdqu 64(%esp), %xmm4
  9846. vmovdqu L_aes_gcm_avx2_bswap_epi64, %xmm7
  9847. vpaddd L_aes_gcm_avx2_one, %xmm4, %xmm1
  9848. vpshufb %xmm7, %xmm4, %xmm0
  9849. vpaddd L_aes_gcm_avx2_two, %xmm4, %xmm2
  9850. vpshufb %xmm7, %xmm1, %xmm1
  9851. vpaddd L_aes_gcm_avx2_three, %xmm4, %xmm3
  9852. vpshufb %xmm7, %xmm2, %xmm2
  9853. vpaddd L_aes_gcm_avx2_four, %xmm4, %xmm4
  9854. vpshufb %xmm7, %xmm3, %xmm3
  9855. # aesenc_xor
  9856. vmovdqu (%ebp), %xmm7
  9857. vmovdqu %xmm4, 64(%esp)
  9858. vpxor %xmm7, %xmm0, %xmm0
  9859. vpxor %xmm7, %xmm1, %xmm1
  9860. vpxor %xmm7, %xmm2, %xmm2
  9861. vpxor %xmm7, %xmm3, %xmm3
  9862. vmovdqu 16(%ebp), %xmm7
  9863. vaesenc %xmm7, %xmm0, %xmm0
  9864. vaesenc %xmm7, %xmm1, %xmm1
  9865. vaesenc %xmm7, %xmm2, %xmm2
  9866. vaesenc %xmm7, %xmm3, %xmm3
  9867. vmovdqu 32(%ebp), %xmm7
  9868. vaesenc %xmm7, %xmm0, %xmm0
  9869. vaesenc %xmm7, %xmm1, %xmm1
  9870. vaesenc %xmm7, %xmm2, %xmm2
  9871. vaesenc %xmm7, %xmm3, %xmm3
  9872. vmovdqu 48(%ebp), %xmm7
  9873. vaesenc %xmm7, %xmm0, %xmm0
  9874. vaesenc %xmm7, %xmm1, %xmm1
  9875. vaesenc %xmm7, %xmm2, %xmm2
  9876. vaesenc %xmm7, %xmm3, %xmm3
  9877. vmovdqu 64(%ebp), %xmm7
  9878. vaesenc %xmm7, %xmm0, %xmm0
  9879. vaesenc %xmm7, %xmm1, %xmm1
  9880. vaesenc %xmm7, %xmm2, %xmm2
  9881. vaesenc %xmm7, %xmm3, %xmm3
  9882. vmovdqu 80(%ebp), %xmm7
  9883. vaesenc %xmm7, %xmm0, %xmm0
  9884. vaesenc %xmm7, %xmm1, %xmm1
  9885. vaesenc %xmm7, %xmm2, %xmm2
  9886. vaesenc %xmm7, %xmm3, %xmm3
  9887. vmovdqu 96(%ebp), %xmm7
  9888. vaesenc %xmm7, %xmm0, %xmm0
  9889. vaesenc %xmm7, %xmm1, %xmm1
  9890. vaesenc %xmm7, %xmm2, %xmm2
  9891. vaesenc %xmm7, %xmm3, %xmm3
  9892. vmovdqu 112(%ebp), %xmm7
  9893. vaesenc %xmm7, %xmm0, %xmm0
  9894. vaesenc %xmm7, %xmm1, %xmm1
  9895. vaesenc %xmm7, %xmm2, %xmm2
  9896. vaesenc %xmm7, %xmm3, %xmm3
  9897. vmovdqu 128(%ebp), %xmm7
  9898. vaesenc %xmm7, %xmm0, %xmm0
  9899. vaesenc %xmm7, %xmm1, %xmm1
  9900. vaesenc %xmm7, %xmm2, %xmm2
  9901. vaesenc %xmm7, %xmm3, %xmm3
  9902. vmovdqu 144(%ebp), %xmm7
  9903. vaesenc %xmm7, %xmm0, %xmm0
  9904. vaesenc %xmm7, %xmm1, %xmm1
  9905. vaesenc %xmm7, %xmm2, %xmm2
  9906. vaesenc %xmm7, %xmm3, %xmm3
  9907. cmpl $11, 172(%esp)
  9908. vmovdqu 160(%ebp), %xmm7
  9909. jl L_AES_GCM_encrypt_avx2_aesenc_64_ghash_aesenc_64_enc_done
  9910. vaesenc %xmm7, %xmm0, %xmm0
  9911. vaesenc %xmm7, %xmm1, %xmm1
  9912. vaesenc %xmm7, %xmm2, %xmm2
  9913. vaesenc %xmm7, %xmm3, %xmm3
  9914. vmovdqu 176(%ebp), %xmm7
  9915. vaesenc %xmm7, %xmm0, %xmm0
  9916. vaesenc %xmm7, %xmm1, %xmm1
  9917. vaesenc %xmm7, %xmm2, %xmm2
  9918. vaesenc %xmm7, %xmm3, %xmm3
  9919. cmpl $13, 172(%esp)
  9920. vmovdqu 192(%ebp), %xmm7
  9921. jl L_AES_GCM_encrypt_avx2_aesenc_64_ghash_aesenc_64_enc_done
  9922. vaesenc %xmm7, %xmm0, %xmm0
  9923. vaesenc %xmm7, %xmm1, %xmm1
  9924. vaesenc %xmm7, %xmm2, %xmm2
  9925. vaesenc %xmm7, %xmm3, %xmm3
  9926. vmovdqu 208(%ebp), %xmm7
  9927. vaesenc %xmm7, %xmm0, %xmm0
  9928. vaesenc %xmm7, %xmm1, %xmm1
  9929. vaesenc %xmm7, %xmm2, %xmm2
  9930. vaesenc %xmm7, %xmm3, %xmm3
  9931. vmovdqu 224(%ebp), %xmm7
  9932. L_AES_GCM_encrypt_avx2_aesenc_64_ghash_aesenc_64_enc_done:
  9933. # aesenc_last
  9934. vaesenclast %xmm7, %xmm0, %xmm0
  9935. vaesenclast %xmm7, %xmm1, %xmm1
  9936. vaesenclast %xmm7, %xmm2, %xmm2
  9937. vaesenclast %xmm7, %xmm3, %xmm3
  9938. vmovdqu (%ecx), %xmm7
  9939. vmovdqu 16(%ecx), %xmm4
  9940. vpxor %xmm7, %xmm0, %xmm0
  9941. vpxor %xmm4, %xmm1, %xmm1
  9942. vmovdqu %xmm0, (%edx)
  9943. vmovdqu %xmm1, 16(%edx)
  9944. vmovdqu 32(%ecx), %xmm7
  9945. vmovdqu 48(%ecx), %xmm4
  9946. vpxor %xmm7, %xmm2, %xmm2
  9947. vpxor %xmm4, %xmm3, %xmm3
  9948. vmovdqu %xmm2, 32(%edx)
  9949. vmovdqu %xmm3, 48(%edx)
  9950. # pclmul_1
  9951. vmovdqu -64(%edx), %xmm1
  9952. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm1, %xmm1
  9953. vmovdqu 48(%esp), %xmm2
  9954. vpxor %xmm6, %xmm1, %xmm1
  9955. vpclmulqdq $16, %xmm2, %xmm1, %xmm5
  9956. vpclmulqdq $0x01, %xmm2, %xmm1, %xmm3
  9957. vpclmulqdq $0x00, %xmm2, %xmm1, %xmm6
  9958. vpclmulqdq $0x11, %xmm2, %xmm1, %xmm7
  9959. # pclmul_2
  9960. vmovdqu -48(%edx), %xmm1
  9961. vmovdqu 32(%esp), %xmm0
  9962. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm1, %xmm1
  9963. vpxor %xmm3, %xmm5, %xmm5
  9964. vpclmulqdq $16, %xmm0, %xmm1, %xmm2
  9965. vpclmulqdq $0x01, %xmm0, %xmm1, %xmm3
  9966. vpclmulqdq $0x00, %xmm0, %xmm1, %xmm4
  9967. vpclmulqdq $0x11, %xmm0, %xmm1, %xmm1
  9968. vpxor %xmm1, %xmm7, %xmm7
  9969. # pclmul_n
  9970. vmovdqu -32(%edx), %xmm1
  9971. vmovdqu 16(%esp), %xmm0
  9972. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm1, %xmm1
  9973. vpxor %xmm2, %xmm5, %xmm5
  9974. vpclmulqdq $16, %xmm0, %xmm1, %xmm2
  9975. vpxor %xmm3, %xmm5, %xmm5
  9976. vpclmulqdq $0x01, %xmm0, %xmm1, %xmm3
  9977. vpxor %xmm4, %xmm6, %xmm6
  9978. vpclmulqdq $0x00, %xmm0, %xmm1, %xmm4
  9979. vpclmulqdq $0x11, %xmm0, %xmm1, %xmm1
  9980. vpxor %xmm1, %xmm7, %xmm7
  9981. # pclmul_n
  9982. vmovdqu -16(%edx), %xmm1
  9983. vmovdqu (%esp), %xmm0
  9984. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm1, %xmm1
  9985. vpxor %xmm2, %xmm5, %xmm5
  9986. vpclmulqdq $16, %xmm0, %xmm1, %xmm2
  9987. vpxor %xmm3, %xmm5, %xmm5
  9988. vpclmulqdq $0x01, %xmm0, %xmm1, %xmm3
  9989. vpxor %xmm4, %xmm6, %xmm6
  9990. vpclmulqdq $0x00, %xmm0, %xmm1, %xmm4
  9991. vpclmulqdq $0x11, %xmm0, %xmm1, %xmm1
  9992. vpxor %xmm1, %xmm7, %xmm7
  9993. # aesenc_pclmul_l
  9994. vpxor %xmm2, %xmm5, %xmm5
  9995. vpxor %xmm4, %xmm6, %xmm6
  9996. vpxor %xmm3, %xmm5, %xmm5
  9997. vpslldq $8, %xmm5, %xmm1
  9998. vpsrldq $8, %xmm5, %xmm5
  9999. vmovdqu L_aes_gcm_avx2_mod2_128, %xmm0
  10000. vpxor %xmm1, %xmm6, %xmm6
  10001. vpxor %xmm5, %xmm7, %xmm7
  10002. vpclmulqdq $16, %xmm0, %xmm6, %xmm3
  10003. vpshufd $0x4e, %xmm6, %xmm6
  10004. vpxor %xmm3, %xmm6, %xmm6
  10005. vpclmulqdq $16, %xmm0, %xmm6, %xmm3
  10006. vpshufd $0x4e, %xmm6, %xmm6
  10007. vpxor %xmm3, %xmm6, %xmm6
  10008. vpxor %xmm7, %xmm6, %xmm6
  10009. # aesenc_64_ghash - end
  10010. addl $0x40, %ebx
  10011. cmpl %eax, %ebx
  10012. jl L_AES_GCM_encrypt_avx2_ghash_64
  10013. L_AES_GCM_encrypt_avx2_end_64:
  10014. vmovdqu %xmm6, 96(%esp)
  10015. vmovdqu 48(%edx), %xmm3
  10016. vmovdqu (%esp), %xmm7
  10017. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm3, %xmm3
  10018. vpclmulqdq $16, %xmm3, %xmm7, %xmm5
  10019. vpclmulqdq $0x01, %xmm3, %xmm7, %xmm1
  10020. vpclmulqdq $0x00, %xmm3, %xmm7, %xmm4
  10021. vpclmulqdq $0x11, %xmm3, %xmm7, %xmm6
  10022. vpxor %xmm1, %xmm5, %xmm5
  10023. vmovdqu 32(%edx), %xmm3
  10024. vmovdqu 16(%esp), %xmm7
  10025. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm3, %xmm3
  10026. vpclmulqdq $16, %xmm3, %xmm7, %xmm2
  10027. vpclmulqdq $0x01, %xmm3, %xmm7, %xmm1
  10028. vpclmulqdq $0x00, %xmm3, %xmm7, %xmm0
  10029. vpclmulqdq $0x11, %xmm3, %xmm7, %xmm3
  10030. vpxor %xmm1, %xmm2, %xmm2
  10031. vpxor %xmm3, %xmm6, %xmm6
  10032. vpxor %xmm2, %xmm5, %xmm5
  10033. vpxor %xmm0, %xmm4, %xmm4
  10034. vmovdqu 16(%edx), %xmm3
  10035. vmovdqu 32(%esp), %xmm7
  10036. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm3, %xmm3
  10037. vpclmulqdq $16, %xmm3, %xmm7, %xmm2
  10038. vpclmulqdq $0x01, %xmm3, %xmm7, %xmm1
  10039. vpclmulqdq $0x00, %xmm3, %xmm7, %xmm0
  10040. vpclmulqdq $0x11, %xmm3, %xmm7, %xmm3
  10041. vpxor %xmm1, %xmm2, %xmm2
  10042. vpxor %xmm3, %xmm6, %xmm6
  10043. vpxor %xmm2, %xmm5, %xmm5
  10044. vpxor %xmm0, %xmm4, %xmm4
  10045. vmovdqu 96(%esp), %xmm0
  10046. vmovdqu (%edx), %xmm3
  10047. vmovdqu 48(%esp), %xmm7
  10048. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm3, %xmm3
  10049. vpxor %xmm0, %xmm3, %xmm3
  10050. vpclmulqdq $16, %xmm3, %xmm7, %xmm2
  10051. vpclmulqdq $0x01, %xmm3, %xmm7, %xmm1
  10052. vpclmulqdq $0x00, %xmm3, %xmm7, %xmm0
  10053. vpclmulqdq $0x11, %xmm3, %xmm7, %xmm3
  10054. vpxor %xmm1, %xmm2, %xmm2
  10055. vpxor %xmm3, %xmm6, %xmm6
  10056. vpxor %xmm2, %xmm5, %xmm5
  10057. vpxor %xmm0, %xmm4, %xmm4
  10058. vpslldq $8, %xmm5, %xmm7
  10059. vpsrldq $8, %xmm5, %xmm5
  10060. vpxor %xmm7, %xmm4, %xmm4
  10061. vpxor %xmm5, %xmm6, %xmm6
  10062. # ghash_red
  10063. vmovdqu L_aes_gcm_avx2_mod2_128, %xmm2
  10064. vpclmulqdq $16, %xmm2, %xmm4, %xmm0
  10065. vpshufd $0x4e, %xmm4, %xmm1
  10066. vpxor %xmm0, %xmm1, %xmm1
  10067. vpclmulqdq $16, %xmm2, %xmm1, %xmm0
  10068. vpshufd $0x4e, %xmm1, %xmm1
  10069. vpxor %xmm0, %xmm1, %xmm1
  10070. vpxor %xmm1, %xmm6, %xmm6
  10071. vmovdqu (%esp), %xmm5
  10072. vmovdqu 64(%esp), %xmm4
  10073. L_AES_GCM_encrypt_avx2_done_64:
  10074. cmpl 152(%esp), %ebx
  10075. je L_AES_GCM_encrypt_avx2_done_enc
  10076. movl 152(%esp), %eax
  10077. andl $0xfffffff0, %eax
  10078. cmpl %eax, %ebx
  10079. jge L_AES_GCM_encrypt_avx2_last_block_done
  10080. leal (%esi,%ebx,1), %ecx
  10081. leal (%edi,%ebx,1), %edx
  10082. # aesenc_block
  10083. vmovdqu %xmm4, %xmm1
  10084. vpshufb L_aes_gcm_avx2_bswap_epi64, %xmm1, %xmm0
  10085. vpaddd L_aes_gcm_avx2_one, %xmm1, %xmm1
  10086. vpxor (%ebp), %xmm0, %xmm0
  10087. vaesenc 16(%ebp), %xmm0, %xmm0
  10088. vaesenc 32(%ebp), %xmm0, %xmm0
  10089. vaesenc 48(%ebp), %xmm0, %xmm0
  10090. vaesenc 64(%ebp), %xmm0, %xmm0
  10091. vaesenc 80(%ebp), %xmm0, %xmm0
  10092. vaesenc 96(%ebp), %xmm0, %xmm0
  10093. vaesenc 112(%ebp), %xmm0, %xmm0
  10094. vaesenc 128(%ebp), %xmm0, %xmm0
  10095. vaesenc 144(%ebp), %xmm0, %xmm0
  10096. cmpl $11, 172(%esp)
  10097. vmovdqu 160(%ebp), %xmm2
  10098. jl L_AES_GCM_encrypt_avx2_aesenc_block_aesenc_avx_last
  10099. vaesenc %xmm2, %xmm0, %xmm0
  10100. vaesenc 176(%ebp), %xmm0, %xmm0
  10101. cmpl $13, 172(%esp)
  10102. vmovdqu 192(%ebp), %xmm2
  10103. jl L_AES_GCM_encrypt_avx2_aesenc_block_aesenc_avx_last
  10104. vaesenc %xmm2, %xmm0, %xmm0
  10105. vaesenc 208(%ebp), %xmm0, %xmm0
  10106. vmovdqu 224(%ebp), %xmm2
  10107. L_AES_GCM_encrypt_avx2_aesenc_block_aesenc_avx_last:
  10108. vaesenclast %xmm2, %xmm0, %xmm0
  10109. vmovdqu %xmm1, %xmm4
  10110. vmovdqu (%ecx), %xmm1
  10111. vpxor %xmm1, %xmm0, %xmm0
  10112. vmovdqu %xmm0, (%edx)
  10113. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm0, %xmm0
  10114. vpxor %xmm0, %xmm6, %xmm6
  10115. addl $16, %ebx
  10116. cmpl %eax, %ebx
  10117. jge L_AES_GCM_encrypt_avx2_last_block_ghash
  10118. L_AES_GCM_encrypt_avx2_last_block_start:
  10119. vpshufb L_aes_gcm_avx2_bswap_epi64, %xmm4, %xmm7
  10120. vpaddd L_aes_gcm_avx2_one, %xmm4, %xmm4
  10121. vmovdqu %xmm4, 64(%esp)
  10122. # aesenc_gfmul_sb
  10123. vpclmulqdq $0x01, %xmm5, %xmm6, %xmm2
  10124. vpclmulqdq $16, %xmm5, %xmm6, %xmm3
  10125. vpclmulqdq $0x00, %xmm5, %xmm6, %xmm1
  10126. vpclmulqdq $0x11, %xmm5, %xmm6, %xmm4
  10127. vpxor (%ebp), %xmm7, %xmm7
  10128. vaesenc 16(%ebp), %xmm7, %xmm7
  10129. vpxor %xmm2, %xmm3, %xmm3
  10130. vpslldq $8, %xmm3, %xmm2
  10131. vpsrldq $8, %xmm3, %xmm3
  10132. vaesenc 32(%ebp), %xmm7, %xmm7
  10133. vpxor %xmm1, %xmm2, %xmm2
  10134. vpclmulqdq $16, L_aes_gcm_avx2_mod2_128, %xmm2, %xmm1
  10135. vaesenc 48(%ebp), %xmm7, %xmm7
  10136. vaesenc 64(%ebp), %xmm7, %xmm7
  10137. vaesenc 80(%ebp), %xmm7, %xmm7
  10138. vpshufd $0x4e, %xmm2, %xmm2
  10139. vpxor %xmm1, %xmm2, %xmm2
  10140. vpclmulqdq $16, L_aes_gcm_avx2_mod2_128, %xmm2, %xmm1
  10141. vaesenc 96(%ebp), %xmm7, %xmm7
  10142. vaesenc 112(%ebp), %xmm7, %xmm7
  10143. vaesenc 128(%ebp), %xmm7, %xmm7
  10144. vpshufd $0x4e, %xmm2, %xmm2
  10145. vaesenc 144(%ebp), %xmm7, %xmm7
  10146. vpxor %xmm3, %xmm4, %xmm4
  10147. vpxor %xmm4, %xmm2, %xmm2
  10148. vmovdqu 160(%ebp), %xmm0
  10149. cmpl $11, 172(%esp)
  10150. jl L_AES_GCM_encrypt_avx2_aesenc_gfmul_sb_last
  10151. vaesenc %xmm0, %xmm7, %xmm7
  10152. vaesenc 176(%ebp), %xmm7, %xmm7
  10153. vmovdqu 192(%ebp), %xmm0
  10154. cmpl $13, 172(%esp)
  10155. jl L_AES_GCM_encrypt_avx2_aesenc_gfmul_sb_last
  10156. vaesenc %xmm0, %xmm7, %xmm7
  10157. vaesenc 208(%ebp), %xmm7, %xmm7
  10158. vmovdqu 224(%ebp), %xmm0
  10159. L_AES_GCM_encrypt_avx2_aesenc_gfmul_sb_last:
  10160. vaesenclast %xmm0, %xmm7, %xmm7
  10161. vmovdqu (%esi,%ebx,1), %xmm3
  10162. vpxor %xmm1, %xmm2, %xmm6
  10163. vpxor %xmm3, %xmm7, %xmm7
  10164. vmovdqu %xmm7, (%edi,%ebx,1)
  10165. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm7, %xmm7
  10166. vpxor %xmm7, %xmm6, %xmm6
  10167. vmovdqu 64(%esp), %xmm4
  10168. addl $16, %ebx
  10169. cmpl %eax, %ebx
  10170. jl L_AES_GCM_encrypt_avx2_last_block_start
  10171. L_AES_GCM_encrypt_avx2_last_block_ghash:
  10172. # ghash_gfmul_red
  10173. vpclmulqdq $16, %xmm5, %xmm6, %xmm2
  10174. vpclmulqdq $0x01, %xmm5, %xmm6, %xmm1
  10175. vpclmulqdq $0x00, %xmm5, %xmm6, %xmm0
  10176. vpxor %xmm1, %xmm2, %xmm2
  10177. vpslldq $8, %xmm2, %xmm1
  10178. vpsrldq $8, %xmm2, %xmm2
  10179. vpxor %xmm0, %xmm1, %xmm1
  10180. vpclmulqdq $0x11, %xmm5, %xmm6, %xmm6
  10181. vpclmulqdq $16, L_aes_gcm_avx2_mod2_128, %xmm1, %xmm0
  10182. vpshufd $0x4e, %xmm1, %xmm1
  10183. vpxor %xmm0, %xmm1, %xmm1
  10184. vpclmulqdq $16, L_aes_gcm_avx2_mod2_128, %xmm1, %xmm0
  10185. vpshufd $0x4e, %xmm1, %xmm1
  10186. vpxor %xmm2, %xmm6, %xmm6
  10187. vpxor %xmm1, %xmm6, %xmm6
  10188. vpxor %xmm0, %xmm6, %xmm6
  10189. L_AES_GCM_encrypt_avx2_last_block_done:
  10190. movl 152(%esp), %ecx
  10191. movl 152(%esp), %edx
  10192. andl $15, %ecx
  10193. jz L_AES_GCM_encrypt_avx2_done_enc
  10194. # aesenc_last15_enc
  10195. vpshufb L_aes_gcm_avx2_bswap_epi64, %xmm4, %xmm4
  10196. vpxor (%ebp), %xmm4, %xmm4
  10197. vaesenc 16(%ebp), %xmm4, %xmm4
  10198. vaesenc 32(%ebp), %xmm4, %xmm4
  10199. vaesenc 48(%ebp), %xmm4, %xmm4
  10200. vaesenc 64(%ebp), %xmm4, %xmm4
  10201. vaesenc 80(%ebp), %xmm4, %xmm4
  10202. vaesenc 96(%ebp), %xmm4, %xmm4
  10203. vaesenc 112(%ebp), %xmm4, %xmm4
  10204. vaesenc 128(%ebp), %xmm4, %xmm4
  10205. vaesenc 144(%ebp), %xmm4, %xmm4
  10206. cmpl $11, 172(%esp)
  10207. vmovdqu 160(%ebp), %xmm0
  10208. jl L_AES_GCM_encrypt_avx2_aesenc_last15_enc_avx_aesenc_avx_last
  10209. vaesenc %xmm0, %xmm4, %xmm4
  10210. vaesenc 176(%ebp), %xmm4, %xmm4
  10211. cmpl $13, 172(%esp)
  10212. vmovdqu 192(%ebp), %xmm0
  10213. jl L_AES_GCM_encrypt_avx2_aesenc_last15_enc_avx_aesenc_avx_last
  10214. vaesenc %xmm0, %xmm4, %xmm4
  10215. vaesenc 208(%ebp), %xmm4, %xmm4
  10216. vmovdqu 224(%ebp), %xmm0
  10217. L_AES_GCM_encrypt_avx2_aesenc_last15_enc_avx_aesenc_avx_last:
  10218. vaesenclast %xmm0, %xmm4, %xmm4
  10219. xorl %ecx, %ecx
  10220. vpxor %xmm0, %xmm0, %xmm0
  10221. vmovdqu %xmm4, (%esp)
  10222. vmovdqu %xmm0, 16(%esp)
  10223. L_AES_GCM_encrypt_avx2_aesenc_last15_enc_avx_loop:
  10224. movzbl (%esi,%ebx,1), %eax
  10225. xorb (%esp,%ecx,1), %al
  10226. movb %al, 16(%esp,%ecx,1)
  10227. movb %al, (%edi,%ebx,1)
  10228. incl %ebx
  10229. incl %ecx
  10230. cmpl %edx, %ebx
  10231. jl L_AES_GCM_encrypt_avx2_aesenc_last15_enc_avx_loop
  10232. L_AES_GCM_encrypt_avx2_aesenc_last15_enc_avx_finish_enc:
  10233. vmovdqu 16(%esp), %xmm4
  10234. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm4, %xmm4
  10235. vpxor %xmm4, %xmm6, %xmm6
  10236. # ghash_gfmul_red
  10237. vpclmulqdq $16, %xmm5, %xmm6, %xmm2
  10238. vpclmulqdq $0x01, %xmm5, %xmm6, %xmm1
  10239. vpclmulqdq $0x00, %xmm5, %xmm6, %xmm0
  10240. vpxor %xmm1, %xmm2, %xmm2
  10241. vpslldq $8, %xmm2, %xmm1
  10242. vpsrldq $8, %xmm2, %xmm2
  10243. vpxor %xmm0, %xmm1, %xmm1
  10244. vpclmulqdq $0x11, %xmm5, %xmm6, %xmm6
  10245. vpclmulqdq $16, L_aes_gcm_avx2_mod2_128, %xmm1, %xmm0
  10246. vpshufd $0x4e, %xmm1, %xmm1
  10247. vpxor %xmm0, %xmm1, %xmm1
  10248. vpclmulqdq $16, L_aes_gcm_avx2_mod2_128, %xmm1, %xmm0
  10249. vpshufd $0x4e, %xmm1, %xmm1
  10250. vpxor %xmm2, %xmm6, %xmm6
  10251. vpxor %xmm1, %xmm6, %xmm6
  10252. vpxor %xmm0, %xmm6, %xmm6
  10253. L_AES_GCM_encrypt_avx2_done_enc:
  10254. vmovdqu 80(%esp), %xmm7
  10255. # calc_tag
  10256. movl 152(%esp), %ecx
  10257. shll $3, %ecx
  10258. vpinsrd $0x00, %ecx, %xmm0, %xmm0
  10259. movl 156(%esp), %ecx
  10260. shll $3, %ecx
  10261. vpinsrd $2, %ecx, %xmm0, %xmm0
  10262. movl 152(%esp), %ecx
  10263. shrl $29, %ecx
  10264. vpinsrd $0x01, %ecx, %xmm0, %xmm0
  10265. movl 156(%esp), %ecx
  10266. shrl $29, %ecx
  10267. vpinsrd $3, %ecx, %xmm0, %xmm0
  10268. vpxor %xmm6, %xmm0, %xmm0
  10269. # ghash_gfmul_red
  10270. vpclmulqdq $16, %xmm5, %xmm0, %xmm4
  10271. vpclmulqdq $0x01, %xmm5, %xmm0, %xmm3
  10272. vpclmulqdq $0x00, %xmm5, %xmm0, %xmm2
  10273. vpxor %xmm3, %xmm4, %xmm4
  10274. vpslldq $8, %xmm4, %xmm3
  10275. vpsrldq $8, %xmm4, %xmm4
  10276. vpxor %xmm2, %xmm3, %xmm3
  10277. vpclmulqdq $0x11, %xmm5, %xmm0, %xmm0
  10278. vpclmulqdq $16, L_aes_gcm_avx2_mod2_128, %xmm3, %xmm2
  10279. vpshufd $0x4e, %xmm3, %xmm3
  10280. vpxor %xmm2, %xmm3, %xmm3
  10281. vpclmulqdq $16, L_aes_gcm_avx2_mod2_128, %xmm3, %xmm2
  10282. vpshufd $0x4e, %xmm3, %xmm3
  10283. vpxor %xmm4, %xmm0, %xmm0
  10284. vpxor %xmm3, %xmm0, %xmm0
  10285. vpxor %xmm2, %xmm0, %xmm0
  10286. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm0, %xmm0
  10287. vpxor %xmm7, %xmm0, %xmm0
  10288. movl 148(%esp), %edi
  10289. movl 164(%esp), %ebx
  10290. # store_tag
  10291. cmpl $16, %ebx
  10292. je L_AES_GCM_encrypt_avx2_store_tag_16
  10293. xorl %ecx, %ecx
  10294. vmovdqu %xmm0, (%esp)
  10295. L_AES_GCM_encrypt_avx2_store_tag_loop:
  10296. movzbl (%esp,%ecx,1), %eax
  10297. movb %al, (%edi,%ecx,1)
  10298. incl %ecx
  10299. cmpl %ebx, %ecx
  10300. jne L_AES_GCM_encrypt_avx2_store_tag_loop
  10301. jmp L_AES_GCM_encrypt_avx2_store_tag_done
  10302. L_AES_GCM_encrypt_avx2_store_tag_16:
  10303. vmovdqu %xmm0, (%edi)
  10304. L_AES_GCM_encrypt_avx2_store_tag_done:
  10305. addl $0x70, %esp
  10306. popl %ebp
  10307. popl %edi
  10308. popl %esi
  10309. popl %ebx
  10310. ret
  10311. .size AES_GCM_encrypt_avx2,.-AES_GCM_encrypt_avx2
  10312. .text
  10313. .globl AES_GCM_decrypt_avx2
  10314. .type AES_GCM_decrypt_avx2,@function
  10315. .align 16
  10316. AES_GCM_decrypt_avx2:
  10317. pushl %ebx
  10318. pushl %esi
  10319. pushl %edi
  10320. pushl %ebp
  10321. subl $0xb0, %esp
  10322. movl 208(%esp), %esi
  10323. movl 232(%esp), %ebp
  10324. vpxor %xmm4, %xmm4, %xmm4
  10325. movl 224(%esp), %edx
  10326. cmpl $12, %edx
  10327. je L_AES_GCM_decrypt_avx2_iv_12
  10328. # Calculate values when IV is not 12 bytes
  10329. # H = Encrypt X(=0)
  10330. vmovdqu (%ebp), %xmm5
  10331. vaesenc 16(%ebp), %xmm5, %xmm5
  10332. vaesenc 32(%ebp), %xmm5, %xmm5
  10333. vaesenc 48(%ebp), %xmm5, %xmm5
  10334. vaesenc 64(%ebp), %xmm5, %xmm5
  10335. vaesenc 80(%ebp), %xmm5, %xmm5
  10336. vaesenc 96(%ebp), %xmm5, %xmm5
  10337. vaesenc 112(%ebp), %xmm5, %xmm5
  10338. vaesenc 128(%ebp), %xmm5, %xmm5
  10339. vaesenc 144(%ebp), %xmm5, %xmm5
  10340. cmpl $11, 236(%esp)
  10341. vmovdqu 160(%ebp), %xmm0
  10342. jl L_AES_GCM_decrypt_avx2_calc_iv_1_aesenc_avx_last
  10343. vaesenc %xmm0, %xmm5, %xmm5
  10344. vaesenc 176(%ebp), %xmm5, %xmm5
  10345. cmpl $13, 236(%esp)
  10346. vmovdqu 192(%ebp), %xmm0
  10347. jl L_AES_GCM_decrypt_avx2_calc_iv_1_aesenc_avx_last
  10348. vaesenc %xmm0, %xmm5, %xmm5
  10349. vaesenc 208(%ebp), %xmm5, %xmm5
  10350. vmovdqu 224(%ebp), %xmm0
  10351. L_AES_GCM_decrypt_avx2_calc_iv_1_aesenc_avx_last:
  10352. vaesenclast %xmm0, %xmm5, %xmm5
  10353. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm5, %xmm5
  10354. # Calc counter
  10355. # Initialization vector
  10356. cmpl $0x00, %edx
  10357. movl $0x00, %ecx
  10358. je L_AES_GCM_decrypt_avx2_calc_iv_done
  10359. cmpl $16, %edx
  10360. jl L_AES_GCM_decrypt_avx2_calc_iv_lt16
  10361. andl $0xfffffff0, %edx
  10362. L_AES_GCM_decrypt_avx2_calc_iv_16_loop:
  10363. vmovdqu (%esi,%ecx,1), %xmm0
  10364. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm0, %xmm0
  10365. vpxor %xmm0, %xmm4, %xmm4
  10366. # ghash_gfmul_avx
  10367. vpclmulqdq $16, %xmm4, %xmm5, %xmm2
  10368. vpclmulqdq $0x01, %xmm4, %xmm5, %xmm1
  10369. vpclmulqdq $0x00, %xmm4, %xmm5, %xmm0
  10370. vpclmulqdq $0x11, %xmm4, %xmm5, %xmm3
  10371. vpxor %xmm1, %xmm2, %xmm2
  10372. vpslldq $8, %xmm2, %xmm1
  10373. vpsrldq $8, %xmm2, %xmm2
  10374. vpxor %xmm1, %xmm0, %xmm7
  10375. vpxor %xmm2, %xmm3, %xmm4
  10376. # ghash_mid
  10377. vpsrld $31, %xmm7, %xmm0
  10378. vpsrld $31, %xmm4, %xmm1
  10379. vpslld $0x01, %xmm7, %xmm7
  10380. vpslld $0x01, %xmm4, %xmm4
  10381. vpsrldq $12, %xmm0, %xmm2
  10382. vpslldq $4, %xmm0, %xmm0
  10383. vpslldq $4, %xmm1, %xmm1
  10384. vpor %xmm2, %xmm4, %xmm4
  10385. vpor %xmm0, %xmm7, %xmm7
  10386. vpor %xmm1, %xmm4, %xmm4
  10387. # ghash_red
  10388. vmovdqu L_aes_gcm_avx2_mod2_128, %xmm2
  10389. vpclmulqdq $16, %xmm2, %xmm7, %xmm0
  10390. vpshufd $0x4e, %xmm7, %xmm1
  10391. vpxor %xmm0, %xmm1, %xmm1
  10392. vpclmulqdq $16, %xmm2, %xmm1, %xmm0
  10393. vpshufd $0x4e, %xmm1, %xmm1
  10394. vpxor %xmm0, %xmm1, %xmm1
  10395. vpxor %xmm1, %xmm4, %xmm4
  10396. addl $16, %ecx
  10397. cmpl %edx, %ecx
  10398. jl L_AES_GCM_decrypt_avx2_calc_iv_16_loop
  10399. movl 224(%esp), %edx
  10400. cmpl %edx, %ecx
  10401. je L_AES_GCM_decrypt_avx2_calc_iv_done
  10402. L_AES_GCM_decrypt_avx2_calc_iv_lt16:
  10403. vpxor %xmm0, %xmm0, %xmm0
  10404. xorl %ebx, %ebx
  10405. vmovdqu %xmm0, (%esp)
  10406. L_AES_GCM_decrypt_avx2_calc_iv_loop:
  10407. movzbl (%esi,%ecx,1), %eax
  10408. movb %al, (%esp,%ebx,1)
  10409. incl %ecx
  10410. incl %ebx
  10411. cmpl %edx, %ecx
  10412. jl L_AES_GCM_decrypt_avx2_calc_iv_loop
  10413. vmovdqu (%esp), %xmm0
  10414. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm0, %xmm0
  10415. vpxor %xmm0, %xmm4, %xmm4
  10416. # ghash_gfmul_avx
  10417. vpclmulqdq $16, %xmm4, %xmm5, %xmm2
  10418. vpclmulqdq $0x01, %xmm4, %xmm5, %xmm1
  10419. vpclmulqdq $0x00, %xmm4, %xmm5, %xmm0
  10420. vpclmulqdq $0x11, %xmm4, %xmm5, %xmm3
  10421. vpxor %xmm1, %xmm2, %xmm2
  10422. vpslldq $8, %xmm2, %xmm1
  10423. vpsrldq $8, %xmm2, %xmm2
  10424. vpxor %xmm1, %xmm0, %xmm7
  10425. vpxor %xmm2, %xmm3, %xmm4
  10426. # ghash_mid
  10427. vpsrld $31, %xmm7, %xmm0
  10428. vpsrld $31, %xmm4, %xmm1
  10429. vpslld $0x01, %xmm7, %xmm7
  10430. vpslld $0x01, %xmm4, %xmm4
  10431. vpsrldq $12, %xmm0, %xmm2
  10432. vpslldq $4, %xmm0, %xmm0
  10433. vpslldq $4, %xmm1, %xmm1
  10434. vpor %xmm2, %xmm4, %xmm4
  10435. vpor %xmm0, %xmm7, %xmm7
  10436. vpor %xmm1, %xmm4, %xmm4
  10437. # ghash_red
  10438. vmovdqu L_aes_gcm_avx2_mod2_128, %xmm2
  10439. vpclmulqdq $16, %xmm2, %xmm7, %xmm0
  10440. vpshufd $0x4e, %xmm7, %xmm1
  10441. vpxor %xmm0, %xmm1, %xmm1
  10442. vpclmulqdq $16, %xmm2, %xmm1, %xmm0
  10443. vpshufd $0x4e, %xmm1, %xmm1
  10444. vpxor %xmm0, %xmm1, %xmm1
  10445. vpxor %xmm1, %xmm4, %xmm4
  10446. L_AES_GCM_decrypt_avx2_calc_iv_done:
  10447. # T = Encrypt counter
  10448. vpxor %xmm0, %xmm0, %xmm0
  10449. shll $3, %edx
  10450. vpinsrd $0x00, %edx, %xmm0, %xmm0
  10451. vpxor %xmm0, %xmm4, %xmm4
  10452. # ghash_gfmul_avx
  10453. vpclmulqdq $16, %xmm4, %xmm5, %xmm2
  10454. vpclmulqdq $0x01, %xmm4, %xmm5, %xmm1
  10455. vpclmulqdq $0x00, %xmm4, %xmm5, %xmm0
  10456. vpclmulqdq $0x11, %xmm4, %xmm5, %xmm3
  10457. vpxor %xmm1, %xmm2, %xmm2
  10458. vpslldq $8, %xmm2, %xmm1
  10459. vpsrldq $8, %xmm2, %xmm2
  10460. vpxor %xmm1, %xmm0, %xmm7
  10461. vpxor %xmm2, %xmm3, %xmm4
  10462. # ghash_mid
  10463. vpsrld $31, %xmm7, %xmm0
  10464. vpsrld $31, %xmm4, %xmm1
  10465. vpslld $0x01, %xmm7, %xmm7
  10466. vpslld $0x01, %xmm4, %xmm4
  10467. vpsrldq $12, %xmm0, %xmm2
  10468. vpslldq $4, %xmm0, %xmm0
  10469. vpslldq $4, %xmm1, %xmm1
  10470. vpor %xmm2, %xmm4, %xmm4
  10471. vpor %xmm0, %xmm7, %xmm7
  10472. vpor %xmm1, %xmm4, %xmm4
  10473. # ghash_red
  10474. vmovdqu L_aes_gcm_avx2_mod2_128, %xmm2
  10475. vpclmulqdq $16, %xmm2, %xmm7, %xmm0
  10476. vpshufd $0x4e, %xmm7, %xmm1
  10477. vpxor %xmm0, %xmm1, %xmm1
  10478. vpclmulqdq $16, %xmm2, %xmm1, %xmm0
  10479. vpshufd $0x4e, %xmm1, %xmm1
  10480. vpxor %xmm0, %xmm1, %xmm1
  10481. vpxor %xmm1, %xmm4, %xmm4
  10482. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm4, %xmm4
  10483. # Encrypt counter
  10484. vmovdqu (%ebp), %xmm6
  10485. vpxor %xmm4, %xmm6, %xmm6
  10486. vaesenc 16(%ebp), %xmm6, %xmm6
  10487. vaesenc 32(%ebp), %xmm6, %xmm6
  10488. vaesenc 48(%ebp), %xmm6, %xmm6
  10489. vaesenc 64(%ebp), %xmm6, %xmm6
  10490. vaesenc 80(%ebp), %xmm6, %xmm6
  10491. vaesenc 96(%ebp), %xmm6, %xmm6
  10492. vaesenc 112(%ebp), %xmm6, %xmm6
  10493. vaesenc 128(%ebp), %xmm6, %xmm6
  10494. vaesenc 144(%ebp), %xmm6, %xmm6
  10495. cmpl $11, 236(%esp)
  10496. vmovdqu 160(%ebp), %xmm0
  10497. jl L_AES_GCM_decrypt_avx2_calc_iv_2_aesenc_avx_last
  10498. vaesenc %xmm0, %xmm6, %xmm6
  10499. vaesenc 176(%ebp), %xmm6, %xmm6
  10500. cmpl $13, 236(%esp)
  10501. vmovdqu 192(%ebp), %xmm0
  10502. jl L_AES_GCM_decrypt_avx2_calc_iv_2_aesenc_avx_last
  10503. vaesenc %xmm0, %xmm6, %xmm6
  10504. vaesenc 208(%ebp), %xmm6, %xmm6
  10505. vmovdqu 224(%ebp), %xmm0
  10506. L_AES_GCM_decrypt_avx2_calc_iv_2_aesenc_avx_last:
  10507. vaesenclast %xmm0, %xmm6, %xmm6
  10508. jmp L_AES_GCM_decrypt_avx2_iv_done
  10509. L_AES_GCM_decrypt_avx2_iv_12:
  10510. # # Calculate values when IV is 12 bytes
  10511. # Set counter based on IV
  10512. vmovdqu L_avx2_aes_gcm_bswap_one, %xmm4
  10513. vmovdqu (%ebp), %xmm5
  10514. vpblendd $7, (%esi), %xmm4, %xmm4
  10515. # H = Encrypt X(=0) and T = Encrypt counter
  10516. vmovdqu 16(%ebp), %xmm7
  10517. vpxor %xmm5, %xmm4, %xmm6
  10518. vaesenc %xmm7, %xmm5, %xmm5
  10519. vaesenc %xmm7, %xmm6, %xmm6
  10520. vmovdqu 32(%ebp), %xmm0
  10521. vaesenc %xmm0, %xmm5, %xmm5
  10522. vaesenc %xmm0, %xmm6, %xmm6
  10523. vmovdqu 48(%ebp), %xmm0
  10524. vaesenc %xmm0, %xmm5, %xmm5
  10525. vaesenc %xmm0, %xmm6, %xmm6
  10526. vmovdqu 64(%ebp), %xmm0
  10527. vaesenc %xmm0, %xmm5, %xmm5
  10528. vaesenc %xmm0, %xmm6, %xmm6
  10529. vmovdqu 80(%ebp), %xmm0
  10530. vaesenc %xmm0, %xmm5, %xmm5
  10531. vaesenc %xmm0, %xmm6, %xmm6
  10532. vmovdqu 96(%ebp), %xmm0
  10533. vaesenc %xmm0, %xmm5, %xmm5
  10534. vaesenc %xmm0, %xmm6, %xmm6
  10535. vmovdqu 112(%ebp), %xmm0
  10536. vaesenc %xmm0, %xmm5, %xmm5
  10537. vaesenc %xmm0, %xmm6, %xmm6
  10538. vmovdqu 128(%ebp), %xmm0
  10539. vaesenc %xmm0, %xmm5, %xmm5
  10540. vaesenc %xmm0, %xmm6, %xmm6
  10541. vmovdqu 144(%ebp), %xmm0
  10542. vaesenc %xmm0, %xmm5, %xmm5
  10543. vaesenc %xmm0, %xmm6, %xmm6
  10544. cmpl $11, 236(%esp)
  10545. vmovdqu 160(%ebp), %xmm0
  10546. jl L_AES_GCM_decrypt_avx2_calc_iv_12_last
  10547. vaesenc %xmm0, %xmm5, %xmm5
  10548. vaesenc %xmm0, %xmm6, %xmm6
  10549. vmovdqu 176(%ebp), %xmm0
  10550. vaesenc %xmm0, %xmm5, %xmm5
  10551. vaesenc %xmm0, %xmm6, %xmm6
  10552. cmpl $13, 236(%esp)
  10553. vmovdqu 192(%ebp), %xmm0
  10554. jl L_AES_GCM_decrypt_avx2_calc_iv_12_last
  10555. vaesenc %xmm0, %xmm5, %xmm5
  10556. vaesenc %xmm0, %xmm6, %xmm6
  10557. vmovdqu 208(%ebp), %xmm0
  10558. vaesenc %xmm0, %xmm5, %xmm5
  10559. vaesenc %xmm0, %xmm6, %xmm6
  10560. vmovdqu 224(%ebp), %xmm0
  10561. L_AES_GCM_decrypt_avx2_calc_iv_12_last:
  10562. vaesenclast %xmm0, %xmm5, %xmm5
  10563. vaesenclast %xmm0, %xmm6, %xmm6
  10564. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm5, %xmm5
  10565. L_AES_GCM_decrypt_avx2_iv_done:
  10566. vmovdqu %xmm6, 80(%esp)
  10567. vpxor %xmm6, %xmm6, %xmm6
  10568. movl 204(%esp), %esi
  10569. # Additional authentication data
  10570. movl 220(%esp), %edx
  10571. cmpl $0x00, %edx
  10572. je L_AES_GCM_decrypt_avx2_calc_aad_done
  10573. xorl %ecx, %ecx
  10574. cmpl $16, %edx
  10575. jl L_AES_GCM_decrypt_avx2_calc_aad_lt16
  10576. andl $0xfffffff0, %edx
  10577. L_AES_GCM_decrypt_avx2_calc_aad_16_loop:
  10578. vmovdqu (%esi,%ecx,1), %xmm0
  10579. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm0, %xmm0
  10580. vpxor %xmm0, %xmm6, %xmm6
  10581. # ghash_gfmul_avx
  10582. vpclmulqdq $16, %xmm6, %xmm5, %xmm2
  10583. vpclmulqdq $0x01, %xmm6, %xmm5, %xmm1
  10584. vpclmulqdq $0x00, %xmm6, %xmm5, %xmm0
  10585. vpclmulqdq $0x11, %xmm6, %xmm5, %xmm3
  10586. vpxor %xmm1, %xmm2, %xmm2
  10587. vpslldq $8, %xmm2, %xmm1
  10588. vpsrldq $8, %xmm2, %xmm2
  10589. vpxor %xmm1, %xmm0, %xmm7
  10590. vpxor %xmm2, %xmm3, %xmm6
  10591. # ghash_mid
  10592. vpsrld $31, %xmm7, %xmm0
  10593. vpsrld $31, %xmm6, %xmm1
  10594. vpslld $0x01, %xmm7, %xmm7
  10595. vpslld $0x01, %xmm6, %xmm6
  10596. vpsrldq $12, %xmm0, %xmm2
  10597. vpslldq $4, %xmm0, %xmm0
  10598. vpslldq $4, %xmm1, %xmm1
  10599. vpor %xmm2, %xmm6, %xmm6
  10600. vpor %xmm0, %xmm7, %xmm7
  10601. vpor %xmm1, %xmm6, %xmm6
  10602. # ghash_red
  10603. vmovdqu L_aes_gcm_avx2_mod2_128, %xmm2
  10604. vpclmulqdq $16, %xmm2, %xmm7, %xmm0
  10605. vpshufd $0x4e, %xmm7, %xmm1
  10606. vpxor %xmm0, %xmm1, %xmm1
  10607. vpclmulqdq $16, %xmm2, %xmm1, %xmm0
  10608. vpshufd $0x4e, %xmm1, %xmm1
  10609. vpxor %xmm0, %xmm1, %xmm1
  10610. vpxor %xmm1, %xmm6, %xmm6
  10611. addl $16, %ecx
  10612. cmpl %edx, %ecx
  10613. jl L_AES_GCM_decrypt_avx2_calc_aad_16_loop
  10614. movl 220(%esp), %edx
  10615. cmpl %edx, %ecx
  10616. je L_AES_GCM_decrypt_avx2_calc_aad_done
  10617. L_AES_GCM_decrypt_avx2_calc_aad_lt16:
  10618. vpxor %xmm0, %xmm0, %xmm0
  10619. xorl %ebx, %ebx
  10620. vmovdqu %xmm0, (%esp)
  10621. L_AES_GCM_decrypt_avx2_calc_aad_loop:
  10622. movzbl (%esi,%ecx,1), %eax
  10623. movb %al, (%esp,%ebx,1)
  10624. incl %ecx
  10625. incl %ebx
  10626. cmpl %edx, %ecx
  10627. jl L_AES_GCM_decrypt_avx2_calc_aad_loop
  10628. vmovdqu (%esp), %xmm0
  10629. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm0, %xmm0
  10630. vpxor %xmm0, %xmm6, %xmm6
  10631. # ghash_gfmul_avx
  10632. vpclmulqdq $16, %xmm6, %xmm5, %xmm2
  10633. vpclmulqdq $0x01, %xmm6, %xmm5, %xmm1
  10634. vpclmulqdq $0x00, %xmm6, %xmm5, %xmm0
  10635. vpclmulqdq $0x11, %xmm6, %xmm5, %xmm3
  10636. vpxor %xmm1, %xmm2, %xmm2
  10637. vpslldq $8, %xmm2, %xmm1
  10638. vpsrldq $8, %xmm2, %xmm2
  10639. vpxor %xmm1, %xmm0, %xmm7
  10640. vpxor %xmm2, %xmm3, %xmm6
  10641. # ghash_mid
  10642. vpsrld $31, %xmm7, %xmm0
  10643. vpsrld $31, %xmm6, %xmm1
  10644. vpslld $0x01, %xmm7, %xmm7
  10645. vpslld $0x01, %xmm6, %xmm6
  10646. vpsrldq $12, %xmm0, %xmm2
  10647. vpslldq $4, %xmm0, %xmm0
  10648. vpslldq $4, %xmm1, %xmm1
  10649. vpor %xmm2, %xmm6, %xmm6
  10650. vpor %xmm0, %xmm7, %xmm7
  10651. vpor %xmm1, %xmm6, %xmm6
  10652. # ghash_red
  10653. vmovdqu L_aes_gcm_avx2_mod2_128, %xmm2
  10654. vpclmulqdq $16, %xmm2, %xmm7, %xmm0
  10655. vpshufd $0x4e, %xmm7, %xmm1
  10656. vpxor %xmm0, %xmm1, %xmm1
  10657. vpclmulqdq $16, %xmm2, %xmm1, %xmm0
  10658. vpshufd $0x4e, %xmm1, %xmm1
  10659. vpxor %xmm0, %xmm1, %xmm1
  10660. vpxor %xmm1, %xmm6, %xmm6
  10661. L_AES_GCM_decrypt_avx2_calc_aad_done:
  10662. movl 196(%esp), %esi
  10663. movl 200(%esp), %edi
  10664. # Calculate counter and H
  10665. vpsrlq $63, %xmm5, %xmm1
  10666. vpsllq $0x01, %xmm5, %xmm0
  10667. vpslldq $8, %xmm1, %xmm1
  10668. vpor %xmm1, %xmm0, %xmm0
  10669. vpshufd $0xff, %xmm5, %xmm5
  10670. vpsrad $31, %xmm5, %xmm5
  10671. vpshufb L_aes_gcm_avx2_bswap_epi64, %xmm4, %xmm4
  10672. vpand L_aes_gcm_avx2_mod2_128, %xmm5, %xmm5
  10673. vpaddd L_aes_gcm_avx2_one, %xmm4, %xmm4
  10674. vpxor %xmm0, %xmm5, %xmm5
  10675. xorl %ebx, %ebx
  10676. cmpl $0x40, 216(%esp)
  10677. movl 216(%esp), %eax
  10678. jl L_AES_GCM_decrypt_avx2_done_64
  10679. andl $0xffffffc0, %eax
  10680. vmovdqu %xmm4, 64(%esp)
  10681. vmovdqu %xmm6, 96(%esp)
  10682. vmovdqu L_aes_gcm_avx2_mod2_128, %xmm3
  10683. # H ^ 1
  10684. vmovdqu %xmm5, (%esp)
  10685. vmovdqu %xmm5, %xmm2
  10686. # H ^ 2
  10687. vpclmulqdq $0x00, %xmm2, %xmm2, %xmm5
  10688. vpclmulqdq $0x11, %xmm2, %xmm2, %xmm6
  10689. vpclmulqdq $16, %xmm3, %xmm5, %xmm4
  10690. vpshufd $0x4e, %xmm5, %xmm5
  10691. vpxor %xmm4, %xmm5, %xmm5
  10692. vpclmulqdq $16, %xmm3, %xmm5, %xmm4
  10693. vpshufd $0x4e, %xmm5, %xmm5
  10694. vpxor %xmm4, %xmm5, %xmm5
  10695. vpxor %xmm5, %xmm6, %xmm0
  10696. vmovdqu %xmm0, 16(%esp)
  10697. # H ^ 3
  10698. # ghash_gfmul_red
  10699. vpclmulqdq $16, %xmm0, %xmm2, %xmm6
  10700. vpclmulqdq $0x01, %xmm0, %xmm2, %xmm5
  10701. vpclmulqdq $0x00, %xmm0, %xmm2, %xmm4
  10702. vpxor %xmm5, %xmm6, %xmm6
  10703. vpslldq $8, %xmm6, %xmm5
  10704. vpsrldq $8, %xmm6, %xmm6
  10705. vpxor %xmm4, %xmm5, %xmm5
  10706. vpclmulqdq $0x11, %xmm0, %xmm2, %xmm1
  10707. vpclmulqdq $16, %xmm3, %xmm5, %xmm4
  10708. vpshufd $0x4e, %xmm5, %xmm5
  10709. vpxor %xmm4, %xmm5, %xmm5
  10710. vpclmulqdq $16, %xmm3, %xmm5, %xmm4
  10711. vpshufd $0x4e, %xmm5, %xmm5
  10712. vpxor %xmm6, %xmm1, %xmm1
  10713. vpxor %xmm5, %xmm1, %xmm1
  10714. vpxor %xmm4, %xmm1, %xmm1
  10715. vmovdqu %xmm1, 32(%esp)
  10716. # H ^ 4
  10717. vpclmulqdq $0x00, %xmm0, %xmm0, %xmm5
  10718. vpclmulqdq $0x11, %xmm0, %xmm0, %xmm6
  10719. vpclmulqdq $16, %xmm3, %xmm5, %xmm4
  10720. vpshufd $0x4e, %xmm5, %xmm5
  10721. vpxor %xmm4, %xmm5, %xmm5
  10722. vpclmulqdq $16, %xmm3, %xmm5, %xmm4
  10723. vpshufd $0x4e, %xmm5, %xmm5
  10724. vpxor %xmm4, %xmm5, %xmm5
  10725. vpxor %xmm5, %xmm6, %xmm2
  10726. vmovdqu %xmm2, 48(%esp)
  10727. vmovdqu 96(%esp), %xmm6
  10728. cmpl %esi, %edi
  10729. jne L_AES_GCM_decrypt_avx2_ghash_64
  10730. L_AES_GCM_decrypt_avx2_ghash_64_inplace:
  10731. # aesenc_64_ghash
  10732. leal (%esi,%ebx,1), %ecx
  10733. leal (%edi,%ebx,1), %edx
  10734. # aesenc_64
  10735. # aesenc_ctr
  10736. vmovdqu 64(%esp), %xmm4
  10737. vmovdqu L_aes_gcm_avx2_bswap_epi64, %xmm7
  10738. vpaddd L_aes_gcm_avx2_one, %xmm4, %xmm1
  10739. vpshufb %xmm7, %xmm4, %xmm0
  10740. vpaddd L_aes_gcm_avx2_two, %xmm4, %xmm2
  10741. vpshufb %xmm7, %xmm1, %xmm1
  10742. vpaddd L_aes_gcm_avx2_three, %xmm4, %xmm3
  10743. vpshufb %xmm7, %xmm2, %xmm2
  10744. vpaddd L_aes_gcm_avx2_four, %xmm4, %xmm4
  10745. vpshufb %xmm7, %xmm3, %xmm3
  10746. # aesenc_xor
  10747. vmovdqu (%ebp), %xmm7
  10748. vmovdqu %xmm4, 64(%esp)
  10749. vpxor %xmm7, %xmm0, %xmm0
  10750. vpxor %xmm7, %xmm1, %xmm1
  10751. vpxor %xmm7, %xmm2, %xmm2
  10752. vpxor %xmm7, %xmm3, %xmm3
  10753. vmovdqu 16(%ebp), %xmm7
  10754. vaesenc %xmm7, %xmm0, %xmm0
  10755. vaesenc %xmm7, %xmm1, %xmm1
  10756. vaesenc %xmm7, %xmm2, %xmm2
  10757. vaesenc %xmm7, %xmm3, %xmm3
  10758. vmovdqu 32(%ebp), %xmm7
  10759. vaesenc %xmm7, %xmm0, %xmm0
  10760. vaesenc %xmm7, %xmm1, %xmm1
  10761. vaesenc %xmm7, %xmm2, %xmm2
  10762. vaesenc %xmm7, %xmm3, %xmm3
  10763. vmovdqu 48(%ebp), %xmm7
  10764. vaesenc %xmm7, %xmm0, %xmm0
  10765. vaesenc %xmm7, %xmm1, %xmm1
  10766. vaesenc %xmm7, %xmm2, %xmm2
  10767. vaesenc %xmm7, %xmm3, %xmm3
  10768. vmovdqu 64(%ebp), %xmm7
  10769. vaesenc %xmm7, %xmm0, %xmm0
  10770. vaesenc %xmm7, %xmm1, %xmm1
  10771. vaesenc %xmm7, %xmm2, %xmm2
  10772. vaesenc %xmm7, %xmm3, %xmm3
  10773. vmovdqu 80(%ebp), %xmm7
  10774. vaesenc %xmm7, %xmm0, %xmm0
  10775. vaesenc %xmm7, %xmm1, %xmm1
  10776. vaesenc %xmm7, %xmm2, %xmm2
  10777. vaesenc %xmm7, %xmm3, %xmm3
  10778. vmovdqu 96(%ebp), %xmm7
  10779. vaesenc %xmm7, %xmm0, %xmm0
  10780. vaesenc %xmm7, %xmm1, %xmm1
  10781. vaesenc %xmm7, %xmm2, %xmm2
  10782. vaesenc %xmm7, %xmm3, %xmm3
  10783. vmovdqu 112(%ebp), %xmm7
  10784. vaesenc %xmm7, %xmm0, %xmm0
  10785. vaesenc %xmm7, %xmm1, %xmm1
  10786. vaesenc %xmm7, %xmm2, %xmm2
  10787. vaesenc %xmm7, %xmm3, %xmm3
  10788. vmovdqu 128(%ebp), %xmm7
  10789. vaesenc %xmm7, %xmm0, %xmm0
  10790. vaesenc %xmm7, %xmm1, %xmm1
  10791. vaesenc %xmm7, %xmm2, %xmm2
  10792. vaesenc %xmm7, %xmm3, %xmm3
  10793. vmovdqu 144(%ebp), %xmm7
  10794. vaesenc %xmm7, %xmm0, %xmm0
  10795. vaesenc %xmm7, %xmm1, %xmm1
  10796. vaesenc %xmm7, %xmm2, %xmm2
  10797. vaesenc %xmm7, %xmm3, %xmm3
  10798. cmpl $11, 236(%esp)
  10799. vmovdqu 160(%ebp), %xmm7
  10800. jl L_AES_GCM_decrypt_avx2_inplace_aesenc_64_ghash_aesenc_64_enc_done
  10801. vaesenc %xmm7, %xmm0, %xmm0
  10802. vaesenc %xmm7, %xmm1, %xmm1
  10803. vaesenc %xmm7, %xmm2, %xmm2
  10804. vaesenc %xmm7, %xmm3, %xmm3
  10805. vmovdqu 176(%ebp), %xmm7
  10806. vaesenc %xmm7, %xmm0, %xmm0
  10807. vaesenc %xmm7, %xmm1, %xmm1
  10808. vaesenc %xmm7, %xmm2, %xmm2
  10809. vaesenc %xmm7, %xmm3, %xmm3
  10810. cmpl $13, 236(%esp)
  10811. vmovdqu 192(%ebp), %xmm7
  10812. jl L_AES_GCM_decrypt_avx2_inplace_aesenc_64_ghash_aesenc_64_enc_done
  10813. vaesenc %xmm7, %xmm0, %xmm0
  10814. vaesenc %xmm7, %xmm1, %xmm1
  10815. vaesenc %xmm7, %xmm2, %xmm2
  10816. vaesenc %xmm7, %xmm3, %xmm3
  10817. vmovdqu 208(%ebp), %xmm7
  10818. vaesenc %xmm7, %xmm0, %xmm0
  10819. vaesenc %xmm7, %xmm1, %xmm1
  10820. vaesenc %xmm7, %xmm2, %xmm2
  10821. vaesenc %xmm7, %xmm3, %xmm3
  10822. vmovdqu 224(%ebp), %xmm7
  10823. L_AES_GCM_decrypt_avx2_inplace_aesenc_64_ghash_aesenc_64_enc_done:
  10824. # aesenc_last
  10825. vaesenclast %xmm7, %xmm0, %xmm0
  10826. vaesenclast %xmm7, %xmm1, %xmm1
  10827. vaesenclast %xmm7, %xmm2, %xmm2
  10828. vaesenclast %xmm7, %xmm3, %xmm3
  10829. vmovdqu (%ecx), %xmm7
  10830. vmovdqu 16(%ecx), %xmm4
  10831. vpxor %xmm7, %xmm0, %xmm0
  10832. vpxor %xmm4, %xmm1, %xmm1
  10833. vmovdqu %xmm7, 112(%esp)
  10834. vmovdqu %xmm4, 128(%esp)
  10835. vmovdqu %xmm0, (%edx)
  10836. vmovdqu %xmm1, 16(%edx)
  10837. vmovdqu 32(%ecx), %xmm7
  10838. vmovdqu 48(%ecx), %xmm4
  10839. vpxor %xmm7, %xmm2, %xmm2
  10840. vpxor %xmm4, %xmm3, %xmm3
  10841. vmovdqu %xmm7, 144(%esp)
  10842. vmovdqu %xmm4, 160(%esp)
  10843. vmovdqu %xmm2, 32(%edx)
  10844. vmovdqu %xmm3, 48(%edx)
  10845. # pclmul_1
  10846. vmovdqu 112(%esp), %xmm1
  10847. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm1, %xmm1
  10848. vmovdqu 48(%esp), %xmm2
  10849. vpxor %xmm6, %xmm1, %xmm1
  10850. vpclmulqdq $16, %xmm2, %xmm1, %xmm5
  10851. vpclmulqdq $0x01, %xmm2, %xmm1, %xmm3
  10852. vpclmulqdq $0x00, %xmm2, %xmm1, %xmm6
  10853. vpclmulqdq $0x11, %xmm2, %xmm1, %xmm7
  10854. # pclmul_2
  10855. vmovdqu 128(%esp), %xmm1
  10856. vmovdqu 32(%esp), %xmm0
  10857. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm1, %xmm1
  10858. vpxor %xmm3, %xmm5, %xmm5
  10859. vpclmulqdq $16, %xmm0, %xmm1, %xmm2
  10860. vpclmulqdq $0x01, %xmm0, %xmm1, %xmm3
  10861. vpclmulqdq $0x00, %xmm0, %xmm1, %xmm4
  10862. vpclmulqdq $0x11, %xmm0, %xmm1, %xmm1
  10863. vpxor %xmm1, %xmm7, %xmm7
  10864. # pclmul_n
  10865. vmovdqu 144(%esp), %xmm1
  10866. vmovdqu 16(%esp), %xmm0
  10867. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm1, %xmm1
  10868. vpxor %xmm2, %xmm5, %xmm5
  10869. vpclmulqdq $16, %xmm0, %xmm1, %xmm2
  10870. vpxor %xmm3, %xmm5, %xmm5
  10871. vpclmulqdq $0x01, %xmm0, %xmm1, %xmm3
  10872. vpxor %xmm4, %xmm6, %xmm6
  10873. vpclmulqdq $0x00, %xmm0, %xmm1, %xmm4
  10874. vpclmulqdq $0x11, %xmm0, %xmm1, %xmm1
  10875. vpxor %xmm1, %xmm7, %xmm7
  10876. # pclmul_n
  10877. vmovdqu 160(%esp), %xmm1
  10878. vmovdqu (%esp), %xmm0
  10879. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm1, %xmm1
  10880. vpxor %xmm2, %xmm5, %xmm5
  10881. vpclmulqdq $16, %xmm0, %xmm1, %xmm2
  10882. vpxor %xmm3, %xmm5, %xmm5
  10883. vpclmulqdq $0x01, %xmm0, %xmm1, %xmm3
  10884. vpxor %xmm4, %xmm6, %xmm6
  10885. vpclmulqdq $0x00, %xmm0, %xmm1, %xmm4
  10886. vpclmulqdq $0x11, %xmm0, %xmm1, %xmm1
  10887. vpxor %xmm1, %xmm7, %xmm7
  10888. # aesenc_pclmul_l
  10889. vpxor %xmm2, %xmm5, %xmm5
  10890. vpxor %xmm4, %xmm6, %xmm6
  10891. vpxor %xmm3, %xmm5, %xmm5
  10892. vpslldq $8, %xmm5, %xmm1
  10893. vpsrldq $8, %xmm5, %xmm5
  10894. vmovdqu L_aes_gcm_avx2_mod2_128, %xmm0
  10895. vpxor %xmm1, %xmm6, %xmm6
  10896. vpxor %xmm5, %xmm7, %xmm7
  10897. vpclmulqdq $16, %xmm0, %xmm6, %xmm3
  10898. vpshufd $0x4e, %xmm6, %xmm6
  10899. vpxor %xmm3, %xmm6, %xmm6
  10900. vpclmulqdq $16, %xmm0, %xmm6, %xmm3
  10901. vpshufd $0x4e, %xmm6, %xmm6
  10902. vpxor %xmm3, %xmm6, %xmm6
  10903. vpxor %xmm7, %xmm6, %xmm6
  10904. # aesenc_64_ghash - end
  10905. addl $0x40, %ebx
  10906. cmpl %eax, %ebx
  10907. jl L_AES_GCM_decrypt_avx2_ghash_64_inplace
  10908. jmp L_AES_GCM_decrypt_avx2_ghash_64_done
  10909. L_AES_GCM_decrypt_avx2_ghash_64:
  10910. # aesenc_64_ghash
  10911. leal (%esi,%ebx,1), %ecx
  10912. leal (%edi,%ebx,1), %edx
  10913. # aesenc_64
  10914. # aesenc_ctr
  10915. vmovdqu 64(%esp), %xmm4
  10916. vmovdqu L_aes_gcm_avx2_bswap_epi64, %xmm7
  10917. vpaddd L_aes_gcm_avx2_one, %xmm4, %xmm1
  10918. vpshufb %xmm7, %xmm4, %xmm0
  10919. vpaddd L_aes_gcm_avx2_two, %xmm4, %xmm2
  10920. vpshufb %xmm7, %xmm1, %xmm1
  10921. vpaddd L_aes_gcm_avx2_three, %xmm4, %xmm3
  10922. vpshufb %xmm7, %xmm2, %xmm2
  10923. vpaddd L_aes_gcm_avx2_four, %xmm4, %xmm4
  10924. vpshufb %xmm7, %xmm3, %xmm3
  10925. # aesenc_xor
  10926. vmovdqu (%ebp), %xmm7
  10927. vmovdqu %xmm4, 64(%esp)
  10928. vpxor %xmm7, %xmm0, %xmm0
  10929. vpxor %xmm7, %xmm1, %xmm1
  10930. vpxor %xmm7, %xmm2, %xmm2
  10931. vpxor %xmm7, %xmm3, %xmm3
  10932. vmovdqu 16(%ebp), %xmm7
  10933. vaesenc %xmm7, %xmm0, %xmm0
  10934. vaesenc %xmm7, %xmm1, %xmm1
  10935. vaesenc %xmm7, %xmm2, %xmm2
  10936. vaesenc %xmm7, %xmm3, %xmm3
  10937. vmovdqu 32(%ebp), %xmm7
  10938. vaesenc %xmm7, %xmm0, %xmm0
  10939. vaesenc %xmm7, %xmm1, %xmm1
  10940. vaesenc %xmm7, %xmm2, %xmm2
  10941. vaesenc %xmm7, %xmm3, %xmm3
  10942. vmovdqu 48(%ebp), %xmm7
  10943. vaesenc %xmm7, %xmm0, %xmm0
  10944. vaesenc %xmm7, %xmm1, %xmm1
  10945. vaesenc %xmm7, %xmm2, %xmm2
  10946. vaesenc %xmm7, %xmm3, %xmm3
  10947. vmovdqu 64(%ebp), %xmm7
  10948. vaesenc %xmm7, %xmm0, %xmm0
  10949. vaesenc %xmm7, %xmm1, %xmm1
  10950. vaesenc %xmm7, %xmm2, %xmm2
  10951. vaesenc %xmm7, %xmm3, %xmm3
  10952. vmovdqu 80(%ebp), %xmm7
  10953. vaesenc %xmm7, %xmm0, %xmm0
  10954. vaesenc %xmm7, %xmm1, %xmm1
  10955. vaesenc %xmm7, %xmm2, %xmm2
  10956. vaesenc %xmm7, %xmm3, %xmm3
  10957. vmovdqu 96(%ebp), %xmm7
  10958. vaesenc %xmm7, %xmm0, %xmm0
  10959. vaesenc %xmm7, %xmm1, %xmm1
  10960. vaesenc %xmm7, %xmm2, %xmm2
  10961. vaesenc %xmm7, %xmm3, %xmm3
  10962. vmovdqu 112(%ebp), %xmm7
  10963. vaesenc %xmm7, %xmm0, %xmm0
  10964. vaesenc %xmm7, %xmm1, %xmm1
  10965. vaesenc %xmm7, %xmm2, %xmm2
  10966. vaesenc %xmm7, %xmm3, %xmm3
  10967. vmovdqu 128(%ebp), %xmm7
  10968. vaesenc %xmm7, %xmm0, %xmm0
  10969. vaesenc %xmm7, %xmm1, %xmm1
  10970. vaesenc %xmm7, %xmm2, %xmm2
  10971. vaesenc %xmm7, %xmm3, %xmm3
  10972. vmovdqu 144(%ebp), %xmm7
  10973. vaesenc %xmm7, %xmm0, %xmm0
  10974. vaesenc %xmm7, %xmm1, %xmm1
  10975. vaesenc %xmm7, %xmm2, %xmm2
  10976. vaesenc %xmm7, %xmm3, %xmm3
  10977. cmpl $11, 236(%esp)
  10978. vmovdqu 160(%ebp), %xmm7
  10979. jl L_AES_GCM_decrypt_avx2_aesenc_64_ghash_aesenc_64_enc_done
  10980. vaesenc %xmm7, %xmm0, %xmm0
  10981. vaesenc %xmm7, %xmm1, %xmm1
  10982. vaesenc %xmm7, %xmm2, %xmm2
  10983. vaesenc %xmm7, %xmm3, %xmm3
  10984. vmovdqu 176(%ebp), %xmm7
  10985. vaesenc %xmm7, %xmm0, %xmm0
  10986. vaesenc %xmm7, %xmm1, %xmm1
  10987. vaesenc %xmm7, %xmm2, %xmm2
  10988. vaesenc %xmm7, %xmm3, %xmm3
  10989. cmpl $13, 236(%esp)
  10990. vmovdqu 192(%ebp), %xmm7
  10991. jl L_AES_GCM_decrypt_avx2_aesenc_64_ghash_aesenc_64_enc_done
  10992. vaesenc %xmm7, %xmm0, %xmm0
  10993. vaesenc %xmm7, %xmm1, %xmm1
  10994. vaesenc %xmm7, %xmm2, %xmm2
  10995. vaesenc %xmm7, %xmm3, %xmm3
  10996. vmovdqu 208(%ebp), %xmm7
  10997. vaesenc %xmm7, %xmm0, %xmm0
  10998. vaesenc %xmm7, %xmm1, %xmm1
  10999. vaesenc %xmm7, %xmm2, %xmm2
  11000. vaesenc %xmm7, %xmm3, %xmm3
  11001. vmovdqu 224(%ebp), %xmm7
  11002. L_AES_GCM_decrypt_avx2_aesenc_64_ghash_aesenc_64_enc_done:
  11003. # aesenc_last
  11004. vaesenclast %xmm7, %xmm0, %xmm0
  11005. vaesenclast %xmm7, %xmm1, %xmm1
  11006. vaesenclast %xmm7, %xmm2, %xmm2
  11007. vaesenclast %xmm7, %xmm3, %xmm3
  11008. vmovdqu (%ecx), %xmm7
  11009. vmovdqu 16(%ecx), %xmm4
  11010. vpxor %xmm7, %xmm0, %xmm0
  11011. vpxor %xmm4, %xmm1, %xmm1
  11012. vmovdqu %xmm7, (%ecx)
  11013. vmovdqu %xmm4, 16(%ecx)
  11014. vmovdqu %xmm0, (%edx)
  11015. vmovdqu %xmm1, 16(%edx)
  11016. vmovdqu 32(%ecx), %xmm7
  11017. vmovdqu 48(%ecx), %xmm4
  11018. vpxor %xmm7, %xmm2, %xmm2
  11019. vpxor %xmm4, %xmm3, %xmm3
  11020. vmovdqu %xmm7, 32(%ecx)
  11021. vmovdqu %xmm4, 48(%ecx)
  11022. vmovdqu %xmm2, 32(%edx)
  11023. vmovdqu %xmm3, 48(%edx)
  11024. # pclmul_1
  11025. vmovdqu (%ecx), %xmm1
  11026. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm1, %xmm1
  11027. vmovdqu 48(%esp), %xmm2
  11028. vpxor %xmm6, %xmm1, %xmm1
  11029. vpclmulqdq $16, %xmm2, %xmm1, %xmm5
  11030. vpclmulqdq $0x01, %xmm2, %xmm1, %xmm3
  11031. vpclmulqdq $0x00, %xmm2, %xmm1, %xmm6
  11032. vpclmulqdq $0x11, %xmm2, %xmm1, %xmm7
  11033. # pclmul_2
  11034. vmovdqu 16(%ecx), %xmm1
  11035. vmovdqu 32(%esp), %xmm0
  11036. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm1, %xmm1
  11037. vpxor %xmm3, %xmm5, %xmm5
  11038. vpclmulqdq $16, %xmm0, %xmm1, %xmm2
  11039. vpclmulqdq $0x01, %xmm0, %xmm1, %xmm3
  11040. vpclmulqdq $0x00, %xmm0, %xmm1, %xmm4
  11041. vpclmulqdq $0x11, %xmm0, %xmm1, %xmm1
  11042. vpxor %xmm1, %xmm7, %xmm7
  11043. # pclmul_n
  11044. vmovdqu 32(%ecx), %xmm1
  11045. vmovdqu 16(%esp), %xmm0
  11046. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm1, %xmm1
  11047. vpxor %xmm2, %xmm5, %xmm5
  11048. vpclmulqdq $16, %xmm0, %xmm1, %xmm2
  11049. vpxor %xmm3, %xmm5, %xmm5
  11050. vpclmulqdq $0x01, %xmm0, %xmm1, %xmm3
  11051. vpxor %xmm4, %xmm6, %xmm6
  11052. vpclmulqdq $0x00, %xmm0, %xmm1, %xmm4
  11053. vpclmulqdq $0x11, %xmm0, %xmm1, %xmm1
  11054. vpxor %xmm1, %xmm7, %xmm7
  11055. # pclmul_n
  11056. vmovdqu 48(%ecx), %xmm1
  11057. vmovdqu (%esp), %xmm0
  11058. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm1, %xmm1
  11059. vpxor %xmm2, %xmm5, %xmm5
  11060. vpclmulqdq $16, %xmm0, %xmm1, %xmm2
  11061. vpxor %xmm3, %xmm5, %xmm5
  11062. vpclmulqdq $0x01, %xmm0, %xmm1, %xmm3
  11063. vpxor %xmm4, %xmm6, %xmm6
  11064. vpclmulqdq $0x00, %xmm0, %xmm1, %xmm4
  11065. vpclmulqdq $0x11, %xmm0, %xmm1, %xmm1
  11066. vpxor %xmm1, %xmm7, %xmm7
  11067. # aesenc_pclmul_l
  11068. vpxor %xmm2, %xmm5, %xmm5
  11069. vpxor %xmm4, %xmm6, %xmm6
  11070. vpxor %xmm3, %xmm5, %xmm5
  11071. vpslldq $8, %xmm5, %xmm1
  11072. vpsrldq $8, %xmm5, %xmm5
  11073. vmovdqu L_aes_gcm_avx2_mod2_128, %xmm0
  11074. vpxor %xmm1, %xmm6, %xmm6
  11075. vpxor %xmm5, %xmm7, %xmm7
  11076. vpclmulqdq $16, %xmm0, %xmm6, %xmm3
  11077. vpshufd $0x4e, %xmm6, %xmm6
  11078. vpxor %xmm3, %xmm6, %xmm6
  11079. vpclmulqdq $16, %xmm0, %xmm6, %xmm3
  11080. vpshufd $0x4e, %xmm6, %xmm6
  11081. vpxor %xmm3, %xmm6, %xmm6
  11082. vpxor %xmm7, %xmm6, %xmm6
  11083. # aesenc_64_ghash - end
  11084. addl $0x40, %ebx
  11085. cmpl %eax, %ebx
  11086. jl L_AES_GCM_decrypt_avx2_ghash_64
  11087. L_AES_GCM_decrypt_avx2_ghash_64_done:
  11088. vmovdqu (%esp), %xmm5
  11089. vmovdqu 64(%esp), %xmm4
  11090. L_AES_GCM_decrypt_avx2_done_64:
  11091. cmpl 216(%esp), %ebx
  11092. jge L_AES_GCM_decrypt_avx2_done_dec
  11093. movl 216(%esp), %eax
  11094. andl $0xfffffff0, %eax
  11095. cmpl %eax, %ebx
  11096. jge L_AES_GCM_decrypt_avx2_last_block_done
  11097. L_AES_GCM_decrypt_avx2_last_block_start:
  11098. vmovdqu (%esi,%ebx,1), %xmm0
  11099. vpshufb L_aes_gcm_avx2_bswap_epi64, %xmm4, %xmm7
  11100. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm0, %xmm0
  11101. vpaddd L_aes_gcm_avx2_one, %xmm4, %xmm4
  11102. vmovdqu %xmm4, 64(%esp)
  11103. vpxor %xmm6, %xmm0, %xmm4
  11104. # aesenc_gfmul_sb
  11105. vpclmulqdq $0x01, %xmm5, %xmm4, %xmm2
  11106. vpclmulqdq $16, %xmm5, %xmm4, %xmm3
  11107. vpclmulqdq $0x00, %xmm5, %xmm4, %xmm1
  11108. vpclmulqdq $0x11, %xmm5, %xmm4, %xmm4
  11109. vpxor (%ebp), %xmm7, %xmm7
  11110. vaesenc 16(%ebp), %xmm7, %xmm7
  11111. vpxor %xmm2, %xmm3, %xmm3
  11112. vpslldq $8, %xmm3, %xmm2
  11113. vpsrldq $8, %xmm3, %xmm3
  11114. vaesenc 32(%ebp), %xmm7, %xmm7
  11115. vpxor %xmm1, %xmm2, %xmm2
  11116. vpclmulqdq $16, L_aes_gcm_avx2_mod2_128, %xmm2, %xmm1
  11117. vaesenc 48(%ebp), %xmm7, %xmm7
  11118. vaesenc 64(%ebp), %xmm7, %xmm7
  11119. vaesenc 80(%ebp), %xmm7, %xmm7
  11120. vpshufd $0x4e, %xmm2, %xmm2
  11121. vpxor %xmm1, %xmm2, %xmm2
  11122. vpclmulqdq $16, L_aes_gcm_avx2_mod2_128, %xmm2, %xmm1
  11123. vaesenc 96(%ebp), %xmm7, %xmm7
  11124. vaesenc 112(%ebp), %xmm7, %xmm7
  11125. vaesenc 128(%ebp), %xmm7, %xmm7
  11126. vpshufd $0x4e, %xmm2, %xmm2
  11127. vaesenc 144(%ebp), %xmm7, %xmm7
  11128. vpxor %xmm3, %xmm4, %xmm4
  11129. vpxor %xmm4, %xmm2, %xmm2
  11130. vmovdqu 160(%ebp), %xmm0
  11131. cmpl $11, 236(%esp)
  11132. jl L_AES_GCM_decrypt_avx2_aesenc_gfmul_sb_last
  11133. vaesenc %xmm0, %xmm7, %xmm7
  11134. vaesenc 176(%ebp), %xmm7, %xmm7
  11135. vmovdqu 192(%ebp), %xmm0
  11136. cmpl $13, 236(%esp)
  11137. jl L_AES_GCM_decrypt_avx2_aesenc_gfmul_sb_last
  11138. vaesenc %xmm0, %xmm7, %xmm7
  11139. vaesenc 208(%ebp), %xmm7, %xmm7
  11140. vmovdqu 224(%ebp), %xmm0
  11141. L_AES_GCM_decrypt_avx2_aesenc_gfmul_sb_last:
  11142. vaesenclast %xmm0, %xmm7, %xmm7
  11143. vmovdqu (%esi,%ebx,1), %xmm3
  11144. vpxor %xmm1, %xmm2, %xmm6
  11145. vpxor %xmm3, %xmm7, %xmm7
  11146. vmovdqu %xmm7, (%edi,%ebx,1)
  11147. vmovdqu 64(%esp), %xmm4
  11148. addl $16, %ebx
  11149. cmpl %eax, %ebx
  11150. jl L_AES_GCM_decrypt_avx2_last_block_start
  11151. L_AES_GCM_decrypt_avx2_last_block_done:
  11152. movl 216(%esp), %ecx
  11153. movl 216(%esp), %edx
  11154. andl $15, %ecx
  11155. jz L_AES_GCM_decrypt_avx2_done_dec
  11156. # aesenc_last15_dec
  11157. vpshufb L_aes_gcm_avx2_bswap_epi64, %xmm4, %xmm4
  11158. vpxor (%ebp), %xmm4, %xmm4
  11159. vaesenc 16(%ebp), %xmm4, %xmm4
  11160. vaesenc 32(%ebp), %xmm4, %xmm4
  11161. vaesenc 48(%ebp), %xmm4, %xmm4
  11162. vaesenc 64(%ebp), %xmm4, %xmm4
  11163. vaesenc 80(%ebp), %xmm4, %xmm4
  11164. vaesenc 96(%ebp), %xmm4, %xmm4
  11165. vaesenc 112(%ebp), %xmm4, %xmm4
  11166. vaesenc 128(%ebp), %xmm4, %xmm4
  11167. vaesenc 144(%ebp), %xmm4, %xmm4
  11168. cmpl $11, 236(%esp)
  11169. vmovdqu 160(%ebp), %xmm1
  11170. jl L_AES_GCM_decrypt_avx2_aesenc_last15_dec_avx_aesenc_avx_last
  11171. vaesenc %xmm1, %xmm4, %xmm4
  11172. vaesenc 176(%ebp), %xmm4, %xmm4
  11173. cmpl $13, 236(%esp)
  11174. vmovdqu 192(%ebp), %xmm1
  11175. jl L_AES_GCM_decrypt_avx2_aesenc_last15_dec_avx_aesenc_avx_last
  11176. vaesenc %xmm1, %xmm4, %xmm4
  11177. vaesenc 208(%ebp), %xmm4, %xmm4
  11178. vmovdqu 224(%ebp), %xmm1
  11179. L_AES_GCM_decrypt_avx2_aesenc_last15_dec_avx_aesenc_avx_last:
  11180. vaesenclast %xmm1, %xmm4, %xmm4
  11181. xorl %ecx, %ecx
  11182. vpxor %xmm0, %xmm0, %xmm0
  11183. vmovdqu %xmm4, (%esp)
  11184. vmovdqu %xmm0, 16(%esp)
  11185. L_AES_GCM_decrypt_avx2_aesenc_last15_dec_avx_loop:
  11186. movzbl (%esi,%ebx,1), %eax
  11187. movb %al, 16(%esp,%ecx,1)
  11188. xorb (%esp,%ecx,1), %al
  11189. movb %al, (%edi,%ebx,1)
  11190. incl %ebx
  11191. incl %ecx
  11192. cmpl %edx, %ebx
  11193. jl L_AES_GCM_decrypt_avx2_aesenc_last15_dec_avx_loop
  11194. vmovdqu 16(%esp), %xmm4
  11195. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm4, %xmm4
  11196. vpxor %xmm4, %xmm6, %xmm6
  11197. # ghash_gfmul_red
  11198. vpclmulqdq $16, %xmm5, %xmm6, %xmm2
  11199. vpclmulqdq $0x01, %xmm5, %xmm6, %xmm1
  11200. vpclmulqdq $0x00, %xmm5, %xmm6, %xmm0
  11201. vpxor %xmm1, %xmm2, %xmm2
  11202. vpslldq $8, %xmm2, %xmm1
  11203. vpsrldq $8, %xmm2, %xmm2
  11204. vpxor %xmm0, %xmm1, %xmm1
  11205. vpclmulqdq $0x11, %xmm5, %xmm6, %xmm6
  11206. vpclmulqdq $16, L_aes_gcm_avx2_mod2_128, %xmm1, %xmm0
  11207. vpshufd $0x4e, %xmm1, %xmm1
  11208. vpxor %xmm0, %xmm1, %xmm1
  11209. vpclmulqdq $16, L_aes_gcm_avx2_mod2_128, %xmm1, %xmm0
  11210. vpshufd $0x4e, %xmm1, %xmm1
  11211. vpxor %xmm2, %xmm6, %xmm6
  11212. vpxor %xmm1, %xmm6, %xmm6
  11213. vpxor %xmm0, %xmm6, %xmm6
  11214. L_AES_GCM_decrypt_avx2_done_dec:
  11215. vmovdqu 80(%esp), %xmm7
  11216. # calc_tag
  11217. movl 216(%esp), %ecx
  11218. shll $3, %ecx
  11219. vpinsrd $0x00, %ecx, %xmm0, %xmm0
  11220. movl 220(%esp), %ecx
  11221. shll $3, %ecx
  11222. vpinsrd $2, %ecx, %xmm0, %xmm0
  11223. movl 216(%esp), %ecx
  11224. shrl $29, %ecx
  11225. vpinsrd $0x01, %ecx, %xmm0, %xmm0
  11226. movl 220(%esp), %ecx
  11227. shrl $29, %ecx
  11228. vpinsrd $3, %ecx, %xmm0, %xmm0
  11229. vpxor %xmm6, %xmm0, %xmm0
  11230. # ghash_gfmul_red
  11231. vpclmulqdq $16, %xmm5, %xmm0, %xmm4
  11232. vpclmulqdq $0x01, %xmm5, %xmm0, %xmm3
  11233. vpclmulqdq $0x00, %xmm5, %xmm0, %xmm2
  11234. vpxor %xmm3, %xmm4, %xmm4
  11235. vpslldq $8, %xmm4, %xmm3
  11236. vpsrldq $8, %xmm4, %xmm4
  11237. vpxor %xmm2, %xmm3, %xmm3
  11238. vpclmulqdq $0x11, %xmm5, %xmm0, %xmm0
  11239. vpclmulqdq $16, L_aes_gcm_avx2_mod2_128, %xmm3, %xmm2
  11240. vpshufd $0x4e, %xmm3, %xmm3
  11241. vpxor %xmm2, %xmm3, %xmm3
  11242. vpclmulqdq $16, L_aes_gcm_avx2_mod2_128, %xmm3, %xmm2
  11243. vpshufd $0x4e, %xmm3, %xmm3
  11244. vpxor %xmm4, %xmm0, %xmm0
  11245. vpxor %xmm3, %xmm0, %xmm0
  11246. vpxor %xmm2, %xmm0, %xmm0
  11247. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm0, %xmm0
  11248. vpxor %xmm7, %xmm0, %xmm0
  11249. movl 212(%esp), %edi
  11250. movl 228(%esp), %ebx
  11251. movl 240(%esp), %ebp
  11252. # cmp_tag
  11253. cmpl $16, %ebx
  11254. je L_AES_GCM_decrypt_avx2_cmp_tag_16
  11255. xorl %edx, %edx
  11256. xorl %ecx, %ecx
  11257. vmovdqu %xmm0, (%esp)
  11258. L_AES_GCM_decrypt_avx2_cmp_tag_loop:
  11259. movzbl (%esp,%edx,1), %eax
  11260. xorb (%edi,%edx,1), %al
  11261. orb %al, %cl
  11262. incl %edx
  11263. cmpl %ebx, %edx
  11264. jne L_AES_GCM_decrypt_avx2_cmp_tag_loop
  11265. cmpb $0x00, %cl
  11266. sete %cl
  11267. jmp L_AES_GCM_decrypt_avx2_cmp_tag_done
  11268. L_AES_GCM_decrypt_avx2_cmp_tag_16:
  11269. vmovdqu (%edi), %xmm1
  11270. vpcmpeqb %xmm1, %xmm0, %xmm0
  11271. vpmovmskb %xmm0, %edx
  11272. # %%edx == 0xFFFF then return 1 else => return 0
  11273. xorl %ecx, %ecx
  11274. cmpl $0xffff, %edx
  11275. sete %cl
  11276. L_AES_GCM_decrypt_avx2_cmp_tag_done:
  11277. movl %ecx, (%ebp)
  11278. addl $0xb0, %esp
  11279. popl %ebp
  11280. popl %edi
  11281. popl %esi
  11282. popl %ebx
  11283. ret
  11284. .size AES_GCM_decrypt_avx2,.-AES_GCM_decrypt_avx2
  11285. #ifdef WOLFSSL_AESGCM_STREAM
  11286. .text
  11287. .globl AES_GCM_init_avx2
  11288. .type AES_GCM_init_avx2,@function
  11289. .align 16
  11290. AES_GCM_init_avx2:
  11291. pushl %ebx
  11292. pushl %esi
  11293. pushl %edi
  11294. pushl %ebp
  11295. subl $32, %esp
  11296. movl 52(%esp), %ebp
  11297. movl 60(%esp), %esi
  11298. movl 76(%esp), %edi
  11299. vpxor %xmm4, %xmm4, %xmm4
  11300. movl 64(%esp), %edx
  11301. cmpl $12, %edx
  11302. je L_AES_GCM_init_avx2_iv_12
  11303. # Calculate values when IV is not 12 bytes
  11304. # H = Encrypt X(=0)
  11305. vmovdqu (%ebp), %xmm5
  11306. vaesenc 16(%ebp), %xmm5, %xmm5
  11307. vaesenc 32(%ebp), %xmm5, %xmm5
  11308. vaesenc 48(%ebp), %xmm5, %xmm5
  11309. vaesenc 64(%ebp), %xmm5, %xmm5
  11310. vaesenc 80(%ebp), %xmm5, %xmm5
  11311. vaesenc 96(%ebp), %xmm5, %xmm5
  11312. vaesenc 112(%ebp), %xmm5, %xmm5
  11313. vaesenc 128(%ebp), %xmm5, %xmm5
  11314. vaesenc 144(%ebp), %xmm5, %xmm5
  11315. cmpl $11, 56(%esp)
  11316. vmovdqu 160(%ebp), %xmm0
  11317. jl L_AES_GCM_init_avx2_calc_iv_1_aesenc_avx_last
  11318. vaesenc %xmm0, %xmm5, %xmm5
  11319. vaesenc 176(%ebp), %xmm5, %xmm5
  11320. cmpl $13, 56(%esp)
  11321. vmovdqu 192(%ebp), %xmm0
  11322. jl L_AES_GCM_init_avx2_calc_iv_1_aesenc_avx_last
  11323. vaesenc %xmm0, %xmm5, %xmm5
  11324. vaesenc 208(%ebp), %xmm5, %xmm5
  11325. vmovdqu 224(%ebp), %xmm0
  11326. L_AES_GCM_init_avx2_calc_iv_1_aesenc_avx_last:
  11327. vaesenclast %xmm0, %xmm5, %xmm5
  11328. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm5, %xmm5
  11329. # Calc counter
  11330. # Initialization vector
  11331. cmpl $0x00, %edx
  11332. movl $0x00, %ecx
  11333. je L_AES_GCM_init_avx2_calc_iv_done
  11334. cmpl $16, %edx
  11335. jl L_AES_GCM_init_avx2_calc_iv_lt16
  11336. andl $0xfffffff0, %edx
  11337. L_AES_GCM_init_avx2_calc_iv_16_loop:
  11338. vmovdqu (%esi,%ecx,1), %xmm0
  11339. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm0, %xmm0
  11340. vpxor %xmm0, %xmm4, %xmm4
  11341. # ghash_gfmul_avx
  11342. vpclmulqdq $16, %xmm4, %xmm5, %xmm2
  11343. vpclmulqdq $0x01, %xmm4, %xmm5, %xmm1
  11344. vpclmulqdq $0x00, %xmm4, %xmm5, %xmm0
  11345. vpclmulqdq $0x11, %xmm4, %xmm5, %xmm3
  11346. vpxor %xmm1, %xmm2, %xmm2
  11347. vpslldq $8, %xmm2, %xmm1
  11348. vpsrldq $8, %xmm2, %xmm2
  11349. vpxor %xmm1, %xmm0, %xmm6
  11350. vpxor %xmm2, %xmm3, %xmm4
  11351. # ghash_mid
  11352. vpsrld $31, %xmm6, %xmm0
  11353. vpsrld $31, %xmm4, %xmm1
  11354. vpslld $0x01, %xmm6, %xmm6
  11355. vpslld $0x01, %xmm4, %xmm4
  11356. vpsrldq $12, %xmm0, %xmm2
  11357. vpslldq $4, %xmm0, %xmm0
  11358. vpslldq $4, %xmm1, %xmm1
  11359. vpor %xmm2, %xmm4, %xmm4
  11360. vpor %xmm0, %xmm6, %xmm6
  11361. vpor %xmm1, %xmm4, %xmm4
  11362. # ghash_red
  11363. vmovdqu L_aes_gcm_avx2_mod2_128, %xmm2
  11364. vpclmulqdq $16, %xmm2, %xmm6, %xmm0
  11365. vpshufd $0x4e, %xmm6, %xmm1
  11366. vpxor %xmm0, %xmm1, %xmm1
  11367. vpclmulqdq $16, %xmm2, %xmm1, %xmm0
  11368. vpshufd $0x4e, %xmm1, %xmm1
  11369. vpxor %xmm0, %xmm1, %xmm1
  11370. vpxor %xmm1, %xmm4, %xmm4
  11371. addl $16, %ecx
  11372. cmpl %edx, %ecx
  11373. jl L_AES_GCM_init_avx2_calc_iv_16_loop
  11374. movl 64(%esp), %edx
  11375. cmpl %edx, %ecx
  11376. je L_AES_GCM_init_avx2_calc_iv_done
  11377. L_AES_GCM_init_avx2_calc_iv_lt16:
  11378. vpxor %xmm0, %xmm0, %xmm0
  11379. xorl %ebx, %ebx
  11380. vmovdqu %xmm0, (%esp)
  11381. L_AES_GCM_init_avx2_calc_iv_loop:
  11382. movzbl (%esi,%ecx,1), %eax
  11383. movb %al, (%esp,%ebx,1)
  11384. incl %ecx
  11385. incl %ebx
  11386. cmpl %edx, %ecx
  11387. jl L_AES_GCM_init_avx2_calc_iv_loop
  11388. vmovdqu (%esp), %xmm0
  11389. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm0, %xmm0
  11390. vpxor %xmm0, %xmm4, %xmm4
  11391. # ghash_gfmul_avx
  11392. vpclmulqdq $16, %xmm4, %xmm5, %xmm2
  11393. vpclmulqdq $0x01, %xmm4, %xmm5, %xmm1
  11394. vpclmulqdq $0x00, %xmm4, %xmm5, %xmm0
  11395. vpclmulqdq $0x11, %xmm4, %xmm5, %xmm3
  11396. vpxor %xmm1, %xmm2, %xmm2
  11397. vpslldq $8, %xmm2, %xmm1
  11398. vpsrldq $8, %xmm2, %xmm2
  11399. vpxor %xmm1, %xmm0, %xmm6
  11400. vpxor %xmm2, %xmm3, %xmm4
  11401. # ghash_mid
  11402. vpsrld $31, %xmm6, %xmm0
  11403. vpsrld $31, %xmm4, %xmm1
  11404. vpslld $0x01, %xmm6, %xmm6
  11405. vpslld $0x01, %xmm4, %xmm4
  11406. vpsrldq $12, %xmm0, %xmm2
  11407. vpslldq $4, %xmm0, %xmm0
  11408. vpslldq $4, %xmm1, %xmm1
  11409. vpor %xmm2, %xmm4, %xmm4
  11410. vpor %xmm0, %xmm6, %xmm6
  11411. vpor %xmm1, %xmm4, %xmm4
  11412. # ghash_red
  11413. vmovdqu L_aes_gcm_avx2_mod2_128, %xmm2
  11414. vpclmulqdq $16, %xmm2, %xmm6, %xmm0
  11415. vpshufd $0x4e, %xmm6, %xmm1
  11416. vpxor %xmm0, %xmm1, %xmm1
  11417. vpclmulqdq $16, %xmm2, %xmm1, %xmm0
  11418. vpshufd $0x4e, %xmm1, %xmm1
  11419. vpxor %xmm0, %xmm1, %xmm1
  11420. vpxor %xmm1, %xmm4, %xmm4
  11421. L_AES_GCM_init_avx2_calc_iv_done:
  11422. # T = Encrypt counter
  11423. vpxor %xmm0, %xmm0, %xmm0
  11424. shll $3, %edx
  11425. vpinsrd $0x00, %edx, %xmm0, %xmm0
  11426. vpxor %xmm0, %xmm4, %xmm4
  11427. # ghash_gfmul_avx
  11428. vpclmulqdq $16, %xmm4, %xmm5, %xmm2
  11429. vpclmulqdq $0x01, %xmm4, %xmm5, %xmm1
  11430. vpclmulqdq $0x00, %xmm4, %xmm5, %xmm0
  11431. vpclmulqdq $0x11, %xmm4, %xmm5, %xmm3
  11432. vpxor %xmm1, %xmm2, %xmm2
  11433. vpslldq $8, %xmm2, %xmm1
  11434. vpsrldq $8, %xmm2, %xmm2
  11435. vpxor %xmm1, %xmm0, %xmm6
  11436. vpxor %xmm2, %xmm3, %xmm4
  11437. # ghash_mid
  11438. vpsrld $31, %xmm6, %xmm0
  11439. vpsrld $31, %xmm4, %xmm1
  11440. vpslld $0x01, %xmm6, %xmm6
  11441. vpslld $0x01, %xmm4, %xmm4
  11442. vpsrldq $12, %xmm0, %xmm2
  11443. vpslldq $4, %xmm0, %xmm0
  11444. vpslldq $4, %xmm1, %xmm1
  11445. vpor %xmm2, %xmm4, %xmm4
  11446. vpor %xmm0, %xmm6, %xmm6
  11447. vpor %xmm1, %xmm4, %xmm4
  11448. # ghash_red
  11449. vmovdqu L_aes_gcm_avx2_mod2_128, %xmm2
  11450. vpclmulqdq $16, %xmm2, %xmm6, %xmm0
  11451. vpshufd $0x4e, %xmm6, %xmm1
  11452. vpxor %xmm0, %xmm1, %xmm1
  11453. vpclmulqdq $16, %xmm2, %xmm1, %xmm0
  11454. vpshufd $0x4e, %xmm1, %xmm1
  11455. vpxor %xmm0, %xmm1, %xmm1
  11456. vpxor %xmm1, %xmm4, %xmm4
  11457. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm4, %xmm4
  11458. # Encrypt counter
  11459. vmovdqu (%ebp), %xmm7
  11460. vpxor %xmm4, %xmm7, %xmm7
  11461. vaesenc 16(%ebp), %xmm7, %xmm7
  11462. vaesenc 32(%ebp), %xmm7, %xmm7
  11463. vaesenc 48(%ebp), %xmm7, %xmm7
  11464. vaesenc 64(%ebp), %xmm7, %xmm7
  11465. vaesenc 80(%ebp), %xmm7, %xmm7
  11466. vaesenc 96(%ebp), %xmm7, %xmm7
  11467. vaesenc 112(%ebp), %xmm7, %xmm7
  11468. vaesenc 128(%ebp), %xmm7, %xmm7
  11469. vaesenc 144(%ebp), %xmm7, %xmm7
  11470. cmpl $11, 56(%esp)
  11471. vmovdqu 160(%ebp), %xmm0
  11472. jl L_AES_GCM_init_avx2_calc_iv_2_aesenc_avx_last
  11473. vaesenc %xmm0, %xmm7, %xmm7
  11474. vaesenc 176(%ebp), %xmm7, %xmm7
  11475. cmpl $13, 56(%esp)
  11476. vmovdqu 192(%ebp), %xmm0
  11477. jl L_AES_GCM_init_avx2_calc_iv_2_aesenc_avx_last
  11478. vaesenc %xmm0, %xmm7, %xmm7
  11479. vaesenc 208(%ebp), %xmm7, %xmm7
  11480. vmovdqu 224(%ebp), %xmm0
  11481. L_AES_GCM_init_avx2_calc_iv_2_aesenc_avx_last:
  11482. vaesenclast %xmm0, %xmm7, %xmm7
  11483. jmp L_AES_GCM_init_avx2_iv_done
  11484. L_AES_GCM_init_avx2_iv_12:
  11485. # # Calculate values when IV is 12 bytes
  11486. # Set counter based on IV
  11487. vmovdqu L_avx2_aes_gcm_bswap_one, %xmm4
  11488. vmovdqu (%ebp), %xmm5
  11489. vpblendd $7, (%esi), %xmm4, %xmm4
  11490. # H = Encrypt X(=0) and T = Encrypt counter
  11491. vmovdqu 16(%ebp), %xmm6
  11492. vpxor %xmm5, %xmm4, %xmm7
  11493. vaesenc %xmm6, %xmm5, %xmm5
  11494. vaesenc %xmm6, %xmm7, %xmm7
  11495. vmovdqu 32(%ebp), %xmm0
  11496. vaesenc %xmm0, %xmm5, %xmm5
  11497. vaesenc %xmm0, %xmm7, %xmm7
  11498. vmovdqu 48(%ebp), %xmm0
  11499. vaesenc %xmm0, %xmm5, %xmm5
  11500. vaesenc %xmm0, %xmm7, %xmm7
  11501. vmovdqu 64(%ebp), %xmm0
  11502. vaesenc %xmm0, %xmm5, %xmm5
  11503. vaesenc %xmm0, %xmm7, %xmm7
  11504. vmovdqu 80(%ebp), %xmm0
  11505. vaesenc %xmm0, %xmm5, %xmm5
  11506. vaesenc %xmm0, %xmm7, %xmm7
  11507. vmovdqu 96(%ebp), %xmm0
  11508. vaesenc %xmm0, %xmm5, %xmm5
  11509. vaesenc %xmm0, %xmm7, %xmm7
  11510. vmovdqu 112(%ebp), %xmm0
  11511. vaesenc %xmm0, %xmm5, %xmm5
  11512. vaesenc %xmm0, %xmm7, %xmm7
  11513. vmovdqu 128(%ebp), %xmm0
  11514. vaesenc %xmm0, %xmm5, %xmm5
  11515. vaesenc %xmm0, %xmm7, %xmm7
  11516. vmovdqu 144(%ebp), %xmm0
  11517. vaesenc %xmm0, %xmm5, %xmm5
  11518. vaesenc %xmm0, %xmm7, %xmm7
  11519. cmpl $11, 56(%esp)
  11520. vmovdqu 160(%ebp), %xmm0
  11521. jl L_AES_GCM_init_avx2_calc_iv_12_last
  11522. vaesenc %xmm0, %xmm5, %xmm5
  11523. vaesenc %xmm0, %xmm7, %xmm7
  11524. vmovdqu 176(%ebp), %xmm0
  11525. vaesenc %xmm0, %xmm5, %xmm5
  11526. vaesenc %xmm0, %xmm7, %xmm7
  11527. cmpl $13, 56(%esp)
  11528. vmovdqu 192(%ebp), %xmm0
  11529. jl L_AES_GCM_init_avx2_calc_iv_12_last
  11530. vaesenc %xmm0, %xmm5, %xmm5
  11531. vaesenc %xmm0, %xmm7, %xmm7
  11532. vmovdqu 208(%ebp), %xmm0
  11533. vaesenc %xmm0, %xmm5, %xmm5
  11534. vaesenc %xmm0, %xmm7, %xmm7
  11535. vmovdqu 224(%ebp), %xmm0
  11536. L_AES_GCM_init_avx2_calc_iv_12_last:
  11537. vaesenclast %xmm0, %xmm5, %xmm5
  11538. vaesenclast %xmm0, %xmm7, %xmm7
  11539. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm5, %xmm5
  11540. L_AES_GCM_init_avx2_iv_done:
  11541. vmovdqu %xmm7, (%edi)
  11542. movl 68(%esp), %ebp
  11543. movl 72(%esp), %edi
  11544. vpshufb L_aes_gcm_avx2_bswap_epi64, %xmm4, %xmm4
  11545. vpaddd L_aes_gcm_avx2_one, %xmm4, %xmm4
  11546. vmovdqu %xmm5, (%ebp)
  11547. vmovdqu %xmm4, (%edi)
  11548. addl $32, %esp
  11549. popl %ebp
  11550. popl %edi
  11551. popl %esi
  11552. popl %ebx
  11553. ret
  11554. .size AES_GCM_init_avx2,.-AES_GCM_init_avx2
  11555. .text
  11556. .globl AES_GCM_aad_update_avx2
  11557. .type AES_GCM_aad_update_avx2,@function
  11558. .align 16
  11559. AES_GCM_aad_update_avx2:
  11560. pushl %esi
  11561. pushl %edi
  11562. movl 12(%esp), %esi
  11563. movl 16(%esp), %edx
  11564. movl 20(%esp), %edi
  11565. movl 24(%esp), %eax
  11566. vmovdqu (%edi), %xmm4
  11567. vmovdqu (%eax), %xmm5
  11568. xorl %ecx, %ecx
  11569. L_AES_GCM_aad_update_avx2_16_loop:
  11570. vmovdqu (%esi,%ecx,1), %xmm0
  11571. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm0, %xmm0
  11572. vpxor %xmm0, %xmm4, %xmm4
  11573. # ghash_gfmul_avx
  11574. vpclmulqdq $16, %xmm4, %xmm5, %xmm2
  11575. vpclmulqdq $0x01, %xmm4, %xmm5, %xmm1
  11576. vpclmulqdq $0x00, %xmm4, %xmm5, %xmm0
  11577. vpclmulqdq $0x11, %xmm4, %xmm5, %xmm3
  11578. vpxor %xmm1, %xmm2, %xmm2
  11579. vpslldq $8, %xmm2, %xmm1
  11580. vpsrldq $8, %xmm2, %xmm2
  11581. vpxor %xmm1, %xmm0, %xmm6
  11582. vpxor %xmm2, %xmm3, %xmm4
  11583. # ghash_mid
  11584. vpsrld $31, %xmm6, %xmm0
  11585. vpsrld $31, %xmm4, %xmm1
  11586. vpslld $0x01, %xmm6, %xmm6
  11587. vpslld $0x01, %xmm4, %xmm4
  11588. vpsrldq $12, %xmm0, %xmm2
  11589. vpslldq $4, %xmm0, %xmm0
  11590. vpslldq $4, %xmm1, %xmm1
  11591. vpor %xmm2, %xmm4, %xmm4
  11592. vpor %xmm0, %xmm6, %xmm6
  11593. vpor %xmm1, %xmm4, %xmm4
  11594. # ghash_red
  11595. vmovdqu L_aes_gcm_avx2_mod2_128, %xmm2
  11596. vpclmulqdq $16, %xmm2, %xmm6, %xmm0
  11597. vpshufd $0x4e, %xmm6, %xmm1
  11598. vpxor %xmm0, %xmm1, %xmm1
  11599. vpclmulqdq $16, %xmm2, %xmm1, %xmm0
  11600. vpshufd $0x4e, %xmm1, %xmm1
  11601. vpxor %xmm0, %xmm1, %xmm1
  11602. vpxor %xmm1, %xmm4, %xmm4
  11603. addl $16, %ecx
  11604. cmpl %edx, %ecx
  11605. jl L_AES_GCM_aad_update_avx2_16_loop
  11606. vmovdqu %xmm4, (%edi)
  11607. popl %edi
  11608. popl %esi
  11609. ret
  11610. .size AES_GCM_aad_update_avx2,.-AES_GCM_aad_update_avx2
  11611. .text
  11612. .globl AES_GCM_encrypt_block_avx2
  11613. .type AES_GCM_encrypt_block_avx2,@function
  11614. .align 16
  11615. AES_GCM_encrypt_block_avx2:
  11616. pushl %esi
  11617. pushl %edi
  11618. movl 12(%esp), %ecx
  11619. movl 16(%esp), %eax
  11620. movl 20(%esp), %edi
  11621. movl 24(%esp), %esi
  11622. movl 28(%esp), %edx
  11623. vmovdqu (%edx), %xmm3
  11624. # aesenc_block
  11625. vmovdqu %xmm3, %xmm1
  11626. vpshufb L_aes_gcm_avx2_bswap_epi64, %xmm1, %xmm0
  11627. vpaddd L_aes_gcm_avx2_one, %xmm1, %xmm1
  11628. vpxor (%ecx), %xmm0, %xmm0
  11629. vaesenc 16(%ecx), %xmm0, %xmm0
  11630. vaesenc 32(%ecx), %xmm0, %xmm0
  11631. vaesenc 48(%ecx), %xmm0, %xmm0
  11632. vaesenc 64(%ecx), %xmm0, %xmm0
  11633. vaesenc 80(%ecx), %xmm0, %xmm0
  11634. vaesenc 96(%ecx), %xmm0, %xmm0
  11635. vaesenc 112(%ecx), %xmm0, %xmm0
  11636. vaesenc 128(%ecx), %xmm0, %xmm0
  11637. vaesenc 144(%ecx), %xmm0, %xmm0
  11638. cmpl $11, %eax
  11639. vmovdqu 160(%ecx), %xmm2
  11640. jl L_AES_GCM_encrypt_block_avx2_aesenc_block_aesenc_avx_last
  11641. vaesenc %xmm2, %xmm0, %xmm0
  11642. vaesenc 176(%ecx), %xmm0, %xmm0
  11643. cmpl $13, %eax
  11644. vmovdqu 192(%ecx), %xmm2
  11645. jl L_AES_GCM_encrypt_block_avx2_aesenc_block_aesenc_avx_last
  11646. vaesenc %xmm2, %xmm0, %xmm0
  11647. vaesenc 208(%ecx), %xmm0, %xmm0
  11648. vmovdqu 224(%ecx), %xmm2
  11649. L_AES_GCM_encrypt_block_avx2_aesenc_block_aesenc_avx_last:
  11650. vaesenclast %xmm2, %xmm0, %xmm0
  11651. vmovdqu %xmm1, %xmm3
  11652. vmovdqu (%esi), %xmm1
  11653. vpxor %xmm1, %xmm0, %xmm0
  11654. vmovdqu %xmm0, (%edi)
  11655. vmovdqu %xmm3, (%edx)
  11656. popl %edi
  11657. popl %esi
  11658. ret
  11659. .size AES_GCM_encrypt_block_avx2,.-AES_GCM_encrypt_block_avx2
  11660. .text
  11661. .globl AES_GCM_ghash_block_avx2
  11662. .type AES_GCM_ghash_block_avx2,@function
  11663. .align 16
  11664. AES_GCM_ghash_block_avx2:
  11665. movl 4(%esp), %edx
  11666. movl 8(%esp), %eax
  11667. movl 12(%esp), %ecx
  11668. vmovdqu (%eax), %xmm4
  11669. vmovdqu (%ecx), %xmm5
  11670. vmovdqu (%edx), %xmm0
  11671. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm0, %xmm0
  11672. vpxor %xmm0, %xmm4, %xmm4
  11673. # ghash_gfmul_avx
  11674. vpclmulqdq $16, %xmm4, %xmm5, %xmm2
  11675. vpclmulqdq $0x01, %xmm4, %xmm5, %xmm1
  11676. vpclmulqdq $0x00, %xmm4, %xmm5, %xmm0
  11677. vpclmulqdq $0x11, %xmm4, %xmm5, %xmm3
  11678. vpxor %xmm1, %xmm2, %xmm2
  11679. vpslldq $8, %xmm2, %xmm1
  11680. vpsrldq $8, %xmm2, %xmm2
  11681. vpxor %xmm1, %xmm0, %xmm6
  11682. vpxor %xmm2, %xmm3, %xmm4
  11683. # ghash_mid
  11684. vpsrld $31, %xmm6, %xmm0
  11685. vpsrld $31, %xmm4, %xmm1
  11686. vpslld $0x01, %xmm6, %xmm6
  11687. vpslld $0x01, %xmm4, %xmm4
  11688. vpsrldq $12, %xmm0, %xmm2
  11689. vpslldq $4, %xmm0, %xmm0
  11690. vpslldq $4, %xmm1, %xmm1
  11691. vpor %xmm2, %xmm4, %xmm4
  11692. vpor %xmm0, %xmm6, %xmm6
  11693. vpor %xmm1, %xmm4, %xmm4
  11694. # ghash_red
  11695. vmovdqu L_aes_gcm_avx2_mod2_128, %xmm2
  11696. vpclmulqdq $16, %xmm2, %xmm6, %xmm0
  11697. vpshufd $0x4e, %xmm6, %xmm1
  11698. vpxor %xmm0, %xmm1, %xmm1
  11699. vpclmulqdq $16, %xmm2, %xmm1, %xmm0
  11700. vpshufd $0x4e, %xmm1, %xmm1
  11701. vpxor %xmm0, %xmm1, %xmm1
  11702. vpxor %xmm1, %xmm4, %xmm4
  11703. vmovdqu %xmm4, (%eax)
  11704. ret
  11705. .size AES_GCM_ghash_block_avx2,.-AES_GCM_ghash_block_avx2
  11706. .text
  11707. .globl AES_GCM_encrypt_update_avx2
  11708. .type AES_GCM_encrypt_update_avx2,@function
  11709. .align 16
  11710. AES_GCM_encrypt_update_avx2:
  11711. pushl %ebx
  11712. pushl %esi
  11713. pushl %edi
  11714. pushl %ebp
  11715. subl $0x60, %esp
  11716. movl 144(%esp), %esi
  11717. vmovdqu (%esi), %xmm4
  11718. vmovdqu %xmm4, 64(%esp)
  11719. movl 136(%esp), %esi
  11720. movl 140(%esp), %ebp
  11721. vmovdqu (%esi), %xmm6
  11722. vmovdqu (%ebp), %xmm5
  11723. vmovdqu %xmm6, 80(%esp)
  11724. movl 116(%esp), %ebp
  11725. movl 124(%esp), %edi
  11726. movl 128(%esp), %esi
  11727. # Calculate H
  11728. vpsrlq $63, %xmm5, %xmm1
  11729. vpsllq $0x01, %xmm5, %xmm0
  11730. vpslldq $8, %xmm1, %xmm1
  11731. vpor %xmm1, %xmm0, %xmm0
  11732. vpshufd $0xff, %xmm5, %xmm5
  11733. vpsrad $31, %xmm5, %xmm5
  11734. vpand L_aes_gcm_avx2_mod2_128, %xmm5, %xmm5
  11735. vpxor %xmm0, %xmm5, %xmm5
  11736. xorl %ebx, %ebx
  11737. cmpl $0x40, 132(%esp)
  11738. movl 132(%esp), %eax
  11739. jl L_AES_GCM_encrypt_update_avx2_done_64
  11740. andl $0xffffffc0, %eax
  11741. vmovdqu %xmm4, 64(%esp)
  11742. vmovdqu %xmm6, 80(%esp)
  11743. vmovdqu L_aes_gcm_avx2_mod2_128, %xmm3
  11744. # H ^ 1
  11745. vmovdqu %xmm5, (%esp)
  11746. vmovdqu %xmm5, %xmm2
  11747. # H ^ 2
  11748. vpclmulqdq $0x00, %xmm2, %xmm2, %xmm5
  11749. vpclmulqdq $0x11, %xmm2, %xmm2, %xmm6
  11750. vpclmulqdq $16, %xmm3, %xmm5, %xmm4
  11751. vpshufd $0x4e, %xmm5, %xmm5
  11752. vpxor %xmm4, %xmm5, %xmm5
  11753. vpclmulqdq $16, %xmm3, %xmm5, %xmm4
  11754. vpshufd $0x4e, %xmm5, %xmm5
  11755. vpxor %xmm4, %xmm5, %xmm5
  11756. vpxor %xmm5, %xmm6, %xmm0
  11757. vmovdqu %xmm0, 16(%esp)
  11758. # H ^ 3
  11759. # ghash_gfmul_red
  11760. vpclmulqdq $16, %xmm0, %xmm2, %xmm6
  11761. vpclmulqdq $0x01, %xmm0, %xmm2, %xmm5
  11762. vpclmulqdq $0x00, %xmm0, %xmm2, %xmm4
  11763. vpxor %xmm5, %xmm6, %xmm6
  11764. vpslldq $8, %xmm6, %xmm5
  11765. vpsrldq $8, %xmm6, %xmm6
  11766. vpxor %xmm4, %xmm5, %xmm5
  11767. vpclmulqdq $0x11, %xmm0, %xmm2, %xmm1
  11768. vpclmulqdq $16, %xmm3, %xmm5, %xmm4
  11769. vpshufd $0x4e, %xmm5, %xmm5
  11770. vpxor %xmm4, %xmm5, %xmm5
  11771. vpclmulqdq $16, %xmm3, %xmm5, %xmm4
  11772. vpshufd $0x4e, %xmm5, %xmm5
  11773. vpxor %xmm6, %xmm1, %xmm1
  11774. vpxor %xmm5, %xmm1, %xmm1
  11775. vpxor %xmm4, %xmm1, %xmm1
  11776. vmovdqu %xmm1, 32(%esp)
  11777. # H ^ 4
  11778. vpclmulqdq $0x00, %xmm0, %xmm0, %xmm5
  11779. vpclmulqdq $0x11, %xmm0, %xmm0, %xmm6
  11780. vpclmulqdq $16, %xmm3, %xmm5, %xmm4
  11781. vpshufd $0x4e, %xmm5, %xmm5
  11782. vpxor %xmm4, %xmm5, %xmm5
  11783. vpclmulqdq $16, %xmm3, %xmm5, %xmm4
  11784. vpshufd $0x4e, %xmm5, %xmm5
  11785. vpxor %xmm4, %xmm5, %xmm5
  11786. vpxor %xmm5, %xmm6, %xmm2
  11787. vmovdqu %xmm2, 48(%esp)
  11788. vmovdqu 80(%esp), %xmm6
  11789. # First 64 bytes of input
  11790. # aesenc_64
  11791. # aesenc_ctr
  11792. vmovdqu 64(%esp), %xmm4
  11793. vmovdqu L_aes_gcm_avx2_bswap_epi64, %xmm7
  11794. vpaddd L_aes_gcm_avx2_one, %xmm4, %xmm1
  11795. vpshufb %xmm7, %xmm4, %xmm0
  11796. vpaddd L_aes_gcm_avx2_two, %xmm4, %xmm2
  11797. vpshufb %xmm7, %xmm1, %xmm1
  11798. vpaddd L_aes_gcm_avx2_three, %xmm4, %xmm3
  11799. vpshufb %xmm7, %xmm2, %xmm2
  11800. vpaddd L_aes_gcm_avx2_four, %xmm4, %xmm4
  11801. vpshufb %xmm7, %xmm3, %xmm3
  11802. # aesenc_xor
  11803. vmovdqu (%ebp), %xmm7
  11804. vmovdqu %xmm4, 64(%esp)
  11805. vpxor %xmm7, %xmm0, %xmm0
  11806. vpxor %xmm7, %xmm1, %xmm1
  11807. vpxor %xmm7, %xmm2, %xmm2
  11808. vpxor %xmm7, %xmm3, %xmm3
  11809. vmovdqu 16(%ebp), %xmm7
  11810. vaesenc %xmm7, %xmm0, %xmm0
  11811. vaesenc %xmm7, %xmm1, %xmm1
  11812. vaesenc %xmm7, %xmm2, %xmm2
  11813. vaesenc %xmm7, %xmm3, %xmm3
  11814. vmovdqu 32(%ebp), %xmm7
  11815. vaesenc %xmm7, %xmm0, %xmm0
  11816. vaesenc %xmm7, %xmm1, %xmm1
  11817. vaesenc %xmm7, %xmm2, %xmm2
  11818. vaesenc %xmm7, %xmm3, %xmm3
  11819. vmovdqu 48(%ebp), %xmm7
  11820. vaesenc %xmm7, %xmm0, %xmm0
  11821. vaesenc %xmm7, %xmm1, %xmm1
  11822. vaesenc %xmm7, %xmm2, %xmm2
  11823. vaesenc %xmm7, %xmm3, %xmm3
  11824. vmovdqu 64(%ebp), %xmm7
  11825. vaesenc %xmm7, %xmm0, %xmm0
  11826. vaesenc %xmm7, %xmm1, %xmm1
  11827. vaesenc %xmm7, %xmm2, %xmm2
  11828. vaesenc %xmm7, %xmm3, %xmm3
  11829. vmovdqu 80(%ebp), %xmm7
  11830. vaesenc %xmm7, %xmm0, %xmm0
  11831. vaesenc %xmm7, %xmm1, %xmm1
  11832. vaesenc %xmm7, %xmm2, %xmm2
  11833. vaesenc %xmm7, %xmm3, %xmm3
  11834. vmovdqu 96(%ebp), %xmm7
  11835. vaesenc %xmm7, %xmm0, %xmm0
  11836. vaesenc %xmm7, %xmm1, %xmm1
  11837. vaesenc %xmm7, %xmm2, %xmm2
  11838. vaesenc %xmm7, %xmm3, %xmm3
  11839. vmovdqu 112(%ebp), %xmm7
  11840. vaesenc %xmm7, %xmm0, %xmm0
  11841. vaesenc %xmm7, %xmm1, %xmm1
  11842. vaesenc %xmm7, %xmm2, %xmm2
  11843. vaesenc %xmm7, %xmm3, %xmm3
  11844. vmovdqu 128(%ebp), %xmm7
  11845. vaesenc %xmm7, %xmm0, %xmm0
  11846. vaesenc %xmm7, %xmm1, %xmm1
  11847. vaesenc %xmm7, %xmm2, %xmm2
  11848. vaesenc %xmm7, %xmm3, %xmm3
  11849. vmovdqu 144(%ebp), %xmm7
  11850. vaesenc %xmm7, %xmm0, %xmm0
  11851. vaesenc %xmm7, %xmm1, %xmm1
  11852. vaesenc %xmm7, %xmm2, %xmm2
  11853. vaesenc %xmm7, %xmm3, %xmm3
  11854. cmpl $11, 120(%esp)
  11855. vmovdqu 160(%ebp), %xmm7
  11856. jl L_AES_GCM_encrypt_update_avx2_aesenc_64_enc_done
  11857. vaesenc %xmm7, %xmm0, %xmm0
  11858. vaesenc %xmm7, %xmm1, %xmm1
  11859. vaesenc %xmm7, %xmm2, %xmm2
  11860. vaesenc %xmm7, %xmm3, %xmm3
  11861. vmovdqu 176(%ebp), %xmm7
  11862. vaesenc %xmm7, %xmm0, %xmm0
  11863. vaesenc %xmm7, %xmm1, %xmm1
  11864. vaesenc %xmm7, %xmm2, %xmm2
  11865. vaesenc %xmm7, %xmm3, %xmm3
  11866. cmpl $13, 120(%esp)
  11867. vmovdqu 192(%ebp), %xmm7
  11868. jl L_AES_GCM_encrypt_update_avx2_aesenc_64_enc_done
  11869. vaesenc %xmm7, %xmm0, %xmm0
  11870. vaesenc %xmm7, %xmm1, %xmm1
  11871. vaesenc %xmm7, %xmm2, %xmm2
  11872. vaesenc %xmm7, %xmm3, %xmm3
  11873. vmovdqu 208(%ebp), %xmm7
  11874. vaesenc %xmm7, %xmm0, %xmm0
  11875. vaesenc %xmm7, %xmm1, %xmm1
  11876. vaesenc %xmm7, %xmm2, %xmm2
  11877. vaesenc %xmm7, %xmm3, %xmm3
  11878. vmovdqu 224(%ebp), %xmm7
  11879. L_AES_GCM_encrypt_update_avx2_aesenc_64_enc_done:
  11880. # aesenc_last
  11881. vaesenclast %xmm7, %xmm0, %xmm0
  11882. vaesenclast %xmm7, %xmm1, %xmm1
  11883. vaesenclast %xmm7, %xmm2, %xmm2
  11884. vaesenclast %xmm7, %xmm3, %xmm3
  11885. vmovdqu (%esi), %xmm7
  11886. vmovdqu 16(%esi), %xmm4
  11887. vpxor %xmm7, %xmm0, %xmm0
  11888. vpxor %xmm4, %xmm1, %xmm1
  11889. vmovdqu %xmm0, (%edi)
  11890. vmovdqu %xmm1, 16(%edi)
  11891. vmovdqu 32(%esi), %xmm7
  11892. vmovdqu 48(%esi), %xmm4
  11893. vpxor %xmm7, %xmm2, %xmm2
  11894. vpxor %xmm4, %xmm3, %xmm3
  11895. vmovdqu %xmm2, 32(%edi)
  11896. vmovdqu %xmm3, 48(%edi)
  11897. cmpl $0x40, %eax
  11898. movl $0x40, %ebx
  11899. movl %esi, %ecx
  11900. movl %edi, %edx
  11901. jle L_AES_GCM_encrypt_update_avx2_end_64
  11902. # More 64 bytes of input
  11903. L_AES_GCM_encrypt_update_avx2_ghash_64:
  11904. # aesenc_64_ghash
  11905. leal (%esi,%ebx,1), %ecx
  11906. leal (%edi,%ebx,1), %edx
  11907. # aesenc_64
  11908. # aesenc_ctr
  11909. vmovdqu 64(%esp), %xmm4
  11910. vmovdqu L_aes_gcm_avx2_bswap_epi64, %xmm7
  11911. vpaddd L_aes_gcm_avx2_one, %xmm4, %xmm1
  11912. vpshufb %xmm7, %xmm4, %xmm0
  11913. vpaddd L_aes_gcm_avx2_two, %xmm4, %xmm2
  11914. vpshufb %xmm7, %xmm1, %xmm1
  11915. vpaddd L_aes_gcm_avx2_three, %xmm4, %xmm3
  11916. vpshufb %xmm7, %xmm2, %xmm2
  11917. vpaddd L_aes_gcm_avx2_four, %xmm4, %xmm4
  11918. vpshufb %xmm7, %xmm3, %xmm3
  11919. # aesenc_xor
  11920. vmovdqu (%ebp), %xmm7
  11921. vmovdqu %xmm4, 64(%esp)
  11922. vpxor %xmm7, %xmm0, %xmm0
  11923. vpxor %xmm7, %xmm1, %xmm1
  11924. vpxor %xmm7, %xmm2, %xmm2
  11925. vpxor %xmm7, %xmm3, %xmm3
  11926. vmovdqu 16(%ebp), %xmm7
  11927. vaesenc %xmm7, %xmm0, %xmm0
  11928. vaesenc %xmm7, %xmm1, %xmm1
  11929. vaesenc %xmm7, %xmm2, %xmm2
  11930. vaesenc %xmm7, %xmm3, %xmm3
  11931. vmovdqu 32(%ebp), %xmm7
  11932. vaesenc %xmm7, %xmm0, %xmm0
  11933. vaesenc %xmm7, %xmm1, %xmm1
  11934. vaesenc %xmm7, %xmm2, %xmm2
  11935. vaesenc %xmm7, %xmm3, %xmm3
  11936. vmovdqu 48(%ebp), %xmm7
  11937. vaesenc %xmm7, %xmm0, %xmm0
  11938. vaesenc %xmm7, %xmm1, %xmm1
  11939. vaesenc %xmm7, %xmm2, %xmm2
  11940. vaesenc %xmm7, %xmm3, %xmm3
  11941. vmovdqu 64(%ebp), %xmm7
  11942. vaesenc %xmm7, %xmm0, %xmm0
  11943. vaesenc %xmm7, %xmm1, %xmm1
  11944. vaesenc %xmm7, %xmm2, %xmm2
  11945. vaesenc %xmm7, %xmm3, %xmm3
  11946. vmovdqu 80(%ebp), %xmm7
  11947. vaesenc %xmm7, %xmm0, %xmm0
  11948. vaesenc %xmm7, %xmm1, %xmm1
  11949. vaesenc %xmm7, %xmm2, %xmm2
  11950. vaesenc %xmm7, %xmm3, %xmm3
  11951. vmovdqu 96(%ebp), %xmm7
  11952. vaesenc %xmm7, %xmm0, %xmm0
  11953. vaesenc %xmm7, %xmm1, %xmm1
  11954. vaesenc %xmm7, %xmm2, %xmm2
  11955. vaesenc %xmm7, %xmm3, %xmm3
  11956. vmovdqu 112(%ebp), %xmm7
  11957. vaesenc %xmm7, %xmm0, %xmm0
  11958. vaesenc %xmm7, %xmm1, %xmm1
  11959. vaesenc %xmm7, %xmm2, %xmm2
  11960. vaesenc %xmm7, %xmm3, %xmm3
  11961. vmovdqu 128(%ebp), %xmm7
  11962. vaesenc %xmm7, %xmm0, %xmm0
  11963. vaesenc %xmm7, %xmm1, %xmm1
  11964. vaesenc %xmm7, %xmm2, %xmm2
  11965. vaesenc %xmm7, %xmm3, %xmm3
  11966. vmovdqu 144(%ebp), %xmm7
  11967. vaesenc %xmm7, %xmm0, %xmm0
  11968. vaesenc %xmm7, %xmm1, %xmm1
  11969. vaesenc %xmm7, %xmm2, %xmm2
  11970. vaesenc %xmm7, %xmm3, %xmm3
  11971. cmpl $11, 120(%esp)
  11972. vmovdqu 160(%ebp), %xmm7
  11973. jl L_AES_GCM_encrypt_update_avx2_aesenc_64_ghash_aesenc_64_enc_done
  11974. vaesenc %xmm7, %xmm0, %xmm0
  11975. vaesenc %xmm7, %xmm1, %xmm1
  11976. vaesenc %xmm7, %xmm2, %xmm2
  11977. vaesenc %xmm7, %xmm3, %xmm3
  11978. vmovdqu 176(%ebp), %xmm7
  11979. vaesenc %xmm7, %xmm0, %xmm0
  11980. vaesenc %xmm7, %xmm1, %xmm1
  11981. vaesenc %xmm7, %xmm2, %xmm2
  11982. vaesenc %xmm7, %xmm3, %xmm3
  11983. cmpl $13, 120(%esp)
  11984. vmovdqu 192(%ebp), %xmm7
  11985. jl L_AES_GCM_encrypt_update_avx2_aesenc_64_ghash_aesenc_64_enc_done
  11986. vaesenc %xmm7, %xmm0, %xmm0
  11987. vaesenc %xmm7, %xmm1, %xmm1
  11988. vaesenc %xmm7, %xmm2, %xmm2
  11989. vaesenc %xmm7, %xmm3, %xmm3
  11990. vmovdqu 208(%ebp), %xmm7
  11991. vaesenc %xmm7, %xmm0, %xmm0
  11992. vaesenc %xmm7, %xmm1, %xmm1
  11993. vaesenc %xmm7, %xmm2, %xmm2
  11994. vaesenc %xmm7, %xmm3, %xmm3
  11995. vmovdqu 224(%ebp), %xmm7
  11996. L_AES_GCM_encrypt_update_avx2_aesenc_64_ghash_aesenc_64_enc_done:
  11997. # aesenc_last
  11998. vaesenclast %xmm7, %xmm0, %xmm0
  11999. vaesenclast %xmm7, %xmm1, %xmm1
  12000. vaesenclast %xmm7, %xmm2, %xmm2
  12001. vaesenclast %xmm7, %xmm3, %xmm3
  12002. vmovdqu (%ecx), %xmm7
  12003. vmovdqu 16(%ecx), %xmm4
  12004. vpxor %xmm7, %xmm0, %xmm0
  12005. vpxor %xmm4, %xmm1, %xmm1
  12006. vmovdqu %xmm0, (%edx)
  12007. vmovdqu %xmm1, 16(%edx)
  12008. vmovdqu 32(%ecx), %xmm7
  12009. vmovdqu 48(%ecx), %xmm4
  12010. vpxor %xmm7, %xmm2, %xmm2
  12011. vpxor %xmm4, %xmm3, %xmm3
  12012. vmovdqu %xmm2, 32(%edx)
  12013. vmovdqu %xmm3, 48(%edx)
  12014. # pclmul_1
  12015. vmovdqu -64(%edx), %xmm1
  12016. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm1, %xmm1
  12017. vmovdqu 48(%esp), %xmm2
  12018. vpxor %xmm6, %xmm1, %xmm1
  12019. vpclmulqdq $16, %xmm2, %xmm1, %xmm5
  12020. vpclmulqdq $0x01, %xmm2, %xmm1, %xmm3
  12021. vpclmulqdq $0x00, %xmm2, %xmm1, %xmm6
  12022. vpclmulqdq $0x11, %xmm2, %xmm1, %xmm7
  12023. # pclmul_2
  12024. vmovdqu -48(%edx), %xmm1
  12025. vmovdqu 32(%esp), %xmm0
  12026. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm1, %xmm1
  12027. vpxor %xmm3, %xmm5, %xmm5
  12028. vpclmulqdq $16, %xmm0, %xmm1, %xmm2
  12029. vpclmulqdq $0x01, %xmm0, %xmm1, %xmm3
  12030. vpclmulqdq $0x00, %xmm0, %xmm1, %xmm4
  12031. vpclmulqdq $0x11, %xmm0, %xmm1, %xmm1
  12032. vpxor %xmm1, %xmm7, %xmm7
  12033. # pclmul_n
  12034. vmovdqu -32(%edx), %xmm1
  12035. vmovdqu 16(%esp), %xmm0
  12036. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm1, %xmm1
  12037. vpxor %xmm2, %xmm5, %xmm5
  12038. vpclmulqdq $16, %xmm0, %xmm1, %xmm2
  12039. vpxor %xmm3, %xmm5, %xmm5
  12040. vpclmulqdq $0x01, %xmm0, %xmm1, %xmm3
  12041. vpxor %xmm4, %xmm6, %xmm6
  12042. vpclmulqdq $0x00, %xmm0, %xmm1, %xmm4
  12043. vpclmulqdq $0x11, %xmm0, %xmm1, %xmm1
  12044. vpxor %xmm1, %xmm7, %xmm7
  12045. # pclmul_n
  12046. vmovdqu -16(%edx), %xmm1
  12047. vmovdqu (%esp), %xmm0
  12048. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm1, %xmm1
  12049. vpxor %xmm2, %xmm5, %xmm5
  12050. vpclmulqdq $16, %xmm0, %xmm1, %xmm2
  12051. vpxor %xmm3, %xmm5, %xmm5
  12052. vpclmulqdq $0x01, %xmm0, %xmm1, %xmm3
  12053. vpxor %xmm4, %xmm6, %xmm6
  12054. vpclmulqdq $0x00, %xmm0, %xmm1, %xmm4
  12055. vpclmulqdq $0x11, %xmm0, %xmm1, %xmm1
  12056. vpxor %xmm1, %xmm7, %xmm7
  12057. # aesenc_pclmul_l
  12058. vpxor %xmm2, %xmm5, %xmm5
  12059. vpxor %xmm4, %xmm6, %xmm6
  12060. vpxor %xmm3, %xmm5, %xmm5
  12061. vpslldq $8, %xmm5, %xmm1
  12062. vpsrldq $8, %xmm5, %xmm5
  12063. vmovdqu L_aes_gcm_avx2_mod2_128, %xmm0
  12064. vpxor %xmm1, %xmm6, %xmm6
  12065. vpxor %xmm5, %xmm7, %xmm7
  12066. vpclmulqdq $16, %xmm0, %xmm6, %xmm3
  12067. vpshufd $0x4e, %xmm6, %xmm6
  12068. vpxor %xmm3, %xmm6, %xmm6
  12069. vpclmulqdq $16, %xmm0, %xmm6, %xmm3
  12070. vpshufd $0x4e, %xmm6, %xmm6
  12071. vpxor %xmm3, %xmm6, %xmm6
  12072. vpxor %xmm7, %xmm6, %xmm6
  12073. # aesenc_64_ghash - end
  12074. addl $0x40, %ebx
  12075. cmpl %eax, %ebx
  12076. jl L_AES_GCM_encrypt_update_avx2_ghash_64
  12077. L_AES_GCM_encrypt_update_avx2_end_64:
  12078. vmovdqu %xmm6, 80(%esp)
  12079. vmovdqu 48(%edx), %xmm3
  12080. vmovdqu (%esp), %xmm7
  12081. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm3, %xmm3
  12082. vpclmulqdq $16, %xmm3, %xmm7, %xmm5
  12083. vpclmulqdq $0x01, %xmm3, %xmm7, %xmm1
  12084. vpclmulqdq $0x00, %xmm3, %xmm7, %xmm4
  12085. vpclmulqdq $0x11, %xmm3, %xmm7, %xmm6
  12086. vpxor %xmm1, %xmm5, %xmm5
  12087. vmovdqu 32(%edx), %xmm3
  12088. vmovdqu 16(%esp), %xmm7
  12089. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm3, %xmm3
  12090. vpclmulqdq $16, %xmm3, %xmm7, %xmm2
  12091. vpclmulqdq $0x01, %xmm3, %xmm7, %xmm1
  12092. vpclmulqdq $0x00, %xmm3, %xmm7, %xmm0
  12093. vpclmulqdq $0x11, %xmm3, %xmm7, %xmm3
  12094. vpxor %xmm1, %xmm2, %xmm2
  12095. vpxor %xmm3, %xmm6, %xmm6
  12096. vpxor %xmm2, %xmm5, %xmm5
  12097. vpxor %xmm0, %xmm4, %xmm4
  12098. vmovdqu 16(%edx), %xmm3
  12099. vmovdqu 32(%esp), %xmm7
  12100. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm3, %xmm3
  12101. vpclmulqdq $16, %xmm3, %xmm7, %xmm2
  12102. vpclmulqdq $0x01, %xmm3, %xmm7, %xmm1
  12103. vpclmulqdq $0x00, %xmm3, %xmm7, %xmm0
  12104. vpclmulqdq $0x11, %xmm3, %xmm7, %xmm3
  12105. vpxor %xmm1, %xmm2, %xmm2
  12106. vpxor %xmm3, %xmm6, %xmm6
  12107. vpxor %xmm2, %xmm5, %xmm5
  12108. vpxor %xmm0, %xmm4, %xmm4
  12109. vmovdqu 80(%esp), %xmm0
  12110. vmovdqu (%edx), %xmm3
  12111. vmovdqu 48(%esp), %xmm7
  12112. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm3, %xmm3
  12113. vpxor %xmm0, %xmm3, %xmm3
  12114. vpclmulqdq $16, %xmm3, %xmm7, %xmm2
  12115. vpclmulqdq $0x01, %xmm3, %xmm7, %xmm1
  12116. vpclmulqdq $0x00, %xmm3, %xmm7, %xmm0
  12117. vpclmulqdq $0x11, %xmm3, %xmm7, %xmm3
  12118. vpxor %xmm1, %xmm2, %xmm2
  12119. vpxor %xmm3, %xmm6, %xmm6
  12120. vpxor %xmm2, %xmm5, %xmm5
  12121. vpxor %xmm0, %xmm4, %xmm4
  12122. vpslldq $8, %xmm5, %xmm7
  12123. vpsrldq $8, %xmm5, %xmm5
  12124. vpxor %xmm7, %xmm4, %xmm4
  12125. vpxor %xmm5, %xmm6, %xmm6
  12126. # ghash_red
  12127. vmovdqu L_aes_gcm_avx2_mod2_128, %xmm2
  12128. vpclmulqdq $16, %xmm2, %xmm4, %xmm0
  12129. vpshufd $0x4e, %xmm4, %xmm1
  12130. vpxor %xmm0, %xmm1, %xmm1
  12131. vpclmulqdq $16, %xmm2, %xmm1, %xmm0
  12132. vpshufd $0x4e, %xmm1, %xmm1
  12133. vpxor %xmm0, %xmm1, %xmm1
  12134. vpxor %xmm1, %xmm6, %xmm6
  12135. vmovdqu (%esp), %xmm5
  12136. vmovdqu 64(%esp), %xmm4
  12137. L_AES_GCM_encrypt_update_avx2_done_64:
  12138. cmpl 132(%esp), %ebx
  12139. je L_AES_GCM_encrypt_update_avx2_done_enc
  12140. movl 132(%esp), %eax
  12141. andl $0xfffffff0, %eax
  12142. cmpl %eax, %ebx
  12143. jge L_AES_GCM_encrypt_update_avx2_last_block_done
  12144. leal (%esi,%ebx,1), %ecx
  12145. leal (%edi,%ebx,1), %edx
  12146. # aesenc_block
  12147. vmovdqu %xmm4, %xmm1
  12148. vpshufb L_aes_gcm_avx2_bswap_epi64, %xmm1, %xmm0
  12149. vpaddd L_aes_gcm_avx2_one, %xmm1, %xmm1
  12150. vpxor (%ebp), %xmm0, %xmm0
  12151. vaesenc 16(%ebp), %xmm0, %xmm0
  12152. vaesenc 32(%ebp), %xmm0, %xmm0
  12153. vaesenc 48(%ebp), %xmm0, %xmm0
  12154. vaesenc 64(%ebp), %xmm0, %xmm0
  12155. vaesenc 80(%ebp), %xmm0, %xmm0
  12156. vaesenc 96(%ebp), %xmm0, %xmm0
  12157. vaesenc 112(%ebp), %xmm0, %xmm0
  12158. vaesenc 128(%ebp), %xmm0, %xmm0
  12159. vaesenc 144(%ebp), %xmm0, %xmm0
  12160. cmpl $11, 120(%esp)
  12161. vmovdqu 160(%ebp), %xmm2
  12162. jl L_AES_GCM_encrypt_update_avx2_aesenc_block_aesenc_avx_last
  12163. vaesenc %xmm2, %xmm0, %xmm0
  12164. vaesenc 176(%ebp), %xmm0, %xmm0
  12165. cmpl $13, 120(%esp)
  12166. vmovdqu 192(%ebp), %xmm2
  12167. jl L_AES_GCM_encrypt_update_avx2_aesenc_block_aesenc_avx_last
  12168. vaesenc %xmm2, %xmm0, %xmm0
  12169. vaesenc 208(%ebp), %xmm0, %xmm0
  12170. vmovdqu 224(%ebp), %xmm2
  12171. L_AES_GCM_encrypt_update_avx2_aesenc_block_aesenc_avx_last:
  12172. vaesenclast %xmm2, %xmm0, %xmm0
  12173. vmovdqu %xmm1, %xmm4
  12174. vmovdqu (%ecx), %xmm1
  12175. vpxor %xmm1, %xmm0, %xmm0
  12176. vmovdqu %xmm0, (%edx)
  12177. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm0, %xmm0
  12178. vpxor %xmm0, %xmm6, %xmm6
  12179. addl $16, %ebx
  12180. cmpl %eax, %ebx
  12181. jge L_AES_GCM_encrypt_update_avx2_last_block_ghash
  12182. L_AES_GCM_encrypt_update_avx2_last_block_start:
  12183. vpshufb L_aes_gcm_avx2_bswap_epi64, %xmm4, %xmm7
  12184. vpaddd L_aes_gcm_avx2_one, %xmm4, %xmm4
  12185. vmovdqu %xmm4, 64(%esp)
  12186. # aesenc_gfmul_sb
  12187. vpclmulqdq $0x01, %xmm5, %xmm6, %xmm2
  12188. vpclmulqdq $16, %xmm5, %xmm6, %xmm3
  12189. vpclmulqdq $0x00, %xmm5, %xmm6, %xmm1
  12190. vpclmulqdq $0x11, %xmm5, %xmm6, %xmm4
  12191. vpxor (%ebp), %xmm7, %xmm7
  12192. vaesenc 16(%ebp), %xmm7, %xmm7
  12193. vpxor %xmm2, %xmm3, %xmm3
  12194. vpslldq $8, %xmm3, %xmm2
  12195. vpsrldq $8, %xmm3, %xmm3
  12196. vaesenc 32(%ebp), %xmm7, %xmm7
  12197. vpxor %xmm1, %xmm2, %xmm2
  12198. vpclmulqdq $16, L_aes_gcm_avx2_mod2_128, %xmm2, %xmm1
  12199. vaesenc 48(%ebp), %xmm7, %xmm7
  12200. vaesenc 64(%ebp), %xmm7, %xmm7
  12201. vaesenc 80(%ebp), %xmm7, %xmm7
  12202. vpshufd $0x4e, %xmm2, %xmm2
  12203. vpxor %xmm1, %xmm2, %xmm2
  12204. vpclmulqdq $16, L_aes_gcm_avx2_mod2_128, %xmm2, %xmm1
  12205. vaesenc 96(%ebp), %xmm7, %xmm7
  12206. vaesenc 112(%ebp), %xmm7, %xmm7
  12207. vaesenc 128(%ebp), %xmm7, %xmm7
  12208. vpshufd $0x4e, %xmm2, %xmm2
  12209. vaesenc 144(%ebp), %xmm7, %xmm7
  12210. vpxor %xmm3, %xmm4, %xmm4
  12211. vpxor %xmm4, %xmm2, %xmm2
  12212. vmovdqu 160(%ebp), %xmm0
  12213. cmpl $11, 120(%esp)
  12214. jl L_AES_GCM_encrypt_update_avx2_aesenc_gfmul_sb_last
  12215. vaesenc %xmm0, %xmm7, %xmm7
  12216. vaesenc 176(%ebp), %xmm7, %xmm7
  12217. vmovdqu 192(%ebp), %xmm0
  12218. cmpl $13, 120(%esp)
  12219. jl L_AES_GCM_encrypt_update_avx2_aesenc_gfmul_sb_last
  12220. vaesenc %xmm0, %xmm7, %xmm7
  12221. vaesenc 208(%ebp), %xmm7, %xmm7
  12222. vmovdqu 224(%ebp), %xmm0
  12223. L_AES_GCM_encrypt_update_avx2_aesenc_gfmul_sb_last:
  12224. vaesenclast %xmm0, %xmm7, %xmm7
  12225. vmovdqu (%esi,%ebx,1), %xmm3
  12226. vpxor %xmm1, %xmm2, %xmm6
  12227. vpxor %xmm3, %xmm7, %xmm7
  12228. vmovdqu %xmm7, (%edi,%ebx,1)
  12229. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm7, %xmm7
  12230. vpxor %xmm7, %xmm6, %xmm6
  12231. vmovdqu 64(%esp), %xmm4
  12232. addl $16, %ebx
  12233. cmpl %eax, %ebx
  12234. jl L_AES_GCM_encrypt_update_avx2_last_block_start
  12235. L_AES_GCM_encrypt_update_avx2_last_block_ghash:
  12236. # ghash_gfmul_red
  12237. vpclmulqdq $16, %xmm5, %xmm6, %xmm2
  12238. vpclmulqdq $0x01, %xmm5, %xmm6, %xmm1
  12239. vpclmulqdq $0x00, %xmm5, %xmm6, %xmm0
  12240. vpxor %xmm1, %xmm2, %xmm2
  12241. vpslldq $8, %xmm2, %xmm1
  12242. vpsrldq $8, %xmm2, %xmm2
  12243. vpxor %xmm0, %xmm1, %xmm1
  12244. vpclmulqdq $0x11, %xmm5, %xmm6, %xmm6
  12245. vpclmulqdq $16, L_aes_gcm_avx2_mod2_128, %xmm1, %xmm0
  12246. vpshufd $0x4e, %xmm1, %xmm1
  12247. vpxor %xmm0, %xmm1, %xmm1
  12248. vpclmulqdq $16, L_aes_gcm_avx2_mod2_128, %xmm1, %xmm0
  12249. vpshufd $0x4e, %xmm1, %xmm1
  12250. vpxor %xmm2, %xmm6, %xmm6
  12251. vpxor %xmm1, %xmm6, %xmm6
  12252. vpxor %xmm0, %xmm6, %xmm6
  12253. L_AES_GCM_encrypt_update_avx2_last_block_done:
  12254. L_AES_GCM_encrypt_update_avx2_done_enc:
  12255. movl 136(%esp), %esi
  12256. movl 144(%esp), %edi
  12257. vmovdqu %xmm6, (%esi)
  12258. vmovdqu %xmm4, (%edi)
  12259. addl $0x60, %esp
  12260. popl %ebp
  12261. popl %edi
  12262. popl %esi
  12263. popl %ebx
  12264. ret
  12265. .size AES_GCM_encrypt_update_avx2,.-AES_GCM_encrypt_update_avx2
  12266. .text
  12267. .globl AES_GCM_encrypt_final_avx2
  12268. .type AES_GCM_encrypt_final_avx2,@function
  12269. .align 16
  12270. AES_GCM_encrypt_final_avx2:
  12271. pushl %esi
  12272. pushl %edi
  12273. pushl %ebp
  12274. subl $16, %esp
  12275. movl 32(%esp), %ebp
  12276. movl 52(%esp), %esi
  12277. movl 56(%esp), %edi
  12278. vmovdqu (%ebp), %xmm4
  12279. vmovdqu (%esi), %xmm5
  12280. vmovdqu (%edi), %xmm6
  12281. vpsrlq $63, %xmm5, %xmm1
  12282. vpsllq $0x01, %xmm5, %xmm0
  12283. vpslldq $8, %xmm1, %xmm1
  12284. vpor %xmm1, %xmm0, %xmm0
  12285. vpshufd $0xff, %xmm5, %xmm5
  12286. vpsrad $31, %xmm5, %xmm5
  12287. vpand L_aes_gcm_avx2_mod2_128, %xmm5, %xmm5
  12288. vpxor %xmm0, %xmm5, %xmm5
  12289. # calc_tag
  12290. movl 44(%esp), %ecx
  12291. shll $3, %ecx
  12292. vpinsrd $0x00, %ecx, %xmm0, %xmm0
  12293. movl 48(%esp), %ecx
  12294. shll $3, %ecx
  12295. vpinsrd $2, %ecx, %xmm0, %xmm0
  12296. movl 44(%esp), %ecx
  12297. shrl $29, %ecx
  12298. vpinsrd $0x01, %ecx, %xmm0, %xmm0
  12299. movl 48(%esp), %ecx
  12300. shrl $29, %ecx
  12301. vpinsrd $3, %ecx, %xmm0, %xmm0
  12302. vpxor %xmm4, %xmm0, %xmm0
  12303. # ghash_gfmul_red
  12304. vpclmulqdq $16, %xmm5, %xmm0, %xmm7
  12305. vpclmulqdq $0x01, %xmm5, %xmm0, %xmm3
  12306. vpclmulqdq $0x00, %xmm5, %xmm0, %xmm2
  12307. vpxor %xmm3, %xmm7, %xmm7
  12308. vpslldq $8, %xmm7, %xmm3
  12309. vpsrldq $8, %xmm7, %xmm7
  12310. vpxor %xmm2, %xmm3, %xmm3
  12311. vpclmulqdq $0x11, %xmm5, %xmm0, %xmm0
  12312. vpclmulqdq $16, L_aes_gcm_avx2_mod2_128, %xmm3, %xmm2
  12313. vpshufd $0x4e, %xmm3, %xmm3
  12314. vpxor %xmm2, %xmm3, %xmm3
  12315. vpclmulqdq $16, L_aes_gcm_avx2_mod2_128, %xmm3, %xmm2
  12316. vpshufd $0x4e, %xmm3, %xmm3
  12317. vpxor %xmm7, %xmm0, %xmm0
  12318. vpxor %xmm3, %xmm0, %xmm0
  12319. vpxor %xmm2, %xmm0, %xmm0
  12320. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm0, %xmm0
  12321. vpxor %xmm6, %xmm0, %xmm0
  12322. movl 36(%esp), %edi
  12323. # store_tag
  12324. cmpl $16, 40(%esp)
  12325. je L_AES_GCM_encrypt_final_avx2_store_tag_16
  12326. xorl %ecx, %ecx
  12327. vmovdqu %xmm0, (%esp)
  12328. L_AES_GCM_encrypt_final_avx2_store_tag_loop:
  12329. movzbl (%esp,%ecx,1), %eax
  12330. movb %al, (%edi,%ecx,1)
  12331. incl %ecx
  12332. cmpl 40(%esp), %ecx
  12333. jne L_AES_GCM_encrypt_final_avx2_store_tag_loop
  12334. jmp L_AES_GCM_encrypt_final_avx2_store_tag_done
  12335. L_AES_GCM_encrypt_final_avx2_store_tag_16:
  12336. vmovdqu %xmm0, (%edi)
  12337. L_AES_GCM_encrypt_final_avx2_store_tag_done:
  12338. addl $16, %esp
  12339. popl %ebp
  12340. popl %edi
  12341. popl %esi
  12342. ret
  12343. .size AES_GCM_encrypt_final_avx2,.-AES_GCM_encrypt_final_avx2
  12344. .text
  12345. .globl AES_GCM_decrypt_update_avx2
  12346. .type AES_GCM_decrypt_update_avx2,@function
  12347. .align 16
  12348. AES_GCM_decrypt_update_avx2:
  12349. pushl %ebx
  12350. pushl %esi
  12351. pushl %edi
  12352. pushl %ebp
  12353. subl $0xa0, %esp
  12354. movl 208(%esp), %esi
  12355. vmovdqu (%esi), %xmm4
  12356. movl 200(%esp), %esi
  12357. movl 204(%esp), %ebp
  12358. vmovdqu (%esi), %xmm6
  12359. vmovdqu (%ebp), %xmm5
  12360. movl 180(%esp), %ebp
  12361. movl 188(%esp), %edi
  12362. movl 192(%esp), %esi
  12363. # Calculate H
  12364. vpsrlq $63, %xmm5, %xmm1
  12365. vpsllq $0x01, %xmm5, %xmm0
  12366. vpslldq $8, %xmm1, %xmm1
  12367. vpor %xmm1, %xmm0, %xmm0
  12368. vpshufd $0xff, %xmm5, %xmm5
  12369. vpsrad $31, %xmm5, %xmm5
  12370. vpand L_aes_gcm_avx2_mod2_128, %xmm5, %xmm5
  12371. vpxor %xmm0, %xmm5, %xmm5
  12372. xorl %ebx, %ebx
  12373. cmpl $0x40, 196(%esp)
  12374. movl 196(%esp), %eax
  12375. jl L_AES_GCM_decrypt_update_avx2_done_64
  12376. andl $0xffffffc0, %eax
  12377. vmovdqu %xmm4, 64(%esp)
  12378. vmovdqu %xmm6, 80(%esp)
  12379. vmovdqu L_aes_gcm_avx2_mod2_128, %xmm3
  12380. # H ^ 1
  12381. vmovdqu %xmm5, (%esp)
  12382. vmovdqu %xmm5, %xmm2
  12383. # H ^ 2
  12384. vpclmulqdq $0x00, %xmm2, %xmm2, %xmm5
  12385. vpclmulqdq $0x11, %xmm2, %xmm2, %xmm6
  12386. vpclmulqdq $16, %xmm3, %xmm5, %xmm4
  12387. vpshufd $0x4e, %xmm5, %xmm5
  12388. vpxor %xmm4, %xmm5, %xmm5
  12389. vpclmulqdq $16, %xmm3, %xmm5, %xmm4
  12390. vpshufd $0x4e, %xmm5, %xmm5
  12391. vpxor %xmm4, %xmm5, %xmm5
  12392. vpxor %xmm5, %xmm6, %xmm0
  12393. vmovdqu %xmm0, 16(%esp)
  12394. # H ^ 3
  12395. # ghash_gfmul_red
  12396. vpclmulqdq $16, %xmm0, %xmm2, %xmm6
  12397. vpclmulqdq $0x01, %xmm0, %xmm2, %xmm5
  12398. vpclmulqdq $0x00, %xmm0, %xmm2, %xmm4
  12399. vpxor %xmm5, %xmm6, %xmm6
  12400. vpslldq $8, %xmm6, %xmm5
  12401. vpsrldq $8, %xmm6, %xmm6
  12402. vpxor %xmm4, %xmm5, %xmm5
  12403. vpclmulqdq $0x11, %xmm0, %xmm2, %xmm1
  12404. vpclmulqdq $16, %xmm3, %xmm5, %xmm4
  12405. vpshufd $0x4e, %xmm5, %xmm5
  12406. vpxor %xmm4, %xmm5, %xmm5
  12407. vpclmulqdq $16, %xmm3, %xmm5, %xmm4
  12408. vpshufd $0x4e, %xmm5, %xmm5
  12409. vpxor %xmm6, %xmm1, %xmm1
  12410. vpxor %xmm5, %xmm1, %xmm1
  12411. vpxor %xmm4, %xmm1, %xmm1
  12412. vmovdqu %xmm1, 32(%esp)
  12413. # H ^ 4
  12414. vpclmulqdq $0x00, %xmm0, %xmm0, %xmm5
  12415. vpclmulqdq $0x11, %xmm0, %xmm0, %xmm6
  12416. vpclmulqdq $16, %xmm3, %xmm5, %xmm4
  12417. vpshufd $0x4e, %xmm5, %xmm5
  12418. vpxor %xmm4, %xmm5, %xmm5
  12419. vpclmulqdq $16, %xmm3, %xmm5, %xmm4
  12420. vpshufd $0x4e, %xmm5, %xmm5
  12421. vpxor %xmm4, %xmm5, %xmm5
  12422. vpxor %xmm5, %xmm6, %xmm2
  12423. vmovdqu %xmm2, 48(%esp)
  12424. vmovdqu 80(%esp), %xmm6
  12425. cmpl %esi, %edi
  12426. jne L_AES_GCM_decrypt_update_avx2_ghash_64
  12427. L_AES_GCM_decrypt_update_avx2_ghash_64_inplace:
  12428. # aesenc_64_ghash
  12429. leal (%esi,%ebx,1), %ecx
  12430. leal (%edi,%ebx,1), %edx
  12431. # aesenc_64
  12432. # aesenc_ctr
  12433. vmovdqu 64(%esp), %xmm4
  12434. vmovdqu L_aes_gcm_avx2_bswap_epi64, %xmm7
  12435. vpaddd L_aes_gcm_avx2_one, %xmm4, %xmm1
  12436. vpshufb %xmm7, %xmm4, %xmm0
  12437. vpaddd L_aes_gcm_avx2_two, %xmm4, %xmm2
  12438. vpshufb %xmm7, %xmm1, %xmm1
  12439. vpaddd L_aes_gcm_avx2_three, %xmm4, %xmm3
  12440. vpshufb %xmm7, %xmm2, %xmm2
  12441. vpaddd L_aes_gcm_avx2_four, %xmm4, %xmm4
  12442. vpshufb %xmm7, %xmm3, %xmm3
  12443. # aesenc_xor
  12444. vmovdqu (%ebp), %xmm7
  12445. vmovdqu %xmm4, 64(%esp)
  12446. vpxor %xmm7, %xmm0, %xmm0
  12447. vpxor %xmm7, %xmm1, %xmm1
  12448. vpxor %xmm7, %xmm2, %xmm2
  12449. vpxor %xmm7, %xmm3, %xmm3
  12450. vmovdqu 16(%ebp), %xmm7
  12451. vaesenc %xmm7, %xmm0, %xmm0
  12452. vaesenc %xmm7, %xmm1, %xmm1
  12453. vaesenc %xmm7, %xmm2, %xmm2
  12454. vaesenc %xmm7, %xmm3, %xmm3
  12455. vmovdqu 32(%ebp), %xmm7
  12456. vaesenc %xmm7, %xmm0, %xmm0
  12457. vaesenc %xmm7, %xmm1, %xmm1
  12458. vaesenc %xmm7, %xmm2, %xmm2
  12459. vaesenc %xmm7, %xmm3, %xmm3
  12460. vmovdqu 48(%ebp), %xmm7
  12461. vaesenc %xmm7, %xmm0, %xmm0
  12462. vaesenc %xmm7, %xmm1, %xmm1
  12463. vaesenc %xmm7, %xmm2, %xmm2
  12464. vaesenc %xmm7, %xmm3, %xmm3
  12465. vmovdqu 64(%ebp), %xmm7
  12466. vaesenc %xmm7, %xmm0, %xmm0
  12467. vaesenc %xmm7, %xmm1, %xmm1
  12468. vaesenc %xmm7, %xmm2, %xmm2
  12469. vaesenc %xmm7, %xmm3, %xmm3
  12470. vmovdqu 80(%ebp), %xmm7
  12471. vaesenc %xmm7, %xmm0, %xmm0
  12472. vaesenc %xmm7, %xmm1, %xmm1
  12473. vaesenc %xmm7, %xmm2, %xmm2
  12474. vaesenc %xmm7, %xmm3, %xmm3
  12475. vmovdqu 96(%ebp), %xmm7
  12476. vaesenc %xmm7, %xmm0, %xmm0
  12477. vaesenc %xmm7, %xmm1, %xmm1
  12478. vaesenc %xmm7, %xmm2, %xmm2
  12479. vaesenc %xmm7, %xmm3, %xmm3
  12480. vmovdqu 112(%ebp), %xmm7
  12481. vaesenc %xmm7, %xmm0, %xmm0
  12482. vaesenc %xmm7, %xmm1, %xmm1
  12483. vaesenc %xmm7, %xmm2, %xmm2
  12484. vaesenc %xmm7, %xmm3, %xmm3
  12485. vmovdqu 128(%ebp), %xmm7
  12486. vaesenc %xmm7, %xmm0, %xmm0
  12487. vaesenc %xmm7, %xmm1, %xmm1
  12488. vaesenc %xmm7, %xmm2, %xmm2
  12489. vaesenc %xmm7, %xmm3, %xmm3
  12490. vmovdqu 144(%ebp), %xmm7
  12491. vaesenc %xmm7, %xmm0, %xmm0
  12492. vaesenc %xmm7, %xmm1, %xmm1
  12493. vaesenc %xmm7, %xmm2, %xmm2
  12494. vaesenc %xmm7, %xmm3, %xmm3
  12495. cmpl $11, 184(%esp)
  12496. vmovdqu 160(%ebp), %xmm7
  12497. jl L_AES_GCM_decrypt_update_avx2_inplace_aesenc_64_ghash_aesenc_64_enc_done
  12498. vaesenc %xmm7, %xmm0, %xmm0
  12499. vaesenc %xmm7, %xmm1, %xmm1
  12500. vaesenc %xmm7, %xmm2, %xmm2
  12501. vaesenc %xmm7, %xmm3, %xmm3
  12502. vmovdqu 176(%ebp), %xmm7
  12503. vaesenc %xmm7, %xmm0, %xmm0
  12504. vaesenc %xmm7, %xmm1, %xmm1
  12505. vaesenc %xmm7, %xmm2, %xmm2
  12506. vaesenc %xmm7, %xmm3, %xmm3
  12507. cmpl $13, 184(%esp)
  12508. vmovdqu 192(%ebp), %xmm7
  12509. jl L_AES_GCM_decrypt_update_avx2_inplace_aesenc_64_ghash_aesenc_64_enc_done
  12510. vaesenc %xmm7, %xmm0, %xmm0
  12511. vaesenc %xmm7, %xmm1, %xmm1
  12512. vaesenc %xmm7, %xmm2, %xmm2
  12513. vaesenc %xmm7, %xmm3, %xmm3
  12514. vmovdqu 208(%ebp), %xmm7
  12515. vaesenc %xmm7, %xmm0, %xmm0
  12516. vaesenc %xmm7, %xmm1, %xmm1
  12517. vaesenc %xmm7, %xmm2, %xmm2
  12518. vaesenc %xmm7, %xmm3, %xmm3
  12519. vmovdqu 224(%ebp), %xmm7
  12520. L_AES_GCM_decrypt_update_avx2_inplace_aesenc_64_ghash_aesenc_64_enc_done:
  12521. # aesenc_last
  12522. vaesenclast %xmm7, %xmm0, %xmm0
  12523. vaesenclast %xmm7, %xmm1, %xmm1
  12524. vaesenclast %xmm7, %xmm2, %xmm2
  12525. vaesenclast %xmm7, %xmm3, %xmm3
  12526. vmovdqu (%ecx), %xmm7
  12527. vmovdqu 16(%ecx), %xmm4
  12528. vpxor %xmm7, %xmm0, %xmm0
  12529. vpxor %xmm4, %xmm1, %xmm1
  12530. vmovdqu %xmm7, 96(%esp)
  12531. vmovdqu %xmm4, 112(%esp)
  12532. vmovdqu %xmm0, (%edx)
  12533. vmovdqu %xmm1, 16(%edx)
  12534. vmovdqu 32(%ecx), %xmm7
  12535. vmovdqu 48(%ecx), %xmm4
  12536. vpxor %xmm7, %xmm2, %xmm2
  12537. vpxor %xmm4, %xmm3, %xmm3
  12538. vmovdqu %xmm7, 128(%esp)
  12539. vmovdqu %xmm4, 144(%esp)
  12540. vmovdqu %xmm2, 32(%edx)
  12541. vmovdqu %xmm3, 48(%edx)
  12542. # pclmul_1
  12543. vmovdqu 96(%esp), %xmm1
  12544. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm1, %xmm1
  12545. vmovdqu 48(%esp), %xmm2
  12546. vpxor %xmm6, %xmm1, %xmm1
  12547. vpclmulqdq $16, %xmm2, %xmm1, %xmm5
  12548. vpclmulqdq $0x01, %xmm2, %xmm1, %xmm3
  12549. vpclmulqdq $0x00, %xmm2, %xmm1, %xmm6
  12550. vpclmulqdq $0x11, %xmm2, %xmm1, %xmm7
  12551. # pclmul_2
  12552. vmovdqu 112(%esp), %xmm1
  12553. vmovdqu 32(%esp), %xmm0
  12554. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm1, %xmm1
  12555. vpxor %xmm3, %xmm5, %xmm5
  12556. vpclmulqdq $16, %xmm0, %xmm1, %xmm2
  12557. vpclmulqdq $0x01, %xmm0, %xmm1, %xmm3
  12558. vpclmulqdq $0x00, %xmm0, %xmm1, %xmm4
  12559. vpclmulqdq $0x11, %xmm0, %xmm1, %xmm1
  12560. vpxor %xmm1, %xmm7, %xmm7
  12561. # pclmul_n
  12562. vmovdqu 128(%esp), %xmm1
  12563. vmovdqu 16(%esp), %xmm0
  12564. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm1, %xmm1
  12565. vpxor %xmm2, %xmm5, %xmm5
  12566. vpclmulqdq $16, %xmm0, %xmm1, %xmm2
  12567. vpxor %xmm3, %xmm5, %xmm5
  12568. vpclmulqdq $0x01, %xmm0, %xmm1, %xmm3
  12569. vpxor %xmm4, %xmm6, %xmm6
  12570. vpclmulqdq $0x00, %xmm0, %xmm1, %xmm4
  12571. vpclmulqdq $0x11, %xmm0, %xmm1, %xmm1
  12572. vpxor %xmm1, %xmm7, %xmm7
  12573. # pclmul_n
  12574. vmovdqu 144(%esp), %xmm1
  12575. vmovdqu (%esp), %xmm0
  12576. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm1, %xmm1
  12577. vpxor %xmm2, %xmm5, %xmm5
  12578. vpclmulqdq $16, %xmm0, %xmm1, %xmm2
  12579. vpxor %xmm3, %xmm5, %xmm5
  12580. vpclmulqdq $0x01, %xmm0, %xmm1, %xmm3
  12581. vpxor %xmm4, %xmm6, %xmm6
  12582. vpclmulqdq $0x00, %xmm0, %xmm1, %xmm4
  12583. vpclmulqdq $0x11, %xmm0, %xmm1, %xmm1
  12584. vpxor %xmm1, %xmm7, %xmm7
  12585. # aesenc_pclmul_l
  12586. vpxor %xmm2, %xmm5, %xmm5
  12587. vpxor %xmm4, %xmm6, %xmm6
  12588. vpxor %xmm3, %xmm5, %xmm5
  12589. vpslldq $8, %xmm5, %xmm1
  12590. vpsrldq $8, %xmm5, %xmm5
  12591. vmovdqu L_aes_gcm_avx2_mod2_128, %xmm0
  12592. vpxor %xmm1, %xmm6, %xmm6
  12593. vpxor %xmm5, %xmm7, %xmm7
  12594. vpclmulqdq $16, %xmm0, %xmm6, %xmm3
  12595. vpshufd $0x4e, %xmm6, %xmm6
  12596. vpxor %xmm3, %xmm6, %xmm6
  12597. vpclmulqdq $16, %xmm0, %xmm6, %xmm3
  12598. vpshufd $0x4e, %xmm6, %xmm6
  12599. vpxor %xmm3, %xmm6, %xmm6
  12600. vpxor %xmm7, %xmm6, %xmm6
  12601. # aesenc_64_ghash - end
  12602. addl $0x40, %ebx
  12603. cmpl %eax, %ebx
  12604. jl L_AES_GCM_decrypt_update_avx2_ghash_64_inplace
  12605. jmp L_AES_GCM_decrypt_update_avx2_ghash_64_done
  12606. L_AES_GCM_decrypt_update_avx2_ghash_64:
  12607. # aesenc_64_ghash
  12608. leal (%esi,%ebx,1), %ecx
  12609. leal (%edi,%ebx,1), %edx
  12610. # aesenc_64
  12611. # aesenc_ctr
  12612. vmovdqu 64(%esp), %xmm4
  12613. vmovdqu L_aes_gcm_avx2_bswap_epi64, %xmm7
  12614. vpaddd L_aes_gcm_avx2_one, %xmm4, %xmm1
  12615. vpshufb %xmm7, %xmm4, %xmm0
  12616. vpaddd L_aes_gcm_avx2_two, %xmm4, %xmm2
  12617. vpshufb %xmm7, %xmm1, %xmm1
  12618. vpaddd L_aes_gcm_avx2_three, %xmm4, %xmm3
  12619. vpshufb %xmm7, %xmm2, %xmm2
  12620. vpaddd L_aes_gcm_avx2_four, %xmm4, %xmm4
  12621. vpshufb %xmm7, %xmm3, %xmm3
  12622. # aesenc_xor
  12623. vmovdqu (%ebp), %xmm7
  12624. vmovdqu %xmm4, 64(%esp)
  12625. vpxor %xmm7, %xmm0, %xmm0
  12626. vpxor %xmm7, %xmm1, %xmm1
  12627. vpxor %xmm7, %xmm2, %xmm2
  12628. vpxor %xmm7, %xmm3, %xmm3
  12629. vmovdqu 16(%ebp), %xmm7
  12630. vaesenc %xmm7, %xmm0, %xmm0
  12631. vaesenc %xmm7, %xmm1, %xmm1
  12632. vaesenc %xmm7, %xmm2, %xmm2
  12633. vaesenc %xmm7, %xmm3, %xmm3
  12634. vmovdqu 32(%ebp), %xmm7
  12635. vaesenc %xmm7, %xmm0, %xmm0
  12636. vaesenc %xmm7, %xmm1, %xmm1
  12637. vaesenc %xmm7, %xmm2, %xmm2
  12638. vaesenc %xmm7, %xmm3, %xmm3
  12639. vmovdqu 48(%ebp), %xmm7
  12640. vaesenc %xmm7, %xmm0, %xmm0
  12641. vaesenc %xmm7, %xmm1, %xmm1
  12642. vaesenc %xmm7, %xmm2, %xmm2
  12643. vaesenc %xmm7, %xmm3, %xmm3
  12644. vmovdqu 64(%ebp), %xmm7
  12645. vaesenc %xmm7, %xmm0, %xmm0
  12646. vaesenc %xmm7, %xmm1, %xmm1
  12647. vaesenc %xmm7, %xmm2, %xmm2
  12648. vaesenc %xmm7, %xmm3, %xmm3
  12649. vmovdqu 80(%ebp), %xmm7
  12650. vaesenc %xmm7, %xmm0, %xmm0
  12651. vaesenc %xmm7, %xmm1, %xmm1
  12652. vaesenc %xmm7, %xmm2, %xmm2
  12653. vaesenc %xmm7, %xmm3, %xmm3
  12654. vmovdqu 96(%ebp), %xmm7
  12655. vaesenc %xmm7, %xmm0, %xmm0
  12656. vaesenc %xmm7, %xmm1, %xmm1
  12657. vaesenc %xmm7, %xmm2, %xmm2
  12658. vaesenc %xmm7, %xmm3, %xmm3
  12659. vmovdqu 112(%ebp), %xmm7
  12660. vaesenc %xmm7, %xmm0, %xmm0
  12661. vaesenc %xmm7, %xmm1, %xmm1
  12662. vaesenc %xmm7, %xmm2, %xmm2
  12663. vaesenc %xmm7, %xmm3, %xmm3
  12664. vmovdqu 128(%ebp), %xmm7
  12665. vaesenc %xmm7, %xmm0, %xmm0
  12666. vaesenc %xmm7, %xmm1, %xmm1
  12667. vaesenc %xmm7, %xmm2, %xmm2
  12668. vaesenc %xmm7, %xmm3, %xmm3
  12669. vmovdqu 144(%ebp), %xmm7
  12670. vaesenc %xmm7, %xmm0, %xmm0
  12671. vaesenc %xmm7, %xmm1, %xmm1
  12672. vaesenc %xmm7, %xmm2, %xmm2
  12673. vaesenc %xmm7, %xmm3, %xmm3
  12674. cmpl $11, 184(%esp)
  12675. vmovdqu 160(%ebp), %xmm7
  12676. jl L_AES_GCM_decrypt_update_avx2_aesenc_64_ghash_aesenc_64_enc_done
  12677. vaesenc %xmm7, %xmm0, %xmm0
  12678. vaesenc %xmm7, %xmm1, %xmm1
  12679. vaesenc %xmm7, %xmm2, %xmm2
  12680. vaesenc %xmm7, %xmm3, %xmm3
  12681. vmovdqu 176(%ebp), %xmm7
  12682. vaesenc %xmm7, %xmm0, %xmm0
  12683. vaesenc %xmm7, %xmm1, %xmm1
  12684. vaesenc %xmm7, %xmm2, %xmm2
  12685. vaesenc %xmm7, %xmm3, %xmm3
  12686. cmpl $13, 184(%esp)
  12687. vmovdqu 192(%ebp), %xmm7
  12688. jl L_AES_GCM_decrypt_update_avx2_aesenc_64_ghash_aesenc_64_enc_done
  12689. vaesenc %xmm7, %xmm0, %xmm0
  12690. vaesenc %xmm7, %xmm1, %xmm1
  12691. vaesenc %xmm7, %xmm2, %xmm2
  12692. vaesenc %xmm7, %xmm3, %xmm3
  12693. vmovdqu 208(%ebp), %xmm7
  12694. vaesenc %xmm7, %xmm0, %xmm0
  12695. vaesenc %xmm7, %xmm1, %xmm1
  12696. vaesenc %xmm7, %xmm2, %xmm2
  12697. vaesenc %xmm7, %xmm3, %xmm3
  12698. vmovdqu 224(%ebp), %xmm7
  12699. L_AES_GCM_decrypt_update_avx2_aesenc_64_ghash_aesenc_64_enc_done:
  12700. # aesenc_last
  12701. vaesenclast %xmm7, %xmm0, %xmm0
  12702. vaesenclast %xmm7, %xmm1, %xmm1
  12703. vaesenclast %xmm7, %xmm2, %xmm2
  12704. vaesenclast %xmm7, %xmm3, %xmm3
  12705. vmovdqu (%ecx), %xmm7
  12706. vmovdqu 16(%ecx), %xmm4
  12707. vpxor %xmm7, %xmm0, %xmm0
  12708. vpxor %xmm4, %xmm1, %xmm1
  12709. vmovdqu %xmm7, (%ecx)
  12710. vmovdqu %xmm4, 16(%ecx)
  12711. vmovdqu %xmm0, (%edx)
  12712. vmovdqu %xmm1, 16(%edx)
  12713. vmovdqu 32(%ecx), %xmm7
  12714. vmovdqu 48(%ecx), %xmm4
  12715. vpxor %xmm7, %xmm2, %xmm2
  12716. vpxor %xmm4, %xmm3, %xmm3
  12717. vmovdqu %xmm7, 32(%ecx)
  12718. vmovdqu %xmm4, 48(%ecx)
  12719. vmovdqu %xmm2, 32(%edx)
  12720. vmovdqu %xmm3, 48(%edx)
  12721. # pclmul_1
  12722. vmovdqu (%ecx), %xmm1
  12723. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm1, %xmm1
  12724. vmovdqu 48(%esp), %xmm2
  12725. vpxor %xmm6, %xmm1, %xmm1
  12726. vpclmulqdq $16, %xmm2, %xmm1, %xmm5
  12727. vpclmulqdq $0x01, %xmm2, %xmm1, %xmm3
  12728. vpclmulqdq $0x00, %xmm2, %xmm1, %xmm6
  12729. vpclmulqdq $0x11, %xmm2, %xmm1, %xmm7
  12730. # pclmul_2
  12731. vmovdqu 16(%ecx), %xmm1
  12732. vmovdqu 32(%esp), %xmm0
  12733. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm1, %xmm1
  12734. vpxor %xmm3, %xmm5, %xmm5
  12735. vpclmulqdq $16, %xmm0, %xmm1, %xmm2
  12736. vpclmulqdq $0x01, %xmm0, %xmm1, %xmm3
  12737. vpclmulqdq $0x00, %xmm0, %xmm1, %xmm4
  12738. vpclmulqdq $0x11, %xmm0, %xmm1, %xmm1
  12739. vpxor %xmm1, %xmm7, %xmm7
  12740. # pclmul_n
  12741. vmovdqu 32(%ecx), %xmm1
  12742. vmovdqu 16(%esp), %xmm0
  12743. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm1, %xmm1
  12744. vpxor %xmm2, %xmm5, %xmm5
  12745. vpclmulqdq $16, %xmm0, %xmm1, %xmm2
  12746. vpxor %xmm3, %xmm5, %xmm5
  12747. vpclmulqdq $0x01, %xmm0, %xmm1, %xmm3
  12748. vpxor %xmm4, %xmm6, %xmm6
  12749. vpclmulqdq $0x00, %xmm0, %xmm1, %xmm4
  12750. vpclmulqdq $0x11, %xmm0, %xmm1, %xmm1
  12751. vpxor %xmm1, %xmm7, %xmm7
  12752. # pclmul_n
  12753. vmovdqu 48(%ecx), %xmm1
  12754. vmovdqu (%esp), %xmm0
  12755. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm1, %xmm1
  12756. vpxor %xmm2, %xmm5, %xmm5
  12757. vpclmulqdq $16, %xmm0, %xmm1, %xmm2
  12758. vpxor %xmm3, %xmm5, %xmm5
  12759. vpclmulqdq $0x01, %xmm0, %xmm1, %xmm3
  12760. vpxor %xmm4, %xmm6, %xmm6
  12761. vpclmulqdq $0x00, %xmm0, %xmm1, %xmm4
  12762. vpclmulqdq $0x11, %xmm0, %xmm1, %xmm1
  12763. vpxor %xmm1, %xmm7, %xmm7
  12764. # aesenc_pclmul_l
  12765. vpxor %xmm2, %xmm5, %xmm5
  12766. vpxor %xmm4, %xmm6, %xmm6
  12767. vpxor %xmm3, %xmm5, %xmm5
  12768. vpslldq $8, %xmm5, %xmm1
  12769. vpsrldq $8, %xmm5, %xmm5
  12770. vmovdqu L_aes_gcm_avx2_mod2_128, %xmm0
  12771. vpxor %xmm1, %xmm6, %xmm6
  12772. vpxor %xmm5, %xmm7, %xmm7
  12773. vpclmulqdq $16, %xmm0, %xmm6, %xmm3
  12774. vpshufd $0x4e, %xmm6, %xmm6
  12775. vpxor %xmm3, %xmm6, %xmm6
  12776. vpclmulqdq $16, %xmm0, %xmm6, %xmm3
  12777. vpshufd $0x4e, %xmm6, %xmm6
  12778. vpxor %xmm3, %xmm6, %xmm6
  12779. vpxor %xmm7, %xmm6, %xmm6
  12780. # aesenc_64_ghash - end
  12781. addl $0x40, %ebx
  12782. cmpl %eax, %ebx
  12783. jl L_AES_GCM_decrypt_update_avx2_ghash_64
  12784. L_AES_GCM_decrypt_update_avx2_ghash_64_done:
  12785. vmovdqu (%esp), %xmm5
  12786. vmovdqu 64(%esp), %xmm4
  12787. L_AES_GCM_decrypt_update_avx2_done_64:
  12788. cmpl 196(%esp), %ebx
  12789. jge L_AES_GCM_decrypt_update_avx2_done_dec
  12790. movl 196(%esp), %eax
  12791. andl $0xfffffff0, %eax
  12792. cmpl %eax, %ebx
  12793. jge L_AES_GCM_decrypt_update_avx2_last_block_done
  12794. L_AES_GCM_decrypt_update_avx2_last_block_start:
  12795. vmovdqu (%esi,%ebx,1), %xmm0
  12796. vpshufb L_aes_gcm_avx2_bswap_epi64, %xmm4, %xmm7
  12797. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm0, %xmm0
  12798. vpaddd L_aes_gcm_avx2_one, %xmm4, %xmm4
  12799. vmovdqu %xmm4, 64(%esp)
  12800. vpxor %xmm6, %xmm0, %xmm4
  12801. # aesenc_gfmul_sb
  12802. vpclmulqdq $0x01, %xmm5, %xmm4, %xmm2
  12803. vpclmulqdq $16, %xmm5, %xmm4, %xmm3
  12804. vpclmulqdq $0x00, %xmm5, %xmm4, %xmm1
  12805. vpclmulqdq $0x11, %xmm5, %xmm4, %xmm4
  12806. vpxor (%ebp), %xmm7, %xmm7
  12807. vaesenc 16(%ebp), %xmm7, %xmm7
  12808. vpxor %xmm2, %xmm3, %xmm3
  12809. vpslldq $8, %xmm3, %xmm2
  12810. vpsrldq $8, %xmm3, %xmm3
  12811. vaesenc 32(%ebp), %xmm7, %xmm7
  12812. vpxor %xmm1, %xmm2, %xmm2
  12813. vpclmulqdq $16, L_aes_gcm_avx2_mod2_128, %xmm2, %xmm1
  12814. vaesenc 48(%ebp), %xmm7, %xmm7
  12815. vaesenc 64(%ebp), %xmm7, %xmm7
  12816. vaesenc 80(%ebp), %xmm7, %xmm7
  12817. vpshufd $0x4e, %xmm2, %xmm2
  12818. vpxor %xmm1, %xmm2, %xmm2
  12819. vpclmulqdq $16, L_aes_gcm_avx2_mod2_128, %xmm2, %xmm1
  12820. vaesenc 96(%ebp), %xmm7, %xmm7
  12821. vaesenc 112(%ebp), %xmm7, %xmm7
  12822. vaesenc 128(%ebp), %xmm7, %xmm7
  12823. vpshufd $0x4e, %xmm2, %xmm2
  12824. vaesenc 144(%ebp), %xmm7, %xmm7
  12825. vpxor %xmm3, %xmm4, %xmm4
  12826. vpxor %xmm4, %xmm2, %xmm2
  12827. vmovdqu 160(%ebp), %xmm0
  12828. cmpl $11, 184(%esp)
  12829. jl L_AES_GCM_decrypt_update_avx2_aesenc_gfmul_sb_last
  12830. vaesenc %xmm0, %xmm7, %xmm7
  12831. vaesenc 176(%ebp), %xmm7, %xmm7
  12832. vmovdqu 192(%ebp), %xmm0
  12833. cmpl $13, 184(%esp)
  12834. jl L_AES_GCM_decrypt_update_avx2_aesenc_gfmul_sb_last
  12835. vaesenc %xmm0, %xmm7, %xmm7
  12836. vaesenc 208(%ebp), %xmm7, %xmm7
  12837. vmovdqu 224(%ebp), %xmm0
  12838. L_AES_GCM_decrypt_update_avx2_aesenc_gfmul_sb_last:
  12839. vaesenclast %xmm0, %xmm7, %xmm7
  12840. vmovdqu (%esi,%ebx,1), %xmm3
  12841. vpxor %xmm1, %xmm2, %xmm6
  12842. vpxor %xmm3, %xmm7, %xmm7
  12843. vmovdqu %xmm7, (%edi,%ebx,1)
  12844. vmovdqu 64(%esp), %xmm4
  12845. addl $16, %ebx
  12846. cmpl %eax, %ebx
  12847. jl L_AES_GCM_decrypt_update_avx2_last_block_start
  12848. L_AES_GCM_decrypt_update_avx2_last_block_done:
  12849. L_AES_GCM_decrypt_update_avx2_done_dec:
  12850. movl 200(%esp), %esi
  12851. movl 208(%esp), %edi
  12852. vmovdqu 64(%esp), %xmm4
  12853. vmovdqu %xmm6, (%esi)
  12854. vmovdqu %xmm4, (%edi)
  12855. addl $0xa0, %esp
  12856. popl %ebp
  12857. popl %edi
  12858. popl %esi
  12859. popl %ebx
  12860. ret
  12861. .size AES_GCM_decrypt_update_avx2,.-AES_GCM_decrypt_update_avx2
  12862. .text
  12863. .globl AES_GCM_decrypt_final_avx2
  12864. .type AES_GCM_decrypt_final_avx2,@function
  12865. .align 16
  12866. AES_GCM_decrypt_final_avx2:
  12867. pushl %ebx
  12868. pushl %esi
  12869. pushl %edi
  12870. pushl %ebp
  12871. subl $16, %esp
  12872. movl 36(%esp), %ebp
  12873. movl 56(%esp), %esi
  12874. movl 60(%esp), %edi
  12875. vmovdqu (%ebp), %xmm4
  12876. vmovdqu (%esi), %xmm5
  12877. vmovdqu (%edi), %xmm6
  12878. vpsrlq $63, %xmm5, %xmm1
  12879. vpsllq $0x01, %xmm5, %xmm0
  12880. vpslldq $8, %xmm1, %xmm1
  12881. vpor %xmm1, %xmm0, %xmm0
  12882. vpshufd $0xff, %xmm5, %xmm5
  12883. vpsrad $31, %xmm5, %xmm5
  12884. vpand L_aes_gcm_avx2_mod2_128, %xmm5, %xmm5
  12885. vpxor %xmm0, %xmm5, %xmm5
  12886. # calc_tag
  12887. movl 48(%esp), %ecx
  12888. shll $3, %ecx
  12889. vpinsrd $0x00, %ecx, %xmm0, %xmm0
  12890. movl 52(%esp), %ecx
  12891. shll $3, %ecx
  12892. vpinsrd $2, %ecx, %xmm0, %xmm0
  12893. movl 48(%esp), %ecx
  12894. shrl $29, %ecx
  12895. vpinsrd $0x01, %ecx, %xmm0, %xmm0
  12896. movl 52(%esp), %ecx
  12897. shrl $29, %ecx
  12898. vpinsrd $3, %ecx, %xmm0, %xmm0
  12899. vpxor %xmm4, %xmm0, %xmm0
  12900. # ghash_gfmul_red
  12901. vpclmulqdq $16, %xmm5, %xmm0, %xmm7
  12902. vpclmulqdq $0x01, %xmm5, %xmm0, %xmm3
  12903. vpclmulqdq $0x00, %xmm5, %xmm0, %xmm2
  12904. vpxor %xmm3, %xmm7, %xmm7
  12905. vpslldq $8, %xmm7, %xmm3
  12906. vpsrldq $8, %xmm7, %xmm7
  12907. vpxor %xmm2, %xmm3, %xmm3
  12908. vpclmulqdq $0x11, %xmm5, %xmm0, %xmm0
  12909. vpclmulqdq $16, L_aes_gcm_avx2_mod2_128, %xmm3, %xmm2
  12910. vpshufd $0x4e, %xmm3, %xmm3
  12911. vpxor %xmm2, %xmm3, %xmm3
  12912. vpclmulqdq $16, L_aes_gcm_avx2_mod2_128, %xmm3, %xmm2
  12913. vpshufd $0x4e, %xmm3, %xmm3
  12914. vpxor %xmm7, %xmm0, %xmm0
  12915. vpxor %xmm3, %xmm0, %xmm0
  12916. vpxor %xmm2, %xmm0, %xmm0
  12917. vpshufb L_aes_gcm_avx2_bswap_mask, %xmm0, %xmm0
  12918. vpxor %xmm6, %xmm0, %xmm0
  12919. movl 40(%esp), %esi
  12920. movl 64(%esp), %edi
  12921. # cmp_tag
  12922. cmpl $16, 44(%esp)
  12923. je L_AES_GCM_decrypt_final_avx2_cmp_tag_16
  12924. xorl %ecx, %ecx
  12925. xorl %edx, %edx
  12926. vmovdqu %xmm0, (%esp)
  12927. L_AES_GCM_decrypt_final_avx2_cmp_tag_loop:
  12928. movzbl (%esp,%ecx,1), %eax
  12929. xorb (%esi,%ecx,1), %al
  12930. orb %al, %dl
  12931. incl %ecx
  12932. cmpl 44(%esp), %ecx
  12933. jne L_AES_GCM_decrypt_final_avx2_cmp_tag_loop
  12934. cmpb $0x00, %dl
  12935. sete %dl
  12936. jmp L_AES_GCM_decrypt_final_avx2_cmp_tag_done
  12937. L_AES_GCM_decrypt_final_avx2_cmp_tag_16:
  12938. vmovdqu (%esi), %xmm1
  12939. vpcmpeqb %xmm1, %xmm0, %xmm0
  12940. vpmovmskb %xmm0, %ecx
  12941. # %%edx == 0xFFFF then return 1 else => return 0
  12942. xorl %edx, %edx
  12943. cmpl $0xffff, %ecx
  12944. sete %dl
  12945. L_AES_GCM_decrypt_final_avx2_cmp_tag_done:
  12946. movl %edx, (%edi)
  12947. addl $16, %esp
  12948. popl %ebp
  12949. popl %edi
  12950. popl %esi
  12951. popl %ebx
  12952. ret
  12953. .size AES_GCM_decrypt_final_avx2,.-AES_GCM_decrypt_final_avx2
  12954. #endif /* WOLFSSL_AESGCM_STREAM */
  12955. #endif /* HAVE_INTEL_AVX2 */
  12956. #if defined(__linux__) && defined(__ELF__)
  12957. .section .note.GNU-stack,"",%progbits
  12958. #endif