/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 0 0 - 2 0 2 1 ĠThe ĠLeg ion Ġof Ġthe ĠBo unc y ĠCast le ĠInc . Ġ( https :// www . bouncycastle . org ) Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ċ Ġ* Ġa Ġcopy Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ċ Ġ* Ġ" Software "), Ġto Ġdeal Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ċ Ġ* Ġwithout Ġlimitation Ġthe Ġrights Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ċ Ġ* Ġdistribute , Ġsublicense , Ġand / or Ġsell Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ċ Ġ* Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ċ Ġ* Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ċ Ġ* Ġincluded Ġin Ġall Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , Ċ Ġ* ĠEXPRESS ĠOR ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF Ċ Ġ* ĠMERCHANTABILITY , ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . Ċ Ġ* ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY Ċ Ġ* ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , Ċ Ġ* ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE Ċ Ġ* ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE ĠSOFTWARE . Ċ Ġ* Ċ Ġ* ĠTranslation Ġto ĠKotlin : Ċ Ġ* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠApp mat t us ĠLimited Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . app mat t us . crypto . internal . core . bouncycastle . shake Ċ Ċ @ Suppress (" Magic Number ") Ċ internal Ġclass ĠC SH AK ED i gest Ġ: ĠSH AK ED i gest Ġ{ ĊĠĠĠ Ġprivate Ġval Ġdiff : ĠByteArray ? ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCustom izable ĠSHA KE Ġfunction . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġbit Length Ġbit Ġlength Ġof Ġthe Ġunderlying ĠSHA KE Ġfunction , Ġ 1 2 8 Ġor Ġ 2 5 6 . ĊĠĠĠĠ Ġ* Ġ@ param Ġn ĠĠĠĠĠĠĠĠ Ġthe Ġfunction Ġname Ġstring , Ġnote Ġthis Ġis Ġreserved Ġfor Ġuse Ġby ĠN IST . ĠAvoid Ġusing Ġit Ġif Ġnot Ġrequired . ĊĠĠĠĠ Ġ* Ġ@ param Ġs ĠĠĠĠĠĠĠĠ Ġthe Ġcustomization Ġstring Ġ- Ġavailable Ġfor Ġlocal Ġuse . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġconstructor ( bit Length : ĠInt , Ġn : ĠByteArray ?, Ġs : ĠByteArray ?) Ġ: Ġsuper ( bit Length ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( n ?. isNotEmpty () Ġ== Ġtrue Ġ|| Ġs ?. isNotEmpty () Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdiff Ġ= Ġleft Encode (( rate Ġ/ Ġ 8 ). to Long ()) Ġ+ Ġencode String ( n ) Ġ+ Ġencode String ( s ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdiff Pad And Ab sor b () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdiff Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( source : ĠC SH AK ED i gest ) Ġ: Ġsuper ( source ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdiff Ġ= Ġsource . diff ?. copyOf () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġbyte pad Ġin ĠSP Ġ 8 0 0 - 1 8 5 ĊĠĠĠ Ġprivate Ġfun Ġdiff Pad And Ab sor b () Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠblockSize Ġ= Ġrate Ġ/ Ġ 8 ĊĠĠĠĠĠĠĠ Ġabsor b ( diff !! , Ġ 0 , Ġdiff . size ) ĊĠĠĠĠĠĠĠ Ġval Ġdelta Ġ= Ġdiff . size Ġ% ĠblockSize ĊĊĠĠĠĠĠĠĠ Ġ// Ġonly Ġadd Ġpadding Ġif Ġneeded ĊĠĠĠĠĠĠĠ Ġif Ġ( delta Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġrequired Ġ= ĠblockSize Ġ- Ġdelta ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( required Ġ> Ġpadding . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġabsor b ( padding , Ġ 0 , Ġpadding . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequired Ġ-= Ġpadding . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġabsor b ( padding , Ġ 0 , Ġrequired ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġencode String ( str : ĠByteArray ?): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( str ?. isNotEmpty () Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġleft Encode ( str . size Ġ* Ġ 8 L ) Ġ+ Ġstr ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġleft Encode ( 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġalgorithm Name : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ" C SHA KE $ fixed Output Length " ĊĊĠĠĠ Ġoverride Ġfun Ġdo Output ( out : ĠByteArray , Ġout Off : ĠInt , Ġout Len : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( diff Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! s que ez ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġabsor b Bits ( 0 x 0 0 , Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs queeze ( out , Ġout Off , Ġout Len . to Long () Ġ* Ġ 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout Len ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . do Output ( out , Ġout Off , Ġout Len ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġreset () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . reset () ĊĠĠĠĠĠĠĠ Ġif Ġ( diff Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdiff Pad And Ab sor b () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġleft Encode ( str Len : ĠLong ): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġn : ĠByte Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġvar Ġv Ġ= Ġstr Len ĊĠĠĠĠĠĠĠ Ġwhile Ġ( 8 . let Ġ{ Ġv Ġ= Ġv Ġshr Ġit ; Ġv Ġ} Ġ!= Ġ 0 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġb Ġ= ĠByteArray ( n Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġb [ 0 ] Ġ= Ġn ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. n ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġb [ i ] Ġ= Ġ( str Len Ġshr Ġ( 8 Ġ* Ġ( n Ġ- Ġi ))). to Byte () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġb ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcopy () Ġ= ĠC SH AK ED i gest ( this ) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġpadding Ġ= ĠByteArray ( 1 0 0 ) ĊĠĠĠ Ġ} Ċ } Ċ