// // MQTTSSLSecurityPolicyDecoder.m // MQTTClient.framework // // Copyright © 2013-2017, Christoph Krey. All rights reserved. // #import "MQTTSSLSecurityPolicyDecoder.h" #import "MQTTLog.h" @interface MQTTSSLSecurityPolicyDecoder() @property (nonatomic) BOOL securityPolicyApplied; @end @implementation MQTTSSLSecurityPolicyDecoder - (instancetype)init { self = [super init]; self.securityPolicy = nil; self.securityDomain = nil; return self; } - (BOOL)applySSLSecurityPolicy:(NSStream *)readStream withEvent:(NSStreamEvent)eventCode{ if (!self.securityPolicy) { return YES; } if (self.securityPolicyApplied) { return YES; } SecTrustRef serverTrust = (__bridge SecTrustRef) [readStream 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 & NSStreamEventHasBytesAvailable) { DDLogVerbose(@"[MQTTCFSocketDecoder] NSStreamEventHasBytesAvailable"); if (![self applySSLSecurityPolicy:sender withEvent:eventCode]){ self.state = MQTTCFSocketDecoderStateError; self.error = [NSError errorWithDomain:@"MQTT" code:errSSLXCertChainInvalid userInfo:@{NSLocalizedDescriptionKey: @"Unable to apply security policy, the SSL connection is insecure!"}]; [self.delegate decoder:self didFailWithError:self.error]; return; } } [super stream:sender handleEvent:eventCode]; } @end