/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 5 - 2 0 1 9 , Ġ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 . key kn ox . client Ċ Ċ import Ġcom . vir gil security . crypto . foundation .* Ċ import Ġcom . vir gil security . key kn ox . Test Config Ċ import Ġcom . vir gil security . key kn ox . utils . base 6 4 Encode Ċ import Ġcom . vir gil security . sdk . common . TimeSpan Ċ import Ġcom . vir gil security . sdk . crypto .* Ċ import Ġcom . vir gil security . sdk . jwt . Jwt Generator Ċ import Ġorg . junit . jupiter . api . Assertions .* Ċ import Ġorg . junit . jupiter . api . BeforeEach Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ class ĠKey kn ox Client Test Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġidentity Ġ= ĠUUID . randomUUID (). toString () ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġvir gil Crypto : ĠV ir gil Crypto ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġkey kn ox Client : ĠKey kn ox Client Protocol ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtoken Str : ĠString ĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠpublicKey : ĠV ir gil PublicKey ĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠprivateKey : ĠV ir gil PrivateKey ĊĊĠĠĠ Ġ@ BeforeEach ĊĠĠĠ Ġfun Ġsetup () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . vir gil Crypto Ġ= ĠV ir gil Crypto ( false ) ĊĠĠĠĠĠĠĠ Ġval Ġkey Pair Ġ= Ġthis . vir gil Crypto . generate KeyPair ( KeyType . ED 2 5 5 1 9 ) ĊĠĠĠĠĠĠĠ Ġthis . privateKey Ġ= Ġkey Pair . privateKey ĊĠĠĠĠĠĠĠ Ġthis . publicKey Ġ= Ġkey Pair . publicKey ĊĠĠĠĠĠĠĠ Ġthis . key kn ox Client Ġ= ĠKey kn ox Client () ĊĊĠĠĠĠĠĠĠ Ġval Ġjwt Generator Ġ= ĠJwt Generator ( Test Config . appId , ĠTest Config . apiKey , ĠTest Config . api PublicKey Id , ĠTimeSpan . from Time ( 6 0 0 , ĠTimeUnit . SECONDS ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠV ir gil AccessToken Signer ( this . vir gil Crypto )) ĊĠĠĠĠĠĠĠ Ġthis . token Str Ġ= Ġjwt Generator . generate Token ( this . identity ). string Representation () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġpush Value () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠK TC - 1 ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġbase 6 4 Encode ( UUID . randomUUID (). toString ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġsigner Ġ= ĠSign er () ĊĠĠĠĠĠĠĠ Ġsigner . set Hash ( Sha 5 1 2 ()) ĊĊĠĠĠĠĠĠĠ Ġsigner . reset () ĊĠĠĠĠĠĠĠ Ġsigner . append Data ( data ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsignature Ġ= Ġsigner . sign ( this . privateKey . privateKey ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcipher Ġ= ĠRe cipient Cipher () ĊĠĠĠĠĠĠĠ Ġcipher . set Random ( vir gil Crypto . rng ) ĊĠĠĠĠĠĠĠ Ġcipher . set Encryption Cipher ( Aes 2 5 6 G cm ()) ĊĊĠĠĠĠĠĠĠ Ġcipher . custom Params (). addData ( V ir gil Crypto . CUSTOM _ PARAM _ SIGN ER _ ID , ĠprivateKey . identifier ) ĊĠĠĠĠĠĠĠ Ġcipher . custom Params (). addData ( V ir gil Crypto . CUSTOM _ PARAM _ SIGNATURE , Ġsignature ) ĊĊĠĠĠĠĠĠĠ Ġcipher . add Key Recipient ( publicKey . identifier , Ġthis . publicKey . publicKey ) ĊĊĠĠĠĠĠĠĠ Ġcipher . start Encryption () ĊĊĠĠĠĠĠĠĠ Ġval Ġmeta Ġ= Ġcipher . pack MessageInfo () ĊĠĠĠĠĠĠĠ Ġvar Ġencrypted Data Ġ= Ġcipher . process Encryption ( data ) ĊĠĠĠĠĠĠĠ Ġencrypted Data Ġ+= Ġcipher . finish Encryption () ĊĊĠĠĠĠĠĠĠ Ġval Ġpushed Value Ġ= Ġthis . key kn ox Client . push Value ( meta , Ġencrypted Data , Ġnull , Ġthis . token Str ) ĊĠĠĠĠĠĠĠ Ġassert ArrayEquals ( encrypted Data , Ġpushed Value . value ) ĊĠĠĠĠĠĠĠ Ġassert ArrayEquals ( meta , Ġpushed Value . meta ) ĊĠĠĠĠĠĠĠ ĠassertEquals (" 1 . 0 ", Ġpushed Value . version ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( pus hed Value . key kn ox Hash ) ĊĠĠĠĠĠĠĠ ĠassertFalse ( pus hed Value . key kn ox Hash !!. isEmpty ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġpulled Value Ġ= Ġthis . key kn ox Client . pull Value ( this . token Str ) ĊĠĠĠĠĠĠĠ Ġassert ArrayEquals ( encrypted Data , Ġpulled Value . value ) ĊĠĠĠĠĠĠĠ Ġassert ArrayEquals ( meta , Ġpulled Value . meta ) ĊĠĠĠĠĠĠĠ ĠassertEquals (" 1 . 0 ", Ġpulled Value . version ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( pul led Value . key kn ox Hash ) ĊĠĠĠĠĠĠĠ ĠassertFalse ( pul led Value . key kn ox Hash !!. isEmpty ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġpush Value _ update Data () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠK TC - 2 ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġbase 6 4 Encode ( UUID . randomUUID (). toString ()) ĊĠĠĠĠĠĠĠ Ġval Ġdata 2 Ġ= Ġbase 6 4 Encode ( UUID . randomUUID (). toString ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġsigner Ġ= ĠSign er () ĊĠĠĠĠĠĠĠ Ġsigner . set Hash ( Sha 5 1 2 ()) ĊĊĠĠĠĠĠĠĠ Ġsigner . reset () ĊĠĠĠĠĠĠĠ Ġsigner . append Data ( data ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsignature Ġ= Ġsigner . sign ( this . privateKey . privateKey ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcipher Ġ= ĠRe cipient Cipher () ĊĠĠĠĠĠĠĠ Ġcipher . set Random ( vir gil Crypto . rng ) ĊĠĠĠĠĠĠĠ Ġcipher . set Encryption Cipher ( Aes 2 5 6 G cm ()) ĊĊĠĠĠĠĠĠĠ Ġcipher . custom Params (). addData ( V ir gil Crypto . CUSTOM _ PARAM _ SIGN ER _ ID , ĠprivateKey . identifier ) ĊĠĠĠĠĠĠĠ Ġcipher . custom Params (). addData ( V ir gil Crypto . CUSTOM _ PARAM _ SIGNATURE , Ġsignature ) ĊĊĠĠĠĠĠĠĠ Ġcipher . add Key Recipient ( publicKey . identifier , Ġthis . publicKey . publicKey ) ĊĊĠĠĠĠĠĠĠ Ġcipher . start Encryption () ĊĊĠĠĠĠĠĠĠ Ġval Ġmeta Ġ= Ġcipher . pack MessageInfo () ĊĠĠĠĠĠĠĠ Ġvar Ġencrypted Data Ġ= Ġcipher . process Encryption ( data ) ĊĠĠĠĠĠĠĠ Ġencrypted Data Ġ+= Ġcipher . finish Encryption () ĊĊĠĠĠĠĠĠĠ Ġval Ġpushed Value Ġ= Ġthis . key kn ox Client . push Value ( meta , Ġencrypted Data , Ġnull , Ġthis . token Str ) ĊĠĠĠĠĠĠĠ Ġassert ArrayEquals ( encrypted Data , Ġpushed Value . value ) ĊĊĠĠĠĠĠĠĠ Ġsigner . reset () ĊĠĠĠĠĠĠĠ Ġsigner . append Data ( data 2 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsignature 2 Ġ= Ġsigner . sign ( this . privateKey . privateKey ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcipher 2 Ġ= ĠRe cipient Cipher () ĊĠĠĠĠĠĠĠ Ġcipher 2 . set Random ( vir gil Crypto . rng ) ĊĠĠĠĠĠĠĠ Ġcipher 2 . set Encryption Cipher ( Aes 2 5 6 G cm ()) ĊĊĠĠĠĠĠĠĠ Ġcipher 2 . custom Params (). addData ( V ir gil Crypto . CUSTOM _ PARAM _ SIGN ER _ ID , ĠprivateKey . identifier ) ĊĠĠĠĠĠĠĠ Ġcipher 2 . custom Params (). addData ( V ir gil Crypto . CUSTOM _ PARAM _ SIGNATURE , Ġsignature 2 ) ĊĊĠĠĠĠĠĠĠ Ġcipher 2 . add Key Recipient ( publicKey . identifier , Ġthis . publicKey . publicKey ) ĊĊĠĠĠĠĠĠĠ Ġcipher 2 . start Encryption () ĊĊĠĠĠĠĠĠĠ Ġval Ġmeta 2 Ġ= Ġcipher 2 . pack MessageInfo () ĊĠĠĠĠĠĠĠ Ġvar Ġencrypted Data 2 Ġ= Ġcipher 2 . process Encryption ( data 2 ) ĊĠĠĠĠĠĠĠ Ġencrypted Data 2 Ġ+= Ġcipher 2 . finish Encryption () ĊĊĠĠĠĠĠĠĠ Ġval Ġpushed Value 2 Ġ= Ġthis . key kn ox Client . push Value ( meta 2 , Ġencrypted Data 2 , Ġpushed Value . key kn ox Hash , Ġthis . token Str ) ĊĠĠĠĠĠĠĠ Ġassert ArrayEquals ( encrypted Data 2 , Ġpushed Value 2 . value ) ĊĠĠĠĠĠĠĠ Ġassert ArrayEquals ( meta 2 , Ġpushed Value 2 . meta ) ĊĠĠĠĠĠĠĠ ĠassertEquals (" 2 . 0 ", Ġpushed Value 2 . version ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( pus hed Value 2 . key kn ox Hash ) ĊĠĠĠĠĠĠĠ ĠassertFalse ( pus hed Value 2 . key kn ox Hash !!. isEmpty ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġpull Value _ empty () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠK TC - 3 ĊĠĠĠĠĠĠĠ Ġval Ġpulled Value Ġ= Ġthis . key kn ox Client . pull Value ( this . token Str ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( pul led Value . value ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( pul led Value . value !!. isEmpty ()) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( pul led Value . meta ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( pul led Value . meta !!. isEmpty ()) ĊĠĠĠĠĠĠĠ ĠassertEquals (" 1 . 0 ", Ġpulled Value . version ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġreset Value () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠK TC - 4 ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġbase 6 4 Encode ( UUID . randomUUID (). toString ()) ĊĠĠĠĠĠĠĠ Ġval Ġmeta Ġ= Ġbase 6 4 Encode ( UUID . randomUUID (). toString ()) ĊĠĠĠĠĠĠĠ Ġval Ġpushed Value Ġ= Ġthis . key kn ox Client . push Value ( meta , Ġdata , Ġnull , Ġthis . token Str ) ĊĠĠĠĠĠĠĠ Ġassert ArrayEquals ( data , Ġpushed Value . value ) ĊĊĠĠĠĠĠĠĠ Ġval Ġreset Value Ġ= Ġthis . key kn ox Client . reset Value ( this . token Str ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( reset Value . value ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( reset Value . value !!. isEmpty ()) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( reset Value . meta ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( reset Value . meta !!. isEmpty ()) ĊĠĠĠĠĠĠĠ ĠassertEquals (" 2 . 0 ", Ġreset Value . version ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġreset Value _ empty () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠK TC - 5 ĊĠĠĠĠĠĠĠ Ġval Ġreset Value Ġ= Ġthis . key kn ox Client . reset Value ( this . token Str ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( reset Value . value ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( reset Value . value !!. isEmpty ()) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( reset Value . meta ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( reset Value . meta !!. isEmpty ()) ĊĠĠĠĠĠĠĠ ĠassertEquals (" 1 . 0 ", Ġreset Value . version ) ĊĠĠĠ Ġ} Ċ } Ċ