U
    ø¹Öh†}  ã                   @   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   úG./venv/lib/python3.8/site-packages/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   _aZ_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ÚintrA   ©Úclsr?   r   r   r   r9   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
   Úencoder9   rA   ÚhashlibÚsha1Ú	hexdigest©rI   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)rA   rQ   ÚlowerrP   r   r   r   r@   {   s    z:SkeletonTest.test_01_calc_checksum_hack.<locals>.d1.verifyN)r+   r,   r-   r.   Úclassmethodr9   rQ   r@   r   r   r   r   r   c   s   
	

r   z%d1.*should be updated.*_calc_checksumÚtestZ(7c622762588a0e5cc786ad0a143156f9fd38eea3ZxtestN)r6   r7   ÚassertWarningListr?   r=   r8   r@   r:   rQ   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)rK   ÚbytesÚdecoder   rA   rH   r   r   r   Úfrom_string“   s
    


z5SkeletonTest.test_10_identify.<locals>.d1.from_stringN)r+   r,   r-   rS   r]   r   r   r   r   r   ’   s   r   Nr   r4   r'   r&   z@.z@aú!z!a)r6   ÚGenericHandlerr;   r<   r9   r:   r8   Ú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 )NrZ   rY   )rZ   Úkr2   r   r   Únorm_checksum»   s    z9SkeletonTest.test_11_norm_checksum.<locals>.norm_checksumÚxxxZxxxxZxzxzZxxxxxÚxxyxs   xxyx)N)r6   r_   r;   rA   r   r=   r<   Ú_stub_checksum©r#   rh   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   re   N)r+   r,   r-   r.   r0   r   r   r   r   r   Ù   s   r   c                     s   ˆ | |Žj S r    rY   )r'   rg   r2   r   r   rh   Ý   s    z=SkeletonTest.test_12_norm_checksum_raw.<locals>.norm_checksums   1234rj   s       N)r6   ZHasRawChecksumr_   r=   r;   r<   r   rk   rl   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   re   é   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    ro   ©rg   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usingrp   )Zszrg   r2   r   r   Úgen_saltú   s    z0SkeletonTest.test_20_norm_salt.<locals>.gen_saltr   r   rq   re   Nro   Trx   ©Úrecordr4   r'   ZabaZabbaZaaaabbr   r   é   )Zrelaxedzsalt_size.*above max_salt_size)r6   ÚHasSaltr_   r   r;   r<   ZassertInÚwarningsÚcatch_warningsrA   ÚconsumeWarningListr=   rt   rU   rF   )r#   rw   ry   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   rq   r   N)r+   r,   r-   r.   rr   Z
min_roundsÚ
max_roundsÚdefault_roundsr   r   r   r   r   8  s
   r   c                     s   ˆ f | Žj S r    rƒ   rv   r2   r   r   Únorm_rounds@  s    z5SkeletonTest.test_30_init_rounds.<locals>.norm_roundsNrƒ   Trx   r   g      ø?rz   r   r   rq   re   )r6   Z	HasRoundsr_   r;   r<   r=   r~   r   rA   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©rI   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.   rr   Úbackendsr‹   r   rS   r   r’   r   r‘   r   r   r   r   r   a  s   

r   ÚanyÚdefaultTr5   r&   r'   r3   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)r6   ÚHasManyBackendsr_   r;   r   Úget_backendÚset_backendr:   Úhas_backendr   r=   r*   r8   r‹   rA   Ú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.   rr   r•   r˜   Ú_has_backend_br   r‘   r   r   r   r   r   ±  s   r   r–   r—   Tr5   r&   r'   r3   N)r~   ÚfilterwarningsÚDeprecationWarningr6   rš   r_   r;   r   r›   rœ   r:   r   r¤   r=   r*   r8   r˜   rA   )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   ©rc   ú!Aú!BÚAN)	r+   r,   r-   r.   rr   r   Údefault_identÚident_valuesZident_aliasesr   r   r   r   r   ç  s
   r   c                     s   ˆ f | Žj S r    r¨   rv   r2   r   r   Ú
norm_identî  s    z3SkeletonTest.test_50_norm_ident.<locals>.norm_identNr¨   Trx   r©   rª   z!Cr«   ÚBz!Axxxz!Bxxxz!Cxxxr4   r   )r6   ZHasManyIdentsr_   r;   r<   r=   r   rA   r8   r9   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©rZ   rp   z?$5$LKO/Ute40T3FNF95$U0prpBQd4PloSGU0pnpM4z9wKn4vZ1.jsrzQfPqxph9zLKO/Ute40T3FNF95z+U0prpBQd4PloSGU0pnpM4z9wKn4vZ1.jsrzQfPqxph9iˆ  T)rp   r„   Úimplicit_roundsrZ   FrY   )rp   r„   r³   )ZsanitizezLK**************z+U0pr***************************************)r„   r³   rp   rZ   zL$5$rounds=10428$uy/jIAhCetNCTtb0$YWvUOXbkqlqhyoPMpN8BMe.ZGsGx2aBvxTvDFI613c3z+YWvUOXbkqlqhyoPMpN8BMe.ZGsGx2aBvxTvDFI613c3zuy/jIAhCetNCTtb0i¼(  )rZ   rp   r„   z@$pbkdf2$60000$DoEwpvQeA8B4T.k951yLUQ$O26Y3/NJEiLCVaOVPxGXshyjW8ks   ;n˜ßóI"ÂU£•?—²£[Éi`ê  s   0¦ôÀxOé=ç\‹Q©rZ   r„   rp   zO26************************zDo********************N)	Úpasslibr?   Ú	des_cryptZ	parsehashr=   r   r   ÚdictÚpbkdf2_sha1)r#   r?   ÚresultÚhr5   r3   Ú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__rC   rW   rd   rm   rn   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.   rr   )r.   Útyper6   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)Z	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)	r6   Ú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)	r6   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   )	r6   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   )r6   rÕ   r=   r.   r×   rr   r   r:   Údirr   r8   )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)r6   rÕ   r=   r>   r;   r<   rQ   rA   r?   r8   r9   r:   r@   )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Ô   Zh3z{Xr¨   z{XXX}Az{XYz{XXXXZh4Zphpassz{XXX}$P$z{XXX}$H$Zh5TZh6z#orig_prefix.*may not work correctlyZh7ú$ú?)Úorig_prefixÚprefix)
r6   rÕ   r=   rc   r   r×   r­   r;   rA   rU   ©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)r6   rÕ   Z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ê   rT   N)r6   rÕ   r;   rA   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_hashrD   c                 C   s.   t |tƒr| d¡}d| }tt |¡ ¡ ƒS )NrJ   s   boblious)rK   r
   rL   r   rM   rN   rO   ©r#   r)   Údatar   r   r   r*     s    

zUnsaltedHash._calc_checksumN)
r+   r,   r-   rÈ   r.   r6   Ú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_hashro   r   re   rD   z^@salt[0-9a-f]{42,44}$c                 C   sF   |   |¡stj | ¡‚t|tƒr*| d¡}| |dd… |dd … dS )NrX   r|   iØÿÿÿ)rp   rZ   )r9   r6   ÚexcZInvalidHashErrorrK   r[   r\   rH   r   r   r   r]   0  s
    


zSaltedHash.from_stringc                 C   s   t dƒ| j| jf }t|ƒS )Nz	@salt%s%s)r   rp   rZ   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 )NrJ   rX   )rK   r
   rL   rp   r   rM   rN   rO   rï   r   r   r   r*   <  s    

zSaltedHash._calc_checksumN)r+   r,   r-   rÈ   r.   rr   rs   rt   r0   r6   rñ   ru   r/   r`   ra   r   rb   rS   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Úxro   r   rƒ   )r;   r<   rî   r>   rB   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 )NTrx   r²   ri   )rò   rk   r;   r<   rA   )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È   Z
__future__r   r`   rM   Zloggingr   r~   Zpasslib.hashr   r   Zpasslib.excr   r   Zpasslib.utils.compatr   r	   r
   Zpasslib.utils.handlersZutilsZhandlersr6   Zpasslib.tests.utilsr   r   r   r+   Úlogr   r   ÚobjectrÉ   rÒ   r7   rî   r}   r_   rò   rù   rõ   rû   r   r   r   r   Ú<module>   s4       I %