Files
Kecalek_python/ios_client/EncryptedChat/Models/DeviceBundle.swift
2026-03-11 16:54:14 +01:00

44 lines
1.5 KiB
Swift

import Foundation
/// Key bundle for one device, used in X3DH
struct DeviceBundle {
let deviceId: String
let identityKey: Data // Ed25519 public key (32 bytes)
let spk: Data // X25519 public key (32 bytes)
let spkSignature: Data // Ed25519 signature (64 bytes)
let spkId: String
let opk: Data? // X25519 public key (32 bytes), optional
let opkId: String?
/// Parse from server response dictionary
static func fromDict(_ dict: [String: Any]) throws -> DeviceBundle {
guard let deviceId = dict["device_id"] as? String,
let ikHex = dict["identity_key"] as? String,
let ik = Data(hexString: ikHex),
let spkHex = dict["spk"] as? String,
let spk = Data(hexString: spkHex),
let spkSigHex = dict["spk_signature"] as? String,
let spkSig = Data(hexString: spkSigHex),
let spkId = dict["spk_id"] as? String else {
throw ChatError.invalidData("Invalid device bundle")
}
var opk: Data?
var opkId: String?
if let opkHex = dict["opk"] as? String, let opkData = Data(hexString: opkHex) {
opk = opkData
opkId = dict["opk_id"] as? String
}
return DeviceBundle(
deviceId: deviceId,
identityKey: ik,
spk: spk,
spkSignature: spkSig,
spkId: spkId,
opk: opk,
opkId: opkId
)
}
}