@appzung/react-native-code-push 9.0.2 → 10.0.0-rc1

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 (191) hide show
  1. package/CodePush.js +22 -19
  2. package/LICENSE.md +1 -1
  3. package/README.md +159 -298
  4. package/android/app/.gradle/config.properties +2 -0
  5. package/android/app/build.gradle +1 -1
  6. package/android/app/local.properties +8 -0
  7. package/android/app/src/main/java/com/microsoft/codepush/react/CodePush.java +27 -21
  8. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushBuilder.java +5 -5
  9. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushConstants.java +1 -1
  10. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushDialog.java +1 -1
  11. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushInstallMode.java +2 -2
  12. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushInvalidPublicKeyException.java +2 -2
  13. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushInvalidUpdateException.java +1 -1
  14. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushMalformedDataException.java +2 -2
  15. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushNativeModule.java +5 -5
  16. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushNotInitializedException.java +2 -2
  17. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushTelemetryManager.java +14 -14
  18. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushUnknownException.java +2 -2
  19. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushUpdateManager.java +1 -1
  20. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushUpdateState.java +2 -2
  21. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushUpdateUtils.java +1 -1
  22. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushUtils.java +1 -1
  23. package/android/app/src/main/java/com/microsoft/codepush/react/DownloadProgress.java +1 -1
  24. package/android/app/src/main/java/com/microsoft/codepush/react/DownloadProgressCallback.java +1 -1
  25. package/android/app/src/main/java/com/microsoft/codepush/react/FileUtils.java +1 -1
  26. package/android/app/src/main/java/com/microsoft/codepush/react/ReactInstanceHolder.java +1 -1
  27. package/android/app/src/main/java/com/microsoft/codepush/react/SettingsManager.java +1 -1
  28. package/android/app/src/main/java/com/microsoft/codepush/react/TLSSocketFactory.java +1 -1
  29. package/android/build.gradle +1 -1
  30. package/android/codepush.gradle +3 -3
  31. package/docs/advanced-usage.md +56 -0
  32. package/docs/api-android.md +12 -75
  33. package/docs/api-ios.md +5 -17
  34. package/docs/api-js.md +18 -55
  35. package/docs/setup-android.md +15 -397
  36. package/docs/setup-ios.md +24 -198
  37. package/docs/setup-windows.md +7 -74
  38. package/ios/CodePush/CodePush.h +4 -4
  39. package/ios/CodePush/CodePush.m +8 -8
  40. package/ios/CodePush/CodePushConfig.m +14 -11
  41. package/ios/CodePush/CodePushPackage.m +60 -60
  42. package/ios/CodePush/CodePushTelemetryManager.m +13 -13
  43. package/ios/CodePush.xcodeproj/project.pbxproj +1 -562
  44. package/package.json +27 -24
  45. package/react-native.config.js +1 -1
  46. package/scripts/generateBundledResourcesHash.js +1 -1
  47. package/scripts/getFilesInFolder.js +1 -1
  48. package/scripts/recordFilesBeforeBundleCommand.js +1 -1
  49. package/typings/react-native-code-push.d.ts +22 -22
  50. package/windows/CodePush/CodePushConfig.cpp +3 -3
  51. package/windows/CodePush/CodePushConfig.h +3 -3
  52. package/windows/CodePush/CodePushNativeModule.cpp +27 -27
  53. package/windows/CodePush/CodePushNativeModule.h +4 -4
  54. package/windows/CodePush/CodePushTelemetryManager.cpp +12 -12
  55. package/windows/CodePush/CodePushTelemetryManager.h +1 -1
  56. package/.azurepipelines/build-rn-code-push-1es.yml +0 -104
  57. package/.azurepipelines/test-rn-code-push.yml +0 -94
  58. package/.config/CredScanSuppressions.json +0 -14
  59. package/SECURITY.md +0 -41
  60. package/docs/multi-deployment-testing-android.md +0 -148
  61. package/docs/multi-deployment-testing-ios.md +0 -59
  62. package/ios/CodePush/Base64/Base64/MF_Base64Additions.h +0 -34
  63. package/ios/CodePush/Base64/Base64/MF_Base64Additions.m +0 -252
  64. package/ios/CodePush/Base64/README.md +0 -47
  65. package/ios/CodePush/JWT/Core/Algorithms/Base/JWTAlgorithm.h +0 -69
  66. package/ios/CodePush/JWT/Core/Algorithms/Base/JWTAlgorithmFactory.h +0 -16
  67. package/ios/CodePush/JWT/Core/Algorithms/Base/JWTAlgorithmFactory.m +0 -51
  68. package/ios/CodePush/JWT/Core/Algorithms/Base/JWTAlgorithmNone.h +0 -15
  69. package/ios/CodePush/JWT/Core/Algorithms/Base/JWTAlgorithmNone.m +0 -55
  70. package/ios/CodePush/JWT/Core/Algorithms/ESFamily/JWTAlgorithmESBase.h +0 -24
  71. package/ios/CodePush/JWT/Core/Algorithms/ESFamily/JWTAlgorithmESBase.m +0 -41
  72. package/ios/CodePush/JWT/Core/Algorithms/HSFamily/JWTAlgorithmHSBase.h +0 -28
  73. package/ios/CodePush/JWT/Core/Algorithms/HSFamily/JWTAlgorithmHSBase.m +0 -205
  74. package/ios/CodePush/JWT/Core/Algorithms/Holders/JWTAlgorithmDataHolder.h +0 -103
  75. package/ios/CodePush/JWT/Core/Algorithms/Holders/JWTAlgorithmDataHolder.m +0 -322
  76. package/ios/CodePush/JWT/Core/Algorithms/Holders/JWTAlgorithmDataHolderChain.h +0 -37
  77. package/ios/CodePush/JWT/Core/Algorithms/Holders/JWTAlgorithmDataHolderChain.m +0 -145
  78. package/ios/CodePush/JWT/Core/Algorithms/RSFamily/JWTAlgorithmRSBase.h +0 -35
  79. package/ios/CodePush/JWT/Core/Algorithms/RSFamily/JWTAlgorithmRSBase.m +0 -551
  80. package/ios/CodePush/JWT/Core/Algorithms/RSFamily/JWTRSAlgorithm.h +0 -23
  81. package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoKey.h +0 -43
  82. package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoKey.m +0 -230
  83. package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoKeyExtractor.h +0 -31
  84. package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoKeyExtractor.m +0 -113
  85. package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoSecurity.h +0 -38
  86. package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoSecurity.m +0 -500
  87. package/ios/CodePush/JWT/Core/ClaimSet/JWTClaim.h +0 -18
  88. package/ios/CodePush/JWT/Core/ClaimSet/JWTClaim.m +0 -214
  89. package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSet.h +0 -23
  90. package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSet.m +0 -29
  91. package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSetSerializer.h +0 -19
  92. package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSetSerializer.m +0 -68
  93. package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSetVerifier.h +0 -18
  94. package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSetVerifier.m +0 -72
  95. package/ios/CodePush/JWT/Core/Coding/JWTCoding+ResultTypes.h +0 -67
  96. package/ios/CodePush/JWT/Core/Coding/JWTCoding+ResultTypes.m +0 -111
  97. package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionOne.h +0 -119
  98. package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionOne.m +0 -307
  99. package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionThree.h +0 -94
  100. package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionThree.m +0 -619
  101. package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionTwo.h +0 -164
  102. package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionTwo.m +0 -514
  103. package/ios/CodePush/JWT/Core/Coding/JWTCoding.h +0 -24
  104. package/ios/CodePush/JWT/Core/Coding/JWTCoding.m +0 -11
  105. package/ios/CodePush/JWT/Core/FrameworkSupplement/JWT.h +0 -52
  106. package/ios/CodePush/JWT/Core/FrameworkSupplement/Map.modulemap +0 -5
  107. package/ios/CodePush/JWT/Core/Supplement/JWTBase64Coder.h +0 -28
  108. package/ios/CodePush/JWT/Core/Supplement/JWTBase64Coder.m +0 -70
  109. package/ios/CodePush/JWT/Core/Supplement/JWTDeprecations.h +0 -22
  110. package/ios/CodePush/JWT/Core/Supplement/JWTErrorDescription.h +0 -34
  111. package/ios/CodePush/JWT/Core/Supplement/JWTErrorDescription.m +0 -73
  112. package/ios/CodePush/JWT/LICENSE +0 -19
  113. package/ios/CodePush/JWT/README.md +0 -489
  114. package/ios/CodePush/SSZipArchive/Info.plist +0 -26
  115. package/ios/CodePush/SSZipArchive/README.md +0 -1
  116. package/ios/CodePush/SSZipArchive/SSZipArchive.h +0 -178
  117. package/ios/CodePush/SSZipArchive/SSZipArchive.m +0 -1496
  118. package/ios/CodePush/SSZipArchive/SSZipCommon.h +0 -71
  119. package/ios/CodePush/SSZipArchive/Supporting Files/PrivacyInfo.xcprivacy +0 -23
  120. package/ios/CodePush/SSZipArchive/include/ZipArchive.h +0 -25
  121. package/ios/CodePush/SSZipArchive/minizip/LICENSE +0 -17
  122. package/ios/CodePush/SSZipArchive/minizip/mz.h +0 -273
  123. package/ios/CodePush/SSZipArchive/minizip/mz_compat.c +0 -1306
  124. package/ios/CodePush/SSZipArchive/minizip/mz_compat.h +0 -346
  125. package/ios/CodePush/SSZipArchive/minizip/mz_crypt.c +0 -187
  126. package/ios/CodePush/SSZipArchive/minizip/mz_crypt.h +0 -65
  127. package/ios/CodePush/SSZipArchive/minizip/mz_crypt_apple.c +0 -526
  128. package/ios/CodePush/SSZipArchive/minizip/mz_os.c +0 -348
  129. package/ios/CodePush/SSZipArchive/minizip/mz_os.h +0 -176
  130. package/ios/CodePush/SSZipArchive/minizip/mz_os_posix.c +0 -350
  131. package/ios/CodePush/SSZipArchive/minizip/mz_strm.c +0 -556
  132. package/ios/CodePush/SSZipArchive/minizip/mz_strm.h +0 -132
  133. package/ios/CodePush/SSZipArchive/minizip/mz_strm_buf.c +0 -383
  134. package/ios/CodePush/SSZipArchive/minizip/mz_strm_buf.h +0 -42
  135. package/ios/CodePush/SSZipArchive/minizip/mz_strm_mem.c +0 -269
  136. package/ios/CodePush/SSZipArchive/minizip/mz_strm_mem.h +0 -48
  137. package/ios/CodePush/SSZipArchive/minizip/mz_strm_os.h +0 -40
  138. package/ios/CodePush/SSZipArchive/minizip/mz_strm_os_posix.c +0 -203
  139. package/ios/CodePush/SSZipArchive/minizip/mz_strm_pkcrypt.c +0 -334
  140. package/ios/CodePush/SSZipArchive/minizip/mz_strm_pkcrypt.h +0 -46
  141. package/ios/CodePush/SSZipArchive/minizip/mz_strm_split.c +0 -429
  142. package/ios/CodePush/SSZipArchive/minizip/mz_strm_split.h +0 -43
  143. package/ios/CodePush/SSZipArchive/minizip/mz_strm_wzaes.c +0 -360
  144. package/ios/CodePush/SSZipArchive/minizip/mz_strm_wzaes.h +0 -46
  145. package/ios/CodePush/SSZipArchive/minizip/mz_strm_zlib.c +0 -389
  146. package/ios/CodePush/SSZipArchive/minizip/mz_strm_zlib.h +0 -43
  147. package/ios/CodePush/SSZipArchive/minizip/mz_zip.c +0 -2782
  148. package/ios/CodePush/SSZipArchive/minizip/mz_zip.h +0 -262
  149. package/ios/CodePush/SSZipArchive/minizip/mz_zip_rw.c +0 -1942
  150. package/ios/CodePush/SSZipArchive/minizip/mz_zip_rw.h +0 -285
  151. package/scripts/postlink/android/postlink.js +0 -87
  152. package/scripts/postlink/ios/postlink.js +0 -116
  153. package/scripts/postlink/run.js +0 -11
  154. package/scripts/postunlink/android/postunlink.js +0 -74
  155. package/scripts/postunlink/ios/postunlink.js +0 -87
  156. package/scripts/postunlink/run.js +0 -11
  157. package/scripts/tools/linkToolsAndroid.js +0 -57
  158. package/scripts/tools/linkToolsIos.js +0 -130
  159. package/windows-legacy/CodePush/CodePush.csproj +0 -128
  160. package/windows-legacy/CodePush/CodePushUtils.cs +0 -47
  161. package/windows-legacy/CodePush/FileUtils.cs +0 -40
  162. package/windows-legacy/CodePush/Properties/AssemblyInfo.cs +0 -29
  163. package/windows-legacy/CodePush/Properties/CodePush.rd.xml +0 -33
  164. package/windows-legacy/CodePush/UpdateManager.cs +0 -305
  165. package/windows-legacy/CodePush/UpdateUtils.cs +0 -46
  166. package/windows-legacy/CodePush.Net46/Adapters/Http/HttpProgress.cs +0 -28
  167. package/windows-legacy/CodePush.Net46/Adapters/Storage/ApplicationDataContainer.cs +0 -106
  168. package/windows-legacy/CodePush.Net46/CodePush.Net46.csproj +0 -103
  169. package/windows-legacy/CodePush.Net46/CodePushUtils.cs +0 -158
  170. package/windows-legacy/CodePush.Net46/FileUtils.cs +0 -55
  171. package/windows-legacy/CodePush.Net46/Properties/AssemblyInfo.cs +0 -36
  172. package/windows-legacy/CodePush.Net46/UpdateManager.cs +0 -330
  173. package/windows-legacy/CodePush.Net46/UpdateUtils.cs +0 -70
  174. package/windows-legacy/CodePush.Net46/packages.config +0 -5
  175. package/windows-legacy/CodePush.Net46.Test/ApplicationDataContainerTest.cs +0 -105
  176. package/windows-legacy/CodePush.Net46.Test/CodePush.Net46.Test.csproj +0 -137
  177. package/windows-legacy/CodePush.Net46.Test/Properties/AssemblyInfo.cs +0 -36
  178. package/windows-legacy/CodePush.Net46.Test/TelemetryManagerTest.cs +0 -117
  179. package/windows-legacy/CodePush.Net46.Test/app.config +0 -11
  180. package/windows-legacy/CodePush.Net46.Test/packages.config +0 -4
  181. package/windows-legacy/CodePush.Shared/CodePush.Shared.projitems +0 -22
  182. package/windows-legacy/CodePush.Shared/CodePush.Shared.shproj +0 -13
  183. package/windows-legacy/CodePush.Shared/CodePushConstants.cs +0 -35
  184. package/windows-legacy/CodePush.Shared/CodePushNativeModule.cs +0 -329
  185. package/windows-legacy/CodePush.Shared/CodePushReactPackage.cs +0 -235
  186. package/windows-legacy/CodePush.Shared/CodePushUtils.cs +0 -70
  187. package/windows-legacy/CodePush.Shared/InstallMode.cs +0 -9
  188. package/windows-legacy/CodePush.Shared/MinimumBackgroundListener.cs +0 -44
  189. package/windows-legacy/CodePush.Shared/SettingsManager.cs +0 -148
  190. package/windows-legacy/CodePush.Shared/TelemetryManager.cs +0 -250
  191. package/windows-legacy/CodePush.Shared/UpdateState.cs +0 -9
@@ -1,500 +0,0 @@
1
- //
2
- // JWTCryptoSecurity.m
3
- // JWT
4
- //
5
- // Created by Lobanov Dmitry on 04.02.17.
6
- // Copyright © 2017 JWTIO. All rights reserved.
7
- //
8
-
9
- #import "JWTCryptoSecurity.h"
10
- @interface JWTMemoryLayout : NSObject
11
- + (NSString *)typeUInt8;
12
- + (NSString *)typeCUnsignedChar;
13
- - (instancetype)initWithType:(NSString *)type;
14
- + (instancetype)createWithType:(NSString *)type;
15
- @property (copy, nonatomic, readwrite) NSString *type;
16
- @property (assign, nonatomic, readonly) NSInteger size;
17
- @end
18
- @implementation JWTMemoryLayout
19
- + (NSString *)typeUInt8 {
20
- return NSStringFromSelector(_cmd);
21
- }
22
- + (NSString *)typeCUnsignedChar {
23
- return [self typeUInt8];
24
- }
25
- - (instancetype)initWithType:(NSString *)type {
26
- self = [super init];
27
- if (self) {
28
- self.type = type;
29
- }
30
- return self;
31
- }
32
- + (instancetype)createWithType:(NSString *)type {
33
- return [[self alloc] initWithType:type];
34
- }
35
- + (NSDictionary *)sizesAndTypes {
36
- static NSDictionary *sizesAndTypes = nil;
37
- return sizesAndTypes ?: (sizesAndTypes = @{
38
- [self typeUInt8] : @(1) // or 8?
39
- }, sizesAndTypes);
40
- }
41
- - (NSInteger)size {
42
- return [[self.class sizesAndTypes][self.type] integerValue];
43
- }
44
- @end
45
- @implementation JWTCryptoSecurity
46
- + (NSDictionary *)dictionaryByCombiningDictionaries:(NSArray *)dictionaries {
47
- NSMutableDictionary *result = [@{} mutableCopy];
48
- for (NSDictionary *dictionary in dictionaries) {
49
- [result addEntriesFromDictionary:dictionary];
50
- }
51
- return [result copy];
52
- }
53
- + (NSString *)keyTypeRSA {
54
- return (__bridge NSString *)kSecAttrKeyTypeRSA;
55
- }
56
- + (NSString *)keyTypeEC {
57
- // extern const CFStringRef kSecAttrKeyTypeEC
58
- // __OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_4_0);
59
- // extern const CFStringRef kSecAttrKeyTypeECSECPrimeRandom
60
- // __OSX_AVAILABLE_STARTING(__MAC_10_12, __IPHONE_10_0);
61
- return (__bridge NSString *)kSecAttrKeyTypeEC;
62
- }
63
- + (SecKeyRef)addKeyWithData:(NSData *)data asPublic:(BOOL)public tag:(NSString *)tag type:(NSString *)type error:(NSError *__autoreleasing*)error; {
64
- NSString *keyClass = (__bridge NSString *)(public ? kSecAttrKeyClassPublic : kSecAttrKeyClassPrivate);
65
- NSInteger sizeInBits = data.length * [JWTMemoryLayout createWithType:[JWTMemoryLayout typeUInt8]].size;
66
- NSDictionary *attributes = @{
67
- (__bridge NSString*)kSecAttrKeyType : type,
68
- (__bridge NSString*)kSecAttrKeyClass : keyClass,
69
- (__bridge NSString*)kSecAttrKeySizeInBits : @(sizeInBits)
70
- };
71
-
72
- if (SecKeyCreateWithData != NULL) {
73
- CFErrorRef createError = NULL;
74
- SecKeyRef key = SecKeyCreateWithData((__bridge CFDataRef)data, (__bridge CFDictionaryRef)attributes, &createError);
75
- if (error && createError != nil) {
76
- *error = (__bridge NSError*)createError;
77
- }
78
- return key;
79
- }
80
- // oh... not avaialbe API :/
81
- else {
82
-
83
- CFTypeRef result = NULL;
84
- NSData *tagData = [tag dataUsingEncoding:NSUTF8StringEncoding];
85
- NSDictionary *commonAttributes = @{
86
- (__bridge NSString*)kSecClass: (__bridge NSString*)kSecClassKey,
87
- (__bridge NSString*)kSecAttrApplicationTag: tagData,
88
- (__bridge NSString*)kSecAttrAccessible: (__bridge NSString*)kSecAttrAccessibleWhenUnlocked
89
- };
90
-
91
-
92
- NSDictionary *addItemAttributes = @{
93
- (__bridge NSString*)kSecValueData: data,
94
- (__bridge NSString*)kSecReturnPersistentRef: @(YES),
95
- };
96
-
97
- OSStatus addItemStatus = SecItemAdd((__bridge CFDictionaryRef)[self dictionaryByCombiningDictionaries:@[attributes, commonAttributes, addItemAttributes]], &result);
98
- if (addItemStatus != errSecSuccess && addItemStatus != errSecDuplicateItem) {
99
- // add item error
100
- // not duplicate and not added to keychain.
101
- return NULL;
102
- }
103
-
104
- NSDictionary *copyAttributes = @{
105
- (__bridge NSString*)kSecReturnRef: @(YES),
106
- };
107
-
108
- CFTypeRef key = NULL;
109
- // TODO: Add error handling later.
110
- OSStatus copyItemStatus = errSecSuccess;
111
- SecItemCopyMatching((__bridge CFDictionaryRef)[self dictionaryByCombiningDictionaries:@[attributes, commonAttributes, copyAttributes]], &key);
112
- if (key == NULL) {
113
- // copy item error
114
- }
115
- return (SecKeyRef)key;
116
- }
117
-
118
- return NULL;
119
- }
120
- + (SecKeyRef)addKeyWithData:(NSData *)data asPublic:(BOOL)public tag:(NSString *)tag error:(NSError *__autoreleasing*)error; {
121
- return [self addKeyWithData:data asPublic:public tag:tag type:[self keyTypeRSA] error:error];
122
- }
123
-
124
- + (SecKeyRef)keyByTag:(NSString *)tag error:(NSError *__autoreleasing*)error; {
125
- return NULL;
126
- }
127
-
128
- + (void)removeKeyByTag:(NSString *)tag error:(NSError *__autoreleasing*)error; {
129
- NSData *tagData = [tag dataUsingEncoding:NSUTF8StringEncoding];
130
- if (tagData == nil) {
131
- // tell that nothing to remove.
132
- return;
133
- }
134
- NSDictionary *removeAttributes = @{
135
- (__bridge NSString*)kSecClass: (__bridge NSString*)kSecClassKey,
136
- (__bridge NSString*)kSecAttrKeyType: (__bridge NSString*)kSecAttrKeyTypeRSA,
137
- (__bridge NSString*)kSecAttrApplicationTag: tagData,
138
- };
139
- SecItemDelete((__bridge CFDictionaryRef)removeAttributes);
140
- }
141
- @end
142
-
143
- @implementation JWTCryptoSecurity (Certificates)
144
- + (OSStatus)extractIdentityAndTrustFromPKCS12:(CFDataRef)inPKCS12Data password:(CFStringRef)password identity:(SecIdentityRef *)outIdentity trust:(SecTrustRef *)outTrust {
145
-
146
- OSStatus securityError = errSecSuccess;
147
-
148
-
149
- const void *keys[] = { kSecImportExportPassphrase };
150
- const void *values[] = { password };
151
- CFDictionaryRef optionsDictionary = NULL;
152
-
153
- /* Create a dictionary containing the passphrase if one
154
- was specified. Otherwise, create an empty dictionary. */
155
- optionsDictionary = CFDictionaryCreate(
156
- NULL, keys,
157
- values, (password ? 1 : 0),
158
- NULL, NULL); // 1
159
-
160
- CFArrayRef items = NULL;
161
- securityError = SecPKCS12Import(inPKCS12Data,
162
- optionsDictionary,
163
- &items); // 2
164
-
165
-
166
- //
167
- if (securityError == 0) { // 3
168
- CFDictionaryRef myIdentityAndTrust = CFArrayGetValueAtIndex (items, 0);
169
- const void *tempIdentity = NULL;
170
- tempIdentity = CFDictionaryGetValue (myIdentityAndTrust,
171
- kSecImportItemIdentity);
172
- CFRetain(tempIdentity);
173
- *outIdentity = (SecIdentityRef)tempIdentity;
174
- const void *tempTrust = NULL;
175
- tempTrust = CFDictionaryGetValue (myIdentityAndTrust, kSecImportItemTrust);
176
-
177
- CFRetain(tempTrust);
178
- *outTrust = (SecTrustRef)tempTrust;
179
- }
180
-
181
- if (optionsDictionary) // 4
182
- CFRelease(optionsDictionary);
183
-
184
- if (items)
185
- CFRelease(items);
186
-
187
- return securityError;
188
- }
189
-
190
- + (SecKeyRef)publicKeyFromCertificate:(NSData *)certificateData {
191
- SecCertificateRef certificate = SecCertificateCreateWithData(NULL, (__bridge CFDataRef)certificateData);
192
- if (certificate != NULL) {
193
- SecPolicyRef secPolicy = SecPolicyCreateBasicX509();
194
- SecTrustRef trust;
195
- SecTrustCreateWithCertificates(certificate, secPolicy, &trust);
196
- SecTrustResultType resultType;
197
- SecTrustEvaluate(trust, &resultType);
198
- SecKeyRef publicKey = SecTrustCopyPublicKey(trust);
199
- (CFRelease(trust));
200
- (CFRelease(secPolicy));
201
- (CFRelease(certificate));
202
- return publicKey;
203
- }
204
- return NULL;
205
- }
206
- @end
207
-
208
- @implementation JWTCryptoSecurity (Pem)
209
- + (NSString *)certificateFromPemFileContent:(NSString *)content {
210
- NSRegularExpression *expression = [[NSRegularExpression alloc] initWithPattern:@"-----BEGIN CERTIFICATE-----(.+?)-----END CERTIFICATE-----" options:NSRegularExpressionDotMatchesLineSeparators error:nil];
211
- return [self itemsFromPemFileContent:content byRegex:expression].firstObject;
212
- }
213
- + (NSString *)keyFromPemFileContent:(NSString *)content {
214
- NSRegularExpression *expression = [[NSRegularExpression alloc] initWithPattern:@"-----BEGIN(?:[\\w\\s]|)+KEY-----(.+?)-----END(?:[\\w\\s])+KEY-----" options:NSRegularExpressionDotMatchesLineSeparators error:nil];
215
- return [self itemsFromPemFileContent:content byRegex:expression].firstObject;
216
- }
217
- + (NSArray *)itemsFromPemFileContent:(NSString *)content byRegex:(NSRegularExpression *)expression {
218
- NSArray *matches = [expression matchesInString:content options:0 range:NSMakeRange(0, content.length)];
219
- NSTextCheckingResult *result = matches.firstObject;
220
- NSArray *resultArray = @[];
221
-
222
- if (result) {
223
- for (NSUInteger i = 1; i < result.numberOfRanges; ++i) {
224
- NSString *extractedString = [content substringWithRange:[result rangeAtIndex:i]];
225
- resultArray = [resultArray arrayByAddingObject:extractedString];
226
- }
227
- }
228
- return resultArray;
229
- }
230
- + (NSString *)certificateFromPemFileWithName:(NSString *)name {
231
- NSRegularExpression *expression = [[NSRegularExpression alloc] initWithPattern:@"-----BEGIN CERTIFICATE-----(.+?)-----END CERTIFICATE-----" options:NSRegularExpressionDotMatchesLineSeparators error:nil];
232
- return [self itemsFromPemFileWithName:name byRegex:expression].firstObject;
233
- }
234
- + (NSString *)keyFromPemFileWithName:(NSString *)name {
235
- NSRegularExpression *expression = [[NSRegularExpression alloc] initWithPattern:@"-----BEGIN(?:[\\w\\s]|)+KEY-----(.+?)-----END(?:[\\w\\s])+KEY-----" options:NSRegularExpressionDotMatchesLineSeparators error:nil];
236
- return [self itemsFromPemFileWithName:name byRegex:expression].firstObject;
237
- }
238
- + (NSArray *)itemsFromPemFileWithName:(NSString *)name byRegex:(NSRegularExpression *)expression {
239
- NSURL *fileURL = [[NSBundle bundleForClass:self.class] URLForResource:name withExtension:@"pem"];
240
- NSError *error = nil;
241
- NSString *fileContent = [NSString stringWithContentsOfURL:fileURL encoding:NSUTF8StringEncoding error:&error];
242
-
243
- if (error) {
244
- NSLog(@"%@ error: %@", self.debugDescription, error);
245
- return nil;
246
- }
247
-
248
- return [self itemsFromPemFileContent:fileContent byRegex:expression];
249
- }
250
- + (NSString *)stringByRemovingPemHeadersFromString:(NSString *)string {
251
- NSArray *lines = [string componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]];
252
- NSArray *linesWithoutHeaders = [lines filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(NSString *_Nullable evaluatedObject, NSDictionary<NSString *,id> * _Nullable bindings) {
253
- return !([evaluatedObject hasPrefix:@"-----BEGIN"] || [evaluatedObject hasPrefix:@"-----END"]);
254
- }]];
255
- return [linesWithoutHeaders componentsJoinedByString:@""];
256
- }
257
- @end
258
-
259
- @implementation JWTCryptoSecurity (PublicKey)
260
- /**
261
- This method strips the x509 from a provided ASN.1 DER public key.
262
- If the key doesn't contain a header, the DER data is returned as is.
263
-
264
- Supported formats are:
265
-
266
- Headerless:
267
- SEQUENCE
268
- INTEGER (1024 or 2048 bit) -- modulo
269
- INTEGER -- public exponent
270
-
271
- With x509 header:
272
- SEQUENCE
273
- SEQUENCE
274
- OBJECT IDENTIFIER 1.2.840.113549.1.1.1
275
- NULL
276
- BIT STRING
277
- SEQUENCE
278
- INTEGER (1024 or 2048 bit) -- modulo
279
- INTEGER -- public exponent
280
-
281
- Example of headerless key:
282
- https://lapo.it/asn1js/#3082010A0282010100C1A0DFA367FBC2A5FD6ED5A071E02A4B0617E19C6B5AD11BB61192E78D212F10A7620084A3CED660894134D4E475BAD7786FA1D40878683FD1B7A1AD9C0542B7A666457A270159DAC40CE25B2EAE7CCD807D31AE725CA394F90FBB5C5BA500545B99C545A9FE08EFF00A5F23457633E1DB84ED5E908EF748A90F8DFCCAFF319CB0334705EA012AF15AA090D17A9330159C9AFC9275C610BB9B7C61317876DC7386C723885C100F774C19830F475AD1E9A9925F9CA9A69CE0181A214DF2EB75FD13E6A546B8C8ED699E33A8521242B7E42711066AEC22D25DD45D56F94D3170D6F2C25164D2DACED31C73963BA885ADCB706F40866B8266433ED5161DC50E4B3B0203010001
283
-
284
- Example of key with X509 header (notice the additional ASN.1 sequence):
285
- https://lapo.it/asn1js/#30819F300D06092A864886F70D010101050003818D0030818902818100D0674615A252ED3D75D2A3073A0A8A445F3188FD3BEB8BA8584F7299E391BDEC3427F287327414174997D147DD8CA62647427D73C9DA5504E0A3EED5274A1D50A1237D688486FADB8B82061675ABFA5E55B624095DB8790C6DBCAE83D6A8588C9A6635D7CF257ED1EDE18F04217D37908FD0CBB86B2C58D5F762E6207FF7B92D0203010001
286
- */
287
- //static func stripPublicKeyHeader(keyData: Data) throws -> Data {
288
- // let count = keyData.count / MemoryLayout<CUnsignedChar>.size
289
- //
290
- // guard count > 0 else {
291
- // throw SwiftyRSAError(message: "Provided public key is empty")
292
- // }
293
- //
294
- // var byteArray = [UInt8](repeating: 0, count: count)
295
- // (keyData as NSData).getBytes(&byteArray, length: keyData.count)
296
- //
297
- // var index = 0
298
- // guard byteArray[index] == 0x30 else {
299
- // throw SwiftyRSAError(message: "Provided key doesn't have a valid ASN.1 structure (first byte should be 0x30 == SEQUENCE)")
300
- // }
301
- //
302
- // index += 1
303
- // if byteArray[index] > 0x80 {
304
- // index += Int(byteArray[index]) - 0x80 + 1
305
- // } else {
306
- // index += 1
307
- // }
308
- //
309
- // // If current byte marks an integer (0x02), it means the key doesn't have a X509 header and just
310
- // // contains its modulo & public exponent. In this case, we can just return the provided DER data as is.
311
- // if Int(byteArray[index]) == 0x02 {
312
- // return keyData
313
- // }
314
- //
315
- // // Now that we've excluded the possibility of headerless key, we're looking for a valid X509 header sequence.
316
- // // It should look like this:
317
- // // 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00
318
- // guard Int(byteArray[index]) == 0x30 else {
319
- // throw SwiftyRSAError(message: "Provided key doesn't have a valid X509 header")
320
- // }
321
- //
322
- // index += 15
323
- // if byteArray[index] != 0x03 {
324
- // throw SwiftyRSAError(message: "Invalid byte at index \(index - 1) (\(byteArray[index - 1])) for public key header")
325
- // }
326
- //
327
- // index += 1
328
- // if byteArray[index] > 0x80 {
329
- // index += Int(byteArray[index]) - 0x80 + 1
330
- // } else {
331
- // index += 1
332
- // }
333
- //
334
- // guard byteArray[index] == 0 else {
335
- // throw SwiftyRSAError(message: "Invalid byte at index \(index - 1) (\(byteArray[index - 1])) for public key header")
336
- // }
337
- //
338
- // index += 1
339
- //
340
- // let strippedKeyBytes = [UInt8](byteArray[index...keyData.count - 1])
341
- // let data = Data(bytes: UnsafePointer<UInt8>(strippedKeyBytes), count: keyData.count - index)
342
- //
343
- // return data
344
- //}
345
- typedef NS_ENUM(NSInteger, JWTPublicHeaderStrippingError) {
346
- JWTPublicHeaderStrippingError_KeyIsEmpty = -200,
347
- JWTPublicHeaderStrippingError_Invalid_ASN1_Structure,
348
- JWTPublicHeaderStrippingError_Invalid_X509_Header,
349
- JWTPublicHeaderStrippingError_Invalid_Byte_At_Index,
350
- };
351
- + (NSDictionary *)publicHeaderStrippingMessagesAndCodes {
352
- static NSDictionary *publicHeaderStrippingMessagesAndCodes = nil;
353
- return publicHeaderStrippingMessagesAndCodes ?:
354
- (publicHeaderStrippingMessagesAndCodes = @{
355
- @(JWTPublicHeaderStrippingError_KeyIsEmpty) : @"Provided public key is empty",
356
- @(JWTPublicHeaderStrippingError_Invalid_ASN1_Structure) : @"Provided key doesn't have a valid ASN.1 structure (first byte should be 0x30 == SEQUENCE)",
357
- @(JWTPublicHeaderStrippingError_Invalid_X509_Header) : @"Provided key doesn't have a valid X509 header",
358
- @(JWTPublicHeaderStrippingError_Invalid_Byte_At_Index) : @"Invalid byte at index (index - 1) ((bytes[index - 1])) for public key header. Access as error.userInfo[Parameters][index] or error.userInfo[Parameters][byte]"
359
- },
360
- publicHeaderStrippingMessagesAndCodes);
361
- }
362
- + (NSString *)stringForPublicHeaderStrippingErrorCode:(NSInteger)code {
363
- return [self publicHeaderStrippingMessagesAndCodes][@(code)] ?: @"Unknown Public Header Stripping Error";
364
- }
365
- + (NSError*)publicHeaderStrippingErrorForCode:(NSInteger)code parameters:(NSDictionary *)parameters {
366
- return [NSError errorWithDomain:@"io.jwt.crypto.stripping_public_header" code:code userInfo:@{
367
- @"Parameters" : parameters ?: [NSNull null],NSLocalizedDescriptionKey: [self stringForPublicHeaderStrippingErrorCode:code]
368
- }];
369
- }
370
- + (NSError*)publicHeaderStrippingErrorForCode:(NSInteger)code {
371
- return [self publicHeaderStrippingErrorForCode:code parameters:nil];
372
- }
373
- + (NSData *)dataByRemovingPublicKeyHeader:(NSData *)data error:(NSError *__autoreleasing *)error {
374
- NSError *currentError = nil;
375
- NSData *currentData = [data copy];
376
- // let count = keyData.count / MemoryLayout<CUnsignedChar>.size
377
- //
378
- // guard count > 0 else {
379
- // throw SwiftyRSAError(message: "Provided public key is empty")
380
- // }
381
- NSInteger countOfBytes = currentData.length / [JWTMemoryLayout createWithType:[JWTMemoryLayout typeUInt8]].size;
382
- if (countOfBytes == 0) {
383
- // throw SwiftyRSAError(message: "Provided public key is empty")
384
- currentError = [self publicHeaderStrippingErrorForCode:JWTPublicHeaderStrippingError_KeyIsEmpty];
385
- if (error) {
386
- *error = currentError;
387
- }
388
- return nil;
389
- }
390
- // var byteArray = [UInt8](repeating: 0, count: count)
391
- // (keyData as NSData).getBytes(&byteArray, length: keyData.count)
392
- // UInt8 *bytes = (UInt8*)malloc(countOfBytes);
393
- UInt8 *bytes = (UInt8 *)[currentData bytes];
394
- // memcpy(bytes, [currentData bytes], countOfBytes);
395
-
396
- // var index = 0
397
- // guard byteArray[index] == 0x30 else {
398
- // throw SwiftyRSAError(message: "Provided key doesn't have a valid ASN.1 structure (first byte should be 0x30 == SEQUENCE)")
399
- // }
400
-
401
- UInt8 index = 0;
402
- if (bytes[index] != 0x30) {
403
- // throw SwiftyRSAError(message: "Provided key doesn't have a valid ASN.1 structure (first byte should be 0x30 == SEQUENCE)")
404
- currentError = [self publicHeaderStrippingErrorForCode:JWTPublicHeaderStrippingError_Invalid_ASN1_Structure];
405
- if (error) {
406
- *error = currentError;
407
- }
408
- return nil;
409
- }
410
-
411
- // index += 1
412
- // if byteArray[index] > 0x80 {
413
- // index += Int(byteArray[index]) - 0x80 + 1
414
- // } else {
415
- // index += 1
416
- // }
417
- index += 1;
418
- if (bytes[index] > 0x80) {
419
- index += (SInt8)bytes[index] - 0x80 + 1;
420
- }
421
- else {
422
- index += 1;
423
- }
424
-
425
- // Headerless!
426
- // // If current byte marks an integer (0x02), it means the key doesn't have a X509 header and just
427
- // // contains its modulo & public exponent. In this case, we can just return the provided DER data as is.
428
- // if Int(byteArray[index]) == 0x02 {
429
- // return keyData
430
- // }
431
- if ((SInt8)bytes[index] == 0x02) {
432
- return currentData;
433
- }
434
-
435
- // Has header.
436
-
437
- // // Now that we've excluded the possibility of headerless key, we're looking for a valid X509 header sequence.
438
- // // It should look like this:
439
- // // 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00
440
- // guard Int(byteArray[index]) == 0x30 else {
441
- // throw SwiftyRSAError(message: "Provided key doesn't have a valid X509 header")
442
- // }
443
- if ((SInt8)bytes[index] != 0x30) {
444
- // throw SwiftyRSAError(message: "Provided key doesn't have a valid X509 header")
445
- currentError = [self publicHeaderStrippingErrorForCode:JWTPublicHeaderStrippingError_Invalid_X509_Header];
446
- if (error) {
447
- *error = currentError;
448
- }
449
- return nil;
450
- }
451
-
452
- // index += 15
453
- // if byteArray[index] != 0x03 {
454
- // throw SwiftyRSAError(message: "Invalid byte at index \(index - 1) (\(byteArray[index - 1])) for public key header")
455
- // }
456
- index += 15;
457
- if (bytes[index] != 0x03) {
458
- // throw SwiftyRSAError(message: "Invalid byte at index \(index - 1) (\(byteArray[index - 1])) for public key header")
459
- currentError = [self publicHeaderStrippingErrorForCode:JWTPublicHeaderStrippingError_Invalid_Byte_At_Index parameters:@{@"index" : @(index - 1), @"byte": @(bytes[index - 1] ?: 0)}];
460
- if (error) {
461
- *error = currentError;
462
- }
463
- return nil;
464
- }
465
- // index += 1
466
- // if byteArray[index] > 0x80 {
467
- // index += Int(byteArray[index]) - 0x80 + 1
468
- // } else {
469
- // index += 1
470
- // }
471
- index += 1;
472
- if (bytes[index] > 0x80) {
473
- index += (SInt8)bytes[index] - 0x80 + 1;
474
- }
475
- else {
476
- index += 1;
477
- }
478
- // guard byteArray[index] == 0 else {
479
- // throw SwiftyRSAError(message: "Invalid byte at index \(index - 1) (\(byteArray[index - 1])) for public key header")
480
- // }
481
- if (bytes[index] != 0) {
482
- // throw SwiftyRSAError(message: "Invalid byte at index \(index - 1) (\(byteArray[index - 1])) for public key header")
483
- currentError = [self publicHeaderStrippingErrorForCode:JWTPublicHeaderStrippingError_Invalid_Byte_At_Index parameters:@{@"index" : @(index - 1), @"byte": @(bytes[index - 1] ?: 0)}];
484
- if (error) {
485
- *error = currentError;
486
- }
487
- return nil;
488
- }
489
- // index += 1
490
- //
491
- // let strippedKeyBytes = [UInt8](byteArray[index...keyData.count - 1])
492
- // let data = Data(bytes: UnsafePointer<UInt8>(strippedKeyBytes), count: keyData.count - index)
493
- index += 1;
494
- NSInteger countOfStrippedBytes = currentData.length - index;
495
- UInt8 *strippedBytes = (UInt8 *)(bytes + index);
496
- NSData *resultData = [[NSData alloc] initWithBytes:strippedBytes length:countOfStrippedBytes];
497
- // return data
498
- return resultData;
499
- }
500
- @end
@@ -1,18 +0,0 @@
1
- //
2
- // JWTClaim.h
3
- // JWT
4
- //
5
- // Created by Lobanov Dmitry on 13.02.16.
6
- // Copyright © 2016 Karma. All rights reserved.
7
- //
8
-
9
- #import <Foundation/Foundation.h>
10
-
11
- @interface JWTClaim : NSObject
12
-
13
- + (NSString *)name;
14
- + (instancetype)claimByName:(NSString *)name;
15
- + (BOOL)verifyValue:(NSObject *)value withTrustedValue:(NSObject *)trustedValue;
16
- - (BOOL)verifyValue:(NSObject *)value withTrustedValue:(NSObject *)trustedValue;
17
-
18
- @end