package com.clickdelivery.nativebridge import android.content.Context import android.security.keystore.KeyGenParameterSpec import android.security.keystore.KeyProperties import android.util.Base64 import java.security.KeyStore import javax.crypto.Cipher import javax.crypto.KeyGenerator import javax.crypto.SecretKey import javax.crypto.spec.GCMParameterSpec object SecureStore{ private const val ALIAS="clickdelivery_mobile_v07";private const val PREF="clickdelivery_secure" private fun key():SecretKey{val ks=KeyStore.getInstance("AndroidKeyStore").apply{load(null)};(ks.getKey(ALIAS,null) as? SecretKey)?.let{return it};val kg=KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES,"AndroidKeyStore");kg.init(KeyGenParameterSpec.Builder(ALIAS,KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT).setBlockModes(KeyProperties.BLOCK_MODE_GCM).setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE).build());return kg.generateKey()} fun set(c:Context,k:String,v:String){val cipher=Cipher.getInstance("AES/GCM/NoPadding");cipher.init(Cipher.ENCRYPT_MODE,key());val enc=cipher.doFinal(v.toByteArray(Charsets.UTF_8));val all=cipher.iv+enc;c.getSharedPreferences(PREF,Context.MODE_PRIVATE).edit().putString(k,Base64.encodeToString(all,Base64.NO_WRAP)).apply()} fun get(c:Context,k:String):String?{val raw=c.getSharedPreferences(PREF,Context.MODE_PRIVATE).getString(k,null)?:return null;return try{val all=Base64.decode(raw,Base64.NO_WRAP);val iv=all.copyOfRange(0,12);val enc=all.copyOfRange(12,all.size);val cipher=Cipher.getInstance("AES/GCM/NoPadding");cipher.init(Cipher.DECRYPT_MODE,key(),GCMParameterSpec(128,iv));String(cipher.doFinal(enc),Charsets.UTF_8)}catch(_:Exception){null}} fun delete(c:Context,k:String){c.getSharedPreferences(PREF,Context.MODE_PRIVATE).edit().remove(k).apply()} }