diff --git a/Podfile b/Podfile index 552a0ab1c..d4dcaf516 100644 --- a/Podfile +++ b/Podfile @@ -105,9 +105,11 @@ end target 'SessionProtocolKit' do pod 'CocoaLumberjack', :inhibit_warnings => true + pod 'CryptoSwift', :inhibit_warnings => true pod 'Curve25519Kit', :inhibit_warnings => true pod 'GRKOpenSSLFramework', :inhibit_warnings => true pod 'HKDFKit', :inhibit_warnings => true + pod 'PromiseKit', :inhibit_warnings => true pod 'SwiftProtobuf', '~> 1.5.0', :inhibit_warnings => true end diff --git a/Podfile.lock b/Podfile.lock index 47689c383..681d0317a 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -332,6 +332,6 @@ SPEC CHECKSUMS: YYImage: 6db68da66f20d9f169ceb94dfb9947c3867b9665 ZXingObjC: fdbb269f25dd2032da343e06f10224d62f537bdb -PODFILE CHECKSUM: 821988dba010cf44893aecf26652d7da531868f0 +PODFILE CHECKSUM: 58acf63b2164dadf743187b6a52154721c1c01dd COCOAPODS: 1.10.0.rc.1 diff --git a/Pods b/Pods index 24da46b65..03a39c064 160000 --- a/Pods +++ b/Pods @@ -1 +1 @@ -Subproject commit 24da46b65b9581625f18cd9dac30b310401e84f2 +Subproject commit 03a39c064860412e9e69b99f19dd85cd5a9b8aad diff --git a/SessionProtocolKit/Configuration.swift b/SessionProtocolKit/Configuration.swift new file mode 100644 index 000000000..d05ff5769 --- /dev/null +++ b/SessionProtocolKit/Configuration.swift @@ -0,0 +1,14 @@ + +public struct Configuration { + public let storage: SessionProtocolKitStorageProtocol + public let sharedSenderKeysDelegate: SharedSenderKeysDelegate + + internal static var shared: Configuration! +} + +public enum SessionProtocolKit { // Just to make the external API nice + + public static func configure(with configuration: Configuration) { + Configuration.shared = configuration + } +} diff --git a/SessionProtocolKit/Shared Sender Keys/ClosedGroupRatchet.swift b/SessionProtocolKit/Shared Sender Keys/ClosedGroupRatchet.swift new file mode 100644 index 000000000..e87e982ef --- /dev/null +++ b/SessionProtocolKit/Shared Sender Keys/ClosedGroupRatchet.swift @@ -0,0 +1,45 @@ +import SessionUtilities + +public final class ClosedGroupRatchet : NSObject, NSCoding { + public let chainKey: String + public let keyIndex: UInt + public let messageKeys: [String] + + // MARK: Initialization + public init(chainKey: String, keyIndex: UInt, messageKeys: [String]) { + self.chainKey = chainKey + self.keyIndex = keyIndex + self.messageKeys = messageKeys + } + + // MARK: Coding + public init?(coder: NSCoder) { + guard let chainKey = coder.decodeObject(forKey: "chainKey") as? String, + let keyIndex = coder.decodeObject(forKey: "keyIndex") as? UInt, + let messageKeys = coder.decodeObject(forKey: "messageKeys") as? [String] else { return nil } + self.chainKey = chainKey + self.keyIndex = UInt(keyIndex) + self.messageKeys = messageKeys + super.init() + } + + public func encode(with coder: NSCoder) { + coder.encode(chainKey, forKey: "chainKey") + coder.encode(keyIndex, forKey: "keyIndex") + coder.encode(messageKeys, forKey: "messageKeys") + } + + // MARK: Equality + override public func isEqual(_ other: Any?) -> Bool { + guard let other = other as? ClosedGroupRatchet else { return false } + return chainKey == other.chainKey && keyIndex == other.keyIndex && messageKeys == other.messageKeys + } + + // MARK: Hashing + override public var hash: Int { // Override NSObject.hash and not Hashable.hashValue or Hashable.hash(into:) + return chainKey.hashValue ^ keyIndex.hashValue ^ messageKeys.hashValue + } + + // MARK: Description + override public var description: String { return "[ chainKey : \(chainKey), keyIndex : \(keyIndex), messageKeys : \(messageKeys.prettifiedDescription) ]" } +} diff --git a/SessionProtocolKit/Shared Sender Keys/ClosedGroupSenderKey.swift b/SessionProtocolKit/Shared Sender Keys/ClosedGroupSenderKey.swift new file mode 100644 index 000000000..27e1e6625 --- /dev/null +++ b/SessionProtocolKit/Shared Sender Keys/ClosedGroupSenderKey.swift @@ -0,0 +1,46 @@ + +public final class ClosedGroupSenderKey : NSObject, NSCoding { + public let chainKey: Data + public let keyIndex: UInt + public let publicKey: Data + + // MARK: Initialization + init(chainKey: Data, keyIndex: UInt, publicKey: Data) { + self.chainKey = chainKey + self.keyIndex = keyIndex + self.publicKey = publicKey + } + + // MARK: Coding + public init?(coder: NSCoder) { + guard let chainKey = coder.decodeObject(forKey: "chainKey") as? Data, + let keyIndex = coder.decodeObject(forKey: "keyIndex") as? UInt, + let publicKey = coder.decodeObject(forKey: "publicKey") as? Data else { return nil } + self.chainKey = chainKey + self.keyIndex = UInt(keyIndex) + self.publicKey = publicKey + super.init() + } + + public func encode(with coder: NSCoder) { + coder.encode(chainKey, forKey: "chainKey") + coder.encode(keyIndex, forKey: "keyIndex") + coder.encode(publicKey, forKey: "publicKey") + } + + // MARK: Equality + override public func isEqual(_ other: Any?) -> Bool { + guard let other = other as? ClosedGroupSenderKey else { return false } + return chainKey == other.chainKey && keyIndex == other.keyIndex && publicKey == other.publicKey + } + + // MARK: Hashing + override public var hash: Int { // Override NSObject.hash and not Hashable.hashValue or Hashable.hash(into:) + return chainKey.hashValue ^ keyIndex.hashValue ^ publicKey.hashValue + } + + // MARK: Description + override public var description: String { + return "[ chainKey : \(chainKey), keyIndex : \(keyIndex), publicKey: \(publicKey.toHexString()) ]" + } +} diff --git a/SessionProtocolKit/Shared Sender Keys/SharedSenderKeys.swift b/SessionProtocolKit/Shared Sender Keys/SharedSenderKeys.swift new file mode 100644 index 000000000..d86ab6c5e --- /dev/null +++ b/SessionProtocolKit/Shared Sender Keys/SharedSenderKeys.swift @@ -0,0 +1,172 @@ +import CryptoSwift +import PromiseKit +import SessionUtilities + +public enum SharedSenderKeys { + private static let gcmTagSize: UInt = 16 + private static let ivSize: UInt = 12 + + // MARK: Ratcheting Error + public enum RatchetingError : LocalizedError { + case loadingFailed(groupPublicKey: String, senderPublicKey: String) + case messageKeyMissing(targetKeyIndex: UInt, groupPublicKey: String, senderPublicKey: String) + case generic + + public var errorDescription: String? { + switch self { + case .loadingFailed(let groupPublicKey, let senderPublicKey): return "Couldn't get ratchet for closed group with public key: \(groupPublicKey), sender public key: \(senderPublicKey)." + case .messageKeyMissing(let targetKeyIndex, let groupPublicKey, let senderPublicKey): return "Couldn't find message key for old key index: \(targetKeyIndex), public key: \(groupPublicKey), sender public key: \(senderPublicKey)." + case .generic: return "An error occurred" + } + } + } + + // MARK: Private/Internal API + internal func generateRatchet(for groupPublicKey: String, senderPublicKey: String, using transaction: Any) -> ClosedGroupRatchet { + let rootChainKey = Data.getSecureRandomData(ofSize: 32)!.toHexString() + let ratchet = ClosedGroupRatchet(chainKey: rootChainKey, keyIndex: 0, messageKeys: []) + Configuration.shared.storage.setClosedGroupRatchet(for: groupPublicKey, senderPublicKey: senderPublicKey, ratchet: ratchet, in: .current, using: transaction) + return ratchet + } + + private func step(_ ratchet: ClosedGroupRatchet) throws -> ClosedGroupRatchet { + let nextMessageKey = try HMAC(key: Data(hex: ratchet.chainKey).bytes, variant: .sha256).authenticate([ UInt8(1) ]) + let nextChainKey = try HMAC(key: Data(hex: ratchet.chainKey).bytes, variant: .sha256).authenticate([ UInt8(2) ]) + let nextKeyIndex = ratchet.keyIndex + 1 + let messageKeys = ratchet.messageKeys + [ nextMessageKey.toHexString() ] + return ClosedGroupRatchet(chainKey: nextChainKey.toHexString(), keyIndex: nextKeyIndex, messageKeys: messageKeys) + } + + /// - Note: Sync. Don't call from the main thread. + private func stepRatchetOnce(for groupPublicKey: String, senderPublicKey: String, using transaction: Any) throws -> ClosedGroupRatchet { + #if DEBUG + assert(!Thread.isMainThread) + #endif + guard let ratchet = Configuration.shared.storage.getClosedGroupRatchet(for: groupPublicKey, senderPublicKey: senderPublicKey, from: .current) else { + let error = RatchetingError.loadingFailed(groupPublicKey: groupPublicKey, senderPublicKey: senderPublicKey) + print("[Loki] \(error.errorDescription!)") + throw error + } + do { + let result = try step(ratchet) + Configuration.shared.storage.setClosedGroupRatchet(for: groupPublicKey, senderPublicKey: senderPublicKey, ratchet: result, in: .current, using: transaction) + return result + } catch { + print("[Loki] Couldn't step ratchet due to error: \(error).") + throw error + } + } + + /// - Note: Sync. Don't call from the main thread. + private func stepRatchet(for groupPublicKey: String, senderPublicKey: String, until targetKeyIndex: UInt, using transaction: Any, isRetry: Bool = false) throws -> ClosedGroupRatchet { + #if DEBUG + assert(!Thread.isMainThread) + #endif + let collection: ClosedGroupRatchetCollectionType = (isRetry) ? .old : .current + guard let ratchet = Configuration.shared.storage.getClosedGroupRatchet(for: groupPublicKey, senderPublicKey: senderPublicKey, from: collection) else { + let error = RatchetingError.loadingFailed(groupPublicKey: groupPublicKey, senderPublicKey: senderPublicKey) + print("[Loki] \(error.errorDescription!)") + throw error + } + if targetKeyIndex < ratchet.keyIndex { + // There's no need to advance the ratchet if this is invoked for an old key index + guard ratchet.messageKeys.count > targetKeyIndex else { + let error = RatchetingError.messageKeyMissing(targetKeyIndex: targetKeyIndex, groupPublicKey: groupPublicKey, senderPublicKey: senderPublicKey) + print("[Loki] \(error.errorDescription!)") + throw error + } + return ratchet + } else { + var currentKeyIndex = ratchet.keyIndex + var result = ratchet + while currentKeyIndex < targetKeyIndex { + do { + result = try step(result) + currentKeyIndex = result.keyIndex + } catch { + print("[Loki] Couldn't step ratchet due to error: \(error).") + throw error + } + } + let collection: ClosedGroupRatchetCollectionType = (isRetry) ? .old : .current + Configuration.shared.storage.setClosedGroupRatchet(for: groupPublicKey, senderPublicKey: senderPublicKey, ratchet: result, in: collection, using: transaction) + return result + } + } + + // MARK: Public API + public func encrypt(_ plaintext: Data, for groupPublicKey: String, senderPublicKey: String, using transaction: Any) throws -> (ivAndCiphertext: Data, keyIndex: UInt) { + let ratchet: ClosedGroupRatchet + do { + ratchet = try stepRatchetOnce(for: groupPublicKey, senderPublicKey: senderPublicKey, using: transaction) + } catch { + // FIXME: It'd be cleaner to handle this in OWSMessageDecrypter (where all the other decryption errors are handled), but this was a lot more + // convenient because there's an easy way to get the sender public key from here. + if case RatchetingError.loadingFailed(_, _) = error { + Configuration.shared.sharedSenderKeysDelegate.requestSenderKey(for: groupPublicKey, senderPublicKey: senderPublicKey, using: transaction) + } + throw error + } + let iv = Data.getSecureRandomData(ofSize: SharedSenderKeys.ivSize)! + let gcm = GCM(iv: iv.bytes, tagLength: Int(SharedSenderKeys.gcmTagSize), mode: .combined) + let messageKey = ratchet.messageKeys.last! + let aes = try AES(key: Data(hex: messageKey).bytes, blockMode: gcm, padding: .noPadding) + let ciphertext = try aes.encrypt(plaintext.bytes) + return (ivAndCiphertext: iv + Data(ciphertext), ratchet.keyIndex) + } + + public func decrypt(_ ivAndCiphertext: Data, for groupPublicKey: String, senderPublicKey: String, keyIndex: UInt, using transaction: Any, isRetry: Bool = false) throws -> Data { + let ratchet: ClosedGroupRatchet + do { + ratchet = try stepRatchet(for: groupPublicKey, senderPublicKey: senderPublicKey, until: keyIndex, using: transaction, isRetry: isRetry) + } catch { + if !isRetry { + return try decrypt(ivAndCiphertext, for: groupPublicKey, senderPublicKey: senderPublicKey, keyIndex: keyIndex, using: transaction, isRetry: true) + } else { + // FIXME: It'd be cleaner to handle this in OWSMessageDecrypter (where all the other decryption errors are handled), but this was a lot more + // convenient because there's an easy way to get the sender public key from here. + if case RatchetingError.loadingFailed(_, _) = error { + Configuration.shared.sharedSenderKeysDelegate.requestSenderKey(for: groupPublicKey, senderPublicKey: senderPublicKey, using: transaction) + } + throw error + } + } + let iv = ivAndCiphertext[0.. 16 { // Pick an arbitrary number of message keys to try; this helps resolve issues caused by messages arriving out of order + lastNMessageKeys = [String](messageKeys[messageKeys.index(messageKeys.endIndex, offsetBy: -16).. Bool { + return Configuration.shared.storage.getUserClosedGroupPublicKeys().contains(publicKey) + } + + public func getKeyPair(forGroupWithPublicKey groupPublicKey: String) -> ECKeyPair { + let privateKey = Configuration.shared.storage.getClosedGroupPrivateKey(for: groupPublicKey)! + return ECKeyPair(publicKey: Data(hex: groupPublicKey.removing05PrefixIfNeeded()), privateKey: Data(hex: privateKey)) + } +} diff --git a/SessionProtocolKit/Shared Sender Keys/SharedSenderKeysDelegate.swift b/SessionProtocolKit/Shared Sender Keys/SharedSenderKeysDelegate.swift new file mode 100644 index 000000000..7ccc9f8c1 --- /dev/null +++ b/SessionProtocolKit/Shared Sender Keys/SharedSenderKeysDelegate.swift @@ -0,0 +1,5 @@ + +public protocol SharedSenderKeysDelegate { + + func requestSenderKey(for groupPublicKey: String, senderPublicKey: String, using transaction: Any) +} diff --git a/SessionProtocolKit/Shared Sender Keys/Storage.swift b/SessionProtocolKit/Shared Sender Keys/Storage.swift new file mode 100644 index 000000000..a6287349b --- /dev/null +++ b/SessionProtocolKit/Shared Sender Keys/Storage.swift @@ -0,0 +1,17 @@ + +public enum ClosedGroupRatchetCollectionType { + case old, current +} + +public protocol SessionProtocolKitStorageProtocol { + + func with(_ work: (Any) -> Void) + + func getClosedGroupRatchet(for groupPublicKey: String, senderPublicKey: String, from collection: ClosedGroupRatchetCollectionType) -> ClosedGroupRatchet? + func setClosedGroupRatchet(for groupPublicKey: String, senderPublicKey: String, ratchet: ClosedGroupRatchet, in collection: ClosedGroupRatchetCollectionType, using transaction: Any) + func getAllClosedGroupRatchets(for groupPublicKey: String, from collection: ClosedGroupRatchetCollectionType) -> [(senderPublicKey: String, ratchet: ClosedGroupRatchet)] + func getAllClosedGroupSenderKeys(for groupPublicKey: String, from collection: ClosedGroupRatchetCollectionType) -> Set + func removeAllClosedGroupRatchets(for groupPublicKey: String, from collection: ClosedGroupRatchetCollectionType, using transaction: Any) + func getUserClosedGroupPublicKeys() -> Set + func getClosedGroupPrivateKey(for publicKey: String) -> String? +} diff --git a/SessionProtocolKit/AxolotlExceptions.h b/SessionProtocolKit/Signal/AxolotlExceptions.h similarity index 100% rename from SessionProtocolKit/AxolotlExceptions.h rename to SessionProtocolKit/Signal/AxolotlExceptions.h diff --git a/SessionProtocolKit/CipherMessage/CipherMessage.h b/SessionProtocolKit/Signal/CipherMessage/CipherMessage.h similarity index 100% rename from SessionProtocolKit/CipherMessage/CipherMessage.h rename to SessionProtocolKit/Signal/CipherMessage/CipherMessage.h diff --git a/SessionProtocolKit/CipherMessage/ClosedGroupCiphertextMessage.h b/SessionProtocolKit/Signal/CipherMessage/ClosedGroupCiphertextMessage.h similarity index 100% rename from SessionProtocolKit/CipherMessage/ClosedGroupCiphertextMessage.h rename to SessionProtocolKit/Signal/CipherMessage/ClosedGroupCiphertextMessage.h diff --git a/SessionProtocolKit/CipherMessage/ClosedGroupCiphertextMessage.m b/SessionProtocolKit/Signal/CipherMessage/ClosedGroupCiphertextMessage.m similarity index 100% rename from SessionProtocolKit/CipherMessage/ClosedGroupCiphertextMessage.m rename to SessionProtocolKit/Signal/CipherMessage/ClosedGroupCiphertextMessage.m diff --git a/SessionProtocolKit/CipherMessage/FallbackMessage.h b/SessionProtocolKit/Signal/CipherMessage/FallbackMessage.h similarity index 100% rename from SessionProtocolKit/CipherMessage/FallbackMessage.h rename to SessionProtocolKit/Signal/CipherMessage/FallbackMessage.h diff --git a/SessionProtocolKit/CipherMessage/FallbackMessage.m b/SessionProtocolKit/Signal/CipherMessage/FallbackMessage.m similarity index 100% rename from SessionProtocolKit/CipherMessage/FallbackMessage.m rename to SessionProtocolKit/Signal/CipherMessage/FallbackMessage.m diff --git a/SessionProtocolKit/CipherMessage/PreKeyWhisperMessage.h b/SessionProtocolKit/Signal/CipherMessage/PreKeyWhisperMessage.h similarity index 100% rename from SessionProtocolKit/CipherMessage/PreKeyWhisperMessage.h rename to SessionProtocolKit/Signal/CipherMessage/PreKeyWhisperMessage.h diff --git a/SessionProtocolKit/CipherMessage/PreKeyWhisperMessage.m b/SessionProtocolKit/Signal/CipherMessage/PreKeyWhisperMessage.m similarity index 100% rename from SessionProtocolKit/CipherMessage/PreKeyWhisperMessage.m rename to SessionProtocolKit/Signal/CipherMessage/PreKeyWhisperMessage.m diff --git a/SessionProtocolKit/CipherMessage/WhisperMessage.h b/SessionProtocolKit/Signal/CipherMessage/WhisperMessage.h similarity index 100% rename from SessionProtocolKit/CipherMessage/WhisperMessage.h rename to SessionProtocolKit/Signal/CipherMessage/WhisperMessage.h diff --git a/SessionProtocolKit/CipherMessage/WhisperMessage.m b/SessionProtocolKit/Signal/CipherMessage/WhisperMessage.m similarity index 100% rename from SessionProtocolKit/CipherMessage/WhisperMessage.m rename to SessionProtocolKit/Signal/CipherMessage/WhisperMessage.m diff --git a/SessionProtocolKit/Constants.h b/SessionProtocolKit/Signal/Constants.h similarity index 100% rename from SessionProtocolKit/Constants.h rename to SessionProtocolKit/Signal/Constants.h diff --git a/SessionProtocolKit/Crypto/AES-CBC.h b/SessionProtocolKit/Signal/Crypto/AES-CBC.h similarity index 100% rename from SessionProtocolKit/Crypto/AES-CBC.h rename to SessionProtocolKit/Signal/Crypto/AES-CBC.h diff --git a/SessionProtocolKit/Crypto/AES-CBC.m b/SessionProtocolKit/Signal/Crypto/AES-CBC.m similarity index 100% rename from SessionProtocolKit/Crypto/AES-CBC.m rename to SessionProtocolKit/Signal/Crypto/AES-CBC.m diff --git a/SessionProtocolKit/Prekeys/PreKeyBundle.h b/SessionProtocolKit/Signal/Prekeys/PreKeyBundle.h similarity index 100% rename from SessionProtocolKit/Prekeys/PreKeyBundle.h rename to SessionProtocolKit/Signal/Prekeys/PreKeyBundle.h diff --git a/SessionProtocolKit/Prekeys/PreKeyBundle.m b/SessionProtocolKit/Signal/Prekeys/PreKeyBundle.m similarity index 100% rename from SessionProtocolKit/Prekeys/PreKeyBundle.m rename to SessionProtocolKit/Signal/Prekeys/PreKeyBundle.m diff --git a/SessionProtocolKit/Prekeys/PreKeyRecord.h b/SessionProtocolKit/Signal/Prekeys/PreKeyRecord.h similarity index 100% rename from SessionProtocolKit/Prekeys/PreKeyRecord.h rename to SessionProtocolKit/Signal/Prekeys/PreKeyRecord.h diff --git a/SessionProtocolKit/Prekeys/PreKeyRecord.m b/SessionProtocolKit/Signal/Prekeys/PreKeyRecord.m similarity index 100% rename from SessionProtocolKit/Prekeys/PreKeyRecord.m rename to SessionProtocolKit/Signal/Prekeys/PreKeyRecord.m diff --git a/SessionProtocolKit/Prekeys/SignedPrekeyRecord.h b/SessionProtocolKit/Signal/Prekeys/SignedPrekeyRecord.h similarity index 100% rename from SessionProtocolKit/Prekeys/SignedPrekeyRecord.h rename to SessionProtocolKit/Signal/Prekeys/SignedPrekeyRecord.h diff --git a/SessionProtocolKit/Prekeys/SignedPrekeyRecord.m b/SessionProtocolKit/Signal/Prekeys/SignedPrekeyRecord.m similarity index 100% rename from SessionProtocolKit/Prekeys/SignedPrekeyRecord.m rename to SessionProtocolKit/Signal/Prekeys/SignedPrekeyRecord.m diff --git a/SessionProtocolKit/Protos/Makefile b/SessionProtocolKit/Signal/Protos/Makefile similarity index 100% rename from SessionProtocolKit/Protos/Makefile rename to SessionProtocolKit/Signal/Protos/Makefile diff --git a/SessionProtocolKit/Protos/SPKProto.swift b/SessionProtocolKit/Signal/Protos/SPKProto.swift similarity index 100% rename from SessionProtocolKit/Protos/SPKProto.swift rename to SessionProtocolKit/Signal/Protos/SPKProto.swift diff --git a/SessionProtocolKit/Protos/WhisperTextProtocol.pb.swift b/SessionProtocolKit/Signal/Protos/WhisperTextProtocol.pb.swift similarity index 100% rename from SessionProtocolKit/Protos/WhisperTextProtocol.pb.swift rename to SessionProtocolKit/Signal/Protos/WhisperTextProtocol.pb.swift diff --git a/SessionProtocolKit/Protos/WhisperTextProtocol.proto b/SessionProtocolKit/Signal/Protos/WhisperTextProtocol.proto similarity index 100% rename from SessionProtocolKit/Protos/WhisperTextProtocol.proto rename to SessionProtocolKit/Signal/Protos/WhisperTextProtocol.proto diff --git a/SessionProtocolKit/Ratchet/AliceAxolotlParameters.h b/SessionProtocolKit/Signal/Ratchet/AliceAxolotlParameters.h similarity index 100% rename from SessionProtocolKit/Ratchet/AliceAxolotlParameters.h rename to SessionProtocolKit/Signal/Ratchet/AliceAxolotlParameters.h diff --git a/SessionProtocolKit/Ratchet/AliceAxolotlParameters.m b/SessionProtocolKit/Signal/Ratchet/AliceAxolotlParameters.m similarity index 100% rename from SessionProtocolKit/Ratchet/AliceAxolotlParameters.m rename to SessionProtocolKit/Signal/Ratchet/AliceAxolotlParameters.m diff --git a/SessionProtocolKit/Ratchet/AxolotlParameters.h b/SessionProtocolKit/Signal/Ratchet/AxolotlParameters.h similarity index 100% rename from SessionProtocolKit/Ratchet/AxolotlParameters.h rename to SessionProtocolKit/Signal/Ratchet/AxolotlParameters.h diff --git a/SessionProtocolKit/Ratchet/BobAxolotlParameters.h b/SessionProtocolKit/Signal/Ratchet/BobAxolotlParameters.h similarity index 100% rename from SessionProtocolKit/Ratchet/BobAxolotlParameters.h rename to SessionProtocolKit/Signal/Ratchet/BobAxolotlParameters.h diff --git a/SessionProtocolKit/Ratchet/BobAxolotlParameters.m b/SessionProtocolKit/Signal/Ratchet/BobAxolotlParameters.m similarity index 100% rename from SessionProtocolKit/Ratchet/BobAxolotlParameters.m rename to SessionProtocolKit/Signal/Ratchet/BobAxolotlParameters.m diff --git a/SessionProtocolKit/Ratchet/Chain.h b/SessionProtocolKit/Signal/Ratchet/Chain.h similarity index 100% rename from SessionProtocolKit/Ratchet/Chain.h rename to SessionProtocolKit/Signal/Ratchet/Chain.h diff --git a/SessionProtocolKit/Ratchet/ChainAndIndex.h b/SessionProtocolKit/Signal/Ratchet/ChainAndIndex.h similarity index 100% rename from SessionProtocolKit/Ratchet/ChainAndIndex.h rename to SessionProtocolKit/Signal/Ratchet/ChainAndIndex.h diff --git a/SessionProtocolKit/Ratchet/ChainAndIndex.m b/SessionProtocolKit/Signal/Ratchet/ChainAndIndex.m similarity index 100% rename from SessionProtocolKit/Ratchet/ChainAndIndex.m rename to SessionProtocolKit/Signal/Ratchet/ChainAndIndex.m diff --git a/SessionProtocolKit/Ratchet/ChainKey.h b/SessionProtocolKit/Signal/Ratchet/ChainKey.h similarity index 100% rename from SessionProtocolKit/Ratchet/ChainKey.h rename to SessionProtocolKit/Signal/Ratchet/ChainKey.h diff --git a/SessionProtocolKit/Ratchet/ChainKey.m b/SessionProtocolKit/Signal/Ratchet/ChainKey.m similarity index 100% rename from SessionProtocolKit/Ratchet/ChainKey.m rename to SessionProtocolKit/Signal/Ratchet/ChainKey.m diff --git a/SessionProtocolKit/Ratchet/MessageKeys.h b/SessionProtocolKit/Signal/Ratchet/MessageKeys.h similarity index 100% rename from SessionProtocolKit/Ratchet/MessageKeys.h rename to SessionProtocolKit/Signal/Ratchet/MessageKeys.h diff --git a/SessionProtocolKit/Ratchet/MessageKeys.m b/SessionProtocolKit/Signal/Ratchet/MessageKeys.m similarity index 100% rename from SessionProtocolKit/Ratchet/MessageKeys.m rename to SessionProtocolKit/Signal/Ratchet/MessageKeys.m diff --git a/SessionProtocolKit/Ratchet/RKCK.h b/SessionProtocolKit/Signal/Ratchet/RKCK.h similarity index 100% rename from SessionProtocolKit/Ratchet/RKCK.h rename to SessionProtocolKit/Signal/Ratchet/RKCK.h diff --git a/SessionProtocolKit/Ratchet/RKCK.m b/SessionProtocolKit/Signal/Ratchet/RKCK.m similarity index 100% rename from SessionProtocolKit/Ratchet/RKCK.m rename to SessionProtocolKit/Signal/Ratchet/RKCK.m diff --git a/SessionProtocolKit/Ratchet/RatchetingSession.h b/SessionProtocolKit/Signal/Ratchet/RatchetingSession.h similarity index 100% rename from SessionProtocolKit/Ratchet/RatchetingSession.h rename to SessionProtocolKit/Signal/Ratchet/RatchetingSession.h diff --git a/SessionProtocolKit/Ratchet/RatchetingSession.m b/SessionProtocolKit/Signal/Ratchet/RatchetingSession.m similarity index 100% rename from SessionProtocolKit/Ratchet/RatchetingSession.m rename to SessionProtocolKit/Signal/Ratchet/RatchetingSession.m diff --git a/SessionProtocolKit/Ratchet/ReceivingChain.h b/SessionProtocolKit/Signal/Ratchet/ReceivingChain.h similarity index 100% rename from SessionProtocolKit/Ratchet/ReceivingChain.h rename to SessionProtocolKit/Signal/Ratchet/ReceivingChain.h diff --git a/SessionProtocolKit/Ratchet/ReceivingChain.m b/SessionProtocolKit/Signal/Ratchet/ReceivingChain.m similarity index 100% rename from SessionProtocolKit/Ratchet/ReceivingChain.m rename to SessionProtocolKit/Signal/Ratchet/ReceivingChain.m diff --git a/SessionProtocolKit/Ratchet/RootKey.h b/SessionProtocolKit/Signal/Ratchet/RootKey.h similarity index 100% rename from SessionProtocolKit/Ratchet/RootKey.h rename to SessionProtocolKit/Signal/Ratchet/RootKey.h diff --git a/SessionProtocolKit/Ratchet/RootKey.m b/SessionProtocolKit/Signal/Ratchet/RootKey.m similarity index 100% rename from SessionProtocolKit/Ratchet/RootKey.m rename to SessionProtocolKit/Signal/Ratchet/RootKey.m diff --git a/SessionProtocolKit/Ratchet/SendingChain.h b/SessionProtocolKit/Signal/Ratchet/SendingChain.h similarity index 100% rename from SessionProtocolKit/Ratchet/SendingChain.h rename to SessionProtocolKit/Signal/Ratchet/SendingChain.h diff --git a/SessionProtocolKit/Ratchet/SendingChain.m b/SessionProtocolKit/Signal/Ratchet/SendingChain.m similarity index 100% rename from SessionProtocolKit/Ratchet/SendingChain.m rename to SessionProtocolKit/Signal/Ratchet/SendingChain.m diff --git a/SessionProtocolKit/Ratchet/TSDerivedSecrets.h b/SessionProtocolKit/Signal/Ratchet/TSDerivedSecrets.h similarity index 100% rename from SessionProtocolKit/Ratchet/TSDerivedSecrets.h rename to SessionProtocolKit/Signal/Ratchet/TSDerivedSecrets.h diff --git a/SessionProtocolKit/Ratchet/TSDerivedSecrets.m b/SessionProtocolKit/Signal/Ratchet/TSDerivedSecrets.m similarity index 100% rename from SessionProtocolKit/Ratchet/TSDerivedSecrets.m rename to SessionProtocolKit/Signal/Ratchet/TSDerivedSecrets.m diff --git a/SessionProtocolKit/SessionCipher.h b/SessionProtocolKit/Signal/SessionCipher.h similarity index 100% rename from SessionProtocolKit/SessionCipher.h rename to SessionProtocolKit/Signal/SessionCipher.h diff --git a/SessionProtocolKit/SessionCipher.m b/SessionProtocolKit/Signal/SessionCipher.m similarity index 100% rename from SessionProtocolKit/SessionCipher.m rename to SessionProtocolKit/Signal/SessionCipher.m diff --git a/SessionProtocolKit/Sessions/SessionBuilder.h b/SessionProtocolKit/Signal/Sessions/SessionBuilder.h similarity index 100% rename from SessionProtocolKit/Sessions/SessionBuilder.h rename to SessionProtocolKit/Signal/Sessions/SessionBuilder.h diff --git a/SessionProtocolKit/Sessions/SessionBuilder.m b/SessionProtocolKit/Signal/Sessions/SessionBuilder.m similarity index 100% rename from SessionProtocolKit/Sessions/SessionBuilder.m rename to SessionProtocolKit/Signal/Sessions/SessionBuilder.m diff --git a/SessionProtocolKit/Sessions/SessionRecord.h b/SessionProtocolKit/Signal/Sessions/SessionRecord.h similarity index 100% rename from SessionProtocolKit/Sessions/SessionRecord.h rename to SessionProtocolKit/Signal/Sessions/SessionRecord.h diff --git a/SessionProtocolKit/Sessions/SessionRecord.m b/SessionProtocolKit/Signal/Sessions/SessionRecord.m similarity index 100% rename from SessionProtocolKit/Sessions/SessionRecord.m rename to SessionProtocolKit/Signal/Sessions/SessionRecord.m diff --git a/SessionProtocolKit/Sessions/SessionState.h b/SessionProtocolKit/Signal/Sessions/SessionState.h similarity index 100% rename from SessionProtocolKit/Sessions/SessionState.h rename to SessionProtocolKit/Signal/Sessions/SessionState.h diff --git a/SessionProtocolKit/Sessions/SessionState.m b/SessionProtocolKit/Signal/Sessions/SessionState.m similarity index 100% rename from SessionProtocolKit/Sessions/SessionState.m rename to SessionProtocolKit/Signal/Sessions/SessionState.m diff --git a/SessionProtocolKit/State/AxolotlStore.h b/SessionProtocolKit/Signal/State/AxolotlStore.h similarity index 100% rename from SessionProtocolKit/State/AxolotlStore.h rename to SessionProtocolKit/Signal/State/AxolotlStore.h diff --git a/SessionProtocolKit/State/IdentityKeyStore.h b/SessionProtocolKit/Signal/State/IdentityKeyStore.h similarity index 100% rename from SessionProtocolKit/State/IdentityKeyStore.h rename to SessionProtocolKit/Signal/State/IdentityKeyStore.h diff --git a/SessionProtocolKit/State/PreKeyStore.h b/SessionProtocolKit/Signal/State/PreKeyStore.h similarity index 100% rename from SessionProtocolKit/State/PreKeyStore.h rename to SessionProtocolKit/Signal/State/PreKeyStore.h diff --git a/SessionProtocolKit/State/SessionStore.h b/SessionProtocolKit/Signal/State/SessionStore.h similarity index 100% rename from SessionProtocolKit/State/SessionStore.h rename to SessionProtocolKit/Signal/State/SessionStore.h diff --git a/SessionProtocolKit/State/SignedPreKeyStore.h b/SessionProtocolKit/Signal/State/SignedPreKeyStore.h similarity index 100% rename from SessionProtocolKit/State/SignedPreKeyStore.h rename to SessionProtocolKit/Signal/State/SignedPreKeyStore.h diff --git a/SessionProtocolKit/Utility/Cryptography.h b/SessionProtocolKit/Signal/Utility/Cryptography.h similarity index 100% rename from SessionProtocolKit/Utility/Cryptography.h rename to SessionProtocolKit/Signal/Utility/Cryptography.h diff --git a/SessionProtocolKit/Utility/Cryptography.m b/SessionProtocolKit/Signal/Utility/Cryptography.m similarity index 100% rename from SessionProtocolKit/Utility/Cryptography.m rename to SessionProtocolKit/Signal/Utility/Cryptography.m diff --git a/SessionProtocolKit/Utility/Data+OWS.swift b/SessionProtocolKit/Signal/Utility/Data+OWS.swift similarity index 100% rename from SessionProtocolKit/Utility/Data+OWS.swift rename to SessionProtocolKit/Signal/Utility/Data+OWS.swift diff --git a/SessionProtocolKit/Utility/Logger.swift b/SessionProtocolKit/Signal/Utility/Logger.swift similarity index 100% rename from SessionProtocolKit/Utility/Logger.swift rename to SessionProtocolKit/Signal/Utility/Logger.swift diff --git a/SessionProtocolKit/Utility/NSData+OWS.h b/SessionProtocolKit/Signal/Utility/NSData+OWS.h similarity index 100% rename from SessionProtocolKit/Utility/NSData+OWS.h rename to SessionProtocolKit/Signal/Utility/NSData+OWS.h diff --git a/SessionProtocolKit/Utility/NSData+OWS.m b/SessionProtocolKit/Signal/Utility/NSData+OWS.m similarity index 100% rename from SessionProtocolKit/Utility/NSData+OWS.m rename to SessionProtocolKit/Signal/Utility/NSData+OWS.m diff --git a/SessionProtocolKit/Utility/NSData+keyVersionByte.h b/SessionProtocolKit/Signal/Utility/NSData+keyVersionByte.h similarity index 100% rename from SessionProtocolKit/Utility/NSData+keyVersionByte.h rename to SessionProtocolKit/Signal/Utility/NSData+keyVersionByte.h diff --git a/SessionProtocolKit/Utility/NSData+keyVersionByte.m b/SessionProtocolKit/Signal/Utility/NSData+keyVersionByte.m similarity index 100% rename from SessionProtocolKit/Utility/NSData+keyVersionByte.m rename to SessionProtocolKit/Signal/Utility/NSData+keyVersionByte.m diff --git a/SessionProtocolKit/Utility/NSDate+OWS.h b/SessionProtocolKit/Signal/Utility/NSDate+OWS.h similarity index 100% rename from SessionProtocolKit/Utility/NSDate+OWS.h rename to SessionProtocolKit/Signal/Utility/NSDate+OWS.h diff --git a/SessionProtocolKit/Utility/NSDate+OWS.mm b/SessionProtocolKit/Signal/Utility/NSDate+OWS.mm similarity index 100% rename from SessionProtocolKit/Utility/NSDate+OWS.mm rename to SessionProtocolKit/Signal/Utility/NSDate+OWS.mm diff --git a/SessionProtocolKit/Utility/NSObject+OWS.h b/SessionProtocolKit/Signal/Utility/NSObject+OWS.h similarity index 100% rename from SessionProtocolKit/Utility/NSObject+OWS.h rename to SessionProtocolKit/Signal/Utility/NSObject+OWS.h diff --git a/SessionProtocolKit/Utility/NSObject+OWS.m b/SessionProtocolKit/Signal/Utility/NSObject+OWS.m similarity index 100% rename from SessionProtocolKit/Utility/NSObject+OWS.m rename to SessionProtocolKit/Signal/Utility/NSObject+OWS.m diff --git a/SessionProtocolKit/Utility/NSString+OWS.h b/SessionProtocolKit/Signal/Utility/NSString+OWS.h similarity index 100% rename from SessionProtocolKit/Utility/NSString+OWS.h rename to SessionProtocolKit/Signal/Utility/NSString+OWS.h diff --git a/SessionProtocolKit/Utility/NSString+OWS.m b/SessionProtocolKit/Signal/Utility/NSString+OWS.m similarity index 100% rename from SessionProtocolKit/Utility/NSString+OWS.m rename to SessionProtocolKit/Signal/Utility/NSString+OWS.m diff --git a/SessionProtocolKit/Utility/OWSAsserts.h b/SessionProtocolKit/Signal/Utility/OWSAsserts.h similarity index 100% rename from SessionProtocolKit/Utility/OWSAsserts.h rename to SessionProtocolKit/Signal/Utility/OWSAsserts.h diff --git a/SessionProtocolKit/Utility/OWSAsserts.m b/SessionProtocolKit/Signal/Utility/OWSAsserts.m similarity index 100% rename from SessionProtocolKit/Utility/OWSAsserts.m rename to SessionProtocolKit/Signal/Utility/OWSAsserts.m diff --git a/SessionProtocolKit/Utility/OWSDataParser.swift b/SessionProtocolKit/Signal/Utility/OWSDataParser.swift similarity index 100% rename from SessionProtocolKit/Utility/OWSDataParser.swift rename to SessionProtocolKit/Signal/Utility/OWSDataParser.swift diff --git a/SessionProtocolKit/Utility/OWSLogs.h b/SessionProtocolKit/Signal/Utility/OWSLogs.h similarity index 100% rename from SessionProtocolKit/Utility/OWSLogs.h rename to SessionProtocolKit/Signal/Utility/OWSLogs.h diff --git a/SessionProtocolKit/Utility/OWSLogs.m b/SessionProtocolKit/Signal/Utility/OWSLogs.m similarity index 100% rename from SessionProtocolKit/Utility/OWSLogs.m rename to SessionProtocolKit/Signal/Utility/OWSLogs.m diff --git a/SessionProtocolKit/Utility/OWSSwiftUtils.swift b/SessionProtocolKit/Signal/Utility/OWSSwiftUtils.swift similarity index 100% rename from SessionProtocolKit/Utility/OWSSwiftUtils.swift rename to SessionProtocolKit/Signal/Utility/OWSSwiftUtils.swift diff --git a/SessionProtocolKit/Utility/Randomness.h b/SessionProtocolKit/Signal/Utility/Randomness.h similarity index 100% rename from SessionProtocolKit/Utility/Randomness.h rename to SessionProtocolKit/Signal/Utility/Randomness.h diff --git a/SessionProtocolKit/Utility/Randomness.m b/SessionProtocolKit/Signal/Utility/Randomness.m similarity index 100% rename from SessionProtocolKit/Utility/Randomness.m rename to SessionProtocolKit/Signal/Utility/Randomness.m diff --git a/SessionProtocolKit/Utility/SCKExceptionWrapper.h b/SessionProtocolKit/Signal/Utility/SCKExceptionWrapper.h similarity index 100% rename from SessionProtocolKit/Utility/SCKExceptionWrapper.h rename to SessionProtocolKit/Signal/Utility/SCKExceptionWrapper.h diff --git a/SessionProtocolKit/Utility/SCKExceptionWrapper.m b/SessionProtocolKit/Signal/Utility/SCKExceptionWrapper.m similarity index 100% rename from SessionProtocolKit/Utility/SCKExceptionWrapper.m rename to SessionProtocolKit/Signal/Utility/SCKExceptionWrapper.m diff --git a/SessionProtocolKit/Utility/SerializationUtilities.h b/SessionProtocolKit/Signal/Utility/SerializationUtilities.h similarity index 100% rename from SessionProtocolKit/Utility/SerializationUtilities.h rename to SessionProtocolKit/Signal/Utility/SerializationUtilities.h diff --git a/SessionProtocolKit/Utility/SerializationUtilities.m b/SessionProtocolKit/Signal/Utility/SerializationUtilities.m similarity index 100% rename from SessionProtocolKit/Utility/SerializationUtilities.m rename to SessionProtocolKit/Signal/Utility/SerializationUtilities.m diff --git a/SessionProtocolKit/Utility/String+OWS.swift b/SessionProtocolKit/Signal/Utility/String+OWS.swift similarity index 100% rename from SessionProtocolKit/Utility/String+OWS.swift rename to SessionProtocolKit/Signal/Utility/String+OWS.swift diff --git a/SessionProtocolKit/Utility/Threading.h b/SessionProtocolKit/Signal/Utility/Threading.h similarity index 100% rename from SessionProtocolKit/Utility/Threading.h rename to SessionProtocolKit/Signal/Utility/Threading.h diff --git a/SessionProtocolKit/Utility/Threading.m b/SessionProtocolKit/Signal/Utility/Threading.m similarity index 100% rename from SessionProtocolKit/Utility/Threading.m rename to SessionProtocolKit/Signal/Utility/Threading.m diff --git a/SessionProtocolKit/Utility/iOSVersions.h b/SessionProtocolKit/Signal/Utility/iOSVersions.h similarity index 100% rename from SessionProtocolKit/Utility/iOSVersions.h rename to SessionProtocolKit/Signal/Utility/iOSVersions.h diff --git a/SessionSnodeKit/Utilities/Data+Utilities.swift b/SessionSnodeKit/Utilities/Data+Utilities.swift index 565ead5ce..d8d72aa9f 100644 --- a/SessionSnodeKit/Utilities/Data+Utilities.swift +++ b/SessionSnodeKit/Utilities/Data+Utilities.swift @@ -2,15 +2,6 @@ import Foundation internal extension Data { - /// Returns `size` bytes of random data generated using the default secure random number generator. See - /// [SecRandomCopyBytes](https://developer.apple.com/documentation/security/1399291-secrandomcopybytes) for more information. - static func getSecureRandomData(ofSize size: UInt) -> Data? { - var data = Data(count: Int(size)) - let result = data.withUnsafeMutableBytes { SecRandomCopyBytes(kSecRandomDefault, Int(size), $0.baseAddress!) } - guard result == errSecSuccess else { return nil } - return data - } - init(from inputStream: InputStream) throws { self.init() inputStream.open() diff --git a/SessionUtilities/Array+Description.swift b/SessionUtilities/Array+Description.swift index 6ac99240a..3d58476dc 100644 --- a/SessionUtilities/Array+Description.swift +++ b/SessionUtilities/Array+Description.swift @@ -1,7 +1,7 @@ public extension Array where Element : CustomStringConvertible { - var prettifiedDescription: String { + public var prettifiedDescription: String { return "[ " + map { $0.description }.joined(separator: ", ") + " ]" } } diff --git a/SessionUtilities/Data+SecureRandom.swift b/SessionUtilities/Data+SecureRandom.swift new file mode 100644 index 000000000..1ca9749f8 --- /dev/null +++ b/SessionUtilities/Data+SecureRandom.swift @@ -0,0 +1,13 @@ +import Foundation + +public extension Data { + + /// Returns `size` bytes of random data generated using the default secure random number generator. See + /// [SecRandomCopyBytes](https://developer.apple.com/documentation/security/1399291-secrandomcopybytes) for more information. + static func getSecureRandomData(ofSize size: UInt) -> Data? { + var data = Data(count: Int(size)) + let result = data.withUnsafeMutableBytes { SecRandomCopyBytes(kSecRandomDefault, Int(size), $0.baseAddress!) } + guard result == errSecSuccess else { return nil } + return data + } +} diff --git a/SessionUtilities/String+Trimming.swift b/SessionUtilities/String+Trimming.swift new file mode 100644 index 000000000..5e3f8b8cf --- /dev/null +++ b/SessionUtilities/String+Trimming.swift @@ -0,0 +1,9 @@ + +public extension String { + + public func removing05PrefixIfNeeded() -> String { + var result = self + if result.count == 66 && result.hasPrefix("05") { result.removeFirst(2) } + return result + } +} diff --git a/Signal.xcodeproj/project.pbxproj b/Signal.xcodeproj/project.pbxproj index d07f4420d..06c7c0fd2 100644 --- a/Signal.xcodeproj/project.pbxproj +++ b/Signal.xcodeproj/project.pbxproj @@ -732,6 +732,15 @@ C3C2AA082553B9C400C340D1 /* NSString+OWS.m in Sources */ = {isa = PBXBuildFile; fileRef = C3C2A9ED2553B9C400C340D1 /* NSString+OWS.m */; }; C3C2AA092553B9C400C340D1 /* NSObject+OWS.h in Headers */ = {isa = PBXBuildFile; fileRef = C3C2A9EE2553B9C400C340D1 /* NSObject+OWS.h */; settings = {ATTRIBUTES = (Public, ); }; }; C3C2AAC82553C25300C340D1 /* SessionProtocolKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3C2A8622553B41A00C340D1 /* SessionProtocolKit.framework */; }; + C3C2AB642553C5FF00C340D1 /* SharedSenderKeys.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3C2AB632553C5FF00C340D1 /* SharedSenderKeys.swift */; }; + C3C2ABD22553C6C900C340D1 /* Data+SecureRandom.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3C2ABD12553C6C900C340D1 /* Data+SecureRandom.swift */; }; + C3C2ABE42553C74400C340D1 /* ClosedGroupRatchet.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3C2ABE32553C74400C340D1 /* ClosedGroupRatchet.swift */; }; + C3C2ABEE2553C76900C340D1 /* ClosedGroupSenderKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3C2ABED2553C76900C340D1 /* ClosedGroupSenderKey.swift */; }; + C3C2ABF82553C8A300C340D1 /* Storage.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3C2ABF72553C8A300C340D1 /* Storage.swift */; }; + C3C2AC0A2553C9A100C340D1 /* Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3C2AC092553C9A100C340D1 /* Configuration.swift */; }; + C3C2AC1C2553CADF00C340D1 /* SharedSenderKeysDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3C2AC1B2553CADF00C340D1 /* SharedSenderKeysDelegate.swift */; }; + C3C2AC2E2553CBEB00C340D1 /* String+Trimming.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3C2AC2D2553CBEB00C340D1 /* String+Trimming.swift */; }; + C3C2AC372553CCE600C340D1 /* SessionUtilities.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3C2A679255388CC00C340D1 /* SessionUtilities.framework */; }; C3C3CF8924D8EED300E1CCE7 /* TextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3C3CF8824D8EED300E1CCE7 /* TextView.swift */; }; C3D0972B2510499C00F6E3E4 /* BackgroundPoller.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3D0972A2510499C00F6E3E4 /* BackgroundPoller.swift */; }; C3DAB3242480CB2B00725F25 /* SRCopyableLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3DAB3232480CB2A00725F25 /* SRCopyableLabel.swift */; }; @@ -1619,15 +1628,15 @@ C3C2A8642553B41A00C340D1 /* SessionProtocolKit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SessionProtocolKit.h; sourceTree = ""; }; C3C2A8652553B41A00C340D1 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; C3C2A8872553B4CC00C340D1 /* AxolotlExceptions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AxolotlExceptions.h; sourceTree = ""; }; - C3C2A8932553B4F500C340D1 /* PreKeyWhisperMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PreKeyWhisperMessage.h; path = SessionProtocolKit/CipherMessage/PreKeyWhisperMessage.h; sourceTree = SOURCE_ROOT; }; - C3C2A8942553B4F500C340D1 /* ClosedGroupCiphertextMessage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ClosedGroupCiphertextMessage.m; path = SessionProtocolKit/CipherMessage/ClosedGroupCiphertextMessage.m; sourceTree = SOURCE_ROOT; }; - C3C2A8952553B4F500C340D1 /* WhisperMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WhisperMessage.h; path = SessionProtocolKit/CipherMessage/WhisperMessage.h; sourceTree = SOURCE_ROOT; }; - C3C2A8962553B4F500C340D1 /* ClosedGroupCiphertextMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ClosedGroupCiphertextMessage.h; path = SessionProtocolKit/CipherMessage/ClosedGroupCiphertextMessage.h; sourceTree = SOURCE_ROOT; }; - C3C2A8972553B4F500C340D1 /* PreKeyWhisperMessage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PreKeyWhisperMessage.m; path = SessionProtocolKit/CipherMessage/PreKeyWhisperMessage.m; sourceTree = SOURCE_ROOT; }; - C3C2A8982553B4F600C340D1 /* WhisperMessage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = WhisperMessage.m; path = SessionProtocolKit/CipherMessage/WhisperMessage.m; sourceTree = SOURCE_ROOT; }; - C3C2A8992553B4F600C340D1 /* CipherMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CipherMessage.h; path = SessionProtocolKit/CipherMessage/CipherMessage.h; sourceTree = SOURCE_ROOT; }; - C3C2A89A2553B4F600C340D1 /* FallbackMessage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FallbackMessage.m; path = SessionProtocolKit/CipherMessage/FallbackMessage.m; sourceTree = SOURCE_ROOT; }; - C3C2A89B2553B4F600C340D1 /* FallbackMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FallbackMessage.h; path = SessionProtocolKit/CipherMessage/FallbackMessage.h; sourceTree = SOURCE_ROOT; }; + C3C2A8932553B4F500C340D1 /* PreKeyWhisperMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PreKeyWhisperMessage.h; path = SessionProtocolKit/Signal/CipherMessage/PreKeyWhisperMessage.h; sourceTree = SOURCE_ROOT; }; + C3C2A8942553B4F500C340D1 /* ClosedGroupCiphertextMessage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ClosedGroupCiphertextMessage.m; path = SessionProtocolKit/Signal/CipherMessage/ClosedGroupCiphertextMessage.m; sourceTree = SOURCE_ROOT; }; + C3C2A8952553B4F500C340D1 /* WhisperMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WhisperMessage.h; path = SessionProtocolKit/Signal/CipherMessage/WhisperMessage.h; sourceTree = SOURCE_ROOT; }; + C3C2A8962553B4F500C340D1 /* ClosedGroupCiphertextMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ClosedGroupCiphertextMessage.h; path = SessionProtocolKit/Signal/CipherMessage/ClosedGroupCiphertextMessage.h; sourceTree = SOURCE_ROOT; }; + C3C2A8972553B4F500C340D1 /* PreKeyWhisperMessage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PreKeyWhisperMessage.m; path = SessionProtocolKit/Signal/CipherMessage/PreKeyWhisperMessage.m; sourceTree = SOURCE_ROOT; }; + C3C2A8982553B4F600C340D1 /* WhisperMessage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = WhisperMessage.m; path = SessionProtocolKit/Signal/CipherMessage/WhisperMessage.m; sourceTree = SOURCE_ROOT; }; + C3C2A8992553B4F600C340D1 /* CipherMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CipherMessage.h; path = SessionProtocolKit/Signal/CipherMessage/CipherMessage.h; sourceTree = SOURCE_ROOT; }; + C3C2A89A2553B4F600C340D1 /* FallbackMessage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FallbackMessage.m; path = SessionProtocolKit/Signal/CipherMessage/FallbackMessage.m; sourceTree = SOURCE_ROOT; }; + C3C2A89B2553B4F600C340D1 /* FallbackMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FallbackMessage.h; path = SessionProtocolKit/Signal/CipherMessage/FallbackMessage.h; sourceTree = SOURCE_ROOT; }; C3C2A8B52553B53700C340D1 /* Constants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Constants.h; sourceTree = ""; }; C3C2A8C02553B55600C340D1 /* AES-CBC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "AES-CBC.h"; path = "Crypto/AES-CBC.h"; sourceTree = ""; }; C3C2A8C12553B55600C340D1 /* AES-CBC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "AES-CBC.m"; path = "Crypto/AES-CBC.m"; sourceTree = ""; }; @@ -1706,6 +1715,14 @@ C3C2A9EC2553B9C400C340D1 /* Cryptography.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Cryptography.m; path = Utility/Cryptography.m; sourceTree = ""; }; C3C2A9ED2553B9C400C340D1 /* NSString+OWS.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSString+OWS.m"; path = "Utility/NSString+OWS.m"; sourceTree = ""; }; C3C2A9EE2553B9C400C340D1 /* NSObject+OWS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSObject+OWS.h"; path = "Utility/NSObject+OWS.h"; sourceTree = ""; }; + C3C2AB632553C5FF00C340D1 /* SharedSenderKeys.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SharedSenderKeys.swift; sourceTree = ""; }; + C3C2ABD12553C6C900C340D1 /* Data+SecureRandom.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Data+SecureRandom.swift"; sourceTree = ""; }; + C3C2ABE32553C74400C340D1 /* ClosedGroupRatchet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClosedGroupRatchet.swift; sourceTree = ""; }; + C3C2ABED2553C76900C340D1 /* ClosedGroupSenderKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClosedGroupSenderKey.swift; sourceTree = ""; }; + C3C2ABF72553C8A300C340D1 /* Storage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Storage.swift; sourceTree = ""; }; + C3C2AC092553C9A100C340D1 /* Configuration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Configuration.swift; sourceTree = ""; }; + C3C2AC1B2553CADF00C340D1 /* SharedSenderKeysDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SharedSenderKeysDelegate.swift; sourceTree = ""; }; + C3C2AC2D2553CBEB00C340D1 /* String+Trimming.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Trimming.swift"; sourceTree = ""; }; C3C3CF8824D8EED300E1CCE7 /* TextView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextView.swift; sourceTree = ""; }; C3D0972A2510499C00F6E3E4 /* BackgroundPoller.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackgroundPoller.swift; sourceTree = ""; }; C3DAB3232480CB2A00725F25 /* SRCopyableLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRCopyableLabel.swift; sourceTree = ""; }; @@ -1802,6 +1819,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + C3C2AC372553CCE600C340D1 /* SessionUtilities.framework in Frameworks */, A33A4BA9D050805FE156E3ED /* Pods_SessionProtocolKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -3204,11 +3222,13 @@ children = ( C3C2A68B255388D500C340D1 /* Meta */, C3C2A5D12553860800C340D1 /* Array+Description.swift */, + C3C2ABD12553C6C900C340D1 /* Data+SecureRandom.swift */, C3C2A5D52553860A00C340D1 /* Dictionary+Description.swift */, C3C2A5BC255385EE00C340D1 /* HTTP.swift */, C3C2A5D92553860B00C340D1 /* JSON.swift */, C3C2A5CE2553860700C340D1 /* Logging.swift */, C3C2A5D62553860B00C340D1 /* Promise+Retrying.swift */, + C3C2AC2D2553CBEB00C340D1 /* String+Trimming.swift */, ); path = SessionUtilities; sourceTree = ""; @@ -3266,19 +3286,10 @@ C3C2A8632553B41A00C340D1 /* SessionProtocolKit */ = { isa = PBXGroup; children = ( - C3C2A8872553B4CC00C340D1 /* AxolotlExceptions.h */, - C3C2A8922553B4E400C340D1 /* CipherMessage */, - C3C2A8B52553B53700C340D1 /* Constants.h */, - C3C2A8BF2553B54600C340D1 /* Crypto */, C3C2A8762553B42C00C340D1 /* Meta */, - C3C2A8CD2553B56400C340D1 /* Prekeys */, - C3C2A8E32553B58B00C340D1 /* Protos */, - C3C2A8F02553B5A100C340D1 /* Ratchet */, - C3C2A9292553B5BD00C340D1 /* SessionCipher.h */, - C3C2A92A2553B5BE00C340D1 /* SessionCipher.m */, - C3C2A9352553B5C300C340D1 /* Sessions */, - C3C2A9562553B5F600C340D1 /* State */, - C3C2A9692553B62B00C340D1 /* Utility */, + C3C2AC092553C9A100C340D1 /* Configuration.swift */, + C3C2AB622553C5D400C340D1 /* Shared Sender Keys */, + C3C2AB492553C4A800C340D1 /* Signal */, ); path = SessionProtocolKit; sourceTree = ""; @@ -3432,6 +3443,37 @@ name = Utility; sourceTree = ""; }; + C3C2AB492553C4A800C340D1 /* Signal */ = { + isa = PBXGroup; + children = ( + C3C2A8872553B4CC00C340D1 /* AxolotlExceptions.h */, + C3C2A8922553B4E400C340D1 /* CipherMessage */, + C3C2A8B52553B53700C340D1 /* Constants.h */, + C3C2A8BF2553B54600C340D1 /* Crypto */, + C3C2A8CD2553B56400C340D1 /* Prekeys */, + C3C2A8E32553B58B00C340D1 /* Protos */, + C3C2A8F02553B5A100C340D1 /* Ratchet */, + C3C2A9292553B5BD00C340D1 /* SessionCipher.h */, + C3C2A92A2553B5BE00C340D1 /* SessionCipher.m */, + C3C2A9352553B5C300C340D1 /* Sessions */, + C3C2A9562553B5F600C340D1 /* State */, + C3C2A9692553B62B00C340D1 /* Utility */, + ); + path = Signal; + sourceTree = ""; + }; + C3C2AB622553C5D400C340D1 /* Shared Sender Keys */ = { + isa = PBXGroup; + children = ( + C3C2ABE32553C74400C340D1 /* ClosedGroupRatchet.swift */, + C3C2ABED2553C76900C340D1 /* ClosedGroupSenderKey.swift */, + C3C2AB632553C5FF00C340D1 /* SharedSenderKeys.swift */, + C3C2AC1B2553CADF00C340D1 /* SharedSenderKeysDelegate.swift */, + C3C2ABF72553C8A300C340D1 /* Storage.swift */, + ); + path = "Shared Sender Keys"; + sourceTree = ""; + }; D221A07E169C9E5E00537ABF = { isa = PBXGroup; children = ( @@ -3947,6 +3989,7 @@ C3C2A678255388CC00C340D1 = { CreatedOnToolsVersion = 12.1; DevelopmentTeam = SUQ8J2PCT7; + LastSwiftMigration = 1210; ProvisioningStyle = Automatic; }; C3C2A6EF25539DE700C340D1 = { @@ -4754,6 +4797,8 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + C3C2ABD22553C6C900C340D1 /* Data+SecureRandom.swift in Sources */, + C3C2AC2E2553CBEB00C340D1 /* String+Trimming.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -4779,6 +4824,7 @@ C3C2A91B2553B5B200C340D1 /* BobAxolotlParameters.m in Sources */, C3C2A8D82553B57C00C340D1 /* PreKeyRecord.m in Sources */, C3C2A9712553B63C00C340D1 /* SerializationUtilities.m in Sources */, + C3C2ABEE2553C76900C340D1 /* ClosedGroupSenderKey.swift in Sources */, C3C2A9172553B5B200C340D1 /* RootKey.m in Sources */, C3C2A9112553B5B200C340D1 /* ChainKey.m in Sources */, C3C2A8C32553B55600C340D1 /* AES-CBC.m in Sources */, @@ -4790,6 +4836,7 @@ C3C2A8A02553B4F600C340D1 /* PreKeyWhisperMessage.m in Sources */, C3C2A93F2553B5D700C340D1 /* SessionState.m in Sources */, C3C2A9F02553B9C400C340D1 /* OWSAsserts.m in Sources */, + C3C2ABF82553C8A300C340D1 /* Storage.swift in Sources */, C3C2A9F72553B9C400C340D1 /* NSData+OWS.m in Sources */, C3C2A90D2553B5B200C340D1 /* RKCK.m in Sources */, C3C2A8E72553B59B00C340D1 /* SPKProto.swift in Sources */, @@ -4801,16 +4848,20 @@ C3C2A8A32553B4F600C340D1 /* FallbackMessage.m in Sources */, C3C2AA072553B9C400C340D1 /* Cryptography.m in Sources */, C3C2A9F52553B9C400C340D1 /* NSDate+OWS.mm in Sources */, + C3C2ABE42553C74400C340D1 /* ClosedGroupRatchet.swift in Sources */, C3C2A93E2553B5D700C340D1 /* SessionRecord.m in Sources */, C3C2AA052553B9C400C340D1 /* SCKExceptionWrapper.m in Sources */, C3C2A8D62553B57C00C340D1 /* PreKeyBundle.m in Sources */, C3C2A9F62553B9C400C340D1 /* Data+OWS.swift in Sources */, C3C2A89D2553B4F600C340D1 /* ClosedGroupCiphertextMessage.m in Sources */, C3C2A9FB2553B9C400C340D1 /* Logger.swift in Sources */, + C3C2AC0A2553C9A100C340D1 /* Configuration.swift in Sources */, C3C2A96E2553B63C00C340D1 /* NSData+keyVersionByte.m in Sources */, C3C2A8E62553B59B00C340D1 /* WhisperTextProtocol.pb.swift in Sources */, + C3C2AB642553C5FF00C340D1 /* SharedSenderKeys.swift in Sources */, C3C2A9102553B5B200C340D1 /* AliceAxolotlParameters.m in Sources */, C3C2A9FA2553B9C400C340D1 /* OWSSwiftUtils.swift in Sources */, + C3C2AC1C2553CADF00C340D1 /* SharedSenderKeysDelegate.swift in Sources */, C3C2A92C2553B5BE00C340D1 /* SessionCipher.m in Sources */, C3C2A8D42553B57C00C340D1 /* SignedPrekeyRecord.m in Sources */, C3C2A8A12553B4F600C340D1 /* WhisperMessage.m in Sources */, @@ -5698,6 +5749,7 @@ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;