/* Ċ Ġ* Ġ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 . key storage Ċ Ċ import Ġcom . vir gil security . rat chet . exception . Key Storage Exception Ċ import Ġcom . vir gil security . rat chet . utils . Secure FileSystem Ċ import Ġcom . vir gil security . rat chet . utils . hex Encoded String Ċ import Ġcom . vir gil security . sdk . crypto . V ir gil Crypto Ċ import Ġcom . vir gil security . sdk . crypto . V ir gil KeyPair Ċ import Ġcom . vir gil security . sdk . utils . Convert ion Utils Ċ import Ġjava . nio . charset . StandardCharsets Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠFile Long Term Keys Storage Ġis Ġused Ġto Ġstore Ġlong - term Ġkeys . Ċ Ġ*/ Ċ class ĠFile Long Term Keys Storage ( ĊĠĠĠĠĠĠĠ Ġidentity : ĠString , ĊĠĠĠĠĠĠĠ Ġcrypto : ĠV ir gil Crypto , ĊĠĠĠĠĠĠĠ Ġidentity KeyPair : ĠV ir gil KeyPair , ĊĠĠĠĠĠĠĠ Ġroot Path : ĠString ? Ġ= Ġnull Ċ ) Ġ: ĠLong Term Keys Storage Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġfile System : ĠSecure FileSystem ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcredentials Ġ= ĠSecure FileSystem . Credentials ( crypto , Ġidentity KeyPair ) ĊĠĠĠĠĠĠĠ Ġfile System Ġ= ĠSecure FileSystem ( identity , Ġroot Path , ĠlistOf ( LONG _ TIME _ KEY _ STORAGE ), Ġcredentials ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstore Key ( key : ĠByteArray , Ġkey Id : ĠByteArray ): ĠLong Term Key Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkey Id Hex Ġ= Ġkey Id . hex Encoded String () ĊĠĠĠĠĠĠĠ Ġval Ġlong Term Key Ġ= ĠLong Term Key ( key Id , Ġkey , ĠDate ()) ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠConvert ion Utils . get Gson (). toJson ( long Term Key ). toByteArray ( StandardCharsets . UTF _ 8 ) ĊĠĠĠĠĠĠĠ Ġfile System . write ( key Id Hex , Ġdata ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġlong Term Key ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġretrieve Key ( key Id : ĠByteArray ): ĠLong Term Key Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkey Id Hex Ġ= Ġkey Id . hex Encoded String () ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġfile System . read ( key Id Hex ) ĊĠĠĠĠĠĠĠ Ġif Ġ( data . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠKey Storage Exception ( Key Storage Exception . KEY _ NOT _ FOUND , Ġ" Long - term Ġkey Ġ$ key Id Hex Ġnot Ġfound ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠConvert ion Utils . get Gson (). fromJson ( data . toString ( StandardCharsets . UTF _ 8 ), ĠLong Term Key :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdelete Key ( key Id : ĠByteArray ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkey Id Hex Ġ= Ġkey Id . hex Encoded String () ĊĠĠĠĠĠĠĠ Ġthis . file System . delete ( key Id Hex ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġretrieve All Keys (): ĠList < Long Term Key > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġall Key Ids Ġ= Ġfile System . list () ĊĠĠĠĠĠĠĠ Ġval Ġall Keys Ġ= Ġmutable ListOf < Long Term Key >() ĊĠĠĠĠĠĠĠ Ġall Key Ids . forEach Ġ{ Ġkey Id Hex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġfile System . read ( key Id Hex ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġall Keys . add ( Convert ion Utils . get Gson (). fromJson ( data . toString ( StandardCharsets . UTF _ 8 ), ĠLong Term Key :: class . java )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġall Keys ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġmark Key Out dated ( date : ĠDate , Ġkey Id : ĠByteArray ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkey Id Hex Ġ= Ġkey Id . hex Encoded String () ĊĠĠĠĠĠĠĠ Ġval Ġlong Term Key Ġ= Ġretrieve Key ( key Id ) ĊĠĠĠĠĠĠĠ Ġval Ġnew Long Term Key Ġ= ĠLong Term Key ( long Term Key . identifier , Ġlong Term Key . key , Ġlong Term Key . creation Date , Ġdate ) ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠConvert ion Utils . get Gson (). toJson ( new Long Term Key ). toByteArray ( StandardCharsets . UTF _ 8 ) ĊĠĠĠĠĠĠĠ Ġfile System . write ( key Id Hex , Ġdata ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġreset () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . file System . delete Dir () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠLONG _ TIME _ KEY _ STORAGE Ġ= Ġ" lt ks " ĊĠĠĠ Ġ} Ċ } Ċ