U
    Lams                     @   s.  d Z ddlmZ ddlZeeZddlZddlZddl	m
Z
 ddlmZmZ ddlmZmZmZ ddlmZmZ ddlmZmZ dd	lmZ G d
d deZedZedZedZG dd dedZedZ G dd deZ!e!dZ"e!dZ#e!dZ$G dd de!dZ%e!dZ&dS )z?passlib.tests.test_handlers - tests for passlib hash algorithms    )with_statementNhash)IDENT_2IDENT_2X)repeat_stringto_bytesis_safe_crypt_input)irangePY3)HandlerCase	TEST_MODE)UPASS_TABLEc                       s  e Zd ZdZejZdZdZddddddd	d
ddddddddddddd dfddd dfddd dfddd dfddddd e	d!fe	d"fgZ
ed#rd$Zd%Ze
d&ed' fd&ed' fd(ed) fd(ed* fd+ed) fd+ed, fd-ed) fd-ed) fd.ed) fd.ed) fg
 d/e	d0fgZd1d2gZd3d4d5gZd6d7d8d9gZ fd:d;Z fd<d=Zd>d? Zejd@ ZdAdB ZdCdD ZdEdF ZG dGdH dHejZdIdJdKgZdLdM ZdNdO Z  ZS )P_bcrypt_testzbase for BCrypt test casesT)zU*U*U*U*z<$2a$05$c92SVSfjeiCD6F2nAD6y0uBpJDjdRkt0EgeC4/31Rf2LUZbDRDE.O)zU*U***Uz<$2a$05$WY62Xk2TXZ7EvVDQ5fmjNu7b0GEzSzUXUh2cllxJwhtOeMtWV3Ujq)zU*U***U*z<$2a$05$Fa0iKV3E2SYVUlMknirWU.CFYGvJ67UwVKI1E2FP6XeLiZGcH3MJi)z*U*U*U*Uz<$2a$05$.WRrXibc1zPgIdRXYfv.4uu6TD1KWf0VnHzq/0imhUhuxSxCyeBs2) z<$2a$05$Otz9agnajgrAe0.kFVF9V.tzaStZ2s1s4ZWi/LY4sw2k/MTVFj/IO)zU*Uz<$2a$05$CCCCCCCCCCCCCCCCCCCCC.E5YPO9kmyuRGyh0XouQYb4YMJKvyOeW)zU*U*z<$2a$05$CCCCCCCCCCCCCCCCCCCCC.VGOzA784oUp/Z0DY336zx7pLYAy0lwK)zU*U*Uz<$2a$05$XXXXXXXXXXXXXXXXXXXXXOAcXxm9kjPGEMsLznoKqmqw7tc8WCx4a)r   z<$2a$05$CCCCCCCCCCCCCCCCCCCCC.7uG0VCzI2bS7j6ymqJi9CdcdxiRTWNy)zb0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignoredz<$2a$05$abcdefghijklmnopqrstuu5s2v8.iXieOjg/.AySBTTZIIVFJeBui)   z<$2a$05$/OK.fbVrR/bpIqNJ5ianF.Sa7shbm4.OzKpvFnX1pQLmQW96oUlCq)s   345z<$2a$05$/OK.fbVrR/bpIqNJ5ianF.nRht2l/HRhr6zmCp9vYUvvsqynflf9e)s   abz<$2a$05$/OK.fbVrR/bpIqNJ5ianF.6IflQkJytoRVc1yuaNtHfiuq.FRlSIS)sk   chars after 72 are ignored as usualz<$2a$05$/OK.fbVrR/bpIqNJ5ianF.swQOIzjOiJ9GHEPuhEkvqrUyvWhEMx6)sH   UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUz<$2a$05$/OK.fbVrR/bpIqNJ5ianF.R9xrDjiycxMbQE2bp.vgqlYpW5wx2yy)sH   UUUUUUUUUUUUUUUUUUUUUUUUz<$2a$05$/OK.fbVrR/bpIqNJ5ianF.9tQZzcJfm3uj2NvJ/n5xkhpqLrMpWCe)r   z<$2y$05$/OK.fbVrR/bpIqNJ5ianF.Sa7shbm4.OzKpvFnX1pQLmQW96oUlCq)s   ёz<$2y$05$6bNw2HLQYeqHYyBfLMsv/OUcZd0LKP39b87nBw3.S2tVZSqiQX6euA  01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789N   z<$2a$04$R1lJ2gkNaoPGdafE.H.16.1MKHPvmKwryeulRe225LKProWYwt9Oi      i  )r   z<$2a$06$DCq7YPn5Rq63x1Lad4cll.TV4S6ytwfsfvkgY8jIucDrjc8deX1s.)az<$2a$10$k87L/MF28Q673VKh8/cPi.SUl7MU/rWuSiIDDFayrKk/1tBsSQu4u)abcz<$2a$10$WvvTPHKwdBJ3uk0Z37EMR.hLA2W6N9AEBhEgrAOljy2Ae5MtaSIUi)abcdefghijklmnopqrstuvwxyzz<$2a$10$fVH8e28OQRj9tqiDXs1e1uxpsjN0c7II7YPKXua2NAKYvM6iQk7dq)z"~!@#$%^&*()      ~!@#$%^&*()PNBFRDz<$2a$10$LgfYWkbzEvQ4JakH7rOvHe0y8pHKF9OaFgwUZ2q7W2FFZmZzJYlfSz<$2a$05$Z17AXnnlpzddNUvnC6cZNOSwMA/8oNiKnHTHTwLlBijfucQQlHjaGz<$2b$05$Z17AXnnlpzddNUvnC6cZNOSwMA/8oNiKnHTHTwLlBijfucQQlHjaGfullz$2$05$......................z$2a$05$......................r   ZJ2ihDv8vVf7QZ9BsaRrKyqs2tkn55Yqr   zXuQjdH.wPVNUZ/bOfstdW/FqB8QSjteZev6gDwpVye3oMCUpLY85aTpfBNHD0GaZEabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcz2kIdfSj/4/R/Q6n847VTvc68BXiRYZCZHabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcZIabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcxz$2a$04$uM6csdM8R9SXTex/gbTayez<$2a$04$uM6csdM8R9SXTex/gbTayezuvzFEufYGd2uB6of7qScLjQ4GwcD4Gz<$2f$12$EXRkfkdmXnagzds2SSitu.MW9.gAVqa9eLS1//RYtYCmB1eLHg.9qz<$2`$12$EXRkfkdmXnagzds2SSitu.MW9.gAVqa9eLS1//RYtYCmB1eLHg.9qz<$2a$12$EXRkfkdmXn!gzds2SSitu.MW9.gAVqa9eLS1//RYtYCmB1eLHg.9qz<$2x$12$EXRkfkdmXnagzds2SSitu.MW9.gAVqa9eLS1//RYtYCmB1eLHg.9qz;$2a$6$DCq7YPn5Rq63x1Lad4cll.TV4S6ytwfsfvkgY8jIucDrjc8deX1s.)zfreedbsd|openbsd|netbsdT)darwinF)linuxN)solarisNc                    sr   t drT| jdkrTd}tj|}|r:| tjj|| n| tjj| dtj|< tt	| 
  tdd d S )Nr   builtinPASSLIB_BUILTIN_BCRYPTtrueignore3.*backend is vulnerable to the bsd wraparound bug.*)r   backendosenvironget
addCleanup__setitem____delitem__superr   setUpwarningsfilterwarningsselfkeyorig	__class__ F/tmp/pip-unpacked-wheel-8v2dfbvt/passlib/tests/test_handlers_bcrypt.pyr)      s    
z_bcrypt_test.setUpc                    s*   | j dkr|dd tt| | d S Nr   rounds   )r!   
setdefaultr(   r   populate_settingsr-   kwdsr0   r2   r3   r8      s    
z_bcrypt_test.populate_settingsc                 C   sB   ddl m}m}m} ddlm} ||}|d|d p:d|S )z4check if OS crypt is expected to support given identr   )bcryptr   IDENT_2Y)
safe_crypttestz04$5BJqKfqMQvV7nS.yUguNcur   )passlib.handlers.bcryptr;   r   r<   passlib.utilsr=   Zfrom_string
startswith)r-   r   r;   r   r<   r=   identr2   r2   r3   crypt_supports_variant   s    
z#_bcrypt_test.crypt_supports_variant)fuzz_verifier_bcryptfuzz_verifier_pybcryptfuzz_verifier_bcryptorc                    sz   ddl m mmm}mm} ddlm}m	 zdd l
W n tk
rR   Y d S X | r^d S  fdd}|S )Nr   )r   IDENT_2AIDENT_2Br   r<   _detect_pybcrypt)to_native_strr   c                    s   | j j} |r*|dd  }nN| rT|dd  }| rxt| d} n$|rxjdkrx|dd  }|}z| ||kW S  tk
r   td|| f Y nX dS )r;   r6   N   H   z3.0.0z$bcrypt rejected hash: %r (secret=%r))FuzzHashGeneratorpassword_encodingrA   r   __version__hashpw
ValueErrorsecretr   r   rG   rH   r<   r;   r-   r   r2   r3   check_bcrypt   s    

z7_bcrypt_test.fuzz_verifier_bcrypt.<locals>.check_bcrypt)r?   r   rG   rH   r   r<   rI   r@   rJ   r   r;   ImportError)r-   r   rI   rJ   rU   r2   rT   r3   rD      s     z!_bcrypt_test.fuzz_verifier_bcryptc                    sn   ddl m}m mm}mm} ddlm |	dd}|s@d S ddl m
 |j fdd}|S )	Nr   )r   rG   rH   r   r<   _PyBcryptBackendrJ   pybcryptF)	_pybcryptc              
      s   | j j} t| dkr&| dd } |frD |dd  }zFrv  | ||kW  5 Q R  W S Q R X n| ||kW S W n" tk
r   td|f Y nX dS )rY      Nr6   zpy-bcrypt rejected hash: %r)rM   rN   lenrA   rP   rQ   rR   rG   rH   r<   Z
bcrypt_modlockr-   rJ   r2   r3   check_pybcrypt  s    &z;_bcrypt_test.fuzz_verifier_pybcrypt.<locals>.check_pybcrypt)r?   r   rG   rH   r   r<   rW   r@   rJ   Z_load_backend_mixinrZ   Z
_calc_lock)r-   r   r   rW   Zloadedr_   r2   r]   r3   rE      s     z#_bcrypt_test.fuzz_verifier_pybcryptc                    sh   ddl mmmm ddlm zddlm  W n t	k
rJ   Y d S X  fdd}|S )Nr   )r   rG   r<   rH   rX   )Enginec                    sj   | j j} |fr.|dd  }n(|rV|dd  }| rVt| d}  d| ||kS )bcryptorr6   NrK   rL   F)rM   rN   rA   r   Zhash_keyrR   r`   r   rG   rH   r<   r-   rJ   r2   r3   check_bcryptor  s    

z;_bcrypt_test.fuzz_verifier_bcryptor.<locals>.check_bcryptor)
r?   r   rG   r<   rH   r@   rJ   Zbcryptor.enginer`   rV   )r-   rc   r2   rb   r3   rF     s    z#_bcrypt_test.fuzz_verifier_bcryptorc                       s$   e Zd Z fddZdd Z  ZS )z_bcrypt_test.FuzzHashGeneratorc                    s   t tj|  }|d }|d }|d }|d}|tkrB|d= n>|tkr|rtt|t	t|t|kr| 
 \|d< |d< |S )NrS   othersettingsrB   )r(   r   rM   generater$   r   r   r   r   r\   Zrandom_password_pair)r-   optsrS   rd   re   rB   r0   r2   r3   rf   +  s    
*z'_bcrypt_test.FuzzHashGenerator.generatec                 C   s   |  ddddS N            Zrandintgaussr-   r2   r2   r3   random_rounds>  s    z,_bcrypt_test.FuzzHashGenerator.random_rounds)__name__
__module____qualname__rf   ro   __classcell__r2   r2   r0   r3   rM   )  s   rM   )r>   z<$2a$04$oaQbBqq8JnSM1NHRPQGXORY4Vw3bdHKLIXTecPDRAcJ98cz1ilveOz<$2a$04$oaQbBqq8JnSM1NHRPQGXOOY4Vw3bdHKLIXTecPDRAcJ98cz1ilveO)r>   <$2a$04$yjDgE74RJkeqC0/1NheSScrvKeu9IbKDpcQf/Ox3qsrRS/Kw42qIS<$2a$04$yjDgE74RJkeqC0/1NheSSOrvKeu9IbKDpcQf/Ox3qsrRS/Kw42qIS)r>   z<$2a$04$yjDgE74RJkeqC0/1NheSSOrvKeu9IbKDpcQf/Ox3qsrRS/Kw42qIVru   c           
   
      s    d  j}d} fdd}tdD ]}||  q(tdD ]}||j|jdd qB d	|g |jd
ddd}W 5 Q R X  |d  j	}|D ]\}}}	 |g  |
|||	 W 5 Q R X  g   |
||	|	 W 5 Q R X  |g  ||| W 5 Q R X  g   |||	 W 5 Q R X  |g  |||	 W 5 Q R X  g   ||	|	 W 5 Q R X q |dd dS )z2test passlib correctly handles bcrypt padding bitsr   z.*incorrectly set padding bitsc                    sB   |  drt| dks$td| f  | d dkd| f  d S )N)z$2a$z$2b$   zunexpectedly malformed hash: %rz.Oeuz'unused bits incorrectly set in hash: %r)rA   r\   AssertionError
assertTruer   rn   r2   r3   check_paddingl  s    z:_bcrypt_test.test_90_bcrypt_padding.<locals>.check_paddingrk   rK   r5   Zbobzsalt too largez.....................A.ri   T)saltr5   Zrelaxedz<$2b$05$.....................................................z$md5$abcN)Zrequire_TEST_MODEhandlerr
   Z	genconfigusingZ
min_roundsr   ZassertWarningListassertEqualknown_incorrect_paddingZgenhashrx   verifyZnormhash)
r-   r;   Z	corr_descry   ir   ZsamplespwdbadZgoodr2   rn   r3   test_90_bcrypt_padding^  s4    
z#_bcrypt_test.test_90_bcrypt_paddingc                 C   s:   | j jdd}d}d}| || | || dS )z$needs_update corrects bcrypt paddingr6   rz   rt   ru   N)r|   r}   rx   Zneeds_updateZassertFalse)r-   r;   ZBAD1ZGOOD1r2   r2   r3   test_needs_update_w_padding  s
    z(_bcrypt_test.test_needs_update_w_padding) rp   rq   rr   __doc__r   r;   r|   reduce_default_roundsfuzz_salts_need_bcrypt_repairr   known_correct_hashesr   ZCONFIG_2ZCONFIG_Aextendknown_correct_configsZknown_unidentified_hashesknown_malformed_hashesZplatform_crypt_supportr)   r8   rC   r   Zfuzz_verifiersrD   rE   rF   rM   r   r   r   rs   r2   r2   r0   r3   r      s   	
W










	
	
 !#:r   r;   rY   ra   c                   @   s    e Zd Zdd ejD ZdZdS )bcrypt_os_crypt_testc                 C   s   g | ]}t |d  r|qS )r   )r	   ).0rowr2   r2   r3   
<listcomp>  s    zbcrypt_os_crypt_test.<listcomp>FN)rp   rq   rr   r   r   has_os_crypt_fallbackr2   r2   r2   r3   r     s   r   Zos_cryptr   c                       s&  e Zd ZdZejZdZdZdZ	dde
dfe
ddfde
d	fed
ddfed
dd dfed
dd dfdde
dfe
ddfed
ddfed
dd dfed
dd dfgZddgZdddddddd d!d"d#d$d%gZ fd&d'Z fd(d)Zd*d+ Zd,d- ZG d.d/ d/ejZd0d1 Zd2d3 Z  ZS )4_bcrypt_sha256_testz!base for BCrypt-SHA256 test casesTN)r   zJ$bcrypt-sha256$2a,5$E/e/2AOhqM5W/KJTFQzLce$F6dYSxOdAEoJZO2eoHUZWZljW/e0TXO)passwordJ$bcrypt-sha256$2a,5$5Hg1DKFqPE8C2aflZ5vVoe$12BjNE0p7axMg55.Y/mHsYiVuFBDQyuzJ$bcrypt-sha256$2a,5$.US1fQ4TQS.ZTz/uJ5Kyn.$QNdPDOTKKT5/sovNz1iWg26quOU4Pjezutf-8)r   zJ$bcrypt-sha256$2b,5$5Hg1DKFqPE8C2aflZ5vVoe$12BjNE0p7axMg55.Y/mHsYiVuFBDQyuzJ$bcrypt-sha256$2b,5$.US1fQ4TQS.ZTz/uJ5Kyn.$QNdPDOTKKT5/sovNz1iWg26quOU4PjeZabc123rL   zJ$bcrypt-sha256$2b,5$X1g1nh3g0v4h6970O68cxe$r/hyEtqJ0teqPEmfTLoZ83ciAI1Q74.ZqwrzJ$bcrypt-sha256$2b,5$X1g1nh3g0v4h6970O68cxe$021KLEif6epjot5yoxk0m8I0929ohEaZxyzzJ$bcrypt-sha256$2b,5$X1g1nh3g0v4h6970O68cxe$7.1kgpHduMGEjvM3fX6e/QCvfn6OKja)r   zR$bcrypt-sha256$v=2,t=2b,r=5$E/e/2AOhqM5W/KJTFQzLce$WFPIZKtDDTriqWwlmRFfHiOTeheAZWe)r   R$bcrypt-sha256$v=2,t=2b,r=5$5Hg1DKFqPE8C2aflZ5vVoe$wOK1VFFtS8IGTrGa7.h5fs0u84qyPbSzR$bcrypt-sha256$v=2,t=2b,r=5$.US1fQ4TQS.ZTz/uJ5Kyn.$pzzgp40k8reM1CuQb03PvE0IDPQSdV6zR$bcrypt-sha256$v=2,t=2b,r=5$X1g1nh3g0v4h6970O68cxe$zu1cloESVFIOsUIo7fCEgkdHaI9SSuezR$bcrypt-sha256$v=2,t=2b,r=5$X1g1nh3g0v4h6970O68cxe$CBF9csfEdW68xv3DwE6xSULXMtqEFP.zR$bcrypt-sha256$v=2,t=2b,r=5$X1g1nh3g0v4h6970O68cxe$zC/1UDUG2ofEXB6Onr2vvyFzfhEOS3S)z*$bcrypt-sha256$2a,5$5Hg1DKFqPE8C2aflZ5vVoer   r   )z2$bcrypt-sha256$v=2,t=2b,r=5$5Hg1DKFqPE8C2aflZ5vVoer   r   zJ$bcrypt-sha256$2a,5$5Hg1DKF!PE8C2aflZ5vVoe$12BjNE0p7axMg55.Y/mHsYiVuFBDQyuzJ$bcrypt-sha256$2c,5$5Hg1DKFqPE8C2aflZ5vVoe$12BjNE0p7axMg55.Y/mHsYiVuFBDQyuzJ$bcrypt-sha256$2x,5$5Hg1DKFqPE8C2aflZ5vVoe$12BjNE0p7axMg55.Y/mHsYiVuFBDQyuzK$bcrypt-sha256$2a,05$5Hg1DKFqPE8C2aflZ5vVoe$12BjNE0p7axMg55.Y/mHsYiVuFBDQyuz+$bcrypt-sha256$2a,5$5Hg1DKFqPE8C2aflZ5vVoe$zR$bcrypt-sha256$v=2,t=2b,r=5$5Hg1DKF!PE8C2aflZ5vVoe$12BjNE0p7axMg55.Y/mHsYiVuFBDQyuzR$bcrypt-sha256$v=1,t=2b,r=5$5Hg1DKFqPE8C2aflZ5vVoe$12BjNE0p7axMg55.Y/mHsYiVuFBDQyuzR$bcrypt-sha256$v=3,t=2b,r=5$5Hg1DKFqPE8C2aflZ5vVoe$12BjNE0p7axMg55.Y/mHsYiVuFBDQyuzR$bcrypt-sha256$v=2,t=2c,r=5$5Hg1DKFqPE8C2aflZ5vVoe$12BjNE0p7axMg55.Y/mHsYiVuFBDQyuzR$bcrypt-sha256$v=2,t=2a,r=5$5Hg1DKFqPE8C2aflZ5vVoe$12BjNE0p7axMg55.Y/mHsYiVuFBDQyuzR$bcrypt-sha256$v=2,t=2x,r=5$5Hg1DKFqPE8C2aflZ5vVoe$12BjNE0p7axMg55.Y/mHsYiVuFBDQyuzS$bcrypt-sha256$v=2,t=2b,r=05$5Hg1DKFqPE8C2aflZ5vVoe$12BjNE0p7axMg55.Y/mHsYiVuFBDQyuz3$bcrypt-sha256$v=2,t=2b,r=5$5Hg1DKFqPE8C2aflZ5vVoe$c                    sr   t drT| jdkrTd}tj|}|r:| tjj|| n| tjj| dtj|< tt	| 
  tdd d S )Nr   r   r   Zenabledr   r    )r   r!   r"   r#   r$   r%   r&   r'   r(   r   r)   r*   r+   r,   r0   r2   r3   r)   @  s    
z_bcrypt_sha256_test.setUpc                    s*   | j dkr|dd tt| | d S r4   )r!   r7   r(   r   r8   r9   r0   r2   r3   r8   M  s    
z%_bcrypt_sha256_test.populate_settingsc                 C   s   |  dd S )Nzmultiple idents not supported)ZskipTestrn   r2   r2   r3   require_many_identsW  s    z'_bcrypt_sha256_test.require_many_identsc                 C   s&   | j }|dd | jt|ddd d S )NT)use_defaultsz$2y$)rB   r   )r|   assertRaisesrQ   )r-   r|   r2   r2   r3   test_30_HasOneIdentZ  s    
z'_bcrypt_sha256_test.test_30_HasOneIdentc                   @   s   e Zd Zdd Zdd ZdS )z%_bcrypt_sha256_test.FuzzHashGeneratorc                 C   s   |  ddddS rh   rm   rn   r2   r2   r3   ro   f  s    z3_bcrypt_sha256_test.FuzzHashGenerator.random_roundsc                 C   s   dS )N2br2   rn   r2   r2   r3   random_identj  s    z2_bcrypt_sha256_test.FuzzHashGenerator.random_identN)rp   rq   rr   ro   r   r2   r2   r2   r3   rM   d  s   rM   c                 C   sd   | j }| |jd |jdd}| |jd | jt|jdd |jddd}| jt|jdd d S )N   rl   )versioni  Z2a)r   rB   )rB   )r|   r~   r   r}   r   rQ   )r-   r|   subclsr2   r2   r3   test_using_versionq  s    z&_bcrypt_sha256_test.test_using_versionc           	      C   s   ddl m} ddlm} ddlm} d}d}|d|d|d}||d}| |d	 |d
|dd	|}| |d | 
||d| |  | jd
|dd	|}| || dS )z6
        test digest calc v2 matches bcrypt()
        r   )r;   )compile_hmac)	b64encodeZnyKYxTAvjmy6lMDYMl11Uur>   sha256asciiz,J5TlyIDm+IcSWmKiDJm+MeICndBkFVPn4kKdJW8f+xY=r      )rB   r{   r5   zM0wE0Ov/9LXoQFCe.jRHu3MSHPF54Taz$2b$12$N)Zpasslib.hashr;   Zpasslib.crypto.digestr   Zpasslib.utils.binaryr   encodedecoder~   Z_calc_checksumrx   r   r|   )	r-   r;   r   r   r{   rS   Ztemp_digestZbcrypt_digestresultr2   r2   r3   test_calc_digest_v2  s    z'_bcrypt_sha256_test.test_calc_digest_v2)rp   rq   rr   r   r   Zbcrypt_sha256r|   r   Zforbidden_charactersr   r   r   r   r   r   r   r)   r8   r   r   r   rM   r   r   rs   r2   r2   r0   r3   r     s   	A4

r   c                   @   s   e Zd Zedd ZdZdS )bcrypt_sha256_os_crypt_testc                 C   s   t  S )N)r   _get_safe_crypt_handler_backend)clsr2   r2   r3   r     s    z;bcrypt_sha256_os_crypt_test._get_safe_crypt_handler_backendFN)rp   rq   rr   classmethodr   r   r2   r2   r2   r3   r     s   
r   )'r   
__future__r   logging	getLoggerrp   logr"   r*   Zpasslibr   r?   r   r   r@   r   r   r	   Zpasslib.utils.compatr
   r   Zpasslib.tests.utilsr   r   Zpasslib.tests.test_handlersr   r   Zcreate_backend_caseZbcrypt_bcrypt_testZbcrypt_pybcrypt_testZbcrypt_bcryptor_testr   Zbcrypt_builtin_testr   Zbcrypt_sha256_bcrypt_testZbcrypt_sha256_pybcrypt_testZbcrypt_sha256_bcryptor_testr   Zbcrypt_sha256_builtin_testr2   r2   r2   r3   <module>   s6    
   


	
 d


