/* Ċ Ġ* ĠCopyright Ġ 2 0 1 4 - 2 0 2 0 ĠJetBrains Ġs . r . o Ġand Ġcontributors . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense . Ċ Ġ*/ Ċ Ċ @ file : kotlin . jvm . Jvm Mult if ile Class Ċ @ file : kotlin . jvm . Jvm Name (" Crypto Kt ") Ċ Ċ package Ġio . ktor . util Ċ Ċ import Ġio . ktor . utils . io . char sets .* Ċ import Ġio . ktor . utils . io . core .* Ċ import Ġkotlin . native . concurrent .* Ċ Ċ @ Shared Immutable Ċ private Ġval Ġdigits Ġ= Ġ" 0 1 2 3 4 5 6 7 8 9 abcdef ". toCharArray () Ċ Ċ /** Ċ Ġ* ĠEncode Ġ[ bytes ] Ġas Ġa ĠHEX Ġstring Ġwith Ġno Ġspaces , Ġnew lines Ġand Ġ` 0 x ` Ġprefixes . Ċ Ġ*/ Ċ public Ġfun Ġhex ( bytes : ĠByteArray ): ĠString Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= ĠChar Array ( bytes . size Ġ* Ġ 2 ) ĊĠĠĠ Ġvar Ġresult Index Ġ= Ġ 0 ĊĠĠĠ Ġval Ġdigits Ġ= Ġdigits ĊĊĠĠĠ Ġfor Ġ( index Ġin Ġ 0 Ġuntil Ġbytes . size ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġb Ġ= Ġbytes [ index ]. toInt () Ġand Ġ 0 xff ĊĠĠĠĠĠĠĠ Ġresult [ result Index ++] Ġ= Ġdigits [ b Ġshr Ġ 4 ] ĊĠĠĠĠĠĠĠ Ġresult [ result Index ++] Ġ= Ġdigits [ b Ġand Ġ 0 x 0 f ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġresult . concat ToString () Ċ } Ċ Ċ /** Ċ Ġ* ĠDecode Ġbytes Ġfrom ĠHEX Ġstring . ĠIt Ġshould Ġbe Ġno Ġspaces Ġand Ġ` 0 x ` Ġprefixes . Ċ Ġ*/ Ċ public Ġfun Ġhex ( s : ĠString ): ĠByteArray Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= ĠByteArray ( s . length Ġ/ Ġ 2 ) ĊĠĠĠ Ġfor Ġ( idx Ġin Ġ 0 Ġuntil Ġresult . size ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsrc Idx Ġ= Ġidx Ġ* Ġ 2 ĊĠĠĠĠĠĠĠ Ġval Ġhigh Ġ= Ġs [ src Idx ]. toString (). toInt ( 1 6 ) Ġshl Ġ 4 ĊĠĠĠĠĠĠĠ Ġval Ġlow Ġ= Ġs [ src Idx Ġ+ Ġ 1 ]. toString (). toInt ( 1 6 ) ĊĠĠĠĠĠĠĠ Ġresult [ idx ] Ġ= Ġ( high Ġor Ġlow ). to Byte () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ /** Ċ Ġ* ĠGenerates Ġa Ġnonce Ġstring . ĠCould Ġblock Ġif Ġthe Ġsystem 's Ġentropy Ġsource Ġis Ġempty Ċ Ġ*/ Ċ @ Internal API Ċ public Ġexpect Ġfun Ġgenerate Nonce (): ĠString Ċ Ċ /** Ċ Ġ* ĠGenerates Ġa Ġnonce Ġbytes Ġof Ġ[ size ]. ĠCould Ġblock Ġif Ġthe Ġsystem 's Ġentropy Ġsource Ġis Ġempty Ċ Ġ*/ Ċ @ Internal API Ċ public Ġfun Ġgenerate Nonce ( size : ĠInt ): ĠByteArray Ġ= Ġbuild Packet Ġ{ ĊĠĠĠ Ġwhile Ġ( this . size Ġ< Ġsize ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwrite Text ( generate Nonce ()) ĊĠĠĠ Ġ} Ċ }. read Bytes ( size ) Ċ Ċ /** Ċ Ġ* ĠCompute ĠSHA - 1 Ġhash Ġfor Ġthe Ġspecified Ġ[ bytes ] Ċ Ġ*/ Ċ public Ġexpect Ġfun Ġsha 1 ( bytes : ĠByteArray ): ĠByteArray Ċ Ċ /** Ċ Ġ* ĠCreate Ġ[ Digest ] Ġfrom Ġspecified Ġhash Ġ[ name ]. Ċ Ġ*/ Ċ @ Suppress (" FunctionName ") Ċ @ Internal API Ċ public Ġexpect Ġfun ĠDigest ( name : ĠString ): ĠDigest Ċ Ċ /** Ċ Ġ* ĠStateful Ġdigest Ġclass Ġspecified Ġto Ġcalculate Ġdigest . Ċ Ġ*/ Ċ @ Internal API Ċ public Ġinterface ĠDigest Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdd Ġ[ bytes ] Ġto Ġdigest Ġvalue . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġoperator Ġfun Ġplus Assign ( bytes : ĠByteArray ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReset Ġ[ Digest ] Ġstate . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġreset () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalculate Ġdigest Ġbytes . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġsuspend Ġfun Ġbuild (): ĠByteArray Ċ } Ċ Ċ /** Ċ Ġ* ĠCalculate Ġdigest Ġfrom Ġcurrent Ġstate Ġand Ġspecified Ġ[ bytes ]. Ċ Ġ*/ Ċ @ Internal API Ċ public Ġsuspend Ġfun ĠDigest . build ( bytes : ĠByteArray ): ĠByteArray Ġ{ ĊĠĠĠ Ġthis Ġ+= Ġbytes ĊĠĠĠ Ġreturn Ġbuild () Ċ } Ċ Ċ /** Ċ Ġ* ĠCalculate Ġdigest Ġfrom Ġcurrent Ġstate Ġand Ġspecified Ġ[ string ]. Ċ Ġ*/ Ċ @ Internal API Ċ public Ġsuspend Ġfun ĠDigest . build ( string : ĠString , Ġcharset : ĠCharset Ġ= ĠChar sets . UTF _ 8 ): ĠByteArray Ġ{ ĊĠĠĠ Ġthis Ġ+= Ġstring . toByteArray ( charset ) ĊĠĠĠ Ġreturn Ġbuild () Ċ } Ċ