/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠThe ĠMatrix . org ĠFoundation ĠC . I . C . Ċ Ġ* Ċ Ġ* Ġ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 . internal . crypto Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ import Ġandroidx . annotation . Visible ForTesting Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġcom . squareup . mos hi . Types Ċ import Ġcom . zh u inden . mon arch y . Mon arch y Ċ import Ġdagger . Lazy Ċ import Ġkotlinx . coroutines . Cancellation Exception Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . cancel Children Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġorg . matrix . android . sdk . api . Matrix Callback Ċ import Ġorg . matrix . android . sdk . api . No Op Matrix Callback Ċ import Ġorg . matrix . android . sdk . api . crypto . MX Crypto Config Ċ import Ġorg . matrix . android . sdk . api . extensions . try OrNull Ċ import Ġorg . matrix . android . sdk . api . failure . Failure Ċ import Ġorg . matrix . android . sdk . api . listeners . Progress Listener Ċ import Ġorg . matrix . android . sdk . api . session . crypto . Crypto Service Ċ import Ġorg . matrix . android . sdk . api . session . crypto . MX Crypto Error Ċ import Ġorg . matrix . android . sdk . api . session . crypto . cross signing . KEY BACKUP _ SECRET _ SSSS _ NAME Ċ import Ġorg . matrix . android . sdk . api . session . crypto . cross signing . MASTER _ KEY _ SSSS _ NAME Ċ import Ġorg . matrix . android . sdk . api . session . crypto . cross signing . SELF _ SIGN ING _ KEY _ SSSS _ NAME Ċ import Ġorg . matrix . android . sdk . api . session . crypto . cross signing . USER _ SIGN ING _ KEY _ SSSS _ NAME Ċ import Ġorg . matrix . android . sdk . api . session . crypto . key share . Go ssip ing RequestListener Ċ import Ġorg . matrix . android . sdk . api . session . events . model . Content Ċ import Ġorg . matrix . android . sdk . api . session . events . model . Event Ċ import Ġorg . matrix . android . sdk . api . session . events . model . EventType Ċ import Ġorg . matrix . android . sdk . api . session . events . model . to Model Ċ import Ġorg . matrix . android . sdk . api . session . room . model . Membership Ċ import Ġorg . matrix . android . sdk . api . session . room . model . Room History Visibility Ċ import Ġorg . matrix . android . sdk . api . session . room . model . Room History Visibility Content Ċ import Ġorg . matrix . android . sdk . api . session . room . model . Room Member Content Ċ import Ġorg . matrix . android . sdk . internal . crypto . actions . Ensure O lm Sessions For Devices Action Ċ import Ġorg . matrix . android . sdk . internal . crypto . actions . Me gol m Session Data Importer Ċ import Ġorg . matrix . android . sdk . internal . crypto . actions . Message Encrypt er Ċ import Ġorg . matrix . android . sdk . internal . crypto . actions . Set Device Verification Action Ċ import Ġorg . matrix . android . sdk . internal . crypto . algorithms . IM X Encrypt ing Ċ import Ġorg . matrix . android . sdk . internal . crypto . algorithms . IM X With Hel d Extension Ċ import Ġorg . matrix . android . sdk . internal . crypto . algorithms . meg ol m . MX Me gol m Encryption Factory Ċ import Ġorg . matrix . android . sdk . internal . crypto . algorithms . ol m . MX O lm Encryption Factory Ċ import Ġorg . matrix . android . sdk . internal . crypto . cross signing . Default Cross Signing Service Ċ import Ġorg . matrix . android . sdk . internal . crypto . cross signing . Device Trust Level Ċ import Ġorg . matrix . android . sdk . internal . crypto . keys backup . Default Keys Backup Service Ċ import Ġorg . matrix . android . sdk . internal . crypto . model . Crypto DeviceInfo Ċ import Ġorg . matrix . android . sdk . internal . crypto . model . Import Room Keys Result Ċ import Ġorg . matrix . android . sdk . internal . crypto . model . MX DeviceInfo Ċ import Ġorg . matrix . android . sdk . internal . crypto . model . MX Encrypt Event Content Result Ċ import Ġorg . matrix . android . sdk . internal . crypto . model . MX Users Devices Map Ċ import Ġorg . matrix . android . sdk . internal . crypto . model . event . Encrypted Event Content Ċ import Ġorg . matrix . android . sdk . internal . crypto . model . event . O lm Event Content Ċ import Ġorg . matrix . android . sdk . internal . crypto . model . event . Room Key Content Ċ import Ġorg . matrix . android . sdk . internal . crypto . model . event . Room Key With Hel d Content Ċ import Ġorg . matrix . android . sdk . internal . crypto . model . event . Secret Send Event Content Ċ import Ġorg . matrix . android . sdk . internal . crypto . model . rest . DeviceInfo Ċ import Ġorg . matrix . android . sdk . internal . crypto . model . rest . Devices ListResponse Ċ import Ġorg . matrix . android . sdk . internal . crypto . model . rest . Room Key RequestBody Ċ import Ġorg . matrix . android . sdk . internal . crypto . model . to Rest Ċ import Ġorg . matrix . android . sdk . internal . crypto . repository . Warn On Unknown Device Repository Ċ import Ġorg . matrix . android . sdk . internal . crypto . store . IM X Crypto Store Ċ import Ġorg . matrix . android . sdk . internal . crypto . tasks . Delete Device Task Ċ import Ġorg . matrix . android . sdk . internal . crypto . tasks . Delete Device With User Password Task Ċ import Ġorg . matrix . android . sdk . internal . crypto . tasks . GetDevice Info Task Ċ import Ġorg . matrix . android . sdk . internal . crypto . tasks . Get Devices Task Ċ import Ġorg . matrix . android . sdk . internal . crypto . tasks . Send To Device Task Ċ import Ġorg . matrix . android . sdk . internal . crypto . tasks . Set Device Name Task Ċ import Ġorg . matrix . android . sdk . internal . crypto . tasks . Upload Keys Task Ċ import Ġorg . matrix . android . sdk . internal . crypto . verification . Default Verification Service Ċ import Ġorg . matrix . android . sdk . internal . database . model . Event Entity Ċ import Ġorg . matrix . android . sdk . internal . database . model . Event Entity Fields Ċ import Ġorg . matrix . android . sdk . internal . database . query . where Type Ċ import Ġorg . matrix . android . sdk . internal . di . DeviceId Ċ import Ġorg . matrix . android . sdk . internal . di . M oshi Provider Ċ import Ġorg . matrix . android . sdk . internal . di . Session Database Ċ import Ġorg . matrix . android . sdk . internal . di . UserId Ċ import Ġorg . matrix . android . sdk . internal . extensions . fold To Callback Ċ import Ġorg . matrix . android . sdk . internal . session . Session Scope Ċ import Ġorg . matrix . android . sdk . internal . session . room . membership . Load Room Members Task Ċ import Ġorg . matrix . android . sdk . internal . session . room . membership . Room Member Helper Ċ import Ġorg . matrix . android . sdk . internal . session . sync . model . Sync Response Ċ import Ġorg . matrix . android . sdk . internal . task . Task Executor Ċ import Ġorg . matrix . android . sdk . internal . task . Task Thread Ċ import Ġorg . matrix . android . sdk . internal . task . configure With Ċ import Ġorg . matrix . android . sdk . internal . task . launch To Callback Ċ import Ġorg . matrix . android . sdk . internal . util . Json Canonical izer Ċ import Ġorg . matrix . android . sdk . internal . util . Matrix Coroutine Dispatch ers Ċ import Ġorg . matrix . android . sdk . internal . util . fetch Copied Ċ import Ġorg . matrix . ol m . O lm Manager Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . util . concurrent . atomic . Atomic Boolean Ċ import Ġjavax . inject . Inject Ċ import Ġkotlin . math . max Ċ Ċ /** Ċ Ġ* ĠA Ġ` Crypto Service ` Ġclass Ġinstance Ġmanages Ġthe Ġend - to - end Ġcrypto Ġfor Ġa Ġsession . Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠMessages Ġposted Ġby Ġthe Ġuser Ġare Ġautomatically Ġredirected Ġto ĠCrypto Service Ġin Ġorder Ġto Ġbe Ġencrypted Ċ Ġ* Ġbefore Ġsending . Ċ Ġ* ĠIn Ġthe Ġother Ġhand , Ġreceived Ġevents Ġgoes Ġthrough ĠCrypto Service Ġfor Ġdecrypt ing . Ċ Ġ* ĠCrypto Service Ġmaintains Ġall Ġnecessary Ġkeys Ġand Ġtheir Ġsharing Ġwith Ġother Ġdevices Ġrequired Ġfor Ġthe Ġcrypto . Ċ Ġ* ĠSpec ially , Ġit Ġtracks Ġall Ġroom Ġmembership Ġchanges Ġevents Ġin Ġorder Ġto Ġdo Ġkeys Ġupdates . Ċ Ġ*/ Ċ @ Session Scope Ċ internal Ġclass ĠDefault Crypto Service Ġ@ Inject Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġ// ĠO lm ĠManager ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġol m Manager : ĠO lm Manager , ĊĠĠĠĠĠĠĠ Ġ@ UserId ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠuserId : ĠString , ĊĠĠĠĠĠĠĠ Ġ@ DeviceId ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠdeviceId : ĠString ?, ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmy DeviceInfo Holder : ĠLazy < My DeviceInfo Holder >, ĊĠĠĠĠĠĠĠ Ġ// Ġthe Ġcrypto Ġstore ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcrypto Store : ĠI MX Crypto Store , ĊĠĠĠĠĠĠĠ Ġ// ĠRoom Ġencrypt ors Ġstore ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġroom Encrypt ors Store : ĠRoom Encrypt ors Store , ĊĠĠĠĠĠĠĠ Ġ// ĠO lm Ġdevice ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġol m Device : ĠMX O lm Device , ĊĠĠĠĠĠĠĠ Ġ// ĠSet Ġof Ġparameters Ġused Ġto Ġconfigure / customize Ġthe Ġend - to - end Ġcrypto . ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġm xC rypto Config : ĠMX Crypto Config , ĊĠĠĠĠĠĠĠ Ġ// ĠDevice Ġlist Ġmanager ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdevice List Manager : ĠDevice List Manager , ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġkey Ġbackup Ġservice . ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġkeys Backup Service : ĠDefault Keys Backup Service , ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġobject Signer : ĠObject Signer , ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġone Time Keys Uploader : ĠOne Time Keys Uploader , ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġroom Decrypt or Provider : ĠRoom Decrypt or Provider , ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġverification Ġservice . ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġverification Service : ĠDefault Verification Service , ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcross Signing Service : ĠDefault Cross Signing Service , ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġincoming Go ssip ing Request Manager : ĠIncoming Go ssip ing Request Manager , ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġoutgoing Go ssip ing Request Manager : ĠOut going Go ssip ing Request Manager , ĊĠĠĠĠĠĠĠ Ġ// ĠActions ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġset Device Verification Action : ĠSet Device Verification Action , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmeg ol m Session Data Importer : ĠMe gol m Session Data Importer , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġwarn On Unknown Devices Repository : ĠW arn On Unknown Device Repository , ĊĠĠĠĠĠĠĠ Ġ// ĠRepository ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmeg ol m Encryption Factory : ĠMX Me gol m Encryption Factory , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġol m Encryption Factory : ĠMX O lm Encryption Factory , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdelete Device Task : ĠDelete Device Task , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdelete Device With User Password Task : ĠDelete Device With User Password Task , ĊĠĠĠĠĠĠĠ Ġ// ĠTasks ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġget Devices Task : ĠGet Devices Task , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġget DeviceInfo Task : ĠGet DeviceInfo Task , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġset Device Name Task : ĠSet Device Name Task , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġupload Keys Task : ĠUpload Keys Task , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġload Room Members Task : ĠLoad Room Members Task , ĊĠĠĠĠĠĠĠ Ġ@ Session Database Ġprivate Ġval Ġmon arch y : ĠMon arch y , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcoroutine Dispatch ers : ĠMatrix Coroutine Dispatch ers , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtask Executor : ĠTask Executor , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcrypto Coroutine Scope : ĠCor outine Scope , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġensure O lm Sessions For Devices Action : ĠEnsure O lm Sessions For Devices Action , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġsend To Device Task : ĠSend To Device Task , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmessage Encrypt er : ĠMessage Encrypt er Ċ ) Ġ: ĠCrypto Service Ġ{ ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġverification Service . crypto Service Ġ= Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġui Handler Ġ= ĠHandler ( Looper . get Main Looper ()) ĊĊĠĠĠ Ġprivate Ġval Ġis Starting Ġ= ĠAtomic Boolean ( false ) ĊĠĠĠ Ġprivate Ġval Ġis Started Ġ= ĠAtomic Boolean ( false ) ĊĊĠĠĠ Ġ// ĠThe Ġdate Ġof Ġthe Ġlast Ġtime Ġwe Ġforced Ġestablish ment ĊĠĠĠ Ġ// Ġof Ġa Ġnew Ġsession Ġfor Ġeach Ġuser : device . ĊĠĠĠ Ġprivate Ġval Ġlast New Session For ced Dates Ġ= ĠMX Users Devices Map < Long >() ĊĊĠĠĠ Ġfun Ġon State Event ( roomId : ĠString , Ġevent : ĠEvent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . get Clear Type () Ġ== ĠEventType . STATE _ ROOM _ ENCRYPT ION ĠĠĠĠĠĠĠĠ Ġ-> Ġon Room Encryption Event ( roomId , Ġevent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . get Clear Type () Ġ== ĠEventType . STATE _ ROOM _ MEMBER ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġon Room Membership Event ( roomId , Ġevent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . get Clear Type () Ġ== ĠEventType . STATE _ ROOM _ HISTORY _ VIS IBILITY Ġ-> Ġon Room History Visibility Event ( roomId , Ġevent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Live Event ( roomId : ĠString , Ġevent : ĠEvent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . get Clear Type () Ġ== ĠEventType . STATE _ ROOM _ ENCRYPT ION ĠĠĠĠĠĠĠĠ Ġ-> Ġon Room Encryption Event ( roomId , Ġevent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . get Clear Type () Ġ== ĠEventType . STATE _ ROOM _ MEMBER ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġon Room Membership Event ( roomId , Ġevent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . get Clear Type () Ġ== ĠEventType . STATE _ ROOM _ HISTORY _ VIS IBILITY Ġ-> Ġon Room History Visibility Event ( roomId , Ġevent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Device Name ( deviceId : ĠString , Ġdevice Name : ĠString , Ġcallback : ĠMatrix Callback < Unit >) Ġ{ ĊĠĠĠĠĠĠĠ Ġset Device Name Task ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. configure With ( Set Device Name Task . Params ( deviceId , Ġdevice Name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . execution Thread Ġ= ĠTask Thread . CRYPTO ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . callback Ġ= Ġobject Ġ: ĠMatrix Callback < Unit > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( data : ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbg Ġrefresh Ġof Ġcrypto Ġdevice ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdownload Keys ( listOf ( userId ), Ġtrue , ĠNo Op Matrix Callback ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Success ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( failure : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Failure ( failure ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. execute By ( task Executor ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdelete Device ( deviceId : ĠString , Ġcallback : ĠMatrix Callback < Unit >) Ġ{ ĊĠĠĠĠĠĠĠ Ġdelete Device Task ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. configure With ( Delete Device Task . Params ( deviceId )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . execution Thread Ġ= ĠTask Thread . CRYPTO ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . callback Ġ= Ġcallback ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. execute By ( task Executor ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdelete Device With User Password ( deviceId : ĠString , Ġauth Session : ĠString ?, Ġpassword : ĠString , Ġcallback : ĠMatrix Callback < Unit >) Ġ{ ĊĠĠĠĠĠĠĠ Ġdelete Device With User Password Task ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. configure With ( Delete Device With User Password Task . Params ( deviceId , Ġauth Session , Ġpassword )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . execution Thread Ġ= ĠTask Thread . CRYPTO ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . callback Ġ= Ġcallback ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. execute By ( task Executor ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Crypto Version ( context : ĠContext , Ġlong Format : ĠBoolean ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( long Format ) Ġol m Manager . get Detailed Version ( context ) Ġelse Ġol m Manager . version ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget My Device (): ĠCrypto DeviceInfo Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmy DeviceInfo Holder . get (). my Device ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfetch Devices List ( callback : ĠMatrix Callback < Devices ListResponse >) Ġ{ ĊĠĠĠĠĠĠĠ Ġget Devices Task ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. configure With Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . execution Thread Ġ= ĠTask Thread . CRYPTO ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . callback Ġ= Ġobject Ġ: ĠMatrix Callback < Devices ListResponse > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( failure : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Failure ( failure ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( data : ĠDevices ListResponse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSave Ġin Ġlocal ĠDB ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcrypto Store . save My Devices Info ( data . devices . or Empty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Success ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. execute By ( task Executor ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Live My Devices Info (): ĠLive Data < List < DeviceInfo >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcrypto Store . get Live My Devices Info () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget My Devices Info (): ĠList < DeviceInfo > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcrypto Store . get My Devices Info () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget DeviceInfo ( deviceId : ĠString , Ġcallback : ĠMatrix Callback < DeviceInfo >) Ġ{ ĊĠĠĠĠĠĠĠ Ġget DeviceInfo Task ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. configure With ( GetDevice Info Task . Params ( deviceId )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . execution Thread Ġ= ĠTask Thread . CRYPTO ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . callback Ġ= Ġcallback ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. execute By ( task Executor ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġinbound Group Sessions Count ( only Back ed Up : ĠBoolean ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcrypto Store . inbound Group Sessions Count ( only Back ed Up ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠProvides Ġthe Ġtracking Ġstatus ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param ĠuserId Ġthe Ġuser Ġid ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġtracking Ġstatus ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġget Device Tracking Status ( userId : ĠString ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcrypto Store . getDevice Tracking Status ( userId , ĠDevice List Manager . TRACK ING _ STATUS _ NOT _ TRACK ED ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTell Ġif Ġthe ĠMX Crypto Ġis Ġstarted ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġthe Ġcrypto Ġis Ġstarted ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġis Started (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġis Started . get () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTell s Ġif Ġthe ĠMX Crypto Ġis Ġstarting . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġthe Ġcrypto Ġis Ġstarting ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġis Starting (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġis Starting . get () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStart Ġthe Ġcrypto Ġmodule . ĊĠĠĠĠ Ġ* ĠDevice Ġkeys Ġwill Ġbe Ġuploaded , Ġthen Ġone Ġtime Ġkeys Ġif Ġthere Ġare Ġnot Ġenough Ġon Ġthe Ġhome server ĊĠĠĠĠ Ġ* Ġand , Ġthen , Ġif Ġthis Ġis Ġthe Ġfirst Ġtime , Ġthis Ġnew Ġdevice Ġwill Ġbe Ġanno unced Ġto Ġall Ġother Ġusers ĊĠĠĠĠ Ġ* Ġdevices . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġstart () Ġ{ ĊĠĠĠĠĠĠĠ Ġcrypto Coroutine Scope . launch ( coroutine Dispatch ers . crypto ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinternal Start () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠJust Ġupdate ĊĠĠĠĠĠĠĠ Ġfetch Devices List ( No Op Matrix Callback ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġensure Device () Ġ{ ĊĠĠĠĠĠĠĠ Ġcrypto Coroutine Scope . launch To Callback ( coroutine Dispatch ers . crypto , ĠNo Op Matrix Callback ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOpen Ġthe Ġstore ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcrypto Store . open () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthis Ġcan Ġthrow Ġif Ġno Ġnetwork ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry OrNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupload Device Keys () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġone Time Keys Uploader . maybe Upload One Time Keys () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthis Ġcan Ġthrow Ġif Ġno Ġbackup ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry OrNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeys Backup Service . check And Start Keys Backup () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Sync Will Process ( is Initial Sync : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcrypto Coroutine Scope . launch ( coroutine Dispatch ers . crypto ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Initial Sync ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOn Ġinitial Ġsync , Ġwe Ġstart Ġall Ġour Ġtracking Ġfrom ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġscratch , Ġso Ġmark Ġeverything Ġas Ġun tracked . Ġon Crypto Event Ġwill ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbe Ġcalled Ġfor Ġall Ġe 2 e Ġrooms Ġduring Ġthe Ġprocessing Ġof Ġthe Ġsync , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġat Ġwhich Ġpoint Ġwe 'll Ġstart Ġtracking Ġall Ġthe Ġusers Ġof Ġthat Ġroom . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice List Manager . invalidate All Device Lists () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġalways Ġtrack Ġmy Ġdevices ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice List Manager . start Tracking Device List ( listOf ( userId )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice List Manager . refresh Out dated Device Lists () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( failure : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( failure , Ġ" ## ĠCR YPTO Ġon Sync Will Process Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinternal Start () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Started . get () Ġ|| Ġis Starting . get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis Starting . set ( true ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠOpen Ġthe Ġstore ĊĠĠĠĠĠĠĠ Ġcrypto Store . open () ĊĊĠĠĠĠĠĠĠ Ġrun Catch ing Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Initial Sync ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġrefresh Ġthe Ġdevices Ġlist Ġfor Ġeach Ġknown Ġroom Ġmembers Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice List Manager . invalidate All Device Lists () Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice List Manager . refresh Out dated Device Lists () Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhy Ġwould Ġwe Ġdo Ġthat ? Ġit Ġwill Ġbe Ġcalled Ġat Ġend Ġof Ġsyn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġincoming Go ssip ing Request Manager . process Received Go ssip ing Requests () Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. fold ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Starting . set ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Started . set ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Starting . set ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Started . set ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( it , Ġ" Start Ġfailed ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠClose Ġthe Ġcrypto ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġclose () Ġ= Ġrun Blocking ( coroutine Dispatch ers . crypto ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcrypto Coroutine Scope . coroutine Context . cancel Children ( Cancellation Exception (" Closing Ġcrypto Ġmodule ")) ĊĊĠĠĠĠĠĠĠ Ġol m Device . release () ĊĠĠĠĠĠĠĠ Ġcrypto Store . close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠA ways Ġenabled Ġon ĠR iot X ĊĠĠĠ Ġoverride Ġfun Ġis Crypto Enabled () Ġ= Ġtrue ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return Ġthe ĠKeys Ġbackup ĠService ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġkeys Backup Service () Ġ= Ġkeys Backup Service ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return Ġthe ĠVerification Service ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġverification Service () Ġ= Ġverification Service ĊĊĠĠĠ Ġoverride Ġfun Ġcross Signing Service () Ġ= Ġcross Signing Service ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġsync Ġresponse Ġhas Ġbeen Ġreceived ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġsync Response Ġthe Ġsync Response ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġon Sync Completed ( sync Response : ĠSync Response ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcrypto Coroutine Scope . launch ( coroutine Dispatch ers . crypto ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sync Response . device Lists Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice List Manager . handle Device Lists Changes ( sync Response . device Lists . changed , Ġsync Response . device Lists . left ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sync Response . device One Time Keys Count Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Count Ġ= Ġsync Response . device One Time Keys Count . signed Curve 2 5 5 1 9 Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġone Time Keys Uploader . update One Time Key Count ( current Count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Started ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMake Ġsure Ġwe Ġprocess Ġto - device Ġmessages Ġbefore Ġgenerating Ġnew Ġone - time - keys Ġ# 2 7 8 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice List Manager . refresh Out dated Device Lists () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġone Time Keys Uploader . maybe Upload One Time Keys () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġincoming Go ssip ing Request Manager . process Received Go ssip ing Requests () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFind Ġa Ġdevice Ġby Ġcurve 2 5 5 1 9 Ġidentity Ġkey ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġsender Key Ġthe Ġcurve 2 5 5 1 9 Ġkey Ġto Ġmatch . ĊĠĠĠĠ Ġ* Ġ@ param Ġalgorithm Ġthe Ġencryption Ġalgorithm . ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġdevice Ġinfo , Ġor Ġnull Ġif Ġnot Ġfound Ġ/ Ġunsupported Ġalgorithm Ġ/ Ġcrypto Ġreleased ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġdevice With Identity Key ( sender Key : ĠString , Ġalgorithm : ĠString ): ĠCrypto DeviceInfo ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( algorithm Ġ!= ĠMX CRYPTO _ ALGORITHM _ ME G OL M Ġ&& Ġalgorithm Ġ!= ĠMX CRYPTO _ ALGORITHM _ OL M ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġonly Ġdeal Ġin Ġol m Ġkeys ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġcrypto Store . device With Identity Key ( sender Key ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠProvides Ġthe Ġdevice Ġinformation Ġfor Ġa Ġuser Ġid Ġand Ġa Ġdevice ĠId ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param ĠuserId ĠĠ Ġthe Ġuser Ġid ĊĠĠĠĠ Ġ* Ġ@ param ĠdeviceId Ġthe Ġdevice Ġid ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġget DeviceInfo ( userId : ĠString , ĠdeviceId : ĠString ?): ĠCrypto DeviceInfo ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( userId . isNotEmpty () Ġ&& Ġ! deviceId . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcrypto Store . getUser Device ( userId , ĠdeviceId ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Crypto DeviceInfo ( userId : ĠString ): ĠList < Crypto DeviceInfo > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcrypto Store . getUser Device List ( userId ). or Empty () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Live Crypto DeviceInfo (): ĠLive Data < List < Crypto DeviceInfo >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcrypto Store . get Live Device List () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Live Crypto DeviceInfo ( userId : ĠString ): ĠLive Data < List < Crypto DeviceInfo >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcrypto Store . get Live Device List ( userId ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Live Crypto DeviceInfo ( user Ids : ĠList < String >): ĠLive Data < List < Crypto DeviceInfo >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcrypto Store . get Live Device List ( user Ids ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġthe Ġdevices Ġas Ġknown ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġdevices Ġ Ġthe Ġdevices . ĠNote Ġthat Ġthe Ġverified Ġmember Ġof Ġthe Ġdevices Ġin Ġthis Ġlist Ġwill Ġnot Ġbe Ġupdated Ġby Ġthis Ġmethod . ĊĠĠĠĠ Ġ* Ġ@ param Ġcallback Ġthe Ġasynchronous Ġcallback ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġset Devices Known ( devices : ĠList < MX DeviceInfo >, Ġcallback : ĠMatrix Callback < Unit > ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġbuild Ġa Ġdevices Ġmap ĊĠĠĠĠĠĠĠ Ġval Ġdevices IdList By UserId Ġ= Ġdevices . groupBy ({ Ġit . userId Ġ}, Ġ{ Ġit . deviceId Ġ}) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ(( userId , Ġdevice Ids ) Ġin Ġdevices IdList By UserId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstored Device IDs Ġ= Ġcrypto Store . getUser Devices ( userId ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsanity Ġchecks ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( null Ġ!= Ġstored Device IDs ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġis Updated Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Ids . forEach Ġ{ ĠdeviceId Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdevice Ġ= Ġstored Device IDs [ deviceId ] ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġassume Ġif Ġthe Ġdevice Ġis Ġeither Ġverified Ġor Ġblocked ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġit Ġmeans Ġthat Ġthe Ġdevice Ġis Ġknown ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( device ?. is Unknown Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice . trust Level Ġ= ĠDevice Trust Level ( cross Signing Verified Ġ= Ġfalse , Ġlocally Verified Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Updated Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Updated ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcrypto Store . store User Devices ( userId , Ġstored Device IDs ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcallback ?. on Success ( Unit ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUpdate Ġthe Ġblocked / verified Ġstate Ġof Ġthe Ġgiven Ġdevice . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġtrust Level Ġthe Ġnew Ġtrust Ġlevel ĊĠĠĠĠ Ġ* Ġ@ param ĠuserId ĠĠĠĠ Ġthe Ġowner Ġof Ġthe Ġdevice ĊĠĠĠĠ Ġ* Ġ@ param ĠdeviceId ĠĠ Ġthe Ġunique Ġidentifier Ġfor Ġthe Ġdevice . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġset Device Verification ( trust Level : ĠDevice Trust Level , ĠuserId : ĠString , ĠdeviceId : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġset Device Verification Action . handle ( trust Level , ĠuserId , ĠdeviceId ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConfigure Ġa Ġroom Ġto Ġuse Ġencryption . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġroom Id ĠĠĠĠĠĠĠĠĠĠĠĠ Ġthe Ġroom Ġid Ġto Ġenable Ġencryption Ġin . ĊĠĠĠĠ Ġ* Ġ@ param Ġalgorithm ĠĠĠĠĠĠĠĠĠ Ġthe Ġencryption Ġconfig Ġfor Ġthe Ġroom . ĊĠĠĠĠ Ġ* Ġ@ param Ġin hibit Device Query Ġtrue Ġto Ġsuppress Ġdevice Ġlist Ġquery Ġfor Ġusers Ġin Ġthe Ġroom Ġ( for Ġnow ) ĊĠĠĠĠ Ġ* Ġ@ param Ġmembers Id ĠĠĠĠĠĠĠĠĠ Ġlist Ġof Ġmembers Ġto Ġstart Ġtracking Ġtheir Ġdevices ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġthe Ġoperation Ġsucceeds . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġset Encryption In Room ( roomId : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalgorithm : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin hibit Device Query : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmembers Id : ĠList < String >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġwe Ġalready Ġhave Ġencryption Ġin Ġthis Ġroom , Ġwe Ġshould Ġignore Ġthis Ġevent ĊĠĠĠĠĠĠĠ Ġ// Ġ( for Ġnow Ġat Ġleast . ĠMaybe Ġwe Ġshould Ġalert Ġthe Ġuser Ġsomehow ?) ĊĠĠĠĠĠĠĠ Ġval Ġexisting Algorithm Ġ= Ġcrypto Store . get Room Algorithm ( roomId ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! existing Algorithm . isNull OrEmpty () Ġ&& Ġexisting Algorithm Ġ!= Ġalgorithm ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e (" ## ĠCR YPTO Ġ| Âł set Encryption In Room () Ġ: ĠIgn oring Ġm . room . encryption Ġevent Ġwhich Ġrequests Ġa Ġchange Ġof Ġconfig Ġin Ġ$ roomId ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġencrypt ing Class Ġ= ĠMX Crypto Algorithms . has Encrypt or Class For Algorithm ( algorithm ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! encrypt ing Class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e (" ## ĠCR YPTO Ġ| Âł set Encryption In Room () Ġ: ĠUnable Ġto Ġencrypt Ġroom Ġ$ roomId Ġwith Ġ$ algorithm ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcrypto Store . store Room Algorithm ( roomId , Ġalgorithm !! ) ĊĊĠĠĠĠĠĠĠ Ġval Ġalg : ĠI MX Encrypt ing Ġ= Ġwhen Ġ( algorithm ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMX CRYPTO _ ALGORITHM _ ME G OL M Ġ-> Ġmeg ol m Encryption Factory . create ( roomId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġol m Encryption Factory . create ( roomId ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġroom Encrypt ors Store . put ( roomId , Ġalg ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġif Ġencryption Ġwas Ġnot Ġpreviously Ġenabled Ġin Ġthis Ġroom , Ġwe Ġwill Ġhave Ġbeen ĊĠĠĠĠĠĠĠ Ġ// Ġignoring Ġnew Ġdevice Ġevents Ġfor Ġthese Ġusers Ġso Ġfar . ĠWe Ġmay Ġwell Ġhave ĊĠĠĠĠĠĠĠ Ġ// Ġup - to - date Ġlists Ġfor Ġsome Ġusers , Ġfor Ġinstance Ġif Ġwe Ġwere Ġsharing Ġother ĊĠĠĠĠĠĠĠ Ġ// Ġe 2 e Ġrooms Ġwith Ġthem , Ġso Ġthere Ġis Ġroom Ġfor Ġoptim isation Ġhere , Ġbut Ġfor Ġnow ĊĠĠĠĠĠĠĠ Ġ// Ġwe Ġjust Ġinvalidate Ġeveryone Ġin Ġthe Ġroom . ĊĠĠĠĠĠĠĠ Ġif Ġ( null Ġ== Ġexisting Algorithm ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . v (" En abling Ġencryption Ġin Ġ$ roomId Ġfor Ġthe Ġfirst Ġtime ; Ġinvalid ating Ġdevice Ġlists Ġfor Ġall Ġusers Ġthere in ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Ids Ġ= ĠArrayList ( members Id ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdevice List Manager . start Tracking Device List ( user Ids ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! in hibit Device Query ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice List Manager . refresh Out dated Device Lists () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTell s Ġif Ġa Ġroom Ġis Ġencrypted Ġwith ĠMX CRYPTO _ ALGORITHM _ ME G OL M ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġroom Id Ġthe Ġroom Ġid ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġthe Ġroom Ġis Ġencrypted Ġwith Ġalgorithm ĠMX CRYPTO _ ALGORITHM _ ME G OL M ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġis Room Encrypted ( roomId : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġencryption Event Ġ= Ġmon arch y . fetch Copied Ġ{ Ġrealm Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEvent Entity . where Type ( realm , Ġroom Id Ġ= Ġroom Id , Ġtype Ġ= ĠEventType . STATE _ ROOM _ ENCRYPT ION ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. contains ( Event Entity Fields . CONTENT , Ġ"\" algorithm \":\" $ MX CRYPTO _ ALGORITHM _ ME G OL M \" ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. findFirst () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġencryption Event Ġ!= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġstored Ġdevice Ġkeys Ġfor Ġa Ġuser . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun ĠgetUser Devices ( userId : ĠString ): ĠMutable List < Crypto DeviceInfo > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcrypto Store . getUser Devices ( userId )?. values ?. to Mutable List () Ġ?: ĠArrayList () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Encryption Enabled For Inv ited User (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġm xC rypto Config . enable Encryption For Inv ited Members ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Encryption Algorithm ( roomId : ĠString ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcrypto Store . get Room Algorithm ( roomId ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDetermine Ġwhether Ġwe Ġshould Ġencrypt Ġmessages Ġfor Ġinv ited Ġusers Ġin Ġthis Ġroom . ĊĠĠĠĠ Ġ* Ġ< p > ĊĠĠĠĠ Ġ* ĠCheck Ġhere Ġwhether Ġthe Ġinv ited Ġmembers Ġare Ġallowed Ġto Ġread Ġmessages Ġin Ġthe Ġroom Ġhistory ĊĠĠĠĠ Ġ* Ġfrom Ġthe Ġpoint Ġthey Ġwere Ġinv ited Ġon wards . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġwe Ġshould Ġencrypt Ġmessages Ġfor Ġinv ited Ġusers . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġshould Encrypt For Inv ited Members ( roomId : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcrypto Store . should Encrypt For Inv ited Members ( roomId ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEncrypt Ġan Ġevent Ġcontent Ġaccording Ġto Ġthe Ġconfiguration Ġof Ġthe Ġroom . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġevent Content Ġthe Ġcontent Ġof Ġthe Ġevent . ĊĠĠĠĠ Ġ* Ġ@ param ĠeventType ĠĠĠ Ġthe Ġtype Ġof Ġthe Ġevent . ĊĠĠĠĠ Ġ* Ġ@ param Ġroom Id ĠĠĠĠĠĠ Ġthe Ġroom Ġidentifier Ġthe Ġevent Ġwill Ġbe Ġsent . ĊĠĠĠĠ Ġ* Ġ@ param Ġcallback ĠĠĠĠ Ġthe Ġasynchronous Ġcallback ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġencrypt Event Content ( event Content : ĠContent , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠeventType : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroom Id : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback : ĠMatrix Callback < MX Encrypt Event Content Result >) Ġ{ ĊĠĠĠĠĠĠĠ Ġcrypto Coroutine Scope . launch ( coroutine Dispatch ers . crypto ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Started ()) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . v (" ## ĠCR YPTO Ġ| Âł encrypt Event Content () Ġ: Ġwait Ġafter Ġe 2 e Ġinit ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinternal Start ( false ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Ids Ġ= Ġget Room User Ids ( roomId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġalg Ġ= Ġroom Encrypt ors Store . get ( roomId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( alg Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalgorithm Ġ= Ġget Encryption Algorithm ( roomId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( algorithm Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( set Encryption In Room ( roomId , Ġalgorithm , Ġfalse , Ġuser Ids )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalg Ġ= Ġroom Encrypt ors Store . get ( roomId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsafe Algorithm Ġ= Ġalg ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( safe Algorithm Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġt 0 Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . v (" ## ĠCR YPTO Ġ| Âł encrypt Event Content () Ġstarts ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Ġ= Ġsafe Algorithm . encrypt Event Content ( event Content , ĠeventType , Ġuser Ids ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . v (" ## ĠCR YPTO Ġ| Âł encrypt Event Content () Ġ: Ġsucceeds Ġafter Ġ${ System . currentTimeMillis () Ġ- Ġt 0 } Ġms ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMX Encrypt Event Content Result ( content , ĠEventType . ENCRYPT ED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. fold To Callback ( callback ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalgorithm Ġ= Ġget Encryption Algorithm ( roomId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreason Ġ= ĠString . format ( MX Crypto Error . UN ABLE _ TO _ ENCRYPT _ REASON , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalgorithm Ġ?: ĠMX Crypto Error . NO _ MORE _ ALGORITHM _ REASON ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e (" ## ĠCR YPTO Ġ| Âł encrypt Event Content () Ġ: Ġ$ reason ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Failure ( Failure . Crypto Error ( MX Crypto Error . Base ( MX Crypto Error . ErrorType . UN ABLE _ TO _ ENCRYPT , Ġreason ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdiscard Outbound Session ( roomId : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcrypto Coroutine Scope . launch ( coroutine Dispatch ers . crypto ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroom Encrypt ors Store . get ( roomId )?. discard Session Key () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDecrypt Ġan Ġevent ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġevent ĠĠĠ Ġthe Ġraw Ġevent . ĊĠĠĠĠ Ġ* Ġ@ param Ġtimeline Ġthe Ġid Ġof Ġthe Ġtimeline Ġwhere Ġthe Ġevent Ġis Ġdecrypted . ĠIt Ġis Ġused Ġto Ġprevent Ġreplay Ġattack . ĊĠĠĠĠ Ġ* Ġ@ return Ġthe ĠMX Event De cryption Result Ġdata , Ġor Ġthrow Ġin Ġcase Ġof Ġerror ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( MX Crypto Error :: class ) ĊĠĠĠ Ġoverride Ġfun Ġdecrypt Event ( event : ĠEvent , Ġtimeline : ĠString ): ĠMX Event De cryption Result Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġinternal Decrypt Event ( event , Ġtimeline ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDecrypt Ġan Ġevent Ġasynchronously ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġevent ĠĠĠ Ġthe Ġraw Ġevent . ĊĠĠĠĠ Ġ* Ġ@ param Ġtimeline Ġthe Ġid Ġof Ġthe Ġtimeline Ġwhere Ġthe Ġevent Ġis Ġdecrypted . ĠIt Ġis Ġused Ġto Ġprevent Ġreplay Ġattack . ĊĠĠĠĠ Ġ* Ġ@ param Ġcallback Ġthe Ġcallback Ġto Ġreturn Ġdata Ġor Ġnull ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġdecrypt Event Async ( event : ĠEvent , Ġtimeline : ĠString , Ġcallback : ĠMatrix Callback < MX Event De cryption Result >) Ġ{ ĊĠĠĠĠĠĠĠ Ġcrypto Coroutine Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( coroutine Dispatch ers . crypto ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinternal Decrypt Event ( event , Ġtimeline ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . fold To Callback ( callback ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDecrypt Ġan Ġevent ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġevent ĠĠĠ Ġthe Ġraw Ġevent . ĊĠĠĠĠ Ġ* Ġ@ param Ġtimeline Ġthe Ġid Ġof Ġthe Ġtimeline Ġwhere Ġthe Ġevent Ġis Ġdecrypted . ĠIt Ġis Ġused Ġto Ġprevent Ġreplay Ġattack . ĊĠĠĠĠ Ġ* Ġ@ return Ġthe ĠMX Event De cryption Result Ġdata , Ġor Ġnull Ġin Ġcase Ġof Ġerror ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( MX Crypto Error :: class ) ĊĠĠĠ Ġprivate Ġfun Ġinternal Decrypt Event ( event : ĠEvent , Ġtimeline : ĠString ): ĠMX Event De cryption Result Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġevent Content Ġ= Ġevent . content ĊĠĠĠĠĠĠĠ Ġif Ġ( event Content Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e (" ## ĠCR YPTO Ġ| Âł decrypt Event Ġ: Ġempty Ġevent Ġcontent ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠMX Crypto Error . Base ( MX Crypto Error . ErrorType . BAD _ ENCRYPT ED _ MESSAGE , ĠMX Crypto Error . BAD _ ENCRYPT ED _ MESSAGE _ REASON ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalgorithm Ġ= Ġevent Content [" algorithm "] ?. toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalg Ġ= Ġroom Decrypt or Provider . get OrCreate Room Decrypt or ( event . roomId , Ġalgorithm ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( alg Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreason Ġ= ĠString . format ( MX Crypto Error . UN ABLE _ TO _ DE CRYPT _ REASON , Ġevent . eventId , Ġalgorithm ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e (" ## ĠCR YPTO Ġ| Âł decrypt Event () Ġ: Ġ$ reason ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠMX Crypto Error . Base ( MX Crypto Error . ErrorType . UN ABLE _ TO _ DE CRYPT , Ġreason ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġalg . decrypt Event ( event , Ġtimeline ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( mx Crypto Error : ĠMX Crypto Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" ## ĠCR YPTO Ġ| Âł internal Decrypt Event Ġ: ĠFailed Ġto Ġdecrypt Ġ${ event . eventId } Ġreason : Ġ$ mx Crypto Error ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( algorithm Ġ== ĠMX CRYPTO _ ALGORITHM _ OL M ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mx Crypto Error Ġis ĠMX Crypto Error . Base ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġm xC rypto Error . error Type Ġ== ĠMX Crypto Error . ErrorType . BAD _ ENCRYPT ED _ MESSAGE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġneed Ġto Ġfind Ġsending Ġdevice ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġol m Content Ġ= Ġevent . content . to Model < O lm Event Content >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcrypto Store . getUser Devices ( event . sender Id Ġ?: Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . values ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . first OrNull Ġ{ Ġit . identity Key () Ġ== Ġol m Content ?. sender Key Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmark O lm Session For Un wed ging ( event . sender Id Ġ?: Ġ"", Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . v (" ## ĠCR YPTO Ġ| Âł mark O lm Session For Un wed ging () Ġ: ĠFailed Ġto Ġfind Ġsender Ġcrypto Ġdevice ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġm xC rypto Error ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReset Ġreplay Ġattack Ġdata Ġfor Ġthe Ġgiven Ġtimeline . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġtimeline Id Ġthe Ġtimeline Ġid ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġreset Replay Attack Check In Timeline ( timeline Id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġol m Device . reset Replay Attack Check In Timeline ( timeline Id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHandle Ġthe Ġ' to Device ' Ġevent ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġevent Ġthe Ġevent ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġon To Device Event ( event : ĠEvent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġevent Ġhave Ġalready Ġbeen Ġdecrypted ĊĠĠĠĠĠĠĠ Ġcrypto Coroutine Scope . launch ( coroutine Dispatch ers . crypto ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( event . get Clear Type ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEventType . ROOM _ KEY , ĠEventType . FOR WAR DED _ ROOM _ KEY Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcrypto Store . save Go ssip ing Event ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠKeys Ġare Ġimported Ġdirectly , Ġnot Ġwaiting Ġfor Ġend Ġof Ġsync ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Room KeyEvent ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEventType . REQUEST _ SECRET , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEventType . ROOM _ KEY _ REQUEST ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsave Ġaudit Ġtrail ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcrypto Store . save Go ssip ing Event ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRequests Ġare Ġstack ed , Ġand Ġwill Ġbe Ġhandled Ġone Ġby Ġone Ġat Ġthe Ġend Ġof Ġthe Ġsync Ġ( on Sync Complete ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġincoming Go ssip ing Request Manager . on Go ssip ing Request Event ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEventType . SEND _ SECRET ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcrypto Store . save Go ssip ing Event ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Secret Send Received ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEventType . ROOM _ KEY _ WITH HE LD ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Key With Hel d Received ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġignore ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHandle Ġa Ġkey Ġevent . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġevent Ġthe Ġkey Ġevent . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġon Room KeyEvent ( event : ĠEvent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġroom Key Content Ġ= Ġevent . get Clear Content (). to Model < Room Key Content >() Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ ĠTim ber . v (" ## ĠCR YPTO Ġ| Âł GO SS IP Ġon Room KeyEvent () Ġ: Ġtype < ${ event . type }> Ġ, ĠsessionId < ${ room Key Content . sessionId }> ") ĊĠĠĠĠĠĠĠ Ġif Ġ( room Key Content . roomId . isNull OrEmpty () Ġ|| Ġroom Key Content . algorithm . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e (" ## ĠCR YPTO Ġ| Âł GO SS IP Ġon Room KeyEvent () Ġ: Ġmissing Ġfields ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġalg Ġ= Ġroom Decrypt or Provider . get OrCreate Room Decrypt or ( room Key Content . roomId , Ġroom Key Content . algorithm ) ĊĠĠĠĠĠĠĠ Ġif Ġ( alg Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e (" ## ĠCR YPTO Ġ| Âł GO SS IP Ġon Room KeyEvent () Ġ: ĠUnable Ġto Ġhandle Ġkeys Ġfor Ġ${ room Key Content . algorithm }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġalg . on Room KeyEvent ( event , Ġkeys Backup Service ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Key With Hel d Received ( event : ĠEvent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwith Hel d Content Ġ= Ġevent . get Clear Content (). to Model < Room Key With Hel d Content >() Ġ?: Ġreturn ĠUnit . also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e (" ## ĠCR YPTO Ġ| Âł Malformed Ġon Key With Hel d Received () Ġ: Ġmissing Ġfields ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠTim ber . d (" ## ĠCR YPTO Ġ| Ġon Key With Hel d Received () Ġreceived Ġ: Ġcontent Ġ<$ with Hel d Content >") ĊĠĠĠĠĠĠĠ Ġval Ġalg Ġ= Ġroom Decrypt or Provider . get OrCreate Room Decrypt or ( with Hel d Content . roomId , Ġwith Hel d Content . algorithm ) ĊĠĠĠĠĠĠĠ Ġif Ġ( alg Ġis ĠI MX With Hel d Extension ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalg . on Room Key With Hel d Event ( with Hel d Content ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e (" ## ĠCR YPTO Ġ| Ġon Key With Hel d Received () Ġ: ĠUnable Ġto Ġhandle ĠWith Hel d Content Ġfor Ġ${ with Hel d Content . algorithm }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Secret Send Received ( event : ĠEvent ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . i (" ## ĠCR YPTO Ġ| Âł GO SS IP Ġon Secret Send () Ġ: Ġon Secret Send Received Ġ${ event . content ?. get (" sender _ key ") }") ĊĠĠĠĠĠĠĠ Ġif Ġ(! event . is Encrypted ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsecret Ġsend Ġmessages Ġmust Ġbe Ġencrypted ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e (" ## ĠCR YPTO Ġ| Âł GO SS IP Ġon Secret Send () Ġ: Received Ġun encrypted Ġsecret Ġsend Ġevent ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠWas Ġthat Ġsent Ġby Ġus ? ĊĠĠĠĠĠĠĠ Ġif Ġ( event . sender Id Ġ!= ĠuserId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e (" ## ĠCR YPTO Ġ| Âł GO SS IP Ġon Secret Send () Ġ: ĠIgnore Ġsecret Ġfrom Ġother Ġuser Ġ${ event . sender Id }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsecret Content Ġ= Ġevent . get Clear Content (). to Model < Secret Send Event Content >() Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġexisting Request Ġ= Ġcrypto Store ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Outgoing SecretKey Requests (). first OrNull Ġ{ Ġit . requestId Ġ== Ġsecret Content . requestId Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( existing Request Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" ## ĠCR YPTO Ġ| Âł GO SS IP Ġon Secret Send () Ġ: ĠIgnore Ġsecret Ġthat Ġwas Ġnot Ġrequested : Ġ${ secret Content . requestId }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! handle SDK Level Go ssip ( existing Request . secret Name , Ġsecret Content . secret Value )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO ĠAsk Ġto Ġapplication Ġlayer ? ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . v (" ## ĠCR YPTO Ġ| Âł on Secret Send () Ġ: Ġsecret Ġnot Ġhandled Ġby ĠSDK ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġtrue Ġif Ġhandled Ġby ĠSDK , Ġotherwise Ġshould Ġbe Ġsent Ġto Ġapplication Ġlayer ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġhandle SDK Level Go ssip ( secret Name : ĠString ?, Ġsecret Value : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( secret Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMASTER _ KEY _ SSSS _ NAME ĠĠĠĠĠĠ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcross Signing Service . on Secret MSK Go ssip ( secret Value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS ELF _ SIGN ING _ KEY _ SSSS _ NAME Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcross Signing Service . on Secret SS K Go ssip ( secret Value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUSER _ SIGN ING _ KEY _ SSSS _ NAME Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcross Signing Service . on Secret US K Go ssip ( secret Value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKEY BACKUP _ SECRET _ SSSS _ NAME Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeys Backup Service . on SecretKey Go ssip ( secret Value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHandle Ġan Ġm . room . encryption Ġevent . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġevent Ġthe Ġencryption Ġevent . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġon Room Encryption Event ( roomId : ĠString , Ġevent : ĠEvent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcrypto Coroutine Scope . launch ( coroutine Dispatch ers . crypto ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparams Ġ= ĠLoad Room Members Task . Params ( roomId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Room Members Task . execute ( params ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( throwable : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( throwable , Ġ" ## ĠCR YPTO Ġ| Âł on Room Encryption Event ĠERROR ĠFAILED ĠTO ĠSET UP ĠCR YPTO Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Ids Ġ= Ġget Room User Ids ( roomId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Encryption In Room ( roomId , Ġevent . content ?. get (" algorithm ") ?. toString (), Ġtrue , Ġuser Ids ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Room User Ids ( roomId : ĠString ): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġuser Ids : ĠList < String > Ġ= Ġempty List () ĊĠĠĠĠĠĠĠ Ġmon arch y . do With Realm Ġ{ Ġrealm Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġwhether Ġthe Ġevent Ġcontent Ġmust Ġbe Ġencrypted Ġfor Ġthe Ġinv ited Ġmembers . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġencrypt For Inv ited Members Ġ= Ġis Encryption Enabled For Inv ited User () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġshould Encrypt For Inv ited Members ( roomId ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Ids Ġ= Ġif Ġ( encrypt For Inv ited Members ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRoom Member Helper ( realm , Ġroom Id ). getActive Room Member Ids () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRoom Member Helper ( realm , Ġroom Id ). get Joined Room Member Ids () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġuser Ids ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHandle Ġa Ġchange Ġin Ġthe Ġmembership Ġstate Ġof Ġa Ġmember Ġof Ġa Ġroom . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġevent Ġthe Ġmembership Ġevent Ġcausing Ġthe Ġchange ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġon Room Membership Event ( roomId : ĠString , Ġevent : ĠEvent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġroom Encrypt ors Store . get ( roomId ) Ġ?: Ġ/* ĠNo Ġencrypt ing Ġin Ġthis Ġroom Ġ*/ Ġreturn ĊĊĠĠĠĠĠĠĠ Ġevent . state Key ?. let Ġ{ ĠuserId Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroom Member : ĠRoom Member Content ? Ġ= Ġevent . content . to Model () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmembership Ġ= Ġroom Member ?. membership ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( membership Ġ== ĠMembers hip . JOIN ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmake Ġsure Ġwe Ġare Ġtracking Ġthe Ġdevice List Ġfor Ġthis Ġuser . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice List Manager . start Tracking Device List ( listOf ( userId )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( membership Ġ== ĠMembers hip . INV ITE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġshould Encrypt For Inv ited Members ( roomId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġis Encryption Enabled For Inv ited User ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtrack Ġthe Ġdevice List Ġfor Ġthis Ġinv ited Ġuser . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCa ution : Ġthere 's Ġa Ġbig Ġedge Ġcase Ġhere Ġin Ġthat Ġf ederated Ġservers Ġdo Ġnot ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġknow Ġwhat Ġother Ġservers Ġare Ġin Ġthe Ġroom Ġat Ġthe Ġtime Ġthey 've Ġbeen Ġinv ited . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThey Ġtherefore Ġwill Ġnot Ġsend Ġdevice Ġupdates Ġif Ġa Ġuser Ġlogs Ġin Ġwh il st ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtheir Ġstate Ġis Ġinvite . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice List Manager . start Tracking Device List ( listOf ( userId )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Room History Visibility Event ( roomId : ĠString , Ġevent : ĠEvent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġevent Content Ġ= Ġevent . content . to Model < Room History Visibility Content >() ĊĠĠĠĠĠĠĠ Ġevent Content ?. history Visibility ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcrypto Store . set Should Encrypt For Inv ited Members ( roomId , Ġit Ġ!= ĠRoom History Visibility . JOIN ED ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUpload Ġmy Ġuser 's Ġdevice Ġkeys . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġupload Device Keys () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( crypto Store . getDevice Keys Uploaded ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Keys Ġalready Ġuploaded , Ġnothing Ġto Ġdo ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠPrepare Ġthe Ġdevice Ġkeys Ġdata Ġto Ġsend ĊĠĠĠĠĠĠĠ Ġ// ĠSign Ġit ĊĠĠĠĠĠĠĠ Ġval Ġcanonical Json Ġ= ĠJson Canonical izer . getCanonical Json ( Map :: class . java , Ġget My Device (). signal able JSON Dictionary ()) ĊĠĠĠĠĠĠĠ Ġvar Ġrest Ġ= Ġget My Device (). to Rest () ĊĊĠĠĠĠĠĠĠ Ġrest Ġ= Ġrest . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsignatures Ġ= Ġobject Signer . sign Object ( canonical Json ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġupload Device Keys Params Ġ= ĠUpload Keys Task . Params ( rest , Ġnull ) ĊĠĠĠĠĠĠĠ Ġupload Keys Task . execute ( upload Device Keys Params ) ĊĊĠĠĠĠĠĠĠ Ġcrypto Store . set Device Keys Uploaded ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠExport Ġthe Ġcrypto Ġkeys ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġpassword Ġthe Ġpassword ĊĠĠĠĠ Ġ* Ġ@ param Ġcallback Ġthe Ġexported Ġkeys ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġexport Room Keys ( password : ĠString , Ġcallback : ĠMatrix Callback < ByteArray >) Ġ{ ĊĠĠĠĠĠĠĠ Ġcrypto Coroutine Scope . launch ( coroutine Dispatch ers . main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexport Room Keys ( password , ĠMX Me gol m Export Encryption . DEFAULT _ ITER ATION _ COUNT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. fold To Callback ( callback ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠExport Ġthe Ġcrypto Ġkeys ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġpassword ĠĠĠĠĠĠĠĠ Ġthe Ġpassword ĊĠĠĠĠ Ġ* Ġ@ param Ġan Iteration Count Ġthe Ġencryption Ġiteration Ġcount Ġ( 0 Ġmeans Ġno Ġencryption ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġexport Room Keys ( password : ĠString , Ġan Iteration Count : ĠInt ): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Context ( coroutine Dispatch ers . crypto ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġiteration Count Ġ= Ġmax ( 0 , Ġan Iteration Count ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexported Sessions Ġ= Ġcrypto Store . get Inbound Group Sessions (). map NotNull Ġ{ Ġit . export Keys () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadapter Ġ= ĠM oshi Provider . provides M oshi () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. adapter ( List :: class . java ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMX Me gol m Export Encryption . encrypt Me gol m Key File ( adapter . toJson ( exported Sessions ), Ġpassword , Ġiteration Count ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠImport Ġthe Ġroom Ġkeys ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġroom Keys As Array Ġ Ġthe Ġroom Ġkeys Ġas Ġarray . ĊĠĠĠĠ Ġ* Ġ@ param Ġpassword ĠĠĠĠĠĠĠĠ Ġthe Ġpassword ĊĠĠĠĠ Ġ* Ġ@ param Ġprogress Listener Ġthe Ġprogress Ġlistener ĊĠĠĠĠ Ġ* Ġ@ param Ġcallback ĠĠĠĠĠĠĠĠ Ġthe Ġasynchronous Ġcallback . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġimport Room Keys ( room Keys As Array : ĠByteArray , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpassword : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Listener : ĠProgress Listener ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback : ĠMatrix Callback < Import Room Keys Result >) Ġ{ ĊĠĠĠĠĠĠĠ Ġcrypto Coroutine Scope . launch ( coroutine Dispatch ers . main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( coroutine Dispatch ers . crypto ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . v (" ## ĠCR YPTO Ġ| Âł import Room Keys Ġstarts ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġt 0 Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroom Keys Ġ= ĠMX Me gol m Export Encryption . decrypt Me gol m Key File ( room Keys As Array , Ġpassword ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġt 1 Ġ= ĠSystem . currentTimeMillis () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . v (" ## ĠCR YPTO Ġ| Âł import Room Keys Ġ: Ġdecrypt Me gol m Key File Ġdone Ġin Ġ${ t 1 Ġ- Ġt 0 } Ġms ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimported Sessions Ġ= ĠM oshi Provider . provides M oshi () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. adapter < List < Me gol m Session Data >>( Types . new Parameterized Type ( List :: class . java , ĠMe gol m Session Data :: class . java )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. fromJson ( room Keys ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġt 2 Ġ= ĠSystem . currentTimeMillis () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . v (" ## ĠCR YPTO Ġ| Âł import Room Keys Ġ: ĠJSON Ġparsing Ġ${ t 2 Ġ- Ġt 1 } Ġms ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( imported Sessions Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Error ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeg ol m Session Data Importer . handle ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeg ol m Sessions Data Ġ= Ġimported Sessions , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Backup Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Listener Ġ= Ġprogress Listener ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. fold To Callback ( callback ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUpdate Ġthe Ġwarn Ġstatus Ġwhen Ġsome Ġunknown Ġdevices Ġare Ġdetected . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġwarn Ġtrue Ġto Ġwarn Ġwhen Ġsome Ġunknown Ġdevices Ġare Ġdetected . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġset Warn On Unknown Devices ( warn : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwarn On Unknown Devices Repository . set Warn On Unknown Devices ( warn ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCheck Ġif Ġthe Ġuser Ġids Ġlist Ġhave Ġsome Ġunknown Ġdevices . ĊĠĠĠĠ Ġ* ĠA Ġsuccess Ġmeans Ġthere Ġis Ġno Ġunknown Ġdevices . ĊĠĠĠĠ Ġ* ĠIf Ġthere Ġare Ġsome Ġunknown Ġdevices , Ġa ĠMX Crypto Error . Unknown Device Ġexception Ġis Ġtriggered . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġuser Ids Ġ Ġthe Ġuser Ġids Ġlist ĊĠĠĠĠ Ġ* Ġ@ param Ġcallback Ġthe Ġasynchronous Ġcallback . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcheck Unknown Devices ( user Ids : ĠList < String >, Ġcallback : ĠMatrix Callback < Unit >) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġforce Ġthe Ġrefresh Ġto Ġensure Ġthat Ġthe Ġdevices Ġlist Ġis Ġup - to - date ĊĠĠĠĠĠĠĠ Ġcrypto Coroutine Scope . launch ( coroutine Dispatch ers . crypto ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkeys Ġ= Ġdevice List Manager . download Keys ( user Ids , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġunknown Devices Ġ= Ġget Unknown Devices ( keys ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( unknown Devices . map . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtrigger Ġan Ġan Ġunknown Ġdevices Ġexception ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠFailure . Crypto Error ( MX Crypto Error . Unknown Device ( unknown Devices )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. fold To Callback ( callback ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġthe Ġglobal Ġoverride Ġfor Ġwhether Ġthe Ġclient Ġshould Ġever Ġsend Ġencrypted ĊĠĠĠĠ Ġ* Ġmessages Ġto Ġun verified Ġdevices . ĊĠĠĠĠ Ġ* ĠIf Ġfalse , Ġit Ġcan Ġstill Ġbe Ġoverridden Ġper - room . ĊĠĠĠĠ Ġ* ĠIf Ġtrue , Ġit Ġoverrides Ġthe Ġper - room Ġsettings . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġblock ĠĠĠ Ġtrue Ġto Ġun il ater ally Ġblacklist Ġall ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġset Global Black list Un verified Devices ( block : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcrypto Store . set Global Black list Un verified Devices ( block ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTell s Ġwhether Ġthe Ġclient Ġshould Ġever Ġsend Ġencrypted Ġmessages Ġto Ġun verified Ġdevices . ĊĠĠĠĠ Ġ* ĠThe Ġdefault Ġvalue Ġis Ġfalse . ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġmust Ġbe Ġcalled Ġin Ġthe Ġget Encrypt ing Thread Handler () Ġthread . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġto Ġun il ater ally Ġblacklist Ġall Ġun verified Ġdevices . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġget Global Black list Un verified Devices (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcrypto Store . getGlobal Black list Un verified Devices () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTell s Ġwhether Ġthe Ġclient Ġshould Ġencrypt Ġmessages Ġonly Ġfor Ġthe Ġverified Ġdevices ĊĠĠĠĠ Ġ* Ġin Ġthis Ġroom . ĊĠĠĠĠ Ġ* ĠThe Ġdefault Ġvalue Ġis Ġfalse . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġroom Id Ġthe Ġroom Ġid ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġthe Ġclient Ġshould Ġencrypt Ġmessages Ġonly Ġfor Ġthe Ġverified Ġdevices . ĊĠĠĠĠ Ġ*/ Ċ // ĠTODO Ġadd Ġthis Ġinfo Ġin ĠCrypto Room Entity ? ĊĠĠĠ Ġoverride Ġfun Ġis Room Black list Un verified Devices ( roomId : ĠString ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġroom Id ?. let Ġ{ Ġcrypto Store . get Rooms List Black list Un verified Devices (). contains ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMan ages Ġthe Ġroom Ġblack - listing Ġfor Ġun verified Ġdevices . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġroom Id ĠĠ Ġthe Ġroom Ġid ĊĠĠĠĠ Ġ* Ġ@ param Ġadd ĠĠĠĠĠ Ġtrue Ġto Ġadd Ġthe Ġroom Ġid Ġto Ġthe Ġlist , Ġfalse Ġto Ġremove Ġit . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġset Room Black list Un verified Devices ( roomId : ĠString , Ġadd : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġroom Ids Ġ= Ġcrypto Store . get Rooms List Black list Un verified Devices (). to Mutable List () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( add ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( roomId Ġ! in Ġroom Ids ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroom Ids . add ( roomId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroom Ids . remove ( roomId ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcrypto Store . set Rooms List Black list Un verified Devices ( room Ids ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdd Ġthis Ġroom Ġto Ġthe Ġones Ġwhich Ġdon 't Ġencrypt Ġmessages Ġto Ġun verified Ġdevices . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġroom Id ĠĠ Ġthe Ġroom Ġid ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġset Room Black list Un verified Devices ( roomId : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġset Room Black list Un verified Devices ( roomId , Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRemove Ġthis Ġroom Ġto Ġthe Ġones Ġwhich Ġdon 't Ġencrypt Ġmessages Ġto Ġun verified Ġdevices . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġroom Id ĠĠ Ġthe Ġroom Ġid ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġset Room Un Black list Un verified Devices ( roomId : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġset Room Black list Un verified Devices ( roomId , Ġfalse ) ĊĠĠĠ Ġ} Ċ Ċ // ĠTODO ĠCheck Ġif Ġthis Ġmethod Ġis Ġstill Ġnecessary ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCancel Ġany Ġearlier Ġroom Ġkey Ġrequest ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġrequest Body Ġrequest Body ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġcancel Room Key Request ( request Body : ĠRoom Key RequestBody ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoutgoing Go ssip ing Request Manager . cancel Room Key Request ( request Body ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRe Ġrequest Ġthe Ġencryption Ġkeys Ġrequired Ġto Ġdecrypt Ġan Ġevent . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġevent Ġthe Ġevent Ġto Ġdecrypt Ġagain . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġre Request Room Key For Event ( event : ĠEvent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwire Content Ġ= Ġevent . content . to Model < Encrypted Event Content >() Ġ?: Ġreturn ĠUnit . also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e (" ## ĠCR YPTO Ġ| Âł re Request Room Key For Event ĠFailed Ġto Ġre - request Ġkey , Ġnull Ġcontent ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Body Ġ= ĠRoom Key RequestBody ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalgorithm Ġ= Ġwire Content . algorithm , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroom Id Ġ= Ġevent . roomId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsender Key Ġ= Ġwire Content . sender Key , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsessionId Ġ= Ġwire Content . sessionId ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġoutgoing Go ssip ing Request Manager . res end Room Key Request ( request Body ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrequest Room Key For Event ( event : ĠEvent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwire Content Ġ= Ġevent . content . to Model < Encrypted Event Content >() Ġ?: Ġreturn ĠUnit . also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e (" ## ĠCR YPTO Ġ| Âł request Room Key For Event ĠFailed Ġto Ġrequest Ġkey , Ġnull Ġcontent Ġevent Id : Ġ${ event . eventId }") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcrypto Coroutine Scope . launch ( coroutine Dispatch ers . crypto ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Started ()) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . v (" ## ĠCR YPTO Ġ| Âł request Room Key For Event () Ġ: Ġwait Ġafter Ġe 2 e Ġinit ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinternal Start ( false ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroom Decrypt or Provider ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get OrCreate Room Decrypt or ( event . roomId , Ġwire Content . algorithm ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . request Keys For Event ( event , Ġfalse ) Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . v (" ## ĠCR YPTO Ġ| Âł request Room Key For Event () Ġ: ĠNo Ġroom Ġdecrypt or Ġfor Ġroom Id :${ event . roomId } Ġalgorithm :${ wire Content . algorithm }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdd Ġa ĠGo ssip ing RequestListener Ġlistener . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġlistener Ġlistener ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġadd Room Keys RequestListener ( listener : ĠGo ssip ing RequestListener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġincoming Go ssip ing Request Manager . add Room Keys RequestListener ( listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdd Ġa ĠGo ssip ing RequestListener Ġlistener . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġlistener Ġlistener ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġremove Room Keys RequestListener ( listener : ĠGo ssip ing RequestListener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġincoming Go ssip ing Request Manager . remove Room Keys RequestListener ( listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmark O lm Session For Un wed ging ( sender Id : ĠString , Ġdevice Info : ĠCrypto DeviceInfo ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdevice Key Ġ= Ġdevice Info . identity Key () ĊĊĠĠĠĠĠĠĠ Ġval Ġlast For ced Date Ġ= Ġlast New Session For ced Dates . getObject ( sender Id , Ġdevice Key ) Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġnow Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġif Ġ( now Ġ- Ġlast For ced Date Ġ< ĠCR YPTO _ MIN _ FORCE _ SESSION _ PERIOD _ M ILL IS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" ## ĠCR YPTO Ġ| Âł mark O lm Session For Un wed ging : ĠNew Ġsession Ġalready Ġforced Ġwith Ġdevice Ġat Ġ$ last For ced Date . ĠNot Ġforcing Ġanother ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠTim ber . d (" ## ĠCR YPTO Ġ| Âł mark O lm Session For Un wed ging Ġfrom Ġ$ sender Id :${ device Info . deviceId }") ĊĠĠĠĠĠĠĠ Ġlast New Session For ced Dates . set Object ( sender Id , Ġdevice Key , Ġnow ) ĊĊĠĠĠĠĠĠĠ Ġcrypto Coroutine Scope . launch ( coroutine Dispatch ers . crypto ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġensure O lm Sessions For Devices Action . handle ( map Of ( sender Id Ġto ĠlistOf ( device Info )), Ġforce Ġ= Ġtrue ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNow Ġsend Ġa Ġblank Ġmessage Ġon Ġthat Ġsession Ġso Ġthe Ġother Ġside Ġknows Ġabout Ġit . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ( The Ġkey share Ġrequest Ġis Ġsent Ġin Ġthe Ġclear Ġso Ġthat Ġwon 't Ġdo ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġsend Ġthis Ġfirst Ġsuch Ġthat , Ġas Ġlong Ġas Ġthe Ġto Device Ġmessages Ġar rive Ġin Ġthe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsame Ġorder Ġwe Ġsent Ġthem , Ġthe Ġother Ġend Ġwill Ġget Ġthis Ġfirst , Ġset Ġup Ġthe Ġnew Ġsession , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthen Ġget Ġthe Ġkey share Ġrequest Ġand Ġsend Ġthe Ġkey Ġover Ġthis Ġnew Ġsession Ġ( because Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġis Ġthe Ġsession Ġit Ġhas Ġmost Ġrecently Ġreceived Ġa Ġmessage Ġon ). ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpayload Json Ġ= Ġmap Of < String , ĠAny >(" type " Ġto ĠEventType . D UMMY ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġencoded Payload Ġ= Ġmessage Encrypt er . encrypt Message ( payload Json , ĠlistOf ( device Info )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsend To Device Map Ġ= ĠMX Users Devices Map < Any >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend To Device Map . set Object ( sender Id , Ġdevice Info . deviceId , Ġencoded Payload ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . v (" ## ĠCR YPTO Ġ| Âł mark O lm Session For Un wed ging () Ġ: Ġsending Ġto Ġ$ sender Id :${ device Info . deviceId }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsend To Device Params Ġ= ĠSend To Device Task . Params ( EventType . ENCRYPT ED , Ġsend To Device Map ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend To Device Task . execute ( send To Device Params ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠProvides Ġthe Ġlist Ġof Ġunknown Ġdevices ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġdevices In Room Ġthe Ġdevices Ġmap ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġunknown Ġdevices Ġmap ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Unknown Devices ( devices In Room : ĠMX Users Devices Map < Crypto DeviceInfo >): ĠMX Users Devices Map < Crypto DeviceInfo > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġunknown Devices Ġ= ĠMX Users Devices Map < Crypto DeviceInfo >() ĊĠĠĠĠĠĠĠ Ġval Ġuser Ids Ġ= Ġdevices In Room . user Ids ĊĠĠĠĠĠĠĠ Ġfor Ġ( userId Ġin Ġuser Ids ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdevices In Room . getUser Device Ids ( userId )?. forEach Ġ{ ĠdeviceId Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevices In Room . getObject ( userId , ĠdeviceId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . take If Ġ{ Ġit . is Unknown Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunknown Devices . set Object ( userId , ĠdeviceId , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġunknown Devices ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdownload Keys ( user Ids : ĠList < String >, Ġforce Download : ĠBoolean , Ġcallback : ĠMatrix Callback < MX Users Devices Map < Crypto DeviceInfo >>) Ġ{ ĊĠĠĠĠĠĠĠ Ġcrypto Coroutine Scope . launch ( coroutine Dispatch ers . crypto ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice List Manager . download Keys ( user Ids , Ġforce Download ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. fold To Callback ( callback ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd New Session Listener ( new Session Listener : ĠNew Session Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġroom Decrypt or Provider . add New Session Listener ( new Session Listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġremove Session Listener ( listener : ĠNew Session Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġroom Decrypt or Provider . remove Session Listener ( listener ) ĊĠĠĠ Ġ} Ċ /* Ġ================================================================= ================ ========= Ċ Ġ* ĠDEBUG ĠINFO Ċ Ġ* Ġ================================================================= ================ ========= Ġ*/ ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" Default Crypto Service Ġof Ġ$ userId Ġ($ deviceId )" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Outgoing Room Key Requests (): ĠList < Outgoing Room Key Request > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcrypto Store . get Outgoing Room Key Requests () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Incoming Room Key Requests (): ĠList < Incoming Room Key Request > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcrypto Store . get Incoming Room Key Requests () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Go ssip ing Events Trail (): ĠList < Event > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcrypto Store . get Go ssip ing Events Trail () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Shared With Info ( roomId : ĠString ?, ĠsessionId : ĠString ): ĠMX Users Devices Map < Int > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcrypto Store . get Shared With Info ( roomId , ĠsessionId ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget With Hel d Me gol m Session ( roomId : ĠString , ĠsessionId : ĠString ): ĠRoom Key With Hel d Content ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcrypto Store . get With Hel d Me gol m Session ( roomId , ĠsessionId ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġ/* Ġ================================================================= ================ ========= ĊĠĠĠĠ Ġ* ĠFor Ġtest Ġonly ĊĠĠĠĠ Ġ* Ġ================================================================= ================ ========= Ġ*/ ĊĊĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠ Ġval Ġcrypto Store ForTesting Ġ= Ġcrypto Store ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCR YPTO _ MIN _ FORCE _ SESSION _ PERIOD _ M ILL IS Ġ= Ġ 3 _ 6 0 0 _ 0 0 0 Ġ// Ġone Ġhour ĊĠĠĠ Ġ} Ċ } Ċ