package Ġfi . dv v . dig iid . p oc . data . repositories Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . pm . PackageManager . FEATURE _ STRONG BOX _ KEY STORE Ċ import Ġandroid . os . Build Ċ import Ġandroid . security . keystore . Key Gen Parameter Spec Ċ import Ġandroid . security . keystore . Key Properties .* Ċ import Ġdagger . h ilt . android . qual ifiers . ApplicationContext Ċ import Ġfi . dv v . dig iid . p oc . data . di . IO Dispatcher Ċ import Ġfi . dv v . dig iid . p oc . domain . Encrypted Storage Manager Ċ import Ġfi . dv v . dig iid . p oc . domain . model . Auth State Ċ import Ġfi . dv v . dig iid . p oc . domain . model . Key Security Level Ċ import Ġfi . dv v . dig iid . p oc . domain . repository . Profile Repository Ċ import Ġkotlinx . coroutines . Coroutine Dispatcher Ċ import Ġkotlinx . coroutines . flow .* Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġorg . bouncycastle . asn 1 . pkcs . PKCS Object Identifiers Ċ import Ġorg . bouncycastle . asn 1 . x 5 0 9 .* Ċ import Ġorg . bouncycastle . cert . X 5 0 9 Certificate Holder Ċ import Ġorg . bouncycastle . cert . j ca j ce . J ca X 5 0 9 Certificate Converter Ċ import Ġorg . bouncycastle . openssl . PEM Parser Ċ import Ġorg . bouncycastle . openssl . j ca j ce . J ca PEM Writer Ċ import Ġorg . bouncycastle . operator . j ca j ce . J ca Content Signer Builder Ċ import Ġorg . bouncycastle . pkcs . j ca j ce . J ca PKCS 1 0 Cert ification RequestBuilder Ċ import Ġjava . io . String Reader Ċ import Ġjava . io . String Writer Ċ import Ġjava . net . Socket Ċ import Ġjava . security .* Ċ import Ġjava . security . cert . X 5 0 9 Certificate Ċ import Ġjava . util .* Ċ import Ġjavax . inject . Inject Ċ import Ġjavax . net . ssl . Key Manager Ċ import Ġjavax . net . ssl . Key ManagerFactory Ċ import Ġjavax . net . ssl . X 5 0 9 Key Manager Ċ import Ġjavax . security . auth . x 5 0 0 . X 5 0 0 Principal Ċ Ċ class ĠProfile Repository Impl Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġ@ IO Dispatcher Ġprivate Ġval Ġio Dispatcher : ĠCor outine Dispatcher , ĊĠĠĠ Ġprivate Ġval Ġencrypted Storage : ĠEn crypted Storage Manager , ĊĠĠĠ Ġ@ ApplicationContext Ġprivate Ġval Ġcontext : ĠContext , Ċ ) Ġ: ĠProfile Repository Ġ{ ĊĠĠĠ Ġoverride Ġval Ġauth State Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpin Ġ= Ġwith Context ( io Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġencrypted Storage [ KEY _ PIN _ CODE ] ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠMutable State Flow ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( pin ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> ĠAuth State . Un authenticated ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠAuth State . Locked () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġkeystore : ĠKey Store Ġ= ĠKey Store . getInstance (" Android KeyStore "). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġload ( null ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġkey Manager : ĠKey Manager Ġ= Ġrun Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġk mf Ġ= ĠKey ManagerFactory . getInstance ( Key ManagerFactory . getDefault Algorithm ()) ĊĠĠĠĠĠĠĠ Ġk mf . init ( keystore , Ġnull ) ĊĠĠĠĠĠĠĠ Ġval Ġorig Ġ= Ġk mf . key Managers . first () Ġas ĠX 5 0 9 Key Manager ĊĊĠĠĠĠĠĠĠ Ġobject Ġ: ĠX 5 0 9 Key Manager Ġby Ġorig Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġchoose Client Alias ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Type : ĠArray < out ĠString > ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiss u ers : ĠArray < out ĠPrincipal > ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsocket : ĠSocket ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ= ĠPRIVATE _ KEY _ ALIAS ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġkey Pair Ġ= ĠMutable State Flow ( ĊĠĠĠĠĠĠĠ Ġ( keystore . getEntry ( PRIVATE _ KEY _ ALIAS , Ġnull ) Ġas ? ĠKey Store . PrivateKey Entry )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKey Pair ( it . certificate . publicKey , Ġit . privateKey ) ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġcreate KeyPair () ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġfun Ġcreate KeyPair (): ĠKey Pair Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġbuilder ( block : Ġ( Key Gen Parameter Spec . Builder . () Ġ-> ĠUnit )? Ġ= Ġnull ): ĠKey Pair Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġk pg : ĠKey Pair Generator Ġ= ĠKey Pair Generator . getInstance ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKEY _ ALGORITHM _ EC , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Android KeyStore " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparameter Spec : ĠKey Gen Parameter Spec Ġ= ĠKey Gen Parameter Spec . Builder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPRIVATE _ KEY _ ALIAS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPURPOSE _ SIGN Ġor ĠPURPOSE _ VERIFY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock ?. invoke ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Digest s ( DIG EST _ SHA 2 5 6 , ĠDIG EST _ SHA 5 1 2 , ĠDIG EST _ NONE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġk pg . initialize ( parameter Spec ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġk pg . generate KeyPair () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġkotlin . run Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . P ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetIs Strong Box Back ed ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . package Manager . has System Feature ( FEATURE _ STRONG BOX _ KEY STORE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. get OrNull () Ġ?: Ġbuilder () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġkey Security Level : ĠFlow < Key Security Level > Ġ= Ġkey Pair . map Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkey Info Ġ= ĠKey Factory . getInstance ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . private . algorithm , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Android KeyStore " ĊĠĠĠĠĠĠĠ Ġ). getKey Spec ( it . private , Ġandroid . security . keystore . Key Info :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġkey Info . security Level () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġunlock ( pin Code : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Context ( io Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pin Code Ġ!= Ġencrypted Storage [ KEY _ PIN _ CODE ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauth State . emit ( Auth State . Locked ( true )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġauth State . emit ( Auth State . Unlock ed ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" Blocking Method In Non Blocking Context ") ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġset Profile ( certificate : ĠX 5 0 9 Certificate , Ġpin Code : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Context ( io Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġencrypted Storage [ KEY _ PIN _ CODE ] Ġ= Ġpin Code ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġkeystore . set Key Entry ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPRIVATE _ KEY _ ALIAS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Pair . value . private , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchar ArrayOf (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( certificate ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Pair . value Ġ= ĠKey Pair ( certificate . publicKey , Ġkey Pair . value . private ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauth State . emit ( Auth State . Unlock ed ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġlogout () Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Context ( io Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġencrypted Storage [ KEY _ PIN _ CODE ] Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkeystore . delete Entry ( PRIVATE _ KEY _ ALIAS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauth State . emit ( Auth State . Un authenticated ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcreate Signing Request ( sat u : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkey Pair Ġ= Ġthis . key Pair . value ĊĊĠĠĠĠĠĠĠ Ġval Ġsigner Ġ= ĠJ ca Content Signer Builder (" SHA 2 5 6 WIT HE CD SA "). build ( key Pair . private ) ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠJ ca PKCS 1 0 Cert ification RequestBuilder ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠX 5 0 0 Principal (" C Ġ= ĠFI , ĠST Ġ= ĠFin land , ĠL Ġ= ĠHel sink i , ĠO Ġ= ĠD VV , ĠCN Ġ= Ġ$ sat u "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Pair . public ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġext Gen Ġ= ĠExtensions Generator (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Extension ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExtension . subject Alternative Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGeneral Names ( General Name ( General Name . d NS Name , Ġ" URI : did : dv v :$ sat u ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbuilder . addAttribute ( PKCS Object Identifiers . pkcs _ 9 _ at _ extension Request , Ġext Gen . generate ()) ĊĠĠĠĠĠĠĠ Ġval Ġcsr Ġ= Ġbuilder . build ( signer ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠString Writer (). use Ġ{ Ġwriter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJ ca PEM Writer ( writer ). use Ġ{ Ġpem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpem . write Object ( csr ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġparse Certificate ( pem : ĠString ): ĠX 5 0 9 Certificate ? Ġ= ĊĠĠĠĠĠĠĠ Ġkotlin . run Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠString Reader ( pem ). use Ġ{ Ġreader Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( PEM Parser ( reader ). read Object () Ġas ? ĠX 5 0 9 Certificate Holder )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJ ca X 5 0 9 Certificate Converter (). get Certificate ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. get OrNull () ĊĊĠĠĠ Ġprivate Ġfun Ġandroid . security . keystore . Key Info . security Level (): ĠKey Security Level Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBuild . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . S Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( security Level ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSECURITY _ LEVEL _ STRONG BOX Ġ-> ĠKey Security Level . STRONG BOX ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSECURITY _ LEVEL _ TR UST ED _ ENVIRONMENT Ġ-> ĠKey Security Level . TE E ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSECURITY _ LEVEL _ UNKNOWN _ SECURE Ġ-> ĠKey Security Level . LEG ACY ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠKey Security Level . NONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" DE PREC ATION ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Inside Secure Hardware Ġ-> ĠKey Security Level . LEG ACY ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠKey Security Level . NONE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠKEY _ PIN _ CODE Ġ= Ġ" user _ pin _ code " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPRIVATE _ KEY _ ALIAS Ġ= Ġ" fi . dv v . dig iid . UserProfile " ĊĠĠĠ Ġ} Ċ }