This commit is contained in:
anlicheng 2025-07-15 00:17:20 +08:00
parent 4842eb29ae
commit 67c78df581
8 changed files with 27 additions and 2501 deletions

View File

@ -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")
] ]
), ),

View File

@ -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)
}
} }

View File

@ -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
} }

View File

@ -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
} }

View File

@ -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 { NSLog(message)
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)
}
}
} }
} }

View File

@ -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>()
@ -29,7 +29,7 @@ class SDLNetworkMonitor {
} }
func start() { func start() {
self.monitor.pathUpdateHandler = { path in self.monitor.pathUpdateHandler = {path in
if path.status == .satisfied { if path.status == .satisfied {
if path.usesInterfaceType(.wifi) { if path.usesInterfaceType(.wifi) {
self.publisher.send(.wifi) self.publisher.send(.wifi)

View File

@ -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