From d1a3d73c5f342ea33839343485e6e2b9dd773c83 Mon Sep 17 00:00:00 2001 From: Michelle Linington Date: Fri, 28 May 2021 00:33:53 -0700 Subject: [PATCH] Composable access keys Sender key requires a derived access key that's composed of each recipients access key xor-ed. --- SignalMetadataKit/src/SMKSecretSessionCipher.swift | 1 + SignalMetadataKit/src/SMKUDAccessKey.swift | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/SignalMetadataKit/src/SMKSecretSessionCipher.swift b/SignalMetadataKit/src/SMKSecretSessionCipher.swift index 8266d2c..a01682f 100644 --- a/SignalMetadataKit/src/SMKSecretSessionCipher.swift +++ b/SignalMetadataKit/src/SMKSecretSessionCipher.swift @@ -240,6 +240,7 @@ fileprivate extension SMKMessageType { udMessageContent, for: recipients, identityStore: identityStore, + sessionStore: sessionStore, context: protocolContext ?? NullContext()) return Data(multiRecipientMessage) diff --git a/SignalMetadataKit/src/SMKUDAccessKey.swift b/SignalMetadataKit/src/SMKUDAccessKey.swift index 71aa6e9..7495e3d 100644 --- a/SignalMetadataKit/src/SMKUDAccessKey.swift +++ b/SignalMetadataKit/src/SMKUDAccessKey.swift @@ -42,6 +42,19 @@ public class SMKUDAccessKey: NSObject { self.keyData = Randomness.generateRandomBytes(Int32(SMKUDAccessKey.kUDAccessKeyLength)) } + private init(keyData: Data) { + self.keyData = keyData + } + + /// Used to compose multiple Unidentified-Access-Keys for the multiRecipient endpoint + public static func ^(lhs: SMKUDAccessKey, rhs: SMKUDAccessKey) -> SMKUDAccessKey { + owsAssert(lhs.keyData.count == SMKUDAccessKey.kUDAccessKeyLength) + owsAssert(rhs.keyData.count == SMKUDAccessKey.kUDAccessKeyLength) + + let xoredBytes = zip(lhs.keyData, rhs.keyData).map(^) + return .init(keyData: Data(xoredBytes)) + } + // MARK: override public func isEqual(_ object: Any?) -> Bool {