//import Foundation // //extension ShadowsocksAdapter { // public struct StreamObfuscater { // public class Factory { // public init() {} // // public func build(for session: ConnectSession) -> StreamObfuscaterBase { // return StreamObfuscaterBase(for: session) // } // } // // public class StreamObfuscaterBase { // public weak var inputStreamProcessor: ShadowsocksAdapter! // private weak var _outputStreamProcessor: CryptoStreamProcessor! // public var outputStreamProcessor: CryptoStreamProcessor! { // get { // return _outputStreamProcessor // } // set { // _outputStreamProcessor = newValue // key = _outputStreamProcessor?.key // writeIV = _outputStreamProcessor?.writeIV // } // } // // public var key: Data? // public var writeIV: Data? // // let session: ConnectSession // // init(for session: ConnectSession) { // self.session = session // } // // func output(data: Data) {} // func input(data: Data) throws {} // } // // public class OriginStreamObfuscater: StreamObfuscaterBase { // public class Factory: StreamObfuscater.Factory { // public override init() {} // // public override func build(for session: ConnectSession) -> ShadowsocksAdapter.StreamObfuscater.StreamObfuscaterBase { // return OriginStreamObfuscater(for: session) // } // } // // private var requestSend = false // // private func requestData(withData data: Data) -> Data { // let hostLength = session.host.utf8.count // let length = 1 + 1 + hostLength + 2 + data.count // var response = Data(count: length) // response[0] = 3 // response[1] = UInt8(hostLength) // response.replaceSubrange(2..<2+hostLength, with: session.host.utf8) // var beport = UInt16(session.port).bigEndian // withUnsafeBytes(of: &beport) { // response.replaceSubrange(2+hostLength..<4+hostLength, with: $0) // } // response.replaceSubrange(4+hostLength.. ShadowsocksAdapter.StreamObfuscater.StreamObfuscaterBase { // return OTAStreamObfuscater(for: session) // } // } // // private var count: UInt32 = 0 // // private let DATA_BLOCK_SIZE = 0xFFFF - 12 // // private var requestSend = false // // private func requestData() -> Data { // var response: [UInt8] = [0x13] // response.append(UInt8(session.host.utf8.count)) // response += [UInt8](session.host.utf8) // response += [UInt8](Utils.toByteArray(UInt16(session.port)).reversed()) // var responseData = Data(bytes: UnsafePointer(response), count: response.count) // var keyiv = Data(count: key!.count + writeIV!.count) // // keyiv.replaceSubrange(0.. fullBlockCount * DATA_BLOCK_SIZE { // outputSize += data.count - fullBlockCount * DATA_BLOCK_SIZE + 10 + 2 // } // // let _requestData: Data = requestData() // if !requestSend { // outputSize += _requestData.count // } // // var outputData = Data(count: outputSize) // var outputOffset = 0 // var dataOffset = 0 // // if !requestSend { // requestSend = true // outputData.replaceSubrange(0..<_requestData.count, with: _requestData) // outputOffset += _requestData.count // } // // while outputOffset != outputSize { // let blockLength = min(data.count - dataOffset, DATA_BLOCK_SIZE) // var len = UInt16(blockLength).bigEndian // withUnsafeBytes(of: &len) { // outputData.replaceSubrange(outputOffset..