xpra icon
Bug tracker and wiki

Ticket #933: pkcs7-prepare.patch

File pkcs7-prepare.patch, 4.5 KB (added by Antoine Martin, 4 years ago)

splitting the patch into two: this prepares the code but does not actually change the padding

  • 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                    padded = data+(" "*padding_size)
     325                actual_size = payload_size + padding_size
    326326                assert len(padded)==actual_size, "expected padded size to be %i, but got %i" % (len(padded), actual_size)
    327327                data = self.cipher_out.encrypt(padded)
    328328                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))
     329                log("sending %s bytes encrypted with %s padding", payload_size, padding_size)
    330330            if proto_flags & FLAGS_NOHEADER:
    331331                #for plain/text packets (ie: gibberish response)
    332332                items.append((data, scb, ecb))
     
    660660        """
    661661        read_buffer = None
    662662        payload_size = -1
    663         padding = None
     663        padding_size = 0
    664664        packet_index = 0
    665665        compression_level = False
    666666        raw_packets = {}
     
    699699                            log.warn("received cipher block but we don't have a cipher to decrypt it with, not an xpra client?")
    700700                            self._invalid_header(read_buffer)
    701701                            return
    702                         padding = (self.cipher_in_block_size - data_size % self.cipher_in_block_size) * " "
    703                         payload_size = data_size + len(padding)
     702                        padding_size = self.cipher_in_block_size - (data_size % self.cipher_in_block_size)
     703                        payload_size = data_size + padding_size
    704704                    else:
    705705                        #no cipher, no padding:
    706                         padding = None
     706                        padding_size = 0
    707707                        payload_size = data_size
    708708                    assert payload_size>0, "invalid payload size: %i" % payload_size
    709709                    read_buffer = read_buffer[8:]
     
    736736                #decrypt if needed:
    737737                data = raw_string
    738738                if self.cipher_in and protocol_flags & FLAGS_CIPHER:
    739                     log("received %s encrypted bytes with %s padding", payload_size, len(padding))
     739                    log("received %s encrypted bytes with %s padding", payload_size, padding_size)
    740740                    data = self.cipher_in.decrypt(raw_string)
    741                     if padding:
     741                    if padding_size > 0:
    742742                        def debug_str(s):
    743743                            try:
    744744                                return list(bytearray(s))
    745745                            except:
    746746                                return list(str(s))
    747                         if not data.endswith(padding):
     747                        padtext = " "*padding_size
     748                        if not data.endswith(padtext):
    748749                            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                            padtext, debug_str(raw_string), type(raw_string), debug_str(data), type(data))
    750751                            self._internal_error("encryption error (wrong key?)")
    751752                            return
    752                         data = data[:-len(padding)]
     753                        data = data[:-padding_size]
    753754                #uncompress if needed:
    754755                if compression_level>0:
    755756                    try:
     
    800801                if self._closed:
    801802                    return
    802803                payload_size = -1
    803                 padding = None
     804                padding_size = 0
    804805                #add any raw packets back into it:
    805806                if raw_packets:
    806807                    for index,raw_data in raw_packets.items():