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