package Ġcom . sch ib st ed . account . web flows . persistence . compat ĊĊ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . SharedPreferences Ċ import Ġandroid . os . Build Ċ 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 Ġandroidx . annotation . Requires Api Ċ import Ġandroidx . annotation . Visible ForTesting Ċ import Ġjava . math . BigInteger Ċ import Ġjava . security .* Ċ import Ġjava . security . spec . Algorithm Parameter Spec Ċ import Ġjava . security . spec . PKCS 8 Encoded KeySpec Ċ import Ġjava . security . spec . RSA Key Gen Parameter Spec Ċ import Ġjava . security . spec . X 5 0 9 Encoded KeySpec Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġjavax . security . auth . x 5 0 0 . X 5 0 0 Principal Ċ Ċ /** Ċ Ġ* ĠGenerates , Ġstores Ġand Ġprovides ĠRSA Ġkeys . Ċ Ġ*/ Ċ internal Ġinterface ĠEncryption Key Provider Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ[ KeyPair ] Ġthat Ġis Ġcurrently Ġused Ġby Ġthe Ġapp . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġkey Pair : ĠKey Pair ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġnew Ġ[ KeyPair ]. ĠOn ĠSDK s Ġ>= Ġ 1 8 Ġ( J EL LY _ BE AN _ MR 2 ) Ġits Ġexpiration Ġis Ġset Ġto Ġ 3 6 5 Ġdays , ĊĠĠĠĠ Ġ* Ġon Ġolder ĠSDK s Ġ- Ġun limited . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġrefresh KeyPair () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġtrue Ġif Ġthe Ġcurrent Ġ[ KeyPair ] Ġwill Ġexpire Ġwithin Ġ 9 0 Ġdays . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġis Key Close To Expiration (): ĠBoolean ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCreates Ġa Ġnew Ġ[ Encryption Key Provider ] Ġfor Ġthe Ġcurrent ĠSDK Ġversion . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġcreate ( context : ĠContext ): ĠEncryption Key Provider Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapp Context Ġ= Ġcontext . application Context ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBuild . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . P Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Api 2 8 ( app Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBuild . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . M Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Api 2 3 ( app Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBuild . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . J EL LY _ BE AN _ MR 2 Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Api 1 8 ( app Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Api 1 4 ( app Context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠĠĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . P ) ĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġcreate Api 2 8 ( app Context : ĠContext ): ĠEncryption Key Provider Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApi 2 8 Provider ( app Context ) ĊĊĠĠĠĠĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠĠĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . M ) ĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġcreate Api 2 3 ( app Context : ĠContext ): ĠEncryption Key Provider Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApi 2 3 Provider ( app Context ) ĊĊĠĠĠĠĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠĠĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . J EL LY _ BE AN _ MR 2 ) ĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġcreate Api 1 8 ( app Context : ĠContext ): ĠEncryption Key Provider Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApi 1 8 Provider ( app Context ) ĊĊĠĠĠĠĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġcreate Api 1 4 ( app Context : ĠContext ): ĠEncryption Key Provider Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApi 1 4 Provider ( app Context ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġconst Ġval ĠKEY _ ALIAS Ġ= Ġ" identity Key Alias " Ċ private Ġconst Ġval ĠKEY _ PR INC IP AL Ġ= Ġ" CN =$ KEY _ ALIAS , ĠO = Sch ib st ed ĠIdentity " Ċ private Ġconst Ġval ĠKEY STORE _ ALGORITHM Ġ= Ġ" RSA " Ċ private Ġconst Ġval ĠKEY STORE _ PROVIDER Ġ= Ġ" Android KeyStore " Ċ private Ġconst Ġval ĠP REF S _ FILENAME Ġ= Ġ" IDENTITY _ KEY STORE " Ċ private Ġconst Ġval ĠP REF S _ PRIVATE _ KEY Ġ= Ġ" IDENTITY _ PR _ KEY _ PAIR " Ċ private Ġconst Ġval ĠP REF S _ PUBLIC _ KEY Ġ= Ġ" IDENTITY _ PU _ KEY _ PAIR " Ċ private Ġconst Ġval ĠP REF S _ EXPI RATION Ġ= Ġ" IDENTITY _ KEY _ EXPI RATION _ DATE " Ċ private Ġconst Ġval ĠUNKNOWN Ġ= Ġ 0 L Ċ private Ġconst Ġval ĠNE VER Ġ= Ġ- 1 L Ċ Ċ private Ġabstract Ġclass ĠBase Provider ( ĊĠĠĠ Ġprotected Ġval Ġapp Context : ĠContext Ċ ) Ġ: ĠEncryption Key Provider Ġ{ ĊĊĠĠĠ Ġprotected Ġval Ġprefs : ĠSharedPreferences Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġapp Context . get SharedPreferences ( PRE FS _ FILENAME , ĠContext . MODE _ PRIVATE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġvar Ġexpiration : ĠLong ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġprefs . getLong ( PRE FS _ EXPI RATION , ĠUNKNOWN ) ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ= Ġwith ( prefs . edit ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Long ( PRE FS _ EXPI RATION , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapply () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġkeys : ĠKey Pair ĊĊĠĠĠ Ġoverride Ġval Ġkey Pair : ĠKey Pair ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! :: keys . isInitialized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeys Ġ= Ġretrieve () Ġ?: Ġgenerate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġkeys ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrefresh KeyPair () Ġ{ ĊĠĠĠĠĠĠĠ Ġkeys Ġ= Ġgenerate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Key Close To Expiration (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexp Ġ= Ġexpiration ĊĠĠĠĠĠĠĠ Ġval Ġthreshold Ġ= ĠSystem . currentTimeMillis () Ġ+ ĠTimeUnit . DAYS . to Millis ( 9 0 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( exp ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUNKNOWN Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNE VER Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġexp Ġ< Ġthreshold ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġabstract Ġfun Ġretrieve (): ĠKey Pair ? ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġgenerate (): ĠKey Pair Ċ } Ċ Ċ private Ġclass ĠApi 1 4 Provider ( app Context : ĠContext ) Ġ: ĠBase Provider ( app Context ) Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġretrieve (): ĠKey Pair ? Ġ= Ġprefs . run Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( public Bytes , Ġprivate Bytes ) Ġ= Ġread From Prefs () Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġcreate KeyPair ( public Bytes , Ġprivate Bytes ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġgenerate (): ĠKey Pair Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġkey Generator Api 1 4 () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. gen Keys ( spec Api 1 4 ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate KeyPair ( it . public . encoded , Ġit . private . encoded ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstore To Prefs ( it . public . encoded , Ġit . private . encoded ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpiration Ġ= ĠNE VER ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstore To Prefs ( public : ĠByteArray , Ġprivate : ĠByteArray ) Ġ= Ġprefs . edit (). run Ġ{ ĊĠĠĠĠĠĠĠ Ġput String ( PRE FS _ PUBLIC _ KEY , ĠString ( public . encode Base 6 4 ())) ĊĠĠĠĠĠĠĠ Ġput String ( PRE FS _ PRIVATE _ KEY , ĠString ( private . encode Base 6 4 ())) ĊĠĠĠĠĠĠĠ Ġapply () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġread From Prefs (): ĠPair < ByteArray , ĠByteArray >? Ġ= Ġprefs . run Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpublic Ġ= ĠgetString ( PRE FS _ PUBLIC _ KEY , Ġnull ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġprivate Ġ= ĠgetString ( PRE FS _ PRIVATE _ KEY , Ġnull ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġpublic . toByteArray (). decode Base 6 4 () Ġto Ġprivate . toByteArray (). decode Base 6 4 () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate KeyPair ( public : ĠByteArray , Ġprivate : ĠByteArray ): ĠKey Pair Ġ= ĊĠĠĠĠĠĠĠ ĠKey Factory . getInstance ( KEY STORE _ ALGORITHM ). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKey Pair ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Public ( X 5 0 9 Encoded KeySpec ( public )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Private ( PKCS 8 Encoded KeySpec ( private )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ Ċ @ Requires Api ( Build . VERSION _ CODES . J EL LY _ BE AN _ MR 2 ) Ċ private Ġclass ĠApi 1 8 Provider ( app Context : ĠContext ) Ġ: ĠBase Provider ( app Context ) Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġretrieve (): ĠKey Pair ? Ġ= Ġload KeyStore (). fetch KeyPair Api 1 8 () ĊĊĠĠĠ Ġoverride Ġfun Ġgenerate (): ĠKey Pair Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( from , Ġtill ) Ġ= Ġvalidity Dates () ĊĠĠĠĠĠĠĠ Ġreturn Ġkey Generator Api 1 8 () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. gen Keys ( spec Api 1 8 ( app Context , Ġfrom , Ġtill )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġexpiration Ġ= Ġtill . time Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Requires Api ( Build . VERSION _ CODES . M ) Ċ private Ġclass ĠApi 2 3 Provider ( app Context : ĠContext ) Ġ: ĠBase Provider ( app Context ) Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġretrieve (): ĠKey Pair ? Ġ= Ġload KeyStore (). fetch KeyPair Api 1 8 () ĊĊĠĠĠ Ġoverride Ġfun Ġgenerate (): ĠKey Pair Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( from , Ġtill ) Ġ= Ġvalidity Dates () ĊĠĠĠĠĠĠĠ Ġreturn Ġkey Generator Api 1 8 () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. gen Keys ( spec Api 2 3 ( from , Ġtill )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġexpiration Ġ= Ġtill . time Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Requires Api ( Build . VERSION _ CODES . P ) Ċ private Ġclass ĠApi 2 8 Provider ( app Context : ĠContext ) Ġ: ĠBase Provider ( app Context ) Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġretrieve (): ĠKey Pair ? Ġ= Ġload KeyStore (). fetch KeyPair Api 2 8 () ĊĊĠĠĠ Ġoverride Ġfun Ġgenerate (): ĠKey Pair Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( from , Ġtill ) Ġ= Ġvalidity Dates () ĊĠĠĠĠĠĠĠ Ġreturn Ġkey Generator Api 1 8 () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. gen Keys ( spec Api 2 3 ( from , Ġtill )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġexpiration Ġ= Ġtill . time Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Requires Api ( Build . VERSION _ CODES . J EL LY _ BE AN _ MR 2 ) Ċ private Ġfun Ġload KeyStore (): ĠKey Store Ġ= ĠKey Store . getInstance ( KEY STORE _ PROVIDER ). apply Ġ{ ĊĠĠĠ Ġload ( null ) Ċ } Ċ Ċ @ Requires Api ( Build . VERSION _ CODES . J EL LY _ BE AN _ MR 2 ) Ċ private Ġfun ĠKey Store . fetch KeyPair Api 1 8 (): ĠKey Pair ? Ġ= Ġrun Catch ing Ġ{ ĊĠĠĠ Ġget Entry ( KEY _ ALIAS , Ġnull )?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġit Ġas ĠKey Store . PrivateKey Entry ĊĠĠĠĠĠĠĠ ĠKey Pair ( it . certificate . publicKey , Ġit . privateKey ) ĊĠĠĠ Ġ} Ċ }. on Failure Ġ{ ĊĠĠĠ Ġdelete Entry ( KEY _ ALIAS ) Ċ }. get OrNull () Ċ Ċ @ Requires Api ( Build . VERSION _ CODES . P ) Ċ private Ġfun ĠKey Store . fetch KeyPair Api 2 8 (): ĠKey Pair ? Ġ= Ġrun Catch ing Ġ{ ĊĠĠĠ Ġval ĠprivateKey Ġ= ĠgetKey ( KEY _ ALIAS , Ġnull ) Ġas ? ĠPrivate Key Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġval ĠpublicKey Ġ= Ġget Certificate ( KEY _ ALIAS )?. publicKey Ġ?: Ġreturn Ġnull ĊĠĠĠ ĠKey Pair ( publicKey , ĠprivateKey ) Ċ }. on Failure Ġ{ ĊĠĠĠ Ġdelete Entry ( KEY _ ALIAS ) Ċ }. get OrNull () Ċ Ċ private Ġfun Ġvalidity Dates (): ĠPair < Date , ĠDate > Ġ= ĠSystem . currentTimeMillis (). let Ġ{ ĊĠĠĠ ĠDate ( it Ġ- ĠTimeUnit . DAYS . to Millis ( 1 )) Ġto ĠDate ( it Ġ+ ĠTimeUnit . DAYS . to Millis ( 3 6 5 )) Ċ } Ċ Ċ private Ġfun Ġspec Api 1 4 (): ĠAlgorithm Parameter Spec Ġ= ĊĠĠĠ ĠRSA Key Gen Parameter Spec ( 1 0 2 4 , ĠRSA Key Gen Parameter Spec . F 4 ) Ċ Ċ @ Suppress (" DE PREC ATION ") Ċ @ Requires Api ( Build . VERSION _ CODES . J EL LY _ BE AN _ MR 2 ) Ċ private Ġfun Ġspec Api 1 8 ( context : ĠContext , Ġfrom : ĠDate , Ġtill : ĠDate ): ĠAlgorithm Parameter Spec Ġ= ĊĠĠĠ ĠKey Pair Generator Spec . Builder ( context ) ĊĠĠĠĠĠĠĠ Ġ. set Alias ( KEY _ ALIAS ) ĊĠĠĠĠĠĠĠ Ġ. set Subject ( X 5 0 0 Principal ( KEY _ PR INC IP AL )) ĊĠĠĠĠĠĠĠ Ġ. set SerialNumber ( BigInteger . valueOf ( 1 4 4 7 )) ĊĠĠĠĠĠĠĠ Ġ. set StartDate ( from ) ĊĠĠĠĠĠĠĠ Ġ. set EndDate ( till ) ĊĠĠĠĠĠĠĠ Ġ. build () Ċ Ċ @ Requires Api ( Build . VERSION _ CODES . M ) Ċ private Ġfun Ġspec Api 2 3 ( from : ĠDate , Ġtill : ĠDate ): ĠAlgorithm Parameter Spec Ġ= ĊĠĠĠ ĠKey Gen Parameter Spec . Builder ( ĊĠĠĠĠĠĠĠ ĠKEY _ ALIAS , ĊĠĠĠĠĠĠĠ ĠKey Properties . P URPOSE _ ENCRYPT Ġor ĠKey Properties . P URPOSE _ DE CRYPT ĊĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ. set Digest s ( Key Properties . DIG EST _ SHA 2 5 6 , ĠKey Properties . DIG EST _ SHA 1 ) ĊĠĠĠĠĠĠĠ Ġ. set Certificate Subject ( X 5 0 0 Principal ( KEY _ PR INC IP AL )) ĊĠĠĠĠĠĠĠ Ġ. set Encryption P add ings ( Key Properties . ENCRYPT ION _ P ADDING _ RSA _ PKCS 1 ) ĊĠĠĠĠĠĠĠ Ġ. set Key Validity Start ( from ) ĊĠĠĠĠĠĠĠ Ġ. set Key Validity End ( till ) ĊĠĠĠĠĠĠĠ Ġ. build () Ċ Ċ private Ġfun Ġkey Generator Api 1 4 (): ĠKey Pair Generator Ġ= ĊĠĠĠ ĠKey Pair Generator . getInstance ( KEY STORE _ ALGORITHM ) Ċ Ċ @ Requires Api ( Build . VERSION _ CODES . J EL LY _ BE AN _ MR 2 ) Ċ private Ġfun Ġkey Generator Api 1 8 (): ĠKey Pair Generator Ġ= ĊĠĠĠ ĠKey Pair Generator . getInstance ( KEY STORE _ ALGORITHM , ĠKEY STORE _ PROVIDER ) Ċ Ċ private Ġfun ĠKey Pair Generator . gen Keys ( spec : ĠAlgorithm Parameter Spec ): ĠKey Pair Ġ= Ġrun Ġ{ ĊĠĠĠ Ġinitialize ( spec ) ĊĠĠĠ Ġgen KeyPair () Ċ } Ċ Ċ internal Ġfun ĠByteArray . encode Base 6 4 (): ĠByteArray Ġ= ĠBase 6 4 . encode ( this , ĠBase 6 4 . DEFAULT ) Ċ Ċ internal Ġfun ĠByteArray . decode Base 6 4 (): ĠByteArray Ġ= ĠBase 6 4 . decode ( this , ĠBase 6 4 . DEFAULT ) Ċ