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.
		
		
		
		
		
			
		
			
				
	
	
		
			72 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Swift
		
	
			
		
		
	
	
			72 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Swift
		
	
// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved.
 | 
						|
 | 
						|
import Foundation
 | 
						|
import SessionUtilitiesKit
 | 
						|
 | 
						|
// MARK: - Decoding
 | 
						|
 | 
						|
extension Dependencies {
 | 
						|
    static let userInfoKey: CodingUserInfoKey = CodingUserInfoKey(rawValue: "io.oxen.dependencies.codingOptions")!
 | 
						|
}
 | 
						|
 | 
						|
public extension Data {
 | 
						|
    func decoded<T: Decodable>(as type: T.Type, using dependencies: Dependencies = Dependencies()) throws -> T {
 | 
						|
        do {
 | 
						|
            let decoder: JSONDecoder = JSONDecoder()
 | 
						|
            decoder.userInfo = [ Dependencies.userInfoKey: dependencies ]
 | 
						|
            
 | 
						|
            return try decoder.decode(type, from: self)
 | 
						|
        }
 | 
						|
        catch {
 | 
						|
            throw HTTP.Error.parsingFailed
 | 
						|
        }
 | 
						|
    }
 | 
						|
    
 | 
						|
    func removePadding() -> Data {
 | 
						|
        let bytes: [UInt8] = self.bytes
 | 
						|
        var paddingStart: Int = self.count
 | 
						|
        
 | 
						|
        for i in 0..<(self.count - 1) {
 | 
						|
            let targetIndex: Int = ((self.count - 1) - i)
 | 
						|
            
 | 
						|
            if bytes[targetIndex] == 0x80 {
 | 
						|
                paddingStart = targetIndex
 | 
						|
                break
 | 
						|
            }
 | 
						|
            else if bytes[targetIndex] != 0x00 {
 | 
						|
                SNLog("Failed to remove padding, returning unstripped padding");
 | 
						|
                return self
 | 
						|
            }
 | 
						|
        }
 | 
						|
        
 | 
						|
        return self.prefix(upTo: paddingStart)
 | 
						|
    }
 | 
						|
    
 | 
						|
    func paddedMessageBody() -> Data {
 | 
						|
        // 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.
 | 
						|
        let paddedMessageLength: Int = (self.paddedMessageLength(self.count + 1) - 1)
 | 
						|
        var paddedMessage: Data = Data(count: paddedMessageLength)
 | 
						|
 | 
						|
        let paddingByte: UInt8 = 0x80
 | 
						|
        paddedMessage[0..<self.count] = Data(self.bytes)
 | 
						|
        paddedMessage[self.count..<(self.count + 1)] = Data([paddingByte])
 | 
						|
        
 | 
						|
        return paddedMessage
 | 
						|
    }
 | 
						|
    
 | 
						|
    private func paddedMessageLength(_ unpaddedLength: Int) -> Int {
 | 
						|
        let messageLengthWithTerminator: Int = (unpaddedLength + 1)
 | 
						|
        var messagePartCount: Int = (messageLengthWithTerminator / 160)
 | 
						|
        
 | 
						|
        if CGFloat(messageLengthWithTerminator).truncatingRemainder(dividingBy: 160) != 0 {
 | 
						|
            messagePartCount += 1
 | 
						|
        }
 | 
						|
        
 | 
						|
        return (messagePartCount * 160)
 | 
						|
    }
 | 
						|
}
 |