def parse_encoded_extended_cell(cell_bytes: bytes) -> Cell: cell_tuple = Parser.parse_basic_cell(cell_bytes) relay_cell_payload_tuple = Parser.parse_encoded_relay_cell(cell_bytes) part_fmt_str1 = '=H' part_tuple1 = unpack(part_fmt_str1, relay_cell_payload_tuple[5][0:2]) fmt_str = '=H' + str(part_tuple1[0]) + 's' relay_extended_payload_tuple = unpack(fmt_str, relay_cell_payload_tuple[5][0:2+part_tuple1[0]]) h_data_fmt_str = '='+str(CC.DH_LEN)+'s'+str(CC.HASH_LEN)+'s' h_data_tuple = unpack(h_data_fmt_str, relay_extended_payload_tuple[1]) server_h_data = TapSHData(h_data_tuple[0], h_data_tuple[1]) relay_extended_payload = RelayExtendedPayload(relay_extended_payload_tuple[0], server_h_data) relay_cell_payload = RelayCellPayload(relay_cell_payload_tuple[0], relay_cell_payload_tuple[1], relay_cell_payload_tuple[2], relay_cell_payload_tuple[3], relay_cell_payload_tuple[4], relay_extended_payload) extended_cell = Cell(cell_tuple[0], cell_tuple[1], cell_tuple[2], relay_cell_payload) return extended_cell
def build_extended_cell(y, gy, streamID: int, circ_id: int, gx: str, recognized) -> Cell: """ The method to build the extended Cell object :param y: :param gy: :param streamID: :param circ_id: :param gx: :param recognized: :return: The Extended Cell """ gxy = CoreCryptoDH.compute_dh_shared_key(y, gx) kdf_dict = CoreCryptoRSA.kdf_tor(gxy) server_h_data = TapSHData(gy, kdf_dict['KH']) # Construct extended2 payload extended_cell_payload_relay = RelayExtendedPayload(RelayExtendedPayload.TAP_S_HANDSHAKE_LEN, server_h_data) # Calculate digest from the extended2 payload payload_dict = { 'HLEN': extended_cell_payload_relay.HLEN, 'HDATA': extended_cell_payload_relay.HDATA } digest = CoreCryptoMisc.calculate_digest(payload_dict) # Construct the Relay cell with extended2 payload which is the payload for the Cell class extended_cell_payload = RelayCellPayload(RelayCellPayload.RELAY_CMD_ENUM['EXTENDED2'], recognized, streamID, digest, Cell.PAYLOAD_LEN - 11, extended_cell_payload_relay) # Construct the actual cell extended_cell = Cell(circ_id, Cell.CMD_ENUM['RELAY'], Cell.PAYLOAD_LEN, extended_cell_payload) return extended_cell
def build_extended_cell_from_created_cell(circ_id: int, hlen, hdata) -> Cell: """ The method to build the Extended Cell from a received Created Cell :param circ_id: The circuit ID :param hlen: The handshake len(from Created Cell) :param hdata: The handshake Data of type TapCHData(from Created Cell) :return: The Extended Cell """ relay_extended_cell_payload = RelayExtendedPayload(hlen, hdata) extended_cell_payload = RelayCellPayload(RelayCellPayload.RELAY_CMD_ENUM['RELAY_EXTENDED2'], 0, 0, b'', Cell.PAYLOAD_LEN - 11, relay_extended_cell_payload) # Construct the actual cell extended_cell = Cell(circ_id, Cell.CMD_ENUM['RELAY'], Cell.PAYLOAD_LEN, extended_cell_payload) return extended_cell