o
    àý°j,,  ã                   @   s`  d dl Z d dl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 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 d	 d
¡Zd d¡Zd3dd„ZG dd„ deƒZG dd„ deƒZdede fdd„Z!dd„ Z"dd„ Z#dd„ Z$dd„ Z%d d!„ Z&d"ed#efd$d%„Z'd#ed"ed&e fd'd(„Z(d#ed"efd)d*„Z)d+e d,e fd-d.„Z*d/d0„ Z+d1d2„ Z,dS )4é    N)ÚECDHKeyÚFFCDHKeyÚGroupKeyEnvelope)ÚACEÚACLÚACCESS_ALLOWED_ACEÚACCESS_MASKÚSR_SECURITY_DESCRIPTORÚLDAP_SID)Ú	Structure)ÚSHA512ÚSHA256ÚHMAC)Úlong_to_bytes)Ú
iter_range)ÚAESzKDS service z	utf-16-leúKDS public key úutf-16leó    c                    sº   |du rd}t ˆ| d dƒ}ˆ| }d}d‰ tˆ ƒ|k rCt |dƒ| d | | }	ˆ || |	ƒ7 ‰ |d7 }|dkr=tdƒ‚tˆ ƒ|k s|dkrMˆ dˆ… S ‡ ‡fd	d
„td|ˆƒD ƒ}
|
S )aƒ  Derive one or more keys from a master secret using
    a pseudorandom function in Counter Mode, as specified in
    `NIST SP 800-108r1 <https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-108r1.pdf>`_.

    Modified version for Impacket, accepting null_bytes

    Args:
     master (byte string):
        The secret value used by the KDF to derive the other keys.
        It must not be a password.
        The length on the secret must be consistent with the input expected by
        the :data:`prf` function.
     key_len (integer):
        The length in bytes of each derived key.
     prf (function):
        A pseudorandom function that takes two byte strings as parameters:
        the secret and an input. It returns another byte string.
     num_keys (integer):
        The number of keys to derive. Every key is :data:`key_len` bytes long.
        By default, only 1 key is derived.
     label (byte string):
        Optional description of the purpose of the derived keys.
        It must not contain zero bytes.
     context (byte string):
        Optional information pertaining to
        the protocol that uses the keys, such as the identity of the
        participants, nonces, session IDs, etc.
        It must not contain zero bytes.

    Return:
        - a byte string (if ``num_keys`` is not specified), or
        - a tuple of byte strings (if ``num_key`` is specified).
    Né   é   é   r   ó    l   ÿÿ zOverflow in SP800 108 counterc                    s   g | ]
}ˆ ||ˆ … ‘qS © r   )Ú.0Úidx©ÚdkÚkey_lenr   ú„/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/impacket/dpapi_ng.pyÚ
<listcomp>M   s    ÿz%SP800_108_Counter.<locals>.<listcomp>r   )r   ÚlenÚ
ValueErrorr   )Úmasterr   ÚprfÚnum_keysÚlabelÚcontextÚkey_len_encÚ
output_lenÚiÚinfoÚkolr   r   r   ÚSP800_108_Counter   s&   #û
ÿr-   c                   @   s&   e Zd ZdZdd„ Zdefdd„ZdS )ÚKeyIdentifier))ÚVersionú<L=0)ÚMagicr0   ©ÚFlagsr0   )ÚL0Indexr0   )ÚL1Indexr0   )ÚL2Indexr0   )Ú	RootKeyIdz16s=b)ÚUnknownLengthr0   )ÚDomainLengthr0   )ÚForestLengthr0   )Ú_Unknownz	_-Unknownzself["UnknownLength"])ÚUnknownú:)Ú_Domainz_-Domainzself["DomainLength"])ÚDomainr=   )Ú_Forestz_-Forestzself["ForestLength"])ÚForestr=   c                 C   sÂ   t dƒ t d| d  ƒ t dt| d ƒ ƒ t d| d  ƒ t d| d	  ƒ t d
| d  ƒ t d| d  ƒ t d| d  ƒ t d| d  ƒ t d| d  d¡ ƒ t d| d  d¡ ƒ t ƒ  d S )Nz[KEY IDENTIFIER]zVersion:		%sr/   z
Magic:		%sr1   ú
Flags:		%sr3   zL0Index:		%sr4   zL1Index:		%sr5   zL2Index:		%sr6   zRootKeyId:		%sr7   zUnknown:		%sr<   zDomain:		%sr?   r   zForest:		%srA   )ÚprintÚhexÚdecode©Úselfr   r   r   Údumpe   s   
zKeyIdentifier.dumpÚreturnc                 C   s   t | d d@ ƒS )Nr3   r   )ÚboolrF   r   r   r   Úis_public_keys   s   zKeyIdentifier.is_public_keyN)Ú__name__Ú
__module__Ú__qualname__Ú	structurerH   rJ   rK   r   r   r   r   r.   Q   s    r.   c                   @   s   e Zd ZdZdd„ ZdS )ÚEncryptedPasswordBlob))ÚTimestamp_lowerr0   )ÚTimestamp_upperr0   )ÚLengthr0   r2   )Ú_Blobz_-Blobzself["Length"])ÚBlobr=   c                 C   s‚   t dƒ t d| d  ƒ t d| d  ƒ t dt| d ƒd> | d B  ƒ t d| d	  ƒ t d
| d  ƒ t d| d  ƒ t ƒ  d S )Nz[ENCRYPTED PASSWORD BLOB]zTimestamp_upper:		%srR   zTimestamp_lower:		%srQ   zUpdate Timestamp:		%sé    zLength:		%srS   rB   r3   z	Blob:		%srU   )rC   ÚintrF   r   r   r   rH   €   s    
zEncryptedPasswordBlob.dumpN)rL   rM   rN   rO   rH   r   r   r   r   rP   v   s    	rP   ÚnrI   c                 C   s   | j ddd�S )Nr   Úbig©ÚlengthÚ	byteorder)Úto_bytes)rX   r   r   r   Úint_to_u32beŠ   s   r^   c                 C   sX   t ƒ }tj|d< d|d< tƒ }tƒ |d< ||d d< tƒ |d< |d  | ¡ ||d< |S )NÚAceTyper   ÚAceFlagsÚMaskÚSidÚAce)r   r   ÚACE_TYPEr   r
   ÚfromCanonical)ÚsidÚmaskÚnaceÚacedatar   r   r   Ú
create_ace�   s   


rj   c                 C   sª   t ƒ }d|d< d|d< d|d< tƒ |d< |d  d¡ tƒ |d	< |d	  d¡ d
|d< tƒ }d|d< d|d< d|d< g |_|j t| dƒ¡ |j tddƒ¡ ||d< |S )Nó   ÚRevisionr   ÚSbz1i€  ÚControlÚOwnerSidzS-1-5-18ÚGroupSidr   ÚSaclé   ÚAclRevisionr   ÚSbz2é   zS-1-1-0ÚDacl)r	   r
   re   r   ÚacesÚappendrj   )rf   ÚsdÚaclr   r   r   Ú	create_sd™   s$   

r{   c                 C   s‚   dg}d}d}| |kr8t  ¡ }|jt|ƒd� | |¡ | |¡ | | ¡ ¡ |t|d ƒ7 }|d7 }| |ksd |¡d | … S )Nr   r   r   )Údataéÿÿÿÿ)r   Ú
SHA256HashÚupdater^   rx   Údigestr!   Újoin)r[   Úkey_materialÚ	otherinfoÚoutputÚoutlenÚcounterÚhash_moduler   r   r   Úcompute_kdf_hash®   s   

ù	rˆ   c              
   C   s6   d  | |jdddd�|jdddd�|jdddd�g¡S )Nr   r   ÚlittleT)r\   Úsigned)r�   r]   )Úkey_guidÚl0Úl1Úl2r   r   r   Úcompute_kdf_context¾   s   üÿr�   c                    s<   t ‰ d| v r	t ‰ nd| v rt‰ ‡ fdd„}t|||||d�S )Nr   r   c                    s   t  | |ˆ ¡ ¡ S )N)r   Únewr€   )ÚsÚx©Úhash_algr   r   r$   Ï   s   zkdf.<locals>.prf)r#   r$   r   r&   r'   )r   r   r-   )Úhash_alg_strÚsecretr&   r'   r[   r$   r   r“   r   ÚkdfÈ   s   ûr—   Úkey_idÚgkec              	   C   s  |d }|d }|d }|d }|dkp|| d k}|d d   d¡}|dkr1|| d kr1|d	8 }|| d krTd
}|d	8 }t||tt|d |d |dƒdƒ}|| d ks7|rid}t||tt|d |d ||ƒdƒ}|| d krŠ|d	8 }t||tt|d |d ||ƒdƒ}|| d kso|S )Nr5   ÚL1Keyr6   ÚL2Keyé   ÚKdfParaÚHashNamer   r   Tr7   r4   r}   é@   )rE   r—   ÚKDS_SERVICE_LABELr�   )r˜   r™   r�   Úl1_keyrŽ   Úl2_keyÚ	reseed_l2Ú	kdf_paramr   r   r   Úcompute_l2_keyÚ   sl   üöüüöüöýr¥   r¢   c           
   	   C   sð   t | d d  d¡|t| d t | d d ¡ƒ}| d  d¡ ¡ dkrPt|d ƒ}ttj	|d	 d
d�tj	|d
d�tj	|d d
d�ƒ}|j
| ¡ d d d
d�}nd| d  d¡v rat|d ƒ}d S d d¡}d d¡| t }	td|	|d�|fS )Nr�   rž   r   ÚSecAlgoÚPrivKeyLengthr   s   DH r<   ÚPubKeyrY   ©r\   Ú
FieldOrderé   ÚECDH_Pr   zSHA512 rV   )r[   rƒ   r‚   )r—   rE   r    ÚmathÚceilÚencoder   ÚpowrW   Ú
from_bytesr]   Ú
bit_lengthr   rˆ   )
r™   r˜   r¢   Úprivate_keyÚ	ffcdh_keyÚshared_secret_intÚshared_secretÚecdh_keyÚkek_contextrƒ   r   r   r   Úgenerate_kek_secret_from_pubkey  s*   ûý
r¹   c                 C   sX   d }d }t || ƒ}| ¡ rt| ||d�\}}n|}|d }t| d d  d¡|t|dƒS )N)r™   r˜   r¢   r<   r�   rž   r   rV   )r¥   rK   r¹   r—   rE   r    )r™   r˜   r¸   Ú
kek_secretr¢   r   r   r   Úcompute_kek1  s   
ûr»   Úwrapping_keyÚwrapped_keyc                    sÒ   d}‡ fdd„t dtˆ ƒdƒD ƒ}| d¡}t | tj¡}t|ƒ}tt dƒƒD ]6}tt |ƒƒD ]-}tj|dd�|| | d	 A j	ddd
�||  }	| 
|	¡}
|
d d… }|
dd … ||< q/q'||krgd |¡S d S )Ns   ¦¦¦¦¦¦¦¦c                    s   g | ]
}ˆ ||d  … ‘qS )r   r   )r   r*   ©r½   r   r   r    G  s    zaes_unwrap.<locals>.<listcomp>r   r   é   rY   r©   r   rZ   iøÿÿÿr   )Úranger!   Úpopr   r�   ÚMODE_ECBÚreversedrW   r±   r]   Údecryptr�   )r¼   r½   ÚaivÚrÚaÚ	decryptorrX   Újr*   ÚatrÚbr   r¾   r   Ú
aes_unwrapE  s&   
þþ
÷

rÌ   c                 C   s   t | |ƒ}|d u rtdƒ‚|S )NzCould not unwrap key)rÌ   r"   )ÚkekÚencrypted_cekrÆ   r   r   r   Ú
unwrap_cek[  s   
rÏ   c                 C   s   t j| t j|d�}| |¡S )N)Únonce)r   r�   ÚMODE_GCMrÄ   )ÚcekÚivÚencrypted_blobÚcipherr   r   r   Údecrypt_plaintexta  s   
rÖ   )Nr   r   )-r­   ÚstructÚimpacket.dcerpc.v5.gkdir   r   r   Úimpacket.ldap.ldaptypesr   r   r   r   r	   r
   Úimpacket.structurer   ÚCryptodome.Hashr   r   r   ÚCryptodome.Util.numberr   ÚCryptodome.Util.py3compatr   ÚCryptodome.Cipherr   r¯   r    ÚKEK_PUBLIC_KEY_LABELr-   r.   rP   rW   Úbytesr^   rj   r{   rˆ   r�   r—   r¥   r¹   r»   rÌ   rÏ   rÖ   r   r   r   r   Ú<module>   s4   
 


9%
?