@onekeyfe/react-native-lite-card 0.1.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.
Files changed (95) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +37 -0
  3. package/ReactNativeLiteCard.podspec +22 -0
  4. package/android/build.gradle +79 -0
  5. package/android/gradle.properties +5 -0
  6. package/android/src/main/AndroidManifest.xml +2 -0
  7. package/android/src/main/config/command.json +205 -0
  8. package/android/src/main/cpp/CMakeLists.txt +19 -0
  9. package/android/src/main/cpp/validation.c +227 -0
  10. package/android/src/main/cpp/validation.h +19 -0
  11. package/android/src/main/java/com/onekeyfe/reactnativelitecard/LoggerManager.kt +35 -0
  12. package/android/src/main/java/com/onekeyfe/reactnativelitecard/ReactNativeLiteCardModule.kt +420 -0
  13. package/android/src/main/java/com/onekeyfe/reactnativelitecard/ReactNativeLiteCardPackage.kt +33 -0
  14. package/android/src/main/java/com/onekeyfe/reactnativelitecard/keys/KeysNativeProvider.kt +13 -0
  15. package/android/src/main/java/com/onekeyfe/reactnativelitecard/nfc/Exceptions.kt +58 -0
  16. package/android/src/main/java/com/onekeyfe/reactnativelitecard/nfc/NfcUtils.kt +142 -0
  17. package/android/src/main/java/com/onekeyfe/reactnativelitecard/nfc/broadcast/NfcStatusChangeBroadcastReceiver.kt +56 -0
  18. package/android/src/main/java/com/onekeyfe/reactnativelitecard/nfc/gpchannel/GPChannelNatives.kt +32 -0
  19. package/android/src/main/java/com/onekeyfe/reactnativelitecard/onekeyLite/NfcConstant.kt +38 -0
  20. package/android/src/main/java/com/onekeyfe/reactnativelitecard/onekeyLite/OnekeyLiteCard.kt +236 -0
  21. package/android/src/main/java/com/onekeyfe/reactnativelitecard/onekeyLite/entitys/APDUParam.kt +17 -0
  22. package/android/src/main/java/com/onekeyfe/reactnativelitecard/onekeyLite/entitys/CardInfo.java +84 -0
  23. package/android/src/main/java/com/onekeyfe/reactnativelitecard/onekeyLite/entitys/CardResponse.java +37 -0
  24. package/android/src/main/java/com/onekeyfe/reactnativelitecard/onekeyLite/entitys/CardState.kt +10 -0
  25. package/android/src/main/java/com/onekeyfe/reactnativelitecard/onekeyLite/entitys/ParsedCertInfo.java +39 -0
  26. package/android/src/main/java/com/onekeyfe/reactnativelitecard/onekeyLite/entitys/SecureChanelParam.java +113 -0
  27. package/android/src/main/java/com/onekeyfe/reactnativelitecard/onekeyLite/entitys/SendResponse.kt +26 -0
  28. package/android/src/main/java/com/onekeyfe/reactnativelitecard/onekeyLite/nfc/CommandGenerator.kt +178 -0
  29. package/android/src/main/java/com/onekeyfe/reactnativelitecard/onekeyLite/nfc/Connection.kt +439 -0
  30. package/android/src/main/java/com/onekeyfe/reactnativelitecard/onekeyLite/nfc/GPCAPDUGenerator.kt +56 -0
  31. package/android/src/main/java/com/onekeyfe/reactnativelitecard/utils/EventUtils.kt +14 -0
  32. package/android/src/main/java/com/onekeyfe/reactnativelitecard/utils/GpsUtil.kt +38 -0
  33. package/android/src/main/java/com/onekeyfe/reactnativelitecard/utils/HexUtils.java +93 -0
  34. package/android/src/main/java/com/onekeyfe/reactnativelitecard/utils/LogUtil.kt +11 -0
  35. package/android/src/main/java/com/onekeyfe/reactnativelitecard/utils/MiUtil.kt +93 -0
  36. package/android/src/main/java/com/onekeyfe/reactnativelitecard/utils/NfcPermissionUtils.kt +24 -0
  37. package/android/src/main/java/com/onekeyfe/reactnativelitecard/utils/Utils.java +437 -0
  38. package/android/src/main/jniLibs/arm64-v8a/libgpchannelNDK.so +0 -0
  39. package/android/src/main/jniLibs/armeabi-v7a/libgpchannelNDK.so +0 -0
  40. package/ios/Classes/OKLiteCommand/OKLiteCommandModal.h +39 -0
  41. package/ios/Classes/OKLiteCommand/OKLiteCommandModal.m +143 -0
  42. package/ios/Classes/OKLiteCommand/OKLiteCommandTool.h +28 -0
  43. package/ios/Classes/OKLiteCommand/OKLiteCommandTool.m +53 -0
  44. package/ios/Classes/OKNFCBridge.h +28 -0
  45. package/ios/Classes/OKNFCBridge.mm +221 -0
  46. package/ios/Classes/OKNFCLiteDefine.h +108 -0
  47. package/ios/Classes/OKNFTLite/OKLiteProtocol.h +37 -0
  48. package/ios/Classes/OKNFTLite/OKLiteV1.h +41 -0
  49. package/ios/Classes/OKNFTLite/OKLiteV1.m +609 -0
  50. package/ios/Classes/OKNFTLite/OKLiteV2.h +17 -0
  51. package/ios/Classes/OKNFTLite/OKLiteV2.m +132 -0
  52. package/ios/Classes/OKNFTLite/OKNFCManager.h +40 -0
  53. package/ios/Classes/OKNFTLite/OKNFCManager.m +330 -0
  54. package/ios/Classes/Utils/NFCConfig.h +19 -0
  55. package/ios/Classes/Utils/NFCConfig.m +18 -0
  56. package/ios/Classes/Utils/NSData+OKNFCHexData.h +17 -0
  57. package/ios/Classes/Utils/NSData+OKNFCHexData.m +24 -0
  58. package/ios/Classes/Utils/NSData+StringToData.h +12 -0
  59. package/ios/Classes/Utils/NSData+StringToData.m +25 -0
  60. package/ios/Classes/Utils/NSString+OKAdd.h +14 -0
  61. package/ios/Classes/Utils/NSString+OKAdd.m +40 -0
  62. package/ios/Classes/Utils/NSString+OKNFCHexStr.h +18 -0
  63. package/ios/Classes/Utils/NSString+OKNFCHexStr.m +38 -0
  64. package/ios/Classes/Utils/OKNFCUtility.h +18 -0
  65. package/ios/Classes/Utils/OKNFCUtility.m +22 -0
  66. package/ios/Classes/Utils/OKTools.h +17 -0
  67. package/ios/Classes/Utils/OKTools.m +21 -0
  68. package/ios/GPChannelSDKCore.xcframework/Info.plist +52 -0
  69. package/ios/GPChannelSDKCore.xcframework/ios-arm64/GPChannelSDKCore.framework/GPChannelSDKCore +0 -0
  70. package/ios/GPChannelSDKCore.xcframework/ios-arm64/GPChannelSDKCore.framework/Headers/GPChannelSDK.h +315 -0
  71. package/ios/GPChannelSDKCore.xcframework/ios-arm64/GPChannelSDKCore.framework/Headers/GPChannelSDKCore.h +19 -0
  72. package/ios/GPChannelSDKCore.xcframework/ios-arm64/GPChannelSDKCore.framework/Info.plist +0 -0
  73. package/ios/GPChannelSDKCore.xcframework/ios-arm64/GPChannelSDKCore.framework/Modules/module.modulemap +7 -0
  74. package/ios/GPChannelSDKCore.xcframework/ios-arm64/GPChannelSDKCore.framework/_CodeSignature/CodeResources +147 -0
  75. package/ios/GPChannelSDKCore.xcframework/ios-arm64_x86_64-simulator/GPChannelSDKCore.framework/GPChannelSDKCore +0 -0
  76. package/ios/GPChannelSDKCore.xcframework/ios-arm64_x86_64-simulator/GPChannelSDKCore.framework/Headers/GPChannelSDK.h +315 -0
  77. package/ios/GPChannelSDKCore.xcframework/ios-arm64_x86_64-simulator/GPChannelSDKCore.framework/Headers/GPChannelSDKCore.h +19 -0
  78. package/ios/GPChannelSDKCore.xcframework/ios-arm64_x86_64-simulator/GPChannelSDKCore.framework/Info.plist +0 -0
  79. package/ios/GPChannelSDKCore.xcframework/ios-arm64_x86_64-simulator/GPChannelSDKCore.framework/Modules/module.modulemap +7 -0
  80. package/ios/GPChannelSDKCore.xcframework/ios-arm64_x86_64-simulator/GPChannelSDKCore.framework/_CodeSignature/CodeResources +147 -0
  81. package/ios/ReactNativeLiteCard.h +5 -0
  82. package/ios/ReactNativeLiteCard.mm +222 -0
  83. package/lib/module/NativeReactNativeLiteCard.js +25 -0
  84. package/lib/module/NativeReactNativeLiteCard.js.map +1 -0
  85. package/lib/module/index.js +71 -0
  86. package/lib/module/index.js.map +1 -0
  87. package/lib/module/package.json +1 -0
  88. package/lib/typescript/package.json +1 -0
  89. package/lib/typescript/src/NativeReactNativeLiteCard.d.ts +59 -0
  90. package/lib/typescript/src/NativeReactNativeLiteCard.d.ts.map +1 -0
  91. package/lib/typescript/src/index.d.ts +23 -0
  92. package/lib/typescript/src/index.d.ts.map +1 -0
  93. package/package.json +168 -0
  94. package/src/NativeReactNativeLiteCard.ts +112 -0
  95. package/src/index.tsx +94 -0
package/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 @onekeyfe
4
+ Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ of this software and associated documentation files (the "Software"), to deal
6
+ in the Software without restriction, including without limitation the rights
7
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ copies of the Software, and to permit persons to whom the Software is
9
+ furnished to do so, subject to the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be included in all
12
+ copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,37 @@
1
+ # @onekeyfe/react-native-lite-card
2
+
3
+ lite card
4
+
5
+ ## Installation
6
+
7
+
8
+ ```sh
9
+ npm install @onekeyfe/react-native-lite-card
10
+ ```
11
+
12
+
13
+ ## Usage
14
+
15
+
16
+ ```js
17
+ import { multiply } from '@onekeyfe/react-native-lite-card';
18
+
19
+ // ...
20
+
21
+ const result = multiply(3, 7);
22
+ ```
23
+
24
+
25
+ ## Contributing
26
+
27
+ - [Development workflow](CONTRIBUTING.md#development-workflow)
28
+ - [Sending a pull request](CONTRIBUTING.md#sending-a-pull-request)
29
+ - [Code of conduct](CODE_OF_CONDUCT.md)
30
+
31
+ ## License
32
+
33
+ MIT
34
+
35
+ ---
36
+
37
+ Made with [create-react-native-library](https://github.com/callstack/react-native-builder-bob)
@@ -0,0 +1,22 @@
1
+ require "json"
2
+
3
+ package = JSON.parse(File.read(File.join(__dir__, "package.json")))
4
+
5
+ Pod::Spec.new do |s|
6
+ s.name = "ReactNativeLiteCard"
7
+ s.version = package["version"]
8
+ s.summary = package["description"]
9
+ s.homepage = package["homepage"]
10
+ s.license = package["license"]
11
+ s.authors = package["author"]
12
+
13
+ s.platforms = { :ios => min_ios_version_supported }
14
+ s.source = { :git => "https://github.com/OneKeyHQ/app-modules/onekeyfe-react-native-lite-card.git", :tag => "#{s.version}" }
15
+
16
+ s.source_files = "ios/**/*.{h,m,mm,swift,cpp}", "keys/**/*.{h,c,m,mm,swift,cpp}"
17
+ s.vendored_framework = "ios/GPChannelSDKCore.xcframework"
18
+ s.private_header_files = "ios/**/*.h"
19
+
20
+
21
+ install_modules_dependencies(s)
22
+ end
@@ -0,0 +1,79 @@
1
+ buildscript {
2
+ ext.getExtOrDefault = {name ->
3
+ return rootProject.ext.has(name) ? rootProject.ext.get(name) : project.properties['ReactNativeLiteCard_' + name]
4
+ }
5
+
6
+ repositories {
7
+ google()
8
+ mavenCentral()
9
+ }
10
+
11
+ dependencies {
12
+ classpath "com.android.tools.build:gradle:8.7.2"
13
+ // noinspection DifferentKotlinGradleVersion
14
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${getExtOrDefault('kotlinVersion')}"
15
+ }
16
+ }
17
+
18
+
19
+ apply plugin: "com.android.library"
20
+ apply plugin: "kotlin-android"
21
+
22
+ apply plugin: "com.facebook.react"
23
+
24
+ def getExtOrIntegerDefault(name) {
25
+ return rootProject.ext.has(name) ? rootProject.ext.get(name) : (project.properties["ReactNativeLiteCard_" + name]).toInteger()
26
+ }
27
+
28
+ android {
29
+ namespace "com.onekeyfe.reactnativelitecard"
30
+
31
+ compileSdkVersion getExtOrIntegerDefault("compileSdkVersion")
32
+
33
+ defaultConfig {
34
+ minSdkVersion getExtOrIntegerDefault("minSdkVersion")
35
+ targetSdkVersion getExtOrIntegerDefault("targetSdkVersion")
36
+ }
37
+
38
+ buildFeatures {
39
+ buildConfig true
40
+ }
41
+
42
+ buildTypes {
43
+ release {
44
+ minifyEnabled false
45
+ }
46
+ }
47
+
48
+ lintOptions {
49
+ disable "GradleCompatible"
50
+ }
51
+
52
+ compileOptions {
53
+ sourceCompatibility JavaVersion.VERSION_1_8
54
+ targetCompatibility JavaVersion.VERSION_1_8
55
+ }
56
+
57
+ sourceSets {
58
+ main {
59
+ java.srcDirs += [
60
+ "generated/java",
61
+ "generated/jni"
62
+ ]
63
+ }
64
+ }
65
+ }
66
+
67
+ repositories {
68
+ mavenCentral()
69
+ google()
70
+ }
71
+
72
+ def kotlin_version = getExtOrDefault("kotlinVersion")
73
+
74
+ dependencies {
75
+ implementation "com.facebook.react:react-android"
76
+ implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
77
+ implementation 'com.google.code.gson:gson:2.10.1'
78
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4'
79
+ }
@@ -0,0 +1,5 @@
1
+ ReactNativeLiteCard_kotlinVersion=2.0.21
2
+ ReactNativeLiteCard_minSdkVersion=24
3
+ ReactNativeLiteCard_targetSdkVersion=34
4
+ ReactNativeLiteCard_compileSdkVersion=35
5
+ ReactNativeLiteCard_ndkVersion=27.1.12297006
@@ -0,0 +1,2 @@
1
+ <manifest xmlns:android="http://schemas.android.com/apk/res/android">
2
+ </manifest>
@@ -0,0 +1,205 @@
1
+ {
2
+ "verify_certificate": {
3
+ "v1": {
4
+ "area": "none",
5
+ "command": "802A1810",
6
+ "ignoreSafeChannel": true,
7
+ "useSafeChannel": false,
8
+ "needData": true
9
+ },
10
+ "v2": {
11
+ "area": "none",
12
+ "command": "802A1810",
13
+ "ignoreSafeChannel": true,
14
+ "useSafeChannel": false,
15
+ "needData": true
16
+ }
17
+ },
18
+ "verify_auth_data": {
19
+ "v1": {
20
+ "area": "none",
21
+ "command": "80821815",
22
+ "ignoreSafeChannel": true,
23
+ "useSafeChannel": false,
24
+ "needData": true
25
+ },
26
+ "v2": {
27
+ "area": "none",
28
+ "command": "80821815",
29
+ "ignoreSafeChannel": true,
30
+ "useSafeChannel": false,
31
+ "needData": true
32
+ }
33
+ },
34
+ "select_primary_safety": {
35
+ "v1": {
36
+ "area": "none",
37
+ "command": "00A40400",
38
+ "useSafeChannel": false,
39
+ "needData": false
40
+ },
41
+ "v2": {
42
+ "area": "none",
43
+ "command": "00A40400",
44
+ "ignoreSafeChannel": true,
45
+ "useSafeChannel": false,
46
+ "needData": false
47
+ }
48
+ },
49
+ "select_backup_applet": {
50
+ "v1": {
51
+ "area": "none",
52
+ "command": "00A40400",
53
+ "useSafeChannel": false,
54
+ "needData": true
55
+ },
56
+ "v2": {
57
+ "area": "none",
58
+ "command": "00A40400",
59
+ "ignoreSafeChannel": true,
60
+ "useSafeChannel": false,
61
+ "needData": true
62
+ }
63
+ },
64
+ "get_backup_status": {
65
+ "v1": {
66
+ "area": "backup",
67
+ "command": "806A0000",
68
+ "useSafeChannel": false,
69
+ "needData": false
70
+ },
71
+ "v2": {
72
+ "area": "backup",
73
+ "command": "806A0000",
74
+ "useSafeChannel": false,
75
+ "needData": false
76
+ }
77
+ },
78
+ "get_pin_status": {
79
+ "v1": {
80
+ "area": "master",
81
+ "command": "80CB8000",
82
+ "useSafeChannel": false,
83
+ "needData": true
84
+ },
85
+ "v2": {
86
+ "area": "backup",
87
+ "command": "80CB8000",
88
+ "useSafeChannel": false,
89
+ "needData": true
90
+ }
91
+ },
92
+ "get_serial_number": {
93
+ "v1": {
94
+ "area": "master",
95
+ "command": "80CB8000",
96
+ "useSafeChannel": false,
97
+ "needData": true
98
+ },
99
+ "v2": {
100
+ "area": "backup",
101
+ "command": "80CB8000",
102
+ "useSafeChannel": false,
103
+ "useSafeChannelWhenOpen": true,
104
+ "needData": true
105
+ }
106
+ },
107
+ "get_pin_retry_count": {
108
+ "v1": {
109
+ "area": "master",
110
+ "command": "80CB8000",
111
+ "useSafeChannel": false,
112
+ "needData": true
113
+ },
114
+ "v2": {
115
+ "area": "backup",
116
+ "command": "80CB8000",
117
+ "useSafeChannel": false,
118
+ "needData": true
119
+ }
120
+ },
121
+ "reset_card": {
122
+ "v1": {
123
+ "area": "master",
124
+ "command": "80CB8000",
125
+ "useSafeChannel": true,
126
+ "needData": true
127
+ },
128
+ "v2": {
129
+ "area": "backup",
130
+ "command": "80CB8000",
131
+ "useSafeChannel": true,
132
+ "needData": true
133
+ }
134
+ },
135
+ "verify_pin": {
136
+ "v1": {
137
+ "area": "backup",
138
+ "command": "80200000",
139
+ "useSafeChannel": true,
140
+ "needData": true
141
+ },
142
+ "v2": {
143
+ "area": "backup",
144
+ "command": "80200000",
145
+ "useSafeChannel": true,
146
+ "needData": true
147
+ }
148
+ },
149
+ "setup_new_pin": {
150
+ "v1": {
151
+ "area": "master",
152
+ "command": "80CB8000",
153
+ "useSafeChannel": true,
154
+ "needData": true
155
+ },
156
+ "v2": {
157
+ "area": "backup",
158
+ "command": "80CB8000",
159
+ "useSafeChannel": true,
160
+ "needData": true
161
+ }
162
+ },
163
+ "change_pin": {
164
+ "v1": {
165
+ "area": "master",
166
+ "command": "80CB8000",
167
+ "useSafeChannel": true,
168
+ "needData": true
169
+ },
170
+ "v2": {
171
+ "area": "backup",
172
+ "command": "80CB8000",
173
+ "useSafeChannel": true,
174
+ "needData": true
175
+ }
176
+ },
177
+ "backup_data": {
178
+ "v1": {
179
+ "area": "backup",
180
+ "command": "803B0000",
181
+ "useSafeChannel": false,
182
+ "needData": true
183
+ },
184
+ "v2": {
185
+ "area": "backup",
186
+ "command": "803B0000",
187
+ "useSafeChannel": true,
188
+ "needData": true
189
+ }
190
+ },
191
+ "export_data": {
192
+ "v1": {
193
+ "area": "backup",
194
+ "command": "804B0000",
195
+ "useSafeChannel": false,
196
+ "needData": false
197
+ },
198
+ "v2": {
199
+ "area": "backup",
200
+ "command": "804B0000",
201
+ "useSafeChannel": true,
202
+ "needData": false
203
+ }
204
+ }
205
+ }
@@ -0,0 +1,19 @@
1
+ cmake_minimum_required(VERSION 3.4.1)
2
+
3
+ set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Os -Oz")
4
+ set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Os -Oz")
5
+ set(CMAKE_C_VISIBILITY_PRESET hidden)
6
+ set(CMAKE_CXX_VISIBILITY_PRESET hidden)
7
+
8
+ # Support for Android 15 16KB page size
9
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wl,-z,max-page-size=16384")
10
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wl,-z,max-page-size=16384")
11
+
12
+ add_library(keys SHARED
13
+ ../../../../keys/keys.c
14
+ validation.c)
15
+
16
+ # Include libraries needed for native-lib lib
17
+ target_link_libraries(keys
18
+ android
19
+ log)
@@ -0,0 +1,227 @@
1
+ #include "validation.h"
2
+ #include <sys/system_properties.h>
3
+
4
+ // 查看签名信息:gradlew sR
5
+ // 签名信息
6
+ const char hexcode[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E',
7
+ 'F'};
8
+
9
+ char *signatureSha1(JNIEnv *pInterface, jbyteArray pVoid);
10
+
11
+ /**
12
+ * 获取 Android 系统版本
13
+ * @return 系统版本号
14
+ */
15
+ int currentAndroidOSVersion() {
16
+ int version;
17
+
18
+ char sdk_ver_str[8];
19
+ if (__system_property_get("ro.build.version.sdk", sdk_ver_str)) {
20
+ version = atoi(sdk_ver_str);
21
+ } else {
22
+ version = 0;
23
+ }
24
+ return version;
25
+ }
26
+
27
+ jbyteArray getSignatureSha1By1(JNIEnv *env, jobject context_object) {
28
+ //上下文对象
29
+ jclass context_class = (*env)->GetObjectClass(env, context_object);
30
+
31
+ //反射获取PackageManager
32
+ jmethodID methodId = (*env)->GetMethodID(env, context_class, "getPackageManager",
33
+ "()Landroid/content/pm/PackageManager;");
34
+ jobject package_manager = (*env)->CallObjectMethod(env, context_object, methodId);
35
+ if (package_manager == NULL) {
36
+ LOGD("package_manager is NULL!!!");
37
+ return NULL;
38
+ }
39
+
40
+ //反射获取包名
41
+ methodId = (*env)->GetMethodID(env, context_class, "getPackageName", "()Ljava/lang/String;");
42
+ jstring package_name = (jstring)(*env)->CallObjectMethod(env, context_object, methodId);
43
+ if (package_name == NULL) {
44
+ LOGD("package_name is NULL!!!");
45
+ return NULL;
46
+ }
47
+ (*env)->DeleteLocalRef(env, context_class);
48
+
49
+ //获取PackageInfo对象
50
+ jclass pack_manager_class = (*env)->GetObjectClass(env, package_manager);
51
+ methodId = (*env)->GetMethodID(env, pack_manager_class, "getPackageInfo",
52
+ "(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;");
53
+ (*env)->DeleteLocalRef(env, pack_manager_class);
54
+ jobject package_info = (*env)->CallObjectMethod(env, package_manager, methodId, package_name,
55
+ 0x00000040);
56
+ if (package_info == NULL) {
57
+ LOGD("getPackageInfo() is NULL!!!");
58
+ return NULL;
59
+ }
60
+ (*env)->DeleteLocalRef(env, package_manager);
61
+
62
+ //获取签名信息
63
+ jclass package_info_class = (*env)->GetObjectClass(env, package_info);
64
+ jfieldID fieldId = (*env)->GetFieldID(env, package_info_class, "signatures",
65
+ "[Landroid/content/pm/Signature;");
66
+ (*env)->DeleteLocalRef(env, package_info_class);
67
+ jobjectArray signature_object_array = (jobjectArray)(*env)->GetObjectField(env, package_info,
68
+ fieldId);
69
+ if (signature_object_array == NULL) {
70
+ LOGD("signature is NULL!!!");
71
+ return NULL;
72
+ }
73
+ jobject signature_object = (*env)->GetObjectArrayElement(env, signature_object_array, 0);
74
+ (*env)->DeleteLocalRef(env, package_info);
75
+
76
+ jclass signature_class = (*env)->GetObjectClass(env, signature_object);
77
+ methodId = (*env)->GetMethodID(env, signature_class, "toByteArray", "()[B");
78
+ (*env)->DeleteLocalRef(env, signature_class);
79
+ jbyteArray signature_byte = (jbyteArray)(*env)->CallObjectMethod(env, signature_object,
80
+ methodId);
81
+ return signature_byte;
82
+ }
83
+
84
+ jbyteArray getSignatureSha1By28(JNIEnv *env, jobject context_object) {
85
+ //上下文对象
86
+ jclass context_class = (*env)->GetObjectClass(env, context_object);
87
+
88
+ //反射获取PackageManager
89
+ jmethodID methodId = (*env)->GetMethodID(env, context_class, "getPackageManager",
90
+ "()Landroid/content/pm/PackageManager;");
91
+ jobject package_manager = (*env)->CallObjectMethod(env, context_object, methodId);
92
+ if (package_manager == NULL) {
93
+ LOGD("package_manager is NULL!!!");
94
+ return NULL;
95
+ }
96
+
97
+ //反射获取包名
98
+ methodId = (*env)->GetMethodID(env, context_class, "getPackageName", "()Ljava/lang/String;");
99
+ jstring package_name = (jstring)(*env)->CallObjectMethod(env, context_object, methodId);
100
+ if (package_name == NULL) {
101
+ LOGD("package_name is NULL!!!");
102
+ return NULL;
103
+ }
104
+ (*env)->DeleteLocalRef(env, context_class);
105
+
106
+ //获取PackageInfo对象
107
+ jclass pack_manager_class = (*env)->GetObjectClass(env, package_manager);
108
+ methodId = (*env)->GetMethodID(env, pack_manager_class, "getPackageInfo",
109
+ "(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;");
110
+ (*env)->DeleteLocalRef(env, pack_manager_class);
111
+ jobject package_info = (*env)->CallObjectMethod(env, package_manager, methodId, package_name,
112
+ 0x08000000);
113
+ if (package_info == NULL) {
114
+ LOGD("getPackageInfo() is NULL!!!");
115
+ return NULL;
116
+ }
117
+ (*env)->DeleteLocalRef(env, package_manager);
118
+
119
+ //获取SigningInfo对象
120
+ jclass package_info_class = (*env)->GetObjectClass(env, package_info);
121
+ jfieldID fieldId = (*env)->GetFieldID(env, package_info_class, "signingInfo",
122
+ "Landroid/content/pm/SigningInfo;");
123
+ (*env)->DeleteLocalRef(env, package_info_class);
124
+ jobject signing_info = (jobjectArray)(*env)->GetObjectField(env, package_info,
125
+ fieldId);
126
+ if (signing_info == NULL) {
127
+ LOGD("signingInfo is NULL!!!");
128
+ return NULL;
129
+ }
130
+
131
+ //获取签名信息
132
+ jclass signing_info_class = (*env)->GetObjectClass(env, signing_info);
133
+ methodId = (*env)->GetMethodID(env, signing_info_class, "getApkContentsSigners",
134
+ "()[Landroid/content/pm/Signature;");
135
+ (*env)->DeleteLocalRef(env, signing_info_class);
136
+ jobjectArray signature_object_array = (jobjectArray)(*env)->CallObjectMethod(env, signing_info,
137
+ methodId);
138
+ if (signature_object_array == NULL) {
139
+ LOGD("signature is NULL!!!");
140
+ return NULL;
141
+ }
142
+ jobject signature_object = (*env)->GetObjectArrayElement(env, signature_object_array, 0);
143
+ (*env)->DeleteLocalRef(env, signing_info);
144
+
145
+ jclass signature_class = (*env)->GetObjectClass(env, signature_object);
146
+ methodId = (*env)->GetMethodID(env, signature_class, "toByteArray", "()[B");
147
+ (*env)->DeleteLocalRef(env, signature_class);
148
+ jbyteArray signature_byte = (jbyteArray)(*env)->CallObjectMethod(env, signature_object,
149
+ methodId);
150
+ return signature_byte;
151
+ }
152
+
153
+ char *getSignatureSha1(JNIEnv *env, jobject context_object) {
154
+
155
+ LOGD("android version is %d", currentAndroidOSVersion());
156
+ int version = currentAndroidOSVersion();
157
+ jbyteArray signature_byte;
158
+ if (version >= 28) {
159
+ signature_byte = getSignatureSha1By28(env, context_object);
160
+ } else {
161
+ signature_byte = getSignatureSha1By1(env, context_object);
162
+ }
163
+ //签名信息转换成sha1值
164
+ return signatureSha1(env, signature_byte);
165
+ }
166
+
167
+ char *signatureSha1(JNIEnv *env, jbyteArray message) {
168
+ jclass byte_array_input_class = (*env)->FindClass(env, "java/io/ByteArrayInputStream");
169
+ jmethodID methodId = (*env)->GetMethodID(env, byte_array_input_class, "<init>", "([B)V");
170
+ jobject byte_array_input = (*env)->NewObject(env, byte_array_input_class, methodId,
171
+ message);
172
+ jclass certificate_factory_class = (*env)->FindClass(env,
173
+ "java/security/cert/CertificateFactory");
174
+ methodId = (*env)->GetStaticMethodID(env, certificate_factory_class, "getInstance",
175
+ "(Ljava/lang/String;)Ljava/security/cert/CertificateFactory;");
176
+ jstring x_509_jstring = (*env)->NewStringUTF(env, "X.509");
177
+ jobject cert_factory = (*env)->CallStaticObjectMethod(env, certificate_factory_class, methodId,
178
+ x_509_jstring);
179
+ methodId = (*env)->GetMethodID(env, certificate_factory_class, "generateCertificate",
180
+ ("(Ljava/io/InputStream;)Ljava/security/cert/Certificate;"));
181
+ jobject x509_cert = (*env)->CallObjectMethod(env, cert_factory, methodId, byte_array_input);
182
+ (*env)->DeleteLocalRef(env, certificate_factory_class);
183
+ jclass x509_cert_class = (*env)->GetObjectClass(env, x509_cert);
184
+ methodId = (*env)->GetMethodID(env, x509_cert_class, "getEncoded", "()[B");
185
+ jbyteArray cert_byte = (jbyteArray)(*env)->CallObjectMethod(env, x509_cert, methodId);
186
+ (*env)->DeleteLocalRef(env, x509_cert_class);
187
+ jclass message_digest_class = (*env)->FindClass(env, "java/security/MessageDigest");
188
+ methodId = (*env)->GetStaticMethodID(env, message_digest_class, "getInstance",
189
+ "(Ljava/lang/String;)Ljava/security/MessageDigest;");
190
+ jstring sha1_jstring = (*env)->NewStringUTF(env, "SHA1");
191
+ jobject sha1_digest = (*env)->CallStaticObjectMethod(env, message_digest_class, methodId,
192
+ sha1_jstring);
193
+ methodId = (*env)->GetMethodID(env, message_digest_class, "digest", "([B)[B");
194
+ jbyteArray sha1_byte = (jbyteArray)(*env)->CallObjectMethod(env, sha1_digest, methodId,
195
+ cert_byte);
196
+ (*env)->DeleteLocalRef(env, message_digest_class);
197
+
198
+ //转换成char
199
+ jsize array_size = (*env)->GetArrayLength(env, sha1_byte);
200
+ unsigned char *sha1 = (unsigned char *) (*env)->GetByteArrayElements(env, sha1_byte, 0);
201
+ char *hex_sha = malloc(array_size * 2 + 1);
202
+ for (int i = 0; i < array_size; ++i) {
203
+ hex_sha[2 * i] = hexcode[(sha1[i]) / 16];
204
+ hex_sha[2 * i + 1] = hexcode[(sha1[i]) % 16];
205
+ }
206
+ hex_sha[array_size * 2] = '\0';
207
+
208
+ return hex_sha;
209
+ }
210
+
211
+ jboolean checkValidity(char *sha1, char * app_sha1[], size_t size) {
212
+ //比较签名
213
+ for (int i = 0; i < size; ++i) {
214
+ const char *current = app_sha1[i];
215
+ if (strcmp(sha1, current) == 0) {
216
+ LOGD("signature is success.");
217
+ return JNI_TRUE;
218
+ }
219
+ }
220
+ LOGD("signature is error.");
221
+ return JNI_FALSE;
222
+ }
223
+
224
+ jboolean checkSecurityPermission(JNIEnv *env, jobject contextObject, char * app_sha1[], size_t size) {
225
+ char *sha1 = getSignatureSha1(env, contextObject);
226
+ return checkValidity(sha1, app_sha1, size);
227
+ }
@@ -0,0 +1,19 @@
1
+ #ifndef VALIDATION_H_
2
+ #define VALIDATION_H_
3
+
4
+ #include <stdio.h>
5
+ #include <stdlib.h>
6
+ #include <jni.h>
7
+ #include <string.h>
8
+ #include <android/log.h>
9
+
10
+ #define TAG "AuthorityKey Jni Log"
11
+ #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,TAG,__VA_ARGS__)
12
+
13
+ char *getSignatureSha1(JNIEnv *env, jobject context_object);
14
+
15
+ jboolean checkValidity(char *sha1, char * app_sha1[], size_t size);
16
+
17
+ jboolean checkSecurityPermission(JNIEnv *env, jobject context_object, char * app_sha1[], size_t size);
18
+
19
+ #endif /* VALIDATION_H_ */
@@ -0,0 +1,35 @@
1
+ package so.onekey.app.wallet.lite
2
+
3
+ import android.util.Log
4
+ import com.facebook.react.bridge.ReactApplicationContext
5
+ import com.facebook.react.bridge.ReactContextBaseJavaModule
6
+ import com.facebook.react.bridge.ReactMethod
7
+ import so.onekey.app.wallet.lite.utils.sendEvent
8
+
9
+ class LoggerManager(private val context: ReactApplicationContext) :
10
+ ReactContextBaseJavaModule(context) {
11
+
12
+ companion object {
13
+ private val TAG = LoggerManager::class.simpleName.toString()
14
+
15
+ private const val LOG_EVENT_INFO = "native_log_info"
16
+
17
+ private var instance: LoggerManager? = null
18
+
19
+ fun getInstance(): LoggerManager? {
20
+ return instance
21
+ }
22
+ }
23
+
24
+ init {
25
+ instance = this
26
+ }
27
+
28
+ override fun getName(): String = TAG
29
+
30
+ @ReactMethod
31
+ public fun logInfo(message: String) {
32
+ Log.d(TAG, message)
33
+ sendEvent(context, LOG_EVENT_INFO, message)
34
+ }
35
+ }