/* DomainHasher — Swift-Port von `android/.../filter/DomainHasher.kt`. Domain-Hashing — IDENTISCH zu `server/utils/domainHash.ts` und der Android- Implementierung. Produziert die ersten 8 Bytes des SHA-256 als big-endian UInt64. Der Server liefert die Hash-Liste in dieser Form; iOS und Android lesen sie 1:1. Privacy: arbeitet rein lokal — keine Klartext-Domain verlässt das Gerät. */ import Foundation import CryptoKit enum DomainHasher { /// Normalisiert einen Hostname analog zu Server + Android. /// - lowercase /// - http(s):// strippen /// - Pfad/Query/Anchor (alles ab erstem `/`) abschneiden /// - leading "www." entfernen /// /// Muss BIT-IDENTISCH zu `DomainHasher.kt#normalize` bleiben, sonst matchen /// die Hashes nicht gegen die vom Server generierte `blocklist.bin`. static func normalize(_ host: String) -> String { var h = host.trimmingCharacters(in: .whitespacesAndNewlines).lowercased() if h.hasPrefix("https://") { h = String(h.dropFirst(8)) } else if h.hasPrefix("http://") { h = String(h.dropFirst(7)) } if let slash = h.firstIndex(of: "/") { h = String(h[h.startIndex.. UInt64 { let normalized = normalize(host) let digest = SHA256.hash(data: Data(normalized.utf8)) var result: UInt64 = 0 var i = 0 for byte in digest { result = (result << 8) | UInt64(byte) i += 1 if i == 8 { break } } return result } }