package Ġde . r ki . cor on aw arn app . util Ċ Ċ import ĠKey Export Format Ċ import ĠKey Export Format . TE K Signature List Ċ import ĠKey Export Format . TE K Signature List . newBuilder Ċ import ĠKey Export Format . Temporary Exposure Key Export Ċ import Ġde . r ki . cor on aw arn app . server . protocols . Apple Legacy Key Exchange Ċ import Ġde . r ki . cor on aw arn app . util . Proto Format Converter Extensions . convertTo Google Key Ċ import Ġde . r ki . cor on aw arn app . util . Time And Date Extensions . log UTC Format Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . async Ċ import Ġkotlinx . coroutines . await All Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . io . Buffered Writer Ċ import Ġjava . io . File Ċ import Ġjava . io . File OutputStream Ċ import Ġjava . io . OutputStream Writer Ċ import Ġjava . nio . charset . Charset Ċ import Ġjava . util . Date Ċ import Ġjava . util . UUID Ċ Ċ object ĠKey File Helper Ġ{ ĊĠĠĠ Ġ// ĠDO ĠNOT ĠREMOVE ĠWH IT ESP ACES , ĠPAD DED Ġ 1 6 ĠBYTE ĠSTRING ĠHEADER ĊĠĠĠ Ġprivate Ġconst Ġval ĠEX PORT _ FILE _ HEADER Ġ= Ġ" EK ĠExport Ġv 1 ĠĠĠ Ġ" ĊĠĠĠ Ġprivate Ġconst Ġval ĠEX PORT _ FILE _ HEADER _ CHARSET Ġ= Ġ" UTF 8 " ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠEX PORT _ SIGNATURE _ FILE _ NAME Ġ= Ġ" export . sig " ĊĠĠĠ Ġprivate Ġconst Ġval ĠEX PORT _ BINARY _ FILE _ NAME Ġ= Ġ" export . bin " ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠBY TES _ IN _ KI LO BYTES Ġ= Ġ 1 0 2 4 ĊĊĠĠĠ Ġprivate Ġval ĠTAG : ĠString ? Ġ= ĠKey File Helper :: class . simple Name ĊĊĠĠĠ Ġsuspend Ġfun Ġasync Create Export Files ( ĊĠĠĠĠĠĠĠ Ġfile List : ĠList < Apple Legacy Key Exchange . File >, ĊĠĠĠĠĠĠĠ Ġstorage Directory : ĠFile ? ĊĠĠĠ Ġ): ĠList < File > Ġ= Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfile List . map Ġ{ Ġfile Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġasync ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcreated Export String Ġ= Ġ" created Ġexport Ġfor Ġbatch Ġ${ file . header . batch Num }" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"( of Ġ${ file . header . batch Size }) Ġwith Ġ${ file . keys Count } Ġkeys , ĠBE G :${ Date ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . header . start Timestamp ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). log UTC Format ()}, ĠEND :${ Date ( file . header . end Timestamp ). log UTC Format () }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d ( created Export String ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTemporary Exposure Key Export ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addAll Keys ( file . keys List . map Ġ{ Ġapple Key Ġ-> Ġapple Key . convertTo Google Key () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Signature Infos ( Signature Helper . client Sig ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Batch Num ( file . header . batch Num ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Batch Size ( file . header . batch Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Region ( file . header . region ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Start Timestamp ( file . header . start Timestamp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set End Timestamp ( file . header . end Timestamp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKey Export Format . TE K Signature . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Batch Num ( file . header . batch Num ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Batch Size ( file . header . batch Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Signature Info ( Signature Helper . client Sig ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. await All () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Indexed Ġ{ Ġ_, Ġsource Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasync ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Binary File ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstorage Directory , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ source . first . batch Num }- " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ source . first . start Timestamp }- " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ source . first . end Timestamp }. zip ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. await All () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġcreate Binary File ( ĊĠĠĠĠĠĠĠ Ġstorage Directory : ĠFile ?, ĊĠĠĠĠĠĠĠ Ġzip FileName : ĠString , ĊĠĠĠĠĠĠĠ Ġsource With TE K Signature : ĠPair < Temporary Exposure Key Export , ĠKey Export Format . TE K Signature > ĊĠĠĠ Ġ): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexport File Ġ= Ġasync Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Binary File ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstorage Directory , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource With TE K Signature . first ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexport Signature File Ġ= Ġasync Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Signature File ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstorage Directory , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnewBuilder (). addAll Signatures ( listOf ( source With TE K Signature . second )). build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context ĠZip Helper . create Zip File ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstorage Directory , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzip FileName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( EXPORT _ BINARY _ FILE _ NAME , Ġexport File . await ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( EXPORT _ SIGNATURE _ FILE _ NAME , Ġexport Signature File . await ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" output Ġfile Ġname :${ it . absolute Path }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" output Ġfile Ġsize :${ it . length () Ġ/ ĠBY TES _ IN _ KI LO BYTES } ĠKB ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexport File . await (). delete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexport Signature File . await (). delete () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Signature File ( ĊĠĠĠĠĠĠĠ Ġstorage Directory : ĠFile ?, ĊĠĠĠĠĠĠĠ Ġsignatures : ĠT EK Signature List ĊĠĠĠ Ġ): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexport Signature File Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( storage Directory , Ġ" key - export - signature -${ UUID . randomUUID ()}. sig ") ĊĠĠĠĠĠĠĠ Ġif Ġ( export Signature File . exists ()) Ġexport Signature File . delete () ĊĠĠĠĠĠĠĠ Ġexport Signature File . createNew File () ĊĠĠĠĠĠĠĠ Ġsignatures . write ToFile ( export Signature File ) ĊĠĠĠĠĠĠĠ Ġreturn Ġexport Signature File ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠT EK Signature List . write ToFile ( ĊĠĠĠĠĠĠĠ Ġfile : ĠFile ĊĠĠĠ Ġ) Ġ= ĠFileOutputStream ( file ). use Ġ{ Ġstream Ġ-> ĊĠĠĠĠĠĠĠ Ġthis . writeTo ( stream ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Binary File ( ĊĠĠĠĠĠĠĠ Ġstorage Directory : ĠFile ?, ĊĠĠĠĠĠĠĠ Ġsource : ĠTemporary Exposure Key Export ĊĠĠĠ Ġ): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexport Binary File Ġ= ĠFile ( storage Directory , Ġget Export Binary FileName ()) ĊĠĠĠĠĠĠĠ Ġif Ġ( export Binary File . exists ()) Ġexport Binary File . delete () ĊĠĠĠĠĠĠĠ Ġexport Binary File . createNew File () ĊĠĠĠĠĠĠĠ Ġexport Binary File . append Binary Header () ĊĠĠĠĠĠĠĠ Ġexport Binary File . append Bytes ( source . toByteArray ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġexport Binary File ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Export Binary FileName (): ĠString Ġ= Ġ" key - export - binary -${ UUID . randomUUID ()}. bin " ĊĊĠĠĠ Ġprivate Ġfun ĠFile . append Binary Header () Ġ= ĠFileOutputStream ( this ). use Ġ{ Ġf os Ġ-> ĊĠĠĠĠĠĠĠ ĠOutputStream Writer ( fos , ĠCharset . forName ( EXPORT _ FILE _ HEADER _ CHARSET )). use Ġ{ Ġo sw Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBuffered Writer ( os w ). use Ġ{ Ġbw Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbw . write ( EXPORT _ FILE _ HEADER ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ