package Ġcom . na o 2 0 0 1 0 1 2 8 na o . Crypt orage . internal . crypt orage Ċ Ċ import Ġcom . be ust . kl ax on . JsonObject Ċ import Ġcom . google . common . io . Byte Sink Ċ import Ġcom . google . common . io . Byte Source Ċ import Ġcom . na o 2 0 0 1 0 1 2 8 na o . Crypt orage . Aes Keys Ċ import Ġcom . na o 2 0 0 1 0 1 2 8 na o . Crypt orage . Crypt orage Ċ import Ġcom . na o 2 0 0 1 0 1 2 8 na o . Crypt orage . Crypt orage . Companion . META _ LAST _ NON CE Ċ import Ġcom . na o 2 0 0 1 0 1 2 8 na o . Crypt orage . Crypt orage . Companion . META _ NON CE _ MODE Ċ import Ġcom . na o 2 0 0 1 0 1 2 8 na o . Crypt orage . Crypt orage . Companion . META _ SPLIT _ SIZE Ċ import Ġcom . na o 2 0 0 1 0 1 2 8 na o . Crypt orage . Crypt orage . Companion . NON CE _ MODE _ RANDOM Ċ import Ġcom . na o 2 0 0 1 0 1 2 8 na o . Crypt orage . Crypt orage . Companion . NON CE _ MODE _ SEQUENTIAL Ċ import Ġcom . na o 2 0 0 1 0 1 2 8 na o . Crypt orage . File Source Ċ import Ġcom . na o 2 0 0 1 0 1 2 8 na o . Crypt orage . internal .* Ċ import Ġjava . math . BigInteger Ċ import Ġjava . util .* Ċ import Ġkotlin . collections . ArrayList Ċ Ċ internal Ġclass ĠCrypt orage Impl V 3 ( private Ġval Ġsource : ĠFile Source , Ġprivate Ġval Ġkeys : ĠA es Keys , Ġprivate Ġval Ġprefer Manifest Nonce : ĠBoolean ) Ġ: ĠCrypt orage Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMAN IFEST : ĠString Ġ= Ġ" manifest " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMAN IFEST _ NON CE Ġ= Ġ" manifest _ nonce " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSPL IT _ SIZE _ DEFAULT : ĠInt Ġ= Ġ 1 0 0 Ġ* Ġ 1 0 2 4 Ġ/* Ġ 1 0 0 kb Ġ*/ Ġ- Ġ 1 6 Ġ/* ĠFinal Ġblock Ġsize Ġ*/ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġpopulate Keys ( password : ĠString ): ĠA es Keys Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġutf 8 Bytes 1 Ġ= Ġpassword . utf 8 Bytes () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġutf 8 Bytes 2 Ġ= Ġ"$ password $ password ". utf 8 Bytes () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPair ( utf 8 Bytes 1 . digest (). digest (). leading ( 1 6 ), Ġutf 8 Bytes 2 . digest (). digest (). trailing ( 1 6 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( source : ĠFile Source , Ġpassword : ĠString , Ġprefer Manifest Nonce : ĠBoolean ) Ġ: Ġthis ( source , Ġpopulate Keys ( password ), Ġprefer Manifest Nonce ) ĊĊĠĠĠ Ġprivate Ġval Ġindex : ĠIndex Ġ= Ġread Index () ĊĠĠĠ Ġprivate Ġvar Ġhas Closed : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġ/** ĠLists Ġup Ġfile Ġnames Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġlist (): ĠList < String > Ġ= Ġnot Closed Ġ{ Ġindex . files . keys . toList () Ġ} ĊĊĠĠĠ Ġ/** ĠOpen s Ġfile Ġfor Ġreading Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġopen ( name : ĠString , Ġoffset : ĠInt ): ĠByte Source Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnot Closed Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! has ( name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile NotFound ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġindex . files [ name ] !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Offset : ĠInt Ġ= Ġoffset Ġ/ Ġfile . split Size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Offset : ĠInt Ġ= Ġoffset Ġ% Ġfile . split Size ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCh ained Decrypt or ( source , Ġkeys , Ġfile . nonce . drop ( index Offset ), Ġfile . files . drop ( index Offset ), Ġfile Offset , Ġfile . size Ġ- Ġoffset ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠOpen s Ġfile Ġfor Ġwriting Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġput ( name : ĠString ): ĠByte Sink Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnot Closed Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has ( name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsplit Size Ġ= Ġindex . meta [ META _ SPLIT _ SIZE ]?. toInt () Ġ?: ĠSPL IT _ SIZE _ DEFAULT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlast Nonce Ġ= Ġindex . meta [ META _ LAST _ NON CE ]?. to BigInteger OrNull () Ġ?: ĠBigInteger . ONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnonce Mode Ġ= Ġindex . meta [ META _ NON CE _ MODE ] Ġ?: ĠNON CE _ MODE _ SEQUENTIAL ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠCrypt orage File ( split Size Ġ= Ġsplit Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex . files [ name ] Ġ= Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCh ained Encrypt or ( source , Ġsplit Size , Ġkeys , Ġfile , Ġ{ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Nonce Ġ= Ġwhen Ġ( nonce Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNON CE _ MODE _ SEQUENTIAL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġln Ġ= Ġlast Nonce ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Nonce Ġ+= ĠBigInteger . ONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex . meta [ META _ LAST _ NON CE ] Ġ= Ġ"$ last Nonce " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġln ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNON CE _ MODE _ RANDOM Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠByteArray ( keys . second . size ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsr . next Bytes ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. to BigInteger () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠBigInteger . ZERO ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeys . copy ( second Ġ= Ġkeys . second Ġxor Ġnext Nonce ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠMov es Ġfile Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġmv ( from : ĠString , Ġto : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnot Closed Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! has ( from )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile NotFound ( from ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( from Ġ== Ġto ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has ( to )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete ( to ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex . files [ to ] Ġ= Ġindex . files [ from ] !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex . files . remove ( from ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠDeletes Ġa Ġfile Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġdelete ( name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnot Closed Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! has ( name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile NotFound ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremoval Ġ= Ġindex . files [ name ] !!. files ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġused By Other Ġ= Ġencrypted Files ID ont Own ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremoval . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġin Ġused By Other ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ forEach ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource . delete ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex . files . remove ( name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠChecks Ġlast Ġmodified Ġdate Ġand Ġtime Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġlast Modified ( name : ĠString ): ĠLong Ġ= Ġnot Closed Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhas ( name ) Ġ-> Ġindex . files [ name ] !!. lastModified ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfile NotFound ( name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠChecks ĠCrypt orage Ġis Ġread - only Ġ*/ ĊĠĠĠ Ġoverride Ġval Ġis ReadOnly : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġnot Closed Ġ{ Ġsource . is ReadOnly Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsize ( name : ĠString ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnot Closed Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! has ( name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile NotFound ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex . files [ name ] !!. size ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠRemoves Ġunused Ġfiles Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġgc () Ġ{ ĊĠĠĠĠĠĠĠ Ġnot Closed Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġls Ġ= Ġsource . list () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġunused Ġ= Ġls Ġ- Ġindex . files . flatMap Ġ{ Ġit . value . files Ġ} Ġ- ĠMAN IFEST ĊĠĠĠĠĠĠĠĠĠĠĠ Ġunused . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource . delete ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġmeta ( key : ĠString ): ĠString ? Ġ= Ġnot Closed Ġ{ Ġindex . meta [ key ] Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġmeta ( key : ĠString , Ġvalue : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnot Closed Ġ{ Ġindex . meta [ key ] Ġ= Ġvalue Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcommit () Ġ{ ĊĠĠĠĠĠĠĠ Ġnot Closed Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmanifest Keys Ġ= Ġif Ġ( source . has ( MAN IFEST _ NON CE ) Ġ|| Ġprefer Manifest Nonce ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġiv Ġ= ĠByteArray ( keys . second . size ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsr . next Bytes ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource . put ( MAN IFEST _ NON CE ). write ( iv ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeys . copy ( second Ġ= Ġiv ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeys ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroot Ġ= ĠJsonObject () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot [" files "] Ġ= Ġindex . files . map Values Ġ{ Ġit . value . toJson Map () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot [" meta "] Ġ= Ġindex . meta ĊĠĠĠĠĠĠĠĠĠĠĠ ĠA es Encrypt or Byte Sink ( source . put ( MAN IFEST ), Ġmanifest Keys ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. write ( root . toJson String ( false ). utf 8 Bytes ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource . commit () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġcommit () ĊĠĠĠĠĠĠĠ Ġsource . close () ĊĠĠĠĠĠĠĠ ĠArrays . fill ( keys . first , Ġ 0 ) ĊĠĠĠĠĠĠĠ ĠArrays . fill ( keys . second , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġindex . files . clear () ĊĠĠĠĠĠĠĠ Ġindex . meta . clear () ĊĠĠĠĠĠĠĠ Ġhas Closed Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġread Index (): ĠIndex Ġ= Ġif Ġ( source . has ( MAN IFEST )) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmanifest Keys Ġ= Ġif Ġ( source . has ( MAN IFEST _ NON CE )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġiv Ġ= Ġsource . open ( MAN IFEST _ NON CE ). read () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkeys . copy ( second Ġ= Ġiv ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkeys ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġparse Json ( Aes Decrypt or Byte Source ( source . open ( MAN IFEST ), Ġmanifest Keys ). as Char Source (). open Stream ()) ĊĠĠĠĠĠĠĠ Ġval Ġfiles Ġ= Ġdata . obj (" files ") !!. map Values Ġ{ ĠCrypt orage File ( it . value Ġas ĠJsonObject ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmeta Ġ= Ġdata . obj (" meta ") !!. map Values Ġ{ Ġ"${ it . value }" Ġ} ĊĠĠĠĠĠĠĠ ĠIndex ( files . to Mutable Map (), Ġmeta . to Mutable Map ()) ĊĠĠĠ Ġ} Ġelse Ġif Ġ(! source . is ReadOnly ) Ġ{ ĊĠĠĠĠĠĠĠ ĠIndex ( hash Map Of (), Ġhash Map Of ()) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġerror (" Cannot Ġcreate ĠCrypt orage ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġ< T > Ġnot Closed ( f : Ġ() Ġ-> ĠT ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( has Closed ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclosed (" Crypt orage ") ĊĠĠĠĠĠĠĠ Ġreturn Ġf () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠCrypt orage File . toJson Map (): ĠMap < String , ĠAny > Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" files " Ġto Ġfiles , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" nonce " Ġto Ġnonce . map Ġ{ Ġ"$ it " Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" split Size " Ġto Ġsplit Size , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" lastModified " Ġto Ġlast Modified , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" size " Ġto Ġsize ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġfun Ġencrypted Files ID ont Own ( non Encrypted : ĠString ): ĠSorted Set < String > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex . files . as Sequence (). filter Ġ{ Ġit . key Ġ!= Ġnon Encrypted Ġ}. flatMap Ġ{ Ġit . value . files . as Sequence () Ġ}. to Sorted Set () ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠIndex ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfiles : ĠMutable Map < String , ĠCrypt orage File >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmeta : ĠMutable Map < String , ĠString > ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠCrypt orage File ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfiles : ĠMutable List < String > Ġ= ĠArrayList (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnonce : ĠMutable List < BigInteger > Ġ= ĠArrayList (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsplit Size : ĠInt Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlast Modified : ĠLong Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsize : ĠLong Ġ= Ġ 0 ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġconstructor ( file : ĠJsonObject ) Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . array < String >(" files ") !!. to Mutable List (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġallow Ġreading ĠV 1 Ġcrypt orage Ġ( V 1 Ġis Ġalso Ġacceptable Ġas ĠV 3 , Ġwith Ġall Ġnonce Ġare Ġzero ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( file . array < String >(" nonce ") ?. map Ġ{ Ġit . to BigInteger () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠList < BigInteger >( file . array < String >(" files ") !!. size ) Ġ{ ĠBigInteger . ZERO Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Mutable List (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . int (" split Size ") !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . long (" lastModified ") !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . long (" size ") !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠCh ained Encrypt or ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġsource : ĠFile Source , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsize : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġbase Keys : ĠA es Keys , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġfile : ĠCrypt orage File , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġcommit R : Ġ() Ġ-> ĠUnit , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġnext Key : Ġ() Ġ-> ĠA es Keys , ĊĠĠĠ Ġ) Ġ: ĠCh ained Encrypt or Base ( source , Ġsize ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Rewrite () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . files . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource . delete ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . files . clear () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonStart Write () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . lastModified Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon File Ended ( name : ĠString , Ġsize : ĠInt , Ġkeys : ĠA es Keys ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . files . add ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġxor Ġ= Ġ( keys . second Ġxor Ġbase Keys . second ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . nonce . add ( xor . to BigInteger ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . size Ġ+= Ġsize ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcommit () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommit R () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetNext Key (): ĠA es Keys Ġ= Ġnext Key () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠCh ained Decrypt or ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource : ĠFile Source , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkeys : ĠA es Keys , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġiv Nonce : ĠList < BigInteger >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfiles : ĠList < String >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbytes To Skip : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Size : ĠLong ?, ĊĠĠĠ Ġ) Ġ: ĠCh ained Decrypt or Base ( source , Ġfiles , Ġbytes To Skip , Ġtotal Size ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetKey For File ( file : ĠString ): ĠA es Keys Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnonce Ġ= Ġiv Nonce [ files . indexOf ( file )] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġkeys . copy ( second Ġ= Ġkeys . second Ġxor Ġnonce ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ