package Ġex po . modules . updates . loader Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . security . keystore . Key Properties Ċ import Ġandroid . util . Base 6 4 Ċ import Ġokhttp 3 .* Ċ import Ġjava . io . IOException Ċ import Ġjava . security .* Ċ import Ġjava . security . spec . Invalid KeySpec Exception Ċ import Ġjava . security . spec . X 5 0 9 Encoded KeySpec Ċ Ċ object ĠCrypto Ġ{ ĊĠ Ġprivate Ġconst Ġval ĠPUBLIC _ KEY _ URL Ġ= Ġ" https :// exp . host / -- / manifest - public - key " ĊĊĠ Ġfun Ġverify Public RS AS ign ature ( ĊĠĠĠ Ġplain Text : ĠString , ĊĠĠĠ Ġcipher Text : ĠString , ĊĠĠĠ Ġfile Downloader : ĠFile Downloader , ĊĠĠĠ Ġlistener : ĠRS AS ign ature Listener ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġfetch PublicKey And Verify Public RS AS ign ature ( true , Ġplain Text , Ġcipher Text , Ġfile Downloader , Ġlistener ) ĊĠ Ġ} ĊĊĠ Ġ// ĠOn Ġfirst Ġattempt Ġuse Ġcache . ĠIf Ġverification Ġfails Ġtry Ġa Ġsecond Ġattempt Ġwithout ĊĠ Ġ// Ġcache Ġin Ġcase Ġthe Ġkeys Ġwere Ġactually Ġrotated . ĊĠ Ġ// ĠOn Ġsecond Ġattempt Ġreject Ġpromise Ġif Ġit Ġfails . ĊĠ Ġprivate Ġfun Ġfetch PublicKey And Verify Public RS AS ign ature ( ĊĠĠĠ Ġis First Attempt : ĠBoolean , ĊĠĠĠ Ġplain Text : ĠString , ĊĠĠĠ Ġcipher Text : ĠString , ĊĠĠĠ Ġfile Downloader : ĠFile Downloader , ĊĠĠĠ Ġlistener : ĠRS AS ign ature Listener ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġval Ġcache Control Ġ= Ġif Ġ( is First Attempt ) ĠCache Control . FORCE _ CACHE Ġelse ĠCache Control . FORCE _ NETWORK ĊĠĠĠ Ġval Ġrequest Ġ= ĠRequest . Builder () ĊĠĠĠĠĠ Ġ. url ( PUBLIC _ KEY _ URL ) ĊĠĠĠĠĠ Ġ. cache Control ( cache Control ) ĊĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġfile Downloader . download Data ( ĊĠĠĠĠĠ Ġrequest , ĊĠĠĠĠĠ Ġobject Ġ: ĠCallback Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( call : ĠCall , Ġe : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġlistener . onError ( e , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Response ( call : ĠCall , Ġresponse : ĠResponse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġexception : ĠException Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠisValid Ġ= Ġverify Public RS AS ign ature ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . body () !!. string (), Ġplain Text , Ġcipher Text ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Completed ( isValid ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( is First Attempt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfetch PublicKey And Verify Public RS AS ign ature ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplain Text , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcipher Text , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Downloader , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . onError ( exception , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĠ Ġ} ĊĊĠ Ġ@ Throws ( ĊĠĠĠ ĠNoSuch AlgorithmException :: class , ĊĠĠĠ ĠInvalid KeySpec Exception :: class , ĊĠĠĠ ĠInvalid Key Exception :: class , ĊĠĠĠ ĠSignature Exception :: class ĊĠ Ġ) ĊĠ Ġprivate Ġfun Ġverify Public RS AS ign ature ( ĊĠĠĠ ĠpublicKey : ĠString , ĊĠĠĠ Ġplain Text : ĠString , ĊĠĠĠ Ġcipher Text : ĠString ĊĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠ Ġ// Ġremove Ġcomments Ġfrom Ġpublic Ġkey ĊĠĠĠ Ġval ĠpublicKey Split Ġ= ĠpublicKey . split ("\\ r ? \\ n ". to Regex ()). to Typed Array () ĊĠĠĠ Ġvar ĠpublicKey No Comments Ġ= Ġ"" ĊĠĠĠ Ġfor Ġ( line Ġin ĠpublicKey Split ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ(! line . contains (" PUBLIC ĠKEY ----- ")) Ġ{ ĊĠĠĠĠĠĠĠ ĠpublicKey No Comments Ġ+= Ġline Ġ+ Ġ"\ n " ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġsignature Ġ= ĠSignature . getInstance (" SHA 2 5 6 with RSA ") ĊĠĠĠ Ġval Ġdecoded PublicKey Ġ= ĠBase 6 4 . decode ( publicKey No Comments , ĠBase 6 4 . DEFAULT ) ĊĠĠĠ Ġval ĠpublicKey Spec Ġ= ĠX 5 0 9 Encoded KeySpec ( decoded PublicKey ) ĊĠĠĠ Ġ@ Suppress Lint (" In lined Api ") Ġval Ġkey Factory Ġ= ĠKey Factory . getInstance ( Key Properties . KEY _ ALGORITHM _ RSA ) ĊĠĠĠ Ġval Ġkey Ġ= Ġkey Factory . generate Public ( publicKey Spec ) ĊĠĠĠ Ġsignature . init Verify ( key ) ĊĠĠĠ Ġsignature . update ( plain Text . toByteArray ()) ĊĠĠĠ Ġreturn Ġsignature . verify ( Base 6 4 . decode ( cipher Text , ĠBase 6 4 . DEFAULT )) ĊĠ Ġ} ĊĊĠ Ġinterface ĠRS AS ign ature Listener Ġ{ ĊĠĠĠ Ġfun ĠonError ( exception : ĠException , Ġis Network Error : ĠBoolean ) ĊĠĠĠ Ġfun Ġon Completed ( isValid : ĠBoolean ) ĊĠ Ġ} Ċ } Ċ