package Ġorg . cal yx os . backup . storage . crypto Ċ Ċ import Ġorg . cal yx os . backup . storage . backup . Chunk er Ċ 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 Ġjava . security . General Security Exception Ċ import Ġjava . security . KeyStore Ċ import Ġjavax . crypto . Mac Ċ import Ġjavax . crypto . SecretKey Ċ import Ġjavax . crypto . spec . SecretKey Spec Ċ Ċ internal Ġobject ĠChunk Crypto Ġ{ ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠINFO _ CHUNK _ ID Ġ= Ġ" Chunk ĠID Ġcalculation " ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWe Ġare Ġderiving Ġa Ġdedicated Ġkey Ġfor Ġchunk ĠID Ġder ivation , ĊĠĠĠĠ Ġ* Ġbecause Ġusing Ġa Ġ[ ByteArray ] Ġinstead Ġof Ġa Ġkey Ġinside Ġthe Ġ[ KeyStore ] ĊĠĠĠĠ Ġ* Ġis Ġorders Ġof Ġmagnitude Ġfaster . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( General Security Exception :: class ) ĊĠĠĠ Ġfun Ġderive Chunk Id Key ( ĊĠĠĠĠĠĠĠ Ġmaster Key : ĠSecret Key , ĊĠĠĠĠĠĠĠ Ġinfo : ĠByteArray Ġ= ĠINFO _ CHUNK _ ID . toByteArray () ĊĠĠĠ Ġ): ĠByteArray Ġ= ĠH k df . expand ( ĊĠĠĠĠĠĠĠ Ġsecret Key Ġ= Ġmaster Key , ĊĠĠĠĠĠĠĠ Ġinfo Ġ= Ġinfo , ĊĠĠĠĠĠĠĠ Ġout Length Bytes Ġ= ĠKEY _ SIZE _ BYTES ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGets Ġa Ġre - usable Ġ[ Mac ] Ġinstance Ġto Ġbe Ġused Ġwith Ġ[ Chunk er . make Chunks ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( General Security Exception :: class ) ĊĠĠĠ Ġfun Ġget Mac ( chunk Key : ĠByteArray ): ĠMac Ġ= ĠMac . getInstance ( ALGORITHM _ HMAC ). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( chunk Key . size Ġ== ĠKEY _ SIZE _ BYTES ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Chunk Ġkey Ġhas Ġ${ chunk Key . size } Ġbytes , Ġbut Ġ$ KEY _ SIZE _ BYTES Ġexpected ." ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġinit ( SecretKey Spec ( chunk Key , ĠAL G ORITHM _ HMAC )) ĊĠĠĠ Ġ} Ċ Ċ } Ċ