package Ġcom . j cl ng rr d . les sp ass Ċ Ċ import Ġcom . j cl ng rr d . les sp ass . extension . contain Bits Ċ import Ġjava . math . BigInteger Ċ import Ġjavax . crypto . SecretKey Factory Ċ import Ġjavax . crypto . spec . P BE KeySpec Ċ Ċ object ĠLess Pass Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġcharacters Sub sets Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPassword Flags . LowerCase Ġto Ġ" abcdefgh ijkl mnopqrst uvw xyz ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPassword Flags . UpperCase Ġto Ġ" ABCDEF GH IJ KL MN OP Q RST UV W XYZ ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPassword Flags . Numeric Ġto Ġ" 0 1 2 3 4 5 6 7 8 9 ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPassword Flags . Symbols Ġto Ġ"! \" # \$ % & \\ ' ()* + ,- ./ : ;< => ? @ [ \\\\ ]^ _` { |} ~ " ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġenum Ġclass ĠPassword Flags ( val Ġflag : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠUnit ary Ġflags ĊĠĠĠĠĠĠĠ ĠLower Case ( 0 x 0 1 ), ĊĠĠĠĠĠĠĠ ĠUpper Case ( 0 x 0 2 ), ĊĠĠĠĠĠĠĠ ĠNumeric ( 0 x 0 4 ), ĊĠĠĠĠĠĠĠ ĠS ymbols ( 0 x 0 8 ), ĊĠĠĠĠĠĠĠ Ġ// ĠCom bined Ġflags ĊĠĠĠĠĠĠĠ ĠLet ters ( LowerCase . flag Ġor ĠUpper Case . flag ), ĊĠĠĠĠĠĠĠ ĠAlpha Numeric ( Letters . flag Ġor ĠNumeric . flag ), ĊĠĠĠĠĠĠĠ ĠAll ( Alpha Numeric . flag Ġor ĠS ymbols . flag ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgenerate Password ( site : ĠString , Ġlogin : ĠString , Ġmaster Password : ĠString , Ġpassword Profile : ĠPassword Profile ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrender Password ( calc Entropy ( site , Ġlogin , Ġmaster Password , Ġpassword Profile ), Ġpassword Profile ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalc Entropy ( site : ĠString , Ġlogin : ĠString , Ġmaster Password : ĠString , Ġpassword Profile : ĠPassword Profile ): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsalt Ġ= Ġsite Ġ+ Ġlogin Ġ+ ĠInteger . to HexString ( password Profile . counter ) ĊĠĠĠĠĠĠĠ Ġreturn ĠP BK DF 2 With H mac SHA 2 5 6 ( master Password , Ġsalt , Ġpassword Profile ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠP BK DF 2 With H mac SHA 2 5 6 ( master Password : ĠString , Ġsalt : ĠString , Ġpassword Profile : ĠPassword Profile ): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSecret Key Factory . getInstance ( password Profile . digest ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp be KeySpec Ġ= ĠP BE KeySpec ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmaster Password . toCharArray (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsalt . toByteArray (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpassword Profile . iteration , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpassword Profile . key Length Ġ* Ġ 8 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . generate Secret ( p be KeySpec ). encoded ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconsume Entropy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerated Password : ĠStringBuffer , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquot ient : ĠBigInteger , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Of Characters : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Length : ĠBigInteger , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠmaxLength : ĠInt ĊĠĠĠ Ġ): ĠPair < String , ĠInt > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( generated Password . length Ġ>= ĠmaxLength ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( generated Password . toString (), Ġquot ient . toInt ()) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquot ient . divide And Remain der ( set Length ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerated Password . append ( set Of Characters [ it . last (). toInt ()]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsume Entropy ( generated Password , Ġit . first (), Ġset Of Characters , Ġset Length , ĠmaxLength ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġget One Char Per Rule ( entropy : ĠInt , Ġflags : ĠPassword Flags ): ĠPair < String , ĠInt > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġone Char Per Rules Ġ= ĠStringBuffer () ĊĠĠĠĠĠĠĠ ĠLess Pass . characters Sub sets . filter Ġ{ Ġit . key . flag . contain Bits ( flags . flag ) Ġ}. on Each Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( value , Ġ_) Ġ= Ġconsume Entropy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerated Password Ġ= ĠStringBuffer (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquot ient Ġ= ĠBigInteger . valueOf ( entropy . to Long ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Of Characters Ġ= Ġit . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Length Ġ= ĠBigInteger . valueOf ( it . value . length . to Long ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmaxLength Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġone Char Per Rules . append ( value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( one Char Per Rules . toString (), Ġentropy ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinsert String Pseudo Random ly ( generated Password : ĠString , Ġentropy : ĠInt , Ġcharacters ToAdd : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġpassword Ġ= Ġgenerated Password ĊĠĠĠĠĠĠĠ Ġvar Ġquot ient Ġ= Ġentropy ĊĠĠĠĠĠĠĠ Ġfor Ġ( index Ġin Ġ 0 Ġuntil Ġcharacters ToAdd . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquot ient Ġ/= Ġgenerated Password . length ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremainder Ġ= Ġquot ient Ġ% Ġgenerated Password . length ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpassword Ġ= Ġpassword . substring ( 0 , Ġremainder ) Ġ+ Ġcharacters ToAdd [ index ] Ġ+ Ġpassword . substring ( remainder ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġpassword ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrender Password ( entropy : ĠByteArray , Ġpassword Profile : ĠPassword Profile ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠlistOf Sets Ġ= Ġcharacters Sub sets . filter Ġ{ Ġit . key . flag . contain Bits ( password Profile . password Flags . flag ) Ġ}. map Ġ{ Ġit . value Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġset Of Characters Ġ= ĠlistOf Sets . join ToString ("") ĊĠĠĠĠĠĠĠ Ġval Ġ( password , Ġpassword Entropy ) Ġ= Ġconsume Entropy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerated Password Ġ= ĠStringBuffer (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquot ient Ġ= ĠBigInteger ( entropy ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Of Characters Ġ= Ġset Of Characters , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Length Ġ= ĠBigInteger . valueOf ( set Of Characters . length . to Long ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmaxLength Ġ= Ġpassword Profile . length Ġ- ĠlistOf Sets . size ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġ( characters ToAdd , Ġcharacter Entropy ) Ġ= Ġget One Char Per Rule ( password Entropy , Ġpassword Profile . password Flags ) ĊĠĠĠĠĠĠĠ Ġreturn Ġinsert String Pseudo Random ly ( password , Ġcharacter Entropy , Ġcharacters ToAdd ) ĊĠĠĠ Ġ} Ċ }