def _get_intro_points(self, response, descriptor_cookie): intro_points_raw_base64 = HSDescriptorParser.parse(response) intro_points_raw = b64decode(intro_points_raw_base64) # Check whether it's encrypted if intro_points_raw[0] == AuthType.Basic or intro_points_raw[ 0] == AuthType.Stealth: if not descriptor_cookie: raise Exception( 'Hidden service needs descriptor_cookie for authorization') enc_buff = EncPointsBuffer(intro_points_raw) intro_points_raw = enc_buff.decrypt(descriptor_cookie) elif descriptor_cookie: logger.warning( "Descriptor cookie was specified but hidden service hasn't encrypted intro points" ) if not intro_points_raw.startswith(b'introduction-point '): raise Exception('Unknown introduction point data received') intro_points_raw = intro_points_raw.decode() intro_points_info_list = IntroPointParser.parse(intro_points_raw) for intro_point_info in intro_points_info_list: router = self._info_to_router(intro_point_info) yield IntroductionPoint(router, self._circuit)
def parse(data): m = __class__.regex.search(data) if m: return {k: b64decode(v) for k, v in m.groupdict().items()} else: logger.debug("Can't parse router descriptor: %r", data) raise Exception("Can't parse router descriptor")
def _read_ml(self, lines): line = next(lines) if line != self._ml_start_line: raise Exception(f'Begin line for {self.keyword} not found') ml = '' for line in lines: if line == self._ml_end_line: break ml += line return b64decode(ml)
def __init__(self, nickname, fingerprint, ip, or_port, dir_port, flags, version=None, digest=None, **kwargs): self._nickname = nickname if type(fingerprint) is not bytes: fingerprint = b64decode(fingerprint) self._fingerprint = fingerprint self._digest = b64decode(digest) if digest else None self._ip = ip self._or_port = or_port self._dir_port = dir_port self._version = version self._flags = flags self._consensus = None self._service_key = None
def __init__(self, onion_address, descriptor_cookie=None, auth_type=AuthType.No): self._onion_address, self._permanent_id, onion_identity_pk = self.parse_onion( onion_address) self._onion_identity_pk = curve25519_public_from_bytes( onion_identity_pk) if onion_identity_pk else None if self._onion_identity_pk: raise Exception('v3 onion hidden service not supported yet') self._descriptor_cookie = b64decode( descriptor_cookie) if descriptor_cookie else None self._auth_type = auth_type if descriptor_cookie and auth_type == AuthType.No: raise RuntimeError('You must specify auth type') if not descriptor_cookie and auth_type != AuthType.No: raise RuntimeError('You must specify descriptor cookie')
def _decode(d): for k in ('onion_key', 'service_key'): d[k] = b64decode(d[k]) return d