def initialize(self): if self.type == 'CDN': return True self.session_key = CryptoUtil.create_session_key() crypted_key = CryptoUtil.rsa_encrypt(self.session_key) url = "http://%s:%s/initsession/" % (self.host, self.port) payload = dict(sessionkey = crypted_key) if self.app_ticket: payload['appticket'] = CryptoUtil.symmetric_encrypt(self.app_ticket, self.session_key) else: payload['anonymoususer'] = 1 payload['steamid'] = self.steamid.steamid r = self.session.post(url, payload) if r.status_code != 200: return False sessionkv = vdf.loads(r.content)['response'] self.csid = sessionkv['csid'] self.session_id = int(sessionkv['sessionid']) & 0xFFFFFFFFFFFFFFFF self.req_counter = int(sessionkv['req-counter']) return True
def channel_encrypt_request(self, msg): message = msg_base.Message(msg_base.MsgHdr, msg_base.ChannelEncryptRequest) message.parse(msg) if message.body.protocol_version != 1: raise ProtocolError('Unexpected channel encryption protocol') if message.body.universe != EUniverse.Public: raise ProtocolError('Unexpected universe in encryption request') session_key = CryptoUtil.create_session_key() crypted_key = CryptoUtil.rsa_encrypt(session_key) key_crc = binascii.crc32(crypted_key) & 0xFFFFFFFF response = msg_base.Message(msg_base.MsgHdr, msg_base.ChannelEncryptResponse, EMsg.ChannelEncryptResponse) response.body.protocol_version = 1 response.body.key_size = len(crypted_key) response.payload = crypted_key + struct.pack('II', key_crc, 0) self.send_message(response) encrypt_result = self.client.wait_for_message(EMsg.ChannelEncryptResult) if encrypt_result.body.result != EResult.OK: raise ProtocolError('Unable to negotiate channel encryption') self.netfilter = NetEncryption(session_key) self.client.handle_connected()