package Ġcom . lif tric . kv ault Ċ Ċ import Ġkotlinx . c interop .* Ċ import Ġplatform . Core Foundation .* Ċ import Ġplatform . Foundation .* Ċ import Ġplatform . Security .* Ċ import Ġplatform . darwin . no Err Ċ Ċ actual Ġclass ĠK Vault () Ġ{ ĊĠĠĠ Ġprivate Ġenum Ġclass ĠOperation Ġ{ ĠSet , ĠGet , ĠUpdate , ĠDelete Ġ} ĊĊĠĠĠ Ġvar Ġprints Debug Output Ġ= Ġtrue ĊĊĠĠĠ Ġprivate Ġvar ĠserviceName Ġ= Ġdefault ServiceName () ĊĠĠĠ Ġprivate Ġvar Ġaccess Group : ĠString ? Ġ= Ġnull ĊĊĠĠĠ Ġconstructor ( serviceName : ĠString , Ġaccess Group : ĠString ? Ġ= Ġnull ): Ġthis () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . serviceName Ġ= ĠserviceName ĊĠĠĠĠĠĠĠ Ġthis . access Group Ġ= Ġaccess Group ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ= ============== ĊĠĠĠ Ġ// ĠSET ĠOPER ATIONS ĊĠĠĠ Ġ// Ġ= ============== ĊĊĠĠĠ Ġactual Ġfun Ġset ( key : ĠString , Ġvalue : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" CAST _ NE VER _ SU CCE ED S ") ĊĠĠĠĠĠĠĠ Ġ( value Ġas ĠNSString ). data Using Encoding ( NS UTF 8 String Encoding )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġset ( key , Ġit ) ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġrun Ġ{ Ġreturn Ġfalse Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġfun Ġset ( key : ĠString , Ġvalue : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnumber Ġ= ĠNS Number . number With Int ( value ) ĊĠĠĠĠĠĠĠ Ġreturn Ġset ( key , ĠNS Key ed Arch iver . arch ived Data With Root Object ( number )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġfun Ġset ( key : ĠString , Ġvalue : ĠLong ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnumber Ġ= ĠNS Number . number With Long ( value ) ĊĠĠĠĠĠĠĠ Ġreturn Ġset ( key , ĠNS Key ed Arch iver . arch ived Data With Root Object ( number )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġfun Ġset ( key : ĠString , Ġvalue : ĠFloat ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnumber Ġ= ĠNS Number . number With Float ( value ) ĊĠĠĠĠĠĠĠ Ġreturn Ġset ( key , ĠNS Key ed Arch iver . arch ived Data With Root Object ( number )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġfun Ġset ( key : ĠString , Ġvalue : ĠDouble ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnumber Ġ= ĠNS Number . number With Double ( value ) ĊĠĠĠĠĠĠĠ Ġreturn Ġset ( key , ĠNS Key ed Arch iver . arch ived Data With Root Object ( number )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġfun Ġset ( key : ĠString , Ġvalue : ĠBoolean ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnumber Ġ= ĠNS Number . number With Bool ( value ) ĊĠĠĠĠĠĠĠ Ġreturn Ġset ( key , ĠNS Key ed Arch iver . arch ived Data With Root Object ( number )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ= ============== ĊĠĠĠ Ġ// ĠGET ĠOPER ATIONS ĊĠĠĠ Ġ// Ġ= ============== ĊĊĠĠĠ Ġactual Ġfun Ġstring ( for Key : ĠString ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġdata ( for Key )?. let Ġ{ Ġdata Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠNSString . create ( data , ĠNS UTF 8 String Encoding ) Ġas ĠString ? ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġfun Ġint ( for Key : ĠString ): ĠInt ? Ġ{ ĊĠĠĠĠĠĠĠ Ġdata ( for Key )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnumber Ġ= ĠNS Key ed Un arch iver . un archive Object WithData ( it ) Ġas ĠNS Number ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnumber . intValue ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġfun Ġlong ( for Key : ĠString ): ĠLong ? Ġ{ ĊĠĠĠĠĠĠĠ Ġdata ( for Key )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnumber Ġ= ĠNS Key ed Un arch iver . un archive Object WithData ( it ) Ġas ĠNS Number ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnumber . longValue ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġfun Ġfloat ( for Key : ĠString ): ĠFloat ? Ġ{ ĊĠĠĠĠĠĠĠ Ġdata ( for Key )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnumber Ġ= ĠNS Key ed Un arch iver . un archive Object WithData ( it ) Ġas ĠNS Number ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnumber . float Value ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġfun Ġdouble ( for Key : ĠString ): ĠDouble ? Ġ{ ĊĠĠĠĠĠĠĠ Ġdata ( for Key )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnumber Ġ= ĠNS Key ed Un arch iver . un archive Object WithData ( it ) Ġas ĠNS Number ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnumber . doubleValue ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġfun Ġbool ( for Key : ĠString ): ĠBoolean ? Ġ{ ĊĠĠĠĠĠĠĠ Ġdata ( for Key )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnumber Ġ= ĠNS Key ed Un arch iver . un archive Object WithData ( it ) Ġas ĠNS Number ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnumber . bool Value ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġfun Ġexists Object ( for Key : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġquery Ġ= ĠCF Dictionary Create Mutable ( null , Ġcapacity ( 4 ), Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠ ĠCF Dictionary Add Value ( query , Ġk Sec Class , Ġk Sec Class Generic Password ) ĊĠĠĠĠĠĠĠ ĠCF Dictionary Add Value ( query , Ġk Sec Attr Account , ĠC FB rid ging Ret ain ( for Key )) ĊĠĠĠĠĠĠĠ ĠCF Dictionary Add Value ( query , Ġk Sec Return Data , Ġk CF Boolean False ) ĊĠĠĠĠĠĠĠ ĠCF Dictionary Add Value ( query , Ġk Sec Attr Service , ĠC FB rid ging Ret ain ( serviceName )) ĊĊĠĠĠĠĠĠĠ Ġmem Scoped Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġalloc < CF Type Ref Var >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( perform ( Operation . Get , Ġquery , Ġresult , Ġverbose Ġ= Ġfalse )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ================= = ĊĠĠĠ Ġ// ĠDELETE ĠOPER ATIONS ĊĠĠĠ Ġ// Ġ================= = ĊĊĠĠĠ Ġactual Ġfun Ġdelete Object ( for Key : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġquery Ġ= ĠCF Dictionary Create Mutable ( null , Ġcapacity ( 3 ), Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠ ĠCF Dictionary Add Value ( query , Ġk Sec Class , Ġk Sec Class Generic Password ) ĊĠĠĠĠĠĠĠ ĠCF Dictionary Add Value ( query , Ġk Sec Attr Account , ĠC FB rid ging Ret ain ( for Key )) ĊĠĠĠĠĠĠĠ ĠCF Dictionary Add Value ( query , Ġk Sec Attr Service , ĠC FB rid ging Ret ain ( serviceName )) ĊĠĠĠĠĠĠĠ Ġreturn Ġperform ( Operation . Delete , Ġquery ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġactual Ġfun Ġclear () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġquery Ġ= ĠCF Dictionary Create Mutable ( null , Ġcapacity ( 2 ), Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠ ĠCF Dictionary Add Value ( query , Ġk Sec Class , Ġk Sec Class Generic Password ) ĊĠĠĠĠĠĠĠ ĠCF Dictionary Add Value ( query , Ġk Sec Attr Service , ĠC FB rid ging Ret ain ( serviceName )) ĊĠĠĠĠĠĠĠ Ġperform ( Operation . Delete , Ġquery ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ================= ĊĠĠĠ Ġ// ĠUPDATE ĠOPER ATIONS ĊĠĠĠ Ġ// Ġ================= ĊĊĠĠĠ Ġprivate Ġfun Ġupdate ( value : ĠNS Data , Ġfor Key : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġquery Ġ= ĠCF Dictionary Create Mutable ( null , Ġ 4 , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠ ĠCF Dictionary Add Value ( query , Ġk Sec Class , Ġk Sec Class Generic Password ) ĊĠĠĠĠĠĠĠ ĠCF Dictionary Add Value ( query , Ġk Sec Attr Account , ĠC FB rid ging Ret ain ( for Key )) ĊĠĠĠĠĠĠĠ ĠCF Dictionary Add Value ( query , Ġk Sec Return Data , Ġk CF Boolean False ) ĊĠĠĠĠĠĠĠ ĠCF Dictionary Add Value ( query , Ġk Sec Attr Service , ĠC FB rid ging Ret ain ( serviceName )) ĊĊĠĠĠĠĠĠĠ Ġval Ġupdate Query Ġ= ĠCF Dictionary Create Mutable ( null , Ġ 1 , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠ ĠCF Dictionary Add Value ( update Query , Ġk Sec Value Data , ĠC FB rid ging Ret ain ( value )) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġperform ( Operation . Update , Ġquery , Ġupdate Query Ġ= Ġupdate Query ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ= ============== ĊĠĠĠ Ġ// ĠHEL PER ĠMETHO DS ĊĠĠĠ Ġ// Ġ= ============== ĊĊĠĠĠ Ġprivate Ġfun Ġset ( key : ĠString , Ġvalue : ĠNS Data ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcapacity Ġ= Ġcapacity ( 4 ) ĊĠĠĠĠĠĠĠ Ġval Ġquery Ġ= ĠCF Dictionary Create Mutable ( null , Ġcapacity , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠ ĠCF Dictionary Add Value ( query , Ġk Sec Class , Ġk Sec Class Generic Password ) ĊĠĠĠĠĠĠĠ ĠCF Dictionary Add Value ( query , Ġk Sec Attr Account , ĠC FB rid ging Ret ain ( key )) ĊĠĠĠĠĠĠĠ ĠCF Dictionary Add Value ( query , Ġk Sec Value Data , ĠC FB rid ging Ret ain ( value )) ĊĠĠĠĠĠĠĠ ĠCF Dictionary Add Value ( query , Ġk Sec Attr Service , ĠC FB rid ging Ret ain ( serviceName )) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( exists Object ( key )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate ( value , Ġkey ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġperform ( Operation . Set , Ġquery ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdata ( for Key : ĠString ): ĠNS Data ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġquery Ġ= ĠCF Dictionary Create Mutable ( null , Ġcapacity ( 5 ), Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠ ĠCF Dictionary Add Value ( query , Ġk Sec Class , Ġk Sec Class Generic Password ) ĊĠĠĠĠĠĠĠ ĠCF Dictionary Add Value ( query , Ġk Sec Attr Account , ĠC FB rid ging Ret ain ( for Key )) ĊĠĠĠĠĠĠĠ ĠCF Dictionary Add Value ( query , Ġk Sec Return Data , Ġk CF Boolean True ) ĊĠĠĠĠĠĠĠ ĠCF Dictionary Add Value ( query , Ġk Sec Match Limit , Ġk Sec Match Limit One ) ĊĠĠĠĠĠĠĠ ĠCF Dictionary Add Value ( query , Ġk Sec Attr Service , ĠC FB rid ging Ret ain ( serviceName )) ĊĊĠĠĠĠĠĠĠ Ġmem Scoped Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġalloc < CF Type Ref Var >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( perform ( Operation . Get , Ġquery , Ġresult )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠC FB rid ging Release ( result . value ) Ġas ĠNS Data ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcapacity ( base : ĠCF Index ): ĠCF Index Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcapacity Ġ= Ġbase ĊĠĠĠĠĠĠĠ Ġaccess Group ?. let Ġ{ Ġcapacity Ġ+= Ġ 1 Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcapacity ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Access Group If Set ( query : ĠCF Mutable Dictionary Ref ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġaccess Group ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCF Dictionary Add Value ( query , Ġk Sec Attr Access Group , ĠC FB rid ging Ret ain ( it )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġperform ( ĊĠĠĠĠĠĠĠ Ġoperation : ĠOperation , Ġquery : ĠCF Mutable Dictionary Ref ?, ĊĠĠĠĠĠĠĠ Ġresult : ĠCF Type Ref Var ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġupdate Query : ĠCF Dictionary Ref ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġverbose : ĠBoolean ? Ġ= Ġtrue ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Access Group If Set ( query ) ĊĊĠĠĠĠĠĠĠ Ġval Ġstatus Ġ= Ġwhen Ġ( operation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOperation . Set Ġ-> ĠSec Item Add ( query , Ġresult ?. ptr ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOperation . Get Ġ-> ĠSec Item Copy Matching ( query , Ġresult ?. ptr ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOperation . Update Ġ-> ĠSec Item Update ( query , Ġupdate Query ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOperation . Delete Ġ-> ĠSec Item Delete ( query ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( status . to UInt () Ġ== Ġno Err ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Ġ= ĠSec Copy ErrorMessage String ( status , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠerrorMessage Ġ= ĠC FB rid ging Release ( error ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( prints Debug Output Ġ&& Ġverbose !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Operation Ġ-> Ġ${ operation . name }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("$ errorMessage ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdefault ServiceName (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ ĠConstants . Bundle Identifier ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġit ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠConstants . Default Identifier ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ