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
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
def _decode_introduction_request(self, placeholder, offset, data): offset, payload = BinaryConversion._decode_introduction_request( self, placeholder, offset, data) if len(data) > offset: if len(data) < offset + 5: raise DropPacket("Insufficient packet size") functions, size = unpack_from('!BH', data, offset) offset += 3 prefix = data[offset] offset += 1 if functions <= 0 or size <= 0 or size % 8 != 0: raise DropPacket("Invalid bloom filter") length = size / 8 if length != len(data) - offset: raise DropPacket( "Invalid number of bytes available (irq) %d, %d, %d" % (length, len(data) - offset, size)) orders_bloom_filter = BloomFilter(data[offset:offset + length], functions, prefix=prefix) offset += length payload.set_orders_bloom_filter(orders_bloom_filter) 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 _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 % 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