o
    àý°jD¸  ã                   @   s  d dl mZ d dl mZ d dlZd dlmZ d dlmZmZ d dlm	Z	m
Z
 d dlmZ d dlmZ d d	lmZmZmZmZ d d
lmZmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dl m!Z!m"Z" d dl#m$Z$ d dl%m&Z& d dl'm(Z( d Z)dZ*dZ+dZ,dZ-dZ.dZ/d Z0dZ1dZ2dZ3dZ4dZ5dZ6d Z7d Z8d Z9d!Z:d"Z;d#Z<d Z=d Z>d!Z?d"Z@d ZAd"ZBd#ZCd$ZDd%ZEd&ZFd'ZGd(ZHd)ZId*ZJd+ZKd,ZLd-ZMd.ZNd/ZOd0ZPd%ZQd&ZRd'ZSd(ZTd/ZUd!ZVd ZWd!ZXd ZYd!ZZd"Z[d#Z\d$Z]d Z^d!Z_d"Z`d#Zad#Zbd$Zcd%Zdd&Zed'Zfd(Zgd/Zhd0Zid)Zjd*Zkd+Zld Zmd!Znd"Zod#Zpd$Zqd%Zrd&Zsd Ztd1d2„ ZuG d3d4„ d4e&ƒZvG d5d6„ d6e&ƒZwG d7d8„ d8e&ƒZxG d9d:„ d:e&ƒZyG d;d<„ d<e&ƒZzewj{j|d=eddd>fewj}j|d=eddd>fewj~j|d?eejd'fewj€j|d-eddd@fewj�j|dAeejd-fiZ‚G dBdC„ dCe!ƒZƒG dDdE„ dEe!ƒZ„G dFdG„ dGe!ƒZ…G dHdI„ dIe!ƒZ†G dJdK„ dKƒZ‡G dLdM„ dMe!ƒZˆG dNdO„ dOe!ƒZ‰G dPdQ„ dQe!ƒZŠG dRdS„ dSe!ƒZ‹G dTdU„ dUe!ƒZŒG dVdW„ dWe!ƒZ�G dXdY„ dYe!ƒZŽG dZd[„ d[e!ƒZ�G d\d]„ d]e!ƒZ�G d^d_„ d_e!ƒZ‘G d`da„ dae!ƒZ’G dbdc„ dce!ƒZ“G ddde„ dee!ƒZ”G dfdg„ dge!ƒZ•G dhdi„ die!ƒZ–G djdk„ dke!ƒZ—e•e—e”dlœZ˜G dmdn„ dne!ƒZ™G dodp„ dpe!ƒZšdqZ›G drds„ dse!ƒZœG dtdu„ due!ƒZ�G dvdw„ dwe!ƒZžG dxdy„ dye!ƒZŸG dzd{„ d{e!ƒZ G d|d}„ d}e!ƒZ¡G d~d„ de!ƒZ¢G d€d�„ d�e!ƒZ£G d‚dƒ„ dƒe!ƒZ¤d„d…„ Z¥d†d‡„ Z¦dˆd‰„ Z§dS )Šé    )Údivision)Úprint_functionN)Úunpack)ÚdatetimeÚtimezone)Ú	unhexlifyÚhexlify)Úpack)Úpbkdf2_hmac)ÚHMACÚSHA512ÚSHA1ÚMD4)ÚAESÚDES3)Úunpad)ÚRSA)Úbytes_to_long)ÚPY3)ÚgetUnixTime)Ú	StructureÚhexdump)Úbin_to_string)ÚEnum)ÚRPC_SIDi    i @  i `  i €  i    i à  i   i   i   i   i 
  i   é   é   é   é   é   é   é   é   é	   é   é   é   é   é   é   é
   é   c                    s   d  ‡ fdd„| j ¡ D ƒ¡S )Nú|c                    s   g | ]\}}|j ˆ @ r|‘qS © )Úvalue)Ú.0ÚnameÚmember©Úflagsr-   ú�/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/impacket/dpapi.pyÚ
<listcomp>Œ   s    zgetFlags.<locals>.<listcomp>)ÚjoinÚ__members__Úitems)Úmyenumr3   r-   r2   r4   ÚgetFlags‹   s   r:   c                   @   s(   e Zd ZdZdZdZdZdZdZdZ	dS )	ÚFLAGSr   r   r"   r(   é@   é€   i    N)
Ú__name__Ú
__module__Ú__qualname__ÚCRYPTPROTECT_UI_FORBIDDENÚCRYPTPROTECT_LOCAL_MACHINEÚCRYPTPROTECT_CRED_SYNCÚCRYPTPROTECT_AUDITÚCRYPTPROTECT_VERIFY_PROTECTIONÚCRYPTPROTECT_CRED_REGENERATEÚCRYPTPROTECT_SYSTEMr-   r-   r-   r4   r;   Ž   s    r;   c                   @   s(  e Zd ZeeB eB ZeeB eB ZeeB e	B Z
eeB eB ZeeB eB ZeeB eB ZeeB eB ZeeB eB ZeeB eB ZeeB eB ZeeB eB ZeeB e B Z!eeB e"B Z#eeB e$B Z%ee&B e'B Z(ee&B e)B Z*ee+B e,B Z-ee+B e.B Z/ee+B e0B Z1ee+B e2B Z3eeB e	B Z4eeB e5B Z6eeB e7B Z8eeB e9B Z:e;e<B e=B Z>e;e<B e?B Z@e;e<B eAB ZBe;e<B eCB ZDe;e<B eEB ZFe;e<B eGB ZHe;e<B eIB ZJeeB eKB ZLeeB eMB ZNeeB eOB ZPeeB eQB ZReeB eSB ZTeeB eUB ZVeeB eWB ZXeeB eYB ZZeeB e[B Z\eeB e]B Z^eeB e_B Z`ee+B eaB ZbeeB ecB ZdeeB eeB ZfdS )Ú
ALGORITHMSN)gr>   r?   r@   ÚALG_CLASS_HASHÚALG_TYPE_ANYÚALG_SID_MD2ÚCALG_MD2ÚALG_SID_MD4ÚCALG_MD4ÚALG_SID_MD5ÚCALG_MD5ÚALG_SID_SHAÚCALG_SHAÚALG_SID_SHA1Ú	CALG_SHA1ÚALG_CLASS_SIGNATUREÚALG_TYPE_RSAÚALG_SID_RSA_ANYÚCALG_RSA_SIGNÚALG_TYPE_DSSÚALG_SID_DSS_ANYÚCALG_DSS_SIGNÚALG_SID_ANYÚCALG_NO_SIGNÚALG_CLASS_KEY_EXCHANGEÚCALG_RSA_KEYXÚALG_CLASS_DATA_ENCRYPTÚALG_TYPE_BLOCKÚALG_SID_DESÚCALG_DESÚALG_SID_3DES_112ÚCALG_3DES_112ÚALG_SID_3DESÚ	CALG_3DESÚALG_SID_DESXÚ	CALG_DESXÚALG_SID_RC2ÚCALG_RC2ÚALG_TYPE_STREAMÚALG_SID_RC4ÚCALG_RC4ÚALG_SID_SEALÚ	CALG_SEALÚALG_TYPE_DHÚALG_SID_DH_SANDFÚ
CALG_DH_SFÚALG_SID_DH_EPHEMÚCALG_DH_EPHEMÚALG_SID_AGREED_KEY_ANYÚCALG_AGREEDKEY_ANYÚALG_SID_KEAÚCALG_KEA_KEYXÚCALG_HUGHES_MD5ÚALG_SID_SKIPJACKÚCALG_SKIPJACKÚALG_SID_TEKÚCALG_TEKÚALG_SID_SSL3SHAMD5ÚCALG_SSL3_SHAMD5ÚALG_CLASS_MSG_ENCRYPTÚALG_TYPE_SECURECHANNELÚALG_SID_SSL3_MASTERÚCALG_SSL3_MASTERÚALG_SID_SCHANNEL_MASTER_HASHÚCALG_SCHANNEL_MASTER_HASHÚALG_SID_SCHANNEL_MAC_KEYÚCALG_SCHANNEL_MAC_KEYÚALG_SID_SCHANNEL_ENC_KEYÚCALG_SCHANNEL_ENC_KEYÚALG_SID_PCT1_MASTERÚCALG_PCT1_MASTERÚALG_SID_SSL2_MASTERÚCALG_SSL2_MASTERÚALG_SID_TLS1_MASTERÚCALG_TLS1_MASTERÚALG_SID_RC5ÚCALG_RC5ÚALG_SID_HMACÚ	CALG_HMACÚALG_SID_TLS1PRFÚCALG_TLS1PRFÚALG_SID_HASH_REPLACE_OWFÚCALG_HASH_REPLACE_OWFÚALG_SID_AES_128ÚCALG_AES_128ÚALG_SID_AES_192ÚCALG_AES_192ÚALG_SID_AES_256ÚCALG_AES_256ÚALG_SID_AESÚCALG_AESÚALG_SID_SHA_256ÚCALG_SHA_256ÚALG_SID_SHA_384ÚCALG_SHA_384ÚALG_SID_SHA_512ÚCALG_SHA_512ÚALG_SID_ECDHÚ	CALG_ECDHÚALG_SID_ECMQVÚ
CALG_ECMQVÚALG_SID_ECDSAÚ
CALG_ECDSAr-   r-   r-   r4   rH   ˜   s\    rH   c                   @   ó,   e Zd ZdZdZdZdZdZdZdZ	dZ
d	S )
ÚCREDENTIAL_FLAGSr   r   r   r"   r(   é    r<   r=   N)r>   r?   r@   ÚCRED_FLAGS_PASSWORD_FOR_CERTÚCRED_FLAGS_PROMPT_NOWÚCRED_FLAGS_USERNAME_TARGETÚCRED_FLAGS_OWF_CRED_BLOBÚCRED_FLAGS_REQUIRE_CONFIRMATIONÚCRED_FLAGS_WILDCARD_MATCHÚCRED_FLAGS_VSM_PROTECTEDÚCRED_FLAGS_NGC_CERTr-   r-   r-   r4   r®   Ç   ó    r®   c                   @   r­   )
ÚCREDENTIAL_TYPEr   r   r   r   r   r    r!   r"   N)r>   r?   r@   ÚCRED_TYPE_GENERICÚCRED_TYPE_DOMAIN_PASSWORDÚCRED_TYPE_DOMAIN_CERTIFICATEÚ!CRED_TYPE_DOMAIN_VISIBLE_PASSWORDÚCRED_TYPE_GENERIC_CERTIFICATEÚCRED_TYPE_DOMAIN_EXTENDEDÚCRED_TYPE_MAXIMUMÚCRED_TYPE_MAXIMUM_EXr-   r-   r-   r4   r¹   Ñ   r¸   r¹   c                   @   s   e Zd ZdZdZdZdZdS )ÚCREDENTIAL_PERSISTr   r   r   r   N)r>   r?   r@   ÚCRED_PERSIST_NONEÚCRED_PERSIST_SESSIONÚCRED_PERSIST_LOCAL_MACHINEÚCRED_PERSIST_ENTERPRISEr-   r-   r-   r4   rÂ   Û   s
    rÂ   é   r<   é   r=   r¯   c                   @   ó   e Zd ZdZdd„ ZdS )ÚMasterKeyFile)©ÚVersionú<L=0)Úunk1rÍ   )Úunk2rÍ   )ÚGuidz72s=b'')ÚUnkownrÍ   )ÚPolicyrÍ   ©ÚFlagsrÍ   )ÚMasterKeyLenú<Q=0)ÚBackupKeyLenrÖ   )ÚCredHistLenrÖ   )ÚDomainKeyLenrÖ   c                 C   sÐ   t dƒ t d| d | d f ƒ t d| d  d¡ ƒ t d| d | d f ƒ t d	| d
 | d
 f ƒ t d| d | d f ƒ t d| d | d f ƒ t d| d | d f ƒ t d| d | d f ƒ t ƒ  d S )Nz[MASTERKEYFILE]úVersion     : %8x (%d)rÌ   zGuid        : %srÐ   úutf-16lezFlags       : %8x (%d)rÔ   zPolicy      : %8x (%d)rÒ   zMasterKeyLen: %.8x (%d)rÕ   zBackupKeyLen: %.8x (%d)r×   zCredHistLen : %.8x (%d)rØ   zDomainKeyLen: %.8x (%d)rÙ   )ÚprintÚdecode©Úselfr-   r-   r4   Údumpù   s   
zMasterKeyFile.dumpN©r>   r?   r@   Ú	structurerà   r-   r-   r-   r4   rÊ   ê   s    rÊ   c                   @   s2   e Zd ZdZddd„Zdd„ Zdd	„ Zd
d„ ZdS )Ú	MasterKey)rË   )ÚSaltz16s=b"")ÚMasterKeyIterationCountrÍ   ©ÚHashAlgorÍ   ©Ú	CryptAlgorÍ   ©Údataú:Nr   c                 C   s   t  | ||¡ d | _d S ©N)r   Ú__init__ÚdecryptedKey©rß   rë   Ú	alignmentr-   r-   r4   rî     s   
zMasterKey.__init__c                 C   s²   t dƒ t d| d | d f ƒ t dt| d ƒ ƒ t d| d | d f ƒ t d| d	 | d	 t| d	 ƒjf ƒ t d
| d | d t| d ƒjf ƒ t dt| d ƒ ƒ t ƒ  d S )Nz[MASTERKEY]rÚ   rÌ   zSalt        : %srä   zRounds      : %8x (%d)rå   zHashAlgo    : %.8x (%d) (%s)rç   zCryptAlgo   : %.8x (%d) (%s)ré   zdata        : %srë   )rÜ   r   rH   r0   rÞ   r-   r-   r4   rà     s   $$
zMasterKey.dumpc                 C   óÀ   d}d}t |ƒ|k rZ|td|ƒ }|d7 }t|||ƒƒ}	t|d ƒD ]-}
t|||	ƒƒ}trCt |	tj¡t |tj¡A  	t |ƒtj¡}	q"tdd„ t
|	|ƒD ƒƒ}	q"||	7 }t |ƒ|k s
|d |… S )Nó    r   ú!Lc                 S   ó   g | ]
\}}t ||A ƒ‘qS r-   ©Úchr©r/   ÚaÚbr-   r-   r4   r5   )  ó    z'MasterKey.deriveKey.<locals>.<listcomp>©Úlenr	   Ú	bytearrayÚranger   ÚintÚ
from_bytesÚsysÚ	byteorderÚto_bytesÚzip©rß   Ú
passphraseÚsaltÚkeylenÚcountÚhashFunctionÚkeyMaterialÚiÚUÚderivedÚrÚactualr-   r-   r4   Ú	deriveKey  ó   ,özMasterKey.deriveKeyc                    sj  | d t jjkrt‰ nt| d  d ‰ ‡ fdd„}| j|| d t| d  d t| d  d  | d	 |d
�}|d t| d  d … }|t| d  d d … d t| d  d … }t| d  d j|t| d  d |d�}| | d ¡}|dd … }|d d… }	|dd … d t| d  d … }
t ||	ˆ ¡ 	¡ }t ||ˆ ¡ 	¡ }|d t| d  d … |
kr³|| _
|S d S )Nrç   r   c                    ó   t  | |ˆ ¡ ¡ S rí   ©r   ÚnewÚdigest©ÚpÚs©Ú
hashModuler-   r4   Ú<lambda>4  ó    z#MasterKey.decrypt.<locals>.<lambda>rä   ré   r   r   rå   ©r
  r  r   ©ÚmodeÚivrë   iÀÿÿÿr(   )rH   r”   r.   r   ÚALGORITHMS_DATAr  r  Údecryptr   r  rï   )rß   ÚkeyÚprfÚderivedBlobÚcryptKeyr"  ÚcipherÚ	cleartextrï   ÚhmacSaltÚhmacÚhmacKeyÚhmacCalculatedr-   r  r4   r$  .  s*   þ,( zMasterKey.decrypt©Nr   )r>   r?   r@   râ   rî   rà   r  r$  r-   r-   r-   r4   rã     s    
	
rã   c                   @   rÉ   )ÚCredHist)rË   )rÐ   z16s=b''c                 C   s>   t dƒ t d| d | d f ƒ t dt| d ƒ ƒ t ƒ  d S )Nz
[CREDHIST]úVersion       : %8x (%d)rÌ   úGuid          : %srÐ   )rÜ   r   rÞ   r-   r-   r4   rà   R  s   
zCredHist.dumpNrá   r-   r-   r-   r4   r0  M  s    r0  c                   @   s:   e Zd ZdZddd„Zdd„ Zdd	„ Zd
d„ Zdd„ ZdS )ÚCREDHIST_ENTRY)rË   ræ   )ÚRoundsrÍ   ©ÚSidLenrÍ   ©Ú_Sidz_-Sidzself["SidLen"]rè   )Ú
shaHashLenrÍ   )Ú	ntHashLenrÍ   )rä   ú16s=b©ÚSidrì   )Ú_dataz_-datazW(self["shaHashLen"]+self["ntHashLen"]) + (-(self["shaHashLen"]+self["ntHashLen"])) % 16rê   )ÚVersion2rÍ   ©rÐ   r;  Nr   c                 C   s4   t  | ||¡ td| d  ƒ ¡ | _d | _d | _d S )Nó      r=  )r   rî   r   ÚformatCanonicalÚsidÚpwdhashÚnthashrð   r-   r-   r4   rî   j  s   
zCREDHIST_ENTRY.__init__c                 C   rò   )Nró   r   rô   c                 S   rõ   r-   rö   rø   r-   r-   r4   r5   |  rû   z,CREDHIST_ENTRY.deriveKey.<locals>.<listcomp>rü   r  r-   r-   r4   r  p  r  zCREDHIST_ENTRY.deriveKeyc           	         sX  | d t jjkrt‰ nt| d  d ‰ ‡ fdd„}| j|| d t| d  d t| d  d  | d	 |d
�}|d t| d  d … }|t| d  d d … d t| d  d … }t| d  d j|t| d  d |d�}| | d ¡}d}|d | d … | _|| d | d | … | _	|| d | d … t
| d ƒ| d  | d krªd | _d | _	d S d S )Nrç   r   c                    r  rí   r  r  r  r-   r4   r  ‡  r  z(CREDHIST_ENTRY.decrypt.<locals>.<lambda>rä   ré   r   r   r4  r  r   r   rë   r(   r9  ó    )rH   r”   r.   r   r#  r  r  r$  rD  rE  rý   )	rß   r%  r&  r'  r(  r"  r)  r*  Ú
ntHashSizer-   r  r4   r$  �  s    8,(0
þzCREDHIST_ENTRY.decryptc                 C   s^  t dƒ t d| d | d f ƒ t d| d | d t| d ƒjf ƒ t d| d  ƒ t d| d	 | d	 t| d	 ƒjf ƒ t d
| d | d f ƒ t d| d | d f ƒ t dt| d ƒ ¡  ƒ t d| j ƒ t d| d | d f ƒ t dt| d ƒ ƒ | jd urž| jd uržt dt| jƒ ¡  ƒ t dt| jƒ ¡  ƒ nt dt| d ƒ ¡  ƒ t ƒ  d S )Nú[CREDHIST ENTRY]zVersion    : 0x%.8x (%d)rÌ   zHashAlgo   : 0x%.8x (%d) (%s)rç   zRounds     : %dr4  zCryptAlgo  : 0x%.8x (%d) (%s)ré   zshaHashLen : 0x%.8x (%d)r9  zntHashLen  : 0x%.8x (%d)r:  zSalt       : %srä   zSID        : %szVersion2   : 0x%.8x (%d)r?  úGuid       : %srÐ   úpwdHash    : %súntHash     : %súData       : %srë   )	rÜ   rH   r0   r   rÝ   rC  r   rD  rE  rÞ   r-   r-   r4   rà   ™  s    $$
zCREDHIST_ENTRY.dumpc                 C   s€   t dƒ t dt| d ƒ ƒ | jd ur/| jd ur/t dt| jƒ ¡  ƒ t dt| jƒ ¡  ƒ nt dt| d ƒ ¡  ƒ t ƒ  d S )NrH  rI  rÐ   rJ  rK  rL  rë   )rÜ   r   rD  rE  r   rÝ   rÞ   r-   r-   r4   Ú	summarize¬  s   
zCREDHIST_ENTRY.summarizer/  )	r>   r?   r@   râ   rî   r  r$  rà   rM  r-   r-   r-   r4   r3  X  s    
r3  c                   @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )ÚCREDHIST_FILEc                 C   sê   i | _ g | _td|d d… ƒd | _td|dd… ƒd | _d}td|| d d … ƒd }|d7 }|dkrst||| d  | … d�}||d 7 }|| j t|d ƒ< | j |¡ td|| d | … ƒd }|d7 }|dks6d S d S )Nú<Lr   r   Ú16srÇ   )rë   rÐ   )Úcredhist_entriesÚcredhist_entries_listr   ÚversionÚcurrent_guidr3  r   Úappend)rß   Úrawr  Únext_lenÚch_entryr-   r-   r4   rî   ·  s   úzCREDHIST_FILE.__init__c                 C   ó   | j |  |¡ d S rí   )rR  r$  )rß   Úentry_indexr%  r-   r-   r4   Údecrypt_entry_by_indexÊ  ó   z$CREDHIST_FILE.decrypt_entry_by_indexc                 C   rY  rí   )rQ  r$  )rß   Úguidr%  r-   r-   r4   Údecrypt_entry_by_guidÍ  r\  z#CREDHIST_FILE.decrypt_entry_by_guidc                 C   sj   |g}t | jƒD ]*\}}|D ]}| |¡ |jd ur nq|jd u r+td| ƒ  d S t|j|jƒ}qd S )NzError decrypting entry #%d)Ú	enumeraterR  r$  rD  rÜ   ÚderiveKeysFromUserkeyrC  )rß   r%  Úkeysr  ÚeÚkr-   r-   r4   r$  Ð  s   

ÿ
õzCREDHIST_FILE.decryptc                 C   ó`   t dƒ t d| j| jf ƒ t dt| jƒ ƒ t ƒ  t| jƒD ]\}}t d| ƒ | ¡  qd S ©Nz[CREDHIST FILE]zVersion        : 0x%.8x (%d)zCurrent Guid   : %sz[Entry #%d])rÜ   rS  r   rT  r_  rR  rà   ©rß   r  rb  r-   r-   r4   rà   ß  ó   
þzCREDHIST_FILE.dumpc                 C   rd  re  )rÜ   rS  r   rT  r_  rR  rM  rf  r-   r-   r4   rM  è  rg  zCREDHIST_FILE.summarizeN)	r>   r?   r@   rî   r[  r^  r$  rà   rM  r-   r-   r-   r4   rN  ¶  s    	rN  c                   @   rÉ   )Ú	DomainKey)rË   )Ú	SecretLenrÍ   )ÚAccessCheckLenrÍ   r@  )Ú_SecretDataz_-SecretDatazself["SecretLen"])Ú
SecretDatarì   )Ú_AccessCheckz_-AccessCheckzself["AccessCheckLen"])ÚAccessCheckrì   c                 C   s–   t dƒ t d| d | d f ƒ t dt| d ƒ ƒ t d| d | d f ƒ t d| d	 | d	 f ƒ t d
t| d ƒ ƒ t dt| d ƒ ƒ t ƒ  d S )Nz[DOMAINKEY]r1  rÌ   r2  rÐ   zSecretLen     : %8x (%d)ri  zAccessCheckLen: %.8x (%d)rj  zSecretData    : %srl  zAccessCheck   : %srn  )rÜ   r   r   rÞ   r-   r-   r4   rà   ü  s   
zDomainKey.dumpNrá   r-   r-   r-   r4   rh  ñ  s    
rh  c                   @   rÉ   )ÚDPAPI_SYSTEM)rË   )Ú
MachineKeyú20s=b"")ÚUserKeyrq  c                 C   s^   t dƒ t d| d | d f ƒ t dt| d ƒ d¡ ƒ t dt| d ƒ d¡ ƒ t ƒ  d S )	Nz[DPAPI_SYSTEM]zVersion    : %8x (%d)rÌ   zMachineKey : 0x%srp  úlatin-1zUserKey    : 0x%srr  )rÜ   r   rÝ   rÞ   r-   r-   r4   rà     s
   
zDPAPI_SYSTEM.dumpNrá   r-   r-   r-   r4   ro    s    ro  c                   @   ó   e Zd ZdZdS )ÚCredentialFile)rË   ©ÚSizerÍ   ©ÚUnknownrÍ   )Ú_Dataú_-Dataúself["Size"]©ÚDatarì   N©r>   r?   r@   râ   r-   r-   r-   r4   ru    ó    ru  c                   @   s*   e Zd ZdZdd„ Zdd„ Zd	dd„ZdS )
Ú
DPAPI_BLOB)rË   )ÚGuidCredentialr;  )ÚMasterKeyVersionrÍ   )ÚGuidMasterKeyr;  rÓ   ©ÚDescriptionLenrÍ   ©Ú_Descriptionú_-Descriptionzself["DescriptionLen"]©ÚDescriptionrì   rè   )ÚCryptAlgoLenrÍ   )ÚSaltLenrÍ   )Ú_Saltz_-Saltzself["SaltLen"])rä   rì   )Ú
HMacKeyLenrÍ   )Ú_HMacKeyz	_-HMacKeyzself["HMacKeyLen"])ÚHMacKeyrì   ræ   )ÚHashAlgoLenrÍ   )ÚHMacrÍ   )Ú_HMacz_-HMaczself["HMac"])r“  rì   )ÚDataLenrÍ   )rz  r{  zself["DataLen"]r}  )ÚSignLenrÍ   )Ú_Signz_-Signzself["SignLen"])ÚSignrì   c                 C   sJ  t dƒ t d| d | d f ƒ t dt| d ƒ ƒ t d| d | d f ƒ t dt| d	 ƒ ƒ t d
| d tt| d ƒf ƒ t d| d  d¡ ƒ t d| d | d t| d ƒjf ƒ t dt| d ƒ ƒ t dt| d ƒ ƒ t d| d | d t| d ƒjf ƒ t dt| d ƒ ƒ t dt| d ƒ ƒ t dt| d ƒ ƒ t ƒ  d S )Nz[BLOB]zVersion          : %8x (%d)rÌ   zGuid Credential  : %sr‚  zMasterKeyVersion : %8x (%d)rƒ  zGuid MasterKey   : %sr„  zFlags            : %8x (%s)rÔ   zDescription      : %sr‹  rÛ   z!CryptAlgo        : %.8x (%d) (%s)ré   zSalt             : %srä   zHMacKey          : %sr‘  z!HashAlgo         : %.8x (%d) (%s)rç   zHMac             : %sr“  zData             : %sr~  zSign             : %sr˜  )rÜ   r   r:   r;   rÝ   rH   r0   r   rÞ   r-   r-   r4   rà   M  s   $$
zDPAPI_BLOB.dumpc                 C   s  dd„ }t |ƒt| d  d kr tj|t| d  d d� ¡ }n|}t |ƒt| d  d k r‚|d	t| d  d  7 }td
d„ t|ƒD ƒd t| d  d … ƒ}tdd„ t|ƒD ƒd t| d  d … ƒ}t| d  d  |¡ ¡ t| d  d  |¡ ¡  }||ƒ}|S )Nc                 S   s¨   ddl m}m} d}tt| ƒƒD ]A}t|| |ƒƒdd …  dd¡}|d d…  d¡d dkr@||tt	|d d… d dƒƒƒ7 }q||tt	|d d… d dƒƒƒ7 }q|S )	Nr   )Ú
indexbytesrú   ró   r   r"   Ú0r!   Ú1)
Úsixr™  rú   rÿ   rý   ÚbinÚrjustr
  r÷   r   )Údeskeyr™  rú   Útempr  Útr-   r-   r4   Ú	fixparity`  s   $$z'DPAPI_BLOB.deriveKey.<locals>.fixparityrç   r   r   )Ú	digestmodré   r   rF  c                 S   ó   g | ]}|d A ‘qS ©é6   r-   ©r/   r  r-   r-   r4   r5   t  ó    z(DPAPI_BLOB.deriveKey.<locals>.<listcomp>c                 S   r¤  ©é\   r-   r§  r-   r-   r4   r5   u  r¨  )rý   r#  r   r  r  rþ   )rß   Ú
sessionKeyr¢  Ú
derivedKeyÚipadÚopadr-   r-   r4   r  _  s    **ÿzDPAPI_BLOB.deriveKeyNc                 C   s  t  |¡ ¡ }t || d t| d  d ¡}|d ur| |¡ | ¡ }|  |¡}t| d  d j|d t| d  d … t| d  d dt| d  d  d	�}t| | d
 ¡t| d  d j	ƒ}| j
dt| ƒt| d ƒ d … }|dt| d  d j	  }	tdd„ t|	ƒD ƒd t| d  d j	… ƒ}
tdd„ t|	ƒD ƒd t| d  d j	… ƒ}t| d  d  |
¡}| | d ¡ t| d  d  |¡}| | ¡ ¡ |d urÖ| |¡ | |¡ t || d t| d  d ¡}|d uró| |¡ | |¡ | ¡ | d k�s
| ¡ | d k�r|S d S )Nrä   rç   r   ré   r   r   rF  r   r   r~  rÇ   r˜  r   c                 S   r¤  r¥  r-   r§  r-   r-   r4   r5   ’  r¨  z&DPAPI_BLOB.decrypt.<locals>.<listcomp>c                 S   r¤  r©  r-   r§  r-   r-   r4   r5   “  r¨  r“  )r   r  r  r   r#  Úupdater  r   r$  Ú
block_sizeÚrawDatarý   rþ   )rß   r%  ÚentropyÚkeyHashr«  r¬  r)  r*  ÚtoSignÚkeyHash2r­  r®  rù   ÚhmacCalculated1ÚhmacCalculated3r-   r-   r4   r$  |  s8   

& ÿ"",,



$zDPAPI_BLOB.decryptrí   )r>   r?   r@   râ   rà   r  r$  r-   r-   r-   r4   r�  %  s
    'r�  c                   @   s.   e Zd ZdZdZdZdZddd„Zd	d
„ ZdS )ÚVAULT_ATTRIBUTE)©ÚIdrÍ   ©ÚUnknown1rÍ   ©ÚUnknown2rÍ   )ÚUnknown3rÍ   ))ÚPadz6s=b""))ÚUnknown5rÍ   )rv  )Ú	IVPresentz<B=?&IVSize©ÚIVSizerÍ   )Ú_IVú_-IVz3self["IVSize"] if self["IVSize"] is not None else 0©ÚIVrì   )rz  r{  zFself["Size"]-self["IVSize"]-5 if self["IVPresent"] else self["Size"]-1r}  Nr   c                 C   s”   t |ƒdkrA|dd … d d… dkr|  j| j7  _td|d d… ƒd dkr/|  j| j7  _t |dd … ƒd	krA|  j| j7  _t | ||¡ d S )
NrÇ   r(   r    s         rO  r   r   éd   r#   )rý   râ   Úpaddingr   Úid100Úextendedr   rî   rð   r-   r-   r4   rî   Ã  s   zVAULT_ATTRIBUTE.__init__c                 C   sz   t d| d  ƒ t| jƒdkr;t d| d  ƒ | d dkr/t d| d	  ƒ t d
t| d ƒ ƒ t dt| d ƒ ƒ d S d S )Nz[ATTRIBUTE %d]rº  é   zSize   : 0x%xrw  rÂ  r   zIVSize : 0x%xrÄ  zIV     : %srÈ  zData   : %sr~  )rÜ   rý   r±  r   rÞ   r-   r-   r4   rà   Î  s   ûzVAULT_ATTRIBUTE.dumpr/  )	r>   r?   r@   râ   rÊ  rË  rÌ  rî   rà   r-   r-   r-   r4   r¸  ª  s    
	r¸  c                   @   rÉ   )ÚVAULT_ATTRIBUTE_MAP_ENTRY)r¹  )ÚOffsetrÍ   r»  c                 C   s   t d| d | d f ƒ d S )Nz[MAP ENTRY %d @ 0x%.8x]rº  rÏ  )rÜ   rÞ   r-   r-   r4   rà   Ý  s   zVAULT_ATTRIBUTE_MAP_ENTRY.dumpNrá   r-   r-   r-   r4   rÎ  ×  s    rÎ  c                   @   ó"   e Zd ZdZddd„Zdd„ ZdS )	Ú
VAULT_VCRD))Ú
SchemaGuidr;  ©ÚUnknown0rÍ   ©ÚLastWrittenrÖ   r»  r½  )ÚFriendlyNameLenrÍ   )ÚFriendlyNameLz_-FriendlyNamezself["FriendlyNameLen"])ÚFriendlyNamerì   )ÚAttributesMapsSizerÍ   )Ú
AttributeLz_-AttributeMapszself["AttributesMapsSize"])ÚAttributeMapsrì   r}  Nr   c                 C   sV  t  | ||¡ |d ur©tƒ | _| d }t| d ttƒ ƒ ƒD ]}t|ƒ}| j |¡ |ttƒ ƒd … }qtƒ | _tt| jƒƒD ]}|dkrY| j | j| d | j|d  d  ¡ q?| j t| j	ƒ| j| d  ¡ tƒ | _
t| jƒD ]\}}t| j	|d d … d | j| … ƒ}| j
 |¡ qs| j	| jd d t| j
d  ¡ ƒ d … | d< d S d S )NrÜ  rÚ  r   rÏ  r   éÿÿÿÿr~  )r   rî   ÚlistÚ
mapEntriesrÿ   rý   rÎ  rU  ÚattributesLenr±  Ú
attributesr_  r¸  ÚgetData)rß   rë   rñ   r  ÚentryÚ	attributer-   r-   r4   rî   ð  s(   (€ $2ézVAULT_VCRD.__init__c                 C   s¦   t dƒ t dt| d ƒ ƒ t dtjt| d ƒtjd� ƒ t d| d  d	¡ ƒ t ƒ  t| j	ƒD ]\}}| 
¡  | j|  
¡  q1t ƒ  t d
t| d ƒ ƒ t ƒ  d S )Nz[VCRD]zSchemaGuid  : %srÒ  úLastWritten : %srÖ  ©ÚtzzFriendlyName: %srÙ  rÛ   zRemaining   : %sr~  )rÜ   r   r   Úfromtimestampr   r   ÚutcrÝ   r_  rß  rà   rá  r   )rß   r  rã  r-   r-   r4   rà     s    
zVAULT_VCRD.dumpr/  ©r>   r?   r@   râ   rî   rà   r-   r-   r-   r4   rÑ  à  s    
rÑ  c                   @   s6   e Zd Zddddddddd	d
dddeffZdd„ ZdS )Ú
VAULT_VPOLrË   r@  r…  r‡  rŠ  )ry  z12s=b""rv  )ÚGuid2r;  )ÚGuid3r;  )ÚKeySizerÍ   )Ú_Blobú_-Blobzself["KeySize"]ÚBlobrì   c                 C   s¸   t dƒ t d| d | d f ƒ t dt| d ƒ ƒ t d| d  d¡ ƒ t d	| d
 | d
 f ƒ t dt| d ƒ ƒ t dt| d ƒ ƒ t d| d | d f ƒ | d  ¡  t ƒ  d S )Nz[VAULT_VPOL]zVersion      : %8x (%d)rÌ   zGuid         : %srÐ   zDescription  : %sr‹  rÛ   zSize         : 0x%.8x (%d)rw  zGuid2        : %srì  zGuid3        : %srí  zKeySize      : 0x%.8x (%d)rî  rñ  )rÜ   r   rÝ   rà   rÞ   r-   r-   r4   rà   (  s   
zVAULT_VPOL.dumpN)r>   r?   r@   r�  râ   rà   r-   r-   r-   r4   rë    s    ôrë  c                   @   rt  )ÚBCRYPT_KEY_DATA_BLOB_HEADER)©ÚdwMagicrÍ   ©Ú	dwVersionrÍ   )Ú	cbKeyDatarÍ   )Ú_bKeyz_-bKeyzself["cbKeyData"])ÚbKeyrì   Nr  r-   r-   r-   r4   rò  5  r€  rò  c                   @   rt  )ÚBCRYPT_KSSM_DATA_BLOB_HEADER))ÚcbLengthrÍ   )Ú
dwKeyMagicrÍ   )Ú
dwUnknown2rÍ   )Ú
dwUnknown3rÍ   )ÚdwKeyBitLenrÍ   )ÚcbKeyLengthrÍ   Nr  r-   r-   r-   r4   rú  ?  r€  rú  c                   @   s.   e Zd ZddddddeffZdZdd
d„ZdS )ÚBCRYPT_KEY_WRAPrv  rË   r½  )Ú	_bKeyBlobú
_-bKeyBlobr|  ÚbKeyBlobrì   )rv  rË   r½  )r  r  zself["Size"]-8)r  rì   Nr   c                 C   sP   t |ƒdkr|dd… dks|dd… dkr| j| _n| j| _t | ||¡ d S )Nr(   r   r   ó   $ó   4)rý   ÚstructureKDBMrâ   ÚstructureKSSMr   rî   rð   r-   r-   r4   rî   _  s
    
zBCRYPT_KEY_WRAP.__init__r/  )r>   r?   r@   rò  r  r  rî   r-   r-   r-   r4   r  P  s    ûr  c                   @   s(   e Zd ZddefddeffZdd„ ZdS )ÚVAULT_VPOL_KEYSÚKey1rì   ÚKey2c                 C   sš   t dƒ | d d dkr&t dƒ t| d d ƒ t dƒ t| d d ƒ d S t d	t| d d d
 ƒ d¡ ƒ t dt| d d d
 ƒ d¡ ƒ t ƒ  d S )Nz[VAULT_VPOL_KEYS]r
  rw  é$   zKey1:r  zKey2:r  z
Key1: 0x%srù  rs  z
Key2: 0x%s)rÜ   r   r   rÝ   rÞ   r-   r-   r4   rà   l  s   ""
zVAULT_VPOL_KEYS.dumpN)r>   r?   r@   r  râ   rà   r-   r-   r-   r4   r	  g  s
    þr	  c                   @   ó    e Zd ZdZdd„ Zdd„ ZdS )ÚVAULT_INTERNET_EXPLORER)rË   ©ÚCountrÍ   rx  ©ÚId1rÍ   )ÚUsernameLenrÍ   )Ú	_Usernameú
_-Usernamezself["UsernameLen"]©ÚUsernamerì   ©ÚId2rÍ   )ÚResourceLenrÍ   )Ú	_Resourcez
_-Resourcezself["ResourceLen"])ÚResourcerì   ©ÚId3rÍ   )ÚPasswordLenrÍ   )Ú	_Passwordz
_-Passwordzself["PasswordLen"])ÚPasswordrì   c                 C   s   t  | |¡ d S rí   )r   Ú
fromString)rß   rë   r-   r-   r4   r"  Œ  s   z"VAULT_INTERNET_EXPLORER.fromStringc                 C   sR   t dƒ t d| d  d¡ ƒ t d| d  d¡ ƒ t dt| d ƒ ƒ t ƒ  d S )	Nz[Internet Explorer]zUsername        : %sr  rÛ   zResource        : %sr  zPassword        : %sr!  )rÜ   rÝ   r   rÞ   r-   r-   r4   rà   �  s
   
zVAULT_INTERNET_EXPLORER.dumpN©r>   r?   r@   râ   r"  rà   r-   r-   r-   r4   r  x  s    r  c                   @   r  )ÚVAULT_WIN_BIO_KEY)rË   r  rx  r  r5  r7  r<  r  ©ÚNameLenrÍ   ©Ú_Namez_-Namezself["NameLen"]©ÚNamerì   r  )Ú	BioKeyLenrÍ   )Ú_BioKeyz_-BioKeyzself["BioKeyLen"])ÚBioKeyrì   c                 C   sB   t  | |¡ |d urtt| d  d¡d d… ƒƒ}|| d< d S d S )Nr-  rÛ   rÝ  )r   r"  rò  r   rÝ   )rß   rë   ÚbioKeyr-   r-   r4   r"  ª  s
   þzVAULT_WIN_BIO_KEY.fromStringc                 C   sb   t dƒ t dtd| d  ƒ ¡  ƒ t d| d  d¡ ƒ t dt| d	 d
 ƒ d¡ ƒ t ƒ  d S )Nz[WINDOWS BIOMETRIC KEY]úSid          : %srA  r=  úFriendly Name: %sr*  rÛ   zBiometric Key: 0x%sr-  rù  rs  )rÜ   r   rB  rÝ   r   rÞ   r-   r-   r4   rà   °  s
   
zVAULT_WIN_BIO_KEY.dumpNr#  r-   r-   r-   r4   r$  –  s    r$  c                   @   rÉ   )ÚNGC_LOCAL_ACCOOUNT)rË   )ÚUnlockKeySizerÍ   rÃ  )ÚCipherTextSizerÍ   )ÚMustBeZeroTestrÍ   )Ú
_UnlockKeyz_-UnlockKeyzself["UnlockKeySize"])Ú	UnlockKeyrì   )rÅ  rÆ  zself["IVSize"]rÇ  )Ú_CipherTextz_-CipherTextzself["CipherTextSize"])Ú
CipherTextrì   c                 C   sH   t dƒ t dt| d ƒ ƒ t dt| d ƒ ƒ t dt| d ƒ ƒ d S )Nz[NGC LOCAL ACCOOUNT]zUnlockKey    : %sr6  zIV           : %srÈ  zCipherText   : %sr8  )rÜ   r   rÞ   r-   r-   r4   rà   Ç  s   zNGC_LOCAL_ACCOOUNT.dumpNrá   r-   r-   r-   r4   r1  ·  s    r1  c                   @   s<   e Zd Zddddddddd	d
ddddddeffZdd„ ZdS )ÚVAULT_NGC_ACCOOUNTrË   r  rx  r  r5  r7  r<  r  r%  r'  r)  r  )ÚBlobLenrÍ   )rñ  rð  zself["BlobLen"]rñ  rì   c                 C   sP   t dƒ t dtd| d  ƒ ¡  ƒ t d| d  d¡ ƒ | d  ¡  t ƒ  d S )	Nz[NGC VAULT]r/  rA  r=  r0  r*  rÛ   rñ  )rÜ   r   rB  rÝ   rà   rÞ   r-   r-   r4   rà   á  s
   
zVAULT_NGC_ACCOOUNT.dumpN)r>   r?   r@   r1  râ   rà   r-   r-   r-   r4   r9  Í  s$    ïr9  )z
WinBio Keyz)NGC Local Accoount Logon Vault CredentialzInternet Explorerc                   @   rÉ   )ÚCREDENTIAL_ATTRIBUTE)rÓ   )ÚKeyWordSizerÍ   )Ú_KeyWordz	_-KeyWordzself["KeyWordSize"])ÚKeyWordrì   )ÚDataSizerÍ   )rz  r{  zself["DataSize"]r}  c                 C   s.   t d| d  d¡ ƒ t dƒ t| d ƒ d S )NzKeyWord : %sr>  rÛ   z
Data    : r~  )rÜ   rÝ   r   rÞ   r-   r-   r4   rà   ü  s   zCREDENTIAL_ATTRIBUTE.dumpNrá   r-   r-   r-   r4   r;  î  s    r;  c                   @   rÐ  )	ÚCREDENTIAL_BLOB)rÓ   rv  rÓ  )ÚTyperÍ   )ÚFlags2rÍ   rÕ  r½  )ÚPersistrÍ   )Ú	AttrCountrÍ   )r¿  rÖ   )Ú
TargetSizerÍ   )Ú_Targetz_-Targetzself["TargetSize"])ÚTargetrì   )ÚTargetAliasSizerÍ   )Ú_TargetAliastz_-TargetAliaszself["TargetAliasSize"])ÚTargetAliasrì   )ÚDescriptionSizerÍ   )rˆ  r‰  zself["DescriptionSize"]rŠ  )ÚUnknownSizerÍ   )Ú_Unknownz	_-Unknownzself["UnknownSize"])ry  rì   )ÚUsernameSizerÍ   )r  r  zself["UsernameSize"]r  )ÚUnknown3SizerÍ   )Ú	_Unknown3z
_-Unknown3zself["Unknown3Size"])r¿  rì   )Ú	Remainingrì   Nr   c                 C   sj   t  | ||¡ d| _|d ur1| d }tƒ | _t| d ƒD ]}t|ƒ}| j |¡ |t|ƒd … }qd S d S )Nr   rQ  rD  )r   rî   rá  rÞ  rÿ   r;  rU  rý   )rß   rë   rñ   Ú	remainingr  Úattrr-   r-   r4   rî   *  s   ùzCREDENTIAL_BLOB.__init__c                 C   s<  t dƒ t dtjt| d ƒtjd� ƒ t d| d tt| d ƒf ƒ t d| d t| d ƒj	f ƒ t d	| d
 t
| d
 ƒj	f ƒ t d| d  d¡ ƒ t d| d  d¡ ƒ t d| d  d¡ ƒ t d| d  d¡ ƒ zt d| d  d¡ ƒ W n tyŽ   t d| d  d¡ ƒ Y nw t ƒ  | jD ]}| ¡  q•d S )Nz[CREDENTIAL]rå  rÖ  ræ  zFlags       : 0x%.8x (%s)rÔ   zPersist     : 0x%.8x (%s)rC  zType        : 0x%.8x (%s)rA  zTarget      : %srG  rÛ   zDescription : %sr‹  zUnknown     : %sry  zUsername    : %sr  r¿  rs  )rÜ   r   rè  r   r   ré  r:   r®   rÂ   r0   r¹   rÝ   ÚUnicodeDecodeErrorrá  rà   )rß   rã  r-   r-   r4   rà   6  s$    ÿ

ÿzCREDENTIAL_BLOB.dumpr/  rê  r-   r-   r-   r4   r@    s    
&r@  rÍ   c                   @   rt  )ÚP_BACKUP_KEY)rË   r}  Nr  r-   r-   r-   r4   rU  K  r€  rU  c                   @   rt  )ÚPREFERRED_BACKUP_KEY)rË   )Ú	KeyLengthrÍ   )ÚCertificateLengthrÍ   r}  Nr  r-   r-   r-   r4   rV  Q  r€  rV  c                   @   rt  )ÚPVK_FILE_HDR)ró  rõ  )Ú	dwKeySpecrÍ   )ÚdwEncryptTyperÍ   )ÚcbEncryptDatarÍ   )ÚcbPvkrÍ   Nr  r-   r-   r-   r4   rY  Y  r€  rY  c                   @   s   e Zd ZddddeffZdS )ÚPUBLICKEYSTRUC)ÚbTypeú<B=0)ÚbVersionr`  )Úreservedz<H=0ÚaiKeyAlgN)r>   r?   r@   ÚALG_IDrâ   r-   r-   r-   r4   r^  c  s    ür^  c                   @   rt  )Ú	RSAPUBKEY))ÚmagicrÍ   )ÚbitlenrÍ   )ÚpubexprÍ   Nr  r-   r-   r-   r4   re  k  r€  re  c                   @   s"   e Zd ZddefddefdfZdS )ÚPUBLIC_KEY_BLOBÚpublickeystrucrì   Ú	rsapubkey©Ú_modulusz	_-modulusú self["rsapubkey"]["bitlen"] // 8N©r>   r?   r@   r^  re  râ   r-   r-   r-   r4   ri  r  s
    ýri  c                   @   s<   e Zd Zddefddefdddddd	d
dddddddfZdS )ÚPRIVATE_KEY_BLOBrj  rì   rk  rl  )Úmodulusrì   )Ú_prime1z_-prime1ú!self["rsapubkey"]["bitlen"] // 16)Úprime1rì   )Ú_prime2z_-prime2rs  )Úprime2rì   )Ú
_exponent1z_-exponent1rs  )Ú	exponent1rì   )Ú
_exponent2z_-exponent2rs  )Ú	exponent2rì   )Ú_coefficientz_-coefficientrs  )Úcoefficientrì   )Ú_privateExponentz_-privateExponentrn  )ÚprivateExponentrì   Nro  r-   r-   r-   r4   rp  y  s$    ðrp  c                   @   s    e Zd ZddefdefdfZdS )ÚSIMPLE_KEY_BLOBrj  rì   Úalgid)Úencryptedkeyrì   N)r>   r?   r@   r^  rd  râ   r-   r-   r-   r4   r  �  s
    ýr  c                   @   rt  )ÚDPAPI_DOMAIN_RSA_MASTER_KEY))ÚcbMasterKeyrÍ   )Ú	cbSuppKeyrÍ   )Úbufferrì   Nr  r-   r-   r-   r4   r‚  ”  r€  r‚  c                 C   sÊ   t | d ddd… ƒ}t | d ddd… ƒ}t | d ddd… ƒ}t | d ddd… ƒ}t | d ddd… ƒ}t | d ddd… ƒ}t | d	 ddd… ƒ}trQt}|| d
 d ƒ}	t ||	|||f¡}
|
S )zK
    parse private key into pkcs#1 format
    :param key:
    :return:
    rq  NrÝ  rt  rv  rx  rz  r|  r~  rk  rh  )r   r   r   r   Ú	construct)r%  rq  rt  rv  Úexp1Úexp2r|  Ú
privateExpÚlongÚpubExpr  r-   r-   r4   Úprivatekeyblob_to_pkcs1›  s   rŒ  c                 C   sÆ   t  t | d¡¡ ¡ | d  d¡t¡ ¡ }t  t | d¡¡ ¡ | d  d¡t¡ ¡ }tdt | d¡¡ ¡ |  d¡dƒ}td||  d¡dƒd d… }t  || d  d¡t¡ ¡ d d… }|||gS )NrÛ   ú Úsha256é'  r   r(   rÇ   )r   r  r   Úencoder  r   r
   )rC  ÚpasswordÚkey1Úkey2ÚtmpKeyÚtmpKey2Úkey3r-   r-   r4   ÚderiveKeysFromUser°  s   ,,$$
r—  c                 C   s¦   t |ƒdkrt || d  d¡t¡ ¡ }|gS t || d  d¡t¡ ¡ }td||  d¡dƒ}td||  d¡dƒd d… }t || d  d¡t¡ ¡ d d… }||gS )NrÇ   r�  rÛ   rŽ  r�  r   r(   )rý   r   r  r�  r   r  r
   )rC  rD  r’  r”  r•  r“  r-   r-   r4   r`  »  s   $r`  )¨Ú
__future__r   r   r  Ústructr   r   r   Úbinasciir   r   r	   Úhashlibr
   ÚCryptodome.Hashr   r   r   r   ÚCryptodome.Cipherr   r   ÚCryptodome.Util.Paddingr   ÚCryptodome.PublicKeyr   ÚCryptodome.Util.numberr   rœ  r   Úimpacket.eser   Úimpacket.structurer   r   Úimpacket.uuidr   Úimpacket.dcerpc.v5.enumr   Úimpacket.dcerpc.v5.dtypesr   ÚALG_CLASS_ANYrU   r�   r`   rI   r^   ÚALG_CLASS_ALLrJ   rY   rV   ra   rl   rq   r‚   r\   rW   ÚALG_SID_RSA_PKCSÚALG_SID_RSA_MSATWORKÚALG_SID_RSA_ENTRUSTÚALG_SID_RSA_PGPrZ   ÚALG_SID_DSS_PKCSÚALG_SID_DSS_DMSr«   rb   rf   rh   ÚALG_SID_IDEAÚALG_SID_CASTÚALG_SID_SAFERSK64ÚALG_SID_SAFERSK128rd   ÚALG_SID_CYLINK_MEKr‘   r™   r›   r�   rŸ   r{   r}   ÚCRYPT_MODE_CBCIÚCRYPT_MODE_CFBPÚCRYPT_MODE_OFBPÚCRYPT_MODE_CBCOFMÚCRYPT_MODE_CBCOFMIrj   rm   ro   rr   rt   rv   rx   r§   rK   rM   rO   rQ   rS   ÚALG_SID_MACÚALG_SID_RIPEMDÚALG_SID_RIPEMD160r   r“   r•   r—   r¡   r£   r¥   rƒ   r…   r‡   r‹   r�   r�   r‰   r©   r:   r;   rH   r®   r¹   rÂ   rR   r.   r”   rg   ÚMODE_CBCr¦   rž   r#  rÊ   rã   r0  r3  rN  rh  ro  ru  r�  r¸  rÎ  rÑ  rë  rò  rú  r  r	  r  r$  r1  r9  ÚVAULT_KNOWN_SCHEMASr;  r@  rd  rU  rV  rY  r^  re  ri  rp  r  r‚  rŒ  r—  r`  r-   r-   r-   r4   Ú<module>   s(  
/

ú	H^; -	8
!ýG
