package Ġme . leon . controller Ċ Ċ import Ġjava . io . ByteArray InputStream Ċ import Ġjava . io . ByteArray OutputStream Ċ import Ġjava . security . Key Factory Ċ import Ġjava . security . Security Ċ import Ġjava . security . cert . Certificate Factory Ċ import Ġjava . security . spec . PKCS 8 Encoded KeySpec Ċ import Ġjava . security . spec . X 5 0 9 Encoded KeySpec Ċ import Ġjavax . crypto . Cipher Ċ import Ġme . leon . base . BYTE _ BITS Ċ import Ġme . leon . base . base 6 4 Ċ import Ġme . leon . base . base 6 4 Decode Ċ import Ġme . leon . ext . catch Ċ import Ġorg . bouncycastle . j ce . provider . Bo unc y Castle Provider Ċ import Ġt orn ad of x . Controller Ċ Ċ class ĠAs ymmetric Crypto Controller Ġ: ĠController () Ġ{ ĊĊĠĠĠ Ġfun Ġpub Encrypt ( key : ĠString , Ġalg : ĠString , Ġdata : ĠString , Ġlength : ĠInt Ġ= Ġ 1 0 2 4 , Ġreserved : ĠInt Ġ= Ġ 1 1 ) Ġ= ĊĠĠĠĠĠĠĠ Ġcatch ({ Ġ" encrypt Ġerror : Ġ$ it }" Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" encrypt Ġ$ key Ġ Ġ$ alg Ġ$ data ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Spec Ġ= ĠX 5 0 9 Encoded KeySpec ( get Prop PublicKey ( key )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Fac Ġ= Ġif Ġ( alg . contains ("/ ")) Ġalg . substring Before ('/') Ġelse Ġalg ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠpublicKey Ġ= ĠKey Factory . getInstance ( key Fac ). generate Public ( key Spec ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCipher . getInstance ( alg ). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit ( Cipher . ENCRYPT _ MODE , ĠpublicKey ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . toByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. chunk ed ( length Ġ/ ĠBYTE _ BITS Ġ- Ġreserved ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( it . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . do Final ( it . toByteArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. fold ( ByteArray OutputStream ()) Ġ{ Ġacc , Ġbytes Ġ-> Ġacc . also Ġ{ Ġacc . write ( bytes ) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. base 6 4 () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpri Decrypt ( key : ĠString , Ġalg : ĠString , Ġdata : ĠString , Ġlength : ĠInt Ġ= Ġ 1 0 2 4 ) Ġ= ĊĠĠĠĠĠĠĠ Ġcatch ({ Ġ" decrypt Ġerror : Ġ$ it " Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" decrypt Ġ$ key Ġ Ġ$ alg Ġ$ data ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Spec Ġ= ĠPKCS 8 Encoded KeySpec ( key . base 6 4 Decode ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Fac Ġ= Ġif Ġ( alg . contains ("/ ")) Ġalg . substring Before ('/') Ġelse Ġalg ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠprivateKey Ġ= ĠKey Factory . getInstance ( key Fac ). generate Private ( key Spec ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCipher . getInstance ( alg ). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit ( Cipher . DE CRYPT _ MODE , ĠprivateKey ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . base 6 4 Decode () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. chunk ed ( length Ġ/ ĠBYTE _ BITS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( it . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . do Final ( it . toByteArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. fold ( ByteArray OutputStream ()) Ġ{ Ġacc , Ġbytes Ġ-> Ġacc . also Ġ{ Ġacc . write ( bytes ) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toString ( Charsets . UTF _ 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpri Encrypt ( key : ĠString , Ġalg : ĠString , Ġdata : ĠString , Ġlength : ĠInt Ġ= Ġ 1 0 2 4 , Ġreserved : ĠInt Ġ= Ġ 1 1 ) Ġ= ĊĠĠĠĠĠĠĠ Ġcatch ({ Ġ" encrypt Ġerror : Ġ$ it " Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" pri Ġencrypt Ġ$ key Ġ Ġ$ alg Ġ$ data ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Spec Ġ= ĠPKCS 8 Encoded KeySpec ( key . base 6 4 Decode ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Fac Ġ= Ġif Ġ( alg . contains ("/ ")) Ġalg . substring Before ('/') Ġelse Ġalg ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠprivateKey Ġ= ĠKey Factory . getInstance ( key Fac ). generate Private ( key Spec ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCipher . getInstance ( alg ). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit ( Cipher . ENCRYPT _ MODE , ĠprivateKey ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . toByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. chunk ed ( length Ġ/ ĠBYTE _ BITS Ġ- Ġreserved ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( it . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . do Final ( it . toByteArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. fold ( ByteArray OutputStream ()) Ġ{ Ġacc , Ġbytes Ġ-> Ġacc . also Ġ{ Ġacc . write ( bytes ) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. base 6 4 () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpub Decrypt ( key : ĠString , Ġalg : ĠString , Ġdata : ĠString , Ġlength : ĠInt Ġ= Ġ 1 0 2 4 ) Ġ= ĊĠĠĠĠĠĠĠ Ġcatch ({ Ġ" decrypt Ġerror : Ġ$ it " Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" decrypt Ġ$ key Ġ Ġ$ alg Ġ$ data ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Spec Ġ= ĠX 5 0 9 Encoded KeySpec ( get Prop PublicKey ( key )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Fac Ġ= Ġif Ġ( alg . contains ("/ ")) Ġalg . substring Before ('/') Ġelse Ġalg ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠpublicKey Ġ= ĠKey Factory . getInstance ( key Fac ). generate Public ( key Spec ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCipher . getInstance ( alg ). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit ( Cipher . DE CRYPT _ MODE , ĠpublicKey ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . base 6 4 Decode () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. chunk ed ( length Ġ/ ĠBYTE _ BITS ) Ġ{ Ġthis . do Final ( it . toByteArray ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. fold ( ByteArray OutputStream ()) Ġ{ Ġacc , Ġbytes Ġ-> Ġacc . also Ġ{ Ġacc . write ( bytes ) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toString ( Charsets . UTF _ 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Prop PublicKey ( key : ĠString ) Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( key . contains (" ----- BEGIN ĠC ER TIFICATE ----- ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠbyteArray InputStream Ġ= ĠByteArrayInputStream ( key . toByteArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCertificate Factory . getInstance (" X . 5 0 9 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. generate Certificate ( byteArray InputStream ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. publicKey ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. encoded ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey . base 6 4 Decode () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSecurity . add Provider ( Bo unc y Castle Provider ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ