@onekeyfe/react-native-jpush 0.0.0-stage → 6.7.0-alpha.436
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 +21 -0
- package/README.md +39 -2
- package/ReactNativeJpush.podspec +66 -0
- package/android/CMakeLists.txt +24 -0
- package/android/build.gradle +143 -0
- package/android/fcm/build.gradle +29 -0
- package/android/fcm/consumer-rules.pro +2 -0
- package/android/fcm/src/main/AndroidManifest.xml +16 -0
- package/android/fcm/src/main/java/com/onekey/jpush/fcm/FcmMessagingService.java +72 -0
- package/android/fcm/src/main/java/com/onekey/jpush/fcm/FcmPushManager.java +69 -0
- package/android/gradle.properties +4 -0
- package/android/src/main/AndroidManifest.xml +143 -0
- package/android/src/main/cpp/cpp-adapter.cpp +6 -0
- package/android/src/main/java/cn/android/service/JTransitActivity.java +19 -0
- package/android/src/main/java/cn/jiguang/android/BuildConfig.java +10 -0
- package/android/src/main/java/cn/jiguang/android/IDataShare.java +190 -0
- package/android/src/main/java/cn/jiguang/api/BaseLogger.java +82 -0
- package/android/src/main/java/cn/jiguang/api/JAction.java +22 -0
- package/android/src/main/java/cn/jiguang/api/JActionExtra.java +21 -0
- package/android/src/main/java/cn/jiguang/api/JAnalyticsAction.java +11 -0
- package/android/src/main/java/cn/jiguang/api/JCoreInterface.java +228 -0
- package/android/src/main/java/cn/jiguang/api/JCoreManager.java +156 -0
- package/android/src/main/java/cn/jiguang/api/JDispatchAction.java +66 -0
- package/android/src/main/java/cn/jiguang/api/MultiSpHelper.java +114 -0
- package/android/src/main/java/cn/jiguang/api/ReportCallBack.java +9 -0
- package/android/src/main/java/cn/jiguang/api/SdkType.java +13 -0
- package/android/src/main/java/cn/jiguang/api/utils/JCollectionAuth.java +23 -0
- package/android/src/main/java/cn/jiguang/core/JCoreCrypto.java +545 -0
- package/android/src/main/java/cn/jiguang/core/JCoreStorage.java +737 -0
- package/android/src/main/java/cn/jiguang/core/JCoreTcpEngine.java +1395 -0
- package/android/src/main/java/cn/jiguang/core/JCoreWireCodec.java +1716 -0
- package/android/src/main/java/cn/jiguang/internal/ActionManager.java +63 -0
- package/android/src/main/java/cn/jiguang/internal/JConstants.java +61 -0
- package/android/src/main/java/cn/jiguang/internal/JCoreHelperAction.java +12 -0
- package/android/src/main/java/cn/jiguang/internal/JCoreInternalHelper.java +102 -0
- package/android/src/main/java/cn/jiguang/net/DefaultHostVerifier.java +40 -0
- package/android/src/main/java/cn/jiguang/net/HttpRequest.java +78 -0
- package/android/src/main/java/cn/jiguang/net/HttpResponse.java +48 -0
- package/android/src/main/java/cn/jiguang/net/HttpUtils.java +106 -0
- package/android/src/main/java/cn/jiguang/plugins/core/JCoreModule.java +91 -0
- package/android/src/main/java/cn/jiguang/plugins/core/JCorePackage.java +27 -0
- package/android/src/main/java/cn/jiguang/plugins/push/JPushModule.java +773 -0
- package/android/src/main/java/cn/jiguang/plugins/push/JPushPackage.java +25 -0
- package/android/src/main/java/cn/jiguang/plugins/push/common/JConstants.java +88 -0
- package/android/src/main/java/cn/jiguang/plugins/push/common/JLogger.java +122 -0
- package/android/src/main/java/cn/jiguang/plugins/push/helper/JPushHelper.java +710 -0
- package/android/src/main/java/cn/jiguang/plugins/push/receiver/JPushBroadcastReceiver.java +37 -0
- package/android/src/main/java/cn/jiguang/plugins/push/receiver/JPushModuleReceiver.java +264 -0
- package/android/src/main/java/cn/jiguang/plugins/service/JCoreModuleService.java +7 -0
- package/android/src/main/java/cn/jpush/android/api/BasicPushNotificationBuilder.java +83 -0
- package/android/src/main/java/cn/jpush/android/api/CallBackParams.java +50 -0
- package/android/src/main/java/cn/jpush/android/api/CmdMessage.java +33 -0
- package/android/src/main/java/cn/jpush/android/api/CustomMessage.java +28 -0
- package/android/src/main/java/cn/jpush/android/api/CustomPushNotificationBuilder.java +81 -0
- package/android/src/main/java/cn/jpush/android/api/DefaultPushNotificationBuilder.java +90 -0
- package/android/src/main/java/cn/jpush/android/api/InAppSlotParams.java +65 -0
- package/android/src/main/java/cn/jpush/android/api/InstrumentedActivity.java +17 -0
- package/android/src/main/java/cn/jpush/android/api/InstrumentedListActivity.java +17 -0
- package/android/src/main/java/cn/jpush/android/api/JPushInterface.java +490 -0
- package/android/src/main/java/cn/jpush/android/api/JPushMessage.java +121 -0
- package/android/src/main/java/cn/jpush/android/api/JThirdPlatFormInterface.java +247 -0
- package/android/src/main/java/cn/jpush/android/api/MultiActionsNotificationBuilder.java +72 -0
- package/android/src/main/java/cn/jpush/android/api/NotificationCustomButton.java +50 -0
- package/android/src/main/java/cn/jpush/android/api/NotificationMessage.java +67 -0
- package/android/src/main/java/cn/jpush/android/api/PushNotificationBuilder.java +13 -0
- package/android/src/main/java/cn/jpush/android/api/TagAliasCallback.java +8 -0
- package/android/src/main/java/cn/jpush/android/data/JPushCollectControl.java +96 -0
- package/android/src/main/java/cn/jpush/android/data/JPushConfig.java +79 -0
- package/android/src/main/java/cn/jpush/android/data/JPushConfigEx.java +41 -0
- package/android/src/main/java/cn/jpush/android/data/JPushLocalNotification.java +155 -0
- package/android/src/main/java/cn/jpush/android/helper/JCoreHelper.java +70 -0
- package/android/src/main/java/cn/jpush/android/helper/Logger.java +82 -0
- package/android/src/main/java/cn/jpush/android/local/ActionHelper.java +1277 -0
- package/android/src/main/java/cn/jpush/android/local/ActivityLifeCallBack.java +47 -0
- package/android/src/main/java/cn/jpush/android/local/JPushAction.java +67 -0
- package/android/src/main/java/cn/jpush/android/local/JPushConstants.java +34 -0
- package/android/src/main/java/cn/jpush/android/local/JPushResponse.java +26 -0
- package/android/src/main/java/cn/jpush/android/local/ProxyActivityAction.java +34 -0
- package/android/src/main/java/cn/jpush/android/service/AlarmReceiver.java +15 -0
- package/android/src/main/java/cn/jpush/android/service/BActivity.java +19 -0
- package/android/src/main/java/cn/jpush/android/service/DActivity.java +19 -0
- package/android/src/main/java/cn/jpush/android/service/DaemonService.java +17 -0
- package/android/src/main/java/cn/jpush/android/service/DataProvider.java +136 -0
- package/android/src/main/java/cn/jpush/android/service/DataShare.java +129 -0
- package/android/src/main/java/cn/jpush/android/service/DownloadProvider.java +139 -0
- package/android/src/main/java/cn/jpush/android/service/InitProvider.java +48 -0
- package/android/src/main/java/cn/jpush/android/service/JCommonService.java +79 -0
- package/android/src/main/java/cn/jpush/android/service/JNotifyActivity.java +28 -0
- package/android/src/main/java/cn/jpush/android/service/JPushMessageReceiver.java +94 -0
- package/android/src/main/java/cn/jpush/android/service/PushReceiver.java +26 -0
- package/android/src/main/java/cn/jpush/android/service/PushService.java +28 -0
- package/android/src/main/java/cn/jpush/android/service/SchedulerReceiver.java +17 -0
- package/android/src/main/java/cn/jpush/android/service/TagAliasReceiver.java +11 -0
- package/android/src/main/java/cn/jpush/android/service/WakedResultReceiver.java +24 -0
- package/android/src/main/java/cn/jpush/android/ui/FullScreenView.java +11 -0
- package/android/src/main/java/cn/jpush/android/ui/PopWinActivity.java +16 -0
- package/android/src/main/java/cn/jpush/android/ui/PushActivity.java +27 -0
- package/android/src/main/java/cn/jpush/android/ui/RoundedImageView.java +63 -0
- package/android/src/main/java/cn/jpush/android/ui/ShadowViewCard.java +56 -0
- package/android/src/main/java/cn/jpush/android/ups/ICallbackResult.java +5 -0
- package/android/src/main/java/cn/jpush/android/ups/JPushUPSManager.java +37 -0
- package/android/src/main/java/cn/jpush/android/ups/TokenResult.java +47 -0
- package/android/src/main/java/cn/jpush/android/ups/UPSRegisterCallBack.java +4 -0
- package/android/src/main/java/cn/jpush/android/ups/UPSTurnCallBack.java +4 -0
- package/android/src/main/java/cn/jpush/android/ups/UPSUnRegisterCallBack.java +4 -0
- package/android/src/main/java/com/margelo/nitro/reactnativejpush/ReactNativeJpush.kt +455 -0
- package/android/src/main/java/com/margelo/nitro/reactnativejpush/ReactNativeJpushPackage.kt +50 -0
- package/android/src/main/res/values/jpush_string.xml +7 -0
- package/android/src/main/res/values/jpush_style.xml +22 -0
- package/android/src/test/java/com/margelo/nitro/reactnativejpush/ReactNativeJpushProtocolTest.java +1016 -0
- package/ios/ReactNativeJpush.swift +522 -0
- package/ios/bridge/RCTJCoreModule.h +5 -0
- package/ios/bridge/RCTJCoreModule.m +31 -0
- package/ios/bridge/RCTJPushEventQueue.h +14 -0
- package/ios/bridge/RCTJPushEventQueue.m +23 -0
- package/ios/bridge/RCTJPushModule.h +37 -0
- package/ios/bridge/RCTJPushModule.m +1165 -0
- package/ios/include/JCOREService.h +3 -0
- package/ios/include/JGCOREAPI.h +14 -0
- package/ios/include/JGInforCollectionAuth.h +17 -0
- package/ios/include/JGInforCollectionAuthItems.h +2 -0
- package/ios/include/JGPushNotificationTrigger.h +2 -0
- package/ios/include/JPUSHService.h +359 -0
- package/ios/jcore/JCOREConfiguration.h +141 -0
- package/ios/jcore/JCOREConfiguration.m +703 -0
- package/ios/jcore/JCORECrypto.h +73 -0
- package/ios/jcore/JCORECrypto.m +649 -0
- package/ios/jcore/JCORESisResolver.h +56 -0
- package/ios/jcore/JCORESisResolver.m +525 -0
- package/ios/jcore/JCORETcpSession.h +42 -0
- package/ios/jcore/JCORETcpSession.m +956 -0
- package/ios/jcore/JCOREWireProtocol.h +274 -0
- package/ios/jcore/JCOREWireProtocol.m +1453 -0
- package/ios/jpush/JPUSHModels.m +214 -0
- package/ios/jpush/JPUSHNotificationManager.h +34 -0
- package/ios/jpush/JPUSHNotificationManager.m +360 -0
- package/ios/jpush/JPUSHService.m +794 -0
- package/ios/tests/ReactNativeJpushTests.m +148 -0
- package/lib/module/ReactNativeJpush.nitro.js +4 -0
- package/lib/module/ReactNativeJpush.nitro.js.map +1 -0
- package/lib/module/index.js +801 -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/ReactNativeJpush.nitro.d.ts +60 -0
- package/lib/typescript/src/ReactNativeJpush.nitro.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +235 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/nitro.json +23 -0
- package/nitrogen/generated/android/c++/JFunc_void_bool.hpp +75 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__string_std__string.hpp +76 -0
- package/nitrogen/generated/android/c++/JHybridReactNativeJpushSpec.cpp +310 -0
- package/nitrogen/generated/android/c++/JHybridReactNativeJpushSpec.hpp +115 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativejpush/Func_void_bool.kt +78 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativejpush/Func_void_std__string_std__string.kt +78 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativejpush/HybridReactNativeJpushSpec.kt +274 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativejpush/reactnativejpushOnLoad.kt +35 -0
- package/nitrogen/generated/android/reactnativejpush+autolinking.cmake +81 -0
- package/nitrogen/generated/android/reactnativejpush+autolinking.gradle +27 -0
- package/nitrogen/generated/android/reactnativejpushOnLoad.cpp +58 -0
- package/nitrogen/generated/android/reactnativejpushOnLoad.hpp +34 -0
- package/nitrogen/generated/ios/ReactNativeJpush+autolinking.rb +62 -0
- package/nitrogen/generated/ios/ReactNativeJpush-Swift-Cxx-Bridge.cpp +49 -0
- package/nitrogen/generated/ios/ReactNativeJpush-Swift-Cxx-Bridge.hpp +147 -0
- package/nitrogen/generated/ios/ReactNativeJpush-Swift-Cxx-Umbrella.hpp +46 -0
- package/nitrogen/generated/ios/ReactNativeJpushAutolinking.mm +33 -0
- package/nitrogen/generated/ios/ReactNativeJpushAutolinking.swift +26 -0
- package/nitrogen/generated/ios/c++/HybridReactNativeJpushSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridReactNativeJpushSpecSwift.hpp +402 -0
- package/nitrogen/generated/ios/swift/Func_void_bool.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_std__string_std__string.swift +46 -0
- package/nitrogen/generated/ios/swift/HybridReactNativeJpushSpec.swift +107 -0
- package/nitrogen/generated/ios/swift/HybridReactNativeJpushSpec_cxx.swift +723 -0
- package/nitrogen/generated/shared/c++/HybridReactNativeJpushSpec.cpp +73 -0
- package/nitrogen/generated/shared/c++/HybridReactNativeJpushSpec.hpp +116 -0
- package/package.json +174 -4
- package/src/ReactNativeJpush.nitro.ts +93 -0
- package/src/index.tsx +1090 -0
|
@@ -0,0 +1,649 @@
|
|
|
1
|
+
#import "JCORECrypto.h"
|
|
2
|
+
#import <CommonCrypto/CommonCryptor.h>
|
|
3
|
+
#import <CommonCrypto/CommonDigest.h>
|
|
4
|
+
#import <CommonCrypto/CommonHMAC.h>
|
|
5
|
+
#import <Security/Security.h>
|
|
6
|
+
#import <zlib.h>
|
|
7
|
+
|
|
8
|
+
typedef struct {
|
|
9
|
+
int mode;
|
|
10
|
+
uint32_t sk[32];
|
|
11
|
+
} JCORESm4Context;
|
|
12
|
+
|
|
13
|
+
static const uint8_t kJCORESm4SBox[256] = {
|
|
14
|
+
0xd6, 0x90, 0xe9, 0xfe, 0xcc, 0xe1, 0x3d, 0xb7, 0x16, 0xb6, 0x14, 0xc2, 0x28, 0xfb, 0x2c, 0x05,
|
|
15
|
+
0x2b, 0x67, 0x9a, 0x76, 0x2a, 0xbe, 0x04, 0xc3, 0xaa, 0x44, 0x13, 0x26, 0x49, 0x86, 0x06, 0x99,
|
|
16
|
+
0x9c, 0x42, 0x50, 0xf4, 0x91, 0xef, 0x98, 0x7a, 0x33, 0x54, 0x0b, 0x43, 0xed, 0xcf, 0xac, 0x62,
|
|
17
|
+
0xe4, 0xb3, 0x1c, 0xa9, 0xc9, 0x08, 0xe8, 0x95, 0x80, 0xdf, 0x94, 0xfa, 0x75, 0x8f, 0x3f, 0xa6,
|
|
18
|
+
0x47, 0x07, 0xa7, 0xfc, 0xf3, 0x73, 0x17, 0xba, 0x83, 0x59, 0x3c, 0x19, 0xe6, 0x85, 0x4f, 0xa8,
|
|
19
|
+
0x68, 0x6b, 0x81, 0xb2, 0x71, 0x64, 0xda, 0x8b, 0xf8, 0xeb, 0x0f, 0x4b, 0x70, 0x56, 0x9d, 0x35,
|
|
20
|
+
0x1e, 0x24, 0x0e, 0x5e, 0x63, 0x58, 0xd1, 0xa2, 0x25, 0x22, 0x7c, 0x3b, 0x01, 0x21, 0x78, 0x87,
|
|
21
|
+
0xd4, 0x00, 0x46, 0x57, 0x9f, 0xd3, 0x27, 0x52, 0x4c, 0x36, 0x02, 0xe7, 0xa0, 0xc4, 0xc8, 0x9e,
|
|
22
|
+
0xea, 0xbf, 0x8a, 0xd2, 0x40, 0xc7, 0x38, 0xb5, 0xa3, 0xf7, 0xf2, 0xce, 0xf9, 0x61, 0x15, 0xa1,
|
|
23
|
+
0xe0, 0xae, 0x5d, 0xa4, 0x9b, 0x34, 0x1a, 0x55, 0xad, 0x93, 0x32, 0x30, 0xf5, 0x8c, 0xb1, 0xe3,
|
|
24
|
+
0x1d, 0xf6, 0xe2, 0x2e, 0x82, 0x66, 0xca, 0x60, 0xc0, 0x29, 0x23, 0xab, 0x0d, 0x53, 0x4e, 0x6f,
|
|
25
|
+
0xd5, 0xdb, 0x37, 0x45, 0xde, 0xfd, 0x8e, 0x2f, 0x03, 0xff, 0x6a, 0x72, 0x6d, 0x6c, 0x5b, 0x51,
|
|
26
|
+
0x8d, 0x1b, 0xaf, 0x92, 0xbb, 0xdd, 0xbc, 0x7f, 0x11, 0xd9, 0x5c, 0x41, 0x1f, 0x10, 0x5a, 0xd8,
|
|
27
|
+
0x0a, 0xc1, 0x31, 0x88, 0xa5, 0xcd, 0x7b, 0xbd, 0x2d, 0x74, 0xd0, 0x12, 0xb8, 0xe5, 0xb4, 0xb0,
|
|
28
|
+
0x89, 0x69, 0x97, 0x4a, 0x0c, 0x96, 0x77, 0x7e, 0x65, 0xb9, 0xf1, 0x09, 0xc5, 0x6e, 0xc6, 0x84,
|
|
29
|
+
0x18, 0xf0, 0x7d, 0xec, 0x3a, 0xdc, 0x4d, 0x20, 0x79, 0xee, 0x5f, 0x3e, 0xd7, 0xcb, 0x39, 0x48,
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
static inline uint32_t JCORESm4RotateLeft(uint32_t value, unsigned int shift) {
|
|
33
|
+
return (value << shift) | (value >> (32U - shift));
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
static inline uint32_t JCORESm4SubstituteWord(uint32_t value) {
|
|
37
|
+
return ((uint32_t)kJCORESm4SBox[(value >> 24) & 0xFF] << 24) |
|
|
38
|
+
((uint32_t)kJCORESm4SBox[(value >> 16) & 0xFF] << 16) |
|
|
39
|
+
((uint32_t)kJCORESm4SBox[(value >> 8) & 0xFF] << 8) |
|
|
40
|
+
(uint32_t)kJCORESm4SBox[value & 0xFF];
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
static inline uint32_t JCORESm4ReadBE32(const uint8_t *bytes) {
|
|
44
|
+
return ((uint32_t)bytes[0] << 24) |
|
|
45
|
+
((uint32_t)bytes[1] << 16) |
|
|
46
|
+
((uint32_t)bytes[2] << 8) |
|
|
47
|
+
(uint32_t)bytes[3];
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
static inline void JCORESm4WriteBE32(uint8_t *bytes, uint32_t value) {
|
|
51
|
+
bytes[0] = (uint8_t)(value >> 24);
|
|
52
|
+
bytes[1] = (uint8_t)(value >> 16);
|
|
53
|
+
bytes[2] = (uint8_t)(value >> 8);
|
|
54
|
+
bytes[3] = (uint8_t)value;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
static void JCORESm4InitKeySchedule(JCORESm4Context *ctx, const uint8_t key[16], BOOL decrypt) {
|
|
58
|
+
static const uint32_t kFK[4] = { 0xa3b1bac6U, 0x56aa3350U, 0x677d9197U, 0xb27022dcU };
|
|
59
|
+
uint32_t words[36];
|
|
60
|
+
for (unsigned int i = 0; i < 4; i++) {
|
|
61
|
+
words[i] = JCORESm4ReadBE32(key + i * 4) ^ kFK[i];
|
|
62
|
+
}
|
|
63
|
+
for (unsigned int i = 0; i < 32; i++) {
|
|
64
|
+
uint32_t ck = 0;
|
|
65
|
+
for (unsigned int j = 0; j < 4; j++) {
|
|
66
|
+
ck = (ck << 8) | (((i * 4 + j) * 7) & 0xFF);
|
|
67
|
+
}
|
|
68
|
+
uint32_t t = JCORESm4SubstituteWord(words[i + 1] ^ words[i + 2] ^ words[i + 3] ^ ck);
|
|
69
|
+
words[i + 4] = words[i] ^ t ^ JCORESm4RotateLeft(t, 13) ^ JCORESm4RotateLeft(t, 23);
|
|
70
|
+
ctx->sk[decrypt ? (31 - i) : i] = words[i + 4];
|
|
71
|
+
}
|
|
72
|
+
ctx->mode = decrypt ? 0 : 1;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
static void JCORESm4ProcessBlock(const uint32_t sk[32], const uint8_t input[16], uint8_t output[16]) {
|
|
76
|
+
uint32_t words[36];
|
|
77
|
+
for (unsigned int i = 0; i < 4; i++) {
|
|
78
|
+
words[i] = JCORESm4ReadBE32(input + i * 4);
|
|
79
|
+
}
|
|
80
|
+
for (unsigned int i = 0; i < 32; i++) {
|
|
81
|
+
uint32_t t = JCORESm4SubstituteWord(words[i + 1] ^ words[i + 2] ^ words[i + 3] ^ sk[i]);
|
|
82
|
+
words[i + 4] = words[i] ^ t ^ JCORESm4RotateLeft(t, 2) ^ JCORESm4RotateLeft(t, 10) ^
|
|
83
|
+
JCORESm4RotateLeft(t, 18) ^ JCORESm4RotateLeft(t, 24);
|
|
84
|
+
}
|
|
85
|
+
for (unsigned int i = 0; i < 4; i++) {
|
|
86
|
+
JCORESm4WriteBE32(output + i * 4, words[35 - i]);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
static BOOL JCORESm4DecodeHexKey16(NSString *hexKey, uint8_t outKey[16]) {
|
|
91
|
+
if (hexKey.length != 32) {
|
|
92
|
+
return NO;
|
|
93
|
+
}
|
|
94
|
+
const char *cstr = hexKey.UTF8String;
|
|
95
|
+
if (cstr == NULL) {
|
|
96
|
+
return NO;
|
|
97
|
+
}
|
|
98
|
+
for (int i = 0; i < 16; i++) {
|
|
99
|
+
char hi = cstr[i * 2];
|
|
100
|
+
char lo = cstr[i * 2 + 1];
|
|
101
|
+
uint8_t hiVal = 0;
|
|
102
|
+
uint8_t loVal = 0;
|
|
103
|
+
if (hi >= '0' && hi <= '9') hiVal = (uint8_t)(hi - '0');
|
|
104
|
+
else if (hi >= 'a' && hi <= 'f') hiVal = (uint8_t)(10 + hi - 'a');
|
|
105
|
+
else if (hi >= 'A' && hi <= 'F') hiVal = (uint8_t)(10 + hi - 'A');
|
|
106
|
+
else return NO;
|
|
107
|
+
|
|
108
|
+
if (lo >= '0' && lo <= '9') loVal = (uint8_t)(lo - '0');
|
|
109
|
+
else if (lo >= 'a' && lo <= 'f') loVal = (uint8_t)(10 + lo - 'a');
|
|
110
|
+
else if (lo >= 'A' && lo <= 'F') loVal = (uint8_t)(10 + lo - 'A');
|
|
111
|
+
else return NO;
|
|
112
|
+
|
|
113
|
+
outKey[i] = (uint8_t)((hiVal << 4) | loVal);
|
|
114
|
+
}
|
|
115
|
+
return YES;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
static NSData *JCORESm4StripPkcs7Padding(NSData *decrypted) {
|
|
119
|
+
if (decrypted.length == 0 || (decrypted.length % 16) != 0) {
|
|
120
|
+
return nil;
|
|
121
|
+
}
|
|
122
|
+
const uint8_t *bytes = decrypted.bytes;
|
|
123
|
+
NSUInteger length = decrypted.length;
|
|
124
|
+
uint8_t pad = bytes[length - 1];
|
|
125
|
+
if (pad == 0 || pad > 16 || pad > length) {
|
|
126
|
+
return decrypted;
|
|
127
|
+
}
|
|
128
|
+
for (NSUInteger i = 1; i < pad; i++) {
|
|
129
|
+
if (bytes[length - 1 - i] != pad) {
|
|
130
|
+
return decrypted;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return [NSData dataWithBytes:bytes length:length - pad];
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
@implementation JCORECrypto
|
|
137
|
+
|
|
138
|
+
+ (NSString *)generateSeedKey:(uint64_t)seed {
|
|
139
|
+
static const uint32_t kMultipliers[10] = { 8, 5, 23, 3, 13, 17, 7, 31, 29, 37 };
|
|
140
|
+
static const uint32_t kModuli[10] = { 74, 88, 15, 73, 96, 49, 68, 39, 41, 91 };
|
|
141
|
+
NSUInteger index = (NSUInteger)(seed % 10ULL);
|
|
142
|
+
uint64_t transformed = seed * kMultipliers[index] + (seed % kModuli[index]);
|
|
143
|
+
NSString *source = [NSString stringWithFormat:@"JCKP%lld", (long long)transformed];
|
|
144
|
+
return [self md5Hex:source];
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
+ (NSString *)seedKeyForSeed:(uint64_t)seed {
|
|
148
|
+
return [self generateSeedKey:seed];
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
+ (NSString *)httpSeedKeyWithOutSeed:(uint32_t *)outSeed {
|
|
152
|
+
uint32_t randomSeed = arc4random();
|
|
153
|
+
if (randomSeed == 0) {
|
|
154
|
+
randomSeed = 1;
|
|
155
|
+
}
|
|
156
|
+
if (outSeed != NULL) {
|
|
157
|
+
*outSeed = randomSeed;
|
|
158
|
+
}
|
|
159
|
+
return [self generateSeedKey:randomSeed];
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
+ (NSData *)cryptData:(NSData *)data
|
|
163
|
+
key:(NSString *)key
|
|
164
|
+
iv:(const void *)iv
|
|
165
|
+
keySize:(size_t)keySize
|
|
166
|
+
operation:(CCOperation)operation
|
|
167
|
+
options:(CCOptions)options {
|
|
168
|
+
if (data.length == 0 || key.length == 0) {
|
|
169
|
+
return nil;
|
|
170
|
+
}
|
|
171
|
+
char keyBuffer[kCCKeySizeAES256 + 1];
|
|
172
|
+
memset(keyBuffer, 0, sizeof(keyBuffer));
|
|
173
|
+
[key getCString:keyBuffer maxLength:sizeof(keyBuffer) encoding:NSUTF8StringEncoding];
|
|
174
|
+
|
|
175
|
+
size_t actualKeySize = (keySize == kCCKeySizeAES128 || keySize == kCCKeySizeAES256)
|
|
176
|
+
? keySize
|
|
177
|
+
: (key.length >= kCCKeySizeAES256 ? kCCKeySizeAES256 : kCCKeySizeAES128);
|
|
178
|
+
|
|
179
|
+
size_t bufferSize = data.length + kCCBlockSizeAES128;
|
|
180
|
+
void *buffer = malloc(bufferSize);
|
|
181
|
+
if (buffer == NULL) {
|
|
182
|
+
return nil;
|
|
183
|
+
}
|
|
184
|
+
size_t bytesProcessed = 0;
|
|
185
|
+
CCCryptorStatus status = CCCrypt(
|
|
186
|
+
operation,
|
|
187
|
+
kCCAlgorithmAES,
|
|
188
|
+
options,
|
|
189
|
+
keyBuffer,
|
|
190
|
+
actualKeySize,
|
|
191
|
+
iv,
|
|
192
|
+
data.bytes,
|
|
193
|
+
data.length,
|
|
194
|
+
buffer,
|
|
195
|
+
bufferSize,
|
|
196
|
+
&bytesProcessed
|
|
197
|
+
);
|
|
198
|
+
if (status == kCCSuccess) {
|
|
199
|
+
return [NSData dataWithBytesNoCopy:buffer length:bytesProcessed freeWhenDone:YES];
|
|
200
|
+
}
|
|
201
|
+
free(buffer);
|
|
202
|
+
return nil;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
+ (NSData *)aesCbcEncrypt:(NSData *)data
|
|
206
|
+
key:(NSString *)key
|
|
207
|
+
iv:(const void *)iv
|
|
208
|
+
keySize:(size_t)keySize {
|
|
209
|
+
return [self cryptData:data
|
|
210
|
+
key:key
|
|
211
|
+
iv:iv
|
|
212
|
+
keySize:keySize
|
|
213
|
+
operation:kCCEncrypt
|
|
214
|
+
options:kCCOptionPKCS7Padding];
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
+ (NSData *)aesCbcDecrypt:(NSData *)data
|
|
218
|
+
key:(NSString *)key
|
|
219
|
+
iv:(const void *)iv
|
|
220
|
+
keySize:(size_t)keySize {
|
|
221
|
+
return [self cryptData:data
|
|
222
|
+
key:key
|
|
223
|
+
iv:iv
|
|
224
|
+
keySize:keySize
|
|
225
|
+
operation:kCCDecrypt
|
|
226
|
+
options:kCCOptionPKCS7Padding];
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
+ (NSData *)aesEcbEncrypt:(NSData *)data
|
|
230
|
+
key:(NSString *)key
|
|
231
|
+
keySize:(size_t)keySize {
|
|
232
|
+
return [self cryptData:data
|
|
233
|
+
key:key
|
|
234
|
+
iv:NULL
|
|
235
|
+
keySize:keySize
|
|
236
|
+
operation:kCCEncrypt
|
|
237
|
+
options:(kCCOptionPKCS7Padding | kCCOptionECBMode)];
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
+ (NSData *)aesEcbDecrypt:(NSData *)data
|
|
241
|
+
key:(NSString *)key
|
|
242
|
+
keySize:(size_t)keySize {
|
|
243
|
+
return [self cryptData:data
|
|
244
|
+
key:key
|
|
245
|
+
iv:NULL
|
|
246
|
+
keySize:keySize
|
|
247
|
+
operation:kCCDecrypt
|
|
248
|
+
options:(kCCOptionPKCS7Padding | kCCOptionECBMode)];
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
+ (NSData *)fixedHttpReportIvData {
|
|
252
|
+
static NSData *ivData = nil;
|
|
253
|
+
static dispatch_once_t onceToken;
|
|
254
|
+
dispatch_once(&onceToken, ^{
|
|
255
|
+
ivData = [[NSData alloc] initWithBase64EncodedString:@"aW9wMjAzMDQwNTA2YVBrIQ==" options:0];
|
|
256
|
+
});
|
|
257
|
+
return ivData;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
+ (NSData *)aes256CBCEncryptWithFixedHttpIV:(NSData *)data
|
|
261
|
+
key:(NSString *)key {
|
|
262
|
+
NSData *ivData = [self fixedHttpReportIvData];
|
|
263
|
+
if (ivData.length < 16) {
|
|
264
|
+
return nil;
|
|
265
|
+
}
|
|
266
|
+
return [self aesCbcEncrypt:data key:key iv:ivData.bytes keySize:kCCKeySizeAES256];
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
+ (NSData *)aes256CBCDecryptWithFixedHttpIV:(NSData *)data
|
|
270
|
+
key:(NSString *)key {
|
|
271
|
+
NSData *ivData = [self fixedHttpReportIvData];
|
|
272
|
+
if (ivData.length < 16) {
|
|
273
|
+
return nil;
|
|
274
|
+
}
|
|
275
|
+
return [self aesCbcDecrypt:data key:key iv:ivData.bytes keySize:kCCKeySizeAES256];
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
+ (NSData *)aes128CBCEncryptData:(NSData *)data
|
|
279
|
+
key16:(NSString *)key16
|
|
280
|
+
iv16:(NSString *)iv16 {
|
|
281
|
+
if (key16.length < 16 || iv16.length < 16) {
|
|
282
|
+
return nil;
|
|
283
|
+
}
|
|
284
|
+
return [self aesCbcEncrypt:data key:key16 iv:iv16.UTF8String keySize:kCCKeySizeAES128];
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
+ (NSData *)aes128CBCDecryptData:(NSData *)data
|
|
288
|
+
key16:(NSString *)key16
|
|
289
|
+
iv16:(NSString *)iv16 {
|
|
290
|
+
if (key16.length < 16 || iv16.length < 16) {
|
|
291
|
+
return nil;
|
|
292
|
+
}
|
|
293
|
+
return [self aesCbcDecrypt:data key:key16 iv:iv16.UTF8String keySize:kCCKeySizeAES128];
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
+ (NSData *)sm4CBCEncryptData:(NSData *)data
|
|
297
|
+
withKey:(NSString *)hexKey
|
|
298
|
+
iv:(const char *)iv {
|
|
299
|
+
if (data == nil || iv == NULL) {
|
|
300
|
+
return nil;
|
|
301
|
+
}
|
|
302
|
+
uint8_t rawKey[16];
|
|
303
|
+
if (!JCORESm4DecodeHexKey16(hexKey, rawKey)) {
|
|
304
|
+
return nil;
|
|
305
|
+
}
|
|
306
|
+
uint8_t padding = (uint8_t)(16 - (data.length % 16));
|
|
307
|
+
NSMutableData *padded = [NSMutableData dataWithLength:data.length + padding];
|
|
308
|
+
memset(padded.mutableBytes, padding, padded.length);
|
|
309
|
+
if (data.length > 0) {
|
|
310
|
+
memcpy(padded.mutableBytes, data.bytes, data.length);
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
JCORESm4Context ctx;
|
|
314
|
+
JCORESm4InitKeySchedule(&ctx, rawKey, NO);
|
|
315
|
+
|
|
316
|
+
uint8_t currentIv[16];
|
|
317
|
+
memcpy(currentIv, iv, 16);
|
|
318
|
+
|
|
319
|
+
NSMutableData *output = [NSMutableData dataWithLength:padded.length];
|
|
320
|
+
const uint8_t *inBytes = padded.bytes;
|
|
321
|
+
uint8_t *outBytes = output.mutableBytes;
|
|
322
|
+
for (NSUInteger offset = 0; offset < padded.length; offset += 16) {
|
|
323
|
+
uint8_t xored[16];
|
|
324
|
+
for (int i = 0; i < 16; i++) {
|
|
325
|
+
xored[i] = inBytes[offset + i] ^ currentIv[i];
|
|
326
|
+
}
|
|
327
|
+
JCORESm4ProcessBlock(ctx.sk, xored, outBytes + offset);
|
|
328
|
+
memcpy(currentIv, outBytes + offset, 16);
|
|
329
|
+
}
|
|
330
|
+
return output;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
+ (NSData *)sm4CBCDecryptData:(NSData *)data
|
|
334
|
+
withKey:(NSString *)hexKey
|
|
335
|
+
iv:(const char *)iv {
|
|
336
|
+
if (data.length == 0 || (data.length % 16) != 0 || iv == NULL) {
|
|
337
|
+
return nil;
|
|
338
|
+
}
|
|
339
|
+
uint8_t rawKey[16];
|
|
340
|
+
if (!JCORESm4DecodeHexKey16(hexKey, rawKey)) {
|
|
341
|
+
return nil;
|
|
342
|
+
}
|
|
343
|
+
JCORESm4Context ctx;
|
|
344
|
+
JCORESm4InitKeySchedule(&ctx, rawKey, YES);
|
|
345
|
+
|
|
346
|
+
uint8_t currentIv[16];
|
|
347
|
+
memcpy(currentIv, iv, 16);
|
|
348
|
+
|
|
349
|
+
NSMutableData *output = [NSMutableData dataWithLength:data.length];
|
|
350
|
+
const uint8_t *inBytes = data.bytes;
|
|
351
|
+
uint8_t *outBytes = output.mutableBytes;
|
|
352
|
+
for (NSUInteger offset = 0; offset < data.length; offset += 16) {
|
|
353
|
+
uint8_t savedCipher[16];
|
|
354
|
+
memcpy(savedCipher, inBytes + offset, 16);
|
|
355
|
+
JCORESm4ProcessBlock(ctx.sk, inBytes + offset, outBytes + offset);
|
|
356
|
+
for (int i = 0; i < 16; i++) {
|
|
357
|
+
outBytes[offset + i] ^= currentIv[i];
|
|
358
|
+
}
|
|
359
|
+
memcpy(currentIv, savedCipher, 16);
|
|
360
|
+
}
|
|
361
|
+
return JCORESm4StripPkcs7Padding(output);
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
+ (NSData *)sm4ECBEncryptData:(NSData *)data
|
|
365
|
+
withKey:(NSString *)hexKey {
|
|
366
|
+
if (data == nil) {
|
|
367
|
+
return nil;
|
|
368
|
+
}
|
|
369
|
+
uint8_t rawKey[16];
|
|
370
|
+
if (!JCORESm4DecodeHexKey16(hexKey, rawKey)) {
|
|
371
|
+
return nil;
|
|
372
|
+
}
|
|
373
|
+
uint8_t padding = (uint8_t)(16 - (data.length % 16));
|
|
374
|
+
NSMutableData *padded = [NSMutableData dataWithLength:data.length + padding];
|
|
375
|
+
memset(padded.mutableBytes, padding, padded.length);
|
|
376
|
+
if (data.length > 0) {
|
|
377
|
+
memcpy(padded.mutableBytes, data.bytes, data.length);
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
JCORESm4Context ctx;
|
|
381
|
+
JCORESm4InitKeySchedule(&ctx, rawKey, NO);
|
|
382
|
+
|
|
383
|
+
NSMutableData *output = [NSMutableData dataWithLength:padded.length];
|
|
384
|
+
const uint8_t *inBytes = padded.bytes;
|
|
385
|
+
uint8_t *outBytes = output.mutableBytes;
|
|
386
|
+
for (NSUInteger offset = 0; offset < padded.length; offset += 16) {
|
|
387
|
+
JCORESm4ProcessBlock(ctx.sk, inBytes + offset, outBytes + offset);
|
|
388
|
+
}
|
|
389
|
+
return output;
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
+ (NSData *)sm4ECBDecryptData:(NSData *)data
|
|
393
|
+
withKey:(NSString *)hexKey {
|
|
394
|
+
if (data.length == 0 || (data.length % 16) != 0) {
|
|
395
|
+
return nil;
|
|
396
|
+
}
|
|
397
|
+
uint8_t rawKey[16];
|
|
398
|
+
if (!JCORESm4DecodeHexKey16(hexKey, rawKey)) {
|
|
399
|
+
return nil;
|
|
400
|
+
}
|
|
401
|
+
JCORESm4Context ctx;
|
|
402
|
+
JCORESm4InitKeySchedule(&ctx, rawKey, YES);
|
|
403
|
+
|
|
404
|
+
NSMutableData *output = [NSMutableData dataWithLength:data.length];
|
|
405
|
+
const uint8_t *inBytes = data.bytes;
|
|
406
|
+
uint8_t *outBytes = output.mutableBytes;
|
|
407
|
+
for (NSUInteger offset = 0; offset < data.length; offset += 16) {
|
|
408
|
+
JCORESm4ProcessBlock(ctx.sk, inBytes + offset, outBytes + offset);
|
|
409
|
+
}
|
|
410
|
+
return JCORESm4StripPkcs7Padding(output);
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
+ (NSData *)stripX509PublicKeyHeader:(NSData *)derData {
|
|
414
|
+
static const unsigned char kRsaOidSequence[15] = {
|
|
415
|
+
0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
|
|
416
|
+
0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00
|
|
417
|
+
};
|
|
418
|
+
const unsigned char *bytes = derData.bytes;
|
|
419
|
+
NSUInteger length = derData.length;
|
|
420
|
+
if (length < 20 || bytes[0] != 0x30) {
|
|
421
|
+
return derData;
|
|
422
|
+
}
|
|
423
|
+
NSUInteger index = (bytes[1] > 0x80) ? (2 + bytes[1] - 0x80) : 2;
|
|
424
|
+
if (index > length || length - index < 17) {
|
|
425
|
+
return nil;
|
|
426
|
+
}
|
|
427
|
+
if (memcmp(bytes + index, kRsaOidSequence, sizeof(kRsaOidSequence)) != 0) {
|
|
428
|
+
return derData;
|
|
429
|
+
}
|
|
430
|
+
index += sizeof(kRsaOidSequence);
|
|
431
|
+
if (index >= length || bytes[index++] != 0x03) {
|
|
432
|
+
return nil;
|
|
433
|
+
}
|
|
434
|
+
if (index >= length) {
|
|
435
|
+
return nil;
|
|
436
|
+
}
|
|
437
|
+
unsigned char bitStringLength = bytes[index++];
|
|
438
|
+
if (bitStringLength > 0x80) {
|
|
439
|
+
index += (bitStringLength - 0x80);
|
|
440
|
+
}
|
|
441
|
+
if (index >= length || bytes[index++] != 0x00) {
|
|
442
|
+
return nil;
|
|
443
|
+
}
|
|
444
|
+
return [NSData dataWithBytes:bytes + index length:length - index];
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
+ (NSString *)rsaEncryptString:(NSString *)plainText
|
|
448
|
+
publicKeyBase64:(NSString *)publicKeyBase64 {
|
|
449
|
+
if (plainText.length == 0 || publicKeyBase64.length == 0) {
|
|
450
|
+
return nil;
|
|
451
|
+
}
|
|
452
|
+
NSString *cleaned = publicKeyBase64;
|
|
453
|
+
cleaned = [cleaned stringByReplacingOccurrencesOfString:@"-----BEGIN PUBLIC KEY-----" withString:@""];
|
|
454
|
+
cleaned = [cleaned stringByReplacingOccurrencesOfString:@"-----END PUBLIC KEY-----" withString:@""];
|
|
455
|
+
cleaned = [[cleaned componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] componentsJoinedByString:@""];
|
|
456
|
+
|
|
457
|
+
NSData *rawKeyData = [[NSData alloc] initWithBase64EncodedString:cleaned
|
|
458
|
+
options:NSDataBase64DecodingIgnoreUnknownCharacters];
|
|
459
|
+
NSData *pkcs1KeyData = [self stripX509PublicKeyHeader:rawKeyData];
|
|
460
|
+
if (pkcs1KeyData.length == 0) {
|
|
461
|
+
return nil;
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
NSDictionary *attributes = @{
|
|
465
|
+
(__bridge id)kSecAttrKeyType: (__bridge id)kSecAttrKeyTypeRSA,
|
|
466
|
+
(__bridge id)kSecAttrKeyClass: (__bridge id)kSecAttrKeyClassPublic,
|
|
467
|
+
};
|
|
468
|
+
CFErrorRef error = NULL;
|
|
469
|
+
SecKeyRef publicKey = SecKeyCreateWithData((__bridge CFDataRef)pkcs1KeyData,
|
|
470
|
+
(__bridge CFDictionaryRef)attributes,
|
|
471
|
+
&error);
|
|
472
|
+
if (error != NULL) {
|
|
473
|
+
CFRelease(error);
|
|
474
|
+
error = NULL;
|
|
475
|
+
}
|
|
476
|
+
if (publicKey == NULL && rawKeyData.length > 0) {
|
|
477
|
+
publicKey = SecKeyCreateWithData((__bridge CFDataRef)rawKeyData,
|
|
478
|
+
(__bridge CFDictionaryRef)attributes,
|
|
479
|
+
&error);
|
|
480
|
+
if (error != NULL) {
|
|
481
|
+
CFRelease(error);
|
|
482
|
+
error = NULL;
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
if (publicKey == NULL) {
|
|
486
|
+
return nil;
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
NSData *plainData = [plainText dataUsingEncoding:NSUTF8StringEncoding];
|
|
490
|
+
size_t blockSize = SecKeyGetBlockSize(publicKey);
|
|
491
|
+
size_t maxChunkSize = blockSize > 11 ? (blockSize - 11) : plainData.length;
|
|
492
|
+
if (maxChunkSize == 0) {
|
|
493
|
+
CFRelease(publicKey);
|
|
494
|
+
return nil;
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
NSMutableData *encryptedTotal = [NSMutableData data];
|
|
498
|
+
NSUInteger offset = 0;
|
|
499
|
+
while (offset < plainData.length) {
|
|
500
|
+
NSUInteger chunkLen = MIN((NSUInteger)maxChunkSize, plainData.length - offset);
|
|
501
|
+
NSData *chunk = [plainData subdataWithRange:NSMakeRange(offset, chunkLen)];
|
|
502
|
+
CFDataRef encryptedRef = SecKeyCreateEncryptedData(publicKey,
|
|
503
|
+
kSecKeyAlgorithmRSAEncryptionPKCS1,
|
|
504
|
+
(__bridge CFDataRef)chunk,
|
|
505
|
+
&error);
|
|
506
|
+
if (error != NULL) {
|
|
507
|
+
CFRelease(error);
|
|
508
|
+
error = NULL;
|
|
509
|
+
}
|
|
510
|
+
if (encryptedRef == NULL) {
|
|
511
|
+
CFRelease(publicKey);
|
|
512
|
+
return nil;
|
|
513
|
+
}
|
|
514
|
+
NSData *encryptedChunk = (__bridge_transfer NSData *)encryptedRef;
|
|
515
|
+
[encryptedTotal appendData:encryptedChunk];
|
|
516
|
+
offset += chunkLen;
|
|
517
|
+
}
|
|
518
|
+
CFRelease(publicKey);
|
|
519
|
+
return [encryptedTotal base64EncodedStringWithOptions:0];
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
+ (NSData *)gzipCompress:(NSData *)data {
|
|
523
|
+
if (data.length == 0) {
|
|
524
|
+
return data;
|
|
525
|
+
}
|
|
526
|
+
z_stream stream;
|
|
527
|
+
memset(&stream, 0, sizeof(stream));
|
|
528
|
+
stream.next_in = (Bytef *)data.bytes;
|
|
529
|
+
stream.avail_in = (uInt)data.length;
|
|
530
|
+
|
|
531
|
+
if (deflateInit2(&stream, Z_DEFAULT_COMPRESSION, Z_DEFLATED, 15 + 16, 8, Z_DEFAULT_STRATEGY) != Z_OK) {
|
|
532
|
+
return nil;
|
|
533
|
+
}
|
|
534
|
+
NSMutableData *compressed = [NSMutableData dataWithLength:16384];
|
|
535
|
+
int status = Z_OK;
|
|
536
|
+
do {
|
|
537
|
+
if (stream.total_out >= compressed.length) {
|
|
538
|
+
[compressed increaseLengthBy:16384];
|
|
539
|
+
}
|
|
540
|
+
stream.next_out = (Bytef *)compressed.mutableBytes + stream.total_out;
|
|
541
|
+
stream.avail_out = (uInt)(compressed.length - stream.total_out);
|
|
542
|
+
status = deflate(&stream, Z_FINISH);
|
|
543
|
+
} while (status == Z_OK);
|
|
544
|
+
|
|
545
|
+
deflateEnd(&stream);
|
|
546
|
+
if (status != Z_STREAM_END) {
|
|
547
|
+
return nil;
|
|
548
|
+
}
|
|
549
|
+
compressed.length = stream.total_out;
|
|
550
|
+
return compressed;
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
+ (NSData *)gzipDecompress:(NSData *)data {
|
|
554
|
+
if (data.length == 0) {
|
|
555
|
+
return data;
|
|
556
|
+
}
|
|
557
|
+
z_stream stream;
|
|
558
|
+
memset(&stream, 0, sizeof(stream));
|
|
559
|
+
stream.next_in = (Bytef *)data.bytes;
|
|
560
|
+
stream.avail_in = (uInt)data.length;
|
|
561
|
+
|
|
562
|
+
if (inflateInit2(&stream, 15 + 32) != Z_OK) {
|
|
563
|
+
return nil;
|
|
564
|
+
}
|
|
565
|
+
NSMutableData *decompressed = [NSMutableData dataWithLength:data.length * 2];
|
|
566
|
+
int status = Z_OK;
|
|
567
|
+
while (status == Z_OK) {
|
|
568
|
+
if (stream.total_out >= decompressed.length) {
|
|
569
|
+
[decompressed increaseLengthBy:MAX((NSUInteger)4096, data.length)];
|
|
570
|
+
}
|
|
571
|
+
stream.next_out = (Bytef *)decompressed.mutableBytes + stream.total_out;
|
|
572
|
+
stream.avail_out = (uInt)(decompressed.length - stream.total_out);
|
|
573
|
+
status = inflate(&stream, Z_SYNC_FLUSH);
|
|
574
|
+
}
|
|
575
|
+
if (inflateEnd(&stream) != Z_OK || status != Z_STREAM_END) {
|
|
576
|
+
return nil;
|
|
577
|
+
}
|
|
578
|
+
decompressed.length = stream.total_out;
|
|
579
|
+
return decompressed;
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
+ (NSString *)md5Hex:(NSString *)input {
|
|
583
|
+
NSData *data = [input dataUsingEncoding:NSUTF8StringEncoding];
|
|
584
|
+
return [self md5HexForData:data];
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
+ (NSString *)md5HexForData:(NSData *)data {
|
|
588
|
+
if (data == nil) {
|
|
589
|
+
return @"";
|
|
590
|
+
}
|
|
591
|
+
unsigned char digest[CC_MD5_DIGEST_LENGTH];
|
|
592
|
+
#pragma clang diagnostic push
|
|
593
|
+
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
|
|
594
|
+
CC_MD5(data.bytes, (CC_LONG)data.length, digest);
|
|
595
|
+
#pragma clang diagnostic pop
|
|
596
|
+
NSMutableString *hex = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
|
|
597
|
+
for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
|
|
598
|
+
[hex appendFormat:@"%02x", digest[i]];
|
|
599
|
+
}
|
|
600
|
+
return hex;
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
+ (NSData *)sha1Data:(NSData *)data {
|
|
604
|
+
if (data == nil) {
|
|
605
|
+
return [NSData data];
|
|
606
|
+
}
|
|
607
|
+
unsigned char digest[CC_SHA1_DIGEST_LENGTH];
|
|
608
|
+
CC_SHA1(data.bytes, (CC_LONG)data.length, digest);
|
|
609
|
+
return [NSData dataWithBytes:digest length:CC_SHA1_DIGEST_LENGTH];
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
+ (NSString *)sha1Hex:(NSData *)data {
|
|
613
|
+
if (data == nil) {
|
|
614
|
+
return @"";
|
|
615
|
+
}
|
|
616
|
+
unsigned char digest[CC_SHA1_DIGEST_LENGTH];
|
|
617
|
+
CC_SHA1(data.bytes, (CC_LONG)data.length, digest);
|
|
618
|
+
NSMutableString *hex = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];
|
|
619
|
+
for (int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++) {
|
|
620
|
+
[hex appendFormat:@"%02x", digest[i]];
|
|
621
|
+
}
|
|
622
|
+
return hex;
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
+ (NSString *)sha1HexForString:(NSString *)input {
|
|
626
|
+
NSData *data = [input ?: @"" dataUsingEncoding:NSUTF8StringEncoding];
|
|
627
|
+
return [self sha1Hex:data];
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
+ (NSString *)hmacSHA256HexWithKey:(NSString *)key content:(NSString *)content {
|
|
631
|
+
if (content.length == 0 || key.length == 0) {
|
|
632
|
+
return nil;
|
|
633
|
+
}
|
|
634
|
+
const char *keyBytes = [key UTF8String];
|
|
635
|
+
const char *contentBytes = [content UTF8String];
|
|
636
|
+
unsigned char digest[CC_SHA256_DIGEST_LENGTH];
|
|
637
|
+
CCHmac(kCCHmacAlgSHA256, keyBytes, strlen(keyBytes), contentBytes, strlen(contentBytes), digest);
|
|
638
|
+
NSMutableString *hex = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2];
|
|
639
|
+
for (int i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) {
|
|
640
|
+
[hex appendFormat:@"%02x", digest[i]];
|
|
641
|
+
}
|
|
642
|
+
return hex;
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
+ (NSString *)hmacSha256Hex:(NSString *)content key:(NSString *)key {
|
|
646
|
+
return [self hmacSHA256HexWithKey:key content:content];
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
@end
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
#import <Foundation/Foundation.h>
|
|
2
|
+
|
|
3
|
+
NS_ASSUME_NONNULL_BEGIN
|
|
4
|
+
|
|
5
|
+
@interface JCORESisEndpoint : NSObject
|
|
6
|
+
|
|
7
|
+
@property (nonatomic, copy) NSString *host;
|
|
8
|
+
@property (nonatomic, assign) uint16_t port;
|
|
9
|
+
@property (nonatomic, assign) BOOL useSSL;
|
|
10
|
+
|
|
11
|
+
+ (nullable instancetype)endpointFromString:(NSString *)addressString useSSL:(BOOL)useSSL;
|
|
12
|
+
- (NSString *)addressString;
|
|
13
|
+
|
|
14
|
+
@end
|
|
15
|
+
|
|
16
|
+
@interface JCORESisResolver : NSObject
|
|
17
|
+
|
|
18
|
+
+ (instancetype)shared;
|
|
19
|
+
|
|
20
|
+
@property (nonatomic, copy, nullable) NSString *customSisHost;
|
|
21
|
+
@property (nonatomic, assign) uint16_t customSisPort;
|
|
22
|
+
|
|
23
|
+
- (void)setCustomConnectHost:(nullable NSString *)host
|
|
24
|
+
port:(uint16_t)port
|
|
25
|
+
useSSL:(BOOL)useSSL;
|
|
26
|
+
- (void)setCustomConnectAddresses:(nullable NSArray<NSString *> *)addresses;
|
|
27
|
+
- (void)clearCustomConnectEndpoint;
|
|
28
|
+
|
|
29
|
+
- (NSDictionary *)buildSisRequestPayload;
|
|
30
|
+
|
|
31
|
+
+ (nullable NSData *)assembleUdpSisPacketWithPayload:(NSDictionary *)payload
|
|
32
|
+
magic:(char)magic
|
|
33
|
+
seed:(uint32_t)seed;
|
|
34
|
+
|
|
35
|
+
+ (nullable NSDictionary *)parseUdpSisPacket:(NSData *)packetData;
|
|
36
|
+
|
|
37
|
+
+ (nullable NSData *)encryptHttpSisPayload:(NSDictionary *)payload
|
|
38
|
+
aesKey:(NSString *)aesKey
|
|
39
|
+
outAuthHeader:(NSString *_Nullable *_Nullable)outAuthHeader;
|
|
40
|
+
|
|
41
|
+
+ (nullable NSDictionary *)decryptHttpSisResponse:(NSData *)responseData
|
|
42
|
+
aesKey:(NSString *)aesKey;
|
|
43
|
+
|
|
44
|
+
- (NSArray<JCORESisEndpoint *> *)parseSisResponseDictionary:(NSDictionary *)dict;
|
|
45
|
+
- (NSArray<JCORESisEndpoint *> *)defaultFallbackEndpoints;
|
|
46
|
+
|
|
47
|
+
- (void)resolveUdpSisWithHost:(NSString *)host
|
|
48
|
+
port:(uint16_t)port
|
|
49
|
+
timeout:(NSTimeInterval)timeout
|
|
50
|
+
completion:(void (^)(NSArray<JCORESisEndpoint *> *endpoints))completion;
|
|
51
|
+
|
|
52
|
+
- (void)resolveEndpointsWithCompletion:(void (^)(NSArray<JCORESisEndpoint *> *endpoints))completion;
|
|
53
|
+
|
|
54
|
+
@end
|
|
55
|
+
|
|
56
|
+
NS_ASSUME_NONNULL_END
|