fix
This commit is contained in:
parent
4842eb29ae
commit
67c78df581
@ -27,6 +27,7 @@ let package = Package(
|
|||||||
name: "sdlan",
|
name: "sdlan",
|
||||||
dependencies: [
|
dependencies: [
|
||||||
.product(name: "NIOCore", package: "swift-nio"),
|
.product(name: "NIOCore", package: "swift-nio"),
|
||||||
|
.product(name: "NIOPosix", package: "swift-nio"),
|
||||||
.product(name: "SwiftProtobuf", package: "swift-protobuf")
|
.product(name: "SwiftProtobuf", package: "swift-protobuf")
|
||||||
]
|
]
|
||||||
),
|
),
|
||||||
|
|||||||
@ -6,20 +6,8 @@
|
|||||||
//
|
//
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
struct AESCipher {
|
protocol AESCipher {
|
||||||
let aesKey: Data
|
func decypt(aesKey: Data, data: Data) throws -> Data
|
||||||
let ivData: Data
|
|
||||||
|
|
||||||
init(aesKey: Data) {
|
func encrypt(aesKey: Data, data: Data) throws -> Data
|
||||||
self.aesKey = aesKey
|
|
||||||
self.ivData = Data(aesKey.prefix(16))
|
|
||||||
}
|
|
||||||
|
|
||||||
func decypt(data: Data) throws -> Data {
|
|
||||||
return try CC.crypt(.decrypt, blockMode: .cbc, algorithm: .aes, padding: .pkcs7Padding, data: data, key: aesKey, iv: ivData)
|
|
||||||
}
|
|
||||||
|
|
||||||
func encrypt(data: Data) throws -> Data {
|
|
||||||
return try CC.crypt(.encrypt, blockMode: .cbc, algorithm: .aes, padding: .pkcs7Padding, data: data, key: aesKey, iv: ivData)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,37 +6,8 @@
|
|||||||
//
|
//
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
struct RSACipher {
|
protocol RSACipher {
|
||||||
let pubKey: String
|
var pubKey: String {get set}
|
||||||
let privateKeyDER: Data
|
|
||||||
|
|
||||||
init(keySize: Int) throws {
|
|
||||||
let (privateKey, publicKey) = try Self.loadKeys(keySize: keySize)
|
|
||||||
let privKeyStr = SwKeyConvert.PrivateKey.derToPKCS1PEM(privateKey)
|
|
||||||
|
|
||||||
self.pubKey = SwKeyConvert.PublicKey.derToPKCS8PEM(publicKey)
|
|
||||||
self.privateKeyDER = try SwKeyConvert.PrivateKey.pemToPKCS1DER(privKeyStr)
|
|
||||||
}
|
|
||||||
|
|
||||||
public func decode(data: Data) throws -> Data {
|
|
||||||
let tag = Data()
|
|
||||||
let (decryptedData, _) = try CC.RSA.decrypt(data, derKey: self.privateKeyDER, tag: tag, padding: .pkcs1, digest: .none)
|
|
||||||
|
|
||||||
return decryptedData
|
|
||||||
}
|
|
||||||
|
|
||||||
private static func loadKeys(keySize: Int) throws -> (Data, Data) {
|
|
||||||
if let privateKey = UserDefaults.standard.data(forKey: "privateKey"),
|
|
||||||
let publicKey = UserDefaults.standard.data(forKey: "publicKey") {
|
|
||||||
|
|
||||||
return (privateKey, publicKey)
|
|
||||||
} else {
|
|
||||||
let (privateKey, publicKey) = try CC.RSA.generateKeyPair(keySize)
|
|
||||||
UserDefaults.standard.setValue(privateKey, forKey: "privateKey")
|
|
||||||
UserDefaults.standard.setValue(publicKey, forKey: "publicKey")
|
|
||||||
|
|
||||||
return (privateKey, publicKey)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
func decode(data: Data) throws -> Data
|
||||||
}
|
}
|
||||||
|
|||||||
@ -15,7 +15,7 @@ import Combine
|
|||||||
1. 处理rsa的加解密逻辑
|
1. 处理rsa的加解密逻辑
|
||||||
*/
|
*/
|
||||||
|
|
||||||
class SDLContext {
|
class SDLContext: @unchecked Sendable {
|
||||||
|
|
||||||
// 路由信息
|
// 路由信息
|
||||||
struct Route {
|
struct Route {
|
||||||
@ -38,7 +38,11 @@ class SDLContext {
|
|||||||
var natType: SDLNatProber.NatType = .blocked
|
var natType: SDLNatProber.NatType = .blocked
|
||||||
|
|
||||||
// AES加密,授权通过后,对象才会被创建
|
// AES加密,授权通过后,对象才会被创建
|
||||||
var aesCipher: AESCipher?
|
var aesCipher: AESCipher
|
||||||
|
|
||||||
|
// aes
|
||||||
|
var aesKey: Data = Data()
|
||||||
|
|
||||||
// rsa的相关配置, public_key是本地生成的
|
// rsa的相关配置, public_key是本地生成的
|
||||||
let rsaCipher: RSACipher
|
let rsaCipher: RSACipher
|
||||||
|
|
||||||
@ -75,9 +79,10 @@ class SDLContext {
|
|||||||
private var flowTracer = SDLFlowTracerActor()
|
private var flowTracer = SDLFlowTracerActor()
|
||||||
private var flowTracerCancel: AnyCancellable?
|
private var flowTracerCancel: AnyCancellable?
|
||||||
|
|
||||||
init(provider: NEPacketTunnelProvider, config: SDLConfiguration) throws {
|
init(provider: NEPacketTunnelProvider, config: SDLConfiguration, rsaCipher: RSACipher, aesCipher: AESCipher) throws {
|
||||||
self.config = config
|
self.config = config
|
||||||
self.rsaCipher = try RSACipher(keySize: 1024)
|
self.rsaCipher = rsaCipher
|
||||||
|
self.aesCipher = aesCipher
|
||||||
|
|
||||||
// 生成mac地址
|
// 生成mac地址
|
||||||
var devAddr = SDLDevAddr()
|
var devAddr = SDLDevAddr()
|
||||||
@ -117,7 +122,7 @@ class SDLContext {
|
|||||||
// 建立super的绑定关系
|
// 建立super的绑定关系
|
||||||
self.superCancel?.cancel()
|
self.superCancel?.cancel()
|
||||||
self.superCancel = self.superClient?.eventFlow.sink { event in
|
self.superCancel = self.superClient?.eventFlow.sink { event in
|
||||||
Task.detached {
|
Task {
|
||||||
await self.handleSuperEvent(event: event)
|
await self.handleSuperEvent(event: event)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -149,7 +154,8 @@ class SDLContext {
|
|||||||
|
|
||||||
// 服务器分配的tun网卡信息
|
// 服务器分配的tun网卡信息
|
||||||
await self.didNetworkConfigChanged(devAddr: self.devAddr)
|
await self.didNetworkConfigChanged(devAddr: self.devAddr)
|
||||||
self.aesCipher = AESCipher(aesKey: aesKey)
|
self.aesKey = aesKey
|
||||||
|
|
||||||
if upgradeType == .normal {
|
if upgradeType == .normal {
|
||||||
let normalUpgrade = NoticeMessage.UpgradeMessage(prompt: registerSuperAck.upgradePrompt, address: registerSuperAck.upgradeAddress)
|
let normalUpgrade = NoticeMessage.UpgradeMessage(prompt: registerSuperAck.upgradePrompt, address: registerSuperAck.upgradeAddress)
|
||||||
self.noticeClient.send(data: normalUpgrade.binaryData)
|
self.noticeClient.send(data: normalUpgrade.binaryData)
|
||||||
@ -212,7 +218,7 @@ class SDLContext {
|
|||||||
|
|
||||||
// 服务器分配的tun网卡信息
|
// 服务器分配的tun网卡信息
|
||||||
await self.didNetworkConfigChanged(devAddr: self.devAddr)
|
await self.didNetworkConfigChanged(devAddr: self.devAddr)
|
||||||
self.aesCipher = AESCipher(aesKey: aesKey)
|
self.aesKey = aesKey
|
||||||
|
|
||||||
var commandAck = SDLCommandAck()
|
var commandAck = SDLCommandAck()
|
||||||
commandAck.status = true
|
commandAck.status = true
|
||||||
@ -295,7 +301,7 @@ class SDLContext {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
guard let decyptedData = try? self.aesCipher?.decypt(data: Data(data.data)) else {
|
guard let decyptedData = try? self.aesCipher.decypt(aesKey: self.aesKey, data: Data(data.data)) else {
|
||||||
NSLog("[SDLContext] didReadData 2")
|
NSLog("[SDLContext] didReadData 2")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -441,7 +447,7 @@ class SDLContext {
|
|||||||
private func routeLayerPacket(dstMac: Data, type: LayerPacket.PacketType, data: Data) async {
|
private func routeLayerPacket(dstMac: Data, type: LayerPacket.PacketType, data: Data) async {
|
||||||
// 将数据封装层2层的数据包
|
// 将数据封装层2层的数据包
|
||||||
let layerPacket = LayerPacket(dstMac: dstMac, srcMac: self.devAddr.mac, type: type, data: data)
|
let layerPacket = LayerPacket(dstMac: dstMac, srcMac: self.devAddr.mac, type: type, data: data)
|
||||||
guard let encodedPacket = try? self.aesCipher?.encrypt(data: layerPacket.marshal()) else {
|
guard let encodedPacket = try? self.aesCipher.encrypt(aesKey: self.aesKey, data: layerPacket.marshal()) else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
struct SDLLogger {
|
struct SDLLogger: @unchecked Sendable {
|
||||||
enum Level {
|
enum Level {
|
||||||
case debug
|
case debug
|
||||||
case info
|
case info
|
||||||
@ -15,25 +15,8 @@ struct SDLLogger {
|
|||||||
case error
|
case error
|
||||||
}
|
}
|
||||||
|
|
||||||
static var logLevel: Level = .debug
|
|
||||||
|
|
||||||
static func log(_ message: String, level: Level = .debug) {
|
static func log(_ message: String, level: Level = .debug) {
|
||||||
switch logLevel {
|
|
||||||
case .debug:
|
|
||||||
NSLog(message)
|
NSLog(message)
|
||||||
case .info:
|
|
||||||
if level == .info || level == .warning || level == .error {
|
|
||||||
NSLog(message)
|
|
||||||
}
|
|
||||||
case .warning:
|
|
||||||
if level == .warning || level == .error {
|
|
||||||
NSLog(message)
|
|
||||||
}
|
|
||||||
case .error:
|
|
||||||
if level == .error {
|
|
||||||
NSLog(message)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -10,7 +10,7 @@ import Network
|
|||||||
import Combine
|
import Combine
|
||||||
|
|
||||||
// 监控网络的变化
|
// 监控网络的变化
|
||||||
class SDLNetworkMonitor {
|
class SDLNetworkMonitor: @unchecked Sendable {
|
||||||
private var monitor: NWPathMonitor
|
private var monitor: NWPathMonitor
|
||||||
private var interfaceType: NWInterface.InterfaceType?
|
private var interfaceType: NWInterface.InterfaceType?
|
||||||
private let publisher = PassthroughSubject<NWInterface.InterfaceType, Never>()
|
private let publisher = PassthroughSubject<NWInterface.InterfaceType, Never>()
|
||||||
|
|||||||
@ -87,7 +87,7 @@ class SDLUDPHole: ChannelInboundHandler, @unchecked Sendable {
|
|||||||
// MARK: client-client apis
|
// MARK: client-client apis
|
||||||
|
|
||||||
// 发送数据包到其他session
|
// 发送数据包到其他session
|
||||||
func sendPacket(context ctx: SDLContext, session: SDLContext.Session, data: Data) {
|
func sendPacket(context ctx: SDLContext, session: Session, data: Data) {
|
||||||
let remoteAddress = session.natAddress
|
let remoteAddress = session.natAddress
|
||||||
|
|
||||||
var dataPacket = SDLData()
|
var dataPacket = SDLData()
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user