DESCracker/ios/DESCracker/Network/Protocol.swift
Tom Butcher ac345b2859 Refactor iOS application structure for DES Cracker
- Replaced Objective-C AppDelegate with Swift implementation for better performance and modern syntax.
- Removed legacy files (AppDelegate.h, AppDelegate.m, main.m, PSCBruteEngine.h, PSCBruteEngine.m, PSCCpuEngine.h, PSCCpuEngine.m, PSCMetalEngine.h, PSCMetalEngine.m, PSCProtocol.h, PSCProtocol.m, PSCSlaveClient.h, PSCSlaveClient.m) to streamline the codebase.
- Introduced new Compute engines (CpuEngine and MetalEngine) for enhanced brute force capabilities.
- Updated Info.plist to support multiple scenes and added scene delegate for improved lifecycle management.
- Modified results.json to reflect updated elapsed time for brute force operations.
2026-09-19 19:20:55 +01:00

145 lines
4.3 KiB
Swift

import Foundation
enum Wire {
static let protocolVersion = 2
static let defaultPort = 9876
static let progressInterval: TimeInterval = 0.5
static let pingInterval: TimeInterval = 5.0
static func formatDec64(_ value: UInt64) -> String {
String(value)
}
static func formatHex64(_ value: UInt64) -> String {
String(format: "%016llx", value)
}
static func formatCount(_ value: UInt64) -> String {
let n = Double(value)
if n >= 1e9 { return String(format: "%.1fB", n / 1e9) }
if n >= 1e6 { return String(format: "%.1fM", n / 1e6) }
if n >= 1e3 { return String(format: "%.1fk", n / 1e3) }
return String(format: "%.0f", n)
}
static func formatRate(_ rate: Double) -> String {
guard rate > 0, rate.isFinite else { return "—" }
return "\(formatCount(UInt64(rate.rounded())))/s"
}
static func parseDec64(_ value: Any?) -> UInt64 {
if let string = value as? String {
return strtoull(string, nil, 10)
}
if let number = value as? NSNumber {
return number.uint64Value
}
return 0
}
static func parseHex64(_ hex: String) -> UInt64 {
guard !hex.isEmpty else { return 0 }
var parsed = hex
if parsed.hasPrefix("0x") || parsed.hasPrefix("0X") {
parsed = String(parsed.dropFirst(2))
}
return strtoull(parsed, nil, 16)
}
static func decodeMessage(_ raw: String) -> [String: Any]? {
guard let data = raw.data(using: .utf8),
let parsed = try? JSONSerialization.jsonObject(with: data) as? [String: Any],
parsed["type"] is String
else {
return nil
}
return parsed
}
static func encodeMessage(_ msg: [String: Any]) -> String? {
guard JSONSerialization.isValidJSONObject(msg),
let data = try? JSONSerialization.data(withJSONObject: msg)
else {
return nil
}
return String(data: data, encoding: .utf8)
}
}
final class ComputeDevice {
var key = ""
var deviceId = 0
var name = ""
var type = "cpu"
var cores: NSNumber?
var memory: NSNumber?
func jsonObject() -> [String: Any] {
var json: [String: Any] = [
"key": key,
"id": deviceId,
"name": name,
"type": type,
]
if let cores { json["cores"] = cores }
if let memory { json["memory"] = memory }
return json
}
}
final class AssignBlock {
var jobId = ""
var deviceKey = ""
var start: UInt64 = 0
var count: UInt64 = 0
var keyLen: UInt32 = 0
var charset = ""
var padByte: UInt32 = 0
var target: UInt64 = 0
var fills: [UInt64] = []
var cpuWorkers: Int?
static func fromJSON(_ json: [String: Any]) -> AssignBlock? {
let block = AssignBlock()
block.jobId = json["jobId"] as? String ?? ""
block.deviceKey = json["deviceKey"] as? String ?? ""
block.start = Wire.parseDec64(json["start"])
block.count = Wire.parseDec64(json["count"])
block.keyLen = UInt32(Wire.parseDec64(json["keyLen"]))
block.charset = json["charset"] as? String ?? ""
block.padByte = UInt32(Wire.parseDec64(json["padByte"]) & 0xFF)
if let target = json["target"] as? String {
block.target = Wire.parseHex64(target)
} else {
block.target = Wire.parseDec64(json["target"])
}
if let fillsVal = json["fills"] as? [Any] {
for item in fillsVal.prefix(8) {
if let hex = item as? String {
block.fills.append(Wire.parseHex64(hex))
} else {
block.fills.append(Wire.parseDec64(item))
}
}
}
if json["cpuWorkers"] != nil {
block.cpuWorkers = Int(Wire.parseDec64(json["cpuWorkers"]))
}
if block.jobId.isEmpty || block.count == 0 || block.keyLen == 0 || block.charset.isEmpty {
return nil
}
return block
}
}
final class WorkerSnapshot {
var deviceKey = ""
var deviceName = ""
var deviceType = ""
var current = "idle"
var pct = 0.0
var completedBlocks = 0
var rate = 0.0
var busy = false
}