@umutcansu/react-native-pinvault 0.0.0-stage → 2.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/CHANGELOG.md +55 -0
- package/LICENSE +21 -0
- package/README.md +386 -2
- package/RNPinVault.podspec +43 -0
- package/android/build.gradle +68 -0
- package/android/consumer-rules.pro +25 -0
- package/android/src/main/AndroidManifest.xml +16 -0
- package/android/src/main/java/io/github/umutcansu/pinvault/reactnative/ConfigParser.kt +300 -0
- package/android/src/main/java/io/github/umutcansu/pinvault/reactnative/JsEnvironmentGuard.kt +53 -0
- package/android/src/main/java/io/github/umutcansu/pinvault/reactnative/NativeSecurity.kt +239 -0
- package/android/src/main/java/io/github/umutcansu/pinvault/reactnative/PinVaultModule.kt +410 -0
- package/android/src/main/java/io/github/umutcansu/pinvault/reactnative/PinVaultNetworking.kt +296 -0
- package/android/src/main/java/io/github/umutcansu/pinvault/reactnative/PinVaultPackage.kt +25 -0
- package/android/src/main/java/io/github/umutcansu/pinvault/reactnative/PinnedFetch.kt +131 -0
- package/android/src/main/java/io/github/umutcansu/pinvault/reactnative/ResultMapper.kt +188 -0
- package/android/src/main/java/io/github/umutcansu/pinvault/reactnative/StrictJson.kt +225 -0
- package/android/src/main/java/io/github/umutcansu/pinvault/reactnative/VaultTokenStore.kt +63 -0
- package/ios/Core/ConfigParser.swift +276 -0
- package/ios/Core/JSEnvironmentGuard.swift +129 -0
- package/ios/Core/NativeSecurity.swift +197 -0
- package/ios/Core/PinnedFetch.swift +119 -0
- package/ios/Core/ReactNetworking.swift +172 -0
- package/ios/Core/ResultMapper.swift +163 -0
- package/ios/Core/StrictJSON.swift +214 -0
- package/ios/Core/VaultTokenStore.swift +66 -0
- package/ios/PinVaultBridge.swift +412 -0
- package/ios/PinVaultReactNetworking.swift +47 -0
- package/ios/RNPinVault.h +7 -0
- package/ios/RNPinVault.mm +293 -0
- package/ios/RNPinVaultURLRequestHandler.mm +92 -0
- package/lib/module/NativePinVault.js +13 -0
- package/lib/module/NativePinVault.js.map +1 -0
- package/lib/module/index.js +312 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/types.js +2 -0
- package/lib/module/types.js.map +1 -0
- package/lib/typescript/package.json +1 -0
- package/lib/typescript/src/NativePinVault.d.ts +50 -0
- package/lib/typescript/src/NativePinVault.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +150 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/types.d.ts +346 -0
- package/lib/typescript/src/types.d.ts.map +1 -0
- package/package.json +128 -4
- package/src/NativePinVault.ts +72 -0
- package/src/index.ts +385 -0
- package/src/types.ts +351 -0
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
export type TimeUnit = 'MILLISECONDS' | 'SECONDS' | 'MINUTES' | 'HOURS' | 'DAYS';
|
|
2
|
+
/** `amount` + `unit`, as the builder methods take them (`expiredConfigGrace(1, TimeUnit.HOURS)`). */
|
|
3
|
+
export type Duration = {
|
|
4
|
+
amount: number;
|
|
5
|
+
unit: TimeUnit;
|
|
6
|
+
};
|
|
7
|
+
/** A pin entry (`HostPin`). At least two pins (primary + backup), Base64 SPKI SHA-256 without `sha256/`. */
|
|
8
|
+
export type HostPin = {
|
|
9
|
+
hostname: string;
|
|
10
|
+
sha256: string[];
|
|
11
|
+
version?: number;
|
|
12
|
+
forceUpdate?: boolean;
|
|
13
|
+
mtls?: boolean;
|
|
14
|
+
clientCertVersion?: number;
|
|
15
|
+
};
|
|
16
|
+
/** One Config API (`configApi(id, url) { … }`). Keys are the `ConfigApiBlock.Builder` methods. */
|
|
17
|
+
export type ConfigApiBlock = {
|
|
18
|
+
id: string;
|
|
19
|
+
url: string;
|
|
20
|
+
bootstrapPins?: HostPin[];
|
|
21
|
+
configEndpoint?: string;
|
|
22
|
+
healthEndpoint?: string;
|
|
23
|
+
/** `signaturePublicKey(key)`: one key. Use either this or `signaturePublicKeys`. */
|
|
24
|
+
signaturePublicKey?: string;
|
|
25
|
+
signaturePublicKeys?: string[];
|
|
26
|
+
requiredSignatures?: number;
|
|
27
|
+
recoveryPublicKeys?: string[];
|
|
28
|
+
requiredRecoverySignatures?: number;
|
|
29
|
+
allowUnsigned?: boolean;
|
|
30
|
+
serverScope?: string;
|
|
31
|
+
allowUnpinnedConfigApi?: boolean;
|
|
32
|
+
allowServerGeneratedKey?: boolean;
|
|
33
|
+
clientCaPins?: string[];
|
|
34
|
+
maxClientCertLifetimeDays?: number;
|
|
35
|
+
clientCertHosts?: string[];
|
|
36
|
+
enrollmentEndpoint?: string;
|
|
37
|
+
clientCertEndpoint?: string;
|
|
38
|
+
vaultReportEndpoint?: string;
|
|
39
|
+
clientCertLabel?: string;
|
|
40
|
+
wantPinsFor?: string[];
|
|
41
|
+
renewalUrl?: string;
|
|
42
|
+
enrollmentUrl?: string;
|
|
43
|
+
clientCertRenewalThreshold?: number;
|
|
44
|
+
disableClientCertRenewal?: boolean;
|
|
45
|
+
attestation?: boolean;
|
|
46
|
+
attestationInterval?: Duration;
|
|
47
|
+
tokenHosts?: string[];
|
|
48
|
+
};
|
|
49
|
+
export type StorageStrategy = 'ENCRYPTED_PREFS' | 'ENCRYPTED_FILE';
|
|
50
|
+
export type VaultFileAccessPolicy = 'PUBLIC' | 'API_KEY' | 'TOKEN' | 'TOKEN_MTLS';
|
|
51
|
+
export type VaultFileEncryption = 'PLAIN' | 'AT_REST' | 'END_TO_END' | 'USER_AUTH';
|
|
52
|
+
export type UserAuth = 'NONE' | 'REQUIRED' | 'IF_SCREEN_LOCK';
|
|
53
|
+
/**
|
|
54
|
+
* One vault file (`vaultFile(key) { … }`). For `TOKEN` / `TOKEN_MTLS` files the
|
|
55
|
+
* native side installs the `accessToken { … }` provider itself: it reads the token
|
|
56
|
+
* you set with `setVaultToken(key, token)` (or pass to `fetchFile(key, { token })`),
|
|
57
|
+
* which stays in native memory only.
|
|
58
|
+
*/
|
|
59
|
+
export type VaultFileConfig = {
|
|
60
|
+
key: string;
|
|
61
|
+
endpoint: string;
|
|
62
|
+
signaturePublicKey?: string;
|
|
63
|
+
updateWithPins?: boolean;
|
|
64
|
+
storage?: StorageStrategy;
|
|
65
|
+
configApi?: string;
|
|
66
|
+
accessPolicy?: VaultFileAccessPolicy;
|
|
67
|
+
encryption?: VaultFileEncryption;
|
|
68
|
+
userAuth?: UserAuth;
|
|
69
|
+
maxOfflineAge?: Duration;
|
|
70
|
+
wipeWhenStale?: boolean;
|
|
71
|
+
};
|
|
72
|
+
/** Operations the environment guard is asked about (`GuardedOperation`). */
|
|
73
|
+
export type GuardedOperation = 'INIT' | 'ENROLL' | 'FETCH_FILE' | 'UNLOCK_FILE';
|
|
74
|
+
/**
|
|
75
|
+
* The app's device verdict (root / jailbreak / hooking detection of your choice)
|
|
76
|
+
* before every guarded operation. Runs in JS, so code that hooks the JS runtime
|
|
77
|
+
* can answer for it: treat it as one more signal, the decisive check is the
|
|
78
|
+
* server's attestation verdict. Fail closed: a timeout, a thrown error or a
|
|
79
|
+
* non-`true` value refuses the operation.
|
|
80
|
+
*/
|
|
81
|
+
export type EnvironmentGuard = (operation: GuardedOperation) => boolean | Promise<boolean>;
|
|
82
|
+
/** `PinVaultConfig.Builder`, as JSON. */
|
|
83
|
+
export type PinVaultConfig = {
|
|
84
|
+
configApis?: ConfigApiBlock[];
|
|
85
|
+
vaultFiles?: VaultFileConfig[];
|
|
86
|
+
staticPins?: {
|
|
87
|
+
pins: HostPin[];
|
|
88
|
+
version?: number;
|
|
89
|
+
forceUpdate?: boolean;
|
|
90
|
+
};
|
|
91
|
+
maxRetryCount?: number;
|
|
92
|
+
updateIntervalHours?: number;
|
|
93
|
+
updateIntervalMinutes?: number;
|
|
94
|
+
deviceAlias?: string;
|
|
95
|
+
expiredConfigGrace?: Duration;
|
|
96
|
+
requireCaTrust?: string[];
|
|
97
|
+
wipeVaultFilesOnRevocation?: boolean;
|
|
98
|
+
vaultFileMaxOfflineAge?: Duration;
|
|
99
|
+
requireUnlockedDevice?: boolean;
|
|
100
|
+
requireHardwareBackedKeys?: boolean;
|
|
101
|
+
managedTrustRoots?: boolean;
|
|
102
|
+
expectedSignerSha256?: string[];
|
|
103
|
+
environmentGuard?: EnvironmentGuard;
|
|
104
|
+
/** How long the native side waits for `environmentGuard` (ms, 100–30000, default 5000). */
|
|
105
|
+
environmentGuardTimeoutMs?: number;
|
|
106
|
+
/**
|
|
107
|
+
* `start` fails with `E_NETWORKING_NOT_PINNED` when React Native's own networking
|
|
108
|
+
* does not go through PinVault: on Android when another library replaced the
|
|
109
|
+
* OkHttp hooks (or they are not installed), on iOS when RCTNetworking does not
|
|
110
|
+
* pick the plugin's request handler for https. Default false (a warning is logged).
|
|
111
|
+
*/
|
|
112
|
+
requirePinnedReactNativeNetworking?: boolean;
|
|
113
|
+
/** Android-only settings (ignored on iOS). */
|
|
114
|
+
android?: {
|
|
115
|
+
/** `requireUnlockedDevice(allowFallback = true)`. */
|
|
116
|
+
requireUnlockedDeviceAllowFallback?: boolean;
|
|
117
|
+
/**
|
|
118
|
+
* Pin React Native's own `fetch` / `XMLHttpRequest` / `WebSocket` / images (default true).
|
|
119
|
+
* The plugin's content provider installs the hooks before the app starts; `false`
|
|
120
|
+
* is refused while they are installed — opt out natively (README, "Networking").
|
|
121
|
+
*/
|
|
122
|
+
pinGlobalNetworking?: boolean;
|
|
123
|
+
/** Keep React Native's 10 MiB disk HTTP cache for its `fetch` / XHR (default false: no disk cache). */
|
|
124
|
+
keepReactNativeHttpCache?: boolean;
|
|
125
|
+
/** Keep React Native's persistent cookie jar for its `fetch` / XHR (default false: no cookies). */
|
|
126
|
+
keepReactNativeCookies?: boolean;
|
|
127
|
+
};
|
|
128
|
+
/** iOS-only settings (ignored on Android). */
|
|
129
|
+
ios?: {
|
|
130
|
+
/** `resolve(host:to:)`: connect to `address` while pinning and verifying `host`. */
|
|
131
|
+
resolve?: Record<string, string>;
|
|
132
|
+
expectedBundleIds?: string[];
|
|
133
|
+
expectedTeamIds?: string[];
|
|
134
|
+
/** `userAuthStrength(_:)`; `BIOMETRIC_CURRENT_SET` = `userAuthBiometricOnly()`. */
|
|
135
|
+
userAuthStrength?: 'DEVICE_OWNER' | 'BIOMETRIC_CURRENT_SET';
|
|
136
|
+
/** The largest answer React Native's own https request may get (bytes, default 50 MiB, at most 256 MiB). */
|
|
137
|
+
reactNativeMaxResponseBytes?: number;
|
|
138
|
+
};
|
|
139
|
+
};
|
|
140
|
+
/** A native exception: its class name (`SSLPinningException`, …) and message. */
|
|
141
|
+
export type NativeException = {
|
|
142
|
+
name: string;
|
|
143
|
+
message: string | null;
|
|
144
|
+
};
|
|
145
|
+
export type InitResult = {
|
|
146
|
+
type: 'ready';
|
|
147
|
+
version: number;
|
|
148
|
+
} | {
|
|
149
|
+
type: 'failed';
|
|
150
|
+
reason: string;
|
|
151
|
+
exception: NativeException | null;
|
|
152
|
+
};
|
|
153
|
+
export type UpdateResult = {
|
|
154
|
+
type: 'updated';
|
|
155
|
+
newVersion: number;
|
|
156
|
+
} | {
|
|
157
|
+
type: 'alreadyCurrent';
|
|
158
|
+
} | {
|
|
159
|
+
type: 'failed';
|
|
160
|
+
reason: string;
|
|
161
|
+
exception: NativeException | null;
|
|
162
|
+
};
|
|
163
|
+
export type KeySecurityLevel = 'STRONGBOX' | 'TRUSTED_ENVIRONMENT' | 'SOFTWARE' | 'UNKNOWN' | 'SECURE_ENCLAVE';
|
|
164
|
+
export type EnrollmentRefusal = 'INVALID_TOKEN' | 'TOKEN_REQUIRED' | 'DEVICE_ALREADY_ENROLLED' | 'REVOKED' | 'REJECTED' | 'LIMIT_REACHED' | 'EXPIRED' | 'ATTESTATION_FAILED' | 'CSR_REQUIRED' | 'OTHER';
|
|
165
|
+
export type ClientCertEnrollmentResult = {
|
|
166
|
+
type: 'enrolled';
|
|
167
|
+
alreadyEnrolled: boolean;
|
|
168
|
+
keySecurityLevel: KeySecurityLevel | null;
|
|
169
|
+
} | {
|
|
170
|
+
type: 'refused';
|
|
171
|
+
reason: EnrollmentRefusal;
|
|
172
|
+
httpStatus: number;
|
|
173
|
+
serverError: string | null;
|
|
174
|
+
message: string | null;
|
|
175
|
+
} | {
|
|
176
|
+
type: 'pending';
|
|
177
|
+
requestId: string;
|
|
178
|
+
clientId: string | null;
|
|
179
|
+
message: string | null;
|
|
180
|
+
retryAfterSeconds: number | null;
|
|
181
|
+
verificationCode: string | null;
|
|
182
|
+
} | {
|
|
183
|
+
type: 'failed';
|
|
184
|
+
message: string;
|
|
185
|
+
cause: NativeException | null;
|
|
186
|
+
};
|
|
187
|
+
/**
|
|
188
|
+
* `VaultFileResult`. `updated` carries no content: read it with `loadFile(key)`
|
|
189
|
+
* (or `unlockFile` for files behind the screen lock).
|
|
190
|
+
*/
|
|
191
|
+
export type VaultFileResult = {
|
|
192
|
+
type: 'updated';
|
|
193
|
+
key: string;
|
|
194
|
+
version: number;
|
|
195
|
+
} | {
|
|
196
|
+
type: 'alreadyCurrent';
|
|
197
|
+
key: string;
|
|
198
|
+
version: number;
|
|
199
|
+
} | {
|
|
200
|
+
type: 'failed';
|
|
201
|
+
key: string;
|
|
202
|
+
reason: string;
|
|
203
|
+
code: string;
|
|
204
|
+
exception: NativeException | null;
|
|
205
|
+
};
|
|
206
|
+
export type VaultFileStatus = 'AVAILABLE' | 'LOCKED' | 'NOT_STORED' | 'STALE' | 'NEEDS_FETCH' | 'INTEGRITY_FAILED' | 'STORAGE_UNAVAILABLE';
|
|
207
|
+
export type ContentEncoding = 'utf8' | 'base64';
|
|
208
|
+
export type VaultFileUnlockPrompt = {
|
|
209
|
+
title: string;
|
|
210
|
+
subtitle?: string;
|
|
211
|
+
description?: string;
|
|
212
|
+
negativeButtonText?: string;
|
|
213
|
+
};
|
|
214
|
+
export type VaultFileUnlockResult = {
|
|
215
|
+
type: 'unlocked';
|
|
216
|
+
key: string;
|
|
217
|
+
version: number;
|
|
218
|
+
content: string;
|
|
219
|
+
encoding: ContentEncoding;
|
|
220
|
+
} | {
|
|
221
|
+
type: 'notFound';
|
|
222
|
+
key: string;
|
|
223
|
+
} | {
|
|
224
|
+
type: 'cancelled';
|
|
225
|
+
key: string;
|
|
226
|
+
} | {
|
|
227
|
+
type: 'invalidated';
|
|
228
|
+
key: string;
|
|
229
|
+
} | {
|
|
230
|
+
type: 'stale';
|
|
231
|
+
key: string;
|
|
232
|
+
} | {
|
|
233
|
+
type: 'failed';
|
|
234
|
+
key: string;
|
|
235
|
+
reason: string;
|
|
236
|
+
exception: NativeException | null;
|
|
237
|
+
};
|
|
238
|
+
export type AttestationResult = 'PASS' | 'REJECT' | 'FAILED' | 'NOT_ATTESTED' | 'UNSUPPORTED';
|
|
239
|
+
export type AttestationStatus = {
|
|
240
|
+
configApiId: string;
|
|
241
|
+
result: AttestationResult;
|
|
242
|
+
arc: string | null;
|
|
243
|
+
rejectionReasons: string[];
|
|
244
|
+
warnings: string[];
|
|
245
|
+
tokenExpiresAt: number | null;
|
|
246
|
+
lastAttestedAt: number | null;
|
|
247
|
+
nextAttestAt: number | null;
|
|
248
|
+
clockSkewMs: number | null;
|
|
249
|
+
lastError: string | null;
|
|
250
|
+
policyVersion: number | null;
|
|
251
|
+
};
|
|
252
|
+
/** `PinVault-Token` for your own HTTP client. The value is a bearer credential: never log it. */
|
|
253
|
+
export type AttestationTokenResult = {
|
|
254
|
+
type: 'token';
|
|
255
|
+
value: string;
|
|
256
|
+
expiresAt: number;
|
|
257
|
+
} | {
|
|
258
|
+
type: 'rejected';
|
|
259
|
+
status: AttestationStatus;
|
|
260
|
+
} | {
|
|
261
|
+
type: 'failed';
|
|
262
|
+
message: string;
|
|
263
|
+
} | {
|
|
264
|
+
type: 'unsupported';
|
|
265
|
+
};
|
|
266
|
+
export type SigningStatus = {
|
|
267
|
+
configApiId: string;
|
|
268
|
+
trustedKeyIds: string[];
|
|
269
|
+
requiredSignatures: number;
|
|
270
|
+
keySetVersion: number;
|
|
271
|
+
recoveryKeyIds: string[];
|
|
272
|
+
lastConfigSignedBy: string[];
|
|
273
|
+
};
|
|
274
|
+
/** `PinVaultConnectionEvent`. Never carries a token, a password or file content. */
|
|
275
|
+
export type PinVaultConnectionEvent = {
|
|
276
|
+
type: 'connection';
|
|
277
|
+
hostname: string;
|
|
278
|
+
success: boolean;
|
|
279
|
+
pinVersion: number;
|
|
280
|
+
deviceManufacturer: string;
|
|
281
|
+
deviceModel: string;
|
|
282
|
+
actualPin: string;
|
|
283
|
+
expectedPins: string[];
|
|
284
|
+
} | {
|
|
285
|
+
type: 'configUpdate';
|
|
286
|
+
status: 'UPDATED' | 'UNCHANGED' | 'FAILED';
|
|
287
|
+
newVersion: number;
|
|
288
|
+
deviceManufacturer: string;
|
|
289
|
+
deviceModel: string;
|
|
290
|
+
failureReason: string | null;
|
|
291
|
+
} | {
|
|
292
|
+
type: 'clientCertRenewal';
|
|
293
|
+
status: 'RENEWED' | 'NOT_NEEDED' | 'REENROLL_REQUIRED' | 'FAILED';
|
|
294
|
+
notAfterEpochMs: number;
|
|
295
|
+
via: string | null;
|
|
296
|
+
configApiId: string;
|
|
297
|
+
deviceManufacturer: string;
|
|
298
|
+
deviceModel: string;
|
|
299
|
+
failureReason: string | null;
|
|
300
|
+
} | {
|
|
301
|
+
type: 'attestation';
|
|
302
|
+
configApiId: string;
|
|
303
|
+
status: 'PASS' | 'REJECT' | 'FAILED';
|
|
304
|
+
arc: string | null;
|
|
305
|
+
rejectionReasons: string[];
|
|
306
|
+
warnings: string[];
|
|
307
|
+
tokenExpiresAt: number | null;
|
|
308
|
+
deviceManufacturer: string;
|
|
309
|
+
deviceModel: string;
|
|
310
|
+
failureReason: string | null;
|
|
311
|
+
};
|
|
312
|
+
export type HttpMethod = 'GET' | 'HEAD' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'OPTIONS';
|
|
313
|
+
/**
|
|
314
|
+
* `HttpConnectionSettings` (seconds). With settings the request uses
|
|
315
|
+
* `getClient(settings)` / `session(settings:)`: pinning without pin-mismatch recovery.
|
|
316
|
+
*/
|
|
317
|
+
export type HttpConnectionSettings = {
|
|
318
|
+
connectTimeout?: number;
|
|
319
|
+
readTimeout?: number;
|
|
320
|
+
writeTimeout?: number;
|
|
321
|
+
callTimeout?: number;
|
|
322
|
+
};
|
|
323
|
+
export type PinVaultRequestInit = {
|
|
324
|
+
method?: HttpMethod;
|
|
325
|
+
headers?: Record<string, string>;
|
|
326
|
+
/** Request body: text, or Base64 with `bodyEncoding: 'base64'`. At most 10 MiB. */
|
|
327
|
+
body?: string;
|
|
328
|
+
bodyEncoding?: ContentEncoding;
|
|
329
|
+
/** How the response body comes back (default `utf8`). */
|
|
330
|
+
responseEncoding?: ContentEncoding;
|
|
331
|
+
/** Whole-call timeout in ms (default: the client's). */
|
|
332
|
+
timeoutMs?: number;
|
|
333
|
+
/** Larger responses are refused (default 10 MiB, at most 50 MiB). */
|
|
334
|
+
maxResponseBytes?: number;
|
|
335
|
+
settings?: HttpConnectionSettings;
|
|
336
|
+
};
|
|
337
|
+
export type PinVaultResponse = {
|
|
338
|
+
status: number;
|
|
339
|
+
url: string;
|
|
340
|
+
/** Lower-case names; repeated headers joined with `, `. */
|
|
341
|
+
headers: Record<string, string>;
|
|
342
|
+
body: string;
|
|
343
|
+
bodyEncoding: ContentEncoding;
|
|
344
|
+
ok: boolean;
|
|
345
|
+
};
|
|
346
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,130 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@umutcansu/react-native-pinvault",
|
|
3
|
-
"version": "
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "2.3.2",
|
|
4
|
+
"description": "PinVault for React Native: dynamic certificate pinning with signed remote configs, mTLS enrollment and signed vault files, as a thin bridge over the native PinVault libraries",
|
|
5
|
+
"main": "./lib/module/index.js",
|
|
6
|
+
"types": "./lib/typescript/src/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"pinvault-source": "./src/index.ts",
|
|
10
|
+
"types": "./lib/typescript/src/index.d.ts",
|
|
11
|
+
"default": "./lib/module/index.js"
|
|
12
|
+
},
|
|
13
|
+
"./package.json": "./package.json"
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"src",
|
|
17
|
+
"lib",
|
|
18
|
+
"android/build.gradle",
|
|
19
|
+
"android/consumer-rules.pro",
|
|
20
|
+
"android/src/main",
|
|
21
|
+
"ios/*.h",
|
|
22
|
+
"ios/*.mm",
|
|
23
|
+
"ios/*.swift",
|
|
24
|
+
"ios/Core",
|
|
25
|
+
"*.podspec",
|
|
26
|
+
"README.md",
|
|
27
|
+
"CHANGELOG.md",
|
|
28
|
+
"LICENSE",
|
|
29
|
+
"!**/__tests__",
|
|
30
|
+
"!**/__mocks__",
|
|
31
|
+
"!**/.*"
|
|
32
|
+
],
|
|
33
|
+
"scripts": {
|
|
34
|
+
"prepare": "bob build",
|
|
35
|
+
"typecheck": "tsc --noEmit",
|
|
36
|
+
"test": "jest",
|
|
37
|
+
"clean": "rm -rf lib android/build"
|
|
38
|
+
},
|
|
39
|
+
"keywords": [
|
|
40
|
+
"react-native",
|
|
41
|
+
"certificate-pinning",
|
|
42
|
+
"ssl-pinning",
|
|
43
|
+
"mtls",
|
|
44
|
+
"security",
|
|
45
|
+
"ios",
|
|
46
|
+
"android"
|
|
47
|
+
],
|
|
48
|
+
"repository": {
|
|
49
|
+
"type": "git",
|
|
50
|
+
"url": "git+https://github.com/umutcansu/PinVault.git",
|
|
51
|
+
"directory": "pinvault-react-native"
|
|
52
|
+
},
|
|
53
|
+
"author": "Umut Cansu <umutcansu@gmail.com> (https://github.com/umutcansu)",
|
|
54
|
+
"license": "MIT",
|
|
55
|
+
"bugs": {
|
|
56
|
+
"url": "https://github.com/umutcansu/PinVault/issues"
|
|
57
|
+
},
|
|
58
|
+
"homepage": "https://github.com/umutcansu/PinVault/tree/main/pinvault-react-native#readme",
|
|
59
|
+
"publishConfig": {
|
|
60
|
+
"registry": "https://registry.npmjs.org/",
|
|
61
|
+
"access": "public"
|
|
62
|
+
},
|
|
63
|
+
"peerDependencies": {
|
|
64
|
+
"react": "*",
|
|
65
|
+
"react-native": ">=0.87.0"
|
|
66
|
+
},
|
|
67
|
+
"devDependencies": {
|
|
68
|
+
"@jest/globals": "^29.7.0",
|
|
69
|
+
"@react-native/babel-preset": "0.87.1",
|
|
70
|
+
"@react-native/jest-preset": "0.87.1",
|
|
71
|
+
"@types/jest": "^29.5.14",
|
|
72
|
+
"@types/react": "^19.2.0",
|
|
73
|
+
"jest": "^29.7.0",
|
|
74
|
+
"react": "19.2.3",
|
|
75
|
+
"react-native": "0.87.1",
|
|
76
|
+
"react-native-builder-bob": "^0.43.1",
|
|
77
|
+
"typescript": "^6.0.3"
|
|
78
|
+
},
|
|
79
|
+
"react-native-builder-bob": {
|
|
80
|
+
"source": "src",
|
|
81
|
+
"output": "lib",
|
|
82
|
+
"targets": [
|
|
83
|
+
[
|
|
84
|
+
"module",
|
|
85
|
+
{
|
|
86
|
+
"esm": true
|
|
87
|
+
}
|
|
88
|
+
],
|
|
89
|
+
[
|
|
90
|
+
"typescript",
|
|
91
|
+
{
|
|
92
|
+
"project": "tsconfig.build.json"
|
|
93
|
+
}
|
|
94
|
+
]
|
|
95
|
+
]
|
|
96
|
+
},
|
|
97
|
+
"codegenConfig": {
|
|
98
|
+
"name": "RNPinVaultSpec",
|
|
99
|
+
"type": "modules",
|
|
100
|
+
"jsSrcsDir": "src",
|
|
101
|
+
"android": {
|
|
102
|
+
"javaPackageName": "io.github.umutcansu.pinvault.reactnative"
|
|
103
|
+
},
|
|
104
|
+
"ios": {
|
|
105
|
+
"modules": {
|
|
106
|
+
"RNPinVault": {
|
|
107
|
+
"className": "RNPinVault"
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
"modulesConformingToProtocol": {
|
|
111
|
+
"RCTURLRequestHandler": [
|
|
112
|
+
"RNPinVaultURLRequestHandler"
|
|
113
|
+
]
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
"jest": {
|
|
118
|
+
"preset": "@react-native/jest-preset",
|
|
119
|
+
"testEnvironmentOptions": {
|
|
120
|
+
"customExportConditions": [
|
|
121
|
+
"require",
|
|
122
|
+
"react-native",
|
|
123
|
+
"pinvault-source"
|
|
124
|
+
]
|
|
125
|
+
},
|
|
126
|
+
"modulePathIgnorePatterns": [
|
|
127
|
+
"<rootDir>/lib/"
|
|
128
|
+
]
|
|
129
|
+
}
|
|
130
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// TurboModule codegen spec (New Architecture only).
|
|
2
|
+
//
|
|
3
|
+
// The native side is a thin bridge over the PinVault libraries
|
|
4
|
+
// (Android: io.github.umutcansu:pinvault, iOS: the PinVault Swift package).
|
|
5
|
+
// Every structured input crosses as a JSON string and is parsed STRICTLY on the
|
|
6
|
+
// native side (unknown keys and wrong types are refused, sizes are bounded);
|
|
7
|
+
// results come back as plain objects that keep the native names. Use the typed
|
|
8
|
+
// wrappers in `index.ts`, not this module directly.
|
|
9
|
+
import { TurboModuleRegistry, type TurboModule, type CodegenTypes } from 'react-native';
|
|
10
|
+
|
|
11
|
+
export type GuardRequest = {
|
|
12
|
+
requestId: string;
|
|
13
|
+
operation: string;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export interface Spec extends TurboModule {
|
|
17
|
+
// ── Start / config ────────────────────────────────────────────────────────
|
|
18
|
+
start(configJson: string): Promise<CodegenTypes.UnsafeObject>;
|
|
19
|
+
updateNow(): Promise<CodegenTypes.UnsafeObject>;
|
|
20
|
+
currentVersion(): Promise<number>;
|
|
21
|
+
hostPinVersions(): Promise<CodegenTypes.UnsafeObject>;
|
|
22
|
+
pinsForHost(hostname: string): Promise<CodegenTypes.UnsafeObject>;
|
|
23
|
+
signingStatus(configApiId: string | null): Promise<CodegenTypes.UnsafeObject>;
|
|
24
|
+
isForceUpdate(): Promise<boolean>;
|
|
25
|
+
reset(): Promise<void>;
|
|
26
|
+
schedulePeriodicUpdates(intervalHours: number | null): Promise<boolean>;
|
|
27
|
+
cancelPeriodicUpdates(): Promise<void>;
|
|
28
|
+
enableDebugLogging(): Promise<boolean>;
|
|
29
|
+
|
|
30
|
+
// ── Pinned HTTP ───────────────────────────────────────────────────────────
|
|
31
|
+
fetch(requestJson: string): Promise<CodegenTypes.UnsafeObject>;
|
|
32
|
+
|
|
33
|
+
// ── Enrollment ────────────────────────────────────────────────────────────
|
|
34
|
+
deviceId(): Promise<string | null>;
|
|
35
|
+
enrollForResult(token: string, label: string | null): Promise<CodegenTypes.UnsafeObject>;
|
|
36
|
+
autoEnrollForResult(): Promise<CodegenTypes.UnsafeObject>;
|
|
37
|
+
checkPendingEnrollment(): Promise<CodegenTypes.UnsafeObject>;
|
|
38
|
+
isEnrolled(label: string | null): Promise<boolean>;
|
|
39
|
+
isEnrollmentPending(label: string | null): Promise<boolean>;
|
|
40
|
+
enrollmentVerificationCode(label: string | null): Promise<string | null>;
|
|
41
|
+
enrolledClientCN(label: string | null): Promise<string | null>;
|
|
42
|
+
enrolledClientNotAfter(label: string | null): Promise<number | null>;
|
|
43
|
+
unenroll(label: string | null, wipeVaultFiles: boolean): Promise<void>;
|
|
44
|
+
identityKeySecurityLevel(label: string | null): Promise<string | null>;
|
|
45
|
+
|
|
46
|
+
// ── Vault files ───────────────────────────────────────────────────────────
|
|
47
|
+
setVaultToken(key: string, token: string | null): Promise<void>;
|
|
48
|
+
clearVaultTokens(): Promise<number>;
|
|
49
|
+
fetchFile(key: string, token: string | null): Promise<CodegenTypes.UnsafeObject>;
|
|
50
|
+
loadFile(key: string, encoding: string): Promise<string | null>;
|
|
51
|
+
fileStatus(key: string): Promise<string>;
|
|
52
|
+
unlockFile(key: string, promptJson: string): Promise<CodegenTypes.UnsafeObject>;
|
|
53
|
+
isFileLocked(key: string): Promise<boolean>;
|
|
54
|
+
hasFile(key: string): Promise<boolean>;
|
|
55
|
+
fileVersion(key: string): Promise<number>;
|
|
56
|
+
clearFile(key: string): Promise<void>;
|
|
57
|
+
syncAllFiles(): Promise<CodegenTypes.UnsafeObject>;
|
|
58
|
+
|
|
59
|
+
// ── Attestation ───────────────────────────────────────────────────────────
|
|
60
|
+
attestNow(configApiId: string | null): Promise<CodegenTypes.UnsafeObject>;
|
|
61
|
+
fetchAttestationToken(host: string | null): Promise<CodegenTypes.UnsafeObject>;
|
|
62
|
+
attestationStatus(configApiId: string | null): Promise<CodegenTypes.UnsafeObject>;
|
|
63
|
+
|
|
64
|
+
// ── environmentGuard answers (JS → native) ────────────────────────────────
|
|
65
|
+
answerGuard(requestId: string, allowed: boolean): void;
|
|
66
|
+
|
|
67
|
+
// ── Events ────────────────────────────────────────────────────────────────
|
|
68
|
+
readonly onConnectionEvent: CodegenTypes.EventEmitter<CodegenTypes.UnsafeObject>;
|
|
69
|
+
readonly onGuardRequest: CodegenTypes.EventEmitter<GuardRequest>;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export default TurboModuleRegistry.getEnforcing<Spec>('RNPinVault');
|