@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.
- package/LICENSE +20 -0
- package/README.md +37 -0
- package/ReactNativeLiteCard.podspec +22 -0
- package/android/build.gradle +79 -0
- package/android/gradle.properties +5 -0
- package/android/src/main/AndroidManifest.xml +2 -0
- package/android/src/main/config/command.json +205 -0
- package/android/src/main/cpp/CMakeLists.txt +19 -0
- package/android/src/main/cpp/validation.c +227 -0
- package/android/src/main/cpp/validation.h +19 -0
- package/android/src/main/java/com/onekeyfe/reactnativelitecard/LoggerManager.kt +35 -0
- package/android/src/main/java/com/onekeyfe/reactnativelitecard/ReactNativeLiteCardModule.kt +420 -0
- package/android/src/main/java/com/onekeyfe/reactnativelitecard/ReactNativeLiteCardPackage.kt +33 -0
- package/android/src/main/java/com/onekeyfe/reactnativelitecard/keys/KeysNativeProvider.kt +13 -0
- package/android/src/main/java/com/onekeyfe/reactnativelitecard/nfc/Exceptions.kt +58 -0
- package/android/src/main/java/com/onekeyfe/reactnativelitecard/nfc/NfcUtils.kt +142 -0
- package/android/src/main/java/com/onekeyfe/reactnativelitecard/nfc/broadcast/NfcStatusChangeBroadcastReceiver.kt +56 -0
- package/android/src/main/java/com/onekeyfe/reactnativelitecard/nfc/gpchannel/GPChannelNatives.kt +32 -0
- package/android/src/main/java/com/onekeyfe/reactnativelitecard/onekeyLite/NfcConstant.kt +38 -0
- package/android/src/main/java/com/onekeyfe/reactnativelitecard/onekeyLite/OnekeyLiteCard.kt +236 -0
- package/android/src/main/java/com/onekeyfe/reactnativelitecard/onekeyLite/entitys/APDUParam.kt +17 -0
- package/android/src/main/java/com/onekeyfe/reactnativelitecard/onekeyLite/entitys/CardInfo.java +84 -0
- package/android/src/main/java/com/onekeyfe/reactnativelitecard/onekeyLite/entitys/CardResponse.java +37 -0
- package/android/src/main/java/com/onekeyfe/reactnativelitecard/onekeyLite/entitys/CardState.kt +10 -0
- package/android/src/main/java/com/onekeyfe/reactnativelitecard/onekeyLite/entitys/ParsedCertInfo.java +39 -0
- package/android/src/main/java/com/onekeyfe/reactnativelitecard/onekeyLite/entitys/SecureChanelParam.java +113 -0
- package/android/src/main/java/com/onekeyfe/reactnativelitecard/onekeyLite/entitys/SendResponse.kt +26 -0
- package/android/src/main/java/com/onekeyfe/reactnativelitecard/onekeyLite/nfc/CommandGenerator.kt +178 -0
- package/android/src/main/java/com/onekeyfe/reactnativelitecard/onekeyLite/nfc/Connection.kt +439 -0
- package/android/src/main/java/com/onekeyfe/reactnativelitecard/onekeyLite/nfc/GPCAPDUGenerator.kt +56 -0
- package/android/src/main/java/com/onekeyfe/reactnativelitecard/utils/EventUtils.kt +14 -0
- package/android/src/main/java/com/onekeyfe/reactnativelitecard/utils/GpsUtil.kt +38 -0
- package/android/src/main/java/com/onekeyfe/reactnativelitecard/utils/HexUtils.java +93 -0
- package/android/src/main/java/com/onekeyfe/reactnativelitecard/utils/LogUtil.kt +11 -0
- package/android/src/main/java/com/onekeyfe/reactnativelitecard/utils/MiUtil.kt +93 -0
- package/android/src/main/java/com/onekeyfe/reactnativelitecard/utils/NfcPermissionUtils.kt +24 -0
- package/android/src/main/java/com/onekeyfe/reactnativelitecard/utils/Utils.java +437 -0
- package/android/src/main/jniLibs/arm64-v8a/libgpchannelNDK.so +0 -0
- package/android/src/main/jniLibs/armeabi-v7a/libgpchannelNDK.so +0 -0
- package/ios/Classes/OKLiteCommand/OKLiteCommandModal.h +39 -0
- package/ios/Classes/OKLiteCommand/OKLiteCommandModal.m +143 -0
- package/ios/Classes/OKLiteCommand/OKLiteCommandTool.h +28 -0
- package/ios/Classes/OKLiteCommand/OKLiteCommandTool.m +53 -0
- package/ios/Classes/OKNFCBridge.h +28 -0
- package/ios/Classes/OKNFCBridge.mm +221 -0
- package/ios/Classes/OKNFCLiteDefine.h +108 -0
- package/ios/Classes/OKNFTLite/OKLiteProtocol.h +37 -0
- package/ios/Classes/OKNFTLite/OKLiteV1.h +41 -0
- package/ios/Classes/OKNFTLite/OKLiteV1.m +609 -0
- package/ios/Classes/OKNFTLite/OKLiteV2.h +17 -0
- package/ios/Classes/OKNFTLite/OKLiteV2.m +132 -0
- package/ios/Classes/OKNFTLite/OKNFCManager.h +40 -0
- package/ios/Classes/OKNFTLite/OKNFCManager.m +330 -0
- package/ios/Classes/Utils/NFCConfig.h +19 -0
- package/ios/Classes/Utils/NFCConfig.m +18 -0
- package/ios/Classes/Utils/NSData+OKNFCHexData.h +17 -0
- package/ios/Classes/Utils/NSData+OKNFCHexData.m +24 -0
- package/ios/Classes/Utils/NSData+StringToData.h +12 -0
- package/ios/Classes/Utils/NSData+StringToData.m +25 -0
- package/ios/Classes/Utils/NSString+OKAdd.h +14 -0
- package/ios/Classes/Utils/NSString+OKAdd.m +40 -0
- package/ios/Classes/Utils/NSString+OKNFCHexStr.h +18 -0
- package/ios/Classes/Utils/NSString+OKNFCHexStr.m +38 -0
- package/ios/Classes/Utils/OKNFCUtility.h +18 -0
- package/ios/Classes/Utils/OKNFCUtility.m +22 -0
- package/ios/Classes/Utils/OKTools.h +17 -0
- package/ios/Classes/Utils/OKTools.m +21 -0
- package/ios/GPChannelSDKCore.xcframework/Info.plist +52 -0
- package/ios/GPChannelSDKCore.xcframework/ios-arm64/GPChannelSDKCore.framework/GPChannelSDKCore +0 -0
- package/ios/GPChannelSDKCore.xcframework/ios-arm64/GPChannelSDKCore.framework/Headers/GPChannelSDK.h +315 -0
- package/ios/GPChannelSDKCore.xcframework/ios-arm64/GPChannelSDKCore.framework/Headers/GPChannelSDKCore.h +19 -0
- package/ios/GPChannelSDKCore.xcframework/ios-arm64/GPChannelSDKCore.framework/Info.plist +0 -0
- package/ios/GPChannelSDKCore.xcframework/ios-arm64/GPChannelSDKCore.framework/Modules/module.modulemap +7 -0
- package/ios/GPChannelSDKCore.xcframework/ios-arm64/GPChannelSDKCore.framework/_CodeSignature/CodeResources +147 -0
- package/ios/GPChannelSDKCore.xcframework/ios-arm64_x86_64-simulator/GPChannelSDKCore.framework/GPChannelSDKCore +0 -0
- package/ios/GPChannelSDKCore.xcframework/ios-arm64_x86_64-simulator/GPChannelSDKCore.framework/Headers/GPChannelSDK.h +315 -0
- package/ios/GPChannelSDKCore.xcframework/ios-arm64_x86_64-simulator/GPChannelSDKCore.framework/Headers/GPChannelSDKCore.h +19 -0
- package/ios/GPChannelSDKCore.xcframework/ios-arm64_x86_64-simulator/GPChannelSDKCore.framework/Info.plist +0 -0
- package/ios/GPChannelSDKCore.xcframework/ios-arm64_x86_64-simulator/GPChannelSDKCore.framework/Modules/module.modulemap +7 -0
- package/ios/GPChannelSDKCore.xcframework/ios-arm64_x86_64-simulator/GPChannelSDKCore.framework/_CodeSignature/CodeResources +147 -0
- package/ios/ReactNativeLiteCard.h +5 -0
- package/ios/ReactNativeLiteCard.mm +222 -0
- package/lib/module/NativeReactNativeLiteCard.js +25 -0
- package/lib/module/NativeReactNativeLiteCard.js.map +1 -0
- package/lib/module/index.js +71 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/typescript/package.json +1 -0
- package/lib/typescript/src/NativeReactNativeLiteCard.d.ts +59 -0
- package/lib/typescript/src/NativeReactNativeLiteCard.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +23 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/package.json +168 -0
- package/src/NativeReactNativeLiteCard.ts +112 -0
- 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,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
|
+
}
|