/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 9 ĠY ub ico . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . y ub ico . y ub ikit . android . app . ui . piv Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Base 6 4 Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . activity ViewModels Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġcom . y ub ico . y ub ikit . android . app . R Ċ import Ġcom . y ub ico . y ub ikit . android . app . databinding . Fragment P iv Cert ifi ate Binding Ċ import Ġcom . y ub ico . y ub ikit . android . app . ui . get Secret Ċ import Ġcom . y ub ico . y ub ikit . piv .* Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ import Ġorg . bouncycastle . asn 1 . ASN 1 Sequence Ċ import Ġorg . bouncycastle . asn 1 . x 5 0 0 . X 5 0 0 Name Ċ import Ġorg . bouncycastle . asn 1 . x 5 0 9 . Algorithm Identifier Ċ import Ġorg . bouncycastle . asn 1 . x 5 0 9 . Subject PublicKey Info Ċ import Ġorg . bouncycastle . asn 1 . x 9 . X 9 Object Identifiers Ċ import Ġorg . bouncycastle . cert . X 5 0 9 v 3 Certificate Builder Ċ import Ġorg . bouncycastle . operator . Content Signer Ċ import Ġjava . io . ByteArray InputStream Ċ import Ġjava . io . ByteArray OutputStream Ċ import Ġjava . io . OutputStream Ċ import Ġjava . math . BigInteger Ċ import Ġjava . security . Key Factory Ċ import Ġjava . security . Signature Ċ import Ġjava . security . cert . Certificate Factory Ċ import Ġjava . security . cert . X 5 0 9 Certificate Ċ import Ġjava . security . spec . PKCS 8 Encoded KeySpec Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util .* Ċ Ċ private Ġconst Ġval ĠD ER _ KEY Ġ= ĊĠĠĠĠĠĠĠ Ġ" MI IE v Q IB AD AN Bg k qh ki G 9 w 0 BA QE FA AS CB K cw gg S j Ag E AA o IB AQ C 0 G 2 6 6 KN ssen UQ " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ws q N 3 + f 3 ys mi H gp 4 3 4 5 w sai D cx X ry XX 3 pX r 3 vY di J FQ 6 H ii Mb fd pm 4 Fe ul LY CO dB " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" gh K HI h / M nx T uw q 6 m Pr xz L Fx q Gf H inv OR c 4 Y + m Z Si ic N / A jo + u Q dg H 5 Lr hl HJ 0 g 7 a " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" e 2 6 RW W 3 Z 4 p O el / Se X W Jg Km 4 pr h K zi 6 Or 3 NZ 1 l 4 W pg 4 C / lr LD 9 / bh L 6 Xd U mr / k Xc 2 " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" U old Uz 1 Zy T Nm D qr 0 oy ix 5 2 j X + T px p 7 Ws PU m X Uo ap x Vp ug O QK lk CG Fl tb 5 j na K 8 VY " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" rl Bf N 0 a 7 N 0 o + H CS IT hj BL br 6 5 q KX Om UY g S + q 5 O mid ye Cz / 1 AJ 5 OL w Sf 6 3 M 7 1 NX Mt " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Zo Jj Ld MB Ag MB AA EC gg E AT 6 Z + Hn fp Dc + OK / 5 p Q 7 s M xC n 7 Z + Wv Let 3 ++ Clr J Rd 0 mv C " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" 7 u VQ 7 3 Tz BX UZ hq ZF um z 7 a Mn ru a / e 6 U lut Cr I 9 Ng j hg Oo Z zr Ts BO 4 l Zq 9 t / KH ZX h 0 " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" MR QM / 2 w + Lm + Md IP Qr GJ 5 n 4 n 3 GI / LZ dy u 0 v K ZY FB TY 3 Nv Y 0 j CV r L nya 2 a EH a 6 MI p H " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" s Dy Ja 0 Ep j Z RM H sc P AP 4 C 9 h 0 EE / k Xd F uu 8 Q 4 I + RU hn W AE A ox 9 w Gq 0 5 cb W An zz 6 f 5 W " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" W WH UL 2 Cf Pv SL Hx 7 jj CX Om Xf 0 3 5 pj 9 1 If H gh Vo Qy U 0 U W 2 9 x KS qf Jv 7 n J wq V 6 7 C 0 cb " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" kd 2 Me N AR i Fi 7 z 4 kp 6 zi LU 6 g Pe L Qq 3 iy Wy 3 5 h TY Pl 3 Q KB g QD dl zn Gc 4 Y ke om H 3 W 2 2 " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" n H ol 3 B UL 9 6 g Or BS Zn zi NM 1 9 hv K QL k R hy I lik Qa S 7 RW lz Kb Kt D TF h PD ix Wh KE HD WZ " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" 1 DR s 9 th 8 LL Z HX MP + o Uy JP k FC X 2 8 sy P 7 D 4 cp XN Mb Rk 5 y JX cu F 7 2 s Y Ms 4 d ld j UQ Va 2 " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" 9 Da ED ka V FO E Ad IV OP Nm vm E 7 MD w KB g Q DQ Ey Im w Rk Hz pp + I AF q hy 0 6 DJ pml n O lk D 0 A " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" hr DAT + Ep X Tw J ss ZK 8 DH cw M h EQ b Bt + 3 j X j IX L dk o 0 b R 9 UU K Ip vi y F 3 TZ g 7 IG l M CT 4 " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" XS s / Ul WU ct 2 n 9 QR r IV 5 iv RN 5 + t ZZ r 4 + m xb m 5 d 7 aa 7 3 o Qu Zl 7 0 d 5 mn 6 P 4 y 5 Os Ec 5 s " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" X FN w US Cf 7 w KB g Do 5 Nh ES 4 bh MC j 8 My 3 sj + m Rg Q 5 d 1 Z 0 8 To AY Nd Aq F 6 RY BP w lb Ap Va " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" u Pf P 1 7 zt LB v 6 ZN xb jx IB h NP 0 2 t C jq OH Wh D / t TE y 0 Yu C 1 W zp Yn 4 eg N / 1 8 nf Wi im 5 l " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" s Yj gc S 0 4 H / Vo E 8 Y J dp Z RI x 9 a 9 DI x SN u hp 4 Fj Tu B 1 L / my p CQ + k OQ 2 n N 2 5 Ao GB AJ lw " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" 0 ql zk or QT 9 uc r I 6 r Wq 3 JJ 3 9 p ia TZ Rj M CI I vh HD EN w T 2 B q Xs Pw C WD w O uc 6 Y dh f 8 6 s " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" o On Wt Ig Ox KC / ya Y wy NJ 6 v CQ jp MN 1 Sn 4 g 7 si GZ ff P 8 S dv py 9 9 bw Y v Wp KE aN f Ag J XC " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" j + B 2 q KF + 4 iw 9 Qj Mu I + z X 4 uq Q 7 bh hd T Ex s JJ OM V nf Ao G ABS bx wv LP gl J 6 c po qy GL 5 " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" I hg 1 LS 4 q og 2 9 HV mn X 4 o / HL Xt T CO 1 6 9 y QP 5 l BW IG RO / y U cg ou gl J pe ik c J SP J ROW P " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ls 4 b 2 a Pv 5 hh Sx 4 7 MG Zb V AI h S bl s 5 z O ZX D Zm 4 w df QE 5 J + 4 k AV l Y F 7 3 Z Cr H 2 4 Zb qq y " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" MF / 0 w Dt / N Ex sv 6 FM Uw SK fy Y =" Ċ Ċ private Ġconst Ġval ĠPEM _ CERT Ġ= Ġ" ----- BEGIN ĠC ER TIFICATE ----- \ n " Ġ+ ĊĠĠĠĠĠĠĠ Ġ" MI IDS z CC Aj Og Aw IB Ag I UG 0 Za Y Hx ZY LP Zj CD g X so G MO C 5 i U cw DQ Y JK o ZI h vc NA Q EL \ n " Ġ+ ĊĠĠĠĠĠĠĠ Ġ" BQ Aw N TE h MB 8 GA 1 UE C gw Y SW 5 0 ZXJ u ZX Qg V 2 lk Z 2 l 0 cy BQ d H kg TH Rk MR Aw D gY DV QQ D \ n " Ġ+ ĊĠĠĠĠĠĠĠ Ġ" D Ad Fe GF tc G xl MB 4 XD TI w MD cy M DE 4 ND Q 1 M Vo XD TI x MD cy M DE 4 ND Q 1 MV ow N TE h MB 8 G \ n " Ġ+ ĊĠĠĠĠĠĠĠ Ġ" A 1 UE C gw Y SW 5 0 ZXJ u ZX Qg V 2 lk Z 2 l 0 cy BQ d H kg TH Rk MR Aw D gY DV QQ DD Ad Fe GF tc G xl \ n " Ġ+ ĊĠĠĠĠĠĠĠ Ġ" MI IB Ij AN Bg k qh ki G 9 w 0 BA QE FA AO CA Q 8 AM I IB Cg K CA QE At B tu ui jb L Hp 1 EML K jd / n \ n " Ġ+ ĊĠĠĠĠĠĠĠ Ġ" 9 8 r J oh 4 Ke N + Oc LG og 3 MV 6 8 l 1 9 6 V 6 9 7 2 HY i RU Oh 4 oj G 3 3 a Zu BX rp S 2 A jn Q YI Sh y If \ n " Ġ+ ĊĠĠĠĠĠĠĠ Ġ" z J 8 U 7 s K up j 6 8 cy xca h nx 4 p 7 zk XO GP pm U oon D fw I 6 Pr k HY B + S 6 4 ZR yd IO 2 nt uk V lt \ n " Ġ+ ĊĠĠĠĠĠĠĠ Ġ" 2 e KT np f 0 nl 1 i Y Cpu Ka 4 Ss 4 uj q 9 z Wd Ze Fq YO Av 5 ay w / f 2 4 S + l 3 VJ q / 5 F 3 Nl K JX VM 9 \ n " Ġ+ ĊĠĠĠĠĠĠĠ Ġ" W ck z Zg 6 q 9 K Mo sed o 1 / k 6 cae 1 r D 1 Jl 1 KG qc V abo Dk Cp ZA hh Zb W + Y 5 2 iv FW K 5 QX zd G \ n " Ġ+ ĊĠĠĠĠĠĠĠ Ġ" uz d K Ph w ki E 4 Yw S 2 6 + u ail z pl G IE v qu T pon c ng s / 9 Q Ce Ti 8 En + tz O 9 TV z LW aC Yy 3 T \ n " Ġ+ ĊĠĠĠĠĠĠĠ Ġ" AQ ID AQ AB o 1 Mw UT Ad Bg NV HQ 4 EF g QU 8 Wa OD ua BC dc JS nl 3 e Lw MP / L XB 8 Aw H wY D VR 0 j \ n " Ġ+ ĊĠĠĠĠĠĠĠ Ġ" BB gw Fo AU 8 Wa OD ua BC dc JS nl 3 e Lw MP / L XB 8 Aw D wY D VR 0 TA QH / BA Uw Aw EB / z AN Bg kq \ n " Ġ+ ĊĠĠĠĠĠĠĠ Ġ" h ki G 9 w 0 BA Qs FA AO CA QE Ag d Y Sn E 5 o GK BF op M us Bg X At n ru MS s 9 k U bg vd Uy Uh ht cu z \ n " Ġ+ ĊĠĠĠĠĠĠĠ Ġ" lr ZW Fb PB 0 3 / JH kj 7 i WY PN BE HX 1 R 8 NR J Nv OS k 5 gl 6 f 0 P 6 A 6 5 4 5 v 2 / qx QL sy c Qt BN i \ n " Ġ+ ĊĠĠĠĠĠĠĠ Ġ" 5 A 0 T q / 5 FOL yf K nd l / C 4 g Gh WQ Dr Gg + pl co IRD HC Qu fl 4 HE O VL QH 0 XC 6 Uf UM 8 fW Q GO \ n " Ġ+ ĊĠĠĠĠĠĠĠ Ġ" v RQ Cy UZ yp 4 7 Z Nj Z TR TY o N + pg ac X q Dt VQ a 9 GF + EZ LE b Ei 2 V Z Cu T bo NW 6 k FN H px jz V \ n " Ġ+ ĊĠĠĠĠĠĠĠ Ġ" 3 + 6 L WN PW u U Yy ku 2 0 L 1 w 4 AZ tr zs 3 EE 7 e AE V 6 W VP yp v hx 7 y Tx 6 F on X VF En j + t J 8 Eq b \ n " Ġ+ ĊĠĠĠĠĠĠĠ Ġ" pt 7 FX Tom DQ nn 8 T St w U ry x K 3 W jv 6 1 p BV hf Rb 2 BF U 4 og == \ n " Ġ+ ĊĠĠĠĠĠĠĠ Ġ" ----- END ĠC ER TIFICATE ----- \ n " Ċ Ċ class ĠP iv Certificate Fragment Ġ: ĠFragment () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġp iv ViewModel : ĠP iv ViewModel Ġby Ġactivity ViewModels () ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠFragment P iv Cert ifi ate Binding ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġslot : ĠSlot ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( in flater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ?): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠFragment P iv Cert ifi ate Binding . inflate ( in flater , Ġcontainer , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġreturn Ġbinding . root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġslot Ġ= ĠSlot . from Value ( require Arguments (). getInt ( ARG _ SLOT )) ĊĠĠĠĠĠĠĠ Ġbinding . title . text Ġ= ĠgetString ( require Arguments (). getInt ( ARG _ TITLE )) ĊĠĠĠĠĠĠĠ Ġshow Certs ( false ) ĊĊĠĠĠĠĠĠĠ Ġp iv ViewModel . certificates . observe ( view Lifecycle Owner , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ?: Ġreturn @ Observer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcert Ġ= Ġit . get ( slot . value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Certs ( cert Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cert Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpiration Ġ= ĠSimpleDateFormat (" yyyy - MM - dd ", ĠLocale . ROOT ). format ( cert . not After ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Type Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKey Type . from Key ( cert . publicKey ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcert . publicKey . algorithm ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . cert Info . text Ġ= Ġ" Issuer : Ġ${ cert . issuer DN }\ n Subject Ġname : Ġ${ cert . subject DN }\ n Expiration Ġdate : Ġ$ expiration \ n Key Ġtype : Ġ$ key Type " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ// ĠImport Ġa Ġstatic Ġkey Ġand Ġself - signed Ġcertificate ĊĠĠĠĠĠĠĠ Ġbinding . import Cert . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcert Ġ= ĠCertificate Factory . getInstance (" X . 5 0 9 "). generate Certificate ( PEM _ CERT . byte InputStream ()) Ġas ĠX 5 0 9 Certificate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= ĠKey Factory . getInstance (" RSA "). generate Private ( PKCS 8 Encoded KeySpec ( Base 6 4 . decode ( DER _ KEY , ĠBase 6 4 . DEFAULT ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle Scope . launch ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp iv ViewModel . pending Action . value Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauthenticate ( piv ViewModel . mgmt KeyType , Ġp iv ViewModel . mgmt Key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Key ( slot , Ġkey , ĠPin Policy . DEFAULT , ĠTouch Policy . DEFAULT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Certificate ( slot , Ġcert ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Imported Ġcertificate Ġ${ cert . subject DN } Ġissued Ġby Ġ${ cert . issuer DN }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠGenerate Ġa Ġkey , Ġthen Ġa Ġself - signed Ġcertificate , Ġand Ġimport ĊĠĠĠĠĠĠĠ Ġbinding . generate Cert . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle Scope . launch ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Secret ( require Context (), ĠR . string . enter _ pin )?. let Ġ{ Ġpin Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp iv ViewModel . pending Action . value Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauthenticate ( piv ViewModel . mgmt KeyType , Ġp iv ViewModel . mgmt Key ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGenerate Ġa Ġkey ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠpublicKey Ġ= Ġgenerate Key ( slot , ĠKey Type . ECC P 2 5 6 , ĠPin Policy . DEFAULT , ĠTouch Policy . DEFAULT ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify Pin ( pin . toCharArray ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGenerate Ġa Ġcertificate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= ĠX 5 0 0 Name (" CN = Generated ĠExample ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġserver Cert Gen Ġ= ĠX 5 0 9 v 3 Certificate Builder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBigInteger (" 1 2 3 4 5 6 7 8 9 "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDate (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDate (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSubject PublicKey Info . getInstance ( ASN 1 Sequence . getInstance ( publicKey . encoded )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcert Bytes Ġ= Ġserver Cert Gen . build ( object Ġ: ĠContent Signer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Buffer Ġ= ĠByteArrayOutputStream () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Algorithm Identifier (): ĠAlgorithm Identifier Ġ= ĠAlgorithm Identifier ( X 9 Object Identifiers . ecd sa _ with _ SHA 2 5 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget OutputStream (): ĠOutputStream Ġ= Ġmessage Buffer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Signature (): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsign ( slot , ĠKey Type . ECC P 2 5 6 , Ġmessage Buffer . toByteArray (), ĠSignature . getInstance (" SHA 2 5 6 with ECD SA ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}). encoded ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcert Ġ= ĠCertificate Factory . getInstance (" X . 5 0 9 "). generate Certificate ( ByteArray InputStream ( cert Bytes )) Ġas ĠX 5 0 9 Certificate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Certificate ( slot , Ġcert ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Generated Ġkey Ġin Ġslot Ġ$ slot " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠAt test Ġthe Ġcertificate ĊĠĠĠĠĠĠĠ Ġbinding . at test . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp iv ViewModel . pending Action . value Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcert Ġ= Ġat test Key ( slot ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Received Ġcertificate Ġ${ cert . subject DN } Ġissued Ġby Ġ${ cert . issuer DN }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠDelete Ġthe Ġcertificate ĊĠĠĠĠĠĠĠ Ġbinding . delete . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp iv ViewModel . pending Action . value Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauthenticate ( piv ViewModel . mgmt KeyType , Ġp iv ViewModel . mgmt Key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Certificate ( slot ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Deleted Ġcertificate Ġin Ġslot Ġ$ slot " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠSign Ġa Ġmessage Ġusing Ġthe Ġkey , Ġverify Ġthe Ġsignature Ġusing Ġthe Ġcertificate ĊĠĠĠĠĠĠĠ Ġbinding . sign . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Bytes Ġ= Ġbinding . message . text . toString (). toByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle Scope . launch ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Secret ( require Context (), ĠR . string . enter _ pin )?. let Ġ{ Ġpin Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp iv ViewModel . pending Action . value Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠpublicKey Ġ= Ġget Certificate ( slot ). publicKey ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Type Ġ= ĠKey Type . from Key ( publicKey ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify Pin ( pin . toCharArray ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġsignature ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsignature Algorithm Ġ= ĠSignature . getInstance ( when Ġ( key Type . params . algorithm ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKey Type . Algorithm . RSA Ġ-> Ġ" SHA 2 5 6 with RSA " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKey Type . Algorithm . EC Ġ-> Ġ" SHA 2 5 6 with ECD SA " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsignature Ġ= Ġsign ( slot , Ġkey Type , Ġmessage Bytes , Ġsignature Algorithm ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠVerify Ġsignature ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġsignature Algorithm . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit Verify ( publicKey ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate ( message Bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. verify ( signature ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Signature Ġ${ Base 6 4 . encode ToString ( signature , ĠBase 6 4 . DEFAULT )}" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Signature Ġverification Ġfailed " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Certs ( visible : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . cert Info . visibility Ġ= Ġif Ġ( visible ) ĠView . VISIBLE Ġelse ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠ Ġbinding . no Cert . visibility Ġ= Ġif Ġ( visible ) ĠView . IN VISIBLE Ġelse ĠView . VISIBLE ĊĊĠĠĠĠĠĠĠ Ġbinding . delete . isEnabled Ġ= Ġvisible ĊĠĠĠĠĠĠĠ Ġbinding . sign . isEnabled Ġ= Ġvisible ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠARG _ SLOT Ġ= Ġ" slot " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠARG _ TITLE Ġ= Ġ" title " ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġnew Instance ( slot : ĠSlot , Ġtitle : ĠInt ) Ġ= ĠP iv Certificate Fragment (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarguments Ġ= ĠBundle (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Int ( ARG _ SLOT , Ġslot . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Int ( ARG _ TITLE , Ġtitle ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ }