UNPKG

@rrishuyadav/react-native-encrypted-async-storage

Version:
3 lines (2 loc) 11.6 kB
"use strict";var e=require("@react-native-async-storage/async-storage"),t=require("rn-encryption"),r=require("react-native");function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var a=n(e);const{RNKeychainManager:i}=r.NativeModules;let s=function(e){return e.WHEN_UNLOCKED="AccessibleWhenUnlocked",e.AFTER_FIRST_UNLOCK="AccessibleAfterFirstUnlock",e.ALWAYS="AccessibleAlways",e.WHEN_PASSCODE_SET_THIS_DEVICE_ONLY="AccessibleWhenPasscodeSetThisDeviceOnly",e.WHEN_UNLOCKED_THIS_DEVICE_ONLY="AccessibleWhenUnlockedThisDeviceOnly",e.AFTER_FIRST_UNLOCK_THIS_DEVICE_ONLY="AccessibleAfterFirstUnlockThisDeviceOnly",e}({}),o=function(e){return e.USER_PRESENCE="UserPresence",e.BIOMETRY_ANY="BiometryAny",e.BIOMETRY_CURRENT_SET="BiometryCurrentSet",e.DEVICE_PASSCODE="DevicePasscode",e.APPLICATION_PASSWORD="ApplicationPassword",e.BIOMETRY_ANY_OR_DEVICE_PASSCODE="BiometryAnyOrDevicePasscode",e.BIOMETRY_CURRENT_SET_OR_DEVICE_PASSCODE="BiometryCurrentSetOrDevicePasscode",e}({}),c=function(e){return e.DEVICE_PASSCODE_OR_BIOMETRICS="AuthenticationWithBiometricsDevicePasscode",e.BIOMETRICS="AuthenticationWithBiometrics",e}({}),y=function(e){return e[e.SECURE_SOFTWARE=i&&i.SECURITY_LEVEL_SECURE_SOFTWARE]="SECURE_SOFTWARE",e[e.SECURE_HARDWARE=i&&i.SECURITY_LEVEL_SECURE_HARDWARE]="SECURE_HARDWARE",e[e.ANY=i&&i.SECURITY_LEVEL_ANY]="ANY",e}({}),u=function(e){return e.TOUCH_ID="TouchID",e.FACE_ID="FaceID",e.OPTIC_ID="OpticID",e.FINGERPRINT="Fingerprint",e.FACE="Face",e.IRIS="Iris",e}({}),p=function(e){return e.FB="FacebookConceal",e.AES="KeystoreAES",e.AES_CBC="KeystoreAESCBC",e.AES_GCM_NO_AUTH="KeystoreAESGCM_NoAuth",e.AES_GCM="KeystoreAESGCM",e.RSA="KeystoreRSAECB",e}({}),l=function(e){return e.NONE="none",e.AUTOMATIC_UPGRADE="automaticUpgradeToMoreSecuredStorage",e}({});const d={title:"Authenticate to retrieve secret",cancel:"Cancel"};function E(e){return"string"==typeof e?(console.warn(`You passed a service string as an argument to one of the react-native-keychain functions.\n This way of passing service is deprecated and will be removed in a future major.\n Please update your code to use { service: ${JSON.stringify(e)} }`),{service:e}):e||{}}function S(e){return"string"==typeof e?(console.warn(`You passed a server string as an argument to one of the react-native-keychain functions.\n This way of passing service is deprecated and will be removed in a future major.\n Please update your code to use { service: ${JSON.stringify(e)} }`),{server:e}):e||{}}function h(e){const t=function(e){return"storage"in e&&e.storage===p.AES?(console.warn("You passed 'AES' as a storage option to one of the react-native-keychain functions.\n This way of passing storage is deprecated and will be removed in a future major."),{...e,storage:p.AES_CBC}):e}({authenticationPrompt:d,...E(e)}),{authenticationPrompt:r}=t;return"string"==typeof r?(console.warn(`You passed a authenticationPrompt string as an argument to one of the react-native-keychain functions.\n This way of passing authenticationPrompt is deprecated and will be removed in a future major.\n Please update your code to use { authenticationPrompt: { title: ${JSON.stringify(r)} }`),t.authenticationPrompt={...d,title:r}):t.authenticationPrompt={...d,...r},t}const{RNKeychainManager:A}=r.NativeModules;function m(e,t,r){const n=h(r);return A.setGenericPasswordForOptions(n,e,t)}function g(e){const t=h(e);return A.getGenericPasswordForOptions(t)}function w(e){const t=E(e);return A.resetGenericPasswordForOptions(t)}function f(){return A.getAllGenericPasswordServices()}function C(e,t,r,n){return A.setInternetCredentialsForServer(e,t,r,h(n))}function _(e,t){return A.getInternetCredentialsForServer(e,h(t))}function R(e){const t=S(e);return A.resetInternetCredentialsForOptions(t)}function I(){return A.getSupportedBiometryType?A.getSupportedBiometryType():Promise.resolve(null)}function K(){return"ios"!==r.Platform.OS?Promise.reject(new Error(`requestSharedWebCredentials() is not supported on ${r.Platform.OS} yet`)):A.requestSharedWebCredentials()}function P(e,t,n){return"ios"!==r.Platform.OS?Promise.reject(new Error(`setSharedWebCredentials() is not supported on ${r.Platform.OS} yet`)):A.setSharedWebCredentialsForServer(e,t,n)}function T(e){return A.canCheckAuthentication?A.canCheckAuthentication(e):Promise.resolve(!1)}function O(e){return A.getSecurityLevel?A.getSecurityLevel(e):Promise.resolve(null)}var v={SECURITY_LEVEL:y,ACCESSIBLE:s,ACCESS_CONTROL:o,AUTHENTICATION_TYPE:c,BIOMETRY_TYPE:u,STORAGE_TYPE:p,SECURITY_RULES:l,getSecurityLevel:O,canImplyAuthentication:T,getSupportedBiometryType:I,setInternetCredentials:C,getInternetCredentials:_,resetInternetCredentials:R,setGenericPassword:m,getGenericPassword:g,getAllGenericPasswordServices:f,resetGenericPassword:w,requestSharedWebCredentials:K,setSharedWebCredentials:P},D=Object.freeze({__proto__:null,setGenericPassword:m,getGenericPassword:g,hasGenericPassword:function(e){const t=E(e);return A.hasGenericPasswordForOptions(t)},resetGenericPassword:w,getAllGenericPasswordServices:f,hasInternetCredentials:function(e){const t=S(e);return A.hasInternetCredentialsForOptions(t)},setInternetCredentials:C,getInternetCredentials:_,resetInternetCredentials:R,getSupportedBiometryType:I,requestSharedWebCredentials:K,setSharedWebCredentials:P,canImplyAuthentication:T,getSecurityLevel:O,default:v,ACCESSIBLE:s,ACCESS_CONTROL:o,AUTHENTICATION_TYPE:c,SECURITY_LEVEL:y,BIOMETRY_TYPE:u,STORAGE_TYPE:p,SECURITY_RULES:l});class N{constructor(e,t){if(this.encryptionKey=null,!e||!t)throw new Error("Both Keychain and Encryption instances are required.");this.keychain=e,this.encryption=t}async getEncryptionKey(){if("string"==typeof this.encryptionKey&&this.encryptionKey)return this.encryptionKey;const e=await this.getKeyFromKeychain("encrypted_storage_key");if(e)return this.encryptionKey=e,e;const t=await this.setEncryptionKey();return this.encryptionKey=t,t}async getRSAEncryptionKey(){if(this.encryptionKey&&"object"==typeof this.encryptionKey)return this.encryptionKey;const e=await this.getKeyFromKeychain("encrypted_rsa_storage_key",!0);if(e)return this.encryptionKey=e,e;const t=await this.setRSAEncryptionKey();return this.encryptionKey=t,t}async setEncryptionKey(){const e=this.encryption.aes?.generateAESKey?.(256);if(!e)throw new Error("Failed to generate AES encryption key.");return await this.saveKeyToKeychain("encrypted_storage_key",e),this.encryptionKey=e,e}async setRSAEncryptionKey(){const e=this.encryption.rsa?.generateRSAKey?.();if(!e)throw new Error("Failed to generate RSA encryption keypair.");return await this.saveKeyToKeychain("encrypted_rsa_storage_key",JSON.stringify(e)),this.encryptionKey=e,e}async getKeyFromKeychain(e,t=!1){try{const t=await this.keychain.getGenericPassword({service:e});if(t)return t.password}catch(t){console.error(`Failed to retrieve key from Keychain (${e}):`,t)}return null}async saveKeyToKeychain(e,t){try{await this.keychain.setGenericPassword(e,t,{service:e})}catch(t){throw new Error(`Failed to save key to Keychain (${e}): ${t}`)}}}const F={Keychain:D,getGenericPassword:async e=>await g(e),async setGenericPassword(e,t,r){await m(e,t,r)}},U={aes:{generateAESKey:e=>t.generateAESKey(e),encryptAES:(e,r)=>t.encryptAES(e,r),decryptAES:(e,r)=>t.decryptAES(e,r),encryptAsyncAES:async(e,r)=>await t.encryptAsyncAES(e,r),decryptAsyncAES:async(e,r)=>await t.decryptAsyncAES(e,r)},rsa:{generateRSAKey:()=>t.generateRSAKeyPair(),encryptRSA:(e,r)=>t.encryptRSA(e,r),decryptRSA:(e,r)=>t.decryptRSA(e,r),encryptAsyncRSA:async(e,r)=>await t.encryptAsyncRSA(e,r),decryptAsyncRSA:async(e,r)=>await t.decryptAsyncRSA(e,r)},dataIdentity:{generateECDSAKeyPair:()=>t.generateECDSAKeyPair(),signDataECDSA:(e,r)=>t.signDataECDSA(e,r),verifySignatureECDSA:(e,r,n)=>t.verifySignatureECDSA(e,r,n)}},Y={getItem:async e=>await a.default.getItem(e),setItem:async(e,t)=>await a.default.setItem(e,t),removeItem:async e=>await a.default.removeItem(e),getAllKeys:async()=>[...await a.default.getAllKeys()],multiGet:async e=>(await a.default.multiGet(e)).map((([e,t])=>[e,t])),multiSet:async e=>await a.default.multiSet(e),multiRemove:async e=>await a.default.multiRemove(e),mergeItem:async(e,t)=>await a.default.mergeItem(e,t),multiMerge:async e=>await a.default.multiMerge(e)},G=new class{constructor(e,t,r){if(!e||!t)throw new Error("Keychain and Encryption instances are required.");this.keyManager=new N(e,t),this.encryption=t,this.storageAdapter=r}async getItem(e){try{const t=await this.keyManager.getEncryptionKey(),r=await this.storageAdapter.getItem(e);return r?await this.decryptData(r,t):null}catch(e){return console.error("Failed to get item:",e),null}}async setItem(e,t){try{const r=await this.keyManager.getEncryptionKey(),n=await this.encryptData(t,r);await this.storageAdapter.setItem(e,n)}catch(e){console.error("Failed to set item:",e)}}async removeItem(e){try{await this.storageAdapter.removeItem(e)}catch(e){console.error("Failed to remove item:",e)}}async getAllKeys(){try{const e=await this.storageAdapter.getAllKeys();return Array.from(e)}catch(e){return console.error("Failed to get all keys:",e),[]}}async multiGet(e){try{const t=await this.keyManager.getEncryptionKey(),r=await this.storageAdapter.multiGet(e);return await Promise.all(r.map((async([e,r])=>[e,r?await this.decryptData(r,t):null])))}catch(t){return console.error("Failed to get multiple items:",e,t),[]}}async multiSet(e){try{const t=await this.keyManager.getEncryptionKey(),r=await Promise.all(e.map((async([e,r])=>[e,await this.encryptData(r,t)])));await this.storageAdapter.multiSet(r)}catch(e){console.error("Failed to set multiple items:",e)}}async multiMerge(e){try{const t=await this.keyManager.getEncryptionKey(),r=await this.storageAdapter.multiGet(e.map((([e])=>e))),n=await Promise.all(r.map((async([e,r])=>{if(r){return[e,await this.decryptData(r,t)]}return[e,null]}))),a=e.map((([e,t])=>{const r=n.find((([t])=>t===e));let a=t;if(r&&r[1])try{const e=JSON.parse(r[1]),n=JSON.parse(t);a=JSON.stringify({...e,...n})}catch{a=t}return[e,a]})),i=await Promise.all(a.map((async([e,r])=>[e,await this.encryptData(r,t)])));await this.storageAdapter.multiSet(i)}catch(e){console.error("Failed to merge multiple items:",e)}}async multiRemove(e){try{await this.storageAdapter.multiRemove(e)}catch(e){console.error("Failed to remove multiple items:",e)}}async mergeItem(e,t){try{const r=await this.keyManager.getEncryptionKey(),n=await this.storageAdapter.getItem(e);let a=t;if(n){const e=await this.decryptData(n,r);try{const r=JSON.parse(e),n=JSON.parse(t);a=JSON.stringify({...r,...n})}catch{a=t}}const i=await this.encryptData(a,r);await this.storageAdapter.setItem(e,i)}catch(e){console.error("Failed to merge item:",e)}}async encryptData(e,t){if(this.encryption.aes)return this.encryption.aes.encryptAsyncAES?await this.encryption.aes.encryptAsyncAES(e,t):this.encryption.aes.encryptAES?.(e,t)||e;if(this.encryption.rsa)return this.encryption.rsa.encryptAsyncRSA?await this.encryption.rsa.encryptAsyncRSA(e,t.publicKey):this.encryption.rsa.encryptRSA?.(e,t.publicKey)||e;throw new Error("No encryption method available.")}async decryptData(e,t){if(this.encryption.aes)return this.encryption.aes.decryptAsyncAES?await this.encryption.aes.decryptAsyncAES(e,t):this.encryption.aes.decryptAES?.(e,t)||e;if(this.encryption.rsa)return this.encryption.rsa.decryptAsyncRSA?await this.encryption.rsa.decryptAsyncRSA(e,t.privateKey):this.encryption.rsa.decryptRSA?.(e,t.privateKey)||e;throw new Error("No decryption method available.")}}(F,U,Y);module.exports=G; //# sourceMappingURL=index.js.map