TLS/SSL
The XMPPStream automatically uses TLS if it is required by a XMPP Server. To start TLS regardless of whether it is optional or required by a XMPP server, set the startTLSPolicy property on XMPPStream to XMPPStreamStartTLSPolicyRequired
xmppStream.startTLSPolicy = XMPPStreamStartTLSPolicyRequired;
Security Settings
Immediately prior to the stream being secured via TLS/SSL the xmppStream:willSecureWithSettings: method is called, to manually evaluate the connection GCDAsyncSocketManuallyEvaluateTrust must be added to the settings with a value of @(YES)
- (void)xmppStream:(XMPPStream *)sender willSecureWithSettings:(NSMutableDictionary *)settings
{
settings[GCDAsyncSocketManuallyEvaluateTrust] = @(YES);
}
Then in the delegate method xmppStream:didReceiveTrust:completionHandler:, you can use SecTrustEvaluate (and related functions) to properly validate the peer.
- (void)xmppStream:(XMPPStream *)sender
didReceiveTrust:(SecTrustRef)trust
completionHandler:(void (^)(BOOL shouldTrustPeer))completionHandler
{
completionHandler(YES);
}
Cipher Suites
This is an advanced setting, do not set this unless you understand the consequences.
To set the supported Cipher Suites, set the GCDAsyncSocketSSLCipherSuites to an array of NSNumber each of which represents a SSLCipherSuite:
- (void)xmppStream:(XMPPStream *)sender willSecureWithSettings:(NSMutableDictionary *)settings
{
NSMutableArray *cipherSuites = [NSMutableArray array];
size_t numberOfCiphers = 0;
SSLContextRef sslContext = SSLCreateContext(kCFAllocatorDefault, kSSLClientSide, kSSLStreamType);
SSLGetNumberSupportedCiphers(sslContext, &numberOfCiphers);
SSLCipherSuite ciphers[numberOfCiphers];
SSLGetSupportedCiphers(sslContext, ciphers, &numberOfCiphers);
for (NSUInteger index = 0; index < numberOfCiphers; index++)
{
NSNumber *cipher = [NSNumber numberWithUnsignedShort:ciphers[index]];
[cipherSuites addObject:cipher];
}
[settings setObject:cipherSuites forKey:GCDAsyncSocketSSLCipherSuites];
}