
    XR_ms                        d Z ddlmZ ddlZ ej        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e          Ze                    d          Ze                    d          Ze                    d          Z G d de                    d                    Ze                    d          Z  G d de          Z!e!                    d          Z"e!                    d          Z#e!                    d          Z$ G 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                   "    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#          rUd$Zd%Ze
                    d&ed'z   fd&ed'z   fd(ed)z   fd(ed*z   fd+ed)z   fd+ed,z   fd-ed)z   fd-ed)z   fd.ed)z   fd.ed)z   fg
           d/e	d0fgZd1d2gZg d3Zg d4Z fd5Z fd6Zd7 Zej        d8z   Zd9 Zd: Zd; Z G d< d=ej                  Zg d>Zd? Zd@ Z xZS )A_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.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                    t          d          r| j        dk    r~d}t          j                            |          }|r'|                     t          j        j        ||           n%|                     t          j        j        |           dt          j        |<   t          t          |           
                                 t          j        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__s      D/usr/lib/python3/dist-packages/passlib/tests/test_handlers_bcrypt.pyr1   z_bcrypt_test.setUp   s    V 	%!:!:*C:>>#&&D =
 6TBBBB
 6<<<$BJsOlD!!''))) 	*_`````    c                     | j         dk    r|                    dd           t          t          |                               |           d S Nr$   rounds   )r)   
setdefaultr0   r   populate_settingsr5   kwdsr8   s     r9   r@   z_bcrypt_test.populate_settings   sH    <9$$OOHa(((lD!!33D99999r:   c                     ddl m}m}m} ddlm} |                    |          } |d|dz             pd                    |          S )z4check if OS crypt is expected to support given identr   )bcryptr   IDENT_2Y)
safe_crypttestz04$5BJqKfqMQvV7nS.yUguNcur   )passlib.handlers.bcryptrD   r   rE   passlib.utilsrF   from_string
startswith)r5   r   rD   r   rE   rF   idents          r9   crypt_supports_variantz#_bcrypt_test.crypt_supports_variant   sq    FFFFFFFFFF,,,,,,""4((
65+F#FGGM2YYZ_```r:   )fuzz_verifier_bcryptfuzz_verifier_pybcryptfuzz_verifier_bcryptorc                     	
 ddl mmmm}mm} ddlm}m	
 	 dd l
	n# t          $ r Y d S w xY w |            rd S 	 
fd}|S )Nr   )r   IDENT_2AIDENT_2Br   rE   _detect_pybcrypt)to_native_strr   c                     | j         j                  }  |j                  r|dd         z   }nX |j                  r |dd         z   }| rt          | d          } n( |j                  rj        dk    r|dd         z   } |          }	                     | |          |k    S # t          $ r t          d|d| d          w xY w)	rD   r>   N   H   z3.0.0zbcrypt rejected hash: z	 (secret=))FuzzHashGeneratorpassword_encodingrK   r   __version__hashpw
ValueError)	secretr   r   rR   rS   rE   rD   r5   r   s	     r9   check_bcryptz7_bcrypt_test.fuzz_verifier_bcrypt.<locals>.check_bcrypt   s    Xfd&<&NOOFtx(( +$qrr(* )) +  $qrr(* 7*6266F ** +v/AW/L/L$qrr(*8D>>DZ}}VT22d:: Z Z Z j444QWQWQW!XYYYZs   B4 4!C)rH   r   rR   rS   r   rE   rT   rI   rU   r   rD   ImportError)r5   r   rT   rU   r`   r   rR   rS   rE   rD   r   s   `    @@@@@@r9   rN   z!_bcrypt_test.fuzz_verifier_bcrypt   s    mmmmmmmmmmmmmmmm99999999	MMMM 	 	 	FF	 	F	Z 	Z 	Z 	Z 	Z 	Z 	Z 	Z 	Z 	Z 	Z( s   & 
44c                     	
 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}|S )Nr   )r   rR   rS   r   rE   _PyBcryptBackendrU   pybcryptF)	_pybcryptc                     | j         j                  } t          |           dk    r
| dd         }  |j        f          r|dd         z   }	 r65                      | |          |k    cddd           S # 1 swxY w Y   dS                     | |          |k    S # t
          $ r t          d|          w xY w)re      Nr>   zpy-bcrypt rejected hash: )rZ   r[   lenrK   r]   r^   )	r_   r   rR   rS   rE   
bcrypt_modlockr5   rU   s	     r9   check_pybcryptz;_bcrypt_test.fuzz_verifier_pybcrypt.<locals>.check_pybcrypt  sY   "]64+A+STTF6{{S  t(344 +$qrr(*J C G G)00>>$FG G G G G G G G G G G G G G G G G G &,,VT::dBB J J J j$$!HIIIJs6   B' B 3B'  BB' BB' B' 'C)rH   r   rR   rS   r   rE   rc   rI   rU   _load_backend_mixinrf   
_calc_lock)r5   r   r   rc   loadedrl   rR   rS   rE   rj   rk   rU   s   `     @@@@@@r9   rO   z#_bcrypt_test.fuzz_verifier_pybcrypt   s    	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	0/////!55j%HH 	FCCCCCC*	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J r:   c                      ddl mmmm ddlm 	 ddlm n# t          $ r Y d S w xY w fd}|S )Nr   )r   rR   rE   rS   rd   )Enginec                     | j         j                  }  |j        f          r|dd         z   }n/ |j                  r|dd         z   }| rt          | d          }  d                              | |          |k    S )bcryptorr>   NrW   rX   F)rZ   r[   rK   r   hash_key)	r_   r   rq   r   rR   rS   rE   r5   rU   s	     r9   check_bcryptorz;_bcrypt_test.fuzz_verifier_bcryptor.<locals>.check_bcryptor  s    "]64+A+STTFt(344 7$qrr(* )) 7  $qrr(* 7*6266F6%==))&$774??r:   )
rH   r   rR   rE   rS   rI   rU   bcryptor.enginerq   ra   )r5   ru   rq   r   rR   rS   rE   rU   s   ` @@@@@@r9   rP   z#_bcrypt_test.fuzz_verifier_bcryptor  s    QQQQQQQQQQQQ//////	....... 	 	 	FF		@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ s   " 
00c                   $     e Zd Z fdZd Z xZS )_bcrypt_test.FuzzHashGeneratorc                    t          t          j        |                                           }|d         }|d         }|d         }|                    d          }|t
          k    r|d= nr|t          k    rg|ret          t          |          t          t          |                              t          |          k    r| 
                                \  |d<   |d<   |S )Nr_   othersettingsrL   )r0   r   rZ   generater,   r   r   r   r   ri   random_password_pair)r5   optsr_   rz   r{   rL   r8   s         r9   r|   z'_bcrypt_test.FuzzHashGenerator.generate+  s    7>>GGIID(^FMEJ'HLL))E  W%%'!!e!huoosS[\bScScOdOd0e0eiqrxiyiy0y0y 150I0I0K0K-XWKr:   c                 2    |                      dddd          S N            randintgaussr5   s    r9   random_roundsz,_bcrypt_test.FuzzHashGenerator.random_rounds>      $$Q1a000r:   )__name__
__module____qualname__r|   r   __classcell__r8   s   @r9   rZ   rx   )  sG        	 	 	 	 	&	1 	1 	1 	1 	1 	1 	1r:   rZ   ))rG   z<$2a$04$oaQbBqq8JnSM1NHRPQGXORY4Vw3bdHKLIXTecPDRAcJ98cz1ilveOz<$2a$04$oaQbBqq8JnSM1NHRPQGXOOY4Vw3bdHKLIXTecPDRAcJ98cz1ilveO)rG   <$2a$04$yjDgE74RJkeqC0/1NheSScrvKeu9IbKDpcQf/Ox3qsrRS/Kw42qIS<$2a$04$yjDgE74RJkeqC0/1NheSSOrvKeu9IbKDpcQf/Ox3qsrRS/Kw42qIS)rG   z<$2a$04$yjDgE74RJkeqC0/1NheSSOrvKeu9IbKDpcQf/Ox3qsrRS/Kw42qIVr   c                                           d            j        }d} fd}t          d          D ]} ||                                            t          d          D ]9} ||                    |j                                      d                     :                     d|g          5  |                    d	d
d          }ddd           n# 1 swxY w Y                        |d            j	        }|D ]\  }}}	                     |g          5                       |
                    ||          |	           ddd           n# 1 swxY w Y                        g           5                       |
                    ||	          |	           ddd           n# 1 swxY w Y                        |g          5                       |                    ||                     ddd           n# 1 swxY w Y                        g           5                       |                    ||	                     ddd           n# 1 swxY w Y                        |g          5                       |                    |          |	           ddd           n# 1 swxY w Y                        g           5                       |                    |	          |	           ddd           n# 1 swxY w Y                        |                    d          d           dS )z2test passlib correctly handles bcrypt padding bitsr   z.*incorrectly set padding bitsc                      | j         d          rt          |           dk    sJ d|                                 | d         dv d|            d S )N)z$2a$z$2b$   zunexpectedly malformed hash: z.Oeuz%unused bits incorrectly set in hash: )rK   ri   
assertTrue)r   r5   s    r9   check_paddingz:_bcrypt_test.test_90_bcrypt_padding.<locals>.check_paddingl  sw    "4?#344 <Tb59T; :IOODH..IMOQ Q Q Q Qr:   r   rW   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)
r5   rD   	corr_descr   ir   samplespwdbadgoods
   `         r9   test_90_bcrypt_paddingz#_bcrypt_test.test_90_bcrypt_padding^  s/   v&&& 4	
	Q 	Q 	Q 	Q 	Q
  	. 	.AM&**,,---- 	N 	NAM&,,f.?,@@EEeLLMMMM
 ##%5y$ABB 	P 	P##q$#OOD	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P:;;;
 .% 	> 	>NCd ''44 A A  S!9!94@@@A A A A A A A A A A A A A A A''++ B B  T!:!:DAAAB B B B B B B B B B B B B B B ''44 9 9c3 7 78889 9 9 9 9 9 9 9 9 9 9 9 9 9 9''++ : :c4 8 8999: : : : : : : : : : : : : : : ''44 = =  !5!5t<<<= = = = = = = = = = = = = = =''++ > >  !6!6===> > > > > > > > > > > > > > > 	44jAAAAAs~   4CC C +EE	E	7+F..F2	5F2	*HH		H		%*II	"I	<*J22J6	9J6	*LL	L	c                     | j                             d          }d}d}|                     |                    |                     |                     |                    |                     dS )z$needs_update corrects bcrypt paddingr>   r   r   r   N)r   r   r   needs_updateassertFalse)r5   rD   BAD1GOOD1s       r9   test_needs_update_w_paddingz(_bcrypt_test.test_needs_update_w_padding  sq     ##1#--
 ON++D11222,,U3344444r:   ) r   r   r   __doc__r   rD   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_supportr1   r@   rM   r   fuzz_verifiersrN   rO   rP   rZ   r   r   r   r   r   s   @r9   r   r      s       $$kG $(! 	USTTL 	PPQL	P	P	L	P	P	P	P	P 	V 4C4	 "`a
4C4	 "`a
4C4	 "`a
4C4	 "`a 	MMO	P	P 
N	P 
N	PeU
n y  %%##==>==>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 a a a : : : : :a a a !/ 3 N  @  B  .1 1 1 1 1K9 1 1 18  28B 8B 8Bt5 5 5 5 5 5 5r:   r   rD   re   rs   c                   4    e Zd Zd ej        D             ZdZdS )bcrypt_os_crypt_testc                 <    g | ]}t          |d                    |S )r   )r	   ).0rows     r9   
<listcomp>zbcrypt_os_crypt_test.<listcomp>  s8     < < <C23q6::<C < < <r:   FN)r   r   r   r   r   has_os_crypt_fallback r:   r9   r   r     s9        < <<+L < < < "r:   r   os_cryptr$   c                       e Zd ZdZej        ZdZdZdZ	dde
df e
j        d          dfde
d	f ed
d          df ed
d          dz   df ed
d          dz   dfdde
df e
j        d          df ed
d          df ed
d          dz   df ed
d          dz   dfgZddgZg dZ fdZ fdZd Zd Z G d dej                  Zd  Zd! Z xZS )"_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/sovNz1iWg26quOU4Pjeabc123rX   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                    t          d          r| j        dk    r~d}t          j                            |          }|r'|                     t          j        j        ||           n%|                     t          j        j        |           dt          j        |<   t          t          |           
                                 t          j        dd           d S )Nr   r$   r%   enabledr'   r(   )r   r)   r*   r+   r,   r-   r.   r/   r0   r   r1   r2   r3   r4   s      r9   r1   z_bcrypt_sha256_test.setUp@  s    V 	(!:!:*C:>>#&&D =
 6TBBBB
 6<<<'BJsO!4((..000*_`````r:   c                     | j         dk    r|                    dd           t          t          |                               |           d S r<   )r)   r?   r0   r   r@   rA   s     r9   r@   z%_bcrypt_sha256_test.populate_settingsM  sI    <9$$OOHa(((!4((::4@@@@@r:   c                 ,    |                      d          )Nzmultiple idents not supported)skipTestr   s    r9   require_many_identsz'_bcrypt_sha256_test.require_many_identsW  s    mm;<<<r:   c                 h    | j         } |d           |                     t          |dd           d S )NT)use_defaultsz$2y$)rL   r   )r   assertRaisesr^   )r5   r   s     r9   test_30_HasOneIdentz'_bcrypt_sha256_test.test_30_HasOneIdentZ  s?    ,T""""*gV$OOOOOr:   c                       e Zd Zd Zd ZdS )%_bcrypt_sha256_test.FuzzHashGeneratorc                 2    |                      dddd          S r   r   r   s    r9   r   z3_bcrypt_sha256_test.FuzzHashGenerator.random_roundsf  r   r:   c                     dS )N2br   r   s    r9   random_identz2_bcrypt_sha256_test.FuzzHashGenerator.random_identj  s    4r:   N)r   r   r   r   r   r   r:   r9   rZ   r   d  s2        	1 	1 	1	 	 	 	 	r:   rZ   c                 b   | j         }|                     |j        d           |                    d          }|                     |j        d           |                     t
          |j        d           |                    dd          }|                     t
          |j        d           d S )N   r   )versioni  2a)r   rL   )rL   )r   r   r   r   r   r^   )r5   r   subclss      r9   test_using_versionz&_bcrypt_sha256_test.test_using_versionq  s    ,!,,, q))+++ 	*gmSAAA q55*gm4@@@@@r:   c                 ^   ddl m} ddlm} ddlm} d}d}  |d|                    d                    |                    d                    } ||                              d          }|                     |d	            |d
|d          	                    |          }|                     |d           | 
                    |                    |d|z   |z                        |                     d
|d          	                    |          }|                     ||           dS )z6
        test digest calc v2 matches bcrypt()
        r   )rD   )compile_hmac)	b64encodenyKYxTAvjmy6lMDYMl11UurG   sha256asciiz,J5TlyIDm+IcSWmKiDJm+MeICndBkFVPn4kKdJW8f+xY=r      )rL   r   r=   zM0wE0Ov/9LXoQFCe.jRHu3MSHPF54Taz$2b$12$N)passlib.hashrD   passlib.crypto.digestr   passlib.utils.binaryr   encodedecoder   _calc_checksumr   r   r   )	r5   rD   r   r   r   r_   temp_digestbcrypt_digestresults	            r9   test_calc_digest_v2z'_bcrypt_sha256_test.test_calc_digest_v2  sY    	('''''666666222222 (Bll8T[[-A-ABB6==QXCYCYZZi,,33G<<&TUUU TR@@@OOP[\\(IJJJk9t3Cm3STTUUU DtB??NNvVV/////r:   )r   r   r   r   r   bcrypt_sha256r   r   forbidden_charactersr   r   r   r   r   r   r   r1   r@   r   r   r   rZ   r   r   r   r   s   @r9   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 a a aA A A A A= = =P P P    K9   A A A 0 0 0 0 0 0 0r:   r   c                   (    e Zd Zed             ZdZdS )bcrypt_sha256_os_crypt_testc                 4    t                                           S )N)r   _get_safe_crypt_handler_backend)clss    r9   r   z;bcrypt_sha256_os_crypt_test._get_safe_crypt_handler_backend  s    #CCEEEr:   FN)r   r   r   classmethodr   r   r   r:   r9   r   r     s4        F F [F "r:   r   )'r   
__future__r   logging	getLoggerr   logr*   r2   passlibr   rH   r   r   rI   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:   r9   <module>r     s]   E E & % % % % % 'g'11 				        5 5 5 5 5 5 5 5 F F F F F F F F F F , , , , , , , , 6 6 6 6 6 6 6 6 3 3 3 3 3 3M5 M5 M5 M5 M5; M5 M5 M5h "55h?? #77
CC #77
CC " " " " "<;;JGG " " " #66yAA 
\0 \0 \0 \0 \0+ \0 \0 \0F 0CCHMM 1EEjQQ 1EEjQQ " " " " ""5"I"I*"U"U " " " 1DDYOO   r:   