@appzung/react-native-code-push 8.3.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/CodePush.podspec +3 -3
  3. package/LICENSE.md +1 -1
  4. package/README.md +159 -296
  5. package/android/app/.gradle/config.properties +2 -0
  6. package/android/app/build.gradle +2 -0
  7. package/android/app/local.properties +8 -0
  8. package/android/app/src/main/AndroidManifest.xml +1 -2
  9. package/android/app/src/main/java/com/microsoft/codepush/react/CodePush.java +27 -21
  10. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushBuilder.java +5 -5
  11. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushConstants.java +1 -1
  12. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushDialog.java +1 -1
  13. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushInstallMode.java +2 -2
  14. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushInvalidPublicKeyException.java +2 -2
  15. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushInvalidUpdateException.java +1 -1
  16. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushMalformedDataException.java +2 -2
  17. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushNativeModule.java +5 -5
  18. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushNotInitializedException.java +2 -2
  19. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushTelemetryManager.java +14 -14
  20. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushUnknownException.java +2 -2
  21. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushUpdateManager.java +1 -1
  22. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushUpdateState.java +2 -2
  23. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushUpdateUtils.java +16 -9
  24. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushUtils.java +1 -1
  25. package/android/app/src/main/java/com/microsoft/codepush/react/DownloadProgress.java +1 -1
  26. package/android/app/src/main/java/com/microsoft/codepush/react/DownloadProgressCallback.java +1 -1
  27. package/android/app/src/main/java/com/microsoft/codepush/react/FileUtils.java +1 -1
  28. package/android/app/src/main/java/com/microsoft/codepush/react/ReactInstanceHolder.java +1 -1
  29. package/android/app/src/main/java/com/microsoft/codepush/react/SettingsManager.java +1 -1
  30. package/android/app/src/main/java/com/microsoft/codepush/react/TLSSocketFactory.java +1 -1
  31. package/android/build.gradle +3 -0
  32. package/android/codepush.gradle +3 -3
  33. package/docs/advanced-usage.md +56 -0
  34. package/docs/api-android.md +12 -75
  35. package/docs/api-ios.md +5 -17
  36. package/docs/api-js.md +18 -55
  37. package/docs/setup-android.md +15 -397
  38. package/docs/setup-ios.md +24 -198
  39. package/docs/setup-windows.md +7 -74
  40. package/ios/CodePush/CodePush.h +4 -4
  41. package/ios/CodePush/CodePush.m +10 -9
  42. package/ios/CodePush/CodePushConfig.m +14 -11
  43. package/ios/CodePush/CodePushPackage.m +60 -60
  44. package/ios/CodePush/CodePushTelemetryManager.m +13 -13
  45. package/ios/CodePush.xcodeproj/project.pbxproj +24 -470
  46. package/ios/PrivacyInfo.xcprivacy +31 -0
  47. package/package.json +27 -24
  48. package/react-native.config.js +1 -1
  49. package/scripts/generateBundledResourcesHash.js +1 -1
  50. package/scripts/getFilesInFolder.js +1 -1
  51. package/scripts/recordFilesBeforeBundleCommand.js +1 -1
  52. package/typings/react-native-code-push.d.ts +22 -22
  53. package/windows/CodePush/CodePushConfig.cpp +3 -3
  54. package/windows/CodePush/CodePushConfig.h +3 -3
  55. package/windows/CodePush/CodePushNativeModule.cpp +27 -27
  56. package/windows/CodePush/CodePushNativeModule.h +4 -4
  57. package/windows/CodePush/CodePushTelemetryManager.cpp +12 -12
  58. package/windows/CodePush/CodePushTelemetryManager.h +1 -1
  59. package/.azurepipelines/build-rn-code-push-1es.yml +0 -104
  60. package/.azurepipelines/test-rn-code-push.yml +0 -94
  61. package/.config/CredScanSuppressions.json +0 -14
  62. package/SECURITY.md +0 -41
  63. package/docs/multi-deployment-testing-android.md +0 -148
  64. package/docs/multi-deployment-testing-ios.md +0 -59
  65. package/ios/CodePush/Base64/Base64/MF_Base64Additions.h +0 -34
  66. package/ios/CodePush/Base64/Base64/MF_Base64Additions.m +0 -252
  67. package/ios/CodePush/Base64/README.md +0 -47
  68. package/ios/CodePush/JWT/Core/Algorithms/Base/JWTAlgorithm.h +0 -69
  69. package/ios/CodePush/JWT/Core/Algorithms/Base/JWTAlgorithmFactory.h +0 -16
  70. package/ios/CodePush/JWT/Core/Algorithms/Base/JWTAlgorithmFactory.m +0 -51
  71. package/ios/CodePush/JWT/Core/Algorithms/Base/JWTAlgorithmNone.h +0 -15
  72. package/ios/CodePush/JWT/Core/Algorithms/Base/JWTAlgorithmNone.m +0 -55
  73. package/ios/CodePush/JWT/Core/Algorithms/ESFamily/JWTAlgorithmESBase.h +0 -24
  74. package/ios/CodePush/JWT/Core/Algorithms/ESFamily/JWTAlgorithmESBase.m +0 -41
  75. package/ios/CodePush/JWT/Core/Algorithms/HSFamily/JWTAlgorithmHSBase.h +0 -28
  76. package/ios/CodePush/JWT/Core/Algorithms/HSFamily/JWTAlgorithmHSBase.m +0 -205
  77. package/ios/CodePush/JWT/Core/Algorithms/Holders/JWTAlgorithmDataHolder.h +0 -103
  78. package/ios/CodePush/JWT/Core/Algorithms/Holders/JWTAlgorithmDataHolder.m +0 -322
  79. package/ios/CodePush/JWT/Core/Algorithms/Holders/JWTAlgorithmDataHolderChain.h +0 -37
  80. package/ios/CodePush/JWT/Core/Algorithms/Holders/JWTAlgorithmDataHolderChain.m +0 -145
  81. package/ios/CodePush/JWT/Core/Algorithms/RSFamily/JWTAlgorithmRSBase.h +0 -35
  82. package/ios/CodePush/JWT/Core/Algorithms/RSFamily/JWTAlgorithmRSBase.m +0 -551
  83. package/ios/CodePush/JWT/Core/Algorithms/RSFamily/JWTRSAlgorithm.h +0 -23
  84. package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoKey.h +0 -43
  85. package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoKey.m +0 -230
  86. package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoKeyExtractor.h +0 -31
  87. package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoKeyExtractor.m +0 -113
  88. package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoSecurity.h +0 -38
  89. package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoSecurity.m +0 -500
  90. package/ios/CodePush/JWT/Core/ClaimSet/JWTClaim.h +0 -18
  91. package/ios/CodePush/JWT/Core/ClaimSet/JWTClaim.m +0 -214
  92. package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSet.h +0 -23
  93. package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSet.m +0 -29
  94. package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSetSerializer.h +0 -19
  95. package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSetSerializer.m +0 -68
  96. package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSetVerifier.h +0 -18
  97. package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSetVerifier.m +0 -72
  98. package/ios/CodePush/JWT/Core/Coding/JWTCoding+ResultTypes.h +0 -67
  99. package/ios/CodePush/JWT/Core/Coding/JWTCoding+ResultTypes.m +0 -111
  100. package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionOne.h +0 -119
  101. package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionOne.m +0 -307
  102. package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionThree.h +0 -94
  103. package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionThree.m +0 -619
  104. package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionTwo.h +0 -164
  105. package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionTwo.m +0 -514
  106. package/ios/CodePush/JWT/Core/Coding/JWTCoding.h +0 -24
  107. package/ios/CodePush/JWT/Core/Coding/JWTCoding.m +0 -11
  108. package/ios/CodePush/JWT/Core/FrameworkSupplement/JWT.h +0 -52
  109. package/ios/CodePush/JWT/Core/FrameworkSupplement/Map.modulemap +0 -5
  110. package/ios/CodePush/JWT/Core/Supplement/JWTBase64Coder.h +0 -28
  111. package/ios/CodePush/JWT/Core/Supplement/JWTBase64Coder.m +0 -70
  112. package/ios/CodePush/JWT/Core/Supplement/JWTDeprecations.h +0 -22
  113. package/ios/CodePush/JWT/Core/Supplement/JWTErrorDescription.h +0 -34
  114. package/ios/CodePush/JWT/Core/Supplement/JWTErrorDescription.m +0 -73
  115. package/ios/CodePush/JWT/LICENSE +0 -19
  116. package/ios/CodePush/JWT/README.md +0 -489
  117. package/ios/CodePush/SSZipArchive/Common.h +0 -81
  118. package/ios/CodePush/SSZipArchive/README.md +0 -1
  119. package/ios/CodePush/SSZipArchive/SSZipArchive.h +0 -76
  120. package/ios/CodePush/SSZipArchive/SSZipArchive.m +0 -691
  121. package/ios/CodePush/SSZipArchive/aes/aes.h +0 -198
  122. package/ios/CodePush/SSZipArchive/aes/aes_via_ace.h +0 -541
  123. package/ios/CodePush/SSZipArchive/aes/aescrypt.c +0 -294
  124. package/ios/CodePush/SSZipArchive/aes/aeskey.c +0 -548
  125. package/ios/CodePush/SSZipArchive/aes/aesopt.h +0 -739
  126. package/ios/CodePush/SSZipArchive/aes/aestab.c +0 -391
  127. package/ios/CodePush/SSZipArchive/aes/aestab.h +0 -173
  128. package/ios/CodePush/SSZipArchive/aes/brg_endian.h +0 -126
  129. package/ios/CodePush/SSZipArchive/aes/brg_types.h +0 -219
  130. package/ios/CodePush/SSZipArchive/aes/entropy.c +0 -54
  131. package/ios/CodePush/SSZipArchive/aes/entropy.h +0 -16
  132. package/ios/CodePush/SSZipArchive/aes/fileenc.c +0 -144
  133. package/ios/CodePush/SSZipArchive/aes/fileenc.h +0 -121
  134. package/ios/CodePush/SSZipArchive/aes/hmac.c +0 -145
  135. package/ios/CodePush/SSZipArchive/aes/hmac.h +0 -103
  136. package/ios/CodePush/SSZipArchive/aes/prng.c +0 -155
  137. package/ios/CodePush/SSZipArchive/aes/prng.h +0 -82
  138. package/ios/CodePush/SSZipArchive/aes/pwd2key.c +0 -103
  139. package/ios/CodePush/SSZipArchive/aes/pwd2key.h +0 -57
  140. package/ios/CodePush/SSZipArchive/aes/sha1.c +0 -258
  141. package/ios/CodePush/SSZipArchive/aes/sha1.h +0 -73
  142. package/ios/CodePush/SSZipArchive/minizip/crypt.h +0 -130
  143. package/ios/CodePush/SSZipArchive/minizip/ioapi.c +0 -369
  144. package/ios/CodePush/SSZipArchive/minizip/ioapi.h +0 -175
  145. package/ios/CodePush/SSZipArchive/minizip/mztools.c +0 -284
  146. package/ios/CodePush/SSZipArchive/minizip/mztools.h +0 -31
  147. package/ios/CodePush/SSZipArchive/minizip/unzip.c +0 -1839
  148. package/ios/CodePush/SSZipArchive/minizip/unzip.h +0 -248
  149. package/ios/CodePush/SSZipArchive/minizip/zip.c +0 -1910
  150. package/ios/CodePush/SSZipArchive/minizip/zip.h +0 -202
  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