session-ios/SessionMessagingKit/Open Groups/OpenGroupMessageV2.swift

39 lines
2.0 KiB
Swift

public struct OpenGroupMessageV2 {
public let serverID: Int64?
public let sender: String?
public let sentTimestamp: UInt64
/// The serialized protobuf in base64 encoding.
public let base64EncodedData: String
/// When sending a message, the sender signs the serialized protobuf with their private key so that
/// a receiving user can verify that the message wasn't tampered with.
public let base64EncodedSignature: String?
public func sign() -> OpenGroupMessageV2? {
let userKeyPair = SNMessagingKitConfiguration.shared.storage.getUserKeyPair()!
let data = Data(base64Encoded: base64EncodedData)!
guard let signature = try? Ed25519.sign(data, with: userKeyPair) else {
SNLog("Failed to sign open group message.")
return nil
}
return OpenGroupMessageV2(serverID: serverID, sender: sender, sentTimestamp: sentTimestamp,
base64EncodedData: base64EncodedData, base64EncodedSignature: signature.base64EncodedString())
}
public func toJSON() -> JSON? {
var result: JSON = [ "data" : base64EncodedData, "timestamp" : sentTimestamp ]
if let serverID = serverID { result["server_id"] = serverID }
if let sender = sender { result["public_key"] = sender }
if let base64EncodedSignature = base64EncodedSignature { result["signature"] = base64EncodedSignature }
return result
}
public static func fromJSON(_ json: JSON) -> OpenGroupMessageV2? {
guard let base64EncodedData = json["data"] as? String, let sentTimestamp = json["timestamp"] as? UInt64 else { return nil }
let serverID = json["server_id"] as? Int64
let sender = json["public_key"] as? String
let base64EncodedSignature = json["signature"] as? String
return OpenGroupMessageV2(serverID: serverID, sender: sender, sentTimestamp: sentTimestamp, base64EncodedData: base64EncodedData, base64EncodedSignature: base64EncodedSignature)
}
}