docs: def get_TGT(self, override_etype = None, decrypt_tgt = True):
  		"""
  		decrypt_tgt: used for asreproast attacks
  		Steps performed:
  			1. Send and empty (no encrypted timestamp) AS_REQ with all the encryption types we support
  			2. Depending on the response (either error or AS_REP with TGT) we either send another AS_REQ with the encrypted data or return the TGT (or fail miserably)
  			3. PROFIT
  		"""
  		logger.debug('Generating initial TGT without authentication data')
  		now = datetime.datetime.utcnow()
  		kdc_req_body = {}
  		kdc_req_body['kdc-options'] = KDCOptions(set(['forwardable','renewable','proxiable']))
  		kdc_req_body['cname'] = PrincipalName({'name-type': NAME_TYPE.PRINCIPAL.value, 'name-string': [self.usercreds.username]})
  		kdc_req_body['realm'] = self.usercreds.domain.upper()
  		kdc_req_body['sname'] = PrincipalName({'name-type': NAME_TYPE.PRINCIPAL.value, 'name-string': ['krbtgt', self.usercreds.domain.upper()]})
  		kdc_req_body['till'] = now + datetime.timedelta(days=1)
  		kdc_req_body['rtime'] = now + datetime.timedelta(days=1)
  		kdc_req_body['nonce'] = secrets.randbits(31)
  		if override_etype is None:
  			kdc_req_body['etype'] = self.usercreds.get_supported_enctypes()
  		else:
  			kdc_req_body['etype'] = override_etype
  
  		pa_data_1 = {}
  		pa_data_1['padata-type'] = int(PADATA_TYPE('PA-PAC-REQUEST'))
  		pa_data_1['padata-value'] = PA_PAC_REQUEST({'include-pac': True}).dump()
  		
  		kdc_req = {}
  		kdc_req['pvno'] = krb5_pvno
  		kdc_req['msg-type'] = MESSAGE_TYPE.KRB_AS_REQ.value
  		kdc_req['padata'] = [pa_data_1]
  		kdc_req['req-body'] = KDC_REQ_BODY(kdc_req_body)
  		
  		req = AS_REQ(kdc_req)	
  		
  		logger.debug('Sending initial TGT to %s' % self.ksoc.get_addr_str())
  		rep = self.ksoc.sendrecv(req.dump(), throw = False)
  				
  		if rep.name != 'KRB_ERROR':
  			#user can do kerberos auth without preauthentication!
  			self.kerberos_TGT = rep.native
  
  			#if we want to roast the asrep (tgt rep) part then we dont even have the proper keys to decrypt
  			#so we just return, the asrep can be extracted from this object anyhow
  			if decrypt_tgt == False:
  				return
  
  			self.kerberos_cipher = _enctype_table[23]
  			self.kerberos_cipher_type = 23
  			self.kerberos_key = Key(self.kerberos_cipher.enctype, self.usercreds.get_key_for_enctype(EncryptionType.ARCFOUR_HMAC_MD5))
  			
  		else:
  			if rep.native['error-code'] != KerberosErrorCode.KDC_ERR_PREAUTH_REQUIRED.value:
  				raise KerberosError(rep)
  			rep = rep.native
  			logger.debug('Got reply from server, asikg to provide auth data')
  			
  			rep = self.do_preauth(rep)
  			logger.debug('Got valid TGT response from server')
  			rep = rep.native
  			self.kerberos_TGT = rep
  
  
  		cipherText = rep['enc-part']['cipher']
  		temp = self.kerberos_cipher.decrypt(self.kerberos_key, 3, cipherText)
  		self.kerberos_TGT_encpart = EncASRepPart.load(temp).native
  		self.kerberos_session_key = Key(self.kerberos_cipher.enctype, self.kerberos_TGT_encpart['key']['keyvalue'])
  		self.ccache.add_tgt(self.kerberos_TGT, self.kerberos_TGT_encpart, override_pp = True)
  		logger.debug('Got valid TGT')
  		
  		return