expo-secure-keypad-jsi 0.1.0 → 0.1.1
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
CHANGED
|
@@ -38,13 +38,13 @@ and what to use instead.
|
|
|
38
38
|
|
|
39
39
|
## Requirements
|
|
40
40
|
|
|
41
|
-
- Expo SDK
|
|
41
|
+
- Expo SDK 54+, React Native 0.81+, New Architecture only
|
|
42
42
|
- A development build (`expo run:*`) or an EAS build, because the module ships
|
|
43
43
|
native code. Expo Go's prebuilt binary does not contain it, and an OTA update
|
|
44
44
|
replaces only JS, so it cannot add a native module either. Once the module is
|
|
45
45
|
in a build, later JS-only changes can still ship over OTA
|
|
46
|
-
- iOS
|
|
47
|
-
- Android 7.0 (API 24)+ — the Expo SDK
|
|
46
|
+
- iOS 15.1+
|
|
47
|
+
- Android 7.0 (API 24)+ — the Expo SDK default; the module adds no floor of
|
|
48
48
|
its own. Ships `arm64-v8a`, `armeabi-v7a`, `x86`, `x86_64`
|
|
49
49
|
|
|
50
50
|
## Installation
|
|
@@ -99,8 +99,11 @@ export function PinScreen({ serverPublicKeyPem }: { serverPublicKeyPem: string }
|
|
|
99
99
|
|
|
100
100
|
**This keypad does not support screen readers on either platform, and there is
|
|
101
101
|
no option to enable it.** The keys are canvas glyphs with no child views, so no
|
|
102
|
-
key is ever an accessibility node
|
|
103
|
-
|
|
102
|
+
key is ever an accessibility node and no digit or character is ever exposed as
|
|
103
|
+
text. On Android the container is also marked not important for accessibility
|
|
104
|
+
and excluded from autofill, so screen readers skip it; a service that requests
|
|
105
|
+
`FLAG_INCLUDE_NOT_IMPORTANT_VIEWS` still sees the keypad as one text-less node
|
|
106
|
+
(its position and size only).
|
|
104
107
|
|
|
105
108
|
The reason is that an Android `AccessibilityService` can read the node tree and
|
|
106
109
|
input events of other apps — the standard keylogging route — and an app cannot
|
|
@@ -336,7 +339,7 @@ Dirty pages: 0x102b64000.
|
|
|
336
339
|
|---|---|---|
|
|
337
340
|
| JS heap dump, Hermes snapshot | Yes | The value never enters the JS VM |
|
|
338
341
|
| Bridge / JSI traffic sniffing | Yes | Key mapping and the value exist only in native code |
|
|
339
|
-
| Layout Inspector, accessibility tree scraping | Yes | Glyphs are drawn directly; there are no text nodes
|
|
342
|
+
| Layout Inspector, accessibility tree scraping | Yes | Glyphs are drawn directly; there are no text nodes. A service that asks for not-important views sees only a text-less keypad node (position and size) |
|
|
340
343
|
| Userland memory scan | Mostly | cleanse always, mlock when it succeeds. The value lives for microseconds. Transient copies inside libcrypto do exist |
|
|
341
344
|
| Swap leakage | Conditional (Android) | mlock + MADV_DONTDUMP. On devices with a small `RLIMIT_MEMLOCK` mlock fails silently and only cleanse remains. iOS compresses RAM instead of swapping |
|
|
342
345
|
| Ciphertext replay | Yes (with server support) | The server verifies nonce + timestamp |
|
package/SecureKeypadJsi.podspec
CHANGED
|
@@ -15,7 +15,7 @@ Pod::Spec.new do |s|
|
|
|
15
15
|
s.license = package['license']
|
|
16
16
|
s.author = package['author']
|
|
17
17
|
s.homepage = package['homepage']
|
|
18
|
-
s.platforms = { :ios => '
|
|
18
|
+
s.platforms = { :ios => '15.1' }
|
|
19
19
|
s.swift_version = '5.9'
|
|
20
20
|
s.source = { git: 'https://github.com/0610studio/expo-secure-keypad-jsi' }
|
|
21
21
|
s.static_framework = true
|
|
@@ -295,9 +295,8 @@ class SecureKeypadJsiView(context: Context, appContext: AppContext) :
|
|
|
295
295
|
|
|
296
296
|
private fun applyAccessibilityHardening() {
|
|
297
297
|
// Unconditional. The keys are canvas glyphs with no child nodes, so a11y
|
|
298
|
-
// services could never read them anyway;
|
|
299
|
-
//
|
|
300
|
-
// The keypad is not screen-reader usable by design — see README.
|
|
298
|
+
// services could never read them anyway; this keeps screen readers off the
|
|
299
|
+
// container too. The keypad is not screen-reader usable by design — see README.
|
|
301
300
|
importantForAccessibility = IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS
|
|
302
301
|
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
|
|
303
302
|
importantForAutofill = IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS
|
package/docs/README.ko.md
CHANGED
|
@@ -29,7 +29,7 @@ RSA-OAEP 암호화되어 **암호문만** JS로 전달됩니다.
|
|
|
29
29
|
|
|
30
30
|
## 요구 사항
|
|
31
31
|
|
|
32
|
-
Expo SDK
|
|
32
|
+
Expo SDK 54+, React Native 0.81+, New Architecture 전용
|
|
33
33
|
|
|
34
34
|
## 설치
|
|
35
35
|
|
|
@@ -268,7 +268,7 @@ Dirty pages: 0x102b64000.
|
|
|
268
268
|
|---|---|---|
|
|
269
269
|
| JS 힙 덤프, Hermes 스냅샷 | O | 입력값이 JS VM에 진입하지 않음 |
|
|
270
270
|
| 브릿지·JSI 트래픽 스니핑 | O | 키 매핑과 입력값이 네이티브에만 존재 |
|
|
271
|
-
| Layout Inspector, 접근성 트리 스크래핑 | O | 글리프 직접 렌더, 텍스트 노드 없음.
|
|
271
|
+
| Layout Inspector, 접근성 트리 스크래핑 | O | 글리프 직접 렌더, 텍스트 노드 없음. 중요하지 않은 뷰까지 요청하는 서비스에는 텍스트 없는 키패드 노드(위치·크기)만 보임 |
|
|
272
272
|
| 유저랜드 메모리 스캔 | 대체로 O | cleanse는 항상, mlock은 성공 시. 입력값 수명 마이크로초. libcrypto 내부 일시 사본은 존재 |
|
|
273
273
|
| 스왑 누출 | 조건부 O (Android) | mlock + MADV_DONTDUMP. `RLIMIT_MEMLOCK`이 작은 기기에서 mlock이 실패하면 조용히 cleanse만 남음. iOS는 RAM 압축이라 해당 없음 |
|
|
274
274
|
| 암호문 재전송 | O (서버 협조 시) | nonce + timestamp를 서버가 검증 |
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "expo-secure-keypad-jsi",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Secure PIN / password keypad for Expo (New Architecture). Natively rendered shuffled keys, the entered value never enters the JS runtime, mlock'd C++ buffer, OpenSSL RSA-OAEP ciphertext only. Screen-capture blocking and device integrity are the host app's job.",
|
|
5
5
|
"main": "build/index.js",
|
|
6
6
|
"types": "build/index.d.ts",
|
|
@@ -73,8 +73,8 @@
|
|
|
73
73
|
}
|
|
74
74
|
},
|
|
75
75
|
"peerDependencies": {
|
|
76
|
-
"expo": ">=
|
|
76
|
+
"expo": ">=54.0.0",
|
|
77
77
|
"react": ">=19.0.0",
|
|
78
|
-
"react-native": ">=0.
|
|
78
|
+
"react-native": ">=0.81.0"
|
|
79
79
|
}
|
|
80
80
|
}
|