xpra icon
Bug tracker and wiki

Ticket #933: padding.diff

File padding.diff, 5.3 KB (added by Josh, 6 years ago)
  • xpra/net/protocol.py

     
    317317            if self.cipher_out:
    318318                proto_flags |= FLAGS_CIPHER
    319319                #note: since we are padding: l!=len(data)
    320                 padding = (self.cipher_out_block_size - len(data) % self.cipher_out_block_size) * " "
    321                 if len(padding)==0:
     320                padding_size = self.cipher_out_block_size - (len(data) % self.cipher_out_block_size)
     321                if padding_size==0:
    322322                    padded = data
    323323                else:
    324                     padded = data+padding
    325                 actual_size = payload_size + len(padding)
     324                    # pad byte value is number of padding bytes added
     325                    padtext = ""
     326                    for _ in xrange(padding_size):
     327                        padtext += chr(padding_size)
     328                    padded = data+padtext
     329                actual_size = payload_size + padding_size
    326330                assert len(padded)==actual_size, "expected padded size to be %i, but got %i" % (len(padded), actual_size)
    327331                data = self.cipher_out.encrypt(padded)
    328332                assert len(data)==actual_size, "expected encrypted size to be %i, but got %i" % (len(data), actual_size)
    329                 log("sending %s bytes encrypted with %s padding", payload_size, len(padding))
     333                log("sending %s bytes encrypted with %s padding", payload_size, padding_size)
    330334            if proto_flags & FLAGS_NOHEADER:
    331335                #for plain/text packets (ie: gibberish response)
    332336                items.append((data, scb, ecb))
     
    660664        """
    661665        read_buffer = None
    662666        payload_size = -1
    663         padding = None
     667        padding_size = 0
    664668        packet_index = 0
    665669        compression_level = False
    666670        raw_packets = {}
     
    699703                            log.warn("received cipher block but we don't have a cipher to decrypt it with, not an xpra client?")
    700704                            self._invalid_header(read_buffer)
    701705                            return
    702                         padding = (self.cipher_in_block_size - data_size % self.cipher_in_block_size) * " "
    703                         payload_size = data_size + len(padding)
     706                        padding_size = self.cipher_in_block_size - (data_size % self.cipher_in_block_size)
     707                        payload_size = data_size + padding_size
    704708                    else:
    705709                        #no cipher, no padding:
    706                         padding = None
     710                        padding_size = 0
    707711                        payload_size = data_size
    708712                    assert payload_size>0, "invalid payload size: %i" % payload_size
    709713                    read_buffer = read_buffer[8:]
     
    736740                #decrypt if needed:
    737741                data = raw_string
    738742                if self.cipher_in and protocol_flags & FLAGS_CIPHER:
    739                     log("received %s encrypted bytes with %s padding", payload_size, len(padding))
     743                    log("received %s encrypted bytes with %s padding", payload_size, padding_size)
    740744                    data = self.cipher_in.decrypt(raw_string)
    741                     if padding:
     745                    if padding_size > 0:
    742746                        def debug_str(s):
    743747                            try:
    744748                                return list(bytearray(s))
    745749                            except:
    746750                                return list(str(s))
    747                         if not data.endswith(padding):
    748                             log("decryption failed: string does not end with '%s': %s (%s) -> %s (%s)",
    749                             padding, debug_str(raw_string), type(raw_string), debug_str(data), type(data))
    750                             self._internal_error("encryption error (wrong key?)")
    751                             return
    752                         data = data[:-len(padding)]
     751                        # pad byte value is number of padding bytes added
     752                        padtext = ""
     753                        for _ in xrange(padding_size):
     754                            padtext += chr(padding_size)
     755                        if not data.endswith(padtext):
     756                            old_padding = (self.cipher_in_block_size - data_size % self.cipher_in_block_size) * " "
     757                            if not data.endswith(old_padding):
     758                                log("decryption failed: string does not end with '%s' or '%s': %s (%s) -> %s (%s)",
     759                                padtext, old_padding, debug_str(raw_string), type(raw_string), debug_str(data), type(data))
     760                                self._internal_error("encryption error (wrong key?)")
     761                                return
     762                        data = data[:-padding]
    753763                #uncompress if needed:
    754764                if compression_level>0:
    755765                    try:
     
    800810                if self._closed:
    801811                    return
    802812                payload_size = -1
    803                 padding = None
     813                padding_size = 0
    804814                #add any raw packets back into it:
    805815                if raw_packets:
    806816                    for index,raw_data in raw_packets.items():