//
|
// MQTTSSLSecurityPolicyEncoder.m
|
// MQTTClient.framework
|
//
|
// Copyright © 2013-2017, Christoph Krey. All rights reserved.
|
//
|
|
#import "MQTTSSLSecurityPolicyEncoder.h"
|
|
#import "MQTTLog.h"
|
|
@interface MQTTSSLSecurityPolicyEncoder()
|
@property (nonatomic) BOOL securityPolicyApplied;
|
|
@end
|
|
@implementation MQTTSSLSecurityPolicyEncoder
|
|
- (instancetype)init {
|
self = [super init];
|
self.securityPolicy = nil;
|
self.securityDomain = nil;
|
|
return self;
|
}
|
|
- (BOOL)applySSLSecurityPolicy:(NSStream *)writeStream withEvent:(NSStreamEvent)eventCode {
|
if (!self.securityPolicy) {
|
return YES;
|
}
|
|
if (self.securityPolicyApplied) {
|
return YES;
|
}
|
|
SecTrustRef serverTrust = (__bridge SecTrustRef)[writeStream propertyForKey:(__bridge NSString *)kCFStreamPropertySSLPeerTrust];
|
if (!serverTrust) {
|
return NO;
|
}
|
|
self.securityPolicyApplied = [self.securityPolicy evaluateServerTrust:serverTrust forDomain:self.securityDomain];
|
return self.securityPolicyApplied;
|
}
|
|
- (void)stream:(NSStream *)sender handleEvent:(NSStreamEvent)eventCode {
|
if (eventCode & NSStreamEventHasSpaceAvailable) {
|
DDLogVerbose(@"[MQTTCFSocketEncoder] NSStreamEventHasSpaceAvailable");
|
if (![self applySSLSecurityPolicy:sender withEvent:eventCode]){
|
self.state = MQTTCFSocketEncoderStateError;
|
self.error = [NSError errorWithDomain:@"MQTT"
|
code:errSSLXCertChainInvalid
|
userInfo:@{NSLocalizedDescriptionKey: @"Unable to apply security policy, the SSL connection is insecure!"}];
|
[self.delegate encoder:self didFailWithError:self.error];
|
return;
|
}
|
}
|
[super stream:sender handleEvent:eventCode];
|
}
|
|
@end
|