U
    La}                     @   s*  d Z ddlmZ ddlZddlZddlmZ ddlZddlm	Z	m
Z
 ddlmZmZ ddlmZmZmZ ddlm  mZ ddlmZmZ dd	lmZ eeZd
d ZG dd deZG dd deZG dd deZ G dd dej!Z"G dd dej#ej$Z%edZ&G dd deZ'G dd deZ(dS )z>tests for passlib.hash -- (c) Assurance Technologies 2003-2009    )with_statementN)	getLogger)ldap_md5sha256_crypt)MissingBackendErrorPasslibHashWarning)str_to_uasciiuascii_to_strunicode)HandlerCaseTestCase)uc                    s    fddt |S )z1generate all strings of given size using alphabetc                 3   sD   | dk r D ]
}|V  qn& D ] }| d D ]}|| V  q.qd S )N       )sizechartailalphabethelperr   E/tmp/pip-unpacked-wheel-8v2dfbvt/passlib/tests/test_utils_handlers.pyr      s    
z_makelang.<locals>.helper)set)r   r   r   r   r   	_makelang   s    r   c                   @   sp   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd ZdS )SkeletonTestztest hash support classesc                    s  G  fdddt j |  td |  d |  td |  td |  d |  td |  td	 |  td
 | t jd | t jd |  	  
d |  dd |  dtd |  dd |  dtd |  jdddd | t jdd | t jdtd |  
dd |  j
dddd dS )ztest StaticHandler classc                       sD   e Zd ZdZdZedZedZdZd fdd	Z	d	d
 Z
  ZS )z/SkeletonTest.test_00_static_handler.<locals>.d1d1flag_abr   Fc                    s   t | jf | || _d S N)super__init__r   )selfr   kwds)	__class__r   r   r   r"   9   s    z8SkeletonTest.test_00_static_handler.<locals>.d1.__init__c                 S   s   | j rtdS tdS )Nba)r   r   r#   secretr   r   r   _calc_checksum=   s    z>SkeletonTest.test_00_static_handler.<locals>.d1._calc_checksum)F)__name__
__module____qualname__nameZcontext_kwdsr   Z_hash_prefixchecksum_charschecksum_sizer"   r*   __classcell__r   r   )r%   r   r   2   s   r   Z_as   _a_bZ_cs   _cr'   r&   cNr    ss   _bTr   )uhStaticHandler
assertTrueidentifyr   assertFalseassertRaises	TypeErrorassertEqual	genconfighashverify
ValueErrorr#   r   r2   r   test_00_static_handler/   s*    z#SkeletonTest.test_00_static_handlerc              	   C   sz   G dd dt j}| d |d}W 5 Q R X | |d | |d| | |d| |`| 	t
|jd dS )ztest StaticHandler legacy attrc                   @   s4   e Zd ZdZedd Zedd Zedd ZdS )	z3SkeletonTest.test_01_calc_checksum_hack.<locals>.d1r   c                 S   s>   |rt |dkrdS zt|d W n tk
r8   Y dS X dS )N(   F   T)lenintrB   clsr@   r   r   r   r:   f   s    z<SkeletonTest.test_01_calc_checksum_hack.<locals>.d1.identifyc                 S   sP   |d krt dt|tr$|d}|d k	r>| |s>tdtd|  S )Nzno secret providedutf-8zinvalid hashs   xyz)	r=   
isinstancer
   encoder:   rB   hashlibsha1	hexdigestrJ   r)   r@   r   r   r   genhashp   s    

z;SkeletonTest.test_01_calc_checksum_hack.<locals>.d1.genhashc                 S   s$   |d krt d| ||| kS )Nzno hash specified)rB   rR   lowerrQ   r   r   r   rA   {   s    z:SkeletonTest.test_01_calc_checksum_hack.<locals>.d1.verifyN)r+   r,   r-   r.   classmethodr:   rR   rA   r   r   r   r   r   c   s   
	

r   z%d1.*should be updated.*_calc_checksumtestZ(7c622762588a0e5cc786ad0a143156f9fd38eea3ZxtestN)r7   r8   assertWarningListr@   r>   r9   rA   r;   rR   r<   NotImplementedError)r#   r   r@   r   r   r   test_01_calc_checksum_hack]   s    z'SkeletonTest.test_01_calc_checksum_hackc                 C   s  G dd dt j}| t|jd | t|jd | |d | |d | |d tt	d|_
| t|jd | t|jd | |d	 | |d |`
t	d
|_| t|jd | t|jd | |d | |d |`dS )ztest GenericHandler.identify()c                   @   s   e Zd Zedd ZdS )z)SkeletonTest.test_10_identify.<locals>.d1c                 S   s2   t |tr|d}|tdkr*| |dS td S )Nasciir'   checksum)rL   bytesdecoder   rB   rI   r   r   r   from_string   s
    


z5SkeletonTest.test_10_identify.<locals>.d1.from_stringN)r+   r,   r-   rT   r^   r   r   r   r   r      s   r   Nr   r5   r'   r&   z@.z@a!z!a)r7   GenericHandlerr<   r=   r:   r;   r9   recompiler   _hash_regexident)r#   r   r   r   r   test_10_identify   s$    
zSkeletonTest.test_10_identifyc                    s   G dd dt j d fdd	}| t|td | |tdtd | |tdtd | t|td	 | t|td
 | t|d |   jtd dS )z%test GenericHandler checksum handlingc                   @   s   e Zd ZdZdZedZdS )z.SkeletonTest.test_11_norm_checksum.<locals>.d1r      xzN)r+   r,   r-   r.   r0   r   r/   r   r   r   r   r      s   r   Nc                    s    f d| i|j S )Nr[   rZ   )r[   kr2   r   r   norm_checksum   s    z9SkeletonTest.test_11_norm_checksum.<locals>.norm_checksumxxxZxxxxZxzxzZxxxxxxxyxs   xxyx)N)r7   r`   r<   rB   r   r>   r=   _stub_checksumr#   ri   r   r2   r   test_11_norm_checksum   s    	z"SkeletonTest.test_11_norm_checksumc                    sX   G dd dt jt j  fdd}| |dd | t|td |   jd dS )	z*test GenericHandler + HasRawChecksum mixinc                   @   s   e Zd ZdZdZdS )z2SkeletonTest.test_12_norm_checksum_raw.<locals>.d1r   rf   N)r+   r,   r-   r.   r0   r   r   r   r   r      s   r   c                     s    | |j S r    rZ   )r'   rh   r2   r   r   ri      s    z=SkeletonTest.test_12_norm_checksum_raw.<locals>.norm_checksums   1234rk   s       N)r7   ZHasRawChecksumr`   r>   r<   r=   r   rl   rm   r   r2   r   test_12_norm_checksum_raw   s
    z&SkeletonTest.test_12_norm_checksum_rawc              	      s  G dd dt jt j  fdd} fdd}tdd}tdd	}tdd
}| t| | jt|dd | |dd| tjdd}| jt	|dd | jt	|dd | 
| | |ddd | |ddd | |ddd | 
| | jt	|dd | 
| W 5 Q R X tjdd}| t	|d | t	|d | 
| | |d| | |d	| | |d
| | 
| | t	|d | 
| | |ddd| | 
|dg W 5 Q R X  `| g . | t|dd	 | t|dd W 5 Q R X dS )z#test GenericHandler + HasSalt mixinc                   @   s$   e Zd ZdZdZdZdZdZdZdS )z*SkeletonTest.test_20_norm_salt.<locals>.d1r   saltr   rf      r   N)	r+   r,   r-   r.   setting_kwdsmin_salt_sizemax_salt_sizeZdefault_salt_size
salt_charsr   r   r   r   r      s   r   c                     s    f | j S r    rp   rh   r2   r   r   	norm_salt   s    z1SkeletonTest.test_20_norm_salt.<locals>.norm_saltc                    s    j f d| i|ddjS )NZ	salt_sizeTZuse_defaults)Zusingrq   )szrh   r2   r   r   gen_salt   s    z0SkeletonTest.test_20_norm_salt.<locals>.gen_saltr   r   rr   rf   Nrp   Try   recordr5   r'   ZabaZabbaZaaaabbr   r      )Zrelaxedzsalt_size.*above max_salt_size)r7   HasSaltr`   r   r<   r=   ZassertInwarningscatch_warningsrB   consumeWarningListr>   ru   rV   rG   )r#   rx   r{   Zsalts2Zsalts3Zsalts4wlogr   r2   r   test_20_norm_salt   sF    







zSkeletonTest.test_20_norm_saltc              	      s  G dd dt jt j  fdd}| t| | jt|dd | |ddd	 | jt|d
d tjddz}| jt|dd | 	| | |ddd | |d	dd	 | |ddd | 	| | jt|dd | 	| W 5 Q R X d _
| jt|dd dS )z%test GenericHandler + HasRounds mixinc                   @   s    e Zd ZdZdZdZdZdZdS )z,SkeletonTest.test_30_init_rounds.<locals>.d1r   roundsr   rr   r   N)r+   r,   r-   r.   rs   Z
min_rounds
max_roundsdefault_roundsr   r   r   r   r   8  s
   r   c                     s    f | j S r    r   rw   r2   r   r   norm_rounds@  s    z5SkeletonTest.test_30_init_rounds.<locals>.norm_roundsNr   Try   r   g      ?r|   r   r   rr   rf   )r7   Z	HasRoundsr`   r<   r=   r>   r   r   rB   r   r   )r#   r   r   r   r2   r   test_30_init_rounds5  s"    

z SkeletonTest.test_30_init_roundsc                 C   sR  G dd dt jt j}| t|j | t|j | t|jd | t|jd | |  d|_	| }| 
|dd |d |d | 
|dd | t|jd | |d | |d d|_| |  |d | 
|dd | t|jd	 | t|jd	 |d G d
d d|}| t|jd dS )z+test GenericHandler + HasManyBackends mixinc                   @   sH   e Zd ZdZdZdZdZdZedd Z	edd Z
d	d
 Zdd ZdS )z)SkeletonTest.test_40_backends.<locals>.d1r   r   r'   r&   Fc                 S   s   | j r| | j dS dS d S NTF)	_enable_a_set_calc_checksum_backend_calc_checksum_arJ   r   r   r   _load_backend_aj  s    z9SkeletonTest.test_40_backends.<locals>.d1._load_backend_ac                 S   s   | j r| | j dS dS d S r   )	_enable_br   _calc_checksum_br   r   r   r   _load_backend_br  s    z9SkeletonTest.test_40_backends.<locals>.d1._load_backend_bc                 S   s   dS Nr'   r   r(   r   r   r   r   z  s    z:SkeletonTest.test_40_backends.<locals>.d1._calc_checksum_ac                 S   s   dS Nr&   r   r(   r   r   r   r   }  s    z:SkeletonTest.test_40_backends.<locals>.d1._calc_checksum_bN)r+   r,   r-   r.   rs   backendsr   r   rT   r   r   r   r   r   r   r   r   r   a  s   

r   anydefaultTr6   r&   r'   r4   c                   @   s   e Zd ZdZdS )z)SkeletonTest.test_40_backends.<locals>.d2TN)r+   r,   r-   _has_backend_ar   r   r   r   d2  s   r   N)r7   HasManyBackendsr`   r<   r   get_backendset_backendr;   has_backendr   r>   r*   r9   r   rB   AssertionError)r#   r   objr   r   r   r   test_40_backends_  s0     



zSkeletonTest.test_40_backendsc                 C   s8  t jdtdd G dd dtjtj}| t|j | t|j	 | t|j	d | t|j	d | 
|  d|_| }| |d	d
 |	d
 |	d | |d	d
 | t|j	d | |d
 | 
|d d|_| |  |	d | |d	d | t|j	d | t|jd dS )z<test GenericHandler + HasManyBackends mixin (deprecated api)ignorez0.* support for \._has_backend_.* is deprecated.*)categorymessagec                   @   s0   e Zd ZdZdZdZdZdZdd Zdd Z	d	S )
z)SkeletonTest.test_41_backends.<locals>.d1r   r   r   Fc                 S   s   dS r   r   r(   r   r   r   r     s    z:SkeletonTest.test_41_backends.<locals>.d1._calc_checksum_ac                 S   s   dS r   r   r(   r   r   r   r     s    z:SkeletonTest.test_41_backends.<locals>.d1._calc_checksum_bN)
r+   r,   r-   r.   rs   r   r   _has_backend_br   r   r   r   r   r   r     s   r   r   r   Tr6   r&   r'   r4   N)r   filterwarningsDeprecationWarningr7   r   r`   r<   r   r   r   r;   r   r   r>   r*   r9   r   rB   )r#   r   r   r   r   r   test_41_backends  s2    


zSkeletonTest.test_41_backendsc                    sh  G dd dt jt j  fdd}| t| | jt|dd | |ddtd	 | |td	dtd	 | |td
dtd
 | jt|tdd | |tddtd	 | jt|tdd |  	td |  	td | 
 	td | 
 	td | 
 	td | t j	d | t j	d d _| jt|dd dS )z#test GenericHandler + HasManyIdentsc                   @   s<   e Zd ZdZdZedZededfZedediZdS )z+SkeletonTest.test_50_norm_ident.<locals>.d1r   rd   !A!BAN)	r+   r,   r-   r.   rs   r   default_identident_valuesZident_aliasesr   r   r   r   r     s
   r   c                     s    f | j S r    r   rw   r2   r   r   
norm_ident  s    z3SkeletonTest.test_50_norm_ident.<locals>.norm_identNr   Try   r   r   z!Cr   Bz!Axxxz!Bxxxz!Cxxxr5   r   )r7   ZHasManyIdentsr`   r<   r=   r>   r   rB   r9   r:   r;   r   r   )r#   r   r   r2   r   test_50_norm_ident  s&    zSkeletonTest.test_50_norm_identc              	   C   sB  ddl m} |jd}| |tdtdd d}td}td	}|j|}| |t|d
d|d |jj|dd}| |t|d
dd |jj|dd}| |td
dtdtdd |jd}| |ttdtddd d}|j|}| |tdddd |jj|dd}| |ttddtdd d S )!ztest parsehash()r   r@   ZOgAwTx2l6NADIZAwTx2l6NADIZOgr[   rq   z?$5$LKO/Ute40T3FNF95$U0prpBQd4PloSGU0pnpM4z9wKn4vZ1.jsrzQfPqxph9zLKO/Ute40T3FNF95z+U0prpBQd4PloSGU0pnpM4z9wKn4vZ1.jsrzQfPqxph9i  T)rq   r   implicit_roundsr[   FrZ   )rq   r   r   )sanitizezLK**************z+U0pr***************************************)r   r   rq   r[   zL$5$rounds=10428$uy/jIAhCetNCTtb0$YWvUOXbkqlqhyoPMpN8BMe.ZGsGx2aBvxTvDFI613c3z+YWvUOXbkqlqhyoPMpN8BMe.ZGsGx2aBvxTvDFI613c3zuy/jIAhCetNCTtb0i(  )r[   rq   r   z@$pbkdf2$60000$DoEwpvQeA8B4T.k951yLUQ$O26Y3/NJEiLCVaOVPxGXshyjW8ks   ;nI"U?[i`  s   0xO=\Qr[   r   rq   zO26************************zDo********************N)	passlibr@   	des_cryptZ	parsehashr>   r   r   dictpbkdf2_sha1)r#   r@   resulthr6   r4   h1r   r   r   test_91_parsehash  sJ     zSkeletonTest.test_91_parsehashc                 C   s   ddl m} | |j ddd | |j ddd | |jdd	 | |j d
ddd | |jdd | |j dddd dS )ztest bitsize()r   r   B      r         r   i   i     `   r   i            N)	r   r@   r>   r   ZbitsizeZbcryptZ	patchAttrr   r   r#   r@   r   r   r   test_92_bitsizeJ  s    

zSkeletonTest.test_92_bitsizeN)r+   r,   r-   __doc__rD   rX   re   rn   ro   r   r   r   r   r   r   r   r   r   r   r   r   )   s   .3#$I*K:.8r   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	dummy_handler_in_registryz6context manager that inserts dummy handler in registryc                 C   s(   || _ td| tjft|dd| _d S )NZdummy_r   )r.   rs   )r.   typer7   r`   r   dummy)r#   r.   r   r   r   r"   p  s
    z"dummy_handler_in_registry.__init__c                 C   sD   ddl m} |j| jdd || j || j| jks>t| jS Nr   )registryF)	locations)r   r   _unload_handler_namer.   Zregister_crypt_handlerr   Zget_crypt_handlerr   )r#   r   r   r   r   	__enter__w  s
    z#dummy_handler_in_registry.__enter__c                 G   s    ddl m} |j| jdd d S r   )r   r   r   r.   )r#   exc_infor   r   r   r   __exit__~  s    z"dummy_handler_in_registry.__exit__N)r+   r,   r-   r   r"   r   r   r   r   r   r   r   n  s   r   c                   @   sP   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd ZdS )PrefixWrapperTestztest PrefixWrapper classc              	   C   sr   t jdddddd}| |jd | |jd | |jt | |jt td}| |jt W 5 Q R X dS )z*test PrefixWrapper lazy loading of handlerr   r   {XXX}{MD5}T)ZlazyN)	r7   PrefixWrapperr>   _wrapped_nameassertIs_wrapped_handlerwrappedr   r   r#   r   r   r   r   r   test_00_lazy_loading  s    
z&PrefixWrapperTest.test_00_lazy_loadingc              	   C   s`   t dddd}| |jd | |jt | |jt td}| |jt W 5 Q R X dS )z,test PrefixWrapper active loading of handlerr   r   r   r   N)	r7   r   r>   r   r   r   r   r   r   r   r   r   r   test_01_active_loading  s    
z(PrefixWrapperTest.test_01_active_loadingc              	   C   s`   t dtdd}| |jd | |jt | |jt td}| |jt W 5 Q R X dS )z4test PrefixWrapper with explicitly specified handlerr   r   r   Nr   )	r7   r   r   r>   r   r   r   r   r   r   r   r   r   test_02_explicit  s    
z"PrefixWrapperTest.test_02_explicitc                 C   st   t dddd}| |jd | |jtj | dt|k t ddd}| |jt	j | 
dt|k d S )Nr   r   r   r   r   r   r   )r7   r   r>   r.   r   rs   r   r;   dirr   r9   )r#   r   r   r   r   r   test_10_wrapped_attributes  s    z,PrefixWrapperTest.test_10_wrapped_attributesc                 C   s   t dddd}d}d}| | d | t|jdd  | |d|| | t|jd| | |d| | 	|
| | |
| | t|jd| | 	|d| d S )	Nr   r   r   r   z{XXX}X03MO1qnZdYdgyfeuILPmQ==z{MD5}X03MO1qnZdYdgyfeuILPmQ==z{XXX}1B2M2Y8AsgTpgAmY7PhCfg==password)r7   r   r>   r?   r<   r=   rR   rB   r@   r9   r:   r;   rA   )r#   r   ZdphZlphr   r   r   test_11_wrapped_methods  s    z)PrefixWrapperTest.test_11_wrapped_methodsc              	   C   s  t ddd}| |jtd | |jd  t ddd}| |jd  | |jd  t dddd}| |jd  | |jd  t jdddd	d
}| |jtd	 | |jd  t jddddd
}| jtt jddddd
 | jtt jddddd
 t ddd}| |jd  | |jtdtdf t jddddd
}| |jtd | |jd  | jtt jdddd
 | 	d t jddddd}W 5 Q R X | |jd  | |jd  d S )Nh2r   r   z
{XXX}{MD5}r   r   r   h3z{Xr   z{XXX}Az{XYz{XXXXh4Zphpassz{XXX}$P$z{XXX}$H$h5Th6z#orig_prefix.*may not work correctlyZh7$?)orig_prefixprefix)
r7   r   r>   rd   r   r   r   r<   rB   rV   r#   r   r   r   r   test_12_ident  s@      zPrefixWrapperTest.test_12_identc                 C   s&   t jddddd}| t|d dS )ztest repr()r   	md5_cryptr   z$1$r   z(?x)^PrefixWrapper\(
                ['"]h2['"],\s+
                ['"]md5_crypt['"],\s+
                prefix=u?["']{XXX}['"],\s+
                orig_prefix=u?["']\$1\$['"]
            \)$N)r7   r   assertRegexreprr   r   r   r   test_13_repr  s    
zPrefixWrapperTest.test_13_reprc                 C   s$   t jdddd}| t|jd dS )ztest orig_prefix sanity checkr   r   z$6$r   rU   N)r7   r   r<   rB   r@   r   r   r   r   test_14_bad_hash  s    z"PrefixWrapperTest.test_14_bad_hashN)r+   r,   r-   r   r   r   r   r   r   r   r   r   r   r   r   r   r     s   
/r   c                   @   s&   e Zd ZdZdZejZdZdd Z	dS )UnsaltedHashz!test algorithm which lacks a saltZunsalted_test_hashrE   c                 C   s.   t |tr|d}d| }tt| S )NrK   s   boblious)rL   r
   rM   r   rN   rO   rP   r#   r)   datar   r   r   r*     s    

zUnsaltedHash._calc_checksumN)
r+   r,   r-   r   r.   r7   LOWER_HEX_CHARSr/   r0   r*   r   r   r   r   r     s
   r   c                   @   sX   e Zd ZdZdZdZdZdZdZe	j
 ZZeedZedd	 Zd
d Zdd ZdS )
SaltedHashztest algorithm with a saltZsalted_test_hashrp   r   rf   rE   z^@salt[0-9a-f]{42,44}$c                 C   sF   |  |stj| t|tr*|d}| |dd |dd  dS )NrY   r~   i)rq   r[   )r:   r7   excZInvalidHashErrorrL   r\   r]   rI   r   r   r   r^   0  s
    


zSaltedHash.from_stringc                 C   s   t d| j| jf }t|S )Nz	@salt%s%s)r   rq   r[   r	   r   r   r   r   	to_string8  s    zSaltedHash.to_stringc                 C   sB   t |tr|d}| jd| | jd }tt| S )NrK   rY   )rL   r
   rM   rq   r   rN   rO   rP   r   r   r   r   r*   <  s    

zSaltedHash._calc_checksumN)r+   r,   r-   r   r.   rs   rt   ru   r0   r7   r   rv   r/   ra   rb   r   rc   rT   r^   r   r*   r   r   r   r   r   $  s   

r   u   Ιωαννηςc                   @   s$   e Zd ZeZdedfgZdd ZdS )UnsaltedHashTest)r   Z(61cfd32684c47de231f1f982c214e884133762c0Z(96b329d120b97ff81ada770042e44ba87343ad2bc                 C   s&   | j ttdd | j ttjdd d S )Nxrp   r   r   )r<   r=   r   r?   rC   r   r   r   test_bad_kwdsS  s    zUnsaltedHashTest.test_bad_kwdsN)r+   r,   r-   r   handler
UPASS_TEMPknown_correct_hashesr   r   r   r   r   r   K  s
   r   c                   @   s$   e Zd ZeZdedfgZdd ZdS )SaltedHashTest)r   z/@salt77d71f8fe74f314dac946766c1ac4a2a58365482c0z1@salt9f978a9bfe360d069b0c13f2afecd570447407fa7e48c                 C   s4   t ddj}| jtt |d d | jtt |dd d S )NTry   r   rj   )r   rl   r<   r=   rB   )r#   Zstubr   r   r   r   _  s    zSaltedHashTest.test_bad_kwdsN)r+   r,   r-   r   r  r  r  r   r   r   r   r   r  W  s
   r  ))r   
__future__r   ra   rN   loggingr   r   Zpasslib.hashr   r   Zpasslib.excr   r   Zpasslib.utils.compatr   r	   r
   Zpasslib.utils.handlersutilshandlersr7   Zpasslib.tests.utilsr   r   r   r+   logr   r   objectr   r   r8   r   r   r`   r   r  r   r  r   r   r   r   <module>   s4       I %