diff --git a/src/Devices/OWSBlockedPhoneNumbersMessage.m b/src/Devices/OWSBlockedPhoneNumbersMessage.m index 74473ddcf..d28764e82 100644 --- a/src/Devices/OWSBlockedPhoneNumbersMessage.m +++ b/src/Devices/OWSBlockedPhoneNumbersMessage.m @@ -27,7 +27,7 @@ NS_ASSUME_NONNULL_BEGIN return self; } -- (OWSSignalServiceProtosSyncMessage *)buildSyncMessage +- (OWSSignalServiceProtosSyncMessageBuilder *)syncMessageBuilder { OWSSignalServiceProtosSyncMessageBlockedBuilder *blockedPhoneNumbersBuilder = [OWSSignalServiceProtosSyncMessageBlockedBuilder new]; @@ -35,7 +35,7 @@ NS_ASSUME_NONNULL_BEGIN OWSSignalServiceProtosSyncMessageBuilder *syncMessageBuilder = [OWSSignalServiceProtosSyncMessageBuilder new]; [syncMessageBuilder setBlocked:[blockedPhoneNumbersBuilder build]]; - return [syncMessageBuilder build]; + return syncMessageBuilder; } @end diff --git a/src/Devices/OWSReadReceiptsMessage.m b/src/Devices/OWSReadReceiptsMessage.m index 4a4098a35..494b0e045 100644 --- a/src/Devices/OWSReadReceiptsMessage.m +++ b/src/Devices/OWSReadReceiptsMessage.m @@ -1,4 +1,6 @@ -// Copyright © 2016 Open Whisper Systems. All rights reserved. +// +// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// #import "OWSReadReceiptsMessage.h" #import "OWSReadReceipt.h" @@ -26,7 +28,7 @@ NS_ASSUME_NONNULL_BEGIN return self; } -- (OWSSignalServiceProtosSyncMessage *)buildSyncMessage +- (OWSSignalServiceProtosSyncMessageBuilder *)syncMessageBuilder { OWSSignalServiceProtosSyncMessageBuilder *syncMessageBuilder = [OWSSignalServiceProtosSyncMessageBuilder new]; for (OWSReadReceipt *readReceipt in self.readReceipts) { @@ -37,7 +39,7 @@ NS_ASSUME_NONNULL_BEGIN [syncMessageBuilder addRead:[readProtoBuilder build]]; } - return [syncMessageBuilder build]; + return syncMessageBuilder; } @end diff --git a/src/Devices/OWSVerificationStateSyncMessage.m b/src/Devices/OWSVerificationStateSyncMessage.m index 0af2aafa7..d7e937512 100644 --- a/src/Devices/OWSVerificationStateSyncMessage.m +++ b/src/Devices/OWSVerificationStateSyncMessage.m @@ -69,13 +69,14 @@ NS_ASSUME_NONNULL_BEGIN _identityKey = identityKey; _verificationForRecipientId = verificationForRecipientId; - // Add 1-512 bytes of random padding bytes. + // This sync message should be 1-512 bytes longer than the corresponding NullMessage + // we store this values so the corresponding NullMessage can subtract it from the total length. _paddingBytesLength = arc4random_uniform(512) + 1; return self; } -- (OWSSignalServiceProtosSyncMessage *)buildSyncMessage +- (OWSSignalServiceProtosSyncMessageBuilder *)syncMessageBuilder { // OWSAssert(self.tuples.count > 0); @@ -101,6 +102,7 @@ NS_ASSUME_NONNULL_BEGIN // OWSSignalServiceProtosVerifiedBuilder *verifiedBuilder = [OWSSignalServiceProtosVerifiedBuilder new]; + verifiedBuilder.destination = self.verificationForRecipientId; verifiedBuilder.identityKey = self.identityKey; verifiedBuilder.state = ^{ @@ -115,9 +117,11 @@ NS_ASSUME_NONNULL_BEGIN }(); OWSAssert(self.paddingBytesLength != 0); - syncMessageBuilder.padding = [Cryptography generateRandomBytes:self.paddingBytesLength]; + verifiedBuilder.nullMessage = [Cryptography generateRandomBytes:self.paddingBytesLength]; + + syncMessageBuilder.verifiedBuilder = verifiedBuilder; - return [syncMessageBuilder build]; + return syncMessageBuilder; } //- (NSArray *)recipientIds diff --git a/src/Messages/DeviceSyncing/OWSOutgoingSentMessageTranscript.m b/src/Messages/DeviceSyncing/OWSOutgoingSentMessageTranscript.m index b834f068f..5819de6e2 100644 --- a/src/Messages/DeviceSyncing/OWSOutgoingSentMessageTranscript.m +++ b/src/Messages/DeviceSyncing/OWSOutgoingSentMessageTranscript.m @@ -1,4 +1,6 @@ -// Copyright © 2016 Open Whisper Systems. All rights reserved. +// +// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// #import "OWSOutgoingSentMessageTranscript.h" #import "OWSSignalServiceProtos.pb.h" @@ -37,7 +39,7 @@ NS_ASSUME_NONNULL_BEGIN return self; } -- (OWSSignalServiceProtosSyncMessage *)buildSyncMessage +- (OWSSignalServiceProtosSyncMessageBuilder *)syncMessageBuilder { OWSSignalServiceProtosSyncMessageBuilder *syncMessageBuilder = [OWSSignalServiceProtosSyncMessageBuilder new]; @@ -49,7 +51,7 @@ NS_ASSUME_NONNULL_BEGIN [syncMessageBuilder setSentBuilder:sentBuilder]; - return [syncMessageBuilder build]; + return syncMessageBuilder; } @end diff --git a/src/Messages/DeviceSyncing/OWSOutgoingSyncMessage.m b/src/Messages/DeviceSyncing/OWSOutgoingSyncMessage.m index 1138d0592..47fe49cf3 100644 --- a/src/Messages/DeviceSyncing/OWSOutgoingSyncMessage.m +++ b/src/Messages/DeviceSyncing/OWSOutgoingSyncMessage.m @@ -4,6 +4,7 @@ #import "OWSOutgoingSyncMessage.h" #import "OWSSignalServiceProtos.pb.h" +#import "Cryptography.h" NS_ASSUME_NONNULL_BEGIN @@ -21,19 +22,29 @@ NS_ASSUME_NONNULL_BEGIN return NO; } +// This method should not be overridden, since we want to add random padding to *every* sync message - (OWSSignalServiceProtosSyncMessage *)buildSyncMessage { - NSAssert(NO, @"buildSyncMessage must be overridden in subclass"); + OWSSignalServiceProtosSyncMessageBuilder *builder = [self syncMessageBuilder]; + + // Add a random 1-512 bytes to obscure sync message type + size_t paddingBytesLength = arc4random_uniform(512) + 1; + builder.padding = [Cryptography generateRandomBytes:paddingBytesLength]; + + return [builder build]; +} - // e.g. - OWSSignalServiceProtosSyncMessageBuilder *syncMessageBuilder = [OWSSignalServiceProtosSyncMessageBuilder new]; - return [syncMessageBuilder build]; +- (OWSSignalServiceProtosSyncMessageBuilder *)syncMessageBuilder +{ + OWSFail(@"Abstract method should be overridden in subclass."); + return [OWSSignalServiceProtosSyncMessageBuilder new]; } - (NSData *)buildPlainTextData { OWSSignalServiceProtosContentBuilder *contentBuilder = [OWSSignalServiceProtosContentBuilder new]; - [contentBuilder setSyncMessage:[self buildSyncMessage]]; + contentBuilder.syncMessage = [self buildSyncMessage]; + return [[contentBuilder build] data]; } diff --git a/src/Messages/DeviceSyncing/OWSSyncContactsMessage.m b/src/Messages/DeviceSyncing/OWSSyncContactsMessage.m index 39e17004c..28c2b394c 100644 --- a/src/Messages/DeviceSyncing/OWSSyncContactsMessage.m +++ b/src/Messages/DeviceSyncing/OWSSyncContactsMessage.m @@ -38,7 +38,7 @@ NS_ASSUME_NONNULL_BEGIN return self; } -- (OWSSignalServiceProtosSyncMessage *)buildSyncMessage +- (OWSSignalServiceProtosSyncMessageBuilder *)syncMessageBuilder { if (self.attachmentIds.count != 1) { DDLogError(@"expected sync contact message to have exactly one attachment, but found %lu", @@ -57,7 +57,7 @@ NS_ASSUME_NONNULL_BEGIN OWSSignalServiceProtosSyncMessageBuilder *syncMessageBuilder = [OWSSignalServiceProtosSyncMessageBuilder new]; [syncMessageBuilder setContactsBuilder:contactsBuilder]; - return [syncMessageBuilder build]; + return syncMessageBuilder; } - (NSData *)buildPlainTextAttachmentData diff --git a/src/Messages/DeviceSyncing/OWSSyncGroupsMessage.m b/src/Messages/DeviceSyncing/OWSSyncGroupsMessage.m index 084bb2e55..24faf9ca1 100644 --- a/src/Messages/DeviceSyncing/OWSSyncGroupsMessage.m +++ b/src/Messages/DeviceSyncing/OWSSyncGroupsMessage.m @@ -19,7 +19,7 @@ NS_ASSUME_NONNULL_BEGIN return [super initWithTimestamp:[NSDate ows_millisecondTimeStamp]]; } -- (OWSSignalServiceProtosSyncMessage *)buildSyncMessage +- (OWSSignalServiceProtosSyncMessageBuilder *)syncMessageBuilder { if (self.attachmentIds.count != 1) { @@ -37,7 +37,7 @@ NS_ASSUME_NONNULL_BEGIN OWSSignalServiceProtosSyncMessageBuilder *syncMessageBuilder = [OWSSignalServiceProtosSyncMessageBuilder new]; [syncMessageBuilder setGroupsBuilder:groupsBuilder]; - return [syncMessageBuilder build]; + return syncMessageBuilder; } - (NSData *)buildPlainTextAttachmentData diff --git a/src/Messages/OWSMessageSender.m b/src/Messages/OWSMessageSender.m index 358fc6a75..2c29b9d80 100644 --- a/src/Messages/OWSMessageSender.m +++ b/src/Messages/OWSMessageSender.m @@ -1173,7 +1173,9 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; inThread:(TSThread *)thread { NSMutableArray *messagesArray = [NSMutableArray arrayWithCapacity:recipient.devices.count]; + NSData *plainText = [message buildPlainTextData]; + DDLogDebug(@"%@ message: %@ plainTextData.length: %lu", self.tag, [message class], plainText.length); for (NSNumber *deviceNumber in recipient.devices) { @try { diff --git a/src/Messages/OWSOutgoingNullMessage.m b/src/Messages/OWSOutgoingNullMessage.m index d799ae280..473fdacc8 100644 --- a/src/Messages/OWSOutgoingNullMessage.m +++ b/src/Messages/OWSOutgoingNullMessage.m @@ -40,15 +40,11 @@ NS_ASSUME_NONNULL_BEGIN OWSSignalServiceProtosContentBuilder *contentBuilder = [OWSSignalServiceProtosContentBuilder new]; OWSSignalServiceProtosNullMessageBuilder *nullMessageBuilder = [OWSSignalServiceProtosNullMessageBuilder new]; - // TODO padding size. NSUInteger contentLength = self.verificationStateSyncMessage.buildPlainTextData.length; contentLength -= self.verificationStateSyncMessage.paddingBytesLength; OWSAssert(contentLength > 0) - // Add 1-512 bytes of random padding bytes. - contentLength += arc4random_uniform(512) + 1; - nullMessageBuilder.padding = [Cryptography generateRandomBytes:contentLength]; contentBuilder.nullMessage = [nullMessageBuilder build]; @@ -56,6 +52,11 @@ NS_ASSUME_NONNULL_BEGIN return [contentBuilder build].data; } +- (BOOL)shouldSyncTranscript +{ + return NO; +} + - (void)saveWithTransaction:(YapDatabaseReadWriteTransaction *)transaction { // No-op as we don't want to actually display this as an outgoing message in our thread.