react-native-security-suite 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +40 -3
- package/android/.gradle/7.4/checksums/checksums.lock +0 -0
- package/android/.gradle/7.4/checksums/md5-checksums.bin +0 -0
- package/android/.gradle/7.4/checksums/sha1-checksums.bin +0 -0
- package/android/.gradle/7.4/dependencies-accessors/dependencies-accessors.lock +0 -0
- package/android/.gradle/7.4/dependencies-accessors/gc.properties +0 -0
- package/android/.gradle/7.4/executionHistory/executionHistory.bin +0 -0
- package/android/.gradle/7.4/executionHistory/executionHistory.lock +0 -0
- package/android/.gradle/7.4/fileChanges/last-build.bin +0 -0
- package/android/.gradle/7.4/fileHashes/fileHashes.bin +0 -0
- package/android/.gradle/7.4/fileHashes/fileHashes.lock +0 -0
- package/android/.gradle/7.4/fileHashes/resourceHashesCache.bin +0 -0
- package/android/.gradle/7.4/gc.properties +0 -0
- package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
- package/android/.gradle/buildOutputCleanup/cache.properties +2 -0
- package/android/.gradle/buildOutputCleanup/outputFiles.bin +0 -0
- package/android/.gradle/file-system.probe +0 -0
- package/android/.gradle/vcs-1/gc.properties +0 -0
- package/android/.idea/compiler.xml +6 -0
- package/android/.idea/gradle.xml +17 -0
- package/android/.idea/jarRepositories.xml +40 -0
- package/android/.idea/misc.xml +10 -0
- package/android/.idea/vcs.xml +6 -0
- package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/android/gradle/wrapper/gradle-wrapper.properties +5 -0
- package/android/gradlew +234 -0
- package/android/gradlew.bat +89 -0
- package/android/local.properties +8 -0
- package/android/src/main/java/com/reactnativesecuritysuite/SecuritySuiteModule.java +182 -18
- package/android/src/main/java/com/reactnativesecuritysuite/SecuritySuitePackage.java +12 -12
- package/android/src/main/java/com/reactnativesecuritysuite/StorageEncryption.java +53 -0
- package/ios/DataHashingMethods.swift +196 -0
- package/ios/SecuritySuite-Bridging-Header.h +1 -0
- package/ios/SecuritySuite.m +14 -0
- package/ios/SecuritySuite.swift +129 -0
- package/ios/SecuritySuite.xcodeproj/project.pbxproj +9 -15
- package/ios/SecuritySuite.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
- package/ios/SecuritySuite.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
- package/ios/SecuritySuite.xcodeproj/project.xcworkspace/xcuserdata/Navabi.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/ios/SecuritySuite.xcodeproj/xcuserdata/Navabi.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
- package/ios/StorageEncryption.swift +81 -0
- package/lib/commonjs/helpers.js +19 -0
- package/lib/commonjs/helpers.js.map +1 -0
- package/lib/commonjs/index.js +173 -1
- package/lib/commonjs/index.js.map +1 -1
- package/lib/module/helpers.js +10 -0
- package/lib/module/helpers.js.map +1 -0
- package/lib/module/index.js +143 -0
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/helpers.d.ts +1 -0
- package/lib/typescript/index.d.ts +19 -0
- package/package.json +12 -1
- package/react-native-security-suite.podspec +1 -1
- package/src/helpers.ts +8 -0
- package/src/index.tsx +195 -3
|
@@ -7,10 +7,9 @@
|
|
|
7
7
|
objects = {
|
|
8
8
|
|
|
9
9
|
/* Begin PBXBuildFile section */
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
F4FF95D7245B92E800C19C63 /*
|
|
13
|
-
|
|
10
|
+
59F427012A67C7B90072365D /* StorageEncryption.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59F426FF2A67C7B90072365D /* StorageEncryption.swift */; };
|
|
11
|
+
59F427022A67C7B90072365D /* DataHashingMethods.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59F427002A67C7B90072365D /* DataHashingMethods.swift */; };
|
|
12
|
+
F4FF95D7245B92E800C19C63 /* SecuritySuite.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4FF95D6245B92E800C19C63 /* SecuritySuite.swift */; };
|
|
14
13
|
/* End PBXBuildFile section */
|
|
15
14
|
|
|
16
15
|
/* Begin PBXCopyFilesBuildPhase section */
|
|
@@ -27,11 +26,11 @@
|
|
|
27
26
|
|
|
28
27
|
/* Begin PBXFileReference section */
|
|
29
28
|
134814201AA4EA6300B7C361 /* libSecuritySuite.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libSecuritySuite.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
|
30
|
-
|
|
29
|
+
59F426FF2A67C7B90072365D /* StorageEncryption.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StorageEncryption.swift; sourceTree = "<group>"; };
|
|
30
|
+
59F427002A67C7B90072365D /* DataHashingMethods.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DataHashingMethods.swift; sourceTree = "<group>"; };
|
|
31
31
|
B3E7B5891CC2AC0600A0062D /* SecuritySuite.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SecuritySuite.m; sourceTree = "<group>"; };
|
|
32
32
|
F4FF95D5245B92E700C19C63 /* SecuritySuite-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SecuritySuite-Bridging-Header.h"; sourceTree = "<group>"; };
|
|
33
33
|
F4FF95D6245B92E800C19C63 /* SecuritySuite.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecuritySuite.swift; sourceTree = "<group>"; };
|
|
34
|
-
|
|
35
34
|
/* End PBXFileReference section */
|
|
36
35
|
|
|
37
36
|
/* Begin PBXFrameworksBuildPhase section */
|
|
@@ -56,11 +55,11 @@
|
|
|
56
55
|
58B511D21A9E6C8500147676 = {
|
|
57
56
|
isa = PBXGroup;
|
|
58
57
|
children = (
|
|
59
|
-
|
|
60
58
|
F4FF95D6245B92E800C19C63 /* SecuritySuite.swift */,
|
|
61
59
|
B3E7B5891CC2AC0600A0062D /* SecuritySuite.m */,
|
|
62
60
|
F4FF95D5245B92E700C19C63 /* SecuritySuite-Bridging-Header.h */,
|
|
63
|
-
|
|
61
|
+
59F427002A67C7B90072365D /* DataHashingMethods.swift */,
|
|
62
|
+
59F426FF2A67C7B90072365D /* StorageEncryption.swift */,
|
|
64
63
|
134814211AA4EA7D00B7C361 /* Products */,
|
|
65
64
|
);
|
|
66
65
|
sourceTree = "<group>";
|
|
@@ -122,10 +121,9 @@
|
|
|
122
121
|
isa = PBXSourcesBuildPhase;
|
|
123
122
|
buildActionMask = 2147483647;
|
|
124
123
|
files = (
|
|
125
|
-
|
|
124
|
+
59F427022A67C7B90072365D /* DataHashingMethods.swift in Sources */,
|
|
125
|
+
59F427012A67C7B90072365D /* StorageEncryption.swift in Sources */,
|
|
126
126
|
F4FF95D7245B92E800C19C63 /* SecuritySuite.swift in Sources */,
|
|
127
|
-
B3E7B58A1CC2AC0600A0062D /* SecuritySuite.m in Sources */,
|
|
128
|
-
|
|
129
127
|
);
|
|
130
128
|
runOnlyForDeploymentPostprocessing = 0;
|
|
131
129
|
};
|
|
@@ -238,11 +236,9 @@
|
|
|
238
236
|
OTHER_LDFLAGS = "-ObjC";
|
|
239
237
|
PRODUCT_NAME = SecuritySuite;
|
|
240
238
|
SKIP_INSTALL = YES;
|
|
241
|
-
|
|
242
239
|
SWIFT_OBJC_BRIDGING_HEADER = "SecuritySuite-Bridging-Header.h";
|
|
243
240
|
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
|
244
241
|
SWIFT_VERSION = 5.0;
|
|
245
|
-
|
|
246
242
|
};
|
|
247
243
|
name = Debug;
|
|
248
244
|
};
|
|
@@ -259,10 +255,8 @@
|
|
|
259
255
|
OTHER_LDFLAGS = "-ObjC";
|
|
260
256
|
PRODUCT_NAME = SecuritySuite;
|
|
261
257
|
SKIP_INSTALL = YES;
|
|
262
|
-
|
|
263
258
|
SWIFT_OBJC_BRIDGING_HEADER = "SecuritySuite-Bridging-Header.h";
|
|
264
259
|
SWIFT_VERSION = 5.0;
|
|
265
|
-
|
|
266
260
|
};
|
|
267
261
|
name = Release;
|
|
268
262
|
};
|
|
Binary file
|
package/ios/SecuritySuite.xcodeproj/xcuserdata/Navabi.xcuserdatad/xcschemes/xcschememanagement.plist
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
3
|
+
<plist version="1.0">
|
|
4
|
+
<dict>
|
|
5
|
+
<key>SchemeUserState</key>
|
|
6
|
+
<dict>
|
|
7
|
+
<key>SecuritySuite.xcscheme_^#shared#^_</key>
|
|
8
|
+
<dict>
|
|
9
|
+
<key>orderHint</key>
|
|
10
|
+
<integer>0</integer>
|
|
11
|
+
</dict>
|
|
12
|
+
</dict>
|
|
13
|
+
</dict>
|
|
14
|
+
</plist>
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
//
|
|
2
|
+
// SoftEncryption.swift
|
|
3
|
+
// EncryptionSecurity
|
|
4
|
+
//
|
|
5
|
+
// Created by Mohammad on 5/9/1401 AP.
|
|
6
|
+
// Copyright © 1401 AP Facebook. All rights reserved.
|
|
7
|
+
//
|
|
8
|
+
|
|
9
|
+
import Foundation
|
|
10
|
+
import CryptoKit
|
|
11
|
+
|
|
12
|
+
@available(iOS 13.0, *)
|
|
13
|
+
class StorageEncryption {
|
|
14
|
+
let nonce = try! AES.GCM.Nonce(data: Data(base64Encoded: "bj1nixTVoYpSvpdA")!)
|
|
15
|
+
|
|
16
|
+
func encrypt(plain: String, encryptionKey: String, hardEncryption: Bool) throws -> String {
|
|
17
|
+
do {
|
|
18
|
+
guard let encryptionKeyData = Data(base64Encoded: encryptionKey) else {
|
|
19
|
+
return "Could not decode encryptionKey text: \(encryptionKey)"
|
|
20
|
+
}
|
|
21
|
+
guard let plainData = plain.data(using: .utf8) else {
|
|
22
|
+
return "Could not decode plain text: \(plain)"
|
|
23
|
+
}
|
|
24
|
+
let symmetricKey = SymmetricKey(data: encryptionKeyData)
|
|
25
|
+
var encrypted = try AES.GCM.seal(plainData, using: symmetricKey, nonce: nonce, authenticating: ASN1.ec256)
|
|
26
|
+
if (hardEncryption) {
|
|
27
|
+
encrypted = try AES.GCM.seal(plainData, using: symmetricKey)
|
|
28
|
+
}
|
|
29
|
+
return encrypted.combined!.base64EncodedString()
|
|
30
|
+
} catch let error {
|
|
31
|
+
return "Error encrypting message: \(error.localizedDescription)"
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
func decrypt(decoded: String, encryptionKey: String, hardEncryption: Bool) throws -> String {
|
|
36
|
+
do {
|
|
37
|
+
guard let encryptionKeyData = Data(base64Encoded: encryptionKey) else {
|
|
38
|
+
return "Could not decode encryption key: \(encryptionKey)"
|
|
39
|
+
}
|
|
40
|
+
guard let decodedData = Data(base64Encoded: decoded) else {
|
|
41
|
+
return "Could not decode decoded text: \(decoded)"
|
|
42
|
+
}
|
|
43
|
+
let symmetricKey = SymmetricKey(data: encryptionKeyData)
|
|
44
|
+
if (hardEncryption) {
|
|
45
|
+
let sealedBoxToOpen = try AES.GCM.SealedBox(combined: decodedData)
|
|
46
|
+
let decrypted = try AES.GCM.open(sealedBoxToOpen, using: symmetricKey)
|
|
47
|
+
return String(data: decrypted, encoding: .utf8)!
|
|
48
|
+
} else {
|
|
49
|
+
let sealedBoxRestored = try AES.GCM.SealedBox(combined: decodedData)
|
|
50
|
+
let decrypted = try AES.GCM.open(sealedBoxRestored, using: symmetricKey, authenticating: ASN1.ec256)
|
|
51
|
+
return String(data: decrypted, encoding: .utf8)!
|
|
52
|
+
}
|
|
53
|
+
} catch let error {
|
|
54
|
+
return "Error decrypting message: \(error.localizedDescription)"
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
public extension Data {
|
|
60
|
+
init?(hexString: String) {
|
|
61
|
+
let len = hexString.count / 2
|
|
62
|
+
var data = Data(capacity: len)
|
|
63
|
+
var i = hexString.startIndex
|
|
64
|
+
for _ in 0..<len {
|
|
65
|
+
let j = hexString.index(i, offsetBy: 2)
|
|
66
|
+
let bytes = hexString[i..<j]
|
|
67
|
+
if var num = UInt8(bytes, radix: 16) {
|
|
68
|
+
data.append(&num, count: 1)
|
|
69
|
+
} else {
|
|
70
|
+
return nil
|
|
71
|
+
}
|
|
72
|
+
i = j
|
|
73
|
+
}
|
|
74
|
+
self = data
|
|
75
|
+
}
|
|
76
|
+
/// Hexadecimal string representation of `Data` object.
|
|
77
|
+
var hexadecimal: String {
|
|
78
|
+
return map { String(format: "%02x", $0) }
|
|
79
|
+
.joined()
|
|
80
|
+
}
|
|
81
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.isJsonString = void 0;
|
|
7
|
+
|
|
8
|
+
const isJsonString = value => {
|
|
9
|
+
try {
|
|
10
|
+
JSON.parse(value);
|
|
11
|
+
} catch (e) {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
return true;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
exports.isJsonString = isJsonString;
|
|
19
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["isJsonString","value","JSON","parse","e"],"sources":["helpers.ts"],"sourcesContent":["export const isJsonString = (value: string): boolean => {\n try {\n JSON.parse(value);\n } catch (e) {\n return false;\n }\n return true;\n};\n"],"mappings":";;;;;;;AAAO,MAAMA,YAAY,GAAIC,KAAD,IAA4B;EACtD,IAAI;IACFC,IAAI,CAACC,KAAL,CAAWF,KAAX;EACD,CAFD,CAEE,OAAOG,CAAP,EAAU;IACV,OAAO,KAAP;EACD;;EACD,OAAO,IAAP;AACD,CAPM"}
|
package/lib/commonjs/index.js
CHANGED
|
@@ -3,11 +3,20 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.default = void 0;
|
|
6
|
+
exports.default = exports.decryptBySharedKey = exports.decrypt = exports.SecureStorage = void 0;
|
|
7
7
|
exports.deviceHasSecurityRisk = deviceHasSecurityRisk;
|
|
8
|
+
exports.getSharedKey = exports.getPublicKey = exports.getDeviceId = exports.encryptBySharedKey = exports.encrypt = void 0;
|
|
8
9
|
|
|
9
10
|
var _reactNative = require("react-native");
|
|
10
11
|
|
|
12
|
+
var _asyncStorage = _interopRequireDefault(require("@react-native-async-storage/async-storage"));
|
|
13
|
+
|
|
14
|
+
var _lodash = _interopRequireDefault(require("lodash"));
|
|
15
|
+
|
|
16
|
+
var _helpers = require("./helpers");
|
|
17
|
+
|
|
18
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
19
|
+
|
|
11
20
|
const LINKING_ERROR = `The package 'react-native-security-suite' doesn't seem to be linked. Make sure: \n\n` + _reactNative.Platform.select({
|
|
12
21
|
ios: "- You have run 'pod install'\n",
|
|
13
22
|
default: ''
|
|
@@ -19,6 +28,169 @@ const SecuritySuite = _reactNative.NativeModules.SecuritySuite ? _reactNative.Na
|
|
|
19
28
|
|
|
20
29
|
});
|
|
21
30
|
|
|
31
|
+
const getPublicKey = () => SecuritySuite.getPublicKey();
|
|
32
|
+
|
|
33
|
+
exports.getPublicKey = getPublicKey;
|
|
34
|
+
|
|
35
|
+
const getSharedKey = serverPublicKey => SecuritySuite.getSharedKey(serverPublicKey);
|
|
36
|
+
|
|
37
|
+
exports.getSharedKey = getSharedKey;
|
|
38
|
+
|
|
39
|
+
const encryptBySharedKey = input => input && typeof input === 'string' ? SecuritySuite.encrypt(input) : '';
|
|
40
|
+
|
|
41
|
+
exports.encryptBySharedKey = encryptBySharedKey;
|
|
42
|
+
|
|
43
|
+
const decryptBySharedKey = input => input && typeof input === 'string' ? SecuritySuite.decrypt(input) : '';
|
|
44
|
+
|
|
45
|
+
exports.decryptBySharedKey = decryptBySharedKey;
|
|
46
|
+
|
|
47
|
+
const getDeviceId = () => new Promise((resolve, reject) => {
|
|
48
|
+
SecuritySuite.getDeviceId((result, error) => {
|
|
49
|
+
if (error !== null) reject(error);else resolve(result);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
exports.getDeviceId = getDeviceId;
|
|
54
|
+
|
|
55
|
+
const encrypt = function (input) {
|
|
56
|
+
let hardEncryption = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
|
57
|
+
let secretKey = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
|
|
58
|
+
return new Promise((resolve, reject) => {
|
|
59
|
+
if (!input) resolve(input);
|
|
60
|
+
SecuritySuite.storageEncrypt(input, secretKey, hardEncryption, (result, error) => {
|
|
61
|
+
if (error !== null) reject(error);else resolve(result);
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
exports.encrypt = encrypt;
|
|
67
|
+
|
|
68
|
+
const decrypt = function (input) {
|
|
69
|
+
let hardEncryption = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
|
70
|
+
let secretKey = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
|
|
71
|
+
return new Promise((resolve, reject) => {
|
|
72
|
+
if (!input) resolve(input);
|
|
73
|
+
SecuritySuite.storageDecrypt(input, secretKey, hardEncryption, (result, error) => {
|
|
74
|
+
if (error !== null) reject(error);else resolve(result);
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
exports.decrypt = decrypt;
|
|
80
|
+
const SecureStorage = {
|
|
81
|
+
setItem: async (key, value) => {
|
|
82
|
+
try {
|
|
83
|
+
const encryptedKey = await encrypt(key, false);
|
|
84
|
+
const encryptedValue = await encrypt(value);
|
|
85
|
+
return _asyncStorage.default.setItem(encryptedKey, encryptedValue);
|
|
86
|
+
} catch (e) {
|
|
87
|
+
return e;
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
getItem: async key => {
|
|
91
|
+
try {
|
|
92
|
+
const encryptedKey = await encrypt(key, false);
|
|
93
|
+
const encryptedData = await _asyncStorage.default.getItem(encryptedKey);
|
|
94
|
+
return decrypt(encryptedData ?? '');
|
|
95
|
+
} catch (e) {
|
|
96
|
+
return e;
|
|
97
|
+
}
|
|
98
|
+
},
|
|
99
|
+
mergeItem: async (key, value) => {
|
|
100
|
+
try {
|
|
101
|
+
const encryptedKey = await encrypt(key, false);
|
|
102
|
+
const encryptedData = await _asyncStorage.default.getItem(encryptedKey);
|
|
103
|
+
const data = await decrypt(encryptedData ?? '');
|
|
104
|
+
if (!(0, _helpers.isJsonString)(data) || !(0, _helpers.isJsonString)(value)) return null;
|
|
105
|
+
const mergedData = await JSON.stringify(_lodash.default.merge(JSON.parse(data), JSON.parse(value)));
|
|
106
|
+
const encryptedValue = await encrypt(mergedData);
|
|
107
|
+
return _asyncStorage.default.setItem(encryptedKey, encryptedValue);
|
|
108
|
+
} catch (e) {
|
|
109
|
+
return e;
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
removeItem: async key => {
|
|
113
|
+
try {
|
|
114
|
+
const encryptedKey = await encrypt(key, false);
|
|
115
|
+
return _asyncStorage.default.removeItem(encryptedKey);
|
|
116
|
+
} catch (e) {
|
|
117
|
+
return e;
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
getAllKeys: async () => {
|
|
121
|
+
try {
|
|
122
|
+
const encryptedKeys = await _asyncStorage.default.getAllKeys();
|
|
123
|
+
return await Promise.all(encryptedKeys.map(async item => {
|
|
124
|
+
const decryptedKey = await decrypt(item, false);
|
|
125
|
+
return decryptedKey ? decryptedKey : item;
|
|
126
|
+
}));
|
|
127
|
+
} catch (e) {
|
|
128
|
+
return e;
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
multiSet: async keyValuePairs => {
|
|
132
|
+
try {
|
|
133
|
+
const encryptedKeyValuePairs = await Promise.all(keyValuePairs.map(async item => {
|
|
134
|
+
if (item.length !== 2) return [];
|
|
135
|
+
const encryptedKey = await encrypt(item[0], false);
|
|
136
|
+
const encryptedValue = await encrypt(item[1]);
|
|
137
|
+
return [encryptedKey, encryptedValue];
|
|
138
|
+
}));
|
|
139
|
+
|
|
140
|
+
_asyncStorage.default.multiSet(encryptedKeyValuePairs);
|
|
141
|
+
} catch (e) {
|
|
142
|
+
return e;
|
|
143
|
+
}
|
|
144
|
+
},
|
|
145
|
+
multiGet: async keys => {
|
|
146
|
+
try {
|
|
147
|
+
if (!Array.isArray(keys)) return null;
|
|
148
|
+
const encryptedKeys = await Promise.all(keys.map(async item => await encrypt(item, false)));
|
|
149
|
+
const encryptedItems = await _asyncStorage.default.multiGet(encryptedKeys);
|
|
150
|
+
return await Promise.all(encryptedItems && encryptedItems.length ? encryptedItems.map(async item => {
|
|
151
|
+
const decryptedKey = await decrypt(item[0], false);
|
|
152
|
+
const decryptedalue = await decrypt(item[1]);
|
|
153
|
+
return [decryptedKey, decryptedalue];
|
|
154
|
+
}) : []);
|
|
155
|
+
} catch (e) {
|
|
156
|
+
return e;
|
|
157
|
+
}
|
|
158
|
+
},
|
|
159
|
+
multiMerge: async keyValuePairs => {
|
|
160
|
+
try {
|
|
161
|
+
return keyValuePairs.map(async item => {
|
|
162
|
+
if (item.length !== 2) return;
|
|
163
|
+
const encryptedKey = await encrypt(item[0], false);
|
|
164
|
+
const encryptedData = await _asyncStorage.default.getItem(item[0]);
|
|
165
|
+
const data = await decrypt(encryptedData ?? '');
|
|
166
|
+
if (!(0, _helpers.isJsonString)(data) || !(0, _helpers.isJsonString)(item[1])) return null;
|
|
167
|
+
const mergedData = await JSON.stringify(_lodash.default.merge(JSON.parse(data), JSON.parse(item[1])));
|
|
168
|
+
const encryptedValue = await encrypt(mergedData, false);
|
|
169
|
+
return _asyncStorage.default.setItem(encryptedKey, encryptedValue);
|
|
170
|
+
});
|
|
171
|
+
} catch (e) {
|
|
172
|
+
return e;
|
|
173
|
+
}
|
|
174
|
+
},
|
|
175
|
+
multiRemove: async keys => {
|
|
176
|
+
try {
|
|
177
|
+
if (!Array.isArray(keys)) return keys;
|
|
178
|
+
const encryptedKeys = await Promise.all(keys.map(async item => await encrypt(item, false)));
|
|
179
|
+
return _asyncStorage.default.multiRemove(encryptedKeys);
|
|
180
|
+
} catch (e) {
|
|
181
|
+
return e;
|
|
182
|
+
}
|
|
183
|
+
},
|
|
184
|
+
clear: async () => {
|
|
185
|
+
try {
|
|
186
|
+
return _asyncStorage.default.clear();
|
|
187
|
+
} catch (e) {
|
|
188
|
+
return e;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
};
|
|
192
|
+
exports.SecureStorage = SecureStorage;
|
|
193
|
+
|
|
22
194
|
function deviceHasSecurityRisk() {
|
|
23
195
|
return SecuritySuite.deviceHasSecurityRisk();
|
|
24
196
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["LINKING_ERROR","Platform","select","ios","default","SecuritySuite","NativeModules","Proxy","get","Error","deviceHasSecurityRisk"],"sources":["index.tsx"],"sourcesContent":["import { NativeModules, Platform } from 'react-native';\n\nconst LINKING_ERROR =\n `The package 'react-native-security-suite' doesn't seem to be linked. Make sure: \\n\\n` +\n Platform.select({ ios: \"- You have run 'pod install'\\n\", default: '' }) +\n '- You rebuilt the app after installing the package\\n' +\n '- You are not using Expo managed workflow\\n';\n\nconst SecuritySuite = NativeModules.SecuritySuite\n ? NativeModules.SecuritySuite\n : new Proxy(\n {},\n {\n get() {\n throw new Error(LINKING_ERROR);\n },\n }\n );\n \nexport function deviceHasSecurityRisk(): Promise<boolean> {\n return SecuritySuite.deviceHasSecurityRisk();\n}\n\nexport default SecuritySuite;"],"mappings":";;;;;;;;AAAA;;AAEA,MAAMA,aAAa,GAChB,sFAAD,GACAC,qBAAA,CAASC,MAAT,CAAgB;EAAEC,GAAG,EAAE,gCAAP;EAAyCC,OAAO,EAAE;AAAlD,CAAhB,CADA,GAEA,sDAFA,GAGA,6CAJF;AAMA,MAAMC,aAAa,GAAGC,0BAAA,CAAcD,aAAd,GAClBC,0BAAA,CAAcD,aADI,GAElB,IAAIE,KAAJ,CACE,EADF,EAEE;EACEC,GAAG,GAAG;IACJ,MAAM,IAAIC,KAAJ,CAAUT,aAAV,CAAN;EACD;;AAHH,CAFF,CAFJ;;AAWO,SAASU,qBAAT,GAAmD;EACxD,OAAOL,aAAa,CAACK,qBAAd,EAAP;AACD;;eAEcL,a"}
|
|
1
|
+
{"version":3,"names":["LINKING_ERROR","Platform","select","ios","default","SecuritySuite","NativeModules","Proxy","get","Error","getPublicKey","getSharedKey","serverPublicKey","encryptBySharedKey","input","encrypt","decryptBySharedKey","decrypt","getDeviceId","Promise","resolve","reject","result","error","hardEncryption","secretKey","storageEncrypt","storageDecrypt","SecureStorage","setItem","key","value","encryptedKey","encryptedValue","AsyncStorage","e","getItem","encryptedData","mergeItem","data","isJsonString","mergedData","JSON","stringify","_","merge","parse","removeItem","getAllKeys","encryptedKeys","all","map","item","decryptedKey","multiSet","keyValuePairs","encryptedKeyValuePairs","length","multiGet","keys","Array","isArray","encryptedItems","decryptedalue","multiMerge","multiRemove","clear","deviceHasSecurityRisk"],"sources":["index.tsx"],"sourcesContent":["import { NativeModules, Platform } from 'react-native';\nimport AsyncStorage from '@react-native-async-storage/async-storage';\nimport _ from 'lodash';\nimport { isJsonString } from './helpers';\n\nconst LINKING_ERROR =\n `The package 'react-native-security-suite' doesn't seem to be linked. Make sure: \\n\\n` +\n Platform.select({ ios: \"- You have run 'pod install'\\n\", default: '' }) +\n '- You rebuilt the app after installing the package\\n' +\n '- You are not using Expo managed workflow\\n';\n\nconst SecuritySuite = NativeModules.SecuritySuite\n ? NativeModules.SecuritySuite\n : new Proxy(\n {},\n {\n get() {\n throw new Error(LINKING_ERROR);\n },\n }\n );\n\nexport const getPublicKey = (): Promise<string> => SecuritySuite.getPublicKey();\n\nexport const getSharedKey = (serverPublicKey: string): Promise<string> =>\n SecuritySuite.getSharedKey(serverPublicKey);\n\nexport const encryptBySharedKey = (input: string): Promise<string> =>\n input && typeof input === 'string' ? SecuritySuite.encrypt(input) : '';\n\nexport const decryptBySharedKey = (input: string) =>\n input && typeof input === 'string' ? SecuritySuite.decrypt(input) : '';\n\nexport const getDeviceId = (): Promise<string> =>\n new Promise((resolve: any, reject: any) => {\n SecuritySuite.getDeviceId((result: string | null, error: string | null) => {\n if (error !== null) reject(error);\n else resolve(result);\n });\n });\n\nexport const encrypt = (\n input: string,\n hardEncryption = true,\n secretKey = null\n): Promise<string> =>\n new Promise((resolve: any, reject: any) => {\n if (!input) resolve(input);\n\n SecuritySuite.storageEncrypt(\n input,\n secretKey,\n hardEncryption,\n (result: string | null, error: string | null) => {\n if (error !== null) reject(error);\n else resolve(result);\n }\n );\n });\n\nexport const decrypt = (\n input: string,\n hardEncryption = true,\n secretKey = null\n): Promise<string> =>\n new Promise((resolve: any, reject: any) => {\n if (!input) resolve(input);\n\n SecuritySuite.storageDecrypt(\n input,\n secretKey,\n hardEncryption,\n (result: string | null, error: string | null) => {\n if (error !== null) reject(error);\n else resolve(result);\n }\n );\n });\n\nexport const SecureStorage = {\n setItem: async (key: string, value: string) => {\n try {\n const encryptedKey = await encrypt(key, false);\n const encryptedValue = await encrypt(value);\n return AsyncStorage.setItem(encryptedKey, encryptedValue);\n } catch (e) {\n return e;\n }\n },\n getItem: async (key: string) => {\n try {\n const encryptedKey = await encrypt(key, false);\n const encryptedData = await AsyncStorage.getItem(encryptedKey);\n return decrypt(encryptedData ?? '');\n } catch (e) {\n return e;\n }\n },\n mergeItem: async (key: string, value: string) => {\n try {\n const encryptedKey = await encrypt(key, false);\n const encryptedData = await AsyncStorage.getItem(encryptedKey);\n const data = await decrypt(encryptedData ?? '');\n if (!isJsonString(data) || !isJsonString(value)) return null;\n const mergedData = await JSON.stringify(\n _.merge(JSON.parse(data), JSON.parse(value))\n );\n const encryptedValue = await encrypt(mergedData);\n return AsyncStorage.setItem(encryptedKey, encryptedValue);\n } catch (e) {\n return e;\n }\n },\n removeItem: async (key: string) => {\n try {\n const encryptedKey = await encrypt(key, false);\n return AsyncStorage.removeItem(encryptedKey);\n } catch (e) {\n return e;\n }\n },\n getAllKeys: async () => {\n try {\n const encryptedKeys = await AsyncStorage.getAllKeys();\n return await Promise.all(\n encryptedKeys.map(async (item: string): Promise<string> => {\n const decryptedKey = await decrypt(item, false);\n return decryptedKey ? decryptedKey : item;\n })\n );\n } catch (e) {\n return e;\n }\n },\n multiSet: async (keyValuePairs: Array<Array<string>>) => {\n try {\n const encryptedKeyValuePairs: any = await Promise.all(\n keyValuePairs.map(async (item: Array<string>) => {\n if (item.length !== 2) return [];\n const encryptedKey = await encrypt(item[0], false);\n const encryptedValue = await encrypt(item[1]);\n return [encryptedKey, encryptedValue];\n })\n );\n AsyncStorage.multiSet(encryptedKeyValuePairs);\n } catch (e) {\n return e;\n }\n },\n multiGet: async (keys: Array<string>) => {\n try {\n if (!Array.isArray(keys)) return null;\n const encryptedKeys = await Promise.all(\n keys.map(\n async (item: string): Promise<string> => await encrypt(item, false)\n )\n );\n const encryptedItems = await AsyncStorage.multiGet(encryptedKeys);\n return await Promise.all(\n encryptedItems && encryptedItems.length\n ? encryptedItems.map(async (item: any): Promise<string[]> => {\n const decryptedKey = await decrypt(item[0], false);\n const decryptedalue = await decrypt(item[1]);\n return [decryptedKey, decryptedalue];\n })\n : []\n );\n } catch (e) {\n return e;\n }\n },\n multiMerge: async (keyValuePairs: Array<Array<string>>) => {\n try {\n return keyValuePairs.map(async (item: Array<string>) => {\n if (item.length !== 2) return;\n const encryptedKey = await encrypt(item[0], false);\n const encryptedData = await AsyncStorage.getItem(item[0]);\n const data = await decrypt(encryptedData ?? '');\n if (!isJsonString(data) || !isJsonString(item[1])) return null;\n const mergedData = await JSON.stringify(\n _.merge(JSON.parse(data), JSON.parse(item[1]))\n );\n const encryptedValue = await encrypt(mergedData, false);\n return AsyncStorage.setItem(encryptedKey, encryptedValue);\n });\n } catch (e) {\n return e;\n }\n },\n multiRemove: async (keys: Array<string>) => {\n try {\n if (!Array.isArray(keys)) return keys;\n const encryptedKeys = await Promise.all(\n keys.map(\n async (item: string): Promise<string> => await encrypt(item, false)\n )\n );\n return AsyncStorage.multiRemove(encryptedKeys);\n } catch (e) {\n return e;\n }\n },\n clear: async () => {\n try {\n return AsyncStorage.clear();\n } catch (e) {\n return e;\n }\n },\n};\n\nexport function deviceHasSecurityRisk(): Promise<boolean> {\n return SecuritySuite.deviceHasSecurityRisk();\n}\n\nexport default SecuritySuite;\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["isJsonString","value","JSON","parse","e"],"sources":["helpers.ts"],"sourcesContent":["export const isJsonString = (value: string): boolean => {\n try {\n JSON.parse(value);\n } catch (e) {\n return false;\n }\n return true;\n};\n"],"mappings":"AAAA,OAAO,MAAMA,YAAY,GAAIC,KAAD,IAA4B;EACtD,IAAI;IACFC,IAAI,CAACC,KAAL,CAAWF,KAAX;EACD,CAFD,CAEE,OAAOG,CAAP,EAAU;IACV,OAAO,KAAP;EACD;;EACD,OAAO,IAAP;AACD,CAPM"}
|
package/lib/module/index.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import { NativeModules, Platform } from 'react-native';
|
|
2
|
+
import AsyncStorage from '@react-native-async-storage/async-storage';
|
|
3
|
+
import _ from 'lodash';
|
|
4
|
+
import { isJsonString } from './helpers';
|
|
2
5
|
const LINKING_ERROR = `The package 'react-native-security-suite' doesn't seem to be linked. Make sure: \n\n` + Platform.select({
|
|
3
6
|
ios: "- You have run 'pod install'\n",
|
|
4
7
|
default: ''
|
|
@@ -9,6 +12,146 @@ const SecuritySuite = NativeModules.SecuritySuite ? NativeModules.SecuritySuite
|
|
|
9
12
|
}
|
|
10
13
|
|
|
11
14
|
});
|
|
15
|
+
export const getPublicKey = () => SecuritySuite.getPublicKey();
|
|
16
|
+
export const getSharedKey = serverPublicKey => SecuritySuite.getSharedKey(serverPublicKey);
|
|
17
|
+
export const encryptBySharedKey = input => input && typeof input === 'string' ? SecuritySuite.encrypt(input) : '';
|
|
18
|
+
export const decryptBySharedKey = input => input && typeof input === 'string' ? SecuritySuite.decrypt(input) : '';
|
|
19
|
+
export const getDeviceId = () => new Promise((resolve, reject) => {
|
|
20
|
+
SecuritySuite.getDeviceId((result, error) => {
|
|
21
|
+
if (error !== null) reject(error);else resolve(result);
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
export const encrypt = function (input) {
|
|
25
|
+
let hardEncryption = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
|
26
|
+
let secretKey = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
|
|
27
|
+
return new Promise((resolve, reject) => {
|
|
28
|
+
if (!input) resolve(input);
|
|
29
|
+
SecuritySuite.storageEncrypt(input, secretKey, hardEncryption, (result, error) => {
|
|
30
|
+
if (error !== null) reject(error);else resolve(result);
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
export const decrypt = function (input) {
|
|
35
|
+
let hardEncryption = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
|
36
|
+
let secretKey = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
|
|
37
|
+
return new Promise((resolve, reject) => {
|
|
38
|
+
if (!input) resolve(input);
|
|
39
|
+
SecuritySuite.storageDecrypt(input, secretKey, hardEncryption, (result, error) => {
|
|
40
|
+
if (error !== null) reject(error);else resolve(result);
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
export const SecureStorage = {
|
|
45
|
+
setItem: async (key, value) => {
|
|
46
|
+
try {
|
|
47
|
+
const encryptedKey = await encrypt(key, false);
|
|
48
|
+
const encryptedValue = await encrypt(value);
|
|
49
|
+
return AsyncStorage.setItem(encryptedKey, encryptedValue);
|
|
50
|
+
} catch (e) {
|
|
51
|
+
return e;
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
getItem: async key => {
|
|
55
|
+
try {
|
|
56
|
+
const encryptedKey = await encrypt(key, false);
|
|
57
|
+
const encryptedData = await AsyncStorage.getItem(encryptedKey);
|
|
58
|
+
return decrypt(encryptedData ?? '');
|
|
59
|
+
} catch (e) {
|
|
60
|
+
return e;
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
mergeItem: async (key, value) => {
|
|
64
|
+
try {
|
|
65
|
+
const encryptedKey = await encrypt(key, false);
|
|
66
|
+
const encryptedData = await AsyncStorage.getItem(encryptedKey);
|
|
67
|
+
const data = await decrypt(encryptedData ?? '');
|
|
68
|
+
if (!isJsonString(data) || !isJsonString(value)) return null;
|
|
69
|
+
const mergedData = await JSON.stringify(_.merge(JSON.parse(data), JSON.parse(value)));
|
|
70
|
+
const encryptedValue = await encrypt(mergedData);
|
|
71
|
+
return AsyncStorage.setItem(encryptedKey, encryptedValue);
|
|
72
|
+
} catch (e) {
|
|
73
|
+
return e;
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
removeItem: async key => {
|
|
77
|
+
try {
|
|
78
|
+
const encryptedKey = await encrypt(key, false);
|
|
79
|
+
return AsyncStorage.removeItem(encryptedKey);
|
|
80
|
+
} catch (e) {
|
|
81
|
+
return e;
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
getAllKeys: async () => {
|
|
85
|
+
try {
|
|
86
|
+
const encryptedKeys = await AsyncStorage.getAllKeys();
|
|
87
|
+
return await Promise.all(encryptedKeys.map(async item => {
|
|
88
|
+
const decryptedKey = await decrypt(item, false);
|
|
89
|
+
return decryptedKey ? decryptedKey : item;
|
|
90
|
+
}));
|
|
91
|
+
} catch (e) {
|
|
92
|
+
return e;
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
multiSet: async keyValuePairs => {
|
|
96
|
+
try {
|
|
97
|
+
const encryptedKeyValuePairs = await Promise.all(keyValuePairs.map(async item => {
|
|
98
|
+
if (item.length !== 2) return [];
|
|
99
|
+
const encryptedKey = await encrypt(item[0], false);
|
|
100
|
+
const encryptedValue = await encrypt(item[1]);
|
|
101
|
+
return [encryptedKey, encryptedValue];
|
|
102
|
+
}));
|
|
103
|
+
AsyncStorage.multiSet(encryptedKeyValuePairs);
|
|
104
|
+
} catch (e) {
|
|
105
|
+
return e;
|
|
106
|
+
}
|
|
107
|
+
},
|
|
108
|
+
multiGet: async keys => {
|
|
109
|
+
try {
|
|
110
|
+
if (!Array.isArray(keys)) return null;
|
|
111
|
+
const encryptedKeys = await Promise.all(keys.map(async item => await encrypt(item, false)));
|
|
112
|
+
const encryptedItems = await AsyncStorage.multiGet(encryptedKeys);
|
|
113
|
+
return await Promise.all(encryptedItems && encryptedItems.length ? encryptedItems.map(async item => {
|
|
114
|
+
const decryptedKey = await decrypt(item[0], false);
|
|
115
|
+
const decryptedalue = await decrypt(item[1]);
|
|
116
|
+
return [decryptedKey, decryptedalue];
|
|
117
|
+
}) : []);
|
|
118
|
+
} catch (e) {
|
|
119
|
+
return e;
|
|
120
|
+
}
|
|
121
|
+
},
|
|
122
|
+
multiMerge: async keyValuePairs => {
|
|
123
|
+
try {
|
|
124
|
+
return keyValuePairs.map(async item => {
|
|
125
|
+
if (item.length !== 2) return;
|
|
126
|
+
const encryptedKey = await encrypt(item[0], false);
|
|
127
|
+
const encryptedData = await AsyncStorage.getItem(item[0]);
|
|
128
|
+
const data = await decrypt(encryptedData ?? '');
|
|
129
|
+
if (!isJsonString(data) || !isJsonString(item[1])) return null;
|
|
130
|
+
const mergedData = await JSON.stringify(_.merge(JSON.parse(data), JSON.parse(item[1])));
|
|
131
|
+
const encryptedValue = await encrypt(mergedData, false);
|
|
132
|
+
return AsyncStorage.setItem(encryptedKey, encryptedValue);
|
|
133
|
+
});
|
|
134
|
+
} catch (e) {
|
|
135
|
+
return e;
|
|
136
|
+
}
|
|
137
|
+
},
|
|
138
|
+
multiRemove: async keys => {
|
|
139
|
+
try {
|
|
140
|
+
if (!Array.isArray(keys)) return keys;
|
|
141
|
+
const encryptedKeys = await Promise.all(keys.map(async item => await encrypt(item, false)));
|
|
142
|
+
return AsyncStorage.multiRemove(encryptedKeys);
|
|
143
|
+
} catch (e) {
|
|
144
|
+
return e;
|
|
145
|
+
}
|
|
146
|
+
},
|
|
147
|
+
clear: async () => {
|
|
148
|
+
try {
|
|
149
|
+
return AsyncStorage.clear();
|
|
150
|
+
} catch (e) {
|
|
151
|
+
return e;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
};
|
|
12
155
|
export function deviceHasSecurityRisk() {
|
|
13
156
|
return SecuritySuite.deviceHasSecurityRisk();
|
|
14
157
|
}
|
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["NativeModules","Platform","LINKING_ERROR","select","ios","default","SecuritySuite","Proxy","get","Error","deviceHasSecurityRisk"],"sources":["index.tsx"],"sourcesContent":["import { NativeModules, Platform } from 'react-native';\n\nconst LINKING_ERROR =\n `The package 'react-native-security-suite' doesn't seem to be linked. Make sure: \\n\\n` +\n Platform.select({ ios: \"- You have run 'pod install'\\n\", default: '' }) +\n '- You rebuilt the app after installing the package\\n' +\n '- You are not using Expo managed workflow\\n';\n\nconst SecuritySuite = NativeModules.SecuritySuite\n ? NativeModules.SecuritySuite\n : new Proxy(\n {},\n {\n get() {\n throw new Error(LINKING_ERROR);\n },\n }\n );\n \nexport function deviceHasSecurityRisk(): Promise<boolean> {\n return SecuritySuite.deviceHasSecurityRisk();\n}\n\nexport default SecuritySuite;"],"mappings":"AAAA,SAASA,aAAT,EAAwBC,QAAxB,QAAwC,cAAxC;AAEA,MAAMC,aAAa,GAChB,sFAAD,GACAD,QAAQ,CAACE,MAAT,CAAgB;EAAEC,GAAG,EAAE,gCAAP;EAAyCC,OAAO,EAAE;AAAlD,CAAhB,CADA,GAEA,sDAFA,GAGA,6CAJF;AAMA,MAAMC,aAAa,GAAGN,aAAa,CAACM,aAAd,GAClBN,aAAa,CAACM,aADI,GAElB,IAAIC,KAAJ,CACE,EADF,EAEE;EACEC,GAAG,GAAG;IACJ,MAAM,IAAIC,KAAJ,CAAUP,aAAV,CAAN;EACD;;AAHH,CAFF,CAFJ;AAWA,OAAO,SAASQ,qBAAT,GAAmD;EACxD,OAAOJ,aAAa,CAACI,qBAAd,EAAP;AACD;AAED,eAAeJ,aAAf"}
|
|
1
|
+
{"version":3,"names":["NativeModules","Platform","AsyncStorage","_","isJsonString","LINKING_ERROR","select","ios","default","SecuritySuite","Proxy","get","Error","getPublicKey","getSharedKey","serverPublicKey","encryptBySharedKey","input","encrypt","decryptBySharedKey","decrypt","getDeviceId","Promise","resolve","reject","result","error","hardEncryption","secretKey","storageEncrypt","storageDecrypt","SecureStorage","setItem","key","value","encryptedKey","encryptedValue","e","getItem","encryptedData","mergeItem","data","mergedData","JSON","stringify","merge","parse","removeItem","getAllKeys","encryptedKeys","all","map","item","decryptedKey","multiSet","keyValuePairs","encryptedKeyValuePairs","length","multiGet","keys","Array","isArray","encryptedItems","decryptedalue","multiMerge","multiRemove","clear","deviceHasSecurityRisk"],"sources":["index.tsx"],"sourcesContent":["import { NativeModules, Platform } from 'react-native';\nimport AsyncStorage from '@react-native-async-storage/async-storage';\nimport _ from 'lodash';\nimport { isJsonString } from './helpers';\n\nconst LINKING_ERROR =\n `The package 'react-native-security-suite' doesn't seem to be linked. Make sure: \\n\\n` +\n Platform.select({ ios: \"- You have run 'pod install'\\n\", default: '' }) +\n '- You rebuilt the app after installing the package\\n' +\n '- You are not using Expo managed workflow\\n';\n\nconst SecuritySuite = NativeModules.SecuritySuite\n ? NativeModules.SecuritySuite\n : new Proxy(\n {},\n {\n get() {\n throw new Error(LINKING_ERROR);\n },\n }\n );\n\nexport const getPublicKey = (): Promise<string> => SecuritySuite.getPublicKey();\n\nexport const getSharedKey = (serverPublicKey: string): Promise<string> =>\n SecuritySuite.getSharedKey(serverPublicKey);\n\nexport const encryptBySharedKey = (input: string): Promise<string> =>\n input && typeof input === 'string' ? SecuritySuite.encrypt(input) : '';\n\nexport const decryptBySharedKey = (input: string) =>\n input && typeof input === 'string' ? SecuritySuite.decrypt(input) : '';\n\nexport const getDeviceId = (): Promise<string> =>\n new Promise((resolve: any, reject: any) => {\n SecuritySuite.getDeviceId((result: string | null, error: string | null) => {\n if (error !== null) reject(error);\n else resolve(result);\n });\n });\n\nexport const encrypt = (\n input: string,\n hardEncryption = true,\n secretKey = null\n): Promise<string> =>\n new Promise((resolve: any, reject: any) => {\n if (!input) resolve(input);\n\n SecuritySuite.storageEncrypt(\n input,\n secretKey,\n hardEncryption,\n (result: string | null, error: string | null) => {\n if (error !== null) reject(error);\n else resolve(result);\n }\n );\n });\n\nexport const decrypt = (\n input: string,\n hardEncryption = true,\n secretKey = null\n): Promise<string> =>\n new Promise((resolve: any, reject: any) => {\n if (!input) resolve(input);\n\n SecuritySuite.storageDecrypt(\n input,\n secretKey,\n hardEncryption,\n (result: string | null, error: string | null) => {\n if (error !== null) reject(error);\n else resolve(result);\n }\n );\n });\n\nexport const SecureStorage = {\n setItem: async (key: string, value: string) => {\n try {\n const encryptedKey = await encrypt(key, false);\n const encryptedValue = await encrypt(value);\n return AsyncStorage.setItem(encryptedKey, encryptedValue);\n } catch (e) {\n return e;\n }\n },\n getItem: async (key: string) => {\n try {\n const encryptedKey = await encrypt(key, false);\n const encryptedData = await AsyncStorage.getItem(encryptedKey);\n return decrypt(encryptedData ?? '');\n } catch (e) {\n return e;\n }\n },\n mergeItem: async (key: string, value: string) => {\n try {\n const encryptedKey = await encrypt(key, false);\n const encryptedData = await AsyncStorage.getItem(encryptedKey);\n const data = await decrypt(encryptedData ?? '');\n if (!isJsonString(data) || !isJsonString(value)) return null;\n const mergedData = await JSON.stringify(\n _.merge(JSON.parse(data), JSON.parse(value))\n );\n const encryptedValue = await encrypt(mergedData);\n return AsyncStorage.setItem(encryptedKey, encryptedValue);\n } catch (e) {\n return e;\n }\n },\n removeItem: async (key: string) => {\n try {\n const encryptedKey = await encrypt(key, false);\n return AsyncStorage.removeItem(encryptedKey);\n } catch (e) {\n return e;\n }\n },\n getAllKeys: async () => {\n try {\n const encryptedKeys = await AsyncStorage.getAllKeys();\n return await Promise.all(\n encryptedKeys.map(async (item: string): Promise<string> => {\n const decryptedKey = await decrypt(item, false);\n return decryptedKey ? decryptedKey : item;\n })\n );\n } catch (e) {\n return e;\n }\n },\n multiSet: async (keyValuePairs: Array<Array<string>>) => {\n try {\n const encryptedKeyValuePairs: any = await Promise.all(\n keyValuePairs.map(async (item: Array<string>) => {\n if (item.length !== 2) return [];\n const encryptedKey = await encrypt(item[0], false);\n const encryptedValue = await encrypt(item[1]);\n return [encryptedKey, encryptedValue];\n })\n );\n AsyncStorage.multiSet(encryptedKeyValuePairs);\n } catch (e) {\n return e;\n }\n },\n multiGet: async (keys: Array<string>) => {\n try {\n if (!Array.isArray(keys)) return null;\n const encryptedKeys = await Promise.all(\n keys.map(\n async (item: string): Promise<string> => await encrypt(item, false)\n )\n );\n const encryptedItems = await AsyncStorage.multiGet(encryptedKeys);\n return await Promise.all(\n encryptedItems && encryptedItems.length\n ? encryptedItems.map(async (item: any): Promise<string[]> => {\n const decryptedKey = await decrypt(item[0], false);\n const decryptedalue = await decrypt(item[1]);\n return [decryptedKey, decryptedalue];\n })\n : []\n );\n } catch (e) {\n return e;\n }\n },\n multiMerge: async (keyValuePairs: Array<Array<string>>) => {\n try {\n return keyValuePairs.map(async (item: Array<string>) => {\n if (item.length !== 2) return;\n const encryptedKey = await encrypt(item[0], false);\n const encryptedData = await AsyncStorage.getItem(item[0]);\n const data = await decrypt(encryptedData ?? '');\n if (!isJsonString(data) || !isJsonString(item[1])) return null;\n const mergedData = await JSON.stringify(\n _.merge(JSON.parse(data), JSON.parse(item[1]))\n );\n const encryptedValue = await encrypt(mergedData, false);\n return AsyncStorage.setItem(encryptedKey, encryptedValue);\n });\n } catch (e) {\n return e;\n }\n },\n multiRemove: async (keys: Array<string>) => {\n try {\n if (!Array.isArray(keys)) return keys;\n const encryptedKeys = await Promise.all(\n keys.map(\n async (item: string): Promise<string> => await encrypt(item, false)\n )\n );\n return AsyncStorage.multiRemove(encryptedKeys);\n } catch (e) {\n return e;\n }\n },\n clear: async () => {\n try {\n return AsyncStorage.clear();\n } catch (e) {\n return e;\n }\n },\n};\n\nexport function deviceHasSecurityRisk(): Promise<boolean> {\n return SecuritySuite.deviceHasSecurityRisk();\n}\n\nexport default SecuritySuite;\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const isJsonString: (value: string) => boolean;
|