package Ġorg . cal yx os . backup . storage . crypto Ċ Ċ import Ġcom . google . crypto . t ink . sub tle . Aes G cm Hk df Streaming Ċ import Ġorg . cal yx os . backup . storage . backup . Backup . Companion . VERSION Ċ import Ġorg . cal yx os . backup . storage . crypto . Hk df . ALGORITHM _ HMAC Ċ import Ġorg . cal yx os . backup . storage . crypto . Hk df . KEY _ SIZE _ BYTES Ċ import Ġorg . cal yx os . backup . storage . toByteArray From Hex Ċ import Ġjava . io . IOException Ċ import Ġjava . io . InputStream Ċ import Ġjava . io . OutputStream Ċ import Ġjava . nio . ByteBuffer Ċ import Ġjava . security . General Security Exception Ċ import Ġjavax . crypto . SecretKey Ċ Ċ public Ġobject ĠStream Crypto Ġ{ ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠINFO _ STREAM _ KEY Ġ= Ġ" stream Ġkey " ĊĠĠĠ Ġprivate Ġconst Ġval ĠSIZE _ SEGMENT Ġ= Ġ 1 Ġshl Ġ 2 0 Ġ// Ġ 1 0 2 4 Ġ* Ġ 1 0 2 4 ĊĠĠĠ Ġprivate Ġconst Ġval ĠTYPE _ CHUNK : ĠByte Ġ= Ġ 0 x 0 0 ĊĠĠĠ Ġprivate Ġconst Ġval ĠTYPE _ SNAPSHOT : ĠByte Ġ= Ġ 0 x 0 1 ĊĊĠĠĠ Ġ@ Throws ( General Security Exception :: class ) ĊĠĠĠ Ġpublic Ġfun Ġderive Stream Key ( ĊĠĠĠĠĠĠĠ Ġmaster Key : ĠSecret Key , ĊĠĠĠĠĠĠĠ Ġinfo : ĠByteArray Ġ= ĠINFO _ STREAM _ KEY . toByteArray (), ĊĠĠĠ Ġ): ĠByteArray Ġ= ĠH k df . expand ( ĊĠĠĠĠĠĠĠ Ġsecret Key Ġ= Ġmaster Key , ĊĠĠĠĠĠĠĠ Ġinfo Ġ= Ġinfo , ĊĠĠĠĠĠĠĠ Ġout Length Bytes Ġ= ĠKEY _ SIZE _ BYTES ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġinternal Ġfun Ġget Associated Data For Chunk ( chunk Id : ĠString , Ġversion : ĠByte Ġ= ĠVERSION ): ĠByteArray Ġ= ĊĠĠĠĠĠĠĠ ĠByteBuffer . allocate ( 2 Ġ+ ĠKEY _ SIZE _ BYTES ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. put ( version ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. put ( TYPE _ CHUNK ) Ġ// Ġtype ĠID Ġfor Ġchunks ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. put ( chunk Id . toByteArray From Hex (). apply Ġ{ Ġcheck ( size Ġ== ĠKEY _ SIZE _ BYTES ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. array () ĊĊĠĠĠ Ġinternal Ġfun Ġget Associated Data For Snapshot ( timestamp : ĠLong , Ġversion : ĠByte Ġ= ĠVERSION ): ĠByteArray Ġ= ĊĠĠĠĠĠĠĠ ĠByteBuffer . allocate ( 2 Ġ+ Ġ 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. put ( version ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. put ( TYPE _ SNAPSHOT ) Ġ// Ġtype ĠID Ġfor Ġchunks ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. put ( timestamp . toByteArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. array () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġ[ Aes G cm Hk df Streaming ] Ġencrypt ing Ġstream ĊĠĠĠĠ Ġ* Ġthat Ġgets Ġencrypted Ġwith Ġthe Ġgiven Ġsecret . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠGeneral Security Exception :: class ) ĊĠĠĠ Ġpublic Ġfun Ġnew Encrypt ing Stream ( ĊĠĠĠĠĠĠĠ Ġsecret : ĠByteArray , ĊĠĠĠĠĠĠĠ ĠoutputStream : ĠOutputStream , ĊĠĠĠĠĠĠĠ Ġassociated Data : ĠByteArray Ġ= ĠByteArray ( 0 ), ĊĠĠĠ Ġ): ĠOutputStream Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠA es G cm Hk df Streaming ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsecret , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAL G ORITHM _ HMAC , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKEY _ SIZE _ BYTES , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSIZE _ SEGMENT , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠ Ġ). new Encrypt ing Stream ( output Stream , Ġassociated Data ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠGeneral Security Exception :: class ) ĊĠĠĠ Ġpublic Ġfun Ġnew Decrypt ing Stream ( ĊĠĠĠĠĠĠĠ Ġsecret : ĠByteArray , ĊĠĠĠĠĠĠĠ ĠinputStream : ĠInputStream , ĊĠĠĠĠĠĠĠ Ġassociated Data : ĠByteArray Ġ= ĠByteArray ( 0 ), ĊĠĠĠ Ġ): ĠInputStream Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠA es G cm Hk df Streaming ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsecret , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAL G ORITHM _ HMAC , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKEY _ SIZE _ BYTES , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSIZE _ SEGMENT , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠ Ġ). new Decrypt ing Stream ( inputStream , Ġassociated Data ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun ĠLong . toByteArray (): ĠByteArray Ġ= ĠByteArray ( 8 ). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġl Ġ= Ġthis @ toByteArray ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 7 Ġdown To Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ i ] Ġ= Ġ( l Ġand Ġ 0 xFF ). to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġl Ġ= Ġl Ġshr Ġ 8 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ