o
    j/                     @  s   d dl mZ d dlZd dlZd dlZd dlZd dlZd dlm	Z	 d dl
mZmZ ejddG dd dZejddG d	d dZG d
d dejZejddG dd dZejddG dd deZejG dd dZdS )    )annotationsN)ContentInfo)ace_to_bytessd_to_bytesT)frozenc                   @     e Zd ZU dZded< ejddddZded< ded	< ded
< ded< ded< ded< ded< ded< ded< edddZ	dddZ
ed ddZdS )!KeyIdentifier  Key Identifier.

	This contains the key identifier info that can be used by MS-GKDI GetKey
	to retrieve the group key seed values. This structure is not defined
	publicly by Microsoft but it closely matches the :class:`GroupKeyEnvelope`
	structure.

	Args:
		version: The version of the structure, should be 1
		flags: Flags describing the values inside the structure
		l0: The L0 index of the key
		l1: The L1 index of the key
		l2: The L2 index of the key
		root_key_identifier: The key identifier
		key_info: If is_public_key this is the public key, else it is the key
			KDF context value.
		domain_name: The domain name of the server in DNS format.
		forest_name: The forest name of the server in DNS format.
	intversionF   KDSKinitreprdefaultbytesmagicflagsl0l1l2	uuid.UUIDroot_key_identifierkey_infostrdomain_nameforest_namereturnboolc                 C     t | jd@ S N   r   r   self r%   /root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/aiosmb/dcerpc/v5/common/dpapi_ng/blob.pyis_public_key1      KeyIdentifier.is_public_keyc                 C     | j d d}| jd d}d| jjddd| j| jjddd| jjddd| j	jddd| j
jddd| jjt| jjdddt|jdddt|jddd| j||gS N 	utf-16-le       little	byteorderr   encoder   joinr   to_bytesr   r   r   r   r   r   bytes_lelenr   r$   b_domain_nameb_forest_namer%   r%   r&   pack5   $   KeyIdentifier.packdata%t.Union[bytes, bytearray, memoryview]c                 C    t |}tj|d d dd}|dd  | jkr#td| j dtj|dd dd}tj|dd dd}tj|dd	 dd}tj|d	d
 dd}tj|d
d  d}tj|dd dd}	tj|dd dd}
tj|dd dd}|dd  }|d |	  }||	d  }|d |
d   	d}||
d  }|d |d   	d}||d  }t
|||||||||d	S Nr/   r0   r1      zFailed to unpack z as magic identifier is invalid            (   )r7   ,   0   4      r-   )	r   r   r   r   r   r   r   r   r   
memoryviewr
   
from_bytestobytesr   
ValueError__name__uuidUUIDdecoder   clsr?   viewr   r   l0_indexl1_indexl2_indexr   key_info_len
domain_len
forest_lenr   domainforestr%   r%   r&   unpackK   <   KeyIdentifier.unpackNr   r   r   r   r?   r@   r   r   rR   
__module____qualname____doc____annotations__dataclassesfieldr   propertyr'   r<   classmethodra   r%   r%   r%   r&   r      "   
 
r   c                   @  r   )!r   r	   r
   r   Fr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   c                 C  r   r    r"   r#   r%   r%   r&   r'      r(   r)   c                 C  r*   r+   r3   r9   r%   r%   r&   r<      r=   r>   r?   r@   c                 C  rA   rB   rM   rV   r%   r%   r&   ra      rb   rc   Nrd   re   rf   rg   r%   r%   r%   r&   r   w   rp   c                   @  s   e Zd ZdZdZdZdZdS )ProtectionDescriptorTypez1.3.6.1.4.1.311.74.1.1z1.3.6.1.4.1.311.74.1.2z1.3.6.1.4.1.311.74.1.5z1.3.6.1.4.1.311.74.1.8N)rR   rh   ri   SIDKEY_FILESDDLLOCALr%   r%   r%   r&   rq      s
    rq   c                   @  sN   e Zd ZU ded< ded< dddZdd	d
ZedddZedddZdS )ProtectionDescriptorrq   typer   valuer   r   c                 C     t  NNotImplementedErrorr#   r%   r%   r&   get_target_sd      z"ProtectionDescriptor.get_target_sdc                 C  ry   rz   r{   r#   r%   r%   r&   r<      r~   zProtectionDescriptor.packc                 C  s   t |S rz   )SIDDescriptor)rW   rx   r%   r%   r&   parse   s   zProtectionDescriptor.parser?   r@   c                 C  sb   |d }|d d d d }|d d d d }|t jjkr&|dkr&t|S td| d| d)N01rr   z$DPAPI-NG protection descriptor type z 'z' is unsupported)rq   rr   rx   r   rQ   )rW   r?   content_type
value_typerx   r%   r%   r&   ra      s   zProtectionDescriptor.unpackNre   )rx   r   r   rv   )r?   r@   r   rv   )	rR   rh   ri   rk   r}   r<   ro   r   ra   r%   r%   r%   r&   rv      s   
 

rv   c                   @  s0   e Zd ZU ejdejdZded< d
ddZ	d	S )r   F)r   r   rq   rw   r   r   c                 C  s    t ddt| jdtddgdS )NzS-1-5-18   zS-1-1-0rL   )ownergroupdacl)r   r   rx   r#   r%   r%   r&   r}     s
   zSIDDescriptor.get_target_sdNre   )
rR   rh   ri   rl   rm   rq   rr   rw   rk   r}   r%   r%   r%   r&   r   	  s   
 r   c                   @  sl   e Zd ZU dZ	 ded< ded< ded< ded	< d
ed< ded< ded< d
ed< dddZedddZdS )DPAPINGBlobz1.3.6.1.4.1.311.74.1r   key_identifierrv   protection_descriptorr   enc_cekr   enc_cek_algorithmzt.Optional[bytes]enc_cek_parametersenc_contentenc_content_algorithmenc_content_parametersr   c                   C  ry   rz   r{   r%   r%   r%   r&   r<   9  r~   zDPAPINGBlob.packr?   r@   c              
   C  s  t |}tj|dddd}tj|dddd}tj|dddd}||}t|}|j}d|vr;td|d dkrJtd	|d  |d
 }	|	d dkr]td|	d  t	|	d dkrptdt	|	d  |	d d }
|
d dkrtd|
d  |
}t
|d d }d|d v r|d d d tjkrtdt|d d d }ntd}|	d d }|d u r|dt	|  t j | }t|||d |d d  |d d! ||	d d" d  |	d d" d! d#S )$NrC   r0   F)r2   signedr/   r   z+Invalid DPAPI-NG blob, missing content typeenveloped_dataz1Invalid DPAPI-NG blob, unsupported content type: contentr   v2z,Invalid DPAPI-NG blob, unsupported version: recipient_infosr!   z;Invalid DPAPI-NG blob, unsupported recipient infos length: r   v4z;Invalid DPAPI-NG blob, unsupported recipient info version: kekidr   otherkey_attr_idz-DPAPI-NG KEK Id is not in the expected formatkey_attrr.   encrypted_content_infoencrypted_contentrE   encrypted_keykey_encryption_algorithm	algorithm
parameterscontent_encryption_algorithm)r   r   r   r   r   r   r   r   )ioBytesIOr
   rO   readr   loadnativerQ   r8   r   ra   r   MICROSOFT_SOFTWARE_OIDrv   seekdumpSEEK_SET)rW   r?   rX   update_timestampblob_lengthr   blobcontent_infocontent_info_nativer   recipient_infokek_infor   r   r   r%   r%   r&   ra   <  sP   





zDPAPINGBlob.unpackNre   )r?   r@   r   r   )rR   rh   ri   r   rk   r<   ro   ra   r%   r%   r%   r&   r     s   
 
r   )
__future__r   r   rl   enumtypingtrS   asn1crypto.cmsr   5aiosmb.dcerpc.v5.common.dpapi_ng._security_descriptorr   r   	dataclassr   Enumrq   rv   r   r   r%   r%   r%   r&   <module>   s&   

fg

"