All sync messages should have 1-512 random padding

// FREEBIE
pull/1/head
Michael Kirk 8 years ago
parent 35ee92f38f
commit 12bfae10ed

@ -27,7 +27,7 @@ NS_ASSUME_NONNULL_BEGIN
return self; return self;
} }
- (OWSSignalServiceProtosSyncMessage *)buildSyncMessage - (OWSSignalServiceProtosSyncMessageBuilder *)syncMessageBuilder
{ {
OWSSignalServiceProtosSyncMessageBlockedBuilder *blockedPhoneNumbersBuilder = OWSSignalServiceProtosSyncMessageBlockedBuilder *blockedPhoneNumbersBuilder =
[OWSSignalServiceProtosSyncMessageBlockedBuilder new]; [OWSSignalServiceProtosSyncMessageBlockedBuilder new];
@ -35,7 +35,7 @@ NS_ASSUME_NONNULL_BEGIN
OWSSignalServiceProtosSyncMessageBuilder *syncMessageBuilder = [OWSSignalServiceProtosSyncMessageBuilder new]; OWSSignalServiceProtosSyncMessageBuilder *syncMessageBuilder = [OWSSignalServiceProtosSyncMessageBuilder new];
[syncMessageBuilder setBlocked:[blockedPhoneNumbersBuilder build]]; [syncMessageBuilder setBlocked:[blockedPhoneNumbersBuilder build]];
return [syncMessageBuilder build]; return syncMessageBuilder;
} }
@end @end

@ -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 "OWSReadReceiptsMessage.h"
#import "OWSReadReceipt.h" #import "OWSReadReceipt.h"
@ -26,7 +28,7 @@ NS_ASSUME_NONNULL_BEGIN
return self; return self;
} }
- (OWSSignalServiceProtosSyncMessage *)buildSyncMessage - (OWSSignalServiceProtosSyncMessageBuilder *)syncMessageBuilder
{ {
OWSSignalServiceProtosSyncMessageBuilder *syncMessageBuilder = [OWSSignalServiceProtosSyncMessageBuilder new]; OWSSignalServiceProtosSyncMessageBuilder *syncMessageBuilder = [OWSSignalServiceProtosSyncMessageBuilder new];
for (OWSReadReceipt *readReceipt in self.readReceipts) { for (OWSReadReceipt *readReceipt in self.readReceipts) {
@ -37,7 +39,7 @@ NS_ASSUME_NONNULL_BEGIN
[syncMessageBuilder addRead:[readProtoBuilder build]]; [syncMessageBuilder addRead:[readProtoBuilder build]];
} }
return [syncMessageBuilder build]; return syncMessageBuilder;
} }
@end @end

@ -69,13 +69,14 @@ NS_ASSUME_NONNULL_BEGIN
_identityKey = identityKey; _identityKey = identityKey;
_verificationForRecipientId = verificationForRecipientId; _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; _paddingBytesLength = arc4random_uniform(512) + 1;
return self; return self;
} }
- (OWSSignalServiceProtosSyncMessage *)buildSyncMessage - (OWSSignalServiceProtosSyncMessageBuilder *)syncMessageBuilder
{ {
// OWSAssert(self.tuples.count > 0); // OWSAssert(self.tuples.count > 0);
@ -101,6 +102,7 @@ NS_ASSUME_NONNULL_BEGIN
// //
OWSSignalServiceProtosVerifiedBuilder *verifiedBuilder = [OWSSignalServiceProtosVerifiedBuilder new]; OWSSignalServiceProtosVerifiedBuilder *verifiedBuilder = [OWSSignalServiceProtosVerifiedBuilder new];
verifiedBuilder.destination = self.verificationForRecipientId; verifiedBuilder.destination = self.verificationForRecipientId;
verifiedBuilder.identityKey = self.identityKey; verifiedBuilder.identityKey = self.identityKey;
verifiedBuilder.state = ^{ verifiedBuilder.state = ^{
@ -115,9 +117,11 @@ NS_ASSUME_NONNULL_BEGIN
}(); }();
OWSAssert(self.paddingBytesLength != 0); 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<NSString *> *)recipientIds //- (NSArray<NSString *> *)recipientIds

@ -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 "OWSOutgoingSentMessageTranscript.h"
#import "OWSSignalServiceProtos.pb.h" #import "OWSSignalServiceProtos.pb.h"
@ -37,7 +39,7 @@ NS_ASSUME_NONNULL_BEGIN
return self; return self;
} }
- (OWSSignalServiceProtosSyncMessage *)buildSyncMessage - (OWSSignalServiceProtosSyncMessageBuilder *)syncMessageBuilder
{ {
OWSSignalServiceProtosSyncMessageBuilder *syncMessageBuilder = [OWSSignalServiceProtosSyncMessageBuilder new]; OWSSignalServiceProtosSyncMessageBuilder *syncMessageBuilder = [OWSSignalServiceProtosSyncMessageBuilder new];
@ -49,7 +51,7 @@ NS_ASSUME_NONNULL_BEGIN
[syncMessageBuilder setSentBuilder:sentBuilder]; [syncMessageBuilder setSentBuilder:sentBuilder];
return [syncMessageBuilder build]; return syncMessageBuilder;
} }
@end @end

@ -4,6 +4,7 @@
#import "OWSOutgoingSyncMessage.h" #import "OWSOutgoingSyncMessage.h"
#import "OWSSignalServiceProtos.pb.h" #import "OWSSignalServiceProtos.pb.h"
#import "Cryptography.h"
NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_BEGIN
@ -21,19 +22,29 @@ NS_ASSUME_NONNULL_BEGIN
return NO; return NO;
} }
// This method should not be overridden, since we want to add random padding to *every* sync message
- (OWSSignalServiceProtosSyncMessage *)buildSyncMessage - (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 *syncMessageBuilder = [OWSSignalServiceProtosSyncMessageBuilder new]; {
return [syncMessageBuilder build]; OWSFail(@"Abstract method should be overridden in subclass.");
return [OWSSignalServiceProtosSyncMessageBuilder new];
} }
- (NSData *)buildPlainTextData - (NSData *)buildPlainTextData
{ {
OWSSignalServiceProtosContentBuilder *contentBuilder = [OWSSignalServiceProtosContentBuilder new]; OWSSignalServiceProtosContentBuilder *contentBuilder = [OWSSignalServiceProtosContentBuilder new];
[contentBuilder setSyncMessage:[self buildSyncMessage]]; contentBuilder.syncMessage = [self buildSyncMessage];
return [[contentBuilder build] data]; return [[contentBuilder build] data];
} }

@ -38,7 +38,7 @@ NS_ASSUME_NONNULL_BEGIN
return self; return self;
} }
- (OWSSignalServiceProtosSyncMessage *)buildSyncMessage - (OWSSignalServiceProtosSyncMessageBuilder *)syncMessageBuilder
{ {
if (self.attachmentIds.count != 1) { if (self.attachmentIds.count != 1) {
DDLogError(@"expected sync contact message to have exactly one attachment, but found %lu", 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]; OWSSignalServiceProtosSyncMessageBuilder *syncMessageBuilder = [OWSSignalServiceProtosSyncMessageBuilder new];
[syncMessageBuilder setContactsBuilder:contactsBuilder]; [syncMessageBuilder setContactsBuilder:contactsBuilder];
return [syncMessageBuilder build]; return syncMessageBuilder;
} }
- (NSData *)buildPlainTextAttachmentData - (NSData *)buildPlainTextAttachmentData

@ -19,7 +19,7 @@ NS_ASSUME_NONNULL_BEGIN
return [super initWithTimestamp:[NSDate ows_millisecondTimeStamp]]; return [super initWithTimestamp:[NSDate ows_millisecondTimeStamp]];
} }
- (OWSSignalServiceProtosSyncMessage *)buildSyncMessage - (OWSSignalServiceProtosSyncMessageBuilder *)syncMessageBuilder
{ {
if (self.attachmentIds.count != 1) { if (self.attachmentIds.count != 1) {
@ -37,7 +37,7 @@ NS_ASSUME_NONNULL_BEGIN
OWSSignalServiceProtosSyncMessageBuilder *syncMessageBuilder = [OWSSignalServiceProtosSyncMessageBuilder new]; OWSSignalServiceProtosSyncMessageBuilder *syncMessageBuilder = [OWSSignalServiceProtosSyncMessageBuilder new];
[syncMessageBuilder setGroupsBuilder:groupsBuilder]; [syncMessageBuilder setGroupsBuilder:groupsBuilder];
return [syncMessageBuilder build]; return syncMessageBuilder;
} }
- (NSData *)buildPlainTextAttachmentData - (NSData *)buildPlainTextAttachmentData

@ -1173,7 +1173,9 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
inThread:(TSThread *)thread inThread:(TSThread *)thread
{ {
NSMutableArray *messagesArray = [NSMutableArray arrayWithCapacity:recipient.devices.count]; NSMutableArray *messagesArray = [NSMutableArray arrayWithCapacity:recipient.devices.count];
NSData *plainText = [message buildPlainTextData]; NSData *plainText = [message buildPlainTextData];
DDLogDebug(@"%@ message: %@ plainTextData.length: %lu", self.tag, [message class], plainText.length);
for (NSNumber *deviceNumber in recipient.devices) { for (NSNumber *deviceNumber in recipient.devices) {
@try { @try {

@ -40,15 +40,11 @@ NS_ASSUME_NONNULL_BEGIN
OWSSignalServiceProtosContentBuilder *contentBuilder = [OWSSignalServiceProtosContentBuilder new]; OWSSignalServiceProtosContentBuilder *contentBuilder = [OWSSignalServiceProtosContentBuilder new];
OWSSignalServiceProtosNullMessageBuilder *nullMessageBuilder = [OWSSignalServiceProtosNullMessageBuilder new]; OWSSignalServiceProtosNullMessageBuilder *nullMessageBuilder = [OWSSignalServiceProtosNullMessageBuilder new];
// TODO padding size.
NSUInteger contentLength = self.verificationStateSyncMessage.buildPlainTextData.length; NSUInteger contentLength = self.verificationStateSyncMessage.buildPlainTextData.length;
contentLength -= self.verificationStateSyncMessage.paddingBytesLength; contentLength -= self.verificationStateSyncMessage.paddingBytesLength;
OWSAssert(contentLength > 0) OWSAssert(contentLength > 0)
// Add 1-512 bytes of random padding bytes.
contentLength += arc4random_uniform(512) + 1;
nullMessageBuilder.padding = [Cryptography generateRandomBytes:contentLength]; nullMessageBuilder.padding = [Cryptography generateRandomBytes:contentLength];
contentBuilder.nullMessage = [nullMessageBuilder build]; contentBuilder.nullMessage = [nullMessageBuilder build];
@ -56,6 +52,11 @@ NS_ASSUME_NONNULL_BEGIN
return [contentBuilder build].data; return [contentBuilder build].data;
} }
- (BOOL)shouldSyncTranscript
{
return NO;
}
- (void)saveWithTransaction:(YapDatabaseReadWriteTransaction *)transaction - (void)saveWithTransaction:(YapDatabaseReadWriteTransaction *)transaction
{ {
// No-op as we don't want to actually display this as an outgoing message in our thread. // No-op as we don't want to actually display this as an outgoing message in our thread.

Loading…
Cancel
Save