o
    àý°j«&  ã                   @   sº   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
 d dlmZ d dlmZ G dd	„ d	eƒZG d
d„ deƒZG dd„ deƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZdS )é    )Údatetime)ÚEnum)Úb)ÚpackÚunpackÚcalcsize©Úhexlify)Ú	Structure)ÚLOGc                   @   s(   e Zd ZdZdZdZdZdZdZdZ	dS )	ÚEnctypeé   é   é   é   é   é   é   N)
Ú__name__Ú
__module__Ú__qualname__ÚDES_CRCÚDES_MD4ÚDES_MD5ÚDES3ÚAES128ÚAES256ÚRC4© r   r   ú‡/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/impacket/krb5/keytab.pyr       s    r   c                   @   s   e Zd ZdZdZddd„ZdS )ÚCountedOctetStringzˆ
    Note: This is very similar to the CountedOctetString structure in ccache, except:
      * `length` is uint16 instead of uint32
    ))Úlengthú!H=0)Ú_dataz_-datazself["length"])Údataú:Ú c                 C   s   d|t | d ƒf S )Nz%s%sr$   r   )ÚselfÚindentr   r   r   ÚprettyPrint5   ó   zCountedOctetString.prettyPrintN©r&   )r   r   r   Ú__doc__Ú	structurer)   r   r   r   r   r    *   s    r    c                   @   s2   e Zd ZdddeffZdd„ Zdd„ Zdd	„ Zd
S )ÚKeyBlock)Úkeytyper"   Úkeyvaluer%   c                 C   s(   zt | d ƒjW S    d| d   Y S )Nr/   zUNKNOWN:0x%x)r   Úname©r'   r   r   r   ÚprettyKeytype?   s   zKeyBlock.prettyKeytypec                 C   s   t | d d ƒS )Nr0   r$   r   r2   r   r   r   ÚhexlifiedValueE   s   zKeyBlock.hexlifiedValuec                 C   s   d|   ¡ |  ¡ f S )Nz(%s)%s)r3   r4   r2   r   r   r   r)   H   r*   zKeyBlock.prettyPrintN)r   r   r   r    r-   r3   r4   r)   r   r   r   r   r.   9   s    þr.   c                   @   sZ   e Zd 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S )ÚKeytabPrincipalzê
    Note: This is very similar to the principal structure in ccache, except:
      * `num_components` is just uint16
      * using other size type for CountedOctetString
      * `name_type` field follows the other fields behind.
    c                   @   ó   e Zd ZdZdS )z KeytabPrincipal.PrincipalHeader1))Únum_componentsr"   N©r   r   r   r-   r   r   r   r   ÚPrincipalHeader1S   ó    r9   c                   @   r6   )z KeytabPrincipal.PrincipalHeader2))Ú	name_typeú!L=0Nr8   r   r   r   r   ÚPrincipalHeader2X   r:   r=   Nc                 C   s´   g | _ d | _|d urN|  |¡| _|t| jƒd … }t|ƒ| _|t| jƒd … }g | _ t| jd ƒD ]}t|ƒ}|t|ƒd … }| j  |¡ q1|  |¡| _	d S |  ¡ | _|  ¡ | _	d S )Nr7   )
Ú
componentsÚrealmr9   Úheader1Úlenr    ÚrangeÚappendr=   Úheader2)r'   r$   Ú	componentÚcompr   r   r   Ú__init__]   s   

zKeytabPrincipal.__init__c                 C   s:   t | jƒt | jƒ t | jƒ }| jD ]}|t |ƒ7 }q|S ©N)rA   r@   rD   r?   r>   )r'   ÚtotalLenÚir   r   r   Ú__len__o   s   
zKeytabPrincipal.__len__c                 C   s>   | j  ¡ | j ¡  }| jD ]}|| ¡ 7 }q|| j ¡ 7 }|S rH   )r@   ÚgetDatar?   r>   rD   )r'   r$   rE   r   r   r   rL   u   s
   
zKeytabPrincipal.getDatac                 C   s   |   ¡ S rH   )rL   r2   r   r   r   Ú__str__|   s   zKeytabPrincipal.__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ó    r$   Tó   /éÿÿÿÿó   @)r>   Ú
isinstanceÚbytesr   r?   )r'   Ú	principalrE   r?   r   r   r   r)      s   
zKeytabPrincipal.prettyPrintrH   )r   r   r   r,   r
   r9   r=   rG   rK   rL   rM   r)   r   r   r   r   r5   L   s    
r5   c                   @   s@   e Zd ZG dd„ deƒZddd„Zdd„ Zdd	„ Zddd„ZdS )ÚKeytabEntryc                   @   s*   e Zd ZdZdddefddddeffZdS )	zKeytabEntry.KeytabEntryMainparta2  
      keytab_entry {
          int32_t size;     # wtf, signed size. what could possibly ...
          uint16_t num_components;    /* sub 1 if version 0x501 */  |          counted_octet_string realm;                               | \  Keytab
          counted_octet_string components[num_components];          | /  Princial
          uint32_t name_type;   /* not present if version 0x501 */  |/
          uint32_t timestamp;
          uint8_t vno8;
          keyblock key;
          uint32_t vno; /* only present if >= 4 bytes left in entry */
      };
        )Úsizez!l=0rT   r%   )Ú	timestampr<   )Úvno8z!B=0ÚkeyblockN)r   r   r   r,   r5   r.   r-   r   r   r   r   ÚKeytabEntryMainpart’   s    ûrZ   Nc                 C   sÞ   d| _ |r\|  |¡| _t| jd ƒd | _| jd | _| jd dk | _t| jƒ}| j|krV||| j… | _ t| j ƒdkrX| j d d… g d¢krZtd| j d d… ƒd | _d S d S d S d S |  ¡ | _d| _t| jƒ| _d| _d S )	NrN   rV   é   rX   r   )r   r   r   r   z!LT)	ÚrestrZ   Ú	main_partÚabsrV   ÚkvnoÚdeletedrA   r   )r'   r$   Úlen_mainr   r   r   rG   ¨   s&   

ü

zKeytabEntry.__init__c                 C   s   | j S rH   )rV   r2   r   r   r   rK   »   s   zKeytabEntry.__len__c                 C   s   | j  ¡ }| jr|| j7 }|S rH   )r]   rL   r\   )r'   r$   r   r   r   rL   ¾   s   

zKeytabEntry.getDatar&   c                 C   sp   | j rd| S d|| jd  ¡ f }|d|t | jd ¡ ¡ f 7 }|d| j 7 }|d|| jd  ¡ f 7 }|S )	Nz%s[DELETED]z%sPrincipal: %s
rT   z%sTimestamp: %srW   z
	KVNO: %i
z	%sKey: %srY   )r`   r]   r)   r   ÚfromtimestampÚ	isoformatr_   )r'   r(   Útextr   r   r   r)   Ä   s    zKeytabEntry.prettyPrintrH   r+   )	r   r   r   r
   rZ   rG   rK   rL   r)   r   r   r   r   rU   ‘   s    
rU   c                   @   sv   e Zd ZejjejjejjfZG dd„ de	ƒZ
ddd„Zdd„ Zdd	d
„Zedd„ ƒZedd„ ƒZdd„ Zdd„ ZdS )ÚKeytabc                   @   r6   )zKeytab.MiniHeader))Úfile_format_versionz	!H=0x0502Nr8   r   r   r   r   Ú
MiniHeader×   r:   rg   Nc                 C   sr   d | _ g | _|d ur5|  |¡| _ |t| j ƒd … }t|ƒr7t|ƒ}| j |¡ |t|ƒd … }t|ƒsd S d S d S rH   )Ú
miniHeaderÚentriesrg   rA   rU   rC   ©r'   r$   Úentryr   r   r   rG   Ü   s   ýýzKeytab.__init__c                 C   s(   |   ¡  ¡ }| jD ]}|| ¡ 7 }q	|S rH   )rg   rL   ri   rj   r   r   r   rL   ç   s   
zKeytab.getDataTc           	      C   s&  t | ¡ ƒ}|r| d¡d }i }| jD ]G}|jd  ¡  ¡ }||ks.|r[| d¡d |kr[|jd d }||krSt d|jd  ¡ |jd  ¡ f ¡ |jd   S |d u r[|||< q|d u rŠ|rŠ| j	D ]$}||v r‰|| }t d|jd  ¡ |jd  ¡ f ¡ |jd   S qet d| ¡ d S )NrQ   r   rT   rY   r/   zReturning %s key for %sz Principal %s not found in keytab)
r   ÚupperÚsplitri   r]   r)   r   Údebugr3   ÚGetkeyEnctypePreference)	r'   rT   ÚspecificEncTypeÚignoreRealmÚmatching_keysrk   Úentry_principalr/   Ú
preferencer   r   r   ÚgetKeyí   s6   
ÿ€
ÿüzKeytab.getKeyc                 C   s"   t |dƒ}| ¡ }| ¡  | |ƒS )NÚrb)ÚopenÚreadÚclose)ÚclsÚfileNameÚfr$   r   r   r   ÚloadFile  s   
zKeytab.loadFilec                 C   sŠ   t  |¡}| d||f ¡}|r=|d tjjks |d tjjkr'| ¡ |_d S |d tj	jkr;d| ¡  
d¡ |_d S d S t d|¡ d S )Nz%s@%sr/   r%   Úasciiz3No matching key for SPN '%s' in given keytab found!)re   r}   ru   r   r   Úvaluer   r4   ÚaesKeyr   ÚdecodeÚhashesr   Úwarning)rz   r{   ÚusernameÚdomainÚoptionsÚkeytabrY   r   r   r   ÚloadKeysFromKeytab  s   
 ÿzKeytab.loadKeysFromKeytabc                 C   s$   t |dƒ}| |  ¡ ¡ | ¡  d S )Nzwb+)rw   ÚwriterL   ry   )r'   r{   r|   r   r   r   ÚsaveFile  s   
zKeytab.saveFilec                 C   s:   t dƒ t| jƒD ]\}}t d| ƒ t | d¡ƒ q	d S )NzKeytab Entries:z[%d]ú	)ÚprintÚ	enumerateri   r)   )r'   rJ   rk   r   r   r   r)   !  s
   þzKeytab.prettyPrintrH   )NT)r   r   r   r   r   r   r   r   ro   r
   rg   rG   rL   ru   Úclassmethodr}   rˆ   rŠ   r)   r   r   r   r   re   Ñ   s    þ



re   N)r   Úenumr   Úsixr   Ústructr   r   r   Úbinasciir	   Úimpacket.structurer
   Úimpacketr   r   r    r.   r5   rU   re   r   r   r   r   Ú<module>   s   
E@