package Ġio . rs box . engine . system . crypt . rsa Ċ Ċ import Ġcom . uch uh imo . kon f . Config Ċ import Ġio . rs box . engine . Engine Constants Ċ import Ġio . rs box . engine . config . spec . Server Spec Ċ import Ġmu . K Logging Ċ import Ġorg . bouncycastle . j ce . provider . Bo unc y Castle Provider Ċ import Ġorg . bouncycastle . util . io . pem . Pem Object Ċ import Ġorg . bouncycastle . util . io . pem . Pem Reader Ċ import Ġorg . bouncycastle . util . io . pem . Pem Writer Ċ import Ġjava . io . File Ċ import Ġjava . math . BigInteger Ċ import Ġjava . nio . file . Files Ċ import Ġjava . nio . file . Paths Ċ import Ġjava . security . Key Factory Ċ import Ġjava . security . KeyPair Generator Ċ import Ġjava . security . Security Ċ import Ġjava . security . interfaces . RS AP rivate Key Ċ import Ġjava . security . interfaces . RS AP ublic Key Ċ import Ġjava . security . spec . PKCS 8 Encoded KeySpec Ċ Ċ /** Ċ Ġ* Ġ@ author ĠK yle ĠEs co bar Ċ Ġ* Ċ Ġ* ĠCred its Ġto ĠTom m 0 0 1 7 Ġfor Ġhis Ġimplementation Ċ Ġ*/ Ċ Ċ object ĠRSA Ġ: ĠK Logging () Ġ{ ĊĠĠĠ Ġlateinit Ġvar Ġexponent : ĠBigInteger ĊĊĠĠĠ Ġlateinit Ġvar Ġmod ulus : ĠBigInteger ĊĊĠĠĠ Ġlateinit Ġvar ĠpublicKey : ĠRS AP ublic Key ĊĊĠĠĠ Ġlateinit Ġvar ĠprivateKey : ĠRS AP rivate Key ĊĊĠĠĠ Ġprivate Ġconst Ġval Ġradix Ġ= Ġ 1 6 ĊĠĠĠ Ġprivate Ġval Ġbits Ġ= ĠConfig { add Spec ( Server Spec )} [ Server Spec . rsa _ bits ] ĊĠĠĠ Ġprivate Ġvar ĠprivateKey Path Ġ= ĠPaths . get ("../ ${ Engine Constants . RSA _ PRIVATE _ FILE }") ĊĠĠĠ Ġprivate Ġvar ĠpublicKey Path Ġ= ĠPaths . get ("../ ${ Engine Constants . RSA _ PUBLIC _ FILE }") ĊĠĠĠ Ġprivate Ġvar Ġmod ulus Path Ġ= ĠPaths . get ("../ ${ Engine Constants . RSA _ MOD UL US _ FILE }") ĊĊĠĠĠ Ġfun Ġload () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( Engine Constants . RSA _ PRIVATE _ FILE ) ĊĠĠĠĠĠĠĠ Ġif (! file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" The ĠRSA Ġkeys Ġhave Ġnot Ġbeen Ġgenerated . ĠPlease Ġrun Ġthe Ġ[ server : setup ] Ġgradle Ġtask Ġfirst .") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . exit ( 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPem Reader ( Files . new BufferedReader ( file . to Path ())). use Ġ{ Ġreader Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpem Ġ= Ġreader . read Pem Object () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Spec Ġ= ĠPKCS 8 Encoded KeySpec ( pem . content ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSecurity . add Provider ( Bo unc y Castle Provider ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfactory Ġ= ĠKey Factory . getInstance (" RSA ", Ġ" BC ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprivateKey Ġ= Ġfactory . generate Private ( key Spec ) Ġas ĠRS AP rivate Key ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexponent Ġ= ĠprivateKey . private Exponent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmod ulus Ġ= ĠprivateKey . modulus ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Loaded ĠRSA Ġkey Ġpairs .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch ( e Ġ: ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Unable Ġto Ġread ĠRSA Ġprivate Ġkey Ġfile .", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgenerate ( local Path : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ ĠSecurity . add Provider ( Bo unc y Castle Provider ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġk pg Ġ= ĠKey Pair Generator . getInstance (" RSA ", Ġ" BC ") ĊĠĠĠĠĠĠĠ Ġk pg . initialize ( bits ) ĊĠĠĠĠĠĠĠ Ġval Ġkp Ġ= Ġk pg . generate KeyPair () ĊĊĠĠĠĠĠĠĠ ĠprivateKey Ġ= Ġkp . private Ġas ĠRS AP rivate Key ĊĠĠĠĠĠĠĠ ĠpublicKey Ġ= Ġkp . public Ġas ĠRS AP ublic Key ĊĊĠĠĠĠĠĠĠ Ġexponent Ġ= ĠprivateKey . private Exponent ĊĠĠĠĠĠĠĠ Ġmod ulus Ġ= ĠprivateKey . modulus ĊĊĠĠĠĠĠĠĠ Ġif ( local Path ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠprivateKey Path Ġ= ĠPaths . get ( Engine Constants . RSA _ PRIVATE _ FILE ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠpublicKey Path Ġ= ĠPaths . get ( Engine Constants . RSA _ PUBLIC _ FILE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmod ulus Path Ġ= ĠPaths . get ( Engine Constants . RSA _ MOD UL US _ FILE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWrite Ġprivate Ġkey ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPem Writer ( Files . new Buffered Writer ( privateKey Path )). use Ġ{ Ġwriter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . write Object ( Pem Object (" RSA ĠPRIVATE ĠKEY ", ĠprivateKey . encoded )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWrite Ġpublic Ġkey ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPem Writer ( Files . new Buffered Writer ( publicKey Path )). use Ġ{ Ġwriter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . write Object ( Pem Object (" RSA ĠPUBLIC ĠKEY ", ĠpublicKey . encoded )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWrite Ġmod ulus Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . new Buffered Writer ( modulus Path ). use Ġ{ Ġwriter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . write ( modulus . toString ( radix )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch ( e Ġ: ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Error Ġgenerating ĠRSA Ġkey Ġpair Ġfiles .", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }