@ file : Suppress (" DE PREC ATION ") Ċ Ċ package Ġio . github . w ulkan owy . utils . security Ċ Ċ import Ġandroid . annotation . Target Api Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Build . VERSION . SDK _ INT Ċ import Ġandroid . os . Build . VERSION _ CODES . J EL LY _ BE AN _ MR 2 Ċ import Ġandroid . os . Build . VERSION _ CODES . M Ċ import Ġandroid . security . KeyPair Generator Spec Ċ import Ġandroid . security . keystore . Key Gen Parameter Spec Ċ import Ġandroid . security . keystore . Key Properties .* Ċ import Ġandroid . util . Base 6 4 Ċ import Ġandroid . util . Base 6 4 . DEFAULT Ċ import Ġorg . apache . commons . lang 3 . StringUtils Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . io . ByteArray InputStream Ċ import Ġjava . io . ByteArray OutputStream Ċ import Ġjava . math . BigInteger Ċ import Ġjava . nio . charset . Charset Ċ import Ġjava . security . KeyPair Generator Ċ import Ġjava . security . KeyStore Ċ import Ġjava . security . PrivateKey Ċ import Ġjava . security . PublicKey Ċ import Ġjava . util .* Ċ import Ġjavax . crypto . Cipher Ċ import Ġjavax . crypto . Cipher . DE CRYPT _ MODE Ċ import Ġjavax . crypto . Cipher . ENCRYPT _ MODE Ċ import Ġjavax . crypto . Cipher InputStream Ċ import Ġjavax . crypto . Cipher OutputStream Ċ import Ġjavax . security . auth . x 5 0 0 . X 5 0 0 Principal Ċ import Ġkotlin . collections . ArrayList Ċ Ċ object ĠScr amb ler Ġ{ ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠKEY _ ALIAS Ġ= Ġ" USER _ PASSWORD " ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠAL G ORITHM _ RSA Ġ= Ġ" RSA " ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠKEY STORE _ NAME Ġ= Ġ" Android KeyStore " ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠKEY _ TRANS FORMATION _ ALGORITHM Ġ= Ġ" RSA / E CB / PKCS 1 Padding " ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠKEY _ CIPHER _ J EL LY _ PROVIDER Ġ= Ġ" Android Open SSL " ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠKEY _ CIPHER _ M _ PROVIDER Ġ= Ġ" Android KeyStore BC Work around " ĊĊĠĠĠ Ġprivate Ġval ĠKEY _ CHARSET Ġ= ĠCharset . forName (" UTF - 8 ") ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġencrypt ( plain Text : ĠString , Ġcontext : ĠContext ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( StringUtils . isEmpty ( plain Text )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠScr amb ler Exception (" Text Ġto Ġbe Ġencrypted Ġis Ġempty ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( SDK _ INT Ġ< ĠJ EL LY _ BE AN _ MR 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠString ( Base 6 4 . encode ( plain Text . toByteArray ( KEY _ CHARSET ), ĠDEFAULT ), ĠKEY _ CHARSET ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is KeyPair Exist ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate KeyPair ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcipher Ġ= Ġget Cipher () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcipher . init ( ENCRYPT _ MODE , Ġget PublicKey ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠoutputStream Ġ= ĠByteArrayOutputStream () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcipher OutputStream Ġ= ĠCipher OutputStream ( output Stream , Ġcipher ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcipher OutputStream . write ( plain Text . toByteArray ( KEY _ CHARSET )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcipher OutputStream . close () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠBase 6 4 . encode ToString ( output Stream . toByteArray (), ĠDEFAULT ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠScr amb ler Exception (" An Ġerror Ġoccurred Ġwhile Ġencrypt ing Ġtext ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġdecrypt ( cipher Text : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( StringUtils . isEmpty ( cipher Text )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠScr amb ler Exception (" Text Ġto Ġbe Ġencrypted Ġis Ġempty ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( SDK _ INT Ġ< ĠJ EL LY _ BE AN _ MR 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠString ( Base 6 4 . decode ( cipher Text . toByteArray ( KEY _ CHARSET ), ĠDEFAULT ), ĠKEY _ CHARSET ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! is KeyPair Exist ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠScr amb ler Exception (" KeyPair Ġdoesn 't Ġexist ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcipher Ġ= Ġget Cipher () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcipher . init ( DE CRYPT _ MODE , Ġget PrivateKey ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠCipher InputStream ( ByteArray InputStream ( Base 6 4 . decode ( cipher Text , ĠDEFAULT )), Ġcipher ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= ĠArrayList < Byte >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġnext Byte Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ({ Ġnext Byte Ġ= Ġinput . read (); Ġnext Byte Ġ} () Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues . add ( next Byte . to Byte ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= ĠByteArray ( values . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġbytes . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbytes [ i ] Ġ= Ġvalues [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠString ( bytes , Ġ 0 , Ġbytes . size , ĠKEY _ CHARSET ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠScr amb ler Exception (" An Ġerror Ġoccurred Ġwhile Ġdecrypt ing Ġtext ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetKey Store Instance (): ĠKey Store Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkey Store Ġ= ĠKey Store . getInstance ( KEY STORE _ NAME ) ĊĠĠĠĠĠĠĠ Ġkey Store . load ( null ) ĊĠĠĠĠĠĠĠ Ġreturn Ġkey Store ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget PublicKey (): ĠPublicKey Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( getKey Store Instance (). getEntry ( KEY _ ALIAS , Ġnull ) Ġas ĠKey Store . PrivateKey Entry ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. certificate . publicKey ĊĊĊĠĠĠ Ġprivate Ġfun Ġget PrivateKey (): ĠPrivate Key Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( getKey Store Instance (). getEntry ( KEY _ ALIAS , Ġnull ) Ġas ĠKey Store . PrivateKey Entry ). privateKey ĊĊĊĠĠĠ Ġprivate Ġfun Ġget Cipher (): ĠCipher Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( SDK _ INT Ġ>= ĠM ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠCipher . getInstance ( KEY _ TRANS FORMATION _ ALGORITHM , ĠKEY _ CIPHER _ M _ PROVIDER ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠCipher . getInstance ( KEY _ TRANS FORMATION _ ALGORITHM , ĠKEY _ CIPHER _ J EL LY _ PROVIDER ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Target Api ( J EL LY _ BE AN _ MR 2 ) ĊĠĠĠ Ġprivate Ġfun Ġgenerate KeyPair ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġspec Ġ= Ġif Ġ( SDK _ INT Ġ>= ĠM ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKey Gen Parameter Spec . Builder ( KEY _ ALIAS , ĠPURPOSE _ DE CRYPT Ġor ĠPURPOSE _ ENCRYPT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Digest s ( DIG EST _ SHA 2 5 6 , ĠDIG EST _ SHA 5 1 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Certificate Subject ( X 5 0 0 Principal (" CN = W ulkan owy ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Encryption P add ings ( ENCRYPT ION _ P ADDING _ RSA _ PKCS 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Signature P add ings ( SIGNATURE _ P ADDING _ RSA _ PKCS 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Certificate SerialNumber ( BigInteger . TEN ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Ġ= ĠCalendar . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Ġ= ĠCalendar . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend . add ( Calendar . YEAR , Ġ 9 9 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠKey Pair Generator Spec . Builder ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Alias ( KEY _ ALIAS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Subject ( X 5 0 0 Principal (" CN = W ulkan owy ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set SerialNumber ( BigInteger . TEN ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set StartDate ( start . time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set EndDate ( end . time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġgenerator Ġ= ĠKey Pair Generator . getInstance ( ALGORITHM _ RSA , ĠKEY STORE _ NAME ) ĊĠĠĠĠĠĠĠ Ġgenerator . initialize ( spec ) ĊĠĠĠĠĠĠĠ Ġgenerator . generate KeyPair () ĊĊĠĠĠĠĠĠĠ ĠTim ber . i (" A Ġnew ĠKey Pair Ġhas Ġbeen Ġgenerated ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis KeyPair Exist (): ĠBoolean Ġ= ĠgetKey Store Instance (). getKey ( KEY _ ALIAS , Ġnull ) Ġ!= Ġnull Ċ } Ċ