diff --git a/SignalServiceKit/src/Loki/API/Group Chat/LokiGroupChatAPI.swift b/SignalServiceKit/src/Loki/API/Group Chat/LokiGroupChatAPI.swift index a7ffd3706..046acc3e2 100644 --- a/SignalServiceKit/src/Loki/API/Group Chat/LokiGroupChatAPI.swift +++ b/SignalServiceKit/src/Loki/API/Group Chat/LokiGroupChatAPI.swift @@ -90,7 +90,7 @@ public final class LokiGroupChatAPI : LokiDotNetAPI { } else { quote = nil } - let signature = LokiGroupMessage.Signature(hexEncodedData: hexEncodedSignatureData, version: UInt64(signatureVersion)) + let signature = LokiGroupMessage.Signature(data: Data(hex: hexEncodedSignatureData), version: UInt64(signatureVersion)) let result = LokiGroupMessage(serverID: serverID, hexEncodedPublicKey: hexEncodedPublicKey, displayName: displayName, body: body, type: publicChatMessageType, timestamp: timestamp, quote: quote, signature: signature) guard result.hasValidSignature() else { print("[Loki] Ignoring group chat message with invalid signature.") diff --git a/SignalServiceKit/src/Loki/API/Group Chat/LokiGroupMessage.swift b/SignalServiceKit/src/Loki/API/Group Chat/LokiGroupMessage.swift index aaa7adbe3..bfbf23ea7 100644 --- a/SignalServiceKit/src/Loki/API/Group Chat/LokiGroupMessage.swift +++ b/SignalServiceKit/src/Loki/API/Group Chat/LokiGroupMessage.swift @@ -27,7 +27,7 @@ public final class LokiGroupMessage : NSObject { } public struct Signature { - public let hexEncodedData: String + public let data: Data public let version: UInt64 } @@ -44,7 +44,7 @@ public final class LokiGroupMessage : NSObject { super.init() } - @objc public convenience init(hexEncodedPublicKey: String, displayName: String, body: String, type: String, timestamp: UInt64, quotedMessageTimestamp: UInt64, quoteeHexEncodedPublicKey: String?, quotedMessageBody: String?, quotedMessageServerID: UInt64, hexEncodedSignatureData: String?, signatureVersion: UInt64) { + @objc public convenience init(hexEncodedPublicKey: String, displayName: String, body: String, type: String, timestamp: UInt64, quotedMessageTimestamp: UInt64, quoteeHexEncodedPublicKey: String?, quotedMessageBody: String?, quotedMessageServerID: UInt64, signatureData: Data?, signatureVersion: UInt64) { let quote: Quote? if quotedMessageTimestamp != 0, let quoteeHexEncodedPublicKey = quoteeHexEncodedPublicKey, let quotedMessageBody = quotedMessageBody { let quotedMessageServerID = (quotedMessageServerID != 0) ? quotedMessageServerID : nil @@ -53,8 +53,8 @@ public final class LokiGroupMessage : NSObject { quote = nil } let signature: Signature? - if let hexEncodedData = hexEncodedSignatureData, signatureVersion != 0 { - signature = Signature(hexEncodedData: hexEncodedData, version: signatureVersion) + if let signatureData = signatureData, signatureVersion != 0 { + signature = Signature(data: signatureData, version: signatureVersion) } else { signature = nil } @@ -72,15 +72,14 @@ public final class LokiGroupMessage : NSObject { print("[Loki] Failed to sign group chat message.") return nil } - let hexEncodedSignatureData = signatureData.toHexString() - let signature = Signature(hexEncodedData: hexEncodedSignatureData, version: signatureVersion) + let signature = Signature(data: signatureData, version: signatureVersion) return LokiGroupMessage(serverID: serverID, hexEncodedPublicKey: hexEncodedPublicKey, displayName: displayName, body: body, type: type, timestamp: timestamp, quote: quote, signature: signature) } internal func hasValidSignature() -> Bool { guard let signature = signature else { return false } guard let data = getValidationData() else { return false } - return (try? Ed25519.verifySignature(Data(hex: signature.hexEncodedData), publicKey: Data(hex: hexEncodedPublicKey), data: data)) ?? false + return (try? Ed25519.verifySignature(signature.data, publicKey: Data(hex: hexEncodedPublicKey), data: data)) ?? false } // MARK: JSON @@ -90,7 +89,7 @@ public final class LokiGroupMessage : NSObject { value["quote"] = [ "id" : quote.quotedMessageTimestamp, "author" : quote.quoteeHexEncodedPublicKey, "text" : quote.quotedMessageBody ] } if let signature = signature { - value["sig"] = signature.hexEncodedData + value["sig"] = signature.data.toHexString() value["sigver"] = signature.version } let annotation: JSON = [ "type" : type, "value" : value ] @@ -106,6 +105,9 @@ public final class LokiGroupMessage : NSObject { var string = "\(body.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines))\(timestamp)" if let quote = quote { string += "\(quote.quotedMessageTimestamp)\(quote.quoteeHexEncodedPublicKey)\(quote.quotedMessageBody.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines))" + if let quotedMessageServerID = quote.quotedMessageServerID { + string += "\(quotedMessageServerID)" + } } string += "\(signatureVersion)" return string.data(using: String.Encoding.utf8) diff --git a/SignalServiceKit/src/Messages/OWSMessageSender.m b/SignalServiceKit/src/Messages/OWSMessageSender.m index 377ce34a1..76f3a3440 100644 --- a/SignalServiceKit/src/Messages/OWSMessageSender.m +++ b/SignalServiceKit/src/Messages/OWSMessageSender.m @@ -1155,7 +1155,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; quotedMessageServerID = [LKDatabaseUtilities getServerIDForQuoteWithID:quoteID quoteeHexEncodedPublicKey:quoteeHexEncodedPublicKey threadID:messageSend.thread.uniqueId transaction:transaction]; }]; LKGroupMessage *groupMessage = [[LKGroupMessage alloc] initWithHexEncodedPublicKey:userHexEncodedPublicKey displayName:displayName body:message.body type:LKGroupChatAPI.publicChatMessageType - timestamp:message.timestamp quotedMessageTimestamp:quoteID quoteeHexEncodedPublicKey:quoteeHexEncodedPublicKey quotedMessageBody:quote.body quotedMessageServerID:quotedMessageServerID hexEncodedSignatureData:nil signatureVersion:0]; + timestamp:message.timestamp quotedMessageTimestamp:quoteID quoteeHexEncodedPublicKey:quoteeHexEncodedPublicKey quotedMessageBody:quote.body quotedMessageServerID:quotedMessageServerID signatureData:nil signatureVersion:0]; [[LKGroupChatAPI sendMessage:groupMessage toGroup:LKGroupChatAPI.publicChatServerID onServer:LKGroupChatAPI.publicChatServer] .thenOn(OWSDispatch.sendingQueue, ^(LKGroupMessage *groupMessage) { [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {