package Ġeu . fb k . st . crypto ac . crypto . s odium Ċ Ċ import Ġcom . ion spin . kotlin . crypto . Secret Stream X Ch a Ch a 2 0 Poly 1 3 0 5 State Ċ import Ġcom . ion spin . kotlin . crypto . secret stream .* Ċ import Ġjava . io . Filter InputStream Ċ import Ġjava . io . IOException Ċ import Ġjava . io . InputStream Ċ import Ġjava . lang . Thread . sleep Ċ import Ġjavax . crypto . Bad Padding Exception Ċ import Ġjavax . crypto . Illegal BlockSize Exception Ċ import Ġkotlin . experimental . and Ċ Ċ /** Ċ Ġ* ĠA Ġfilter Ġinput Ġstream Ġapplying Ġthe Ġsymmetric ĠS odium Ġstream Ġcipher Ċ Ġ* Ġwith Ġthe Ġgiven Ġ[ state And Header ] Ġand Ġ[ mode ] Ġto Ġthe Ġ[ inputStream ] Ċ Ġ*/ Ċ class ĠS odium Cipher InputStream ( ĊĠĠĠ ĠinputStream : ĠInputStream , ĊĠĠĠ Ġstate And Header : ĠSecret Stream State And Header , ĊĠĠĠ Ġmode : ĠInt Ċ ) Ġ: ĠFilter InputStream ( inputStream ) Ġ{ ĊĊĠĠĠ Ġ/** ĠThe Ġstate Ġof Ġthe Ġcipher , Ġembedding Ġthe Ġsecret Ġkey Ġand Ġthe Ġnonce Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġstate : ĠSecret Stream X Ch a Ch a 2 0 Poly 1 3 0 5 State Ġ= Ġstate And Header . state ĊĊĠĠĠ Ġ/** ĠThe Ġheader Ġof Ġthe Ġcipher . ĠThe Ġsame Ġheader Ġmust Ġbe Ġused Ġfor Ġencryption Ġand Ġde cryption Ġ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġheader : ĠByteArray Ġ= Ġstate And Header . header . toByteArray () ĊĊĠĠĠ Ġ/** ĠThe Ġstream Ġcontaining Ġthe Ġinput Ġto Ġen / decrypt Ġ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġinput : ĠInputStream Ġ= ĠinputStream ĊĊĠĠĠ Ġ/** ĠThe Ġbuffer Ġin Ġwhich Ġto Ġstore Ġthe Ġbytes Ġread Ġfrom Ġthe Ġ[ input ] Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġi buffer : ĠByteArray ĊĊĠĠĠ Ġ/** ĠWhether Ġthe Ġ[ input ] Ġstream Ġfinished Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġdone Ġ= Ġfalse ĊĊĠĠĠ Ġ/** ĠThe Ġbuffer Ġin Ġwhich Ġto Ġwrite Ġthe Ġoutput , Ġi . e ., Ġthe Ġen / de crypted Ġbytes Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġo buffer : ĠByteArray ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĠStarting Ġoffset Ġfrom Ġwhich Ġto Ġread Ġthe Ġ[ o buffer ] Ġ( in Ġcase Ġthe Ġcaller Ġreads Ġbyte Ġper Ġbyte ) Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġo start Ġ= Ġ 0 ĊĊĠĠĠ Ġ/** ĠEnd ing Ġoffset Ġuntil Ġwhich Ġread Ġthe Ġ[ o buffer ] Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġof in ish Ġ= Ġ 0 ĊĊĠĠĠ Ġ/** ĠWhether Ġthe Ġcalled Ġcalled Ġthe Ġclose Ġmethod Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġclosed Ġ= Ġfalse ĊĊĠĠĠ Ġ/** ĠEither Ġ[ ENCRYPT _ MODE ] Ġfor Ġencrypt ing Ġor Ġ[ DE CRYPT _ MODE ] Ġfor Ġdecrypt ing Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġcipher Mode Ġ= Ġmode ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWhether Ġthe Ġheader Ġhas Ġalready Ġbeen Ġincluded Ġat Ġthe Ġbeginning Ġof Ġthe Ġoutput Ġstream . ĊĠĠĠĠ Ġ* ĠThe Ġheader Ġalways Ġis Ġ[ crypto _ secret stream _ x ch acha 2 0 poly 1 3 0 5 _ HEADER BYTES ] Ġbytes Ġlong ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġsent Header Ġ= Ġfalse ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCheck Ġthat Ġa Ġvalid Ġmode Ġhas Ġbeen Ġprovided Ġand Ġaccordingly Ġset Ġthe ĊĠĠĠĠ Ġ* Ġlength Ġof Ġthe Ġinput Ġbuffer . ĠWe Ġencrypt Ġblocks Ġof Ġ 5 1 2 Ġbytes . ĠHowever , ĊĠĠĠĠ Ġ* Ġfor Ġde cryption , Ġthe Ġi buffer Ġshould Ġbe Ġ[ crypto _ secret stream _ x ch acha 2 0 poly 1 3 0 5 _ AB Y TES ] ĊĠĠĠĠ Ġ* Ġbytes Ġlonger , Ġi . e ., Ġthe Ġlength Ġof Ġthe Ġauthentication Ġtag Ġfor Ġthe ĊĠĠĠĠ Ġ* Ġintegrity Ġof Ġthe Ġblock ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( mode Ġ== ĠEN CRYPT _ MODE Ġ|| Ġmode Ġ== ĠDE CRYPT _ MODE ) Ġ{ Ġ" Illegal Ġcipher Ġmode Ġgiven " Ġ} ĊĠĠĠĠĠĠĠ Ġi buffer Ġ= ĠByteArray ( 5 1 2 Ġ+ Ġif Ġ( mode Ġ== ĠDE CRYPT _ MODE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcrypto _ secret stream _ x ch acha 2 0 poly 1 3 0 5 _ AB Y TES ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEN CRYPT _ MODE Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDE CRYPT _ MODE Ġ= Ġ 2 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRead Ġdata Ġfrom Ġthe Ġ[ i buffer ], Ġprocess Ġit Ġ( either Ġencrypt Ġor Ġdecrypt ) ĊĠĠĠĠ Ġ* Ġand Ġput Ġthe Ġresulting Ġbytes Ġin Ġthe Ġ[ o buffer ]. ĠReturn Ġthe Ġnumber Ġof ĊĠĠĠĠ Ġ* Ġbytes Ġin Ġthe Ġ[ o buffer ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ get : Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġval Ġmore Data : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġif Ġ( done ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ- 1 ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠIf Ġwe Ġare Ġencrypt ing , Ġfirst Ġsend Ġthe ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġheader , Ġwhich Ġis Ġrequired Ġfor Ġde cryption ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cipher Mode Ġ== ĠEN CRYPT _ MODE Ġ&& Ġ! sent Header ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsent Header Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġo buffer Ġ= Ġheader ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġo start Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġof in ish Ġ= Ġcrypto _ secret stream _ x ch acha 2 0 poly 1 3 0 5 _ HEADER BYTES ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcrypto _ secret stream _ x ch acha 2 0 poly 1 3 0 5 _ HEADER BYTES ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġread In Ġ= Ġinput . read ( i buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( read In Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdone Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠIf Ġwe Ġalready Ġread Ġeverything , Ġand Ġwe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġare Ġencrypt ing , Ġdo Ġthe Ġfinal Ġblock ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cipher Mode Ġ== ĠEN CRYPT _ MODE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġo buffer Ġ= ĠSecret Stream . x Ch a Ch a 2 0 Poly 1 3 0 5 Push ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= Ġstate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= ĠU ByteArray ( 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassociated Data Ġ= ĠU ByteArray ( 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag Ġ= Ġcrypto _ secret stream _ x ch acha 2 0 poly 1 3 0 5 _ TAG _ FINAL . to U Byte (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). toByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( o buffer Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġo start Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġof in ish Ġ= Ġo buffer !!. size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġof in ish ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠIf Ġwe Ġalready Ġread Ġeverything , Ġand Ġwe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġare Ġdecrypt ing , Ġdo Ġnothing Ġ( pull Ġfinal ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġis Ġnot Ġrequired ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠIf Ġwe Ġare Ġhere , Ġit Ġmeans Ġthat Ġwe Ġread Ġ[ read In ] Ġbytes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġfrom Ġthe Ġ[ i buffer ]. ĠTo Ġensure Ġthat Ġthe Ġ[ i buffer ] Ġwas ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġcompletely Ġfilled , Ġkeep Ġreading Ġfrom Ġthe Ġ[ input ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġuntil Ġwe Ġcomplete Ġthe Ġblock Ġor Ġthe Ġ[ input ] Ġis Ġex hausted ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġex hausted Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( i buffer . size Ġ!= Ġread In Ġ&& Ġ! ex hausted ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġread In 2 Ġ= Ġinput . read ( i buffer , Ġread In , Ġi buffer . size - read In ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( read In 2 Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdone Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġex hausted Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread In Ġ+= Ġread In 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi buffer Ġ= Ġi buffer . slice Array ( 0 Ġuntil Ġread In ) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĠEither Ġencrypt Ġor Ġdecrypt Ġthe Ġ[ i buffer ] Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġo buffer Ġ= Ġif Ġ( cipher Mode Ġ== ĠEN CRYPT _ MODE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSecret Stream . x Ch a Ch a 2 0 Poly 1 3 0 5 Push ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= Ġstate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġi buffer . to U ByteArray (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassociated Data Ġ= ĠU ByteArray ( 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag Ġ= Ġif Ġ( ex hausted ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcrypto _ secret stream _ x ch acha 2 0 poly 1 3 0 5 _ TAG _ FINAL . to U Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcrypto _ secret stream _ x ch acha 2 0 poly 1 3 0 5 _ TAG _ MESSAGE . to U Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). toByteArray (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdecrypted Data And Tag Ġ= ĠSecret Stream . x Ch a Ch a 2 0 Poly 1 3 0 5 Pull ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= Ġstate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġciphertext Ġ= Ġi buffer . to U ByteArray (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassociated Data Ġ= ĠU ByteArray ( 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( de crypted Data And Tag . tag Ġ== Ġcrypto _ secret stream _ x ch acha 2 0 poly 1 3 0 5 _ TAG _ FINAL . to U Byte ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdone Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdecrypted Data And Tag . de crypted Data . toByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġo start Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġof in ish Ġ= Ġif Ġ( o buffer Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġo buffer !!. size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġof in ish ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġread (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( ost art Ġ>= Ġof in ish ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ= Ġmore Data ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtwo 5 5 Ġ= Ġ 2 5 5 ĊĠĠĠĠĠĠĠ Ġreturn Ġ( o buffer ! ![ ost art ++] Ġand Ġtwo 5 5 . to Byte ()). toInt () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġread ( b : ĠByteArray ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . read ( b , Ġ 0 , Ġb . size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġread ( b : ĠByteArray , Ġoff : ĠInt , Ġlen : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġavailable : ĠInt ĊĠĠĠĠĠĠĠ Ġif Ġ( ost art Ġ>= Ġof in ish ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġavailable Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( available Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġavailable Ġ= Ġmore Data ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( available Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( len Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġavailable Ġ= Ġof in ish Ġ- Ġo start ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( len Ġ< Ġavailable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġavailable Ġ= Ġlen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . arraycopy ( o buffer !! , Ġo start , Ġb , Ġoff , Ġavailable ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġo start Ġ+= Ġavailable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġavailable ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġskip ( n : ĠLong ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġn Ġ= Ġn ĊĠĠĠĠĠĠĠ Ġval Ġavailable Ġ= Ġof in ish Ġ- Ġo start ĊĠĠĠĠĠĠĠ Ġif Ġ( n Ġ> Ġavailable . to Long ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn Ġ= Ġavailable . to Long () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( n Ġ< Ġ 0 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 L ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġo start Ġ= Ġ( ost art . to Long () Ġ+ Ġn ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġavailable (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġof in ish Ġ- Ġo start ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! closed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclosed Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! done ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cipher Mode Ġ== ĠEN CRYPT _ MODE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSecret Stream . x Ch a Ch a 2 0 Poly 1 3 0 5 Push ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= Ġstate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= ĠU ByteArray ( 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassociated Data Ġ= ĠU ByteArray ( 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag Ġ= Ġcrypto _ secret stream _ x ch acha 2 0 poly 1 3 0 5 _ TAG _ FINAL . to U Byte (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). toByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġo start Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġof in ish Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġmark Supported (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} Ċ } Ċ