react-native-security-suite 0.3.0 → 0.3.2
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 +20 -1
- package/android/build.gradle +1 -0
- package/android/src/main/java/com/securitysuite/SecuritySuiteModule.java +7 -0
- package/android/src/main/java/com/securitysuite/Sslpinning.java +302 -0
- package/ios/ReactNativeSslPinning-Bridging-Header.h +2 -0
- package/ios/SecuritySuite.mm +2 -0
- package/ios/SecuritySuite.swift +55 -1
- package/ios/SecuritySuite.xcodeproj/project.pbxproj +8 -0
- package/ios/SecuritySuite.xcodeproj/project.xcworkspace/xcuserdata/mohammadnavabi.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/ios/SecuritySuite.xcodeproj/xcuserdata/mohammadnavabi.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +6 -0
- package/ios/SslPinning.swift +195 -0
- package/lib/commonjs/index.js +36 -1
- package/lib/commonjs/index.js.map +1 -1
- package/lib/module/index.js +33 -0
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/index.d.ts +2 -0
- package/lib/typescript/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/index.tsx +47 -0
package/README.md
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# react-native-security-suite
|
|
2
2
|
|
|
3
3
|
Security solutions for Android and iOS
|
|
4
|
+
SSL Pinning
|
|
4
5
|
A native implementation encryption/decryption
|
|
5
6
|
Root/Jailbreak detection
|
|
6
7
|
|
|
@@ -25,9 +26,27 @@ import {
|
|
|
25
26
|
encrypt,
|
|
26
27
|
decrypt,
|
|
27
28
|
deviceHasSecurityRisk,
|
|
29
|
+
fetch,
|
|
28
30
|
} from 'react-native-security-suite';
|
|
29
31
|
|
|
30
|
-
//
|
|
32
|
+
// SSL Pinning
|
|
33
|
+
const response = await fetch('URL', {
|
|
34
|
+
body: {},
|
|
35
|
+
headers: {},
|
|
36
|
+
certificates: [
|
|
37
|
+
/* certs */
|
|
38
|
+
],
|
|
39
|
+
validDomains: [
|
|
40
|
+
/* your valid domain */
|
|
41
|
+
],
|
|
42
|
+
timeout: 6000,
|
|
43
|
+
});
|
|
44
|
+
let responseJson = await response.json();
|
|
45
|
+
console.log('SSL Pinning server response: ', responseJson);
|
|
46
|
+
|
|
47
|
+
// ------- OR --------
|
|
48
|
+
|
|
49
|
+
// Hard Encrypt/Decrypt with sharedKey
|
|
31
50
|
const publicKey = await getPublicKey();
|
|
32
51
|
console.log('Public key: ', publicKey);
|
|
33
52
|
/*
|
package/android/build.gradle
CHANGED
|
@@ -90,6 +90,7 @@ dependencies {
|
|
|
90
90
|
// For > 0.71, this will be replaced by `com.facebook.react:react-android:$version` by react gradle plugin
|
|
91
91
|
//noinspection GradleDynamicVersion
|
|
92
92
|
implementation "com.facebook.react:react-native:+"
|
|
93
|
+
implementation "com.squareup.okhttp3:okhttp:3.0.1"
|
|
93
94
|
implementation "com.scottyab:rootbeer-lib:0.1.0"
|
|
94
95
|
}
|
|
95
96
|
|
|
@@ -5,6 +5,7 @@ import com.facebook.react.bridge.Promise;
|
|
|
5
5
|
import com.facebook.react.bridge.ReactApplicationContext;
|
|
6
6
|
import com.facebook.react.bridge.ReactContextBaseJavaModule;
|
|
7
7
|
import com.facebook.react.bridge.ReactMethod;
|
|
8
|
+
import com.facebook.react.bridge.ReadableMap;
|
|
8
9
|
import com.facebook.react.module.annotations.ReactModule;
|
|
9
10
|
import com.scottyab.rootbeer.RootBeer;
|
|
10
11
|
|
|
@@ -188,6 +189,12 @@ public class SecuritySuiteModule extends ReactContextBaseJavaModule {
|
|
|
188
189
|
Settings.Secure.ANDROID_ID);
|
|
189
190
|
}
|
|
190
191
|
|
|
192
|
+
@ReactMethod
|
|
193
|
+
public void fetch(String url, final ReadableMap options, Callback callback) {
|
|
194
|
+
Sslpinning sslpinning = new Sslpinning(context);
|
|
195
|
+
sslpinning.fetch(url, options, callback);
|
|
196
|
+
}
|
|
197
|
+
|
|
191
198
|
@ReactMethod
|
|
192
199
|
public void deviceHasSecurityRisk(Promise promise) {
|
|
193
200
|
RootBeer rootBeer = new RootBeer(context);
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
package com.securitysuite;
|
|
2
|
+
|
|
3
|
+
import android.content.Context;
|
|
4
|
+
import android.net.Uri;
|
|
5
|
+
|
|
6
|
+
import com.facebook.react.bridge.Arguments;
|
|
7
|
+
import com.facebook.react.bridge.Callback;
|
|
8
|
+
import com.facebook.react.bridge.ReactApplicationContext;
|
|
9
|
+
import com.facebook.react.bridge.ReadableArray;
|
|
10
|
+
import com.facebook.react.bridge.ReadableMap;
|
|
11
|
+
import com.facebook.react.bridge.ReadableMapKeySetIterator;
|
|
12
|
+
import com.facebook.react.bridge.ReadableType;
|
|
13
|
+
import com.facebook.react.bridge.WritableMap;
|
|
14
|
+
|
|
15
|
+
import org.json.JSONException;
|
|
16
|
+
|
|
17
|
+
import java.io.BufferedOutputStream;
|
|
18
|
+
import java.io.File;
|
|
19
|
+
import java.io.FileOutputStream;
|
|
20
|
+
import java.io.IOException;
|
|
21
|
+
import java.io.InputStream;
|
|
22
|
+
import java.io.OutputStream;
|
|
23
|
+
import java.net.URI;
|
|
24
|
+
import java.net.URISyntaxException;
|
|
25
|
+
import java.util.HashMap;
|
|
26
|
+
import java.util.Map;
|
|
27
|
+
import java.util.concurrent.TimeUnit;
|
|
28
|
+
|
|
29
|
+
import okhttp3.CertificatePinner;
|
|
30
|
+
import okhttp3.Headers;
|
|
31
|
+
import okhttp3.MediaType;
|
|
32
|
+
import okhttp3.MultipartBody;
|
|
33
|
+
import okhttp3.Request;
|
|
34
|
+
import okhttp3.OkHttpClient;
|
|
35
|
+
import okhttp3.RequestBody;
|
|
36
|
+
import okhttp3.Response;
|
|
37
|
+
|
|
38
|
+
public class Sslpinning {
|
|
39
|
+
private ReactApplicationContext context;
|
|
40
|
+
private static String content_type = "application/json; charset=utf-8";
|
|
41
|
+
public static MediaType mediaType = MediaType.parse(content_type);
|
|
42
|
+
String responseBodyString = "{}";
|
|
43
|
+
|
|
44
|
+
public Sslpinning(ReactApplicationContext context) {
|
|
45
|
+
this.context = context;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
public void fetch(String url, final ReadableMap options, Callback callback) {
|
|
49
|
+
if (!isValidUrl(url)) {
|
|
50
|
+
callback.invoke(null, "url is invalid!");
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
String hostname;
|
|
55
|
+
try {
|
|
56
|
+
hostname = getHostname(url);
|
|
57
|
+
} catch (URISyntaxException e) {
|
|
58
|
+
hostname = url;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if (!options.hasKey("certificates")) {
|
|
62
|
+
callback.invoke(null, "certificates is required!");
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
ReadableArray hashes = options.getArray("certificates");
|
|
67
|
+
if (hashes == null || hashes.size() == 0) {
|
|
68
|
+
callback.invoke(null, "certificates is empty!");
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
try {
|
|
73
|
+
CertificatePinner certificatePinner = getCertificatePinner(hostname, options);
|
|
74
|
+
OkHttpClient client = getClient(options, certificatePinner);
|
|
75
|
+
|
|
76
|
+
Headers header = setHeader(options);
|
|
77
|
+
RequestBody body = setBody(context, options);
|
|
78
|
+
String method = getMethod(options);
|
|
79
|
+
|
|
80
|
+
Request request = new Request.Builder()
|
|
81
|
+
.url(url)
|
|
82
|
+
.headers(header)
|
|
83
|
+
.method(method, body)
|
|
84
|
+
.build();
|
|
85
|
+
|
|
86
|
+
WritableMap output = Arguments.createMap();
|
|
87
|
+
|
|
88
|
+
try {
|
|
89
|
+
Response response = client.newCall(request).execute();
|
|
90
|
+
int responseCode = response.code();
|
|
91
|
+
|
|
92
|
+
byte[] bytes = response.body().bytes();
|
|
93
|
+
responseBodyString = new String(bytes, "UTF-8");
|
|
94
|
+
|
|
95
|
+
output.putInt("status", responseCode);
|
|
96
|
+
output.putString("url", request.url().toString());
|
|
97
|
+
|
|
98
|
+
if (!response.isSuccessful() || responseCode >= 400) {
|
|
99
|
+
output.putString("error", responseBodyString);
|
|
100
|
+
callback.invoke(null, output);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
output.putString("response", responseBodyString);
|
|
104
|
+
callback.invoke(output, null);
|
|
105
|
+
} catch (IOException e) {
|
|
106
|
+
output.putString("error", responseBodyString);
|
|
107
|
+
|
|
108
|
+
callback.invoke(null, output);
|
|
109
|
+
if (e instanceof java.net.SocketTimeoutException) {
|
|
110
|
+
System.err.print("Socket TimeOut");
|
|
111
|
+
} else {
|
|
112
|
+
e.printStackTrace();
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
} catch(JSONException e) {
|
|
116
|
+
callback.invoke(null, e);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
private CertificatePinner getCertificatePinner(String hostname, ReadableMap options) {
|
|
121
|
+
CertificatePinner.Builder certificatePinner = new CertificatePinner.Builder();
|
|
122
|
+
|
|
123
|
+
ReadableArray hashes = options.getArray("certificates");
|
|
124
|
+
for (int i = 0; i < hashes.size(); i++) {
|
|
125
|
+
certificatePinner.add(hostname, "sha256/" + hashes.getString(i));
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
return certificatePinner.build();
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
private OkHttpClient getClient(ReadableMap options, CertificatePinner certificatePinner) throws JSONException {
|
|
132
|
+
if (options.hasKey("timeout")) {
|
|
133
|
+
int timeout = options.getInt("timeout");
|
|
134
|
+
return new OkHttpClient.Builder()
|
|
135
|
+
.connectTimeout(timeout, TimeUnit.MILLISECONDS)
|
|
136
|
+
.readTimeout(timeout, TimeUnit.MILLISECONDS)
|
|
137
|
+
.writeTimeout(timeout, TimeUnit.MILLISECONDS)
|
|
138
|
+
.certificatePinner(certificatePinner)
|
|
139
|
+
.build();
|
|
140
|
+
} else {
|
|
141
|
+
return new OkHttpClient.Builder()
|
|
142
|
+
.certificatePinner(certificatePinner)
|
|
143
|
+
.build();
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
private static String getHostname(String url) throws URISyntaxException {
|
|
148
|
+
URI uri = new URI(url);
|
|
149
|
+
String domain = uri.getHost();
|
|
150
|
+
return domain.startsWith("www.") ? domain.substring(4) : domain;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
private String getMethod(ReadableMap options) {
|
|
154
|
+
String method = "GET";
|
|
155
|
+
if (options.hasKey("method")) {
|
|
156
|
+
method = options.getString("method");
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
return method;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
private Headers setHeader(ReadableMap options) {
|
|
163
|
+
if (!options.hasKey("headers")) {
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
ReadableMap headers = options.getMap("headers");
|
|
168
|
+
Headers.Builder builder = new Headers.Builder();
|
|
169
|
+
|
|
170
|
+
Map<String, String> headersMap = readableMapToHashMap(headers);
|
|
171
|
+
for (Map.Entry<String, String> set : headersMap.entrySet()) {
|
|
172
|
+
builder.add(set.getKey(), set.getValue());
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
return builder.build();
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
private HashMap readableMapToHashMap(ReadableMap readableMap) {
|
|
179
|
+
if (readableMap == null) {
|
|
180
|
+
return null;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
HashMap map = new HashMap<String, String>();
|
|
184
|
+
ReadableMapKeySetIterator keySetIterator = readableMap.keySetIterator();
|
|
185
|
+
while (keySetIterator.hasNextKey()) {
|
|
186
|
+
String key = keySetIterator.nextKey();
|
|
187
|
+
ReadableType type = readableMap.getType(key);
|
|
188
|
+
switch(type) {
|
|
189
|
+
case String:
|
|
190
|
+
map.put(key, readableMap.getString(key));
|
|
191
|
+
break;
|
|
192
|
+
case Map:
|
|
193
|
+
HashMap<String, Object> attributes = this.readableMapToHashMap(readableMap.getMap(key));
|
|
194
|
+
map.put(key, attributes);
|
|
195
|
+
break;
|
|
196
|
+
default:
|
|
197
|
+
// do nothing
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
return map;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
private static boolean isFilePart(ReadableArray part) {
|
|
205
|
+
if (part.getType(1) != ReadableType.Map) {
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
ReadableMap value = part.getMap(1);
|
|
209
|
+
return value.hasKey("type") && (value.hasKey("uri") || value.hasKey("path"));
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
private RequestBody setBody(ReactApplicationContext context, ReadableMap options) {
|
|
213
|
+
if (!options.hasKey("body")) {
|
|
214
|
+
return null;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
RequestBody body = null;
|
|
218
|
+
ReadableType bodyType = options.getType("body");
|
|
219
|
+
switch (bodyType) {
|
|
220
|
+
case String:
|
|
221
|
+
body = RequestBody.create(mediaType, options.getString("body"));
|
|
222
|
+
break;
|
|
223
|
+
case Map:
|
|
224
|
+
ReadableMap bodyMap = options.getMap("body");
|
|
225
|
+
if (bodyMap.hasKey("formData")) {
|
|
226
|
+
ReadableMap formData = bodyMap.getMap("formData");
|
|
227
|
+
body = getBody(formData);
|
|
228
|
+
} else if (bodyMap.hasKey("_parts")) {
|
|
229
|
+
body = getBody(bodyMap);
|
|
230
|
+
}
|
|
231
|
+
break;
|
|
232
|
+
}
|
|
233
|
+
return body;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
private RequestBody getBody(ReadableMap body) {
|
|
237
|
+
MultipartBody.Builder multipartBodyBuilder = new MultipartBody.Builder().setType(MultipartBody.FORM);
|
|
238
|
+
multipartBodyBuilder.setType((MediaType.parse("multipart/form-data")));
|
|
239
|
+
if (body.hasKey("_parts")) {
|
|
240
|
+
ReadableArray parts = body.getArray("_parts");
|
|
241
|
+
for (int i = 0; i < parts.size(); i++) {
|
|
242
|
+
ReadableArray part = parts.getArray(i);
|
|
243
|
+
String key = "";
|
|
244
|
+
if (part.getType(0) == ReadableType.String) {
|
|
245
|
+
key = part.getString(0);
|
|
246
|
+
} else if (part.getType(0) == ReadableType.Number) {
|
|
247
|
+
key = String.valueOf(part.getInt(0));
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
if (isFilePart(part)) {
|
|
251
|
+
ReadableMap fileData = part.getMap(1);
|
|
252
|
+
addFormDataPart(this.context, multipartBodyBuilder, fileData, key);
|
|
253
|
+
} else {
|
|
254
|
+
String value = part.getString(1);
|
|
255
|
+
multipartBodyBuilder.addFormDataPart(key, value);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
return multipartBodyBuilder.build();
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
private static void addFormDataPart(Context context, MultipartBody.Builder multipartBodyBuilder, ReadableMap fileData, String key) {
|
|
263
|
+
Uri _uri = Uri.parse("");
|
|
264
|
+
if (fileData.hasKey("uri")) {
|
|
265
|
+
_uri = Uri.parse(fileData.getString("uri"));
|
|
266
|
+
} else if (fileData.hasKey("path")) {
|
|
267
|
+
_uri = Uri.parse(fileData.getString("path"));
|
|
268
|
+
}
|
|
269
|
+
String type = fileData.getString("type");
|
|
270
|
+
String fileName = "";
|
|
271
|
+
if (fileData.hasKey("fileName")) {
|
|
272
|
+
fileName = fileData.getString("fileName");
|
|
273
|
+
} else if (fileData.hasKey("name")) {
|
|
274
|
+
fileName = fileData.getString("name");
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
try {
|
|
278
|
+
File file = getTempFile(context, _uri);
|
|
279
|
+
multipartBodyBuilder.addFormDataPart(key, fileName, RequestBody.create(MediaType.parse(type), file));
|
|
280
|
+
} catch (IOException e) {
|
|
281
|
+
e.printStackTrace();
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
public static File getTempFile(Context context, Uri uri) throws IOException {
|
|
286
|
+
File file = File.createTempFile("media", null);
|
|
287
|
+
InputStream inputStream = context.getContentResolver().openInputStream(uri);
|
|
288
|
+
OutputStream outputStream = new BufferedOutputStream(new FileOutputStream(file));
|
|
289
|
+
byte[] buffer = new byte[1024];
|
|
290
|
+
int len;
|
|
291
|
+
while ((len = inputStream.read(buffer)) != -1)
|
|
292
|
+
outputStream.write(buffer, 0, len);
|
|
293
|
+
inputStream.close();
|
|
294
|
+
outputStream.close();
|
|
295
|
+
return file;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
private boolean isValidUrl(String url) {
|
|
299
|
+
String regex = "^(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]";
|
|
300
|
+
return url.matches(regex);
|
|
301
|
+
}
|
|
302
|
+
}
|
package/ios/SecuritySuite.mm
CHANGED
|
@@ -16,6 +16,8 @@ RCT_EXTERN_METHOD(storageEncrypt:(NSString)input withSecretKey:(NSString*)secret
|
|
|
16
16
|
|
|
17
17
|
RCT_EXTERN_METHOD(storageDecrypt:(NSString)input withSecretKey:(NSString*)secretKey withHardEncryption:(BOOL)hardEncryption withCallback:(RCTResponseSenderBlock)callback)
|
|
18
18
|
|
|
19
|
+
RCT_EXTERN_METHOD(fetch:(NSString)url withData:(NSDictionary)data withCallback:(RCTResponseSenderBlock)callback)
|
|
20
|
+
|
|
19
21
|
RCT_EXTERN_METHOD(deviceHasSecurityRisk:(RCTPromiseResolveBlock)resolve withRejecter:(RCTPromiseRejectBlock)reject)
|
|
20
22
|
|
|
21
23
|
+ (BOOL)requiresMainQueueSetup
|
package/ios/SecuritySuite.swift
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import IOSSecuritySuite
|
|
2
1
|
import Foundation
|
|
3
2
|
import CryptoKit
|
|
4
3
|
import SwiftUI
|
|
4
|
+
import Security
|
|
5
|
+
import CommonCrypto
|
|
6
|
+
import IOSSecuritySuite
|
|
5
7
|
|
|
6
8
|
@available(iOS 13.0, *)
|
|
7
9
|
@objc(SecuritySuite)
|
|
@@ -123,6 +125,58 @@ class SecuritySuite: NSObject {
|
|
|
123
125
|
func getDeviceId() -> String {
|
|
124
126
|
return UIDevice.current.identifierForVendor!.uuidString.replacingOccurrences(of: "-", with: "", options: [], range: nil)
|
|
125
127
|
}
|
|
128
|
+
|
|
129
|
+
@objc(fetch:withData:withCallback:)
|
|
130
|
+
func fetch(url: NSString, data: NSDictionary, callback: @escaping RCTResponseSenderBlock) -> Void {
|
|
131
|
+
let config = URLSessionConfiguration.default
|
|
132
|
+
config.httpShouldSetCookies = false
|
|
133
|
+
config.httpCookieAcceptPolicy = .never
|
|
134
|
+
config.networkServiceType = .responsiveData
|
|
135
|
+
config.shouldUseExtendedBackgroundIdleMode = true
|
|
136
|
+
|
|
137
|
+
let sslPinning = SSLPinning(data: data)
|
|
138
|
+
|
|
139
|
+
var request = URLRequest(url: URL(string: url as String)!)
|
|
140
|
+
|
|
141
|
+
if data["method"] != nil { request.httpMethod = data["method"] as! String } else { request.httpMethod = "POST" }
|
|
142
|
+
if data["body"] != nil { request.httpBody = (data["body"] as! String).data(using: .utf8)! } else { request.httpBody = "".data(using: .utf8)! }
|
|
143
|
+
if data["headers"] != nil { request.allHTTPHeaderFields = data["headers"] as! [String : String] }
|
|
144
|
+
if data["timeout"] != nil { request.timeoutInterval = data["timeout"] as! TimeInterval }
|
|
145
|
+
let session = URLSession(configuration: config, delegate: sslPinning, delegateQueue: .main)
|
|
146
|
+
let task = session.dataTask(with: request) { data, response, error in
|
|
147
|
+
let response = response as? HTTPURLResponse
|
|
148
|
+
|
|
149
|
+
if error == nil {
|
|
150
|
+
let responseCode = response?.statusCode
|
|
151
|
+
let responseString = String.init(decoding: data ?? .init(), as: UTF8.self)
|
|
152
|
+
let errorString = error?.localizedDescription
|
|
153
|
+
let responseJSON = try? JSONSerialization.jsonObject(with: data!, options: [])
|
|
154
|
+
|
|
155
|
+
var result:NSMutableDictionary = [
|
|
156
|
+
"status": response?.statusCode,
|
|
157
|
+
"url": url,
|
|
158
|
+
]
|
|
159
|
+
if errorString == nil && responseCode! < 400 {
|
|
160
|
+
result["response"] = responseString
|
|
161
|
+
result["responseJSON"] = responseJSON
|
|
162
|
+
callback([result, NSNull()])
|
|
163
|
+
} else {
|
|
164
|
+
result["error"] = responseString
|
|
165
|
+
result["errorJSON"] = responseJSON
|
|
166
|
+
do {
|
|
167
|
+
let jsonData = try JSONSerialization.data(withJSONObject: result)
|
|
168
|
+
callback([NSNull(), result])
|
|
169
|
+
} catch {
|
|
170
|
+
callback([NSNull(), "JSON_PARSE_ERROR"])
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
} else {
|
|
174
|
+
callback([NSNull(), "MUST_BE_UPDATE"])
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
task.resume()
|
|
179
|
+
}
|
|
126
180
|
|
|
127
181
|
@objc(deviceHasSecurityRisk:withRejecter:)
|
|
128
182
|
func deviceHasSecurityRisk(resolve:RCTPromiseResolveBlock, reject:RCTPromiseRejectBlock) -> Void {
|
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
objects = {
|
|
8
8
|
|
|
9
9
|
/* Begin PBXBuildFile section */
|
|
10
|
+
4895B17B2A7545930068E02B /* SslPinning.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4895B1782A7545930068E02B /* SslPinning.swift */; };
|
|
11
|
+
4895B17C2A7545930068E02B /* DataHashingMethods.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4895B17A2A7545930068E02B /* DataHashingMethods.swift */; };
|
|
10
12
|
48C650222A751374001FA3B0 /* StorageEncryption.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48C650202A751374001FA3B0 /* StorageEncryption.swift */; };
|
|
11
13
|
48C650232A751374001FA3B0 /* DataHashingMethods.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48C650212A751374001FA3B0 /* DataHashingMethods.swift */; };
|
|
12
14
|
F4FF95D7245B92E800C19C63 /* SecuritySuite.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4FF95D6245B92E800C19C63 /* SecuritySuite.swift */; };
|
|
@@ -26,6 +28,8 @@
|
|
|
26
28
|
|
|
27
29
|
/* Begin PBXFileReference section */
|
|
28
30
|
134814201AA4EA6300B7C361 /* libSecuritySuite.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libSecuritySuite.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
|
31
|
+
4895B1782A7545930068E02B /* SslPinning.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SslPinning.swift; sourceTree = "<group>"; };
|
|
32
|
+
4895B17A2A7545930068E02B /* DataHashingMethods.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = DataHashingMethods.swift; path = "../../../../Desktop/@navabi/react-native-ssl-pinning/ios/DataHashingMethods.swift"; sourceTree = "<group>"; };
|
|
29
33
|
48C650202A751374001FA3B0 /* StorageEncryption.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StorageEncryption.swift; sourceTree = "<group>"; };
|
|
30
34
|
48C650212A751374001FA3B0 /* DataHashingMethods.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DataHashingMethods.swift; sourceTree = "<group>"; };
|
|
31
35
|
B3E7B5891CC2AC0600A0062D /* SecuritySuite.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SecuritySuite.mm; sourceTree = "<group>"; };
|
|
@@ -60,6 +64,8 @@
|
|
|
60
64
|
F4FF95D5245B92E700C19C63 /* SecuritySuite-Bridging-Header.h */,
|
|
61
65
|
48C650212A751374001FA3B0 /* DataHashingMethods.swift */,
|
|
62
66
|
48C650202A751374001FA3B0 /* StorageEncryption.swift */,
|
|
67
|
+
4895B17A2A7545930068E02B /* DataHashingMethods.swift */,
|
|
68
|
+
4895B1782A7545930068E02B /* SslPinning.swift */,
|
|
63
69
|
134814211AA4EA7D00B7C361 /* Products */,
|
|
64
70
|
);
|
|
65
71
|
sourceTree = "<group>";
|
|
@@ -122,6 +128,8 @@
|
|
|
122
128
|
buildActionMask = 2147483647;
|
|
123
129
|
files = (
|
|
124
130
|
48C650232A751374001FA3B0 /* DataHashingMethods.swift in Sources */,
|
|
131
|
+
4895B17C2A7545930068E02B /* DataHashingMethods.swift in Sources */,
|
|
132
|
+
4895B17B2A7545930068E02B /* SslPinning.swift in Sources */,
|
|
125
133
|
48C650222A751374001FA3B0 /* StorageEncryption.swift in Sources */,
|
|
126
134
|
F4FF95D7245B92E800C19C63 /* SecuritySuite.swift in Sources */,
|
|
127
135
|
);
|
|
Binary file
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
@available(iOS 13.0, *)
|
|
2
|
+
class SSLPinning: NSObject, URLSessionDelegate {
|
|
3
|
+
var validDomains: [String] = []
|
|
4
|
+
var intermediateKeyHashes: [Data] = []
|
|
5
|
+
var leafKeyHashes: [Data] = []
|
|
6
|
+
|
|
7
|
+
init(data: NSDictionary) {
|
|
8
|
+
if let certs = data["certificates"] as? [String] {
|
|
9
|
+
for cert in certs {
|
|
10
|
+
intermediateKeyHashes.append(Data(base64Encoded: cert)!)
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
if let domains = data["validDomains"] as? [String] {
|
|
15
|
+
for domain in domains {
|
|
16
|
+
validDomains.append(domain)
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
|
|
22
|
+
guard let trust = challenge.protectionSpace.serverTrust else {
|
|
23
|
+
return completionHandler(.cancelAuthenticationChallenge, nil)
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
let host = challenge.protectionSpace.host
|
|
27
|
+
let port = challenge.protectionSpace.port
|
|
28
|
+
guard port == 443, (3...4).contains(trust.certificates.count),
|
|
29
|
+
let leafCertificate = trust.certificates.first,
|
|
30
|
+
let commonName = leafCertificate.commonName,
|
|
31
|
+
validDomains.contains(where: { commonName == $0 || commonName.hasSuffix("." + $0) }) else {
|
|
32
|
+
completionHandler(.cancelAuthenticationChallenge, nil)
|
|
33
|
+
return
|
|
34
|
+
}
|
|
35
|
+
let intermediateCertificatesValid = trust.certificates.dropFirst().prefix(2).allSatisfy {
|
|
36
|
+
($0.pin.map(intermediateKeyHashes.contains) ?? false)
|
|
37
|
+
}
|
|
38
|
+
let leafCertificateValid = leafKeyHashes.contains(leafCertificate.pin ?? .init())
|
|
39
|
+
|
|
40
|
+
let pattern = commonName
|
|
41
|
+
.replacingOccurrences(of: ".", with: "\\.")
|
|
42
|
+
.replacingOccurrences(of: "*", with: ".+", options: [.anchored])
|
|
43
|
+
guard intermediateCertificatesValid && (leafKeyHashes.isEmpty || leafCertificateValid),
|
|
44
|
+
let commonNameRegex = try? NSRegularExpression(pattern: pattern) else {
|
|
45
|
+
completionHandler(.cancelAuthenticationChallenge, nil)
|
|
46
|
+
return
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
guard commonNameRegex.textMatches(in: host) == [host] else {
|
|
50
|
+
completionHandler(.cancelAuthenticationChallenge, nil)
|
|
51
|
+
return
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
trust.policies = [.ssl(server: true, hostname: host)]
|
|
55
|
+
do {
|
|
56
|
+
if try !trust.evaluate() {
|
|
57
|
+
completionHandler(.cancelAuthenticationChallenge, nil)
|
|
58
|
+
}
|
|
59
|
+
} catch {
|
|
60
|
+
completionHandler(.cancelAuthenticationChallenge, nil)
|
|
61
|
+
return
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
let credential = URLCredential(trust: trust)
|
|
65
|
+
completionHandler(.useCredential, credential)
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
@available(iOS 13.0, *)
|
|
70
|
+
extension Data {
|
|
71
|
+
/**
|
|
72
|
+
Calculates hash digest of data.
|
|
73
|
+
|
|
74
|
+
- Parameter digest: digest type. Currently only SHA is supported.
|
|
75
|
+
- Returns: A data object with length equal to digest length.
|
|
76
|
+
*/
|
|
77
|
+
public func _hash() -> Data {
|
|
78
|
+
guard !isEmpty else { return Data() }
|
|
79
|
+
var result = [UInt8](repeating: 0, count: 256/8)
|
|
80
|
+
self.withUnsafeBytes { (buf: UnsafeRawBufferPointer) -> Void in
|
|
81
|
+
let ptr = buf.baseAddress!
|
|
82
|
+
let dataLen = CC_LONG(buf.count)
|
|
83
|
+
CC_SHA256(ptr, dataLen, &result)
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return Data(result)
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
extension Dictionary {
|
|
91
|
+
func toString() -> String? {
|
|
92
|
+
return (self.compactMap({ (key, value) -> String in
|
|
93
|
+
return "\(key)=\(value)"
|
|
94
|
+
}) as Array).joined(separator: "&")
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
@available(iOS 13.0, *)
|
|
99
|
+
extension SecTrust {
|
|
100
|
+
// Returns certificates of the certificate chain used to evaluate trust.
|
|
101
|
+
fileprivate var certificates: [SecCertificate] {
|
|
102
|
+
(0..<SecTrustGetCertificateCount(self))
|
|
103
|
+
.map { SecTrustGetCertificateAtIndex(self, $0 as CFIndex)! }
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Retrieves the policies used by a given trust management object.
|
|
107
|
+
fileprivate var policies: [SecPolicy]? {
|
|
108
|
+
get {
|
|
109
|
+
var result: CFArray?
|
|
110
|
+
SecTrustCopyPolicies(self, &result)
|
|
111
|
+
return result as? [SecPolicy]
|
|
112
|
+
}
|
|
113
|
+
set {
|
|
114
|
+
if let newValue = newValue {
|
|
115
|
+
SecTrustSetPolicies(self, newValue as CFArray)
|
|
116
|
+
} else {
|
|
117
|
+
SecTrustSetPolicies(self, [] as CFArray)
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
fileprivate func evaluate() throws -> Bool {
|
|
123
|
+
var error: CFError?
|
|
124
|
+
let success = SecTrustEvaluateWithError(self, &error)
|
|
125
|
+
if let error = error {
|
|
126
|
+
throw error
|
|
127
|
+
}
|
|
128
|
+
return success
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
@available(iOS 13.0, *)
|
|
133
|
+
extension SecCertificate {
|
|
134
|
+
fileprivate var key: SecKey? {
|
|
135
|
+
SecCertificateCopyKey(self)
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
fileprivate var commonName: String? {
|
|
139
|
+
var result: CFString?
|
|
140
|
+
SecCertificateCopyCommonName(self, &result)
|
|
141
|
+
return result as String?
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
fileprivate var pin: Data? {
|
|
145
|
+
try? key?.bytes().hash(digest: .sha256)
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
extension SecPolicy {
|
|
150
|
+
static func ssl(server: Bool, hostname: String) -> SecPolicy {
|
|
151
|
+
SecPolicyCreateSSL(server, hostname as CFString)
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
static func basicX509() -> SecPolicy {
|
|
155
|
+
SecPolicyCreateBasicX509()
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
extension NSRegularExpression {
|
|
160
|
+
public func matches(
|
|
161
|
+
in string: String,
|
|
162
|
+
options: NSRegularExpression.MatchingOptions = []
|
|
163
|
+
) -> [NSTextCheckingResult] {
|
|
164
|
+
matches(in: string, options: options, range: NSRange(string.startIndex..., in: string))
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
public func textMatches(
|
|
168
|
+
in string: String,
|
|
169
|
+
options: NSRegularExpression.MatchingOptions = []
|
|
170
|
+
) -> [String] {
|
|
171
|
+
textMatches(in: string, options: options, range: string.startIndex...)
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
public func matches<R: RangeExpression>(
|
|
175
|
+
in string: String,
|
|
176
|
+
options: NSRegularExpression.MatchingOptions = [],
|
|
177
|
+
range: R
|
|
178
|
+
) -> [NSTextCheckingResult] where R.Bound == String.Index {
|
|
179
|
+
matches(in: string, options: options, range: NSRange(range, in: string))
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
public func textMatches<R: RangeExpression>(
|
|
183
|
+
in string: String,
|
|
184
|
+
options: NSRegularExpression.MatchingOptions = [],
|
|
185
|
+
range: R
|
|
186
|
+
) -> [String] where R.Bound == String.Index {
|
|
187
|
+
matches(in: string, options: options, range: NSRange(range, in: string))
|
|
188
|
+
.map {
|
|
189
|
+
guard let range = Range($0.range, in: string) else {
|
|
190
|
+
return ""
|
|
191
|
+
}
|
|
192
|
+
return String(string[range])
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
package/lib/commonjs/index.js
CHANGED
|
@@ -5,7 +5,9 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.default = exports.decryptBySharedKey = exports.decrypt = exports.SecureStorage = void 0;
|
|
7
7
|
exports.deviceHasSecurityRisk = deviceHasSecurityRisk;
|
|
8
|
-
exports.
|
|
8
|
+
exports.encryptBySharedKey = exports.encrypt = void 0;
|
|
9
|
+
exports.fetch = fetch;
|
|
10
|
+
exports.getSharedKey = exports.getPublicKey = exports.getDeviceId = void 0;
|
|
9
11
|
var _reactNative = require("react-native");
|
|
10
12
|
var _asyncStorage = _interopRequireDefault(require("@react-native-async-storage/async-storage"));
|
|
11
13
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
@@ -172,6 +174,39 @@ const SecureStorage = {
|
|
|
172
174
|
}
|
|
173
175
|
};
|
|
174
176
|
exports.SecureStorage = SecureStorage;
|
|
177
|
+
function fetch(url, options) {
|
|
178
|
+
return new Promise((resolve, reject) => {
|
|
179
|
+
SecuritySuite.fetch(url, options, (result, error) => {
|
|
180
|
+
try {
|
|
181
|
+
if (error === null) {
|
|
182
|
+
result.json = () => JSON.parse(result.response);
|
|
183
|
+
resolve(result);
|
|
184
|
+
} else {
|
|
185
|
+
try {
|
|
186
|
+
const errorJson = JSON.parse(error.error);
|
|
187
|
+
reject({
|
|
188
|
+
json: () => errorJson,
|
|
189
|
+
error: error === null || error === void 0 ? void 0 : error.error,
|
|
190
|
+
path: errorJson === null || errorJson === void 0 ? void 0 : errorJson.path,
|
|
191
|
+
message: errorJson === null || errorJson === void 0 ? void 0 : errorJson.message,
|
|
192
|
+
code: errorJson === null || errorJson === void 0 ? void 0 : errorJson.code,
|
|
193
|
+
status: error === null || error === void 0 ? void 0 : error.status,
|
|
194
|
+
url: error === null || error === void 0 ? void 0 : error.url
|
|
195
|
+
});
|
|
196
|
+
} catch (e) {
|
|
197
|
+
reject({
|
|
198
|
+
error: error === null || error === void 0 ? void 0 : error.error,
|
|
199
|
+
status: error === null || error === void 0 ? void 0 : error.status,
|
|
200
|
+
url: error === null || error === void 0 ? void 0 : error.url
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
} catch (e) {
|
|
205
|
+
console.error('SSL Pinnning fetch error: ', e);
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
}
|
|
175
210
|
function deviceHasSecurityRisk() {
|
|
176
211
|
return SecuritySuite.deviceHasSecurityRisk();
|
|
177
212
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNative","require","_asyncStorage","_interopRequireDefault","_lodash","_helpers","obj","__esModule","default","LINKING_ERROR","Platform","select","ios","SecuritySuite","NativeModules","Proxy","get","Error","getPublicKey","exports","getSharedKey","serverPublicKey","encryptBySharedKey","input","encrypt","decryptBySharedKey","decrypt","getDeviceId","Promise","resolve","reject","result","error","hardEncryption","arguments","length","undefined","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","console","multiGet","keys","Array","isArray","encryptedItems","decryptedalue","multiMerge","multiRemove","clear","deviceHasSecurityRisk","_default"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"
|
|
1
|
+
{"version":3,"names":["_reactNative","require","_asyncStorage","_interopRequireDefault","_lodash","_helpers","obj","__esModule","default","LINKING_ERROR","Platform","select","ios","SecuritySuite","NativeModules","Proxy","get","Error","getPublicKey","exports","getSharedKey","serverPublicKey","encryptBySharedKey","input","encrypt","decryptBySharedKey","decrypt","getDeviceId","Promise","resolve","reject","result","error","hardEncryption","arguments","length","undefined","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","console","multiGet","keys","Array","isArray","encryptedItems","decryptedalue","multiMerge","multiRemove","clear","fetch","url","options","json","response","errorJson","path","message","code","status","deviceHasSecurityRisk","_default"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"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"}
|
package/lib/module/index.js
CHANGED
|
@@ -155,6 +155,39 @@ export const SecureStorage = {
|
|
|
155
155
|
}
|
|
156
156
|
}
|
|
157
157
|
};
|
|
158
|
+
export function fetch(url, options) {
|
|
159
|
+
return new Promise((resolve, reject) => {
|
|
160
|
+
SecuritySuite.fetch(url, options, (result, error) => {
|
|
161
|
+
try {
|
|
162
|
+
if (error === null) {
|
|
163
|
+
result.json = () => JSON.parse(result.response);
|
|
164
|
+
resolve(result);
|
|
165
|
+
} else {
|
|
166
|
+
try {
|
|
167
|
+
const errorJson = JSON.parse(error.error);
|
|
168
|
+
reject({
|
|
169
|
+
json: () => errorJson,
|
|
170
|
+
error: error === null || error === void 0 ? void 0 : error.error,
|
|
171
|
+
path: errorJson === null || errorJson === void 0 ? void 0 : errorJson.path,
|
|
172
|
+
message: errorJson === null || errorJson === void 0 ? void 0 : errorJson.message,
|
|
173
|
+
code: errorJson === null || errorJson === void 0 ? void 0 : errorJson.code,
|
|
174
|
+
status: error === null || error === void 0 ? void 0 : error.status,
|
|
175
|
+
url: error === null || error === void 0 ? void 0 : error.url
|
|
176
|
+
});
|
|
177
|
+
} catch (e) {
|
|
178
|
+
reject({
|
|
179
|
+
error: error === null || error === void 0 ? void 0 : error.error,
|
|
180
|
+
status: error === null || error === void 0 ? void 0 : error.status,
|
|
181
|
+
url: error === null || error === void 0 ? void 0 : error.url
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
} catch (e) {
|
|
186
|
+
console.error('SSL Pinnning fetch error: ', e);
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
}
|
|
158
191
|
export function deviceHasSecurityRisk() {
|
|
159
192
|
return SecuritySuite.deviceHasSecurityRisk();
|
|
160
193
|
}
|
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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","arguments","length","undefined","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","console","multiGet","keys","Array","isArray","encryptedItems","decryptedalue","multiMerge","multiRemove","clear","deviceHasSecurityRisk"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"AAAA,SAASA,aAAa,EAAEC,QAAQ,QAAQ,cAAc;AACtD,OAAOC,YAAY,MAAM,2CAA2C;AACpE,OAAOC,CAAC,MAAM,QAAQ;AACtB,SAASC,YAAY,QAAQ,WAAW;
|
|
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","arguments","length","undefined","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","console","multiGet","keys","Array","isArray","encryptedItems","decryptedalue","multiMerge","multiRemove","clear","fetch","url","options","json","response","errorJson","path","message","code","status","deviceHasSecurityRisk"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { ErrorResponse, Options, SuccessResponse } from 'react-native-security-suite';
|
|
1
2
|
declare const SecuritySuite: any;
|
|
2
3
|
export declare const getPublicKey: () => Promise<string>;
|
|
3
4
|
export declare const getSharedKey: (serverPublicKey: string) => Promise<string>;
|
|
@@ -18,6 +19,7 @@ export declare const SecureStorage: {
|
|
|
18
19
|
multiRemove: (keys: Array<string>) => Promise<unknown>;
|
|
19
20
|
clear: () => Promise<unknown>;
|
|
20
21
|
};
|
|
22
|
+
export declare function fetch(url: string, options: Options): Promise<SuccessResponse | ErrorResponse>;
|
|
21
23
|
export declare function deviceHasSecurityRisk(): Promise<boolean>;
|
|
22
24
|
export default SecuritySuite;
|
|
23
25
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,aAAa,EACb,OAAO,EACP,eAAe,EAChB,MAAM,6BAA6B,CAAC;AAQrC,QAAA,MAAM,aAAa,KASd,CAAC;AAEN,eAAO,MAAM,YAAY,QAAO,QAAQ,MAAM,CAAiC,CAAC;AAEhF,eAAO,MAAM,YAAY,oBAAqB,MAAM,KAAG,QAAQ,MAAM,CACxB,CAAC;AAE9C,eAAO,MAAM,kBAAkB,UAAW,MAAM,KAAG,QAAQ,MAAM,CACO,CAAC;AAEzE,eAAO,MAAM,kBAAkB,UAAW,MAAM,QACwB,CAAC;AAEzE,eAAO,MAAM,WAAW,QAAO,QAAQ,MAAM,CAMzC,CAAC;AAEL,eAAO,MAAM,OAAO,UACX,MAAM,iDAGZ,QAAQ,MAAM,CAab,CAAC;AAEL,eAAO,MAAM,OAAO,UACX,MAAM,iDAGZ,QAAQ,MAAM,CAab,CAAC;AAEL,eAAO,MAAM,aAAa;mBACH,MAAM,SAAS,MAAM;mBASrB,MAAM;qBASJ,MAAM,SAAS,MAAM;sBAepB,MAAM;;8BAsBb,MAAM,MAAM,MAAM,CAAC,CAAC,KAClC,QAAQ,IAAI,GAAG,MAAM,EAAE,EAAE,CAAC;qBAkBN,MAAM,MAAM,CAAC;gCAsBF,MAAM,MAAM,MAAM,CAAC,CAAC;wBAqB5B,MAAM,MAAM,CAAC;;CAoBxC,CAAC;AAEF,wBAAgB,KAAK,CACnB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,eAAe,GAAG,aAAa,CAAC,CAqC1C;AAED,wBAAgB,qBAAqB,IAAI,OAAO,CAAC,OAAO,CAAC,CAExD;AAED,eAAe,aAAa,CAAC"}
|
package/package.json
CHANGED
package/src/index.tsx
CHANGED
|
@@ -2,6 +2,11 @@ import { NativeModules, Platform } from 'react-native';
|
|
|
2
2
|
import AsyncStorage from '@react-native-async-storage/async-storage';
|
|
3
3
|
import _ from 'lodash';
|
|
4
4
|
import { isJsonString } from './helpers';
|
|
5
|
+
import type {
|
|
6
|
+
ErrorResponse,
|
|
7
|
+
Options,
|
|
8
|
+
SuccessResponse,
|
|
9
|
+
} from 'react-native-security-suite';
|
|
5
10
|
|
|
6
11
|
const LINKING_ERROR =
|
|
7
12
|
`The package 'react-native-security-suite' doesn't seem to be linked. Make sure: \n\n` +
|
|
@@ -217,6 +222,48 @@ export const SecureStorage = {
|
|
|
217
222
|
},
|
|
218
223
|
};
|
|
219
224
|
|
|
225
|
+
export function fetch(
|
|
226
|
+
url: string,
|
|
227
|
+
options: Options
|
|
228
|
+
): Promise<SuccessResponse | ErrorResponse> {
|
|
229
|
+
return new Promise((resolve, reject) => {
|
|
230
|
+
SecuritySuite.fetch(
|
|
231
|
+
url,
|
|
232
|
+
options,
|
|
233
|
+
(result: SuccessResponse, error: ErrorResponse) => {
|
|
234
|
+
try {
|
|
235
|
+
if (error === null) {
|
|
236
|
+
result.json = () => JSON.parse(result.response);
|
|
237
|
+
|
|
238
|
+
resolve(result);
|
|
239
|
+
} else {
|
|
240
|
+
try {
|
|
241
|
+
const errorJson = JSON.parse(error.error);
|
|
242
|
+
reject({
|
|
243
|
+
json: () => errorJson,
|
|
244
|
+
error: error?.error,
|
|
245
|
+
path: errorJson?.path,
|
|
246
|
+
message: errorJson?.message,
|
|
247
|
+
code: errorJson?.code,
|
|
248
|
+
status: error?.status,
|
|
249
|
+
url: error?.url,
|
|
250
|
+
});
|
|
251
|
+
} catch (e) {
|
|
252
|
+
reject({
|
|
253
|
+
error: error?.error,
|
|
254
|
+
status: error?.status,
|
|
255
|
+
url: error?.url,
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
} catch (e) {
|
|
260
|
+
console.error('SSL Pinnning fetch error: ', e);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
);
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
|
|
220
267
|
export function deviceHasSecurityRisk(): Promise<boolean> {
|
|
221
268
|
return SecuritySuite.deviceHasSecurityRisk();
|
|
222
269
|
}
|