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 _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
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
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
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_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
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