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r…td|
d › �ƒ‚|
}t
 |d d ¡}d|d v r±|d d d tjkr¥t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

"