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",
dependencies: [
.product(name: "NIOCore", package: "swift-nio"),
.product(name: "NIOPosix", package: "swift-nio"),
.product(name: "SwiftProtobuf", package: "swift-protobuf")
]
),

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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