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   ir   )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%
?