o
    �õ±j"~  ã                   @   s’  d dl Z d dlZd dlZd dlmZmZ d dlmZ d dlm	Z	 d dl
mZ d dlmZ d dlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z) d dl*m+Z+m,Z, d d	l-m.Z.m/Z/m0Z0m1Z1 d d
l2m3Z3m4Z4m5Z5m6Z6 d dl7m8Z8 d dl9m:Z:m;Z;m<Z<m=Z=m>Z> d dl?m@Z@ d dlAmBZB d dlCmDZD d dlEmFZF d dlGmHZH d dlGmIZI G dd„ dƒZJdS )é    N)ÚListÚDict)Úhashlib)Úlogger)ÚCCACHE)ÚKerberosClientSocket)ÚMETHOD_DATAÚ
ETYPE_INFOÚETYPE_INFO2ÚPADATA_TYPEÚPA_PAC_REQUESTÚPA_ENC_TS_ENCÚEncryptedDataÚ	krb5_pvnoÚKDC_REQ_BODYÚAS_REQÚTGS_REPÚ
KDCOptionsÚPrincipalNameÚEncASRepPartÚEncTGSRepPartr   ÚRealmÚChecksumÚ	APOptionsÚAuthenticatorÚTicketÚAP_REQÚTGS_REQÚ	CKSUMTYPEÚPA_FOR_USER_ENCÚPA_PAC_OPTIONSÚPA_PAC_OPTIONSTypesÚEncTicketPart)ÚKerberosErrorCodeÚKerberosError)ÚKeyÚ_enctype_tableÚ_HMACMD5ÚEnctype)Ú
PaDataTypeÚEncryptionTypeÚ	NAME_TYPEÚMESSAGE_TYPE)ÚAuthenticatorChecksum)ÚPKAuthenticatorÚAuthPackÚPA_PK_AS_REPÚKDCDHKeyInfoÚPA_PK_AS_REQ)ÚKerberosCredential)ÚKerberosTarget)ÚKerberosSPN)Úconstruct_apreq_from_tgs_tgt)Úcms)Úcorec                   @   sP  e Zd Zdedefdd„Zg d¢dddddfd	ee d
ede	fdd„Z
g d¢dfd
ede	fdd„Zg d¢dfd
efdd„Zdd„ Zdd„ Zddg d¢ddfded
efdd„Zdefdd„Zd.dd„Zg d¢ejejejejejejejgfd d!„Zdg d"¢ejejejgfd#d$„Zejejejgfd%d&„Zdd'g dfd(d)„Zd*d+„ Zd,d-„ Z dS )/ÚKerbrosClientÚccredÚtargetc                 C   sj   || _ || _t| jƒ| _|jd u rtƒ n|j| _d | _d | _d | _d | _	d | _
d | _d | _d | _d | _d S )N)Ú
credentialr;   r   ÚksocÚccacher   Úkerberos_session_keyÚkerberos_TGTÚkerberos_TGT_encpartÚkerberos_TGSÚkerberos_cipherÚkerberos_cipher_typeÚkerberos_keyÚserver_saltÚpkinit_tkey)Úselfr:   r;   © rI   ú†/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/minikerberos/client.pyÚ__init__   s   
zKerbrosClient.__init__)ÚforwardableÚ	renewableÚ	proxiableNFTÚkdcoptsÚwith_pacÚreturnc                 C   s$  t  d¡ g }|du r$i }	ttdƒƒ|	d< tddiƒ ¡ |	d< | |	¡ t  d|j ¡ tj 	tj
j¡}
|du r�|d u rnt|
jd	d
�|
jdœƒ ¡ }t|j | _|j| _t| jj| jj|| jd�ƒ| _| j | jd|d ¡}n|}
|}i }ttdƒƒ|d< t|j|dœƒ ¡ |d< | |¡ i }tt|ƒƒ|d< ttjj| jj  !d¡dœƒ|d< | jj" #¡ |d< ttjjd| jj" #¡ gdœƒ|d< |
tj$dd� jd	d
�|d< |
tj$dd� jd	d
�|d< t% &d¡|d< |jg|d< |d urø|D ]}|| ||< qïi }t'|d< t(j)j|d< ||d< t*|ƒ|d < t+|ƒS )!Nz'Constructing TGT request with auth dataTúPA-PAC-REQUESTúpadata-typeúinclude-pacúpadata-valuez$Selecting common encryption type: %sFr   ©Úmicrosecond)ÚpatimestampÚpausec)Úsalté   zENC-TIMESTAMP©ÚetypeÚcipherúkdc-optionsú/©z	name-typezname-stringÚcnameÚrealmÚkrbtgtÚsname©ÚdaysÚtillÚrtimeé   Únoncer]   Úpvnoúmsg-typeÚpadataúreq-body),r   ÚdebugÚintr   r   ÚdumpÚappendÚnameÚdatetimeÚnowÚtimezoneÚutcr   ÚreplacerW   r&   ÚvaluerC   rD   r%   Úenctyper<   Úget_key_for_enctyperF   rE   Úencryptr   r   Úsetr   r+   Ú	PRINCIPALÚusernameÚsplitÚdomainÚupperÚ	timedeltaÚsecretsÚrandbitsr   r,   Ú
KRB_AS_REQr   r   )rH   Úsupported_encryption_methodrO   ÚenctimestampÚnewnowÚ
no_preauthÚkdc_req_body_extrarP   ÚpadatasÚ	pa_data_1rv   Ú	timestampÚenc_timestampÚ	pa_data_2Úkdc_req_bodyÚkeyÚkdc_reqrI   rI   rJ   Úbuild_asreq_lts.   sP   


 "zKerbrosClient.build_asreq_lts)rL   rM   zrenewable-okc                 C   s€  ddl m} |jdkrtdƒ‚tj tjj¡}i }tt	|ƒƒ|d< t
tjj| jj d¡dœƒ|d< | jj ¡ |d	< t
tjjd
| jj ¡ gdœƒ|d< |tjdd� jdd�|d< |tjdd� jdd�|d< t d¡|d< |jg|d< t|ƒ}t | ¡ ¡ ¡ }i }	|j|	d< |jdd�|	d< t d¡|	d< ||	d< i }
| jjj|
d< | jjj|
d< d|
d< i }d|d< |  |
¡|d< i }| !|¡|d< | jj "¡ |d< i }t#|	ƒ|d< | $|¡|d< | jjj%|d < t&|ƒ}| jj'| ¡ d!d"�}t(ƒ }||d#< g }|d!u �ri }t)t*d$ƒƒ|d%< t+d&d!iƒ ¡ |d'< | ,|¡ i }t-j.j|d%< | ¡ |d'< | ,|¡ i }d(|d)< d*|d+< ||d,< ||d-< t/|ƒS ).Nr   )Úkeysé   z5RC4 encryption is not supported for certificate auth!r_   r`   ra   rb   rc   rd   re   r[   rf   rV   rh   ri   rj   rk   r]   ÚcusecÚctimeÚ
paChecksumÚpÚgÚqz1.2.840.10046.2.1Ú	algorithmÚ
parametersÚ
public_keyÚpkAuthenticatorÚclientPublicValueÚclientDHNonceT)Úwrap_signedÚsignedAuthPackrR   rS   rT   rU   é   rl   é
   rm   rn   ro   )0Ú
asn1cryptor–   rz   Ú	Exceptionru   rv   rw   rx   r   r~   r   r+   r   r<   r€   r�   r‚   rƒ   ÚSRV_INSTr„   ry   r…   r†   r   r   Úsha1rr   ÚdigestrW   Údhparamsr›   rœ   ÚDomainParametersÚPublicKeyAlgorithmÚget_public_keyr.   ÚPublicKeyInfoÚdh_noncer/   Úsign_authpackr2   rq   r   r   rs   r)   Ú	PK_AS_REQr   )rH   rˆ   rO   rP   r–   rv   Úkdc_req_body_datar’   ÚchecksumÚauthenticatorÚdpÚpkaÚspkiÚauthpackÚsigned_authpackÚpayloadr�   Ú	pa_data_0rŽ   ÚasreqrI   rI   rJ   Úbuild_asreq_pkinitb   sl   
 "



z KerbrosClient.build_asreq_pkinitc                 C   s`   | j jd ur| j|||d�}n| j|||d�}t d¡ | j | ¡ ¡}|j	dkr.t
|dƒ‚|S )N)rP   zSending TGT request to serverÚ	KRB_ERRORzPreauth failed!)r<   ÚcertificaterÀ   r•   r   rp   r=   Úsendrecvrr   rt   r$   )rH   rˆ   rO   rP   ÚreqÚreprI   rI   rJ   Ú
do_preauth­   s   


zKerbrosClient.do_preauthc              
   C   s°   zA| j d u r
tdƒ‚| j  | jj| jj| jj¡\}}}|d ur!|‚|| _|d | _t	|d |d ƒ| _
t|d  | _|d | _W dS  tyW } z
d |fW  Y d }~S d }~ww )NúNo CCACHE file foundúenc-partÚkeytypeÚkeyvalue)TN)r>   r©   Úget_tgtr<   r€   r‚   Úccache_spn_strict_checkr@   rA   r%   r?   r&   rC   rD   )rH   ÚtgtÚ	keystructÚerrÚerI   rI   rJ   Útgt_from_ccacheº   s    
"

€ÿzKerbrosClient.tgt_from_ccachec           	      C   sî   t  ¡ }t |d ¡jD ]K}t|d ƒ}|tjks|tjkrW|tjkr+t |d ¡}n|tjkr7t |d ¡}|jD ]}|d |t|d ƒ< t	 
dt|d ƒj|d f ¡ q:q| j |¡}||vrftdƒ‚|| }|d urr| ¡ }|| _|S )Nze-datarS   rU   rZ   r]   z/Server supports encryption type %s with salt %sz,Preferred enc type not in supported enctypes)ÚcollectionsÚOrderedDictr   ÚloadÚnativer)   r	   r
   r*   r   rp   rt   r<   Úget_preferred_enctyper©   ÚencoderF   )	rH   rÅ   Úsupp_enc_methodsÚ
enc_methodÚ	data_typeÚenc_info_listÚenc_infoÚpreferred_enc_typerZ   rI   rI   rJ   Ú"select_preferred_encryption_methodË   s(   


"€z0KerbrosClient.select_preferred_encryption_methodÚoverride_snamec                 C   s´  |   ¡ \}}|du rdS t d¡ tj tjj¡}i }	tt|ƒƒ|	d< t	t
jj| jj d¡dœƒ|	d< | jj ¡ |	d< |du rQt	t
jjd| jj ¡ gdœƒ|	d	< nt	t
jj| ¡ dœƒ|	d	< |tjd
d� jdd�|	d< |tjd
d� jdd�|	d< t d¡|	d< |du r�| j ¡ |	d< n||	d< i }
|du r©ttdƒƒ|
d< tddiƒ ¡ |
d< i }t|d< tjj|d< t |
ƒdkrÀ|
g|d< t!|	ƒ|d< t"|ƒ}t d| j# $¡  ¡ | j#j%| ¡ dd�}|j&dk�r|j'}|| _(|dksô| jj)du rö|S t*|d  d  | _+|d  d | _,t-| j+j.| j /t0|d  d ƒ¡ƒ| _1n+|j'd! t2j3jk�r't4|ƒ‚|j'}t d"¡ |  5|¡}|  6|¡}t d#¡ |j'}|| _(| jj7du�rl|  8|¡\| _9| _:| _+|j| _,| j;j<| j(| j9dd$� t d%¡ dS |d  d& }| j+ =| j1d'|¡}z	t> ?|¡j'| _9W n6 t@�yº } z)t d(¡ z	tA ?|¡j'| _9W n t@�y¯ } zt Bd)¡ |‚d}~ww W Y d}~nd}~ww t-| j+j.| j9d* d+ ƒ| _:| j;j<| j(| j9dd$� t d%¡ dS ),aJ  
		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
		Nz2Generating initial TGT without authentication datar_   r`   ra   rb   rc   rd   re   r[   rf   r   rV   rh   ri   rj   rk   r]   TrR   rS   rT   rU   rl   rm   rn   ro   zSending initial TGT to %sF)ÚthrowrÁ   rÈ   ú
error-codez1Got reply from server, asikg to provide auth dataz"Got valid TGT response from server)Úoverride_ppzGot valid TGTr^   é   z(EncAsRepPart load failed, is this linux?z+Failed to load decrypted part of the reply!r“   rÊ   )CrÑ   r   rp   ru   rv   rw   rx   r   r~   r   r+   r   rz   r<   r€   r�   r‚   rƒ   rª   Úget_principalnamer„   ry   r…   r†   Úget_supported_enctypesrq   r   r   rr   r   r,   r‡   Úlenr   r   r=   Úget_addr_strrÃ   rt   rÕ   r@   Ú	nopreauthr&   rC   rD   r%   r{   r|   r*   rE   r#   ÚKDC_ERR_PREAUTH_REQUIREDr$   rÞ   rÆ   rÂ   Údecrypt_asrep_certrA   r?   r>   Úadd_tgtÚdecryptr   rÔ   r©   r   Úerror)rH   Úoverride_etypeÚdecrypt_tgtrO   rß   rP   Ú_rÏ   rv   r’   rŽ   r”   rÄ   rÅ   rˆ   Ú
cipherTextÚtemprÐ   rI   rI   rJ   Úget_TGTæ   s”   

 $
&






€þÿ€ý
zKerbrosClient.get_TGTÚspn_userc              
   C   s�   z/| j d u r
tdƒ‚| j  |¡\}}}|d ur|‚t|d |d ƒ}t|ƒj}||d |d fW S  tyG } zd d d |fW  Y d }~S d }~ww )NrÇ   rÉ   rÊ   rÈ   )r>   r©   Úget_tgsr%   r   rÕ   )rH   rô   ÚtgsrÎ   rÏ   r“   rÐ   rI   rI   rJ   Útgs_from_ccacheM  s   

€ÿzKerbrosClient.tgs_from_ccachec                 C   sð  |   |¡\}}}}|du r|||fS | jdu r%|  ¡ \}}|dur%tdƒ‚t d| ¡  ¡ tj tj	j
¡}	i }
ttg d¢ƒƒ|
d< |j ¡ |
d< ttjj| ¡ dœƒ|
d< |	tjd	d
� jdd�|
d< t d¡|
d< |rr||
d< n| jdkr}dg|
d< n| jg|
d< i }t|d< t| jd ƒ|d< | jd |d< |	j|d< |	jdd�|d< |rÇtƒ }d|_d|_i }d|d< | ¡ |d< t |ƒ|d< d|d< | j! "| j#dt$|ƒ %¡ d¡}i }t|d< t&j'j|d < t(tƒ ƒ|d!< t)| jd" ƒ|d"< t*| j|d#œƒ|d$< i }t+j,j|d%< t-|ƒ %¡ |d&< i }t|d< t&j.j|d < |g|d'< t/|
ƒ|d(< t,|ƒ}t d)¡ | j0 1| %¡ ¡}|j2d*k�r>t3|d+ƒ‚t d,¡ |j4}t5 6| j! 7| j#d-|d. d/ ¡¡j4}t8|d0 d1 |d0 d2 ƒ}| j9 :||¡ t d3¡ || _;|||fS )4a…  
		Requests a TGS ticket for the specified user.
		Retruns the TGS ticket, end the decrpyted encTGSRepPart.

		spn_user: KerberosTarget: the service user you want to get TGS for.
		override_etype: None or list of etype values (int) Used mostly for kerberoasting, will override the AP_REQ supported etype values (which is derived from the TGT) to be able to recieve whatever tgs tiecket 
		NzNo TGT found in CCACHE!z$Constructing TGS request for user %s)rL   rM   Úrenewable_okÚcanonicalizer_   rc   ra   re   r[   rf   r   rV   rh   rj   rk   r]   i€ÿÿÿr—   úauthenticator-vnoÚcrealmrb   r˜   r™   s                   i€  Ú	cksumtyper¶   Úcksumz
seq-numberé   rl   rm   ú
ap-optionsÚticketr\   r·   rS   rU   rn   ro   z"Constructing TGS request to serverrÁ   zget_TGS failed!zGot TGS reply, decrypting...é   rÈ   r^   r“   rÉ   rÊ   zGot valid TGS reply)<r÷   r@   rÑ   r©   r   rp   Úget_formatted_pnameru   rv   rw   rx   r   r~   r‚   rƒ   r   r+   rª   rz   rä   r„   ry   r…   r†   rD   r   r   rW   r-   ÚflagsÚchannel_bindingÚto_bytesr   rC   r}   r?   r   rr   r,   Ú
KRB_AP_REQr   r   r   r)   r   r   ÚKRB_TGS_REQr   r=   rÃ   rt   r$   rÕ   r   rÔ   rì   r%   r>   Úadd_tgsrB   )rH   rô   rî   Úis_linuxrö   ÚencTGSRepPartr“   rÏ   rð   rv   r’   Úauthenticator_dataÚacÚchksumÚauthenticator_data_encÚap_reqrŽ   r”   rÄ   rÅ   rI   rI   rJ   Úget_TGS\  s~   









"

zKerbrosClient.get_TGS)rL   rM   rù   zenc-tkt-in-skeyc                 C   sÀ  | j st d¡ |  ¡  | j |¡}tj tjj	¡}i }t
|d< t| j d ƒ|d< | j d |d< |j|d< |jdd�|d< | j | jd	t|ƒ ¡ d ¡}i }t
|d
< tjj|d< ttƒ ƒ|d< t| j d ƒ|d< t| j|dœƒ|d< i }tjj|d< t|ƒ ¡ |d< i }	tt|ƒƒ|	d< tt j!j| jj" #d¡dœƒ|	d< | jj$ %¡ |	d< |tj&dd� jdd�|	d< t' (d¡|	d< dg|	d< t| j d ƒg|	d< i }
t
|
d
< tj)j|
d< |g|
d< t*|	ƒ|
d < t|
ƒ}t d!¡ | j+ ,| ¡ ¡}|j-d"k�rd#}|j.d$ d%k�rd&}t/||ƒ‚t d'¡ |j.}t0t1|d d( d ƒ }|d d( d) }| 2| jd*|¡}t3 4|¡j.}t5 4| j 2| jd+|d( d) ¡¡j.}t6|d, d- |d, d. ƒ}| j7 8||¡ t d/¡ ||||fS )0Nz+[U2U] TGT is not available! Fetching TGT...rú   rû   rb   r˜   r   rV   r™   rþ   rl   rm   rÿ   r   r\   r·   rS   rU   r_   r`   ra   re   rc   r[   rf   rh   rj   rk   r—   r]   úadditional-ticketsrn   ro   z[U2U] Sending request to serverrÁ   z[U2U] failed!rá   é   zc[U2U] Failed to get U2U! Error code (16) indicates that delegation is not enabled for this account!z[U2U] Got reply, decrypting...rÈ   r^   é   r  r“   rÉ   rÊ   z[U2U] Got valid TGS reply)9r@   r   rp   ró   r<   rÖ   ru   rv   rw   rx   r   r   rW   ry   rC   r}   r?   r   rr   r,   r  rz   r   r~   r   r   rD   r)   r   r   r   r   r+   r   r€   r�   r‚   rƒ   r„   r…   r†   r  r   r=   rÃ   rt   rÕ   r$   r&   rq   rì   r"   rÔ   r   r%   r>   r  )rH   rO   rØ   Úsupp_encrv   r  r  r  Úpa_data_authÚkrb_tgs_bodyÚkrb_tgs_reqrÄ   ÚreplyÚemsgrö   r^   Ú	encticketÚdecdataÚ	decticketr
  r“   rI   rI   rJ   ÚU2U¼  sj   

 




"
zKerbrosClient.U2U)rL   rM   rù   c                 C   s®  | j st d¡ |  ¡  | j |¡}d}tj tjj	¡}i }t
|d< t| j d ƒ|d< | j d |d< |j|d< |jdd�|d	< | j | jd
t|ƒ ¡ d¡}	i }
t
|
d< tjj|
d< ttƒ ƒ|
d< t| j d ƒ|
d< t| j|	dœƒ|
d< i }tjj|d< t|
ƒ ¡ |d< tjjj dddd�}||j! "¡ 7 }||j# "¡ 7 }|| "¡ 7 }t d| $¡  ¡ t d| ¡ t% &| jd|¡}t d| $¡  ¡ i }t't(dƒƒ|d< ||d< i }t)tjj| *¡ dœƒ|d< |j#|d < t+|ƒ|d!< ||d"< i }t't,d#ƒƒ|d< t-|ƒ ¡ |d< |du�rt.|t/ƒ�r|g}nt.|t0ƒ�r|}n| *¡ }n| jj! 1d$¡}i }t2t|ƒƒ|d%< t)tj3j|dœƒ|d&< | jj# 4¡ |d'< |tj5d(d)� jdd�|d*< t6 7d+¡|d,< | jj8g|d-< i }t
|d< tj9j|d< ||g|d.< t:|ƒ|d/< t|ƒ}t d0¡ | j; <| ¡ ¡}|j=d1k�r�d2}|j>d3 d4k�r˜d5}t?||ƒ‚t d6¡ |j>}t@ A| j B| jd7|d8 d9 ¡¡j>}tC|d: d; |d: d< ƒ}| jD E||¡ t d=¡ || _F|||fS )>z0
		user_to_impersonate : KerberosTarget class
		z0[S4U2self] TGT is not available! Fetching TGT...ÚKerberosrú   rû   rb   r˜   r   rV   r™   rþ   Nrl   rm   rÿ   r   r\   r·   rS   rU   é   ÚlittleF©Úsignedz[S4U2self] S4UByteArray: %sé   z[S4U2self] chksum_data: %sÚHMAC_MD5rü   r¶   ra   ÚuserNameÚ	userRealmrý   zauth-packagezPA-FOR-USERr`   r_   re   rc   r[   rf   rh   rj   rk   r]   rn   ro   z$[S4U2self] Sending request to serverrÁ   zS4U2self failed!rá   r  zlS4U2self: Failed to get S4U2self! Error code (16) indicates that delegation is not enabled for this account!z#[S4U2self] Got reply, decrypting...r  rÈ   r^   r“   rÉ   rÊ   z[S4U2self] Got valid TGS reply)Gr@   r   rp   ró   r<   rÖ   ru   rv   rw   rx   r   r   rW   ry   rC   r}   r?   r   rr   r,   r  rz   r   r~   r   r   rD   r)   r   r   r+   r   r  r€   r×   r‚   Úhexr'   r¶   rq   r   r   rä   r   r   r   Ú
isinstanceÚstrÚlistr�   r   ÚUNKNOWNrƒ   r„   r…   r†   r{   r  r   r=   rÃ   rt   rÕ   r$   r   rÔ   rì   r%   r>   r  rB   )rH   Úuser_to_impersonaterô   rO   rØ   r  Úauth_package_namerv   r  r  r  r  ÚS4UByteArrayÚchksum_datar  Úpa_for_user_encÚpa_for_userr  r  rÄ   r  r  rö   r
  r“   rI   rI   rJ   ÚS4U2self  s˜   







"

zKerbrosClient.S4U2selfc                 C   sœ  t  dd | ¡ ¡ ¡ tj tjj¡}| j 	|¡}i }t
tdƒƒ|d< tdttdgƒƒiƒ ¡ |d< i }t|d< t| jd	 ƒ|d	< | jd
 |d
< |j|d< |jdd�|d< | j | jdt|ƒ ¡ d ¡}i }	t|	d< tjj|	d< ttƒ ƒ|	d< t| jd ƒ|	d< t| j|dœƒ|	d< i }
t j!j|
d< t"|	ƒ ¡ |
d< i }t#tg d¢ƒƒ|d< t$t%j&j| ¡ dœƒ|d< | jj' (¡ |d< |tj)dd� jdd�|d< t* +d¡|d< | jj,g|d < |g|d!< i }t|d< tj-j|d< |
|g|d"< t.|ƒ|d#< t!|ƒ}| j/ 0| ¡ ¡}|j1d$k�rd%}|j2d& d'k�rd(}t3||ƒ‚t  d)¡ |j2}t4 5| j 6| jd*|d+ d, ¡¡j2}t7|d- d. |d- d/ ƒ}| j8 9||¡ t  d0¡ |||fS )1Nz[S4U2proxy] Impersonating %sr`   zPA-PAC-OPTIONSrS   rz   z%resource-based constrained delegationrU   rú   rû   rb   r˜   r   rV   r™   rþ   rl   rm   rÿ   r   r\   r·   )rL   rM   zconstrained-delegationrù   r_   ra   re   rc   r[   rf   rh   rj   rk   r]   r  rn   ro   rÁ   zS4U2proxy failed!rá   r  znS4U2proxy: Failed to get S4U2proxy! Error code (16) indicates that delegation is not enabled for this account!z+[S4U2proxy] Got server reply, decrypting...r  rÈ   r^   r“   rÉ   rÊ   z[S4U2proxy] Got valid TGS reply):r   rp   Újoinrä   ru   rv   rw   rx   r<   rÖ   rq   r   r    r!   r~   rr   r   r   r@   rW   ry   rC   r}   r?   r   r,   r  rz   r   r   r   rD   r)   r   r   r   r   r+   rª   r‚   rƒ   r„   r…   r†   r{   r  r   r=   rÃ   rt   rÕ   r$   r   rÔ   rì   r%   r>   r  )rH   Ús4uself_ticketrô   rØ   rv   r  Úpa_pac_optsr  r  r  Ú
pa_tgs_reqr  r  rÄ   r  r  rö   r
  r“   rI   rI   rJ   Ú	S4U2proxyx  sb   



"

zKerbrosClient.S4U2proxyr   c              	   C   s   t ||| j||||d�S )N)r  Ú
seq_numberÚap_optsÚcb_data)r6   r@   )rH   rö   r
  Ú
sessionkeyr  r8  r9  r:  rI   rI   rJ   Úconstruct_apreq¾  s   ùzKerbrosClient.construct_apreqc                 C   s    |   |¡\}}}|  |d |¡S )Nr   )r2  r7  )rH   Útarget_userÚservice_spnrö   r
  r“   rI   rI   rJ   ÚgetSTÉ  s   zKerbrosClient.getSTc                 C   sÒ  dd„ }|d D ]}|d dkrt  |d ¡j} nqtdƒ‚ztj |d ¡j}W n   tj |d d	d … ¡j}Y |d
 }|d dkrJtdƒ‚t |d ¡j}td dgdd„ |d D ƒ ¡dƒ}tj	t
 |d ¡ ¡ dd … ddd�}| jj |¡}	|d }
|	| jjj |
 }|d d }t| }|tjkr¡||dƒ| _n|tjkr­||dƒ| _n	|tjkr¶tdƒ‚t|j| jƒ}|d d }| |d |¡}t |¡j}tt|d! d" ƒ }t|j|d! d# ƒ}|||fS )$Nc                 S   s~   d}d}t |ƒ|k r=t t|gƒ|  ¡ ¡ }t |ƒt |ƒ |kr/||d |t |ƒ … 7 }	 |S ||7 }|d7 }t |ƒ|k s
|S )Nó    r   r[   )ræ   r   r«   Úbytesr¬   )rz   ÚkeysizeÚoutputÚ
currentNumÚcurrentDigestrI   rI   rJ   Útruncate_keyÏ  s   ýúz6KerbrosClient.decrypt_asrep_cert.<locals>.truncate_keyrn   rS   r#  rU   zPA_PK_AS_REP not found!ÚdhSignedDataé   Úencap_content_infoÚcontent_typez1.3.6.1.5.2.3.2z%Keyinfo content type unexpected valueÚcontentÚ Ú1c                 S   s   g | ]}t |ƒ‘qS rI   )r)  )Ú.0ÚxrI   rI   rJ   Ú
<listcomp>ì  s    z4KerbrosClient.decrypt_asrep_cert.<locals>.<listcomp>ÚsubjectPublicKeyr  rþ   ÚbigFr!  ÚserverDHNoncerÈ   r]   é    r  zBRC4 key truncation documentation missing. it is different from AESr^   rã   r“   rÉ   rÊ   )r0   rÔ   rÕ   r©   r7   Ú
SignedDatar1   rq   r3  Ú
from_bytesr8   Ú	BitStringrr   r<   r­   Úexchanger²   r&   r(   ÚAES256rG   ÚAES128ÚRC4ÚNotImplementedErrorr%   r{   rì   r   )rH   Úas_reprF  ÚpaÚpkasrepÚsdÚkeyinfoÚauthdataÚpubkeyÚ
shared_keyÚserver_nonceÚfullKeyr]   r^   r“   Úenc_dataÚdec_dataÚencasrepÚsession_keyrI   rI   rJ   rê   Í  sF   þ$&



z KerbrosClient.decrypt_asrep_cert)NF)!Ú__name__Ú
__module__Ú__qualname__r3   r4   rK   r   r)  Úboolr   r•   rÀ   rÆ   rÑ   rÞ   r5   ró   r÷   r  r*   ÚDES_CBC_CRCÚDES_CBC_MD4ÚDES_CBC_MD5ÚDES3_CBC_SHA1ÚARCFOUR_HMAC_MD5ÚAES256_CTS_HMAC_SHA1_96ÚAES128_CTS_HMAC_SHA1_96r  r2  r7  r<  r?  rê   rI   rI   rI   rJ   r9      s     ,4K"g
.` JrFr9   )KrÒ   ru   r…   Útypingr   r   Ú	unicryptor   Úminikerberosr   Úminikerberos.common.ccacher   Ú!minikerberos.network.clientsocketr   Ú"minikerberos.protocol.asn1_structsr   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   Úminikerberos.protocol.errorsr#   r$   Ú minikerberos.protocol.encryptionr%   r&   r'   r(   Úminikerberos.protocol.constantsr)   r*   r+   r,   Ú minikerberos.protocol.structuresr-   Úminikerberos.protocol.rfc4556r.   r/   r0   r1   r2   Úminikerberos.common.credsr3   Úminikerberos.common.targetr4   Úminikerberos.common.spnr5   Ú!minikerberos.protocol.ticketutilsr6   r¨   r7   r8   r9   rI   rI   rI   rJ   Ú<module>   s*    x