/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 5 - 2 0 2 0 , ĠV ir gil ĠSecurity , ĠInc . Ċ Ġ* Ċ Ġ* ĠLead ĠMaint ainer : ĠV ir gil ĠSecurity ĠInc . Ġ< support @ vir gil security . com > Ċ Ġ* Ċ Ġ* ĠAll Ġrights Ġreserved . Ċ Ġ* Ċ Ġ* ĠRedistribution Ġand Ġuse Ġin Ġsource Ġand Ġbinary Ġforms , Ġwith Ġor Ġwithout Ċ Ġ* Ġmodification , Ġare Ġpermitted Ġprovided Ġthat Ġthe Ġfollowing Ġconditions Ġare Ġmet : Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġ( 1 ) ĠRedistributions Ġof Ġsource Ġcode Ġmust Ġretain Ġthe Ġabove Ġcopyright Ġnotice , Ġthis Ċ Ġ* ĠĠĠĠ Ġlist Ġof Ġconditions Ġand Ġthe Ġfollowing Ġdisclaimer . Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġ( 2 ) ĠRedistributions Ġin Ġbinary Ġform Ġmust Ġreproduce Ġthe Ġabove Ġcopyright Ġnotice , Ċ Ġ* ĠĠĠĠ Ġthis Ġlist Ġof Ġconditions Ġand Ġthe Ġfollowing Ġdisclaimer Ġin Ġthe Ġdocumentation Ċ Ġ* ĠĠĠĠ Ġand / or Ġother Ġmaterials Ġprovided Ġwith Ġthe Ġdistribution . Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġ( 3 ) ĠNeither Ġthe Ġname Ġof Ġvir gil Ġnor Ġthe Ġnames Ġof Ġits Ċ Ġ* ĠĠĠĠ Ġcontributors Ġmay Ġbe Ġused Ġto Ġendorse Ġor Ġpromote Ġproducts Ġderived Ġfrom Ċ Ġ* ĠĠĠĠ Ġthis Ġsoftware Ġwithout Ġspecific Ġprior Ġwritten Ġpermission . Ċ Ġ* Ċ Ġ* ĠTHIS ĠSOFTWARE ĠIS ĠPROVIDED ĠBY ĠTHE ĠCOPYRIGHT ĠHOLDERS ĠAND ĠCONTRIBUTORS Ġ" AS ĠIS " Ċ Ġ* ĠAND ĠANY ĠEXPRESS ĠOR ĠIMPLIED ĠWARRANTIES , ĠINCLUDING , ĠBUT ĠNOT ĠLIMITED ĠTO , ĠTHE Ċ Ġ* ĠIMPLIED ĠWARRANTIES ĠOF ĠMERCHANTABILITY ĠAND ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠARE Ċ Ġ* ĠDISCLAIMED . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE ĠCOPYRIGHT ĠHOLDER ĠOR ĠCONTRIBUTORS ĠBE ĠLIABLE Ċ Ġ* ĠFOR ĠANY ĠDIRECT , ĠINDIRECT , ĠINCIDENTAL , ĠSPECIAL , ĠEXEMPLARY , ĠOR ĠCONSEQUENTIAL Ċ Ġ* ĠDAMAGES Ġ( INCLUDING , ĠBUT ĠNOT ĠLIMITED ĠTO , ĠPROCUREMENT ĠOF ĠSUBSTITUTE ĠGOODS ĠOR Ċ Ġ* ĠSERVICES ; ĠLOSS ĠOF ĠUSE , ĠDATA , ĠOR ĠPROFITS ; ĠOR ĠBUSINESS ĠINTERRUPTION ) ĠHOWEVER Ċ Ġ* ĠCAUSED ĠAND ĠON ĠANY ĠTHEORY ĠOF ĠLIABILITY , ĠWHETHER ĠIN ĠCONTRACT , ĠSTRICT ĠLIABILITY , Ċ Ġ* ĠOR ĠTORT Ġ( INCLUDING ĠNEGLIGENCE ĠOR ĠOTHERWISE ) ĠARISING ĠIN ĠANY ĠWAY ĠOUT ĠOF ĠTHE ĠUSE Ċ Ġ* ĠOF ĠTHIS ĠSOFTWARE , ĠEVEN ĠIF ĠADVISED ĠOF ĠTHE ĠPOSSIBILITY ĠOF ĠSUCH ĠDAMAGE . Ċ Ġ*/ Ċ Ċ package Ġcom . vir gil security . rat chet . secure chat Ċ Ċ import Ġcom . vir gil security . crypto . rat chet . Rat chet Message Ċ import Ġcom . vir gil security . crypto . rat chet . Rat chet Session Ċ import Ġcom . vir gil security . rat chet . key storage . Long Term Key Ċ import Ġcom . vir gil security . rat chet . key storage . One Time Key Ċ import Ġcom . vir gil security . sdk . crypto . V ir gil Crypto Ċ import Ġcom . vir gil security . sdk . crypto . V ir gil PrivateKey Ċ import Ġjava . nio . charset . StandardCharsets Ċ Ċ /** Ċ Ġ* ĠSecure Ġsession . Ċ Ġ*/ Ċ class ĠSecure Session Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPart icipant Ġidentity . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġparticipant Identity : ĠString ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSession Ġname . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġname : ĠString ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCrypto . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġcrypto : ĠV ir gil Crypto ĊĊĠĠĠ Ġprivate Ġvar Ġrat chet Session : ĠR at chet Session ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreate Ġnew Ġinstance Ġas Ġa Ġreceiver . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcrypto ĠV ir gil Crypto ĊĠĠĠĠ Ġ* Ġ@ param Ġparticipant Identity ĠPart icipant Ġidentity . ĊĠĠĠĠ Ġ* Ġ@ param Ġname ĠSession Ġname . ĊĠĠĠĠ Ġ* Ġ@ param Ġreceiver Identity PrivateKey ĠReceiver Ġidentity Ġprivate Ġkey . ĊĠĠĠĠ Ġ* Ġ@ param Ġreceiver Long Term PrivateKey ĠReceiver Ġlong - term Ġprivate Ġkey . ĊĠĠĠĠ Ġ* Ġ@ param Ġreceiver One Time PrivateKey ĠReceiver Ġone - time Ġprivate Ġkey . ĊĠĠĠĠ Ġ* Ġ@ param Ġsender Identity PublicKey ĠSender Ġidentity Ġpublic Ġkey . ĊĠĠĠĠ Ġ* Ġ@ param Ġrat chet Message ĠR at chet Message . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġconstructor ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcrypto : ĠV ir gil Crypto , Ġparticipant Identity : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname : ĠString , Ġreceiver Identity PrivateKey : ĠV ir gil PrivateKey , Ġreceiver Long Term PrivateKey : ĠLong Term Key , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreceiver One Time PrivateKey : ĠOne Time Key ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsender Identity PublicKey : ĠByteArray , Ġrat chet Message : ĠR at chet Message ĊĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġthis . crypto Ġ= Ġcrypto ĊĠĠĠĠĠĠĠ Ġthis . participant Identity Ġ= Ġparticipant Identity ĊĠĠĠĠĠĠĠ Ġthis . name Ġ= Ġname ĊĊĠĠĠĠĠĠĠ Ġthis . rat chet Session Ġ= ĠR at chet Session () ĊĠĠĠĠĠĠĠ Ġrat chet Session . set Rng ( crypto . rng ) ĊĊĠĠĠĠĠĠĠ Ġthis . rat chet Session . respond ( sender Identity PublicKey , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . crypto . export PrivateKey ( receiver Identity PrivateKey ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreceiver Long Term PrivateKey . key , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreceiver One Time PrivateKey ?. key Ġ?: Ġbyte ArrayOf (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrat chet Message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreate Ġnew Ġinstance Ġas Ġa Ġsender . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcrypto ĠV ir gil Crypto . ĊĠĠĠĠ Ġ* Ġ@ param Ġparticipant Identity ĠPart icipant Ġidentity . ĊĠĠĠĠ Ġ* Ġ@ param Ġname ĠSession Ġname . ĊĠĠĠĠ Ġ* Ġ@ param Ġsender Identity PrivateKey ĠSender Ġidentity Ġprivate Ġkey . ĊĠĠĠĠ Ġ* Ġ@ param Ġreceiver Identity PublicKey ĠReceiver Ġidentity Ġpublic Ġkey . ĊĠĠĠĠ Ġ* Ġ@ param Ġreceiver Long Term PublicKey ĠReceiver Ġlong - term Ġpublic Ġkey . ĊĠĠĠĠ Ġ* Ġ@ param Ġreceiver One Time PublicKey ĠReceiver Ġone - time Ġpublic Ġkey . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġconstructor ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcrypto : ĠV ir gil Crypto , Ġparticipant Identity : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname : ĠString , Ġsender Identity PrivateKey : ĠByteArray , Ġreceiver Identity PublicKey : ĠByteArray , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreceiver Long Term PublicKey : ĠByteArray , Ġreceiver One Time PublicKey : ĠByteArray ? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . crypto Ġ= Ġcrypto ĊĠĠĠĠĠĠĠ Ġthis . participant Identity Ġ= Ġparticipant Identity ĊĠĠĠĠĠĠĠ Ġthis . name Ġ= Ġname ĊĊĠĠĠĠĠĠĠ Ġthis . rat chet Session Ġ= ĠR at chet Session () ĊĠĠĠĠĠĠĠ Ġrat chet Session . set Rng ( crypto . rng ) ĊĊĠĠĠĠĠĠĠ Ġrat chet Session . init iate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsender Identity PrivateKey , Ġreceiver Identity PublicKey , Ġreceiver Long Term PublicKey , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreceiver One Time PublicKey ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRestore Ġsession Ġfrom Ġserialized Ġrepresentation . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġdata ĠSerialized Ġsession . ĊĠĠĠĠ Ġ* Ġ@ param Ġparticipant Identity ĠPart icipant Ġidentity . ĊĠĠĠĠ Ġ* Ġ@ param Ġname ĠSession Ġname . ĊĠĠĠĠ Ġ* Ġ@ param Ġcrypto ĠV ir gil Crypto . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġconstructor ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata : ĠByteArray , Ġparticipant Identity : ĠString , Ġname : ĠString , Ġcrypto : ĠV ir gil Crypto ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . rat chet Session Ġ= ĠR at chet Session . deserialize ( data ) ĊĠĠĠĠĠĠĠ Ġrat chet Session . set Rng ( crypto . rng ) ĊĠĠĠĠĠĠĠ Ġthis . participant Identity Ġ= Ġparticipant Identity ĊĠĠĠĠĠĠĠ Ġthis . name Ġ= Ġname ĊĠĠĠĠĠĠĠ Ġthis . crypto Ġ= Ġcrypto ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEncrypt s Ġstring . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNOTE : ĠThis Ġoperation Ġchanges Ġsession Ġstate , Ġso Ġsession Ġshould Ġbe Ġupdated Ġin Ġstorage . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġstr ĠMessage Ġto Ġencrypt . ĊĠĠĠĠ Ġ* Ġ@ return ĠR at chet Message . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġencrypt ( str : ĠString ): ĠR at chet Message Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġstr . toByteArray ( StandardCharsets . UTF _ 8 ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis . encrypt ( data ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEncrypt s Ġdata . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNOTE : ĠThis Ġoperation Ġchanges Ġsession Ġstate , Ġso Ġsession Ġshould Ġbe Ġupdated Ġin Ġstorage . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġdata ĠMessage Ġto Ġencrypt . ĊĠĠĠĠ Ġ* Ġ@ return ĠR at chet Message . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġencrypt ( data : ĠByteArray ): ĠR at chet Message Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( rat chet Session ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrat chet Session . encrypt ( data ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDecrypt s Ġdata Ġfrom ĠR at chet Message . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNOTE : ĠThis Ġoperation Ġchanges Ġsession Ġstate , Ġso Ġsession Ġshould Ġbe Ġupdated Ġin Ġstorage . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmessage ĠR at chet Message . ĊĠĠĠĠ Ġ* Ġ@ return ĠDecrypt ed Ġdata . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdecrypt Data ( message : ĠR at chet Message ): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( rat chet Session ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrat chet Session . decrypt ( message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDecrypt s Ġutf - 8 Ġstring Ġfrom ĠR at chet Message . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNOTE : ĠThis Ġoperation Ġchanges Ġsession Ġstate , Ġso Ġsession Ġshould Ġbe Ġupdated Ġin Ġstorage . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmessage ĠR at chet Message . ĊĠĠĠĠ Ġ* Ġ@ return ĠDecrypt ed Ġutf - 8 Ġstring . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdecrypt String ( message : ĠR at chet Message ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġthis . decrypt Data ( message ) ĊĠĠĠĠĠĠĠ Ġreturn Ġdata . toString ( StandardCharsets . UTF _ 8 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSerialize Ġsession . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġserialize (): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . rat chet Session . serialize () ĊĠĠĠ Ġ} Ċ }