@onekeyfe/react-native-lite-card 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/LICENSE +20 -0
  2. package/android/build.gradle +102 -0
  3. package/android/gradle.properties +5 -0
  4. package/android/src/main/AndroidManifest.xml +3 -0
  5. package/android/src/main/assets/config/command.json +205 -0
  6. package/android/src/main/cpp/CMakeLists.txt +15 -0
  7. package/android/src/main/cpp/validation.c +227 -0
  8. package/android/src/main/cpp/validation.h +19 -0
  9. package/android/src/main/java/so/onekey/app/wallet/LoggerManager.kt +35 -0
  10. package/android/src/main/java/so/onekey/app/wallet/OKLiteManager.kt +399 -0
  11. package/android/src/main/java/so/onekey/app/wallet/OKLitePackage.kt +16 -0
  12. package/android/src/main/java/so/onekey/app/wallet/keys/KeysNativeProvider.kt +13 -0
  13. package/android/src/main/java/so/onekey/app/wallet/nfc/Exceptions.kt +58 -0
  14. package/android/src/main/java/so/onekey/app/wallet/nfc/NfcUtils.kt +151 -0
  15. package/android/src/main/java/so/onekey/app/wallet/nfc/broadcast/NfcStatusChangeBroadcastReceiver.kt +56 -0
  16. package/android/src/main/java/so/onekey/app/wallet/nfc/gpchannel/GPChannelNatives.kt +32 -0
  17. package/android/src/main/java/so/onekey/app/wallet/onekeyLite/NfcConstant.kt +38 -0
  18. package/android/src/main/java/so/onekey/app/wallet/onekeyLite/OnekeyLiteCard.kt +241 -0
  19. package/android/src/main/java/so/onekey/app/wallet/onekeyLite/entitys/APDUParam.kt +17 -0
  20. package/android/src/main/java/so/onekey/app/wallet/onekeyLite/entitys/CardInfo.java +84 -0
  21. package/android/src/main/java/so/onekey/app/wallet/onekeyLite/entitys/CardResponse.java +37 -0
  22. package/android/src/main/java/so/onekey/app/wallet/onekeyLite/entitys/CardState.kt +10 -0
  23. package/android/src/main/java/so/onekey/app/wallet/onekeyLite/entitys/ParsedCertInfo.java +39 -0
  24. package/android/src/main/java/so/onekey/app/wallet/onekeyLite/entitys/SecureChanelParam.java +113 -0
  25. package/android/src/main/java/so/onekey/app/wallet/onekeyLite/entitys/SendResponse.kt +26 -0
  26. package/android/src/main/java/so/onekey/app/wallet/onekeyLite/nfc/CommandGenerator.kt +178 -0
  27. package/android/src/main/java/so/onekey/app/wallet/onekeyLite/nfc/Connection.kt +430 -0
  28. package/android/src/main/java/so/onekey/app/wallet/onekeyLite/nfc/GPCAPDUGenerator.kt +56 -0
  29. package/android/src/main/java/so/onekey/app/wallet/utils/EventUtils.kt +14 -0
  30. package/android/src/main/java/so/onekey/app/wallet/utils/GpsUtil.kt +38 -0
  31. package/android/src/main/java/so/onekey/app/wallet/utils/HexUtils.java +93 -0
  32. package/android/src/main/java/so/onekey/app/wallet/utils/LogUtil.kt +11 -0
  33. package/android/src/main/java/so/onekey/app/wallet/utils/MiUtil.kt +93 -0
  34. package/android/src/main/java/so/onekey/app/wallet/utils/NfcPermissionUtils.kt +24 -0
  35. package/android/src/main/java/so/onekey/app/wallet/utils/Utils.java +433 -0
  36. package/android/src/main/jniLibs/arm64-v8a/libgpchannelNDK.so +0 -0
  37. package/android/src/main/jniLibs/armeabi-v7a/libgpchannelNDK.so +0 -0
  38. package/ios/Classes/OKLiteCommand/OKLiteCommandModal.h +39 -0
  39. package/ios/Classes/OKLiteCommand/OKLiteCommandModal.m +143 -0
  40. package/ios/Classes/OKLiteCommand/OKLiteCommandTool.h +28 -0
  41. package/ios/Classes/OKLiteCommand/OKLiteCommandTool.m +53 -0
  42. package/ios/Classes/OKLiteManager.h +17 -0
  43. package/ios/Classes/OKLiteManager.m +222 -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 +602 -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.framework/GPChannelSDKCore +0 -0
  69. package/ios/GPChannelSDKCore.framework/Headers/GPChannelSDK.h +315 -0
  70. package/ios/GPChannelSDKCore.framework/Headers/GPChannelSDKCore.h +19 -0
  71. package/ios/GPChannelSDKCore.framework/Info.plist +0 -0
  72. package/ios/GPChannelSDKCore.framework/Modules/module.modulemap +7 -0
  73. package/ios/GPChannelSDKCore.framework/_CodeSignature/CodeResources +147 -0
  74. package/keys/keys.c +51 -0
  75. package/keys/keys.h +4 -0
  76. package/lib/commonjs/index.js +114 -0
  77. package/lib/commonjs/index.js.map +1 -0
  78. package/lib/commonjs/types.js +27 -0
  79. package/lib/commonjs/types.js.map +1 -0
  80. package/lib/module/index.js +108 -0
  81. package/lib/module/index.js.map +1 -0
  82. package/lib/module/types.js +21 -0
  83. package/lib/module/types.js.map +1 -0
  84. package/lib/typescript/src/index.d.ts +35 -0
  85. package/lib/typescript/src/index.d.ts.map +1 -0
  86. package/lib/typescript/src/types.d.ts +31 -0
  87. package/lib/typescript/src/types.d.ts.map +1 -0
  88. package/package.json +166 -0
  89. package/react-native-lite-card.podspec +42 -0
  90. package/src/index.ts +154 -0
  91. package/src/types.ts +37 -0
package/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2023 OneKeyHQ
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.
@@ -0,0 +1,102 @@
1
+ buildscript {
2
+ // Buildscript is evaluated before everything else so we can't use getExtOrDefault
3
+ def kotlin_version = rootProject.ext.has("kotlinVersion") ? rootProject.ext.get("kotlinVersion") : project.properties["LiteCard_kotlinVersion"]
4
+
5
+ repositories {
6
+ google()
7
+ mavenCentral()
8
+ }
9
+
10
+ dependencies {
11
+ classpath "com.android.tools.build:gradle:7.2.1"
12
+ // noinspection DifferentKotlinGradleVersion
13
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
14
+ }
15
+ }
16
+
17
+ def isNewArchitectureEnabled() {
18
+ return rootProject.hasProperty("newArchEnabled") && rootProject.getProperty("newArchEnabled") == "true"
19
+ }
20
+
21
+ apply plugin: "com.android.library"
22
+ apply plugin: "kotlin-android"
23
+
24
+ if (isNewArchitectureEnabled()) {
25
+ apply plugin: "com.facebook.react"
26
+ }
27
+
28
+ def getExtOrDefault(name) {
29
+ return rootProject.ext.has(name) ? rootProject.ext.get(name) : project.properties["LiteCard_" + name]
30
+ }
31
+
32
+ def getExtOrIntegerDefault(name) {
33
+ return rootProject.ext.has(name) ? rootProject.ext.get(name) : (project.properties["LiteCard_" + name]).toInteger()
34
+ }
35
+
36
+ def supportsNamespace() {
37
+ def parsed = com.android.Version.ANDROID_GRADLE_PLUGIN_VERSION.tokenize('.')
38
+ def major = parsed[0].toInteger()
39
+ def minor = parsed[1].toInteger()
40
+
41
+ // Namespace support was added in 7.3.0
42
+ return (major == 7 && minor >= 3) || major >= 8
43
+ }
44
+
45
+ android {
46
+ if (supportsNamespace()) {
47
+ namespace "so.onekey.app.wallet"
48
+
49
+ sourceSets {
50
+ main {
51
+ manifest.srcFile "src/main/AndroidManifestNew.xml"
52
+ }
53
+ }
54
+ }
55
+
56
+ externalNativeBuild {
57
+ cmake {
58
+ path "src/main/cpp/CMakeLists.txt"
59
+ }
60
+ }
61
+
62
+ compileSdkVersion getExtOrIntegerDefault("compileSdkVersion")
63
+
64
+ defaultConfig {
65
+ minSdkVersion getExtOrIntegerDefault("minSdkVersion")
66
+ targetSdkVersion getExtOrIntegerDefault("targetSdkVersion")
67
+
68
+ }
69
+
70
+ buildTypes {
71
+ release {
72
+ minifyEnabled false
73
+ }
74
+ }
75
+
76
+ lintOptions {
77
+ disable "GradleCompatible"
78
+ }
79
+
80
+ compileOptions {
81
+ sourceCompatibility JavaVersion.VERSION_1_8
82
+ targetCompatibility JavaVersion.VERSION_1_8
83
+ }
84
+ }
85
+
86
+ repositories {
87
+ mavenCentral()
88
+ google()
89
+ }
90
+
91
+ def kotlin_version = getExtOrDefault("kotlinVersion")
92
+
93
+ dependencies {
94
+ // For < 0.71, this will be from the local maven repo
95
+ // For > 0.71, this will be replaced by `com.facebook.react:react-android:$version` by react gradle plugin
96
+ //noinspection GradleDynamicVersion
97
+ implementation "com.facebook.react:react-native:+"
98
+ implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
99
+ implementation 'com.google.code.gson:gson:2.10.1'
100
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4'
101
+ }
102
+
@@ -0,0 +1,5 @@
1
+ LiteCard_kotlinVersion=1.7.0
2
+ LiteCard_minSdkVersion=21
3
+ LiteCard_targetSdkVersion=31
4
+ LiteCard_compileSdkVersion=31
5
+ LiteCard_ndkversion=21.4.7075529
@@ -0,0 +1,3 @@
1
+ <manifest xmlns:android="http://schemas.android.com/apk/res/android"
2
+ package="so.onekey.app.wallet">
3
+ </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,15 @@
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
+ add_library(keys SHARED
9
+ ../../../../keys/keys.c
10
+ validation.c)
11
+
12
+ # Include libraries needed for native-lib lib
13
+ target_link_libraries(keys
14
+ android
15
+ 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
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.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
+ }