/* Ċ Ġ* Ġ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 . android . common . snippet Ċ Ċ import Ġandroidx . test . ext . junit . runners . Android JUnit 4 Ċ import Ġcom . vir gil security . android . common . callback . On GetToken Callback Ċ import Ġcom . vir gil security . android . common . utils . Test Config Ċ import Ġcom . vir gil security . android . common . utils . TestUtils Ċ import Ġcom . vir gil security . android . eth ree . interaction . E Three Ċ import Ġcom . vir gil security . common . model . Data Ċ import Ġcom . vir gil security . sdk . crypto . V ir gil Crypto Ċ import Ġorg . junit . Assert . assertArrayEquals Ċ import Ġorg . junit . Assert . assertNotNull Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġjava . io . ByteArray InputStream Ċ import Ġjava . io . ByteArray OutputStream Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠThis Ġtest Ġcovers Ġsnippets Ġthat Ġused Ġin Ġdocumentation . Ċ Ġ*/ Ċ @ RunWith ( Android JUnit 4 :: class ) Ċ class ĠSn ippets Test Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġalice Identity : ĠString ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbob Identity : ĠString ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcrypto : ĠV ir gil Crypto ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġalice E three : ĠE Three ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbob E three : ĠE Three ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun Ġsetup () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . crypto Ġ= ĠV ir gil Crypto () ĊĠĠĠĠĠĠĠ Ġthis . alice Identity Ġ= ĠUUID . randomUUID (). toString () ĊĠĠĠĠĠĠĠ Ġthis . alice E three Ġ= ĠE Three ( alice Identity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠOn GetToken Callback Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon GetToken (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠTestUtils . generate Token String ( alice Identity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTest Config . context ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( this . alice E three ) ĊĠĠĠĠĠĠĠ Ġthis . alice E three . register (). execute () ĊĊĠĠĠĠĠĠĠ Ġthis . bob Identity Ġ= ĠUUID . randomUUID (). toString () ĊĠĠĠĠĠĠĠ Ġthis . bob E three Ġ= ĠE Three ( bob Identity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠOn GetToken Callback Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon GetToken (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠTestUtils . generate Token String ( bob Identity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTest Config . context ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( this . bob E three ) ĊĠĠĠĠĠĠĠ Ġthis . bob E three . register (). execute () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġencrypt Shared _ complex () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtriple Ġ= Ġencrypt Shared () ĊĠĠĠĠĠĠĠ Ġval Ġp 2 p Encrypted Stream Key Data Ġ= Ġtriple . first ĊĠĠĠĠĠĠĠ Ġval Ġgroup Encrypted Stream Key Data Ġ= Ġtriple . second ĊĠĠĠĠĠĠĠ Ġval Ġencrypted Data Ġ= Ġtriple . third ĊĊĠĠĠĠĠĠĠ Ġval Ġdecrypted Data Ġ= Ġdecrypt Shared ( p 2 p Encrypted Stream Key Data , Ġgroup Encrypted Stream Key Data , Ġencrypted Data ) ĊĊĠĠĠĠĠĠĠ Ġassert ArrayEquals (" Hello ". toByteArray (), Ġdecrypted Data ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġencrypt Shared (): ĠTrip le < ByteArray , ĠByteArray , ĠByteArray > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġencrypt Shared Ġ>> ĊĊĠĠĠĠĠĠĠ Ġ// Ġ 1 . ĠPrepare Ġstreams . ĊĠĠĠĠĠĠĠ Ġval Ġplaintext Ġ= Ġ" Hello " ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġplaintext . toByteArray () ĊĠĠĠĠĠĠĠ Ġval ĠinputStream Ġ= ĠByteArrayInputStream ( data ) ĊĠĠĠĠĠĠĠ Ġval ĠinputStream Size Ġ= Ġdata . size ĊĠĠĠĠĠĠĠ Ġval Ġencrypted OutputStream Ġ= ĠByteArrayOutputStream () ĊĊĠĠĠĠĠĠĠ Ġ// Ġ 2 . ĠEncrypt Ġstream . ĊĠĠĠĠĠĠĠ Ġval Ġstream Key Data Ġ= Ġalice E three . encrypt Shared ( inputStream , ĠinputStream Size , Ġencrypted OutputStream ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġ 3 . ĠUpload Ġdata Ġfrom Ġ` encrypted OutputStream ` Ġto Ġa Ġremote Ġstorage . ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠApplication Ġspecific Ġcode . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĊĠĠĠĠĠĠĠ Ġ// Ġ 4 . 1 ĠEncrypt Ġ` stream Key Data ` Ġto Ġa Ġspecific Ġuser Ġ( peer - to - peer ). ĊĠĠĠĠĠĠĠ Ġval Ġbob Card Ġ= Ġalice E three . find User ( bob Identity ). get () ĊĠĠĠĠĠĠĠ Ġval Ġp 2 p Encrypted Stream Key Data Ġ= Ġalice E three . auth Encrypt ( Data ( stream Key Data ), Ġbob Card ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġ 4 . 2 ĠEncrypt Ġ` stream Key Data ` Ġto Ġa Ġgroup . ĊĠĠĠĠĠĠĠ Ġval ĠgroupId Ġ= Ġ" group - chat - 1 " ĊĠĠĠĠĠĠĠ Ġval Ġbob Users Result Ġ= Ġalice E three . find Users ( array ListOf ( bob Identity )). get () ĊĠĠĠĠĠĠĠ Ġval Ġalice Group Ġ= Ġalice E three . create Group ( groupId , Ġbob Users Result ). get () ĊĠĠĠĠĠĠĠ Ġval Ġgroup Encrypted Stream Key Data Ġ= Ġalice Group . encrypt ( stream Key Data ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġ 5 . ĠSend Ġencrypted Ġ` stream Key Data ` Ġ( p 2 p Encrypted Stream Key Data , Ġor Ġgroup Encrypted Stream Key Data ) Ġto Ġdestination Ġdevice . ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠApplication Ġspecific Ġcode . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĊĠĠĠĠĠĠĠ Ġ// Ġ<< Ġencrypt Shared ĊĊĠĠĠĠĠĠĠ Ġreturn ĠTrip le ( p 2 p Encrypted Stream Key Data . value , Ġgroup Encrypted Stream Key Data , Ġencrypted OutputStream . toByteArray ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdecrypt Shared ( p 2 p Encrypted Stream Key Data : ĠByteArray , Ġgroup Encrypted Stream Key Data : ĠByteArray , Ġencrypted Data : ĠByteArray ): ĠByteArray ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġdecrypt Shared Ġ>> ĊĊĠĠĠĠĠĠĠ Ġ// Ġ 1 . ĠReceive Ġ` encrypted Stream Key Data ` Ġand Ġdownload Ġdata Ġfrom Ġthe Ġremote Ġstorage . ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠApplication Ġspecific Ġcode . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĊĠĠĠĠĠĠĠ Ġ// Ġ 2 . ĠPrepare Ġstreams . ĊĠĠĠĠĠĠĠ Ġval Ġencrypted InputStream Ġ= ĠByteArrayInputStream ( encrypted Data ) ĊĠĠĠĠĠĠĠ Ġval Ġdecrypted OutputStream Ġ= ĠByteArrayOutputStream () ĊĊĠĠĠĠĠĠĠ Ġ// Ġ 3 . ĠFind Ġinit iator 's ĠCard . ĊĠĠĠĠĠĠĠ Ġval Ġalice Card Ġ= Ġbob E three . find User ( alice Identity ). get () ĊĊĠĠĠĠĠĠĠ Ġ// Ġ 4 . 1 ĠDecrypt Ġ` encrypted Stream Key Data ` Ġreceived Ġpeer - to - peer . ĊĠĠĠĠĠĠĠ Ġval Ġp 2 p De crypted Stream Key Data Ġ= Ġbob E three . auth Decrypt ( Data ( p 2 p Encrypted Stream Key Data ), Ġalice Card ). value ĊĊĠĠĠĠĠĠĠ Ġ// Ġ 4 . 2 ĠDecrypt Ġ` encrypted Stream Key Data ` Ġreceived Ġto Ġthe Ġgroup . ĊĠĠĠĠĠĠĠ Ġval ĠgroupId Ġ= Ġ" group - chat - 1 " ĊĠĠĠĠĠĠĠ Ġval Ġbob Group Ġ= Ġbob E three . load Group ( groupId , Ġalice Card ). get () Ġ// Ġload Ġcorrespond Ġgroup ĊĠĠĠĠĠĠĠ Ġval Ġgroup De crypted Stream Key Data Ġ= Ġbob Group . decrypt ( group Encrypted Stream Key Data , Ġalice Card ) Ġ// Ġdecrypt Ġkey ĊĊĠĠĠĠĠĠĠ Ġ// Ġ 5 . ĠDecrypt Ġstream . ĊĠĠĠĠĠĠĠ Ġval Ġdecrypted Stream Key Data Ġ= Ġp 2 p De crypted Stream Key Data Ġ?: Ġgroup De crypted Stream Key Data ĊĊĠĠĠĠĠĠĠ Ġbob E three . decrypt Shared ( encrypted InputStream , Ġdecrypted OutputStream , Ġdecrypted Stream Key Data , Ġalice Card ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġ<< Ġdecrypt Shared ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdecrypted OutputStream . toByteArray () ĊĠĠĠ Ġ} Ċ }