mirror of https://github.com/oxen-io/session-ios
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
61 lines
1.9 KiB
Matlab
61 lines
1.9 KiB
Matlab
5 years ago
|
//
|
||
|
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
|
||
|
//
|
||
|
|
||
|
#import <Foundation/Foundation.h>
|
||
|
#import "OWSAsserts.h"
|
||
|
#import "NSData+messagePadding.h"
|
||
|
|
||
|
@implementation NSData (messagePadding)
|
||
|
|
||
|
- (NSData *)removePadding {
|
||
|
unsigned long paddingStart = self.length;
|
||
|
|
||
|
Byte data[self.length];
|
||
|
[self getBytes:data length:self.length];
|
||
|
|
||
|
for (long i = (long)self.length - 1; i >= 0; i--) {
|
||
|
if (data[i] == (Byte)0x80) {
|
||
|
paddingStart = (unsigned long)i;
|
||
|
break;
|
||
|
} else if (data[i] != (Byte)0x00) {
|
||
|
OWSLogWarn(@"Failed to remove padding, returning unstripped padding");
|
||
|
return self;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return [self subdataWithRange:NSMakeRange(0, paddingStart)];
|
||
|
}
|
||
|
|
||
|
|
||
|
- (NSData *)paddedMessageBody {
|
||
|
// From
|
||
|
// https://github.com/signalapp/TextSecure/blob/master/libtextsecure/src/main/java/org/whispersystems/textsecure/internal/push/PushTransportDetails.java#L55
|
||
|
// NOTE: This is dumb. We have our own padding scheme, but so does the cipher.
|
||
|
// The +1 -1 here is to make sure the Cipher has room to add one padding byte,
|
||
|
// otherwise it'll add a full 16 extra bytes.
|
||
|
|
||
|
NSUInteger paddedMessageLength = [self paddedMessageLength:(self.length + 1)] - 1;
|
||
|
NSMutableData *paddedMessage = [NSMutableData dataWithLength:paddedMessageLength];
|
||
|
|
||
|
Byte paddingByte = 0x80;
|
||
|
|
||
|
[paddedMessage replaceBytesInRange:NSMakeRange(0, self.length) withBytes:[self bytes]];
|
||
|
[paddedMessage replaceBytesInRange:NSMakeRange(self.length, 1) withBytes:&paddingByte];
|
||
|
|
||
|
return paddedMessage;
|
||
|
}
|
||
|
|
||
|
- (NSUInteger)paddedMessageLength:(NSUInteger)messageLength {
|
||
|
NSUInteger messageLengthWithTerminator = messageLength + 1;
|
||
|
NSUInteger messagePartCount = messageLengthWithTerminator / 160;
|
||
|
|
||
|
if (messageLengthWithTerminator % 160 != 0) {
|
||
|
messagePartCount++;
|
||
|
}
|
||
|
|
||
|
return messagePartCount * 160;
|
||
|
}
|
||
|
|
||
|
@end
|