o
    àý°jèy  ã                   @   sÚ  d dl mZ d dl mZ d dlmZmZ d dlZd dlmZmZm	Z	 d dl
mZm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mZ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$ d dl%m&Z& d dl'm(Z( ze) W n e*y�   e+Z)Y nw dZ,G dd„ deƒZ-G dd„ deƒZ.G dd„ deƒZ/G dd„ deƒZ0G dd„ deƒZ1G dd„ deƒZ2G dd„ deƒZ3G dd„ deƒZ4G d d!„ d!ƒZ5G d"d#„ d#ƒZ6G d$d%„ d%ƒZ7e8d&krëe7 9e :d'¡¡Z;e; <¡  dS dS )(é    )Údivision)Úprint_function)ÚdatetimeÚtimezoneN)ÚpackÚunpackÚcalcsize)ÚbÚPY2)ÚdecoderÚencoder)ÚnoValue©Úhexlify)Ú	Structure)ÚcryptoÚ	constantsÚtypes)
ÚAS_REPÚseq_setÚTGS_REPÚEncTGSRepPartÚEncASRepPartÚTicketÚKRB_CREDÚEncKrbCredPartÚKrbCredInfoÚseq_set_iter)ÚKerberosTime)ÚLOGé   c                   @   ó   e Zd ZdZdS )ÚHeader))Útagú!H=0)Útaglenr$   )Ú_tagdataz	_-tagdatazself["taglen"])Útagdataú:N©Ú__name__Ú
__module__Ú__qualname__Ú	structure© r.   r.   ú‡/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/impacket/krb5/ccache.pyr"   .   ó    r"   c                   @   r!   )Ú	DeltaTime))Útime_offsetú!L=0)Úusec_offsetr3   Nr)   r.   r.   r.   r/   r1   6   r0   r1   c                   @   ó   e Zd ZdZddd„ZdS )ÚCountedOctetString))Úlengthr3   )Ú_dataz_-datazself["length"])Údatar(   Ú c                 C   s   d|t | d ƒf S )Nú%s%sr9   r   ©ÚselfÚindentr.   r.   r/   ÚprettyPrintC   s   zCountedOctetString.prettyPrintN©r:   ©r*   r+   r,   r-   r?   r.   r.   r.   r/   r6   <   ó    r6   c                   @   ó   e Zd ZdZdd„ ZdS )Ú
KeyBlockV3)©Úkeytyper$   ©Úetyper$   )Úetype2r$   ©Úkeylenr$   ©Ú	_keyvaluez
_-keyvaluezself["keylen"]©Úkeyvaluer(   c                 C   ó   d| d t | d ƒf S ©NzKey: (0x%x)%srF   rO   r   ©r=   r.   r.   r/   r?   Q   ó   zKeyBlockV3.prettyPrintNrA   r.   r.   r.   r/   rD   G   s    	rD   c                   @   rC   )Ú
KeyBlockV4)rE   rG   rJ   rL   rN   c                 C   rP   rQ   r   rR   r.   r.   r/   r?   ^   rS   zKeyBlockV4.prettyPrintNrA   r.   r.   r.   r/   rT   U   s    rT   c                   @   r5   )ÚTimes))Úauthtimer3   )Ú	starttimer3   )Úendtimer3   )Ú
renew_tillr3   r:   c                 C   s|   t d|t | d ¡ ¡ f ƒ t d|t | d ¡ ¡ f ƒ t d|t | d ¡ ¡ f ƒ t d|t | d ¡ ¡ f ƒ d S )	Nz%sAuth : %srV   z%sStart: %srW   z%sEnd  : %srX   z%sRenew: %srY   )Úprintr   ÚfromtimestampÚ	isoformatr<   r.   r.   r/   r?   h   s   "zTimes.prettyPrintNr@   rA   r.   r.   r.   r/   rU   a   rB   rU   c                   @   ó   e Zd ZdddeffZdS )ÚAddress)Úaddrtyper$   Úaddrdatar(   N©r*   r+   r,   r6   r-   r.   r.   r.   r/   r^   n   ó    þr^   c                   @   r]   )ÚAuthData)Úauthtyper$   Úauthdatar(   Nra   r.   r.   r.   r/   rc   t   rb   rc   c                   @   sV   e Zd ZG dd„ deƒZddd„Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ ZdS )Ú	Principalc                   @   r!   )zPrincipal.PrincipalHeader))Ú	name_typer3   )Únum_componentsr3   Nr)   r.   r.   r.   r/   ÚPrincipalHeader{   r0   ri   Nc                 C   sž   g | _ d | _|d urH|  |¡| _|t| jƒd … }t|ƒ| _|t| jƒd … }g | _ t| jd ƒD ]}t|ƒ}|t|ƒd … }| j  |¡ q1d S |  ¡ | _d S )Nrh   )Ú
componentsÚrealmri   ÚheaderÚlenr6   ÚrangeÚappend)r=   r9   Ú	componentÚcompr.   r.   r/   Ú__init__�   s   
ýzPrincipal.__init__c                 C   s0   t | jƒt | jƒ }| jD ]}|t |ƒ7 }q|S ©N)rm   rl   rk   rj   ©r=   ÚtotalLenÚir.   r.   r/   Ú__len__‘   ó   
zPrincipal.__len__c                 C   s0   | j  ¡ | j ¡  }| jD ]}|| ¡ 7 }q|S rs   )rl   ÚgetDatark   rj   )r=   r9   rp   r.   r.   r/   ry   —   rx   zPrincipal.getDatac                 C   ó   |   ¡ S rs   ©ry   rR   r.   r.   r/   Ú__str__�   ó   zPrincipal.__str__c                 C   sŠ   d}| j D ]}t|d tƒdurt|d ƒ}n|d }||d 7 }q|d d… }t| jd tƒr6| jd }nt| jd ƒ}|d| 7 }|S )Nó    r9   Tó   /éÿÿÿÿó   @)rj   Ú
isinstanceÚbytesr	   rk   )r=   Ú	principalrp   rk   r.   r.   r/   r?       s   
zPrincipal.prettyPrintc                 C   s|   |j | jd< t|jƒ| jd< tƒ }t|jƒ|d< |j|d< || _g | _|jD ]}tƒ }t|ƒ|d< ||d< | j |¡ q&d S )Nrg   rh   r7   r9   )Útyperl   rm   rj   r6   rk   ro   )r=   r„   ÚoctetStringÚcr.   r.   r/   ÚfromPrincipal±   s   

üzPrincipal.fromPrincipalc                 C   s   t j|  ¡ | jd d�S )Nrg   ©r…   )r   rf   r?   rl   rR   r.   r.   r/   ÚtoPrincipal¿   rS   zPrincipal.toPrincipalrs   )r*   r+   r,   r   ri   rr   rw   ry   r|   r?   rˆ   rŠ   r.   r.   r.   r/   rf   z   s    
rf   c                   @   sŠ   e Zd ZG dd„ deƒZG dd„ deƒZddd„Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zddd„Zdd„ Zddd„ZdS ) Ú
Credentialc                   @   ó6   e Zd ZddefddefddefddefdddfZd	S )
zCredential.CredentialHeaderV3Úclientr(   ÚserverÚkeyÚtime©Úis_skeyzB=0©Útktflagsr3   ©Únum_addressr3   N)r*   r+   r,   rf   rD   rU   r-   r.   r.   r.   r/   ÚCredentialHeaderV3Ã   ó    ùr—   c                   @   rŒ   )
zCredential.CredentialHeaderV4r�   r(   rŽ   r�   r�   r‘   r“   r•   N)r*   r+   r,   rf   rT   rU   r-   r.   r.   r.   r/   ÚCredentialHeaderV4Î   r˜   r™   Nc                 C   s:  d| _ d| _d | _d | _d | _|d ur–|dkr|  |¡| _n|  |¡| _|t| jƒd … }g | _ t| jd ƒD ]}t	|ƒ}|t|ƒd … }| j  
|¡ q7td|d d… ƒd }|tdƒd … }t|ƒD ]}t|ƒ}|t|ƒd … }| j 
|¡ qct|ƒ| _|t| jƒd … }t|ƒ| _|t| jƒd … }d S |  ¡ | _d S )Nr.   é   r–   ú!Lé   r   )Ú	addressesÚauthDatarl   ÚticketÚsecondTicketr—   r™   rm   rn   r^   ro   r   r   rc   r6   )r=   r9   Úccache_versionÚaddressÚadÚnum_authdatare   r.   r.   r/   rr   Ù   s4   

zCredential.__init__c                 C   s
   | j | S rs   ©rl   )r=   r�   r.   r.   r/   Ú__getitem__ù   s   
zCredential.__getitem__c                 C   s   || j |< d S rs   r¥   )r=   ÚitemÚvaluer.   r.   r/   Ú__setitem__ü   ó   zCredential.__setitem__c                 C   s   | j d  ¡ S )NrŽ   )rl   r?   rR   r.   r.   r/   ÚgetServerPrincipalÿ   rª   zCredential.getServerPrincipalc                 C   sf   t | jƒ}| jD ]}|t |ƒ7 }q|tdƒ7 }| jD ]}|t |ƒ7 }q|t | jƒ7 }|t | jƒ7 }|S ©Nr›   )rm   rl   r�   r   rž   rŸ   r    rt   r.   r.   r/   rw     s   


zCredential.__len__c                 C   s   | j  ¡  d S rs   )rl   ÚdumprR   r.   r.   r/   r­     rª   zCredential.dumpc                 C   sn   | j  ¡ }| jD ]}|| ¡ 7 }q|tdt| jƒƒ7 }| jD ]}|| ¡ 7 }q|| j ¡ 7 }|| j ¡ 7 }|S r¬   )rl   ry   r�   r   rm   rž   rŸ   r    )r=   r9   rv   r.   r.   r/   ry     s   


zCredential.getDatac                 C   rz   rs   r{   rR   r.   r.   r/   r|     r}   zCredential.__str__r:   c                 C   s  t d|| jd  ¡ f ƒ t d|| jd  ¡ f ƒ t d|| jd  ¡ f ƒ t d| ƒ | jd  d	¡ t d
|| jd f ƒ t d|| jd f ƒ t d|| jd f ƒ | jD ]}| d	¡ qYt d|t| jƒf ƒ | jD ]}| d	¡ qot d|| j ¡ f ƒ t d|| j ¡ f ƒ d S )Nz%sClient: %sr�   z%sServer: %srŽ   r;   r�   z	%sTimes: r�   z		z%sSubKey: %sr’   z%sFlags: 0x%xr”   z%sAddresses: %dr–   z%sAuth Data: %dz%sTicket: %sz%sSecond Ticket: %s)rZ   rl   r?   r�   rm   rž   rŸ   r    )r=   r>   r¢   r£   r.   r.   r/   r?     s   

zCredential.prettyPrintc                 C   sÜ   t ƒ }d|d< ttjj jƒ|d< | d jd |d< t|d< d|d d	< d
|d d< t|d| d  ¡ j	ƒ t
 ¡ }| | jd ¡ t|d|jƒ tj| d d  ƒ }tƒ }t |¡|d< ||d< t |j| d d ¡|d< |S )Né   Úpvnoúmsg-typerŽ   r9   Úcrealmúenc-partr    rH   r:   ÚcipherÚcnamer�   rŸ   r�   rF   ÚKDC_REPrO   Ú
sessionKey)r   Úintr   ÚApplicationTagNumbersr¨   rk   r   r   rŠ   Úcomponents_to_asn1r   r   Ú	from_asn1rŸ   Úto_asn1r   Ú_enctype_tableÚdictr   ÚencodeÚKeyÚenctype)r=   Útgt_reprŸ   r³   Útgtr.   r.   r/   ÚtoTGT/  s"   zCredential.toTGTc                 C   s&  t ƒ }d|d< ttjj jƒ|d< | d jd |d< t|d< d|d d	< d
|d d< t|d| d  ¡ j	ƒ t
 ¡ }| | jd ¡ |d ure| ¡ t|jƒ ¡ kret d|j|f ¡ t
j|t|jjƒd�|_t|d|jƒ tj| d d  ƒ }tƒ }t |¡|d< ||d< t |j| d d ¡|d< |S )Nr®   r¯   r°   rŽ   r9   r±   r²   r    rH   r:   r³   r´   r�   z4Changing sname from %s to %s and hoping for the bestr‰   rŸ   r�   rF   rµ   rO   r¶   )r   r·   r   r¸   r¨   rk   r   r   rŠ   r¹   r   r   rº   rŸ   ÚupperÚstrÚservice_principalr   Údebugrf   r…   r»   r   r¼   r½   r   r¾   r¿   rÀ   )r=   ÚnewSPNÚtgs_reprŸ   r³   Útgsr.   r.   r/   ÚtoTGSF  s*   zCredential.toTGS)NNr@   rs   )r*   r+   r,   r   r—   r™   rr   r¦   r©   r«   rw   r­   ry   r|   r?   rÃ   rË   r.   r.   r.   r/   r‹   Â   s    
 
r‹   c                   @   sº   e Zd ZG dd„ deƒZd(dd„Zdd„ Zd)d	d
„Zedddƒfdd„Z	dd„ Z
dd„ Zdd„ Zedd„ ƒZdd„ Zed*dd„ƒZdd„ Zedd„ ƒZd d!„ Zd"d#„ Zd$d%„ Zd&d'„ ZdS )+ÚCCachec                   @   r!   )zCCache.MiniHeader))Úfile_format_versionz	!H=0x0504)Ú	headerlenz!H=12Nr)   r.   r.   r.   r/   Ú
MiniHeadere  r0   rÏ   Nc                 C   s`  d | _ d | _g | _d | _|d ur¬trtd|d ƒd }n|d }|dks(|dkr,tdƒ‚|dkrg|  |¡}|t| 	¡ ƒd … }|d }g | _ |dkrft
|ƒ}| j  |¡ |t|ƒ8 }|t|ƒd … }|dksJn|dd … }t|ƒ| _|t| jƒd … }g | _t|ƒdkr®t||ƒ}|d  ¡  d	¡dk rš| j |¡ |t| 	¡ ƒd … }t|ƒdks„d S d S d S )
Nz>Br    r   é   zNot Implemented!rœ   rÎ   rŽ   s   krb5_ccache_conf_data)Úheadersr„   ÚcredentialsÚ
miniHeaderr
   r   ÚNotImplementedErrorrÏ   rm   ry   r"   ro   rf   r‹   r?   Úfind)r=   r9   r¡   rÓ   Ú	headerLenrl   Úcredr.   r.   r/   rr   k  sD   
ü€

üÞ"zCCache.__init__c                 C   sN   |   ¡  ¡ }| jD ]}|| ¡ 7 }q	|| j ¡ 7 }| jD ]}|| ¡ 7 }q|S rs   )rÏ   ry   rÑ   r„   rÒ   )r=   r9   rl   Ú
credentialr.   r.   r/   ry   ™  s   

zCCache.getDataTc                 C   sŽ  | j D ]O}|d  ¡  ¡ t| ¡ ƒks>|d  ¡  ¡  d¡d t| ¡ ƒks>|d  ¡  ¡  d¡d t| ¡  d¡d ƒkrRt d|d  ¡  ¡  d¡ ¡ |  S qt d| ¡  ¡ |du �rEt d	¡ | j D ]Û}|d  ¡  d
¡dkrß|d  ¡  ¡  d
¡d  d¡d  d¡d d |d  ¡  ¡  d
¡d  d¡d  }d| ¡  d¡d  d¡d  d¡d | ¡  d¡d  d¡d f }|t|ƒkrÞt d|d  ¡  ¡  d¡ ¡ |  S qi|d  ¡  ¡  d¡d  d¡d d |d  ¡  ¡  d¡d  }| ¡  d¡d  d¡d  d¡d  d¡d › d| ¡  d¡d  d¡d › �}|t|ƒk�rDt d|d  ¡  ¡  d¡ ¡ |  S qid S )NrŽ   r�   r   ú@z"Returning cached credential for %súutf-8zSPN %s not found in cacheTz0AnySPN is True, looking for another suitable SPNr   r    ó   :ú%s@%sú/r(   Ú.z$@)	rÒ   r?   rÄ   r	   Úsplitr   rÇ   ÚdecoderÕ   )r=   rŽ   ÚanySPNr‡   Ú	cachedSPNÚ	searchSPNr.   r.   r/   ÚgetCredential¢  s4   
B0 þ


V&ÿ þBR þzCCache.getCredentiali²  r    c                 C   s.   || }t |j|j|jd d  d  d ƒS )Né   i  i@B g    €„.A)r·   ÚmicrosecondsÚsecondsÚdays)r=   ÚdtÚepochÚtdr.   r.   r/   ÚtoTimeStampÁ  s   &zCCache.toTimeStampc                 C   sR   t |tƒr| dd¡ dd¡}n
d dd„ |D ƒ¡}| dd¡d d… }t|dƒS )	Nú'r:   ÚBc                 s   s   � | ]}t |ƒV  qd S rs   )rÅ   )Ú.0Úbitr.   r.   r/   Ú	<genexpr>Ì  s   € z&CCache.reverseFlags.<locals>.<genexpr>é    Ú0rÐ   )r‚   rÅ   ÚreplaceÚjoinÚljustr·   )r=   ÚflagsÚbit_strr.   r.   r/   ÚreverseFlagsÆ  s
   

zCCache.reverseFlagsc                 C   sZ  g | _ tƒ }d|d< d|d< d|d< | j  |¡ tj|tƒ d�d }t ¡ }| |d	d
¡ tƒ | _	| j	 
|¡ |d d }tj|d d  }| |d|¡}	tj|	tƒ d�d }
tƒ }t ¡ }| |
dd¡ tƒ }| 
|¡ | j	|d< ||d< d|d< tƒ |d< t|
d d ƒ|d d< |
d d  ¡ |d d< t|d d ƒ|d d< tƒ |d< |  tj |
d ¡¡|d d< |  tj |
d ¡¡|d d< |  tj |
d ¡¡|d d< |
d  ¡ rê|  tj |
d ¡¡|d d< |  |
d ¡}||d< d|d < tƒ |_t |d! jtjd"d#�¡|jd$< t|jd$ ƒ|jd%< tƒ |_ d&|j d$< d|j d%< | j! |¡ d S )'Nr    r#   é   r%   ó   ÿÿÿÿ    r'   ©Úasn1Specr   r±   r´   r²   r³   rH   rš   ÚsrealmÚsnamer�   rŽ   r’   r�   rF   rO   rK   r�   rV   rW   rX   ú
renew-tillrY   r÷   r”   r–   rŸ   T©ÚtagSetÚcloneValueFlagr9   r7   r~   )"rÑ   r"   ro   r   rà   r   r   rf   rº   r„   rˆ   r   r¼   Údecryptr   r‹   rT   r·   ÚasOctetsrm   rU   rì   r   ÚhasValuerù   r6   rŸ   r   r¾   Úcloner   r  r    rÒ   )r=   rÂ   ÚoldSessionKeyr¶   rl   Ú
decodedTGTÚtmpPrincipalÚ
cipherTextr³   Ú	plainTextÚencASRepPartrØ   rŽ   Ú	tmpServerr÷   r.   r.   r/   ÚfromTGTÔ  sV   



 

zCCache.fromTGTc                 C   sZ  g | _ tƒ }d|d< d|d< d|d< | j  |¡ tj|tƒ d�d }t ¡ }| |d	d
¡ tƒ | _	| j	 
|¡ |d d }tj|d d  }| |d|¡}	tj|	tƒ d�d }
tƒ }t ¡ }| |
dd¡ tƒ }| 
|¡ | j	|d< ||d< d|d< tƒ |d< t|
d d ƒ|d d< |
d d  ¡ |d d< t|d d ƒ|d d< tƒ |d< |  tj |
d ¡¡|d d< |  tj |
d ¡¡|d d< |  tj |
d ¡¡|d d< |
d  ¡ rê|  tj |
d ¡¡|d d< |  |
d ¡}||d< d|d< tƒ |_t |d  jtjd!d"�¡|jd#< t|jd# ƒ|jd$< tƒ |_ d%|j d#< d|j d$< | j! |¡ d S )&Nr    r#   rú   r%   rû   r'   rü   r   r±   r´   r²   r³   rH   rþ   rÿ   r�   rŽ   r’   r�   rF   rO   rK   r�   rV   rW   rX   r   rY   r÷   r”   r–   rŸ   Tr  r9   r7   r~   )"rÑ   r"   ro   r   rà   r   r   rf   rº   r„   rˆ   r   r¼   r  r   r‹   rT   r·   r  rm   rU   rì   r   r  rù   r6   rŸ   r   r¾   r  r   r  r    rÒ   )r=   rÊ   r  r¶   rl   Ú
decodedTGSr
  r  r³   r  ÚencTGSRepPartrØ   rŽ   r  r÷   r.   r.   r/   ÚfromTGS  sV   



 

zCCache.fromTGSc              
   C   sb   |d u rt  d¡ t  d¡ d S zt|dƒ}| ¡ }| ¡  | |ƒW S  ty0 } z|‚d }~ww )Nz%CCache file is not found. Skipping...zWThe specified path is not correct or the KRB5CCNAME environment variable is not definedÚrb)r   ÚcriticalrÇ   ÚopenÚreadÚcloseÚFileNotFoundError)ÚclsÚfileNameÚfr9   Úer.   r.   r/   ÚloadFileP  s   



€ÿzCCache.loadFilec                 C   ó$   t |dƒ}| |  ¡ ¡ | ¡  d S ©Nzwb+)r  Úwritery   r  ©r=   r  r  r.   r.   r/   ÚsaveFile_  ó   
zCCache.saveFiler:   c           	      C   sx  |   t d¡¡}|du r||ddfS t dt d¡ ¡ |dkr0|jjd  d¡}t d| ¡ d}|dkrEd| ¡ | ¡ f }| 	|¡}d}d}|du rpd	| ¡ | ¡ f }| 	|¡}|durjt d
¡ | 
¡ }nt d¡ n
t d¡ | |¡}|dkr˜|dur˜|d  ¡  d¡d  d¡}t d| ¡ n|dkr¶t|jjƒdkr¶|jjd d  d¡}t d| ¡ ||||fS )a2  
        parses the CCache file specified in the KRB5CCNAME environment variable

        :param domain: an optional domain name of a user
        :param username: an optional username of a user
        :param target: an optional SPN of a target system

        :return: domain, username, TGT, TGS
        Ú
KRB5CCNAMENzUsing Kerberos Cache: %sr:   r9   rÚ   z Domain retrieved from CCache: %srÜ   zkrbtgt/%s@%szUsing TGT from cachez#No valid credentials found in cachezUsing TGS from cacher�   r�   r   z"Username retrieved from CCache: %s)r  ÚosÚgetenvr   rÇ   r„   rk   rà   rÄ   rä   rÃ   rË   r?   rß   rm   rj   )	r  ÚdomainÚusernameÚtargetÚccacheÚcredsr„   ÚTGTÚTGSr.   r.   r/   Ú	parseFiled  s:   





zCCache.parseFilec                 C   sH   t d| j ¡  ƒ t dƒ t| jƒD ]\}}t d| ƒ | d¡ qd S )NzPrimary Principal: %szCredentials: z[%d]ú	)rZ   r„   r?   Ú	enumeraterÒ   )r=   rv   rØ   r.   r.   r/   r?   –  s   þzCCache.prettyPrintc                 C   s.   t |dƒ}| ¡ }| ¡  | ƒ }| |¡ |S )Nr  )r  r  r  ÚfromKRBCRED)r  r  r  r9   r*  r.   r.   r/   ÚloadKirbiFile�  s   

zCCache.loadKirbiFilec                 C   r  r  )r  r   Ú	toKRBCREDr  r!  r.   r.   r/   ÚsaveKirbiFile¦  r#  zCCache.saveKirbiFilec                 C   s0  t j|tƒ d�d }t j|d d tƒ d�d }|  ¡  t|d ƒD ]ó\}}t ¡ }| |dd¡ tƒ }| 	|¡ |dkr@|| _
tƒ }t ¡ }	|	 |dd	¡ tƒ }
|
 	|	¡ ||d
< |
|d< d|d< tƒ |d< t|d d ƒ|d d< |d d  ¡ |d d< t|d d ƒ|d d< tƒ |d< |  tj |d ¡¡|d d< |  tj |d ¡¡|d d< |  tj |d ¡¡|d d< |d  ¡ rÒ|  tj |d ¡¡|d d< |  |d ¡}||d< d|d< tƒ |_t |d | jtjdd�¡|jd< t|jd ƒ|jd< tƒ |_d|jd< d|jd< | j |¡ q"d S ) Nrü   r   r²   r³   úticket-infoÚprealmÚpnamerþ   rÿ   r�   rŽ   r’   r�   rF   rO   rK   r�   rW   rV   rX   r   rY   r÷   r”   r–   ÚticketsTr  r9   r7   r~   )r   rà   r   r   ÚsetDefaultHeaderr0  r   rf   rº   rˆ   r„   r‹   rT   r·   r  rm   rU   rì   r   r  rù   r6   rŸ   r   r¾   r  r   r  r    rÒ   ro   )r=   ÚencodedKrbCredÚkrbCredÚencKrbCredPartrv   ÚkrbCredInfor
  r„   rØ   rŽ   r  r÷   r.   r.   r/   r1  «  sj   ÿþ



ÿÿÿÿ
ÿ

ÊzCCache.fromKRBCREDc           
      C   s  | j }g }g }| jD ]Ï}tƒ }t|d< |d d |d d< |d d |d d< |d jjd |d< t|d< |d jd |d d	< t|d d
tdd„ |d j	D ƒƒƒ t
|d ƒd›|d< t tj|d d tjd�¡|d< t tj|d d tjd�¡|d< |d d dkr—t tj|d d tjd�¡|d< |d jjd |d< t|d< |d jd |d d	< t|d d
tdd„ |d j	D ƒƒƒ | |¡ tj|jd tƒ d�d }| |¡ q
tƒ }t|d|ƒ tƒ }d|d< d|d < t|d!< d|d! d"< t |¡|d! d#< t|d$|ƒ t |¡}	|	S )%Nr�   rF   rO   r�   r9   r6  r7  rg   z	name-typezname-stringc                 s   ó   � | ]}|j d  V  qdS ©r9   N©Úfields©rï   r‡   r.   r.   r/   rñ      ó   € z#CCache.toKRBCRED.<locals>.<genexpr>r”   Ú032br÷   r�   rW   )ÚtzrX   rY   r   r   rŽ   rþ   rÿ   c                 s   r>  r?  r@  rB  r.   r.   r/   rñ     rC  rü   r5  r®   r¯   é   r°   r²   rH   r³   r8  )r„   rÒ   r   r   rk   rA  rl   r   Útuplerj   r·   r   r»   r   r[   r   Úutcro   r   rà   rŸ   r   r   r   r   r¾   )
r=   r„   ÚkrbCredInfosr8  rØ   r=  rŸ   r<  r;  r:  r.   r.   r/   r3  ì  sf   
ýÿÿÿÿý

zCCache.toKRBCREDc                 C   s4   g | _ tƒ }d|d< d|d< d|d< | j  |¡ d S )Nr    r#   rú   r%   rû   r'   )rÑ   r"   ro   )r=   rl   r.   r.   r/   r9  3  s   zCCache.setDefaultHeaderrs   )T)r:   r:   r:   )r*   r+   r,   r   rÏ   rr   ry   rä   r   rì   rù   r  r  Úclassmethodr  r"  r.  r?   r2  r4  r1  r3  r9  r.   r.   r.   r/   rÌ   b  s*    
.
	=?
1
AGrÌ   Ú__main__r$  )=Ú
__future__r   r   r   r   r%  Ústructr   r   r   Úsixr	   r
   Úpyasn1.codec.derr   r   Úpyasn1.type.univr   Úbinasciir   Úimpacket.structurer   Úimpacket.krb5r   r   r   Úimpacket.krb5.asn1r   r   r   r   r   r   r   r   r   r   Úimpacket.krb5.typesr   Úimpacketr   r  Ú	NameErrorÚIOErrorÚ
DELTA_TIMEr"   r1   r6   rD   rT   rU   r^   rc   rf   r‹   rÌ   r*   r  r&  r*  r?   r.   r.   r.   r/   Ú<module>   sN   0ÿH !   ]þ