package Ġcom . ion spin . kotlin . crypto . secret stream Ċ Ċ import Ġcom . ion spin . kotlin . crypto . Lib s odium Initializer . s odium J na Ċ import Ġcom . ion spin . kotlin . crypto . Secret Stream X Ch a Ch a 2 0 Poly 1 3 0 5 State Ċ Ċ actual Ġtype alias ĠSecret Stream State Ġ= ĠSecret Stream X Ch a Ch a 2 0 Poly 1 3 0 5 State Ċ Ċ actual Ġobject ĠSecret Stream Ġ{ ĊĠĠĠ Ġactual Ġfun Ġx Ch a Ch a 2 0 Poly 1 3 0 5 Init Push ( key : ĠU ByteArray ): ĠSecret Stream State And Header Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= ĠSecret Stream State () ĊĠĠĠĠĠĠĠ Ġval Ġheader Ġ= ĠU ByteArray ( s odium J na . crypto _ secret stream _ x ch acha 2 0 poly 1 3 0 5 _ header bytes ()) ĊĠĠĠĠĠĠĠ Ġs odium J na . crypto _ secret stream _ x ch acha 2 0 poly 1 3 0 5 _ init _ push ( state , Ġheader . as ByteArray (), Ġkey . as ByteArray ()) ĊĠĠĠĠĠĠĠ Ġreturn ĠSecret Stream State And Header ( state , Ġheader ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġfun Ġx Ch a Ch a 2 0 Poly 1 3 0 5 Push ( ĊĠĠĠĠĠĠĠ Ġstate : ĠSecret Stream State , ĊĠĠĠĠĠĠĠ Ġmessage : ĠU ByteArray , ĊĠĠĠĠĠĠĠ Ġassociated Data : ĠU ByteArray , ĊĠĠĠĠĠĠĠ Ġtag : ĠU Byte ĊĠĠĠ Ġ): ĠU ByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġciphertext Ġ= ĠU ByteArray ( message . size Ġ+ Ġcrypto _ secret stream _ x ch acha 2 0 poly 1 3 0 5 _ AB Y TES ) ĊĠĠĠĠĠĠĠ Ġs odium J na . crypto _ secret stream _ x ch acha 2 0 poly 1 3 0 5 _ push ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġciphertext . as ByteArray (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . as ByteArray (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . size . to Long (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassociated Data . as ByteArray (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassociated Data . size . to Long (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtag . to Byte () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn Ġciphertext ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġfun Ġx Ch a Ch a 2 0 Poly 1 3 0 5 Init Pull ( ĊĠĠĠĠĠĠĠ Ġkey : ĠU ByteArray , ĊĠĠĠĠĠĠĠ Ġheader : ĠU ByteArray ĊĠĠĠ Ġ): ĠSecret Stream State And Header Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= ĠSecret Stream State () ĊĠĠĠĠĠĠĠ Ġs odium J na . crypto _ secret stream _ x ch acha 2 0 poly 1 3 0 5 _ init _ pull ( state , Ġheader . as ByteArray (), Ġkey . as ByteArray ()) ĊĠĠĠĠĠĠĠ Ġreturn ĠSecret Stream State And Header ( state , Ġheader ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġfun Ġx Ch a Ch a 2 0 Poly 1 3 0 5 Pull ( ĊĠĠĠĠĠĠĠ Ġstate : ĠSecret Stream State , ĊĠĠĠĠĠĠĠ Ġciphertext : ĠU ByteArray , ĊĠĠĠĠĠĠĠ Ġassociated Data : ĠU ByteArray ĊĠĠĠ Ġ): ĠDecrypt ed Data And Tag Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠU ByteArray ( ciphertext . size Ġ- Ġcrypto _ secret stream _ x ch acha 2 0 poly 1 3 0 5 _ AB Y TES ) ĊĠĠĠĠĠĠĠ Ġval Ġtag Array Ġ= ĠU ByteArray ( 1 ) Ġ{ Ġ 0 U Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġvalidation Result Ġ= Ġs odium J na . crypto _ secret stream _ x ch acha 2 0 poly 1 3 0 5 _ pull ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . as ByteArray (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtag Array . as ByteArray (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġciphertext . as ByteArray (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġciphertext . size . to Long (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassociated Data . as ByteArray (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassociated Data . size . to Long () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġif Ġ( validation Result Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠSecret Stream Cor rupted Or T amper ed DataException () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠDecrypt ed Data And Tag ( result , Ġtag Array [ 0 ]) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġfun Ġx Ch a Ch a 2 0 Poly 1 3 0 5 Key gen (): ĠU ByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgenerated Key Ġ= ĠU ByteArray ( crypto _ secret stream _ x ch acha 2 0 poly 1 3 0 5 _ KEY BYTES ) ĊĠĠĠĠĠĠĠ Ġs odium J na . crypto _ secret stream _ x ch acha 2 0 poly 1 3 0 5 _ key gen ( generated Key . as ByteArray ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġgenerated Key ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġfun Ġx Ch a Ch a 2 0 Poly 1 3 0 5 Re key ( state : ĠSecret Stream State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġs odium J na . crypto _ secret stream _ x ch acha 2 0 poly 1 3 0 5 _ re key ( state ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ