/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 ĠNew ĠVector ĠLtd Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġorg . matrix . android sdk . crypto . keys backup Ċ Ċ import Ġandroidx . annotation . Ui Thread Ċ import Ġandroidx . annotation . Visible ForTesting Ċ import Ġandroidx . annotation . Worker Thread Ċ import Ġorg . matrix . android sdk . Home Server Connection Config Ċ import Ġorg . matrix . android sdk . core . Json Utility Ċ import Ġorg . matrix . android sdk . core . Log Ċ import Ġorg . matrix . android sdk . core . callback . Api Callback Ċ import Ġorg . matrix . android sdk . core . callback . Simple Api Callback Ċ import Ġorg . matrix . android sdk . core . callback . Success Callback Ċ import Ġorg . matrix . android sdk . core . callback . Success Error Callback Ċ import Ġorg . matrix . android sdk . core . listeners . Progress Listener Ċ import Ġorg . matrix . android sdk . core . listeners . Step Progress Listener Ċ import Ġorg . matrix . android sdk . core . model . Matrix Error Ċ import Ġorg . matrix . android sdk . crypto . MX CRYPTO _ ALGORITHM _ ME G OL M Ċ import Ġorg . matrix . android sdk . crypto . MX CRYPTO _ ALGORITHM _ ME G OL M _ BACKUP Ċ import Ġorg . matrix . android sdk . crypto . Me gol m Session Data Ċ import Ġorg . matrix . android sdk . crypto . crypt ost ore . db . model . Keys Backup Data Entity Ċ import Ġorg . matrix . android sdk . crypto . data . Import Room Keys Result Ċ import Ġorg . matrix . android sdk . crypto . data . MX DeviceInfo Ċ import Ġorg . matrix . android sdk . crypto . data . MX O lm Inbound Group Session 2 Ċ import Ġorg . matrix . android sdk . crypto . internal . MX Crypto Impl Ċ import Ġorg . matrix . android sdk . crypto . model . keys .* Ċ import Ġorg . matrix . android sdk . crypto . model . rest . keys . Backup Keys Result Ċ import Ġorg . matrix . android sdk . crypto . model . rest . keys . Update Keys Backup Version Body Ċ import Ġorg . matrix . android sdk . crypto . rest . Room Keys RestClient Ċ import Ġorg . matrix . android sdk . crypto . util . compute Recovery Key Ċ import Ġorg . matrix . android sdk . crypto . util . extract Curve Key From Recovery Key Ċ import Ġorg . matrix . ol m . O lm Exception Ċ import Ġorg . matrix . ol m . O lm Pk De cryption Ċ import Ġorg . matrix . ol m . O lm Pk Encryption Ċ import Ġorg . matrix . ol m . O lm Pk Message Ċ import Ġretrofit 2 . Converter Ċ import Ġjava . security . Invalid Parameter Exception Ċ import Ġjava . util .* Ċ import Ġkotlin . collections . HashMap Ċ Ċ /** Ċ Ġ* ĠA ĠKeys Backup Ġclass Ġinstance Ġmanage Ġincremental Ġbackup Ġof Ġe 2 e Ġkeys Ġ( meg ol m Ġkeys ) Ċ Ġ* Ġto Ġthe Ġuser 's Ġhome server . Ċ Ġ*/ Ċ class ĠKeys Backup ( private Ġval Ġm Crypto : ĠMX Crypto Impl , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhome Server Connection Config : ĠHome Server Connection Config ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġm Room Keys RestClient Ġ= ĠRoom Keys RestClient ( home Server Connection Config ) ĊĊĠĠĠ Ġprivate Ġval Ġm Keys Backup StateManager Ġ= ĠKeys Backup StateManager ( m Crypto ) ĊĊĠĠĠ Ġ// ĠThe Ġbackup Ġversion ĊĠĠĠ Ġvar Ġm Keys Backup Version : ĠKeys Version Result ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġ// ĠThe Ġbackup Ġkey Ġbeing Ġused . ĊĠĠĠ Ġprivate Ġvar Ġm Backup Key : ĠO lm Pk Encryption ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġm Random Ġ= ĠRandom () ĊĊĠĠĠ Ġprivate Ġvar Ġbackup All Group Sessions Callback : ĠApi Callback < Void ?> ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġm Keys Backup State Listener : ĠKeys Backup StateManager . Keys Backup State Listener ? Ġ= Ġnull ĊĊĠĠĠ Ġval Ġis Enabled : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġm Keys Backup StateManager . isEnabled ĊĊĠĠĠ Ġval Ġis St uck ed : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġm Keys Backup StateManager . is St uck ed ĊĊĠĠĠ Ġval Ġstate : ĠKeys Backup StateManager . Keys Backup State ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġm Keys Backup StateManager . state ĊĊĠĠĠ Ġval Ġcurrent Backup Version : ĠString ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġm Keys Backup Version ?. version ĊĊĠĠĠ Ġfun Ġadd Listener ( listener : ĠKeys Backup StateManager . Keys Backup State Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Keys Backup StateManager . addListener ( listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Listener ( listener : ĠKeys Backup StateManager . Keys Backup State Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Keys Backup StateManager . remove Listener ( listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġup Ġthe Ġdata Ġrequired Ġto Ġcreate Ġa Ġnew Ġbackup Ġversion . ĊĠĠĠĠ Ġ* ĠThe Ġbackup Ġversion Ġwill Ġnot Ġbe Ġcreated Ġand Ġenabled Ġuntil Ġ[ create Keys Backup Version ] ĊĠĠĠĠ Ġ* Ġis Ġcalled . ĊĠĠĠĠ Ġ* ĠThe Ġreturned Ġ[ Me gol m Backup Creation Info ] Ġobject Ġhas Ġa Ġ` recovery Key ` Ġmember Ġwith ĊĠĠĠĠ Ġ* Ġthe Ġuser - facing Ġrecovery Ġkey Ġstring . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġpassword Ġan Ġoptional Ġpassphrase Ġstring Ġthat Ġcan Ġbe Ġentered Ġby Ġthe Ġuser ĊĠĠĠĠ Ġ* Ġwhen Ġrest oring Ġthe Ġbackup Ġas Ġan Ġalternative Ġto Ġentering Ġthe Ġrecovery Ġkey . ĊĠĠĠĠ Ġ* Ġ@ param Ġprogress Listener Ġa Ġprogress Ġlistener , Ġas Ġgenerating Ġprivate Ġkey Ġfrom Ġpassword Ġmay Ġtake Ġa Ġwhile ĊĠĠĠĠ Ġ* Ġ@ param Ġcallback ĠAs ynchronous Ġcallback ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġprepare Keys Backup Version ( password : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Listener : ĠProgress Listener ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback : ĠSuccess Error Callback < Me gol m Backup Creation Info >) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Crypto . get Decrypt ing Thread Handler (). post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġol m Pk De cryption Ġ= ĠO lm Pk De cryption () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmeg ol m Backup Auth Data Ġ= ĠMe gol m Backup Auth Data () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( password Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGenerate Ġa Ġprivate Ġkey Ġfrom Ġthe Ġpassword ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbackground Progress Listener Ġ= Ġif Ġ( progress Listener Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠProgress Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Progress ( progress : ĠInt , Ġtotal : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Crypto . get UI Handler (). post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Listener . on Progress ( progress , Ġtotal ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( LOG _ TAG , Ġ" prepare Keys Backup Version : Ġon Progress Ġfailure ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgenerate PrivateKey Result Ġ= Ġgenerate PrivateKey With Password ( password , Ġbackground Progress Listener ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeg ol m Backup Auth Data . publicKey Ġ= Ġol m Pk De cryption . set PrivateKey ( generate PrivateKey Result . privateKey ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeg ol m Backup Auth Data . privateKey Salt Ġ= Ġgenerate PrivateKey Result . salt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeg ol m Backup Auth Data . privateKey Iterations Ġ= Ġgenerate PrivateKey Result . iterations ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠpublicKey Ġ= Ġol m Pk De cryption . generate Key () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeg ol m Backup Auth Data . publicKey Ġ= ĠpublicKey ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeg ol m Backup Auth Data . signatures Ġ= Ġm Crypto . sign Object ( Json Utility . getCanonical ized Json String ( meg ol m Backup Auth Data . signal able JSON Dictionary ())) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmeg ol m Backup Creation Info Ġ= ĠMe gol m Backup Creation Info () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeg ol m Backup Creation Info . algorithm Ġ= ĠMX CRYPTO _ ALGORITHM _ ME G OL M _ BACKUP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeg ol m Backup Creation Info . auth Data Ġ= Ġmeg ol m Backup Auth Data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeg ol m Backup Creation Info . recovery Key Ġ= Ġcompute Recovery Key ( ol m Pk De cryption . privateKey ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Crypto . get UI Handler (). post Ġ{ Ġcallback . on Success ( meg ol m Backup Creation Info ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠO lm Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( LOG _ TAG , Ġ" O lm Exception : Ġ", Ġe ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Crypto . get UI Handler (). post Ġ{ Ġcallback . on Unexpected Error ( e ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreate Ġa Ġnew Ġkeys Ġbackup Ġversion Ġand Ġenable Ġit , Ġusing Ġthe Ġinformation Ġreturn Ġfrom Ġ[ prepare Keys Backup Version ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġkeys Backup Creation Info Ġthe Ġinfo Ġobject Ġfrom Ġ[ prepare Keys Backup Version ]. ĊĠĠĠĠ Ġ* Ġ@ param Ġcallback ĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAs ynchronous Ġcallback ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcreate Keys Backup Version ( keys Backup Creation Info : ĠMe gol m Backup Creation Info , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback : ĠApi Callback < Keys Version >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcreate Keys Backup Version Body Ġ= ĠCreate Keys Backup Version Body () ĊĠĠĠĠĠĠĠ Ġcreate Keys Backup Version Body . algorithm Ġ= Ġkeys Backup Creation Info . algorithm ĊĠĠĠĠĠĠĠ Ġcreate Keys Backup Version Body . auth Data Ġ= ĠJson Utility . get Basic Gson (). toJson Tree ( keys Backup Creation Info . auth Data ) ĊĊĠĠĠĠĠĠĠ Ġm Keys Backup StateManager . state Ġ= ĠKeys Backup StateManager . Keys Backup State . En abling ĊĊĠĠĠĠĠĠĠ Ġm Room Keys RestClient . create Keys Backup Version ( create Keys Backup Version Body , Ġobject Ġ: ĠApi Callback < Keys Version > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( info : ĠKeys Version ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠReset Ġbackup Ġmarkers . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Crypto . crypto Store . reset Backup Markers () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Backup Version Ġ= ĠKeys Version Result () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Backup Version . algorithm Ġ= Ġcreate Keys Backup Version Body . algorithm ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Backup Version . auth Data Ġ= Ġcreate Keys Backup Version Body . auth Data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Backup Version . version Ġ= Ġinfo . version ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġcan Ġconsider Ġthat Ġthe Ġserver Ġdoes Ġnot Ġhave Ġkeys Ġyet ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Backup Version . count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Backup Version . hash Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenable Keys Backup ( key Backup Version ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Success ( info ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Unexpected Error ( e : ĠException ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Keys Backup StateManager . state Ġ= ĠKeys Backup StateManager . Keys Backup State . Disabled ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Unexpected Error ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Network Error ( e : ĠException ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Keys Backup StateManager . state Ġ= ĠKeys Backup StateManager . Keys Backup State . Disabled ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Network Error ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Matrix Error ( e : ĠMatrix Error ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Keys Backup StateManager . state Ġ= ĠKeys Backup StateManager . Keys Backup State . Disabled ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Matrix Error ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDelete Ġa Ġkeys Ġbackup Ġversion . ĠIt Ġwill Ġdelete Ġall Ġbacked Ġup Ġkeys Ġon Ġthe Ġserver , Ġand Ġthe Ġbackup Ġitself . ĊĠĠĠĠ Ġ* ĠIf Ġwe Ġare Ġbacking Ġup Ġto Ġthis Ġversion . ĠBackup Ġwill Ġbe Ġstopped . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġversion Ġ Ġthe Ġbackup Ġversion Ġto Ġdelete . ĊĠĠĠĠ Ġ* Ġ@ param Ġcallback ĠAs ynchronous Ġcallback ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdelete Backup ( version : ĠString , Ġcallback : ĠApi Callback < Void > ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Crypto . get Decrypt ing Thread Handler (). post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġwe 're Ġcurrently Ġbacking Ġup Ġto Ġthis Ġbackup ... Ġstop . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ( We Ġstart Ġusing Ġit Ġautomatically Ġin Ġcreate Keys Backup Version Ġso Ġthis Ġis Ġsym metr ical ). ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Keys Backup Version Ġ!= Ġnull Ġ&& Ġversion Ġ== Ġm Keys Backup Version !!. version ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreset Keys Backup Data () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Keys Backup Version Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Keys Backup StateManager . state Ġ= ĠKeys Backup StateManager . Keys Backup State . Unknown ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Room Keys RestClient . delete Backup ( version , Ġobject Ġ: ĠApi Callback < Void > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun Ġeventually Restart Backup () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDo Ġnot Ġstay Ġin ĠKeys Backup State . Unknown Ġbut Ġcheck Ġwhat Ġis Ġavailable Ġon Ġthe Ġhome server ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state Ġ== ĠKeys Backup StateManager . Keys Backup State . Unknown ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck And Start Keys Backup () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( info : ĠVoid ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeventually Restart Backup () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Crypto . get UI Handler (). post Ġ{ Ġcallback ?. on Success ( null ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Unexpected Error ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeventually Restart Backup () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Crypto . get UI Handler (). post Ġ{ Ġcallback ?. on Unexpected Error ( e ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Network Error ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeventually Restart Backup () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Crypto . get UI Handler (). post Ġ{ Ġcallback ?. on Network Error ( e ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Matrix Error ( e : ĠMatrix Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeventually Restart Backup () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Crypto . get UI Handler (). post Ġ{ Ġcallback ?. on Matrix Error ( e ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAsk Ġif Ġthe Ġbackup Ġon Ġthe Ġserver Ġcontains Ġkeys Ġthat Ġwe Ġmay Ġdo Ġnot Ġhave Ġlocally . ĊĠĠĠĠ Ġ* ĠThis Ġshould Ġbe Ġcalled Ġwhen Ġentering Ġin Ġthe Ġstate ĠREAD Y _ TO _ BACKUP ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcan Restore Keys (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠServer Ġcontains Ġmore Ġkeys Ġthan Ġlocally ĊĠĠĠĠĠĠĠ Ġval Ġtotal NumberOf Keys Loc ally Ġ= ĠgetTotal Numbers Of Keys () ĊĊĠĠĠĠĠĠĠ Ġval Ġkeys Backup Data Ġ= Ġm Crypto . crypto Store . keys Backup Data ĊĊĠĠĠĠĠĠĠ Ġval Ġtotal NumberOf Keys Server Ġ= Ġkeys Backup Data ?. backup Last Server NumberOf Keys Ġ?: Ġ- 1 ĊĠĠĠĠĠĠĠ Ġval Ġhash Server Ġ= Ġkeys Backup Data ?. backup Last Server Hash ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal NumberOf Keys Loc ally Ġ< Ġtotal NumberOf Keys Server Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠServer Ġcontains Ġmore Ġkeys Ġthan Ġthis Ġdevice ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal NumberOf Keys Loc ally Ġ== Ġtotal NumberOf Keys Server Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSame Ġnumber , Ġcompare Ġhash ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO ĠWe Ġhave Ġnot Ġfound Ġany Ġalgorithm Ġto Ġdetermine Ġif Ġa Ġrestore Ġis Ġrecommended Ġhere . ĠReturn Ġfalse Ġfor Ġthe Ġmoment ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFac ility Ġmethod Ġto Ġget Ġthe Ġtotal Ġnumber Ġof Ġlocally Ġstored Ġkeys ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠgetTotal Numbers Of Keys (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġm Crypto . crypto Store . inbound Group Sessions Count ( false ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFac ility Ġmethod Ġto Ġget Ġthe Ġnumber Ġof Ġbacked Ġup Ġkeys ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠgetTotal Numbers Of Back ed Up Keys (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġm Crypto . crypto Store . inbound Group Sessions Count ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStart Ġto Ġback Ġup Ġkeys Ġimmediately . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġprogress Listener Ġthe Ġcallback Ġto Ġfollow Ġthe Ġprogress ĊĠĠĠĠ Ġ* Ġ@ param Ġcallback Ġthe Ġmain Ġcallback ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġbackup All Group Sessions ( progress Listener : ĠProgress Listener ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback : ĠApi Callback < Void ?> ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġa Ġstatus Ġright Ġnow ĊĠĠĠĠĠĠĠ Ġget Backup Progress ( object Ġ: ĠProgress Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Progress ( progress : ĠInt , Ġtotal : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠReset Ġprevious Ġlisteners Ġif Ġany ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreset Backup All Group Sessions Listeners () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" backup All Group Sessions : Ġbackup Progress : Ġ$ progress /$ total ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Listener ?. on Progress ( progress , Ġtotal ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( LOG _ TAG , Ġ" backup All Group Sessions : Ġon Progress Ġfailure ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( progress Ġ== Ġtotal ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" backup All Group Sessions : Ġcomplete ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ?. on Success ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbackup All Group Sessions Callback Ġ= Ġcallback ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠListen Ġto Ġ` state ` Ġchange Ġto Ġdetermine Ġwhen Ġto Ġcall Ġon Backup Progress Ġand ĠonComplete ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Keys Backup State Listener Ġ= Ġobject Ġ: ĠKeys Backup StateManager . Keys Backup State Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon StateChange ( newState : ĠKeys Backup StateManager . Keys Backup State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Backup Progress ( object Ġ: ĠProgress Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Progress ( progress : ĠInt , Ġtotal : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Listener ?. on Progress ( progress , Ġtotal ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( LOG _ TAG , Ġ" backup All Group Sessions : Ġon Progress Ġfailure Ġ 2 ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġbackup Ġis Ġfinished , Ġnotify Ġthe Ġmain Ġlistener ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state Ġ=== ĠKeys Backup StateManager . Keys Backup State . Ready To Back Up ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbackup All Group Sessions Callback ?. on Success ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreset Backup All Group Sessions Listeners () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Keys Backup StateManager . addListener ( m Keys Backup State Listener !! ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbackup Keys () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCheck Ġtrust Ġon Ġa Ġkey Ġbackup Ġversion . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġkeys Backup Version Ġthe Ġbackup Ġversion Ġto Ġcheck . ĊĠĠĠĠ Ġ* Ġ@ param Ġcallback Ġblock Ġcalled Ġwhen Ġthe Ġoperations Ġcompletes . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Keys Backup Trust ( keys Backup Version : ĠKeys Version Result , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback : ĠSuccess Callback < Keys Backup Version Trust >) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Crypto . get Decrypt ing Thread Handler (). post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkeys Backup Version Trust Ġ= Ġget Keys Backup Trust Bg ( keys Backup Version ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Crypto . get UI Handler (). post Ġ{ Ġcallback . on Success ( keys Backup Version Trust ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCheck Ġtrust Ġon Ġa Ġkey Ġbackup Ġversion . ĊĠĠĠĠ Ġ* ĠThis Ġhas Ġto Ġbe Ġcalled Ġon Ġbackground Ġthread . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġkeys Backup Version Ġthe Ġbackup Ġversion Ġto Ġcheck . ĊĠĠĠĠ Ġ* Ġ@ return Ġa ĠKeys Backup Version Trust Ġobject ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Worker Thread ĊĠĠĠ Ġprivate Ġfun Ġget Keys Backup Trust Bg ( keys Backup Version : ĠKeys Version Result ): ĠKeys Backup Version Trust Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmy UserId Ġ= Ġm Crypto . my Device . userId ĊĊĠĠĠĠĠĠĠ Ġval Ġkeys Backup Version Trust Ġ= ĠKeys Backup Version Trust () ĊĠĠĠĠĠĠĠ Ġval Ġauth Data Ġ= Ġkeys Backup Version . get Auth Data As Me gol m Backup Auth Data () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( keys Backup Version . algorithm Ġ== Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġauth Data Ġ== Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġauth Data . publicKey . isEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġauth Data . signatures . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" get Keys Backup Trust : ĠKey Ġbackup Ġis Ġabsent Ġor Ġmissing Ġrequired Ġdata ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġkeys Backup Version Trust ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmy Sig s : ĠMap < String , Ġ*> Ġ= Ġauth Data . signatures ! ![ my UserId ] Ġas ĠMap < String , Ġ*> ĊĠĠĠĠĠĠĠ Ġif Ġ( my Sig s . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" get Keys Backup Trust : ĠIgn oring Ġkey Ġbackup Ġbecause Ġit Ġlack s Ġany Ġsignatures Ġfrom Ġthis Ġuser ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġkeys Backup Version Trust ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( key Id Ġin Ġmy Sig s . keys ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠXXX : Ġis Ġthis Ġhow Ġwe 're Ġsupposed Ġto Ġget Ġthe Ġdevice Ġid ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar ĠdeviceId : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomponents Ġ= Ġkey Id . split (": ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( components . size Ġ== Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdeviceId Ġ= Ġcomponents [ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdevice : ĠMX DeviceInfo ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( deviceId Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Ġ= Ġm Crypto . crypto Store . getUser Device ( deviceId , Ġmy UserId ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġis Signature Valid Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( device Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" get Keys Backup Trust : ĠSignature Ġfrom Ġunknown Ġdevice Ġ$ deviceId ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Crypto . get O lm Device ()?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . verify Signature ( device . fingerprint (), Ġauth Data . signal able JSON Dictionary (), Ġmy Sig s [ key Id ] Ġas ĠString ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Signature Valid Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠO lm Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" get Keys Backup Trust : ĠBad Ġsignature Ġfrom Ġdevice Ġ" Ġ+ Ġdevice . deviceId Ġ+ Ġ" Ġ" Ġ+ Ġe . localized Message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Signature Valid Ġ&& Ġdevice . is Verified ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeys Backup Version Trust . usable Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsignature Ġ= ĠKeys Backup Version Trust Signature () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsignature . device Ġ= Ġdevice ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsignature . valid Ġ= Ġis Signature Valid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsignature . deviceId Ġ= ĠdeviceId ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeys Backup Version Trust . signatures . add ( signature ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġkeys Backup Version Trust ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġtrust Ġon Ġa Ġkeys Ġbackup Ġversion . ĊĠĠĠĠ Ġ* ĠIt Ġadds Ġ( or Ġremoves ) Ġthe Ġsignature Ġof Ġthe Ġcurrent Ġdevice Ġto Ġthe Ġauthentication Ġpart Ġof Ġthe Ġkeys Ġbackup Ġversion . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġkeys Backup Version Ġthe Ġbackup Ġversion Ġto Ġcheck . ĊĠĠĠĠ Ġ* Ġ@ param Ġtrust Ġthe Ġtrust Ġto Ġset Ġto Ġthe Ġkeys Ġbackup . ĊĠĠĠĠ Ġ* Ġ@ param Ġcallback Ġblock Ġcalled Ġwhen Ġthe Ġoperations Ġcompletes . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġtrust Keys Backup Version ( keys Backup Version : ĠKeys Version Result , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrust : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback : ĠApi Callback < Void >) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" trust Key Backup Version : Ġ$ trust , Ġversion Ġ${ keys Backup Version . version }") ĊĊĠĠĠĠĠĠĠ Ġm Crypto . get Decrypt ing Thread Handler (). post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmy UserId Ġ= Ġm Crypto . my Device . userId ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġauth Ġdata Ġto Ġupdate Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġauth Data Ġ= Ġget Me gol m Backup Auth Data ( keys Backup Version ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( auth Data Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( LOG _ TAG , Ġ" trust Key Backup Version : trust : ĠKey Ġbackup Ġis Ġmissing Ġrequired Ġdata ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Crypto . get UI Handler (). post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Unexpected Error ( IllegalArgumentException (" Missing Ġelement ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ post ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġcurrent Ġsignatures , Ġor Ġcreate Ġan Ġempty Ġset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmy User Signatures Ġ= Ġ( auth Data . signatures ! ![ my UserId ]?. to Mutable Map () Ġ?: ĠHashMap ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( trust ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd Ġcurrent Ġdevice Ġsignature ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdevice Signatures Ġ= Ġm Crypto . sign Object ( Json Utility . getCanonical ized Json String ( auth Data . signal able JSON Dictionary ())) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Signatures [ my UserId ]?. forEach Ġ{ Ġentry Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmy User Signatures [ entry . key ] Ġ= Ġentry . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRemove Ġcurrent Ġdevice Ġsignature ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmy User Signatures . remove (" ed 2 5 5 1 9 :${ m Crypto . my Device . deviceId }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġan Ġupdated Ġversion Ġof ĠKeys Version Result ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdate Keys Backup Version Body Ġ= ĠUpdate Keys Backup Version Body ( keys Backup Version . version !! ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Keys Backup Version Body . algorithm Ġ= Ġkeys Backup Version . algorithm ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Me gol m Backup Auth Data Ġ= Ġauth Data . copy () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Signatures Ġ= Ġnew Me gol m Backup Auth Data . signatures !!. to Mutable Map () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Signatures [ my UserId ] Ġ= Ġmy User Signatures ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Me gol m Backup Auth Data . signatures Ġ= Ġnew Signatures ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Keys Backup Version Body . auth Data Ġ= ĠJson Utility . get Basic Gson (). toJson Tree ( new Me gol m Backup Auth Data ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAnd Ġsend Ġit Ġto Ġthe Ġhome server ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Room Keys RestClient . update Keys Backup Version ( keys Backup Version . version !! , Ġupdate Keys Backup Version Body , Ġobject Ġ: ĠApi Callback < Void > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( info : ĠVoid ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRel a unch Ġthe Ġstate Ġmachine Ġon Ġthis Ġupdated Ġbackup Ġversion ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Keys Backup Version Ġ= ĠKeys Version Result () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Keys Backup Version . version Ġ= Ġkeys Backup Version . version ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Keys Backup Version . algorithm Ġ= Ġkeys Backup Version . algorithm ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Keys Backup Version . count Ġ= Ġkeys Backup Version . count ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Keys Backup Version . hash Ġ= Ġkeys Backup Version . hash ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Keys Backup Version . auth Data Ġ= Ġupdate Keys Backup Version Body . auth Data ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck And Start With Keys Backup Version ( new Keys Backup Version ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Crypto . get UI Handler (). post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Success ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Unexpected Error ( e : ĠException ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Crypto . get UI Handler (). post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Unexpected Error ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Network Error ( e : ĠException ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Crypto . get UI Handler (). post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Network Error ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Matrix Error ( e : ĠMatrix Error ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Crypto . get UI Handler (). post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Matrix Error ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġtrust Ġon Ġa Ġkeys Ġbackup Ġversion . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġkeys Backup Version Ġthe Ġbackup Ġversion Ġto Ġcheck . ĊĠĠĠĠ Ġ* Ġ@ param Ġrecovery Key Ġthe Ġrecovery Ġkey Ġto Ġchallenge Ġwith Ġthe Ġkey Ġbackup Ġpublic Ġkey . ĊĠĠĠĠ Ġ* Ġ@ param Ġcallback Ġblock Ġcalled Ġwhen Ġthe Ġoperations Ġcompletes . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġtrust Keys Backup Version With Recovery Key ( keys Backup Version : ĠKeys Version Result , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecovery Key : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback : ĠApi Callback < Void >) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" trust Keys Backup Version With Recovery Key : Ġversion Ġ${ keys Backup Version . version }") ĊĊĠĠĠĠĠĠĠ Ġm Crypto . get Decrypt ing Thread Handler (). post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! isValid Recovery Key For Keys Backup Version ( recovery Key , Ġkeys Backup Version )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( LOG _ TAG , Ġ" trust Key Backup Version With Recovery Key : ĠInvalid Ġrecovery Ġkey .") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Crypto . get UI Handler (). post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Unexpected Error ( IllegalArgumentException (" Invalid Ġrecovery Ġkey Ġor Ġpassword ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ post ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrust Keys Backup Version ( keys Backup Version , Ġtrue , Ġcallback ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġtrust Ġon Ġa Ġkeys Ġbackup Ġversion . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġkeys Backup Version Ġthe Ġbackup Ġversion Ġto Ġcheck . ĊĠĠĠĠ Ġ* Ġ@ param Ġpassword Ġthe Ġpass Ġphrase Ġto Ġchallenge Ġwith Ġthe Ġkey Backup Version Ġpublic Ġkey . ĊĠĠĠĠ Ġ* Ġ@ param Ġcallback Ġblock Ġcalled Ġwhen Ġthe Ġoperations Ġcompletes . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġtrust Keys Backup Version With Pass phrase ( keys Backup Version : ĠKeys Version Result , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpassword : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback : ĠApi Callback < Void >) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" trust Keys Backup Version With Pass phrase : Ġversion Ġ${ keys Backup Version . version }") ĊĊĠĠĠĠĠĠĠ Ġm Crypto . get Decrypt ing Thread Handler (). post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrecovery Key Ġ= Ġrecovery Key From Password ( password , Ġkeys Backup Version , Ġnull ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( recovery Key Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( LOG _ TAG , Ġ" trust Keys Backup Version With Pass phrase : ĠKey Ġbackup Ġis Ġmissing Ġrequired Ġdata ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Crypto . get UI Handler (). post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Unexpected Error ( IllegalArgumentException (" Missing Ġelement ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ post ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġtrust Ġusing Ġthe Ġrecovery Ġkey ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrust Keys Backup Version With Recovery Key ( keys Backup Version , Ġrecovery Key , Ġcallback ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġpublic Ġkey Ġfrom Ġa ĠRecovery Ġkey ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġrecovery Key Ġthe Ġrecovery Ġkey ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġcorresponding Ġpublic Ġkey , Ġfrom ĠO lm ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Worker Thread ĊĠĠĠ Ġprivate Ġfun Ġpk PublicKey From Recovery Key ( recovery Key : ĠString ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠExtract Ġthe Ġprimary Ġkey ĊĠĠĠĠĠĠĠ Ġval ĠprivateKey Ġ= Ġextract Curve Key From Recovery Key ( recovery Key ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( privateKey Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( LOG _ TAG , Ġ" pk PublicKey From Recovery Key : Ġprivate Ġkey Ġis Ġnull ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠBuilt Ġthe ĠPK Ġde cryption Ġwith Ġit ĊĠĠĠĠĠĠĠ Ġval Ġpk PublicKey : ĠString ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġde cryption Ġ= ĠO lm Pk De cryption () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpk PublicKey Ġ= Ġde cryption . set PrivateKey ( privateKey ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠO lm Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġpk PublicKey ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreset Backup All Group Sessions Listeners () Ġ{ ĊĠĠĠĠĠĠĠ Ġbackup All Group Sessions Callback Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġm Keys Backup State Listener ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Keys Backup StateManager . remove Listener ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġm Keys Backup State Listener Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġthe Ġcurrent Ġprogress Ġof Ġthe Ġbackup ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Backup Progress ( progress Listener : ĠProgress Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Crypto . get Decrypt ing Thread Handler (). post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbacked Up Keys Ġ= Ġm Crypto . crypto Store . inbound Group Sessions Count ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtotal Ġ= Ġm Crypto . crypto Store . inbound Group Sessions Count ( false ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Crypto . get UI Handler (). post Ġ{ Ġprogress Listener . on Progress ( back ed Up Keys , Ġtotal ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRestore Ġa Ġbackup Ġwith Ġa Ġrecovery Ġkey Ġfrom Ġa Ġgiven Ġbackup Ġversion Ġstored Ġon Ġthe Ġhome server . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġkeys Version Result ĠĠĠ Ġthe Ġbackup Ġversion Ġto Ġrestore Ġfrom . ĊĠĠĠĠ Ġ* Ġ@ param Ġrecovery Key ĠĠĠĠĠĠĠĠĠ Ġthe Ġrecovery Ġkey Ġto Ġdecrypt Ġthe Ġretrieved Ġbackup . ĊĠĠĠĠ Ġ* Ġ@ param Ġroom Id ĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthe Ġid Ġof Ġthe Ġroom Ġto Ġget Ġbackup Ġdata Ġfrom . ĊĠĠĠĠ Ġ* Ġ@ param ĠsessionId ĠĠĠĠĠĠĠĠĠĠĠ Ġthe Ġid Ġof Ġthe Ġsession Ġto Ġrestore . ĊĠĠĠĠ Ġ* Ġ@ param Ġstep Progress Listener Ġthe Ġstep Ġprogress Ġlistener ĊĠĠĠĠ Ġ* Ġ@ param Ġcallback ĠĠĠĠĠĠĠĠĠĠĠĠ ĠCallback . ĠIt Ġprovides Ġthe Ġnumber Ġof Ġfound Ġkeys Ġand Ġthe Ġnumber Ġof Ġsuccessfully Ġimported Ġkeys . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġrestore Keys With Recovery Key ( keys Version Result : ĠKeys Version Result , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecovery Key : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroom Id : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsessionId : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstep Progress Listener : ĠStep Progress Listener ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback : ĠApi Callback < Import Room Keys Result >) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" restore Keys With Recovery Key : ĠFrom Ġbackup Ġversion : Ġ${ keys Version Result . version }") ĊĊĠĠĠĠĠĠĠ Ġm Crypto . get Decrypt ing Thread Handler (). post ( Runnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġif Ġthe Ġrecovery Ġis Ġvalid Ġbefore Ġgoing Ġany Ġfurther ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! isValid Recovery Key For Keys Backup Version ( recovery Key , Ġkeys Version Result )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( LOG _ TAG , Ġ" restore Keys With Recovery Key : ĠInvalid Ġrecovery Ġkey Ġfor Ġthis Ġkeys Ġversion ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Crypto . get UI Handler (). post Ġ{ Ġcallback . on Unexpected Error ( Invalid Parameter Exception (" Invalid Ġrecovery Ġkey ")) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ Runnable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġa ĠPK Ġde cryption Ġinstance ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġde cryption Ġ= Ġpk De cryption From Recovery Key ( recovery Key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( de cryption Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġshould Ġnot Ġhappen Ġanymore ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( LOG _ TAG , Ġ" restore Keys With Recovery Key : ĠInvalid Ġrecovery Ġkey . ĠError ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Crypto . get UI Handler (). post Ġ{ Ġcallback . on Unexpected Error ( Invalid Parameter Exception (" Invalid Ġrecovery Ġkey ")) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ Runnable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( step Progress Listener Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Crypto . get UI Handler (). post Ġ{ Ġstep Progress Listener . on Step Progress ( Step Progress Listener . Step . Downloading Key ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġbacked Ġup Ġkeys Ġfrom Ġthe Ġhome server ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Keys ( sessionId , Ġroom Id , Ġkeys Version Result . version !! , Ġobject Ġ: ĠApi Callback < Keys Backup Data > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Unexpected Error ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Crypto . get UI Handler (). post Ġ{ Ġcallback . on Unexpected Error ( e ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Network Error ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Crypto . get UI Handler (). post Ġ{ Ġcallback . on Network Error ( e ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Matrix Error ( e : ĠMatrix Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Crypto . get UI Handler (). post Ġ{ Ġcallback . on Matrix Error ( e ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( keys Backup Data : ĠKeys Backup Data ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsessions Data Ġ= ĠArrayList < Me gol m Session Data >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRestore Ġthat Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsessions From Hs Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( roomId Loop Ġin Ġkeys Backup Data . roomId To Room Keys Backup Data . keys ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( sessionId Loop Ġin Ġkeys Backup Data . roomId To Room Keys Backup Data [ roomId Loop ] !!. sessionId To Key Backup Data . keys ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsessions From Hs Count ++ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Backup Data Ġ= Ġkeys Backup Data . roomId To Room Keys Backup Data [ roomId Loop ] !!. sessionId To Key Backup Data [ sessionId Loop ] !! ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsession Data Ġ= Ġdecrypt Key Backup Data ( key Backup Data , ĠsessionId Loop , Ġroom Id Loop , Ġde cryption ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession Data ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsessions Data . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" restore Keys With Recovery Key : ĠDecrypt ed Ġ" Ġ+ Ġsessions Data . size Ġ+ Ġ" Ġkeys Ġout Ġof Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġsessions From Hs Count Ġ+ Ġ" Ġfrom Ġthe Ġbackup Ġstore Ġon Ġthe Ġhome server ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDo Ġnot Ġtrigger Ġa Ġbackup Ġfor Ġthem Ġif Ġthey Ġcome Ġfrom Ġthe Ġbackup Ġversion Ġwe Ġare Ġusing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġback Up Ġ= Ġkeys Version Result . version Ġ!= Ġm Keys Backup Version ?. version ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( back Up ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" restore Keys With Recovery Key : ĠThose Ġkeys Ġwill Ġbe Ġbacked Ġup Ġto Ġbackup Ġversion : Ġ" Ġ+ Ġm Keys Backup Version ?. version ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠImport Ġthem Ġinto Ġthe Ġcrypto Ġstore ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprogress Listener Ġ= Ġif Ġ( step Progress Listener Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠProgress Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Progress ( progress : ĠInt , Ġtotal : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNote : Ġno Ġneed Ġto Ġpost Ġto ĠUI Ġthread , Ġimport Me gol m Sessions Data () Ġwill Ġdo Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstep Progress Listener . on Step Progress ( Step Progress Listener . Step . Import ing Key ( progress , Ġtotal )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Crypto . import Me gol m Sessions Data ( sessions Data , Ġback Up , Ġprogress Listener , Ġcallback ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRestore Ġa Ġbackup Ġwith Ġa Ġpassword Ġfrom Ġa Ġgiven Ġbackup Ġversion Ġstored Ġon Ġthe Ġhome server . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġkeys Backup Version Ġthe Ġbackup Ġversion Ġto Ġrestore Ġfrom . ĊĠĠĠĠ Ġ* Ġ@ param Ġpassword Ġthe Ġpassword Ġto Ġdecrypt Ġthe Ġretrieved Ġbackup . ĊĠĠĠĠ Ġ* Ġ@ param Ġroom Id Ġthe Ġid Ġof Ġthe Ġroom Ġto Ġget Ġbackup Ġdata Ġfrom . ĊĠĠĠĠ Ġ* Ġ@ param ĠsessionId Ġthe Ġid Ġof Ġthe Ġsession Ġto Ġrestore . ĊĠĠĠĠ Ġ* Ġ@ param Ġstep Progress Listener Ġthe Ġstep Ġprogress Ġlistener ĊĠĠĠĠ Ġ* Ġ@ param Ġcallback ĠCallback . ĠIt Ġprovides Ġthe Ġnumber Ġof Ġfound Ġkeys Ġand Ġthe Ġnumber Ġof Ġsuccessfully Ġimported Ġkeys . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġrestore Key Backup With Password ( keys Backup Version : ĠKeys Version Result , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpassword : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroom Id : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsessionId : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstep Progress Listener : ĠStep Progress Listener ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback : ĠApi Callback < Import Room Keys Result >) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ"[ MX Key Backup ] Ġrestore Key Backup Ġwith Ġpassword : ĠFrom Ġbackup Ġversion : Ġ${ keys Backup Version . version }") ĊĊĠĠĠĠĠĠĠ Ġm Crypto . get Decrypt ing Thread Handler (). post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprogress Listener Ġ= Ġif Ġ( step Progress Listener Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠProgress Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Progress ( progress : ĠInt , Ġtotal : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Crypto . get UI Handler (). post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstep Progress Listener . on Step Progress ( Step Progress Listener . Step . Comp uting Key ( progress , Ġtotal )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrecovery Key Ġ= Ġrecovery Key From Password ( password , Ġkeys Backup Version , Ġprogress Listener ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( recovery Key Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Crypto . get UI Handler (). post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" backup Keys : ĠInvalid Ġconfiguration ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Unexpected Error ( IllegalStateException (" Invalid Ġconfiguration ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ post ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġrestore Keys With Recovery Key ( keys Backup Version , Ġrecovery Key , Ġroom Id , ĠsessionId , Ġstep Progress Listener , Ġcallback ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSame Ġmethod Ġas Ġ[ Room Keys RestClient . get Room Key ] Ġexcept Ġthat Ġit Ġaccepts Ġnullable ĊĠĠĠĠ Ġ* Ġparameters Ġand Ġalways Ġreturns Ġa ĠKeys Backup Data Ġobject Ġthrough Ġthe ĠCallback ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Keys ( sessionId : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroom Id : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġversion : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback : ĠApi Callback < Keys Backup Data >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( roomId Ġ!= Ġnull Ġ&& ĠsessionId Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġkey Ġfor Ġthe Ġroom Ġand Ġfor Ġthe Ġsession ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Room Keys RestClient . get Room Key ( roomId , ĠsessionId , Ġversion , Ġobject Ġ: ĠSimple Api Callback < Key Backup Data >( callback ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( info : ĠKey Backup Data ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠConvert Ġto ĠKeys Backup Data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkeys Backup Data Ġ= ĠKeys Backup Data () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeys Backup Data . roomId To Room Keys Backup Data Ġ= ĠHashMap () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroom Keys Backup Data Ġ= ĠRoom Keys Backup Data () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroom Keys Backup Data . sessionId To Key Backup Data Ġ= ĠHashMap () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroom Keys Backup Data . sessionId To Key Backup Data [ sessionId ] Ġ= Ġinfo ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeys Backup Data . roomId To Room Keys Backup Data [ roomId ] Ġ= Ġroom Keys Backup Data ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Success ( keys Backup Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( roomId Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġall Ġkeys Ġfor Ġthe Ġroom ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Room Keys RestClient . get Room Keys ( roomId , Ġversion , Ġobject Ġ: ĠSimple Api Callback < Room Keys Backup Data >( callback ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( info : ĠRoom Keys Backup Data ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠConvert Ġto ĠKeys Backup Data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkeys Backup Data Ġ= ĠKeys Backup Data () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeys Backup Data . roomId To Room Keys Backup Data Ġ= ĠHashMap () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeys Backup Data . roomId To Room Keys Backup Data [ roomId ] Ġ= Ġinfo ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Success ( keys Backup Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġall Ġkeys ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Room Keys RestClient . get Keys ( version , Ġcallback ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠ Ġ@ Worker Thread ĊĠĠĠ Ġfun Ġpk De cryption From Recovery Key ( recovery Key : ĠString ): ĠO lm Pk De cryption ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠExtract Ġthe Ġprimary Ġkey ĊĠĠĠĠĠĠĠ Ġval ĠprivateKey Ġ= Ġextract Curve Key From Recovery Key ( recovery Key ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠBuilt Ġthe ĠPK Ġde cryption Ġwith Ġit ĊĠĠĠĠĠĠĠ Ġvar Ġde cryption : ĠO lm Pk De cryption ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( privateKey Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġde cryption Ġ= ĠO lm Pk De cryption () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġde cryption . set PrivateKey ( privateKey ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠO lm Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( LOG _ TAG , Ġ" O lm Exception ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġde cryption ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDo Ġa Ġbackup Ġif Ġthere Ġare Ġnew Ġkeys , Ġwith Ġa Ġdelay ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġmaybe Backup Keys () Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis St uck ed Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġnot Ġalready Ġdone , Ġor Ġin Ġerror Ġcase , Ġcheck Ġfor Ġa Ġvalid Ġbackup Ġversion Ġon Ġthe Ġhome server . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthere Ġis Ġone , Ġmaybe Backup Keys Ġwill Ġbe Ġcalled Ġagain . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck And Start Keys Backup () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ== ĠKeys Backup StateManager . Keys Backup State . Ready To Back Up Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Keys Backup StateManager . state Ġ= ĠKeys Backup StateManager . Keys Backup State . Will Back Up ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWait Ġbetween Ġ 0 Ġand Ġ 1 0 Ġseconds , Ġto Ġavoid Ġbackup Ġrequests Ġfrom ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdifferent Ġclients Ġhitting Ġthe Ġserver Ġall Ġat Ġthe Ġsame Ġtime Ġwhen Ġa ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġnew Ġkey Ġis Ġsent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelay In Ms Ġ= Ġm Random . nextInt ( KEY _ BACKUP _ WAIT ING _ TIME _ TO _ SEND _ KEY _ BACKUP _ M ILL IS ). to Long () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Crypto . get UI Handler (). post Delayed ({ Ġbackup Keys () Ġ}, Ġdelay In Ms ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" maybe Backup Keys : ĠSkip Ġit Ġbecause Ġstate : Ġ$ state ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġinformation Ġabout Ġa Ġbackup Ġversion Ġdefined Ġon Ġthe Ġhome server . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIt Ġcan Ġbe Ġdifferent Ġthan Ġm Keys Backup Version . ĊĠĠĠĠ Ġ* Ġ@ param Ġversion Ġthe Ġbackup Ġversion ĊĠĠĠĠ Ġ* Ġ@ param Ġcallback ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Version ( version : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback : ĠApi Callback < Keys Version Result ?> ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Room Keys RestClient . get Keys Backup Version ( version , Ġobject Ġ: ĠSimple Api Callback < Keys Version Result >( callback ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( info : ĠKeys Version Result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Success ( info ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Matrix Error ( e : ĠMatrix Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWork around Ġbecause Ġthe Ġhome server Ġcurrently Ġreturns ĠM _ NOT _ FOUND Ġwhen Ġthere Ġis Ġno Ġkey Ġbackup ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e . errcode Ġ== ĠMatrix Error . NOT _ FOUND ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Success ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTrans mit Ġthe Ġerror ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Matrix Error ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRetrieve Ġthe Ġcurrent Ġversion Ġof Ġthe Ġbackup Ġfrom Ġthe Ġhome Ġserver ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIt Ġcan Ġbe Ġdifferent Ġthan Ġm Keys Backup Version . ĊĠĠĠĠ Ġ* Ġ@ param Ġcallback ĠonSuccess ( null ) Ġwill Ġbe Ġcalled Ġif Ġthere Ġis Ġno Ġbackup Ġon Ġthe Ġserver ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠgetCurrent Version ( callback : ĠApi Callback < Keys Version Result ?> ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Room Keys RestClient . get Keys Backup Last Version ( object Ġ: ĠSimple Api Callback < Keys Version Result >( callback ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( info : ĠKeys Version Result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Success ( info ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Matrix Error ( e : ĠMatrix Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWork around Ġbecause Ġthe Ġhome server Ġcurrently Ġreturns ĠM _ NOT _ FOUND Ġwhen Ġthere Ġis Ġno Ġkey Ġbackup ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e . errcode Ġ== ĠMatrix Error . NOT _ FOUND ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Success ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTrans mit Ġthe Ġerror ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Matrix Error ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġf etches Ġthe Ġlast Ġbackup Ġversion Ġon Ġthe Ġserver , Ġthen Ġcompare Ġto Ġthe Ġcurrently Ġbackup Ġversion Ġuse . ĊĠĠĠĠ Ġ* ĠIf Ġversions Ġare Ġnot Ġthe Ġsame , Ġthe Ġcurrent Ġbackup Ġis Ġdeleted Ġ( on Ġserver Ġor Ġlocally ), Ġthen Ġthe Ġbackup Ġmay Ġbe Ġstarted Ġagain , Ġusing Ġthe Ġlast Ġversion . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcallback Ġtrue Ġif Ġbackup Ġis Ġalready Ġusing Ġthe Ġlast Ġversion , Ġand Ġfalse Ġif Ġit Ġis Ġnot Ġthe Ġcase ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġforce Using Last Version ( callback : ĠApi Callback < Boolean >) Ġ{ ĊĠĠĠĠĠĠĠ ĠgetCurrent Version ( object Ġ: ĠSimple Api Callback < Keys Version Result ? >( callback ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( info : ĠKeys Version Result ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocal Backup Version Ġ= Ġm Keys Backup Version ?. version ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġserver Backup Version Ġ= Ġinfo ?. version ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( server Backup Version Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( local Backup Version Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNo Ġbackup Ġon Ġthe Ġserver , Ġand Ġbackup Ġis Ġnot Ġactive ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Success ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNo Ġbackup Ġon Ġthe Ġserver , Ġand Ġwe Ġare Ġcurrently Ġbacking Ġup , Ġso Ġstop Ġbacking Ġup ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Success ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreset Keys Backup Data () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Keys Backup Version Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Keys Backup StateManager . state Ġ= ĠKeys Backup StateManager . Keys Backup State . Disabled ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( local Backup Version Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbackup Ġon Ġthe Ġserver , Ġand Ġbackup Ġis Ġnot Ġactive ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Success ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDo Ġa Ġcheck ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck And Start With Keys Backup Version ( info ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBackup Ġon Ġthe Ġserver , Ġand Ġwe Ġare Ġcurrently Ġbacking Ġup , Ġcompare Ġversion ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( local Backup Version Ġ== Ġserver Backup Version ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġare Ġalready Ġusing Ġthe Ġlast Ġversion Ġof Ġthe Ġbackup ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Success ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġare Ġnot Ġusing Ġthe Ġlast Ġversion , Ġso Ġdelete Ġthe Ġcurrent Ġversion Ġwe Ġare Ġusing Ġon Ġthe Ġserver ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Success ( false ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġwill Ġautomatically Ġcheck Ġfor Ġthe Ġlast Ġversion Ġthen ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Backup ( local Backup Version , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCheck Ġthe Ġserver Ġfor Ġan Ġactive Ġkey Ġbackup . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġone Ġis Ġpresent Ġand Ġhas Ġa Ġvalid Ġsignature Ġfrom Ġone Ġof Ġthe Ġuser 's Ġverified ĊĠĠĠĠ Ġ* Ġdevices , Ġstart Ġbacking Ġup Ġto Ġit . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcheck And Start Keys Backup () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is St uck ed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTry Ġto Ġstart Ġor Ġrestart Ġthe Ġbackup Ġonly Ġif Ġit Ġis Ġin Ġunknown Ġor Ġbad Ġstate ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( LOG _ TAG , Ġ" check And Start Keys Backup : Ġinvalid Ġstate : Ġ$ state ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġm Keys Backup Version Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġm Keys Backup StateManager . state Ġ= ĠKeys Backup StateManager . Keys Backup State . Checking Back Up On Home server ĊĊĠĠĠĠĠĠĠ ĠgetCurrent Version ( object Ġ: ĠApi Callback < Keys Version Result ?> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( key Backup Version : ĠKeys Version Result ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck And Start With Keys Backup Version ( key Backup Version ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Unexpected Error ( e : ĠException ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( LOG _ TAG , Ġ" check And Start Keys Backup : ĠFailed Ġto Ġget Ġcurrent Ġversion ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Keys Backup StateManager . state Ġ= ĠKeys Backup StateManager . Keys Backup State . Unknown ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Network Error ( e : ĠException ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( LOG _ TAG , Ġ" check And Start Keys Backup : ĠFailed Ġto Ġget Ġcurrent Ġversion ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Keys Backup StateManager . state Ġ= ĠKeys Backup StateManager . Keys Backup State . Unknown ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Matrix Error ( e : ĠMatrix Error ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( LOG _ TAG , Ġ" check And Start Keys Backup : ĠFailed Ġto Ġget Ġcurrent Ġversion Ġ" Ġ+ Ġe ?. localized Message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Keys Backup StateManager . state Ġ= ĠKeys Backup StateManager . Keys Backup State . Unknown ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck And Start With Keys Backup Version ( key Backup Version : ĠKeys Version Result ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" check And Start With Key Backup Version : Ġ${ key Backup Version ?. version }") ĊĊĠĠĠĠĠĠĠ Ġm Keys Backup Version Ġ= Ġkey Backup Version ĊĊĠĠĠĠĠĠĠ Ġif Ġ( key Backup Version Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" check And Start With Keys Backup Version : ĠFound Ġno Ġkey Ġbackup Ġversion Ġon Ġthe Ġhome server ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreset Keys Backup Data () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Keys Backup StateManager . state Ġ= ĠKeys Backup StateManager . Keys Backup State . Disabled ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Keys Backup Trust ( key Backup Version , ĠSuccess Callback Ġ{ Ġtrust Info Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġversion In Store Ġ= Ġm Crypto . crypto Store . key Backup Version ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( trust Info . usable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" check And Start With Keys Backup Version : ĠFound Ġusable Ġkey Ġbackup . Ġversion : Ġ" Ġ+ Ġkey Backup Version . version ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġthe Ġversion Ġwe Ġused Ġat Ġthe Ġprevious Ġapp Ġrun ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( version In Store Ġ!= Ġnull Ġ&& Ġversion In Store Ġ!= Ġkey Backup Version . version ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Ġ-> Ġclean Ġthe Ġpreviously Ġused Ġversion Ġ$ version In Store ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreset Keys Backup Data () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" ĠĠ Ġ-> Ġenabling Ġkey Ġbackups ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenable Keys Backup ( key Backup Version ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" check And Start With Keys Backup Version : ĠNo Ġusable Ġkey Ġbackup . Ġversion : Ġ" Ġ+ Ġkey Backup Version . version ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( version In Store Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" ĠĠ Ġ-> Ġdisabling Ġkey Ġbackup ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreset Keys Backup Data () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Keys Backup StateManager . state Ġ= ĠKeys Backup StateManager . Keys Backup State . Not Trusted ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* Ġ================================================================= ================ ========= ĊĠĠĠĠ Ġ* ĠPrivate ĊĠĠĠĠ Ġ* Ġ================================================================= ================ ========= Ġ*/ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠExtract ĠMe gol m Backup Auth Data Ġdata Ġfrom Ġa Ġbackup Ġversion . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġkeys Backup Data Ġthe Ġkey Ġbackup Ġdata ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġauthentication Ġif Ġfound Ġand Ġvalid , Ġnull Ġin Ġother Ġcase ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Me gol m Backup Auth Data ( keys Backup Data : ĠKeys Version Result ): ĠMe gol m Backup Auth Data ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( keys Backup Data . version . isNull Or Blank () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġkeys Backup Data . algorithm Ġ!= ĠMX CRYPTO _ ALGORITHM _ ME G OL M _ BACKUP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġkeys Backup Data . auth Data Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġauth Data Ġ= Ġkeys Backup Data . get Auth Data As Me gol m Backup Auth Data () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( auth Data . signatures Ġ== Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġauth Data . publicKey . isBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġauth Data ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCompute Ġthe Ġrecovery Ġkey Ġfrom Ġa Ġpassword Ġand Ġkey Ġbackup Ġversion . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġpassword Ġthe Ġpassword . ĊĠĠĠĠ Ġ* Ġ@ param Ġkeys Backup Data Ġthe Ġbackup Ġand Ġits Ġauth Ġdata . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġrecovery Ġkey Ġif Ġsuccessful , Ġnull Ġin Ġother Ġcases ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Worker Thread ĊĠĠĠ Ġprivate Ġfun Ġrecovery Key From Password ( password : ĠString , Ġkeys Backup Data : ĠKeys Version Result , Ġprogress Listener : ĠProgress Listener ?): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġauth Data Ġ= Ġget Me gol m Backup Auth Data ( keys Backup Data ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( auth Data Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( LOG _ TAG , Ġ" recovery Key From Password : Ġinvalid Ġparameter ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( auth Data . privateKey Salt . isNull Or Blank () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġauth Data . privateKey Iterations Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( LOG _ TAG , Ġ" recovery Key From Password : ĠS alt Ġand / or Ġiterations Ġnot Ġfound Ġin Ġkey Ġbackup Ġauth Ġdata ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠExtract Ġthe Ġrecovery Ġkey Ġfrom Ġthe Ġpassphrase ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġretrieve PrivateKey With Password ( password , Ġauth Data . privateKey Salt !! , Ġauth Data . privateKey Iterations !! , Ġprogress Listener ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcompute Recovery Key ( data ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCheck Ġif Ġa Ġrecovery Ġkey Ġmatches Ġkey Ġbackup Ġauthentication Ġdata . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġrecovery Key Ġthe Ġrecovery Ġkey Ġto Ġchallenge . ĊĠĠĠĠ Ġ* Ġ@ param Ġkeys Backup Data Ġthe Ġbackup Ġand Ġits Ġauth Ġdata . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġsuccessful . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Worker Thread ĊĠĠĠ Ġprivate Ġfun ĠisValid Recovery Key For Keys Backup Version ( recovery Key : ĠString , Ġkeys Backup Data : ĠKeys Version Result ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠBuild ĠPK Ġde cryption Ġinstance Ġwith Ġthe Ġrecovery Ġkey ĊĠĠĠĠĠĠĠ Ġval ĠpublicKey Ġ= Ġpk PublicKey From Recovery Key ( recovery Key ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( publicKey Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( LOG _ TAG , Ġ" isValid Recovery Key For Keys Backup Version : Ġpublic Ġkey Ġis Ġnull ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġauth Data Ġ= Ġget Me gol m Backup Auth Data ( keys Backup Data ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( auth Data Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( LOG _ TAG , Ġ" isValid Recovery Key For Keys Backup Version : ĠKey Ġbackup Ġis Ġmissing Ġrequired Ġdata ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠCompare Ġboth ĊĠĠĠĠĠĠĠ Ġif Ġ( publicKey Ġ!= Ġauth Data . publicKey ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( LOG _ TAG , Ġ" isValid Recovery Key For Keys Backup Version : ĠPublic Ġkeys Ġmismatch ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠPublic Ġkeys Ġmatch ! ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEnable Ġbacking Ġup Ġof Ġkeys . ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġwill Ġupdate Ġthe Ġstate Ġand Ġwill Ġstart Ġsending Ġkeys Ġin Ġnominal Ġcase ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġkeys Version Result Ġbackup Ġinformation Ġobject Ġas Ġreturned Ġby Ġ[ getCurrent Version ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġenable Keys Backup ( keys Version Result : ĠKeys Version Result ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( keys Version Result . auth Data Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġretrieved Me gol m Backup Auth Data Ġ= Ġkeys Version Result . get Auth Data As Me gol m Backup Auth Data () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( retrie ved Me gol m Backup Auth Data Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Keys Backup Version Ġ= Ġkeys Version Result ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Crypto . crypto Store . key Backup Version Ġ= Ġkeys Version Result . version ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Server Data Retrie ved ( keys Version Result . count , Ġkeys Version Result . hash ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Backup Key Ġ= ĠO lm Pk Encryption (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Recipient Key ( retrie ved Me gol m Backup Auth Data . publicKey ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠO lm Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( LOG _ TAG , Ġ" O lm Exception ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Keys Backup StateManager . state Ġ= ĠKeys Backup StateManager . Keys Backup State . Disabled ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Keys Backup StateManager . state Ġ= ĠKeys Backup StateManager . Keys Backup State . Ready To Back Up ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmaybe Backup Keys () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( LOG _ TAG , Ġ" Invalid Ġauthentication Ġdata ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Keys Backup StateManager . state Ġ= ĠKeys Backup StateManager . Keys Backup State . Disabled ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( LOG _ TAG , Ġ" Invalid Ġauthentication Ġdata ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Keys Backup StateManager . state Ġ= ĠKeys Backup StateManager . Keys Backup State . Disabled ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUpdate Ġthe ĠDB Ġwith Ġdata Ġfetch Ġfrom Ġthe Ġserver ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġon Server Data Retrie ved ( count : ĠInt ?, Ġhash : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Crypto . crypto Store . keys Backup Data Ġ= ĠKeys Backup Data Entity () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbackup Last Server NumberOf Keys Ġ= Ġcount ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbackup Last Server Hash Ġ= Ġhash ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReset Ġall Ġlocal Ġkey Ġbackup Ġdata . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNote : ĠThis Ġmethod Ġdoes Ġnot Ġupdate Ġthe Ġstate ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġreset Keys Backup Data () Ġ{ ĊĠĠĠĠĠĠĠ Ġreset Backup All Group Sessions Listeners () ĊĊĠĠĠĠĠĠĠ Ġm Crypto . crypto Store . key Backup Version Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġm Crypto . crypto Store . keys Backup Data Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġm Backup Key Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġ// ĠReset Ġbackup Ġmarkers ĊĠĠĠĠĠĠĠ Ġm Crypto . crypto Store . reset Backup Markers () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSend Ġa Ġchunk Ġof Ġkeys Ġto Ġbackup ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Ui Thread ĊĠĠĠ Ġprivate Ġfun Ġbackup Keys () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" backup Keys ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠSan ity Ġcheck , Ġas Ġthis Ġmethod Ġcan Ġbe Ġcalled Ġafter Ġa Ġdelay , Ġthe Ġstate Ġmay Ġhave Ġchange Ġduring Ġthe Ġdelay ĊĠĠĠĠĠĠĠ Ġif Ġ(! isEnabled Ġ|| Ġm Backup Key Ġ== Ġnull Ġ|| Ġm Keys Backup Version Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" backup Keys : ĠInvalid Ġconfiguration ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackup All Group Sessions Callback ?. on Unexpected Error ( IllegalStateException (" Invalid Ġconfiguration ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreset Backup All Group Sessions Listeners () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( state Ġ=== ĠKeys Backup StateManager . Keys Backup State . Backing Up ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDo Ġnothing Ġif Ġwe Ġare Ġalready Ġbacking Ġup ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" backup Keys : ĠInvalid Ġstate : Ġ$ state ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġa Ġchunk Ġof Ġkeys Ġto Ġbackup ĊĠĠĠĠĠĠĠ Ġval Ġsessions Ġ= Ġm Crypto . crypto Store . inbound Group Sessions To Backup ( KEY _ BACKUP _ SEND _ KEYS _ MAX _ COUNT ) ĊĊĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" backup Keys : Ġ 1 Ġ- Ġ" Ġ+ Ġsessions . size Ġ+ Ġ" Ġsessions Ġto Ġback Ġup ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( sessions . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBackup Ġis Ġup Ġto Ġdate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Keys Backup StateManager . state Ġ= ĠKeys Backup StateManager . Keys Backup State . Ready To Back Up ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackup All Group Sessions Callback ?. on Success ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreset Backup All Group Sessions Listeners () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġm Keys Backup StateManager . state Ġ= ĠKeys Backup StateManager . Keys Backup State . Backing Up ĊĊĠĠĠĠĠĠĠ Ġm Crypto . encrypt ing Thread Handler . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" backup Keys : Ġ 2 Ġ- ĠEncrypt ing Ġkeys ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠG ather Ġdata Ġto Ġsend Ġto Ġthe Ġhome server ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġroom Id Ġ-> ĠsessionId Ġ-> ĠMX Key Backup Data ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkeys Backup Data Ġ= ĠKeys Backup Data () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkeys Backup Data . roomId To Room Keys Backup Data Ġ= ĠHashMap () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( session Ġin Ġsessions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Backup Data Ġ= Ġencrypt Group Session ( session ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( keys Backup Data . roomId To Room Keys Backup Data [ session . m Room Id ] Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroom Keys Backup Data Ġ= ĠRoom Keys Backup Data () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroom Keys Backup Data . sessionId To Key Backup Data Ġ= ĠHashMap () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeys Backup Data . roomId To Room Keys Backup Data [ session . m Room Id ] Ġ= Ġroom Keys Backup Data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeys Backup Data . roomId To Room Keys Backup Data [ session . m Room Id ] !!. sessionId To Key Backup Data [ session . m Session . session Identifier ()] Ġ= Ġkey Backup Data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠO lm Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( LOG _ TAG , Ġ" O lm Exception ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" backup Keys : Ġ 4 Ġ- ĠSending Ġrequest ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMake Ġthe Ġrequest ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Room Keys RestClient . backup Keys ( m Keys Backup Version !!. version !! , Ġkeys Backup Data , Ġobject Ġ: ĠApi Callback < Backup Keys Result > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Network Error ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Crypto . get UI Handler (). post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbackup All Group Sessions Callback ?. on Network Error ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreset Backup All Group Sessions Listeners () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun ĠonError () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( LOG _ TAG , Ġ" backup Keys : Ġbackup Keys Ġfailed .") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRetry Ġa Ġbit Ġlater ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Keys Backup StateManager . state Ġ= ĠKeys Backup StateManager . Keys Backup State . Ready To Back Up ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmaybe Backup Keys () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Matrix Error ( e : ĠMatrix Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Crypto . get UI Handler (). post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( LOG _ TAG , Ġ" backup Keys : Ġbackup Keys Ġfailed . ĠError : Ġ" Ġ+ Ġe . localized Message ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( e . errcode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMatrix Error . NOT _ FOUND , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMatrix Error . WRONG _ ROOM _ KEYS _ VERSION Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBackup Ġhas Ġbeen Ġdeleted Ġon Ġthe Ġserver , Ġor Ġwe Ġare Ġnot Ġusing Ġthe Ġlast Ġbackup Ġversion ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Keys Backup StateManager . state Ġ= ĠKeys Backup StateManager . Keys Backup State . Wrong Back Up Version ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbackup All Group Sessions Callback ?. on Matrix Error ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreset Backup All Group Sessions Listeners () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreset Keys Backup Data () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Keys Backup Version Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDo Ġnot Ġstay Ġin ĠKeys Backup State . Wrong Back Up Version Ġbut Ġcheck Ġwhat Ġis Ġavailable Ġon Ġthe Ġhome server ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck And Start Keys Backup () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ// ĠCome Ġback Ġto Ġthe Ġready Ġstate Ġso Ġthat Ġwe Ġwill Ġretry Ġon Ġthe Ġnext Ġreceived Ġkey ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Keys Backup StateManager . state Ġ= ĠKeys Backup StateManager . Keys Backup State . Ready To Back Up ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Unexpected Error ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Crypto . get UI Handler (). post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbackup All Group Sessions Callback ?. on Unexpected Error ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreset Backup All Group Sessions Listeners () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( info : ĠBackup Keys Result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Crypto . get UI Handler (). post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" backup Keys : Ġ 5 a Ġ- ĠRequest Ġcomplete ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMark Ġkeys Ġas Ġbacked Ġup ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Crypto . crypto Store . mark Backup Done For Inbound Group Sessions ( sessions ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sessions . size Ġ< ĠKEY _ BACKUP _ SEND _ KEYS _ MAX _ COUNT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" backup Keys : ĠAll Ġkeys Ġhave Ġbeen Ġbacked Ġup ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Server Data Retrie ved ( info . count , Ġinfo . hash ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNote : ĠChanging Ġstate Ġwill Ġtrigger Ġthe Ġcall Ġto Ġbackup All Group Sessions Callback . on Success () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Keys Backup StateManager . state Ġ= ĠKeys Backup StateManager . Keys Backup State . Ready To Back Up ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" backup Keys : ĠContinue Ġto Ġback Ġup Ġkeys ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Keys Backup StateManager . state Ġ= ĠKeys Backup StateManager . Keys Backup State . Will Back Up ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbackup Keys () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠ Ġ@ Worker Thread ĊĠĠĠ Ġfun Ġencrypt Group Session ( session : ĠMX O lm Inbound Group Session 2 ): ĠKey Backup Data Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠG ather Ġinformation Ġfor Ġeach Ġkey ĊĠĠĠĠĠĠĠ Ġval Ġdevice Ġ= Ġm Crypto . device With Identity Key ( session . m Sender Key , ĠMX CRYPTO _ ALGORITHM _ ME G OL M ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠBuild Ġthe Ġm . meg ol m _ backup . v 1 . curve 2 5 5 1 9 - aes - sha 2 Ġdata Ġas Ġdefined Ġat ĊĠĠĠĠĠĠĠ Ġ// Ġhttps :// github . com / uh ore g / matrix - doc / blob / e 2 e _ backup / pro posals / 1 2 1 9 - st oring - meg ol m - keys - server side . md # m meg ol m _ backup v 1 curve 2 5 5 1 9 - aes - sha 2 - key - format ĊĠĠĠĠĠĠĠ Ġval Ġsession Data Ġ= Ġsession . export Keys () ĊĠĠĠĠĠĠĠ Ġval Ġsession Backup Data Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" algorithm " Ġto Ġsession Data !!. algorithm , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" sender _ key " Ġto Ġsession Data . sender Key , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" sender _ claimed _ keys " Ġto Ġsession Data . sender Cl a imed Keys , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" forwarding _ curve 2 5 5 1 9 _ key _ chain " Ġto Ġ( session Data . forwarding Curve 2 5 5 1 9 Key Chain Ġ?: ĠArrayList < Any > ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" session _ key " Ġto Ġsession Data . session Key ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġencrypted Session Backup Data : ĠO lm Pk Message ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġencrypted Session Backup Data Ġ= Ġm Backup Key ?. encrypt ( Json Utility . get Gson ( false ). toJson ( session Backup Data )) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠO lm Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( LOG _ TAG , Ġ" O lm Exception ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠBuild Ġbackup Ġdata Ġfor Ġthat Ġkey ĊĠĠĠĠĠĠĠ Ġval Ġkey Backup Data Ġ= ĠKey Backup Data () ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Backup Data . first Message Index Ġ= Ġsession . m Session . first Known Index ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠO lm Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( LOG _ TAG , Ġ" O lm Exception ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġkey Backup Data . for warded Count Ġ= Ġsession . m Forwarding Curve 2 5 5 1 9 Key Chain . size ĊĠĠĠĠĠĠĠ Ġkey Backup Data . is Verified Ġ= Ġdevice ?. is Verified Ġ== Ġtrue ĊĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ciphertext " Ġto Ġencrypted Session Backup Data !!. m Cipher Text , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" mac " Ġto Ġencrypted Session Backup Data . m Mac , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ep hemeral " Ġto Ġencrypted Session Backup Data . m Ep hemeral Key ) ĊĊĠĠĠĠĠĠĠ Ġkey Backup Data . session Data Ġ= ĠJson Utility . get Gson ( false ). toJson Tree ( data ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġkey Backup Data ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠ Ġ@ Worker Thread ĊĠĠĠ Ġfun Ġdecrypt Key Backup Data ( key Backup Data : ĠKey Backup Data , ĠsessionId : ĠString , Ġroom Id : ĠString , Ġde cryption : ĠO lm Pk De cryption ): ĠMe gol m Session Data ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġsession Backup Data : ĠMe gol m Session Data ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġval ĠjsonObject Ġ= Ġkey Backup Data . session Data ?. as JsonObject ĊĊĠĠĠĠĠĠĠ Ġval Ġciphertext Ġ= ĠjsonObject ?. get (" ciphertext ") ?. asString ĊĠĠĠĠĠĠĠ Ġval Ġmac Ġ= ĠjsonObject ?. get (" mac ") ?. asString ĊĠĠĠĠĠĠĠ Ġval Ġep hemeral Key Ġ= ĠjsonObject ?. get (" ep hemeral ") ?. asString ĊĊĠĠĠĠĠĠĠ Ġif Ġ( ciphertext Ġ!= Ġnull Ġ&& Ġmac Ġ!= Ġnull Ġ&& Ġep hemeral Key Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġencrypted Ġ= ĠO lm Pk Message () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġencrypted . m Cipher Text Ġ= Ġciphertext ĊĠĠĠĠĠĠĠĠĠĠĠ Ġencrypted . m Mac Ġ= Ġmac ĊĠĠĠĠĠĠĠĠĠĠĠ Ġencrypted . m Ep hemeral Key Ġ= Ġep hemeral Key ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdecrypted Ġ= Ġde cryption . decrypt ( encrypted ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession Backup Data Ġ= ĠJson Utility . to Class ( de crypted , ĠMe gol m Session Data :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠO lm Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( LOG _ TAG , Ġ" O lm Exception ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( session Backup Data Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession Backup Data . sessionId Ġ= ĠsessionId ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession Backup Data . roomId Ġ= Ġroom Id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsession Backup Data ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Room Keys RestClient (): ĠRoom Keys RestClient Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġm Room Keys RestClient ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠLOG _ TAG Ġ= ĠKeys Backup :: class . java . simple Name ĊĊĠĠĠĠĠĠĠ Ġ// ĠMaximum Ġdelay Ġin Ġms Ġin Ġ{@ link Ġmaybe Backup Keys } ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠKEY _ BACKUP _ WAIT ING _ TIME _ TO _ SEND _ KEY _ BACKUP _ M ILL IS Ġ= Ġ 1 0 0 0 0 ĊĊĠĠĠĠĠĠĠ Ġ// ĠMaximum Ġnumber Ġof Ġkeys Ġto Ġsend Ġat Ġa Ġtime Ġto Ġthe Ġhome server . ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠKEY _ BACKUP _ SEND _ KEYS _ MAX _ COUNT Ġ= Ġ 1 0 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* Ġ================================================================= ================ ========= ĊĠĠĠĠ Ġ* ĠDEBUG ĠINFO ĊĠĠĠĠ Ġ* Ġ================================================================= ================ ========= Ġ*/ ĊĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ" Keys Backup Ġfor Ġ$ m Crypto " Ċ } Ċ