a
    W×aæ1  ã                   @   sì   d 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 ddlmZ dd	lmZ dd
lmZ ddlmZ ddlZddlZddlZddlmZ ddlZddlmZ dZe dd¡ZdZdd„ Z dd„ Z!G dd„ deƒZ"dS )zI
Base class for tests for source4/dsdb/samdb/ldb_modules/password_hash.c
é    )ÚCredentials)ÚSamDB)Úsystem_session)ÚTestCase)Ú
ndr_unpack)Údrsblobs)ÚDOMAIN_PASSWORD_STORE_CLEARTEXT)Ú"UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED)Údelete_force)ÚPasswordCommonN)Úmd5)Ú	text_typeZPasswordHashTestUseré    zPWHash@User.Principlec                 C   s@   | d u rd S d}| j jD ]"}|d7 }||jkr||f  S qd S )Nr   é   )ÚsubZpackagesÚname)Úscr   ÚidxÚp© r   ú;/usr/lib/python3/dist-packages/samba/tests/password_hash.pyÚget_package2   s    
r   c                 C   s.   d| ||f }t |tƒr"| d¡}t|ƒ ¡ S )Nz%s:%s:%sÚutf8)Ú
isinstancer   Úencoder   Z	hexdigest)ÚuserÚrealmÚpasswordÚdatar   r   r   Úcalc_digestB   s    

r   c                       sV   e Zd Z‡ fdd„Zdd„ Zddd„Zd	d
„ Zdd„ Zdd„ Zdd„ Z	dd„ Z
‡  ZS )ÚPassWordHashTestsc                    s   t j ¡ | _tt| ƒ ¡  d S ©N)ÚsambaZtestsZenv_loadparmÚlpÚsuperr    ÚsetUp)Úself©Ú	__class__r   r   r%   M   s    zPassWordHashTests.setUpc                 C   s>   | j  ¡ }t|ƒ}|r |tO }n
|t M }| j  t|ƒ¡ d S r!   )ÚldbÚget_pwdPropertiesÚintr   Úset_pwdPropertiesÚstr)r&   Z	cleartextÚpwdPropertiesZpropsr   r   r   Úset_store_cleartextQ   s    


z%PassWordHashTests.set_store_cleartextNFc              	   C   sh  |d ur$|D ]\}}| j  ||¡ q|d u rjtƒ | _tƒ | _| j | j ¡ tƒ | _t| j| j| j d| _n|| _| jj	| j 
¡ d| j ¡  dgd}t|d d d ƒ| _| j ¡ | _| j ¡ }| j 
¡  ¡ }t | | j¡ | j ¡ | _d}	|r| j ¡ }
|  | jj|
¡ |  |¡ |	tO }	t| jdt d | j ƒ | j dt d | j dtttt|	ƒd	œ¡ d S )
N)Zsession_infoZcredentialsr#   z	ncName=%sZnETBIOSName)ÚbaseZ
expressionÚattrsr   úcn=ú
,cn=users,r   )ZdnZobjectclassZsAMAccountNameZuserPasswordZuserPrincipalNameZuserAccountControl)r#   Úsetr   Úcredsr   ZsessionZguessr   r)   ÚsearchZget_config_basednZget_default_basednr-   Únetbios_domainZdomain_dns_nameÚ
dns_domainZ	domain_dnZget_linearizedr   Zallow_password_changesÚbase_dnr*   Z
addCleanupr,   r/   r	   r
   Ú	USER_NAMEÚaddÚ	USER_PASSÚUPN)r&   ZoptionsZ
clear_textr)   ZoptionÚvalueÚresr9   Zconfiguration_dnZaccount_controlr.   r   r   r   Úadd_user^   sL    þ
þ


úzPassWordHashTests.add_userc                 C   s`   dt  d | j }| jjtj|dgd}|  dt|ƒdk¡ |d }|d d }ttj	|ƒ}|S )Nr2   r3   ZsupplementalCredentials)Zscoper0   r1   Tr   )
r:   r9   r)   r6   Z
SCOPE_BASEZassertIsÚlenr   r   ZsupplementalCredentialsBlob)r&   r0   r?   ÚobjZsc_blobr   r   r   r   Úget_supplemental_creds–   s    
þz(PassWordHashTests.get_supplemental_credsc                 C   sD   t |||ƒ}t t|ƒ¡ d¡}d|||||f }|  |||¡ d S )Nr   z>Digest expected[%s], actual[%s], user[%s], realm[%s], pass[%s])r   ÚbinasciiZhexlifyÚ	bytearrayÚdecodeÚassertEqual)r&   r   r   r   ZdigestÚexpectedÚactualÚerrorr   r   r   Úcheck_digest¢   s    þzPassWordHashTests.check_digestc                 C   sÂ  |   d|j¡ |  t| jt|jd j¡ |  t ¡ | j ¡ t|jd j¡ |  t 	¡ | j 	¡ t|jd j¡ |  t| j 	¡ t|jd j¡ |  t| j ¡ t|jd j¡ |  t 	¡ | j ¡ t|jd j¡ |  t ¡ | j 	¡ t|jd j¡ |  t| j
t|jd	 j¡ |  t ¡ | j
 ¡ t|jd
 j¡ |  t 	¡ | j
 	¡ t|jd j¡ |  t| j
 	¡ t|jd j¡ |  t| j
 ¡ t|jd j¡ |  t 	¡ | j
 ¡ t|jd j¡ |  t ¡ | j
 	¡ t|jd j¡ |  tdt|jd j¡ |  t ¡ dt|jd j¡ |  t 	¡ dt|jd j¡ d| jtf }|  |dt|jd j¡ d| j ¡ t ¡ f }|  |dt|jd j¡ d| j 	¡ t 	¡ f }|  |dt|jd j¡ |  tdt|jd j¡ |  t ¡ dt|jd j¡ |  t 	¡ dt|jd j¡ |  tdt|jd j¡ |  t ¡ dt|jd j¡ |  t 	¡ dt|jd j¡ d| jtf }|  |dt|jd j¡ d| j ¡ t ¡ f }|  |dt|jd  j¡ d| j 	¡ t 	¡ f }|  |dt|jd! j¡ d S )"Né   r   r   é   é   é   é   é   é   é   é	   é
   é   é   é   Ú é   é   é   z%s\%sé   é   é   ZDigesté   é   é   é   é   é   é   é   é   )rG   Ú
num_hashesrK   r:   r7   r<   ÚhashesÚhashÚlowerÚupperr8   r=   )r&   Zdigestsr   r   r   r   Úcheck_wdigests¬   s0   
ý

ý

ý
ý
ý

ý

ý
ý

ý

ý
ý
ý

ý

ý
ý

ý

ý
ý
ý
ý
ý

ý

ý
ý

ý

ý
ý
ý
ýz PassWordHashTests.check_wdigestsc           	      C   sÀ   |   t|ƒ|j¡ d}|D ] \}}}|   ||j| j¡ |j| j d¡ d¡}|   ||d ¡ |d u rzd||d f }nd|||d f }t t	|¡}|   ||j| j d¡¡ |d7 }qd S )	Nr   r   ú$r   z$%s$%srM   z$%s$rounds=%d$%srN   )
rG   rA   ri   rj   Zschemer>   rF   ÚsplitÚcryptr<   )	r&   ZuprH   ÚiÚtagZalgÚroundsr   Úcmdr   r   r   ÚcheckUserPassword2  s    z#PassWordHashTests.checkUserPasswordc                 C   s8   t ƒ }| ¡  | |¡ | ¡ }t|ƒ}|  ||¡ d S r!   )r   Zset_anonymousZset_passwordZget_nt_hashrE   rG   )r&   r   Znt_hashr5   rH   rI   r   r   r   ÚcheckNtHashJ  s    
zPassWordHashTests.checkNtHash)NFN)Ú__name__Ú
__module__Ú__qualname__r%   r/   r@   rC   rK   rn   rv   rw   Ú__classcell__r   r   r'   r   r    K   s   
8
 r    )#Ú__doc__Zsamba.credentialsr   Zsamba.samdbr   Z
samba.authr   Zsamba.testsr   Z	samba.ndrr   Zsamba.dcerpcr   Zsamba.dcerpc.samrr   Z
samba.dsdbr	   r
   Zsamba.tests.password_testr   r)   r"   rD   Zhashlibr   rq   Zsamba.compatr   r:   Zgenerate_random_passwordr<   r=   r   r   r    r   r   r   r   Ú<module>   s,   	