@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.
- package/CodePush.js +22 -19
- package/CodePush.podspec +3 -3
- package/LICENSE.md +1 -1
- package/README.md +159 -296
- package/android/app/.gradle/config.properties +2 -0
- package/android/app/build.gradle +2 -0
- package/android/app/local.properties +8 -0
- package/android/app/src/main/AndroidManifest.xml +1 -2
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePush.java +27 -21
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushBuilder.java +5 -5
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushConstants.java +1 -1
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushDialog.java +1 -1
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushInstallMode.java +2 -2
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushInvalidPublicKeyException.java +2 -2
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushInvalidUpdateException.java +1 -1
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushMalformedDataException.java +2 -2
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushNativeModule.java +5 -5
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushNotInitializedException.java +2 -2
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushTelemetryManager.java +14 -14
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushUnknownException.java +2 -2
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushUpdateManager.java +1 -1
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushUpdateState.java +2 -2
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushUpdateUtils.java +16 -9
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushUtils.java +1 -1
- package/android/app/src/main/java/com/microsoft/codepush/react/DownloadProgress.java +1 -1
- package/android/app/src/main/java/com/microsoft/codepush/react/DownloadProgressCallback.java +1 -1
- package/android/app/src/main/java/com/microsoft/codepush/react/FileUtils.java +1 -1
- package/android/app/src/main/java/com/microsoft/codepush/react/ReactInstanceHolder.java +1 -1
- package/android/app/src/main/java/com/microsoft/codepush/react/SettingsManager.java +1 -1
- package/android/app/src/main/java/com/microsoft/codepush/react/TLSSocketFactory.java +1 -1
- package/android/build.gradle +3 -0
- package/android/codepush.gradle +3 -3
- package/docs/advanced-usage.md +56 -0
- package/docs/api-android.md +12 -75
- package/docs/api-ios.md +5 -17
- package/docs/api-js.md +18 -55
- package/docs/setup-android.md +15 -397
- package/docs/setup-ios.md +24 -198
- package/docs/setup-windows.md +7 -74
- package/ios/CodePush/CodePush.h +4 -4
- package/ios/CodePush/CodePush.m +10 -9
- package/ios/CodePush/CodePushConfig.m +14 -11
- package/ios/CodePush/CodePushPackage.m +60 -60
- package/ios/CodePush/CodePushTelemetryManager.m +13 -13
- package/ios/CodePush.xcodeproj/project.pbxproj +24 -470
- package/ios/PrivacyInfo.xcprivacy +31 -0
- package/package.json +27 -24
- package/react-native.config.js +1 -1
- package/scripts/generateBundledResourcesHash.js +1 -1
- package/scripts/getFilesInFolder.js +1 -1
- package/scripts/recordFilesBeforeBundleCommand.js +1 -1
- package/typings/react-native-code-push.d.ts +22 -22
- package/windows/CodePush/CodePushConfig.cpp +3 -3
- package/windows/CodePush/CodePushConfig.h +3 -3
- package/windows/CodePush/CodePushNativeModule.cpp +27 -27
- package/windows/CodePush/CodePushNativeModule.h +4 -4
- package/windows/CodePush/CodePushTelemetryManager.cpp +12 -12
- package/windows/CodePush/CodePushTelemetryManager.h +1 -1
- package/.azurepipelines/build-rn-code-push-1es.yml +0 -104
- package/.azurepipelines/test-rn-code-push.yml +0 -94
- package/.config/CredScanSuppressions.json +0 -14
- package/SECURITY.md +0 -41
- package/docs/multi-deployment-testing-android.md +0 -148
- package/docs/multi-deployment-testing-ios.md +0 -59
- package/ios/CodePush/Base64/Base64/MF_Base64Additions.h +0 -34
- package/ios/CodePush/Base64/Base64/MF_Base64Additions.m +0 -252
- package/ios/CodePush/Base64/README.md +0 -47
- package/ios/CodePush/JWT/Core/Algorithms/Base/JWTAlgorithm.h +0 -69
- package/ios/CodePush/JWT/Core/Algorithms/Base/JWTAlgorithmFactory.h +0 -16
- package/ios/CodePush/JWT/Core/Algorithms/Base/JWTAlgorithmFactory.m +0 -51
- package/ios/CodePush/JWT/Core/Algorithms/Base/JWTAlgorithmNone.h +0 -15
- package/ios/CodePush/JWT/Core/Algorithms/Base/JWTAlgorithmNone.m +0 -55
- package/ios/CodePush/JWT/Core/Algorithms/ESFamily/JWTAlgorithmESBase.h +0 -24
- package/ios/CodePush/JWT/Core/Algorithms/ESFamily/JWTAlgorithmESBase.m +0 -41
- package/ios/CodePush/JWT/Core/Algorithms/HSFamily/JWTAlgorithmHSBase.h +0 -28
- package/ios/CodePush/JWT/Core/Algorithms/HSFamily/JWTAlgorithmHSBase.m +0 -205
- package/ios/CodePush/JWT/Core/Algorithms/Holders/JWTAlgorithmDataHolder.h +0 -103
- package/ios/CodePush/JWT/Core/Algorithms/Holders/JWTAlgorithmDataHolder.m +0 -322
- package/ios/CodePush/JWT/Core/Algorithms/Holders/JWTAlgorithmDataHolderChain.h +0 -37
- package/ios/CodePush/JWT/Core/Algorithms/Holders/JWTAlgorithmDataHolderChain.m +0 -145
- package/ios/CodePush/JWT/Core/Algorithms/RSFamily/JWTAlgorithmRSBase.h +0 -35
- package/ios/CodePush/JWT/Core/Algorithms/RSFamily/JWTAlgorithmRSBase.m +0 -551
- package/ios/CodePush/JWT/Core/Algorithms/RSFamily/JWTRSAlgorithm.h +0 -23
- package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoKey.h +0 -43
- package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoKey.m +0 -230
- package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoKeyExtractor.h +0 -31
- package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoKeyExtractor.m +0 -113
- package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoSecurity.h +0 -38
- package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoSecurity.m +0 -500
- package/ios/CodePush/JWT/Core/ClaimSet/JWTClaim.h +0 -18
- package/ios/CodePush/JWT/Core/ClaimSet/JWTClaim.m +0 -214
- package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSet.h +0 -23
- package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSet.m +0 -29
- package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSetSerializer.h +0 -19
- package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSetSerializer.m +0 -68
- package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSetVerifier.h +0 -18
- package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSetVerifier.m +0 -72
- package/ios/CodePush/JWT/Core/Coding/JWTCoding+ResultTypes.h +0 -67
- package/ios/CodePush/JWT/Core/Coding/JWTCoding+ResultTypes.m +0 -111
- package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionOne.h +0 -119
- package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionOne.m +0 -307
- package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionThree.h +0 -94
- package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionThree.m +0 -619
- package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionTwo.h +0 -164
- package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionTwo.m +0 -514
- package/ios/CodePush/JWT/Core/Coding/JWTCoding.h +0 -24
- package/ios/CodePush/JWT/Core/Coding/JWTCoding.m +0 -11
- package/ios/CodePush/JWT/Core/FrameworkSupplement/JWT.h +0 -52
- package/ios/CodePush/JWT/Core/FrameworkSupplement/Map.modulemap +0 -5
- package/ios/CodePush/JWT/Core/Supplement/JWTBase64Coder.h +0 -28
- package/ios/CodePush/JWT/Core/Supplement/JWTBase64Coder.m +0 -70
- package/ios/CodePush/JWT/Core/Supplement/JWTDeprecations.h +0 -22
- package/ios/CodePush/JWT/Core/Supplement/JWTErrorDescription.h +0 -34
- package/ios/CodePush/JWT/Core/Supplement/JWTErrorDescription.m +0 -73
- package/ios/CodePush/JWT/LICENSE +0 -19
- package/ios/CodePush/JWT/README.md +0 -489
- package/ios/CodePush/SSZipArchive/Common.h +0 -81
- package/ios/CodePush/SSZipArchive/README.md +0 -1
- package/ios/CodePush/SSZipArchive/SSZipArchive.h +0 -76
- package/ios/CodePush/SSZipArchive/SSZipArchive.m +0 -691
- package/ios/CodePush/SSZipArchive/aes/aes.h +0 -198
- package/ios/CodePush/SSZipArchive/aes/aes_via_ace.h +0 -541
- package/ios/CodePush/SSZipArchive/aes/aescrypt.c +0 -294
- package/ios/CodePush/SSZipArchive/aes/aeskey.c +0 -548
- package/ios/CodePush/SSZipArchive/aes/aesopt.h +0 -739
- package/ios/CodePush/SSZipArchive/aes/aestab.c +0 -391
- package/ios/CodePush/SSZipArchive/aes/aestab.h +0 -173
- package/ios/CodePush/SSZipArchive/aes/brg_endian.h +0 -126
- package/ios/CodePush/SSZipArchive/aes/brg_types.h +0 -219
- package/ios/CodePush/SSZipArchive/aes/entropy.c +0 -54
- package/ios/CodePush/SSZipArchive/aes/entropy.h +0 -16
- package/ios/CodePush/SSZipArchive/aes/fileenc.c +0 -144
- package/ios/CodePush/SSZipArchive/aes/fileenc.h +0 -121
- package/ios/CodePush/SSZipArchive/aes/hmac.c +0 -145
- package/ios/CodePush/SSZipArchive/aes/hmac.h +0 -103
- package/ios/CodePush/SSZipArchive/aes/prng.c +0 -155
- package/ios/CodePush/SSZipArchive/aes/prng.h +0 -82
- package/ios/CodePush/SSZipArchive/aes/pwd2key.c +0 -103
- package/ios/CodePush/SSZipArchive/aes/pwd2key.h +0 -57
- package/ios/CodePush/SSZipArchive/aes/sha1.c +0 -258
- package/ios/CodePush/SSZipArchive/aes/sha1.h +0 -73
- package/ios/CodePush/SSZipArchive/minizip/crypt.h +0 -130
- package/ios/CodePush/SSZipArchive/minizip/ioapi.c +0 -369
- package/ios/CodePush/SSZipArchive/minizip/ioapi.h +0 -175
- package/ios/CodePush/SSZipArchive/minizip/mztools.c +0 -284
- package/ios/CodePush/SSZipArchive/minizip/mztools.h +0 -31
- package/ios/CodePush/SSZipArchive/minizip/unzip.c +0 -1839
- package/ios/CodePush/SSZipArchive/minizip/unzip.h +0 -248
- package/ios/CodePush/SSZipArchive/minizip/zip.c +0 -1910
- package/ios/CodePush/SSZipArchive/minizip/zip.h +0 -202
- package/scripts/postlink/android/postlink.js +0 -87
- package/scripts/postlink/ios/postlink.js +0 -116
- package/scripts/postlink/run.js +0 -11
- package/scripts/postunlink/android/postunlink.js +0 -74
- package/scripts/postunlink/ios/postunlink.js +0 -87
- package/scripts/postunlink/run.js +0 -11
- package/scripts/tools/linkToolsAndroid.js +0 -57
- package/scripts/tools/linkToolsIos.js +0 -130
- package/windows-legacy/CodePush/CodePush.csproj +0 -128
- package/windows-legacy/CodePush/CodePushUtils.cs +0 -47
- package/windows-legacy/CodePush/FileUtils.cs +0 -40
- package/windows-legacy/CodePush/Properties/AssemblyInfo.cs +0 -29
- package/windows-legacy/CodePush/Properties/CodePush.rd.xml +0 -33
- package/windows-legacy/CodePush/UpdateManager.cs +0 -305
- package/windows-legacy/CodePush/UpdateUtils.cs +0 -46
- package/windows-legacy/CodePush.Net46/Adapters/Http/HttpProgress.cs +0 -28
- package/windows-legacy/CodePush.Net46/Adapters/Storage/ApplicationDataContainer.cs +0 -106
- package/windows-legacy/CodePush.Net46/CodePush.Net46.csproj +0 -103
- package/windows-legacy/CodePush.Net46/CodePushUtils.cs +0 -158
- package/windows-legacy/CodePush.Net46/FileUtils.cs +0 -55
- package/windows-legacy/CodePush.Net46/Properties/AssemblyInfo.cs +0 -36
- package/windows-legacy/CodePush.Net46/UpdateManager.cs +0 -330
- package/windows-legacy/CodePush.Net46/UpdateUtils.cs +0 -70
- package/windows-legacy/CodePush.Net46/packages.config +0 -5
- package/windows-legacy/CodePush.Net46.Test/ApplicationDataContainerTest.cs +0 -105
- package/windows-legacy/CodePush.Net46.Test/CodePush.Net46.Test.csproj +0 -137
- package/windows-legacy/CodePush.Net46.Test/Properties/AssemblyInfo.cs +0 -36
- package/windows-legacy/CodePush.Net46.Test/TelemetryManagerTest.cs +0 -117
- package/windows-legacy/CodePush.Net46.Test/app.config +0 -11
- package/windows-legacy/CodePush.Net46.Test/packages.config +0 -4
- package/windows-legacy/CodePush.Shared/CodePush.Shared.projitems +0 -22
- package/windows-legacy/CodePush.Shared/CodePush.Shared.shproj +0 -13
- package/windows-legacy/CodePush.Shared/CodePushConstants.cs +0 -35
- package/windows-legacy/CodePush.Shared/CodePushNativeModule.cs +0 -329
- package/windows-legacy/CodePush.Shared/CodePushReactPackage.cs +0 -235
- package/windows-legacy/CodePush.Shared/CodePushUtils.cs +0 -70
- package/windows-legacy/CodePush.Shared/InstallMode.cs +0 -9
- package/windows-legacy/CodePush.Shared/MinimumBackgroundListener.cs +0 -44
- package/windows-legacy/CodePush.Shared/SettingsManager.cs +0 -148
- package/windows-legacy/CodePush.Shared/TelemetryManager.cs +0 -250
- 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
|