예제 #1
0
    def _decode_introduction_request(self, placeholder, offset, data):
        offset, payload = BinaryConversion._decode_introduction_request(self, placeholder, offset, data)
        
        #if there's still bytes in this request, treat them as taste_bloom_filter
        has_taste = len(data) > offset
        if has_taste:
            if len(data) < offset + 8:
                raise DropPacket("Insufficient packet size")
            
            num_preferences, functions, size = unpack_from('!IBH', data, offset)
            offset += 7

            prefix = data[offset]
            offset += 1

            if not 0 < num_preferences:
                raise DropPacket("Invalid num_preferences value")
            if not 0 < functions:
                raise DropPacket("Invalid functions value")
            if not 0 < size:
                raise DropPacket("Invalid size value")
            if not size % 8 == 0:
                raise DropPacket("Invalid size value, must be a multiple of eight")
    
            length = int(ceil(size / 8))
            if not length == len(data) - offset:
                raise DropPacket("Invalid number of bytes available (irq) %d, %d, %d"%(length, len(data) - offset, size))
    
            taste_bloom_filter = BloomFilter(data[offset:offset + length], functions, prefix=prefix)
            offset += length
        
            payload.set_num_preferences(num_preferences)
            payload.set_taste_bloom_filter(taste_bloom_filter)
            
        return offset, payload
예제 #2
0
    def _encode_introduction_request(self, message):
        data = BinaryConversion._encode_introduction_request(self, message)

        if message.payload.taste_bloom_filter:
            data.extend((pack('!IBH', message.payload.num_preferences,
                              message.payload.taste_bloom_filter.functions,
                              message.payload.taste_bloom_filter.size),
                         message.payload.taste_bloom_filter.prefix,
                         message.payload.taste_bloom_filter.bytes))
        return data
예제 #3
0
    def _encode_introduction_request(self, message):
        data = BinaryConversion._encode_introduction_request(self, message)

        if message.payload.preference_list:
            fmt = '128s'* (len(message.payload.preference_list) + 1)
            if message.payload.key_n:
                str_n = long_to_bytes(message.payload.key_n, 128)
            else:
                str_n = long_to_bytes(-1l, 128)
            str_prefs = [long_to_bytes(preference, 128) for preference in message.payload.preference_list]

            data.append(pack('!'+fmt, str_n, *str_prefs))

        return data
예제 #4
0
    def _decode_introduction_request(self, placeholder, offset, data):
        offset, payload = BinaryConversion._decode_introduction_request(self, placeholder, offset, data)

        #if there's still bytes in this request, treat them as taste_bloom_filter
        has_stuff = len(data) > offset
        if has_stuff:
            length = len(data) - offset
            if length != 20:
                raise DropPacket("Invalid number of bytes available (ir)")

            candidate_mid, = unpack_from('!20s', data, offset)
            payload.set_introduce_me_to(candidate_mid)

            offset += length
        return offset, payload
    def _decode_introduction_request(self, placeholder, offset, data):
        offset, payload = BinaryConversion._decode_introduction_request(
            self, placeholder, offset, data)

        #if there's still bytes in this request, treat them as taste_bloom_filter
        has_stuff = len(data) > offset
        if has_stuff:
            length = len(data) - offset
            if length != 20:
                raise DropPacket("Invalid number of bytes available (ir)")

            candidate_mid, = unpack_from('!20s', data, offset)
            payload.set_introduce_me_to(candidate_mid)

            offset += length
        return offset, payload
    def _encode_introduction_request(self, message):
        data = BinaryConversion._encode_introduction_request(self, message)

        if message.payload.preference_list:
            fmt = '128s' * (len(message.payload.preference_list) + 1)
            if message.payload.key_n:
                str_n = long_to_bytes(message.payload.key_n, 128)
            else:
                str_n = long_to_bytes(-1l, 128)
            str_prefs = [
                long_to_bytes(preference, 128)
                for preference in message.payload.preference_list
            ]

            data.append(pack('!' + fmt, str_n, *str_prefs))

        return data
예제 #7
0
    def _decode_introduction_request(self, placeholder, offset, data):
        offset, payload = BinaryConversion._decode_introduction_request(
            self, placeholder, offset, data)

        # if there's still bytes in this request, treat them as taste_bloom_filter
        has_stuff = len(data) > offset
        if has_stuff:
            if len(data) < offset + 8:
                raise DropPacket("Insufficient packet size")

            num_preferences, functions, size = unpack_from(
                '!IBH', data, offset)
            offset += 7

            prefix = data[offset]
            offset += 1

            if not 0 < num_preferences:
                raise DropPacket("Invalid num_preferences value")
            if not 0 < functions:
                raise DropPacket("Invalid functions value")
            if not 0 < size:
                raise DropPacket("Invalid size value")
            if not size % 8 == 0:
                raise DropPacket(
                    "Invalid size value, must be a multiple of eight")

            length = int(ceil(size / 8))
            if not length == len(data) - offset:
                raise DropPacket(
                    "Invalid number of bytes available (irq) %d, %d, %d" %
                    (length, len(data) - offset, size))

            taste_bloom_filter = BloomFilter(data[offset:offset + length],
                                             functions,
                                             prefix=prefix)
            offset += length

            payload.set_num_preferences(num_preferences)
            payload.set_taste_bloom_filter(taste_bloom_filter)

        return offset, payload
예제 #8
0
    def _decode_introduction_request(self, placeholder, offset, data):
        offset, payload = BinaryConversion._decode_introduction_request(self, placeholder, offset, data)

        #if there's still bytes in this request, treat them as taste_bloom_filter
        has_stuff = len(data) > offset
        if has_stuff:
            length = len(data) - offset
            if length % 128 != 0 or length < 128:
                raise DropPacket("Invalid number of bytes available (ir)")

            hashpack = '128s' * (length/128)
            hashes = unpack_from('!'+hashpack, data, offset)

            str_n = hashes[0]
            payload.set_key_n(bytes_to_long(str_n))

            hashes = [bytes_to_long(hash) for hash in hashes[1:]]
            payload.set_preference_list(hashes)

            offset += length
        return offset, payload
    def _decode_introduction_request(self, placeholder, offset, data):
        offset, payload = BinaryConversion._decode_introduction_request(
            self, placeholder, offset, data)

        #if there's still bytes in this request, treat them as taste_bloom_filter
        has_stuff = len(data) > offset
        if has_stuff:
            length = len(data) - offset
            if length % 128 != 0 or length < 128:
                raise DropPacket("Invalid number of bytes available (ir)")

            hashpack = '128s' * (length / 128)
            hashes = unpack_from('!' + hashpack, data, offset)

            str_n = hashes[0]
            payload.set_key_n(bytes_to_long(str_n))

            hashes = [bytes_to_long(hash) for hash in hashes[1:]]
            payload.set_preference_list(hashes)

            offset += length
        return offset, payload
예제 #10
0
 def _encode_introduction_request(self, message):
     data = BinaryConversion._encode_introduction_request(self, message)
     if message.payload.taste_bloom_filter:
         data.extend((pack('!IBH', message.payload.num_preferences, message.payload.taste_bloom_filter.functions, message.payload.taste_bloom_filter.size), message.payload.taste_bloom_filter.prefix, message.payload.taste_bloom_filter.bytes))
     
     return data
예제 #11
0
    def _encode_introduction_request(self, message):
        data = BinaryConversion._encode_introduction_request(self, message)

        if message.payload.introduce_me_to:
            data.append(pack('!20s', message.payload.introduce_me_to))
        return data
    def _encode_introduction_request(self, message):
        data = BinaryConversion._encode_introduction_request(self, message)

        if message.payload.introduce_me_to:
            data.append(pack('!20s', message.payload.introduce_me_to))
        return data