Fixes AFSSLPinningModePublicKey on OS X.
This commit is contained in:
parent
3163069cbc
commit
f1cfb96ad7
1 changed files with 28 additions and 4 deletions
|
|
@ -107,6 +107,26 @@ static inline BOOL AFStateTransitionIsValid(AFOperationState fromState, AFOperat
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if !defined(__IPHONE_OS_VERSION_MIN_REQUIRED)
|
||||||
|
static NSData *AFSecKeyGetData(SecKeyRef key) {
|
||||||
|
CFDataRef data = NULL;
|
||||||
|
|
||||||
|
OSStatus status = SecItemExport(key, kSecFormatUnknown, kSecItemPemArmour, NULL, &data);
|
||||||
|
NSCAssert(status == errSecSuccess, @"SecItemExport error: %ld", (long int)status);
|
||||||
|
NSCParameterAssert(data);
|
||||||
|
|
||||||
|
return (__bridge_transfer NSData *)data;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static BOOL AFSecKeyIsEqualToKey(SecKeyRef key1, SecKeyRef key2) {
|
||||||
|
#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED)
|
||||||
|
return [(__bridge id)key1 isEqual:(__bridge id)key2];
|
||||||
|
#else
|
||||||
|
return [AFSecKeyGetData(key1) isEqual:AFSecKeyGetData(key2)];
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
@interface AFURLConnectionOperation ()
|
@interface AFURLConnectionOperation ()
|
||||||
@property (readwrite, nonatomic, assign) AFOperationState state;
|
@property (readwrite, nonatomic, assign) AFOperationState state;
|
||||||
@property (readwrite, nonatomic, assign, getter = isCancelled) BOOL cancelled;
|
@property (readwrite, nonatomic, assign, getter = isCancelled) BOOL cancelled;
|
||||||
|
|
@ -616,11 +636,15 @@ willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challe
|
||||||
|
|
||||||
switch (self.SSLPinningMode) {
|
switch (self.SSLPinningMode) {
|
||||||
case AFSSLPinningModePublicKey: {
|
case AFSSLPinningModePublicKey: {
|
||||||
|
NSArray *pinnedPublicKeys = [self.class pinnedPublicKeys];
|
||||||
|
|
||||||
for (id publicKey in trustChain) {
|
for (id publicKey in trustChain) {
|
||||||
if ([[self.class pinnedPublicKeys] containsObject:publicKey]) {
|
for (id pinnedPublicKey in pinnedPublicKeys) {
|
||||||
NSURLCredential *credential = [NSURLCredential credentialForTrust:serverTrust];
|
if (AFSecKeyIsEqualToKey((__bridge SecKeyRef)publicKey, (__bridge SecKeyRef)pinnedPublicKey)) {
|
||||||
[[challenge sender] useCredential:credential forAuthenticationChallenge:challenge];
|
NSURLCredential *credential = [NSURLCredential credentialForTrust:serverTrust];
|
||||||
return;
|
[[challenge sender] useCredential:credential forAuthenticationChallenge:challenge];
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue