I been looking at Network api for apple and was able to setup web socket connection with tcp. I believe this creates ws:// instead of wss://. So I have been looking at tls connection but having a trouble figuring out how to set up NWParameters.tls. my goal is to create wss:// web socket server on MacOS.
my init for my server is
self.port = NWEndpoint.Port(rawValue: port)!
sec_protocol_options_append_tls_ciphersuite(NWProtocolTLS.Options().securityProtocolOptions,
tls_ciphersuite_t(rawValue:mUInt16((TLS_PSK_WITH_AES_128_GCM_SHA256)))!)
parameters = NWParameters.tls
parameters.allowLocalEndpointReuse = true
parameters.includePeerToPeer = true
let wsOptions = NWProtocolWebSocket.Options()
wsOptions.autoReplyPing = true parameters.defaultProtocolStack.applicationProtocols.insert(wsOptions, at: 0)
listener = try! NWListener(using: parameters, on: self.port)
Using the tic-tac-toe example, I thought I was missing sec_protocol_options_append_tls_ciphersuite, but it doesn't allow me connecting to my server. Do I need authenticationKey convert it to HMAC.authenticationCode then get Dispatch Data and use sec_protocol_options_add_pre_shared_key? or am I missing different kind of certification? I am using https://www.piesocket.com/websocket-tester to test my connection currently.
I created an example of the exact code you are looking for (WebSocket NWListener using TLS-PSK) in the sample project for Configuring a Wi-Fi Accessory to Join the User’s Network. Here is a small sample of this:
extension NWParameters {
convenience init(psk: String, pskIdentity: String) {
// Create parameters with custom TLS options (Default with TLS).
self.init(tls: NWParameters.tlsOptions(psk: psk, pskIdentity: pskIdentity))
// Use the WebSocket protocol.
let webSocketOptions = NWProtocolWebSocket.Options()
self.defaultProtocolStack.applicationProtocols.insert(webSocketOptions, at: 0)
}
/// Create TLS options with a preshared key and its identity to use on both NWListener and NWConnection.
private static func tlsOptions(psk: String, pskIdentity: String) -> NWProtocolTLS.Options {
let tlsOptions = NWProtocolTLS.Options()
sec_protocol_options_set_min_tls_protocol_version(tlsOptions.securityProtocolOptions, .TLSv12)
sec_protocol_options_append_tls_ciphersuite(
tlsOptions.securityProtocolOptions,
tls_ciphersuite_t(rawValue: UInt16(TLS_PSK_WITH_AES_128_GCM_SHA256))!
)
let pskData = Data(psk.utf8)
let pskDispatchData = pskData.withUnsafeBytes { buf in
DispatchData(bytes: buf)
}
let pskIdentityData = Data(pskIdentity.utf8)
let pskIdentityDispatchData = pskIdentityData.withUnsafeBytes { buf in
DispatchData(bytes: buf)
}
sec_protocol_options_add_pre_shared_key(
tlsOptions.securityProtocolOptions,
pskDispatchData as __DispatchData,
pskIdentityDispatchData as __DispatchData
)
return tlsOptions
}
}