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 |