
    gms                     P   S r SSKJr  SSKr\R                  " \5      rSSKrSSKrSSK	J
r
  SSKJrJr  SSKJrJrJr  SSKJrJr  SSKJrJr  SS	KJr   " S
 S\5      r\R7                  S5      r\R7                  S5      r\R7                  S5      r " S S\R7                  S5      5      r\R7                  S5      r  " S S\5      r!\!R7                  S5      r"\!R7                  S5      r#\!R7                  S5      r$ " S S\!R7                  S5      5      r%\!R7                  S5      r&g)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                     ^  \ rS rSrSr\R                  rSrSr	SSSSSS	S
SSSSSSSSSSSSSS S4SSS S4SSS S4SSS S4SSSS S!\
S"4\
S#4/r\" S$5      (       aQ  S%rS&r\R                  S'\S(-   4S'\S(-   4S)\S*-   4S)\S+-   4S,\S*-   4S,\S--   4S.\S*-   4S.\S*-   4S/\S*-   4S/\S*-   4/
5        S0\
S14/rS2S3/r/ S4Qr/ S5QrU 4S6 jrU 4S7 jrS8 r\R0                  S9-   rS: rS; rS< r " S= S>\R8                  5      r/ S?QrS@ rSA rSBr U =r!$ )C_bcrypt_test   z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.S2tVZSqiQX6eu  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   J2ihDv8vVf7QZ9BsaRrKyqs2tkn55Yqr   zXuQjdH.wPVNUZ/bOfstdW/FqB8QSjteev6gDwpVye3oMCUpLY85aTpfBNHD0GaEabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcz2kIdfSj/4/R/Q6n847VTvc68BXiRYZCHabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcIabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcxz$2a$04$uM6csdM8R9SXTex/gbTayez<$2a$04$uM6csdM8R9SXTex/gbTayezuvzFEufYGd2uB6of7qScLjQ4GwcD4Gz<$2f$12$EXRkfkdmXnagzds2SSitu.MW9.gAVqa9eLS1//RYtYCmB1eLHg.9qz<$2`$12$EXRkfkdmXnagzds2SSitu.MW9.gAVqa9eLS1//RYtYCmB1eLHg.9q)z<$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                   > [        S5      (       a  U R                  S:X  a  Sn[        R                  R	                  U5      nU(       a+  U R                  [        R                  R                  X5        O*U R                  [        R                  R                  U5        S[        R                  U'   [        [        U ]+  5         [        R                  " SS5        g )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__s      [/home/matz/Project1/venv/lib/python3.13/site-packages/passlib/tests/test_handlers_bcrypt.pyr2   _bcrypt_test.setUp   s    V!:*C::>>#&D

 6 6B

 6 6<$BJJsOlD') 	*_`    c                 p   > U R                   S:X  a  UR                  SS5        [        [        U ]  U5        g Nr%   rounds   )r*   
setdefaultr1   r   populate_settingsr6   kwdsr9   s     r:   rB   _bcrypt_test.populate_settings   s,    <<9$OOHa(lD3D9r<   c                     SSK JnJnJn  SSKJn  UR                  U5      nU" SUS-   5      =(       d    SR                  U5      $ )z4check if OS crypt is expected to support given identr   )bcryptr   IDENT_2Y)
safe_crypttestz04$5BJqKfqMQvV7nS.yUguNcur   )passlib.handlers.bcryptrG   r   rH   passlib.utilsrI   from_string
startswith)r6   r   rG   r   rH   rI   idents          r:   crypt_supports_variant#_bcrypt_test.crypt_supports_variant   s?    FF,""4(65+F#FGM2YYZ_``r<   )fuzz_verifier_bcryptfuzz_verifier_pybcryptfuzz_verifier_bcryptorc                    ^ ^^^^^	^
 SSK JmJmJmJnJmJn  SSKJnJ	m
   SS K
m	U" 5       (       a  g UUUUU	U U
4S jnU$ ! [         a     g f = f)Nr   )r   IDENT_2AIDENT_2Br   rH   _detect_pybcrypt)to_native_strr   c                   > T" U TR                   R                  5      n UR                  " T5      (       a	  TUSS -   nObUR                  " T5      (       a  TUSS -   nU (       a  [        U S5      n O/UR                  " T5      (       a  TR                  S:X  a  TUSS -   nT" U5      n TR                  X5      U:H  $ ! [         a    [        SU< SU < S35      ef = f)	rG   r@   N   H   z3.0.0zbcrypt rejected hash: z	 (secret=))FuzzHashGeneratorpassword_encodingrN   r   __version__hashpw
ValueError)	secretr   r   rV   rW   rH   rG   r6   r   s	     r:   check_bcrypt7_bcrypt_test.fuzz_verifier_bcrypt.<locals>.check_bcrypt   s    fd&<&<&N&NOFx(($qr(*))  $qr(**626F**v/A/AW/L$qr(*D>DZ}}V2d:: Z 4QW!XYYZs   *B> >C)rK   r   rV   rW   r   rH   rX   rL   rY   r   rG   ImportError)r6   r   rX   rY   rd   r   rV   rW   rH   rG   r   s   `    @@@@@@r:   rR   !_bcrypt_test.fuzz_verifier_bcrypt   sJ    mm9	 	Z 	Z( 1  		s   A   
AAc                    ^ ^^^^	^
^ SSK JnJmJmJnJmJn  SSKJm  UR                  SS5      nU(       d  g SSK J
m	  UR                  m
UUUU	U
U U4S jnU$ )Nr   )r   rV   rW   r   rH   _PyBcryptBackendrY   pybcryptF)	_pybcryptc                 |  > T" U TR                   R                  5      n [        U 5      S:  a  U SS n UR                  " TT45      (       a  TUSS -   n T(       a   T   TR	                  X5      U:H  sSSS5        $ TR	                  X5      U:H  $ ! , (       d  f       g= f! [
         a    [        SU< 35      ef = f)rk      Nr@   zpy-bcrypt rejected hash: )r^   r_   lenrN   ra   rb   )	rc   r   rV   rW   rH   
bcrypt_modlockr6   rY   s	     r:   check_pybcrypt;_bcrypt_test.fuzz_verifier_pybcrypt.<locals>.check_pybcrypt  s    "64+A+A+S+STF6{S (344$qr(*J)00>$F  &,,V:dBB   J $!HIIJs0   	B! B2	B! <B! 
BB! B! !B;)rK   r   rV   rW   r   rH   ri   rL   rY   _load_backend_mixinrl   
_calc_lock)r6   r   r   ri   loadedrr   rV   rW   rH   rp   rq   rY   s   `     @@@@@@r:   rS   #_bcrypt_test.fuzz_verifier_pybcrypt   sL    	
 	
 	0!55j%HC**	J 	J r<   c                 ~   ^ ^^^^^^ SSK JmJmJmJm  SSKJm   SSKJm  UUUUUU U4S jnU$ ! [         a     g f = f)Nr   )r   rV   rH   rW   rj   )Enginec                   > T" U TR                   R                  5      n UR                  " TT45      (       a	  TUSS -   nO2UR                  " T5      (       a  TUSS -   nU (       a  [        U S5      n T" S5      R	                  X5      U:H  $ )bcryptorr@   Nr[   r\   F)r^   r_   rN   r   hash_key)	rc   r   ry   r   rV   rW   rH   r6   rY   s	     r:   check_bcryptor;_bcrypt_test.fuzz_verifier_bcryptor.<locals>.check_bcryptor  s    "64+A+A+S+STF(344$qr(*))  $qr(**626F%=))&74??r<   )
rK   r   rV   rH   rW   rL   rY   bcryptor.enginery   rf   )r6   r}   ry   r   rV   rW   rH   rY   s   ` @@@@@@r:   rT   #_bcrypt_test.fuzz_verifier_bcryptor  s<    QQ/	.	@ 	@   		s   / 
<<c                   .   ^  \ rS rSrU 4S jrS rSrU =r$ )_bcrypt_test.FuzzHashGeneratori)  c                 Z  > [         [        R                  U ]  5       nUS   nUS   nUS   nUR	                  S5      nU[
        :X  a  US	 U$ U[        :X  aT  U(       aM  [        [        U5      [        [        U5      5      5      [        U5      :X  a  U R                  5       u  US'   US'   U$ )Nrc   othersettingsrO   )r1   r   r^   generater-   r   r   r   r   ro   random_password_pair)r6   optsrc   r   r   rO   r9   s         r:   r   '_bcrypt_test.FuzzHashGenerator.generate+  s    77GID(^FMEJ'HLL)E W% K '!ehuosS[\bScOd0eiqrxiy0y 150I0I0K-XWKr<   c                 *    U R                  SSSS5      $ N            randintgaussr6   s    r:   random_rounds,_bcrypt_test.FuzzHashGenerator.random_rounds>      $$Q1a00r<    )__name__
__module____qualname____firstlineno__r   r   __static_attributes____classcell__r9   s   @r:   r^   r   )  s    	&	1 	1r<   r^   ))rJ   z<$2a$04$oaQbBqq8JnSM1NHRPQGXORY4Vw3bdHKLIXTecPDRAcJ98cz1ilveOz<$2a$04$oaQbBqq8JnSM1NHRPQGXOOY4Vw3bdHKLIXTecPDRAcJ98cz1ilveO)rJ   <$2a$04$yjDgE74RJkeqC0/1NheSScrvKeu9IbKDpcQf/Ox3qsrRS/Kw42qIS<$2a$04$yjDgE74RJkeqC0/1NheSSOrvKeu9IbKDpcQf/Ox3qsrRS/Kw42qIS)rJ   z<$2a$04$yjDgE74RJkeqC0/1NheSSOrvKeu9IbKDpcQf/Ox3qsrRS/Kw42qIVr   c                   ^  T R                  S5        T R                  nSnU 4S jn[        S5       H  nU" UR                  5       5        M     [        S5       H1  nU" UR	                  UR
                  S9R                  S5      5        M3     T R                  SU/5         UR                  S	S
SS9nSSS5        T R                  WS5        T R                  nU GHj  u  pxn	T R                  U/5         T R                  UR                  Xx5      U	5        SSS5        T R                  / 5         T R                  UR                  Xy5      U	5        SSS5        T R                  U/5         T R                  UR                  Xx5      5        SSS5        T R                  / 5         T R                  UR                  Xy5      5        SSS5        T R                  U/5         T R                  UR                  U5      U	5        SSS5        T R                  / 5         T R                  UR                  U	5      U	5        SSS5        GMm     T R                  UR                  S5      S5        g! , (       d  f       GN= f! , (       d  f       GNo= f! , (       d  f       GNF= f! , (       d  f       GN= f! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       GM  = f)z2test passlib correctly handles bcrypt padding bitsr   z.*incorrectly set padding bitsc                    > U R                   " S5      (       a  [        U 5      S:  d   SU < 35       eTR                  U S   S;   SU < 35        g )N)z$2a$z$2b$   zunexpectedly malformed hash: z.Oeuz%unused bits incorrectly set in hash: )rN   ro   
assertTrue)r   r6   s    r:   check_padding:_bcrypt_test.test_90_bcrypt_padding.<locals>.check_paddingl  sN    ??#344Tb <59;<HOODH.IMOQr<   r   r[   r?   bobzsalt too largez.....................A.r   T)saltr?   relaxedNz<$2b$05$.....................................................z$md5$abc)require_TEST_MODEhandlerr
   	genconfigusing
min_roundsr   assertWarningListassertEqualknown_incorrect_paddinggenhashr   verifynormhash)
r6   rG   	corr_descr   ir   samplespwdbadgoods
   `         r:   test_90_bcrypt_padding#_bcrypt_test.test_90_bcrypt_padding^  s=   v& 4	
	Q
 A&**,- A&,,f.?.?,@EEeLM  ##%5y$AB##q$#OD C:;
 ..%NCd ''4  !94@ 5''+  !:DA , ''4c 78 5''+c 89 , ''4  !5t< 5''+  !6= ,+# &* 	4jA; CB 54++ 54++ 54++sT   "I-5"I?0"J,!J#&!J5!"K"K-
I<?
J	
J 	#
J2	5
K	
K	
K'	c                     U R                   R                  SS9nSnSnU R                  UR                  U5      5        U R	                  UR                  U5      5        g)z$needs_update corrects bcrypt paddingr@   r   r   r   N)r   r   r   needs_updateassertFalse)r6   rG   BAD1GOOD1s       r:   test_needs_update_w_padding(_bcrypt_test.test_needs_update_w_padding  sX     ##1#-
 ON++D12,,U34r<   r   )"r   r   r   r   __doc__r   rG   r   reduce_default_roundsfuzz_salts_need_bcrypt_repairr   known_correct_hashesr   CONFIG_2CONFIG_Aextendknown_correct_configsknown_unidentified_hashesknown_malformed_hashesplatform_crypt_supportr2   rB   rP   r   fuzz_verifiersrR   rS   rT   r^   r   r   r   r   r   r   s   @r:   r   r      sH   $kkG $(! 	USTTL 	PPQL	P	P	L	P	P	P	P	P 	V 4C	 "`a
4C	 "`a
4C	 "`a
4C	 "`a 	MMO	P	P 
N	P 
N	PeU
n  %%##==>==>H@@AH@@Ax"CCDx"CCDx"CCDx"CCD8&GGH8&GGH%
 	 
)+	G	I 	GF!
a :a !// 3 N@B.1K99 1828Bt5 5r<   r   rG   rk   r{   c            	           \ rS rSr\R
                   V VVs/ s H  n[        US   5      (       d  M  UPM     snnn rSrSrgs  snnn f )bcrypt_os_crypt_testi  r   Fr   N)	r   r   r   r   r   r   r	   has_os_crypt_fallbackr   ).0rowr	   s   000r:   r   r     sA     ,8+L+L <+LC23q6:  +L < "	<s
   AAr   os_cryptr%   c                     ^  \ rS rSrSr\R                  rSrSr	Sr
SS\S4\R                  " S5      S4S	\S
4\" SS5      S4\" SS5      S-   S4\" SS5      S-   S4SS\S4\R                  " S5      S4\" SS5      S4\" SS5      S-   S4\" SS5      S-   S4/rSS/r/ SQrU 4S jrU 4S jrS rS r " S S \R,                  5      rS! rS" rS#rU =r$ )$_bcrypt_sha256_testi  z!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/sovNz1iWg26quOU4Pjeabc123r\   zJ$bcrypt-sha256$2b,5$X1g1nh3g0v4h6970O68cxe$r/hyEtqJ0teqPEmfTLoZ83ciAI1Q74.qwrzJ$bcrypt-sha256$2b,5$X1g1nh3g0v4h6970O68cxe$021KLEif6epjot5yoxk0m8I0929ohEa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                   > [        S5      (       a  U R                  S:X  a  Sn[        R                  R	                  U5      nU(       a+  U R                  [        R                  R                  X5        O*U R                  [        R                  R                  U5        S[        R                  U'   [        [        U ]+  5         [        R                  " SS5        g )Nr   r%   r&   enabledr(   r)   )r   r*   r+   r,   r-   r.   r/   r0   r1   r   r2   r3   r4   r5   s      r:   r2   _bcrypt_sha256_test.setUp@  s    V!:*C::>>#&D

 6 6B

 6 6<'BJJsO!4.0*_`r<   c                 p   > U R                   S:X  a  UR                  SS5        [        [        U ]  U5        g r>   )r*   rA   r1   r   rB   rC   s     r:   rB   %_bcrypt_sha256_test.populate_settingsM  s-    <<9$OOHa(!4:4@r<   c                 $    U R                  S5      e)Nzmultiple idents not supported)skipTestr   s    r:   require_many_idents'_bcrypt_sha256_test.require_many_identsW  s    mm;<<r<   c                 T    U R                   nU" SS9  U R                  [        USSS9  g )NT)use_defaultsz$2y$)rO   r   )r   assertRaisesrb   )r6   r   s     r:   test_30_HasOneIdent'_bcrypt_sha256_test.test_30_HasOneIdentZ  s*    ,,T"*gV$Or<   c                        \ rS rSrS rS rSrg)%_bcrypt_sha256_test.FuzzHashGeneratorid  c                 *    U R                  SSSS5      $ r   r   r   s    r:   r   3_bcrypt_sha256_test.FuzzHashGenerator.random_roundsf  r   r<   c                     g)N2br   r   s    r:   random_ident2_bcrypt_sha256_test.FuzzHashGenerator.random_identj  s    r<   r   N)r   r   r   r   r   r   r   r   r<   r:   r^   r   d  s    	1	r<   r^   c                 F   U R                   nU R                  UR                  S5        UR                  SS9nU R                  UR                  S5        U R	                  [
        UR                  SS9  UR                  SSS9nU R	                  [
        UR                  SS9  g )N   r   )versioni  2a)r   rO   )rO   )r   r   r   r   r   rb   )r6   r   subclss      r:   test_using_version&_bcrypt_sha256_test.test_using_versionq  s    ,,!, q)+ 	*gmmSA q5*gmm4@r<   c                    SSK Jn  SSKJn  SSKJn  SnSnU" SUR                  S5      5      " UR                  S5      5      nU" U5      R                  S5      nU R                  US	5        U" S
USS9R                  U5      nU R                  US5        U R                  UR                  USU-   U-   5      5        U R                  S
USS9R                  U5      nU R                  X5        g)z&
test digest calc v2 matches bcrypt()
r   )rG   )compile_hmac)	b64encodenyKYxTAvjmy6lMDYMl11UurJ   sha256asciiz,J5TlyIDm+IcSWmKiDJm+MeICndBkFVPn4kKdJW8f+xY=r      )rO   r   r?   zM0wE0Ov/9LXoQFCe.jRHu3MSHPF54Taz$2b$12$N)passlib.hashrG   passlib.crypto.digestr   passlib.utils.binaryr   encodedecoder   _calc_checksumr   r   r   )	r6   rG   r   r   r   rc   temp_digestbcrypt_digestresults	            r:   test_calc_digest_v2'_bcrypt_sha256_test.test_calc_digest_v2  s     	(62 ("8T[[-AB6==QXCYZ,33G<&TU TR@OOP[\(IJk9t3Cm3STU DtB?NNvV/r<   r   )r   r   r   r   r   r   bcrypt_sha256r   r   forbidden_charactersr   r   r  r   r   r   r   r2   rB   r   r   r   r^   r   r  r   r   r   s   @r:   r   r     s   '  G $(!	Z	Z 
X	Z			G	$X	Z	Z	X	Z
 
x	$X	Z	x	$u	,X	Z	x	$u	,X	Z	b	b 
`	b			G	$`	b
 
x	$`	b	x	$u	,`	b	x	$u	,`	bw=
B	c	k/haA=PK99 A 0 0r<   r   c                   (    \ rS rSr\S 5       rSrSrg)bcrypt_sha256_os_crypt_testi  c                 *    [         R                  5       $ )N)r   _get_safe_crypt_handler_backend)clss    r:   r  ;bcrypt_sha256_os_crypt_test._get_safe_crypt_handler_backend  s    #CCEEr<   Fr   N)r   r   r   r   classmethodr  r   r   r   r<   r:   r  r    s    F F "r<   r  )'r   
__future__r   logging	getLoggerr   logr+   r3   passlibr   rK   r   r   rL   r   r   r	   passlib.utils.compatr
   r   passlib.tests.utilsr   r   passlib.tests.test_handlersr   r   create_backend_casebcrypt_bcrypt_testbcrypt_pybcrypt_testbcrypt_bcryptor_testr   bcrypt_builtin_testr   bcrypt_sha256_bcrypt_testbcrypt_sha256_pybcrypt_testbcrypt_sha256_bcryptor_testr  bcrypt_sha256_builtin_testr   r<   r:   <module>r'     s   E & g''1 	   5 F F , 6 3M5; M5h "55h? #77
C #77
C "<;;JG " #66yA 
\0+ \0F 0CCHM 1EEjQ 1EEjQ ""5"I"I*"U " 1DDYO r<   