session-ios/SessionMessagingKit/Open Groups/OpenGroupMessageV2.swift
Morgan Pretty cf66edb723 Further work on SessionMessagingKit migrations
Added migrations for contacts and started working through thread migration (have contact and closed group threads migrating)
Deprecated usage of ECKeyPair in the migrations (want to be able to remove Curve25519Kit in the future)
2022-04-06 15:43:26 +10:00

48 lines
2.3 KiB
Swift

// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved.
import Foundation
import Curve25519Kit
import SessionUtilitiesKit
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? {
guard
let userKeyPair = Identity.fetchUserKeyPair(),
let legacyKeyPair: ECKeyPair = try? ECKeyPair(publicKeyData: Data(userKeyPair.publicKey), privateKeyData: Data(userKeyPair.secretKey)),
let data: Data = Data(base64Encoded: base64EncodedData)
else { return nil }
guard let signature = try? Ed25519.sign(data, with: legacyKeyPair) 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)
}
}