- 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.
145 lines
4.3 KiB
Swift
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
|
|
}
|