+
    i                     `   R t ^ RIt^ RIHt ^ RIt]P
                  ! ]4      t^ RIt^ RI	t
^ RIHt ^ RIHtHt ^ RIHtHt ^ RIHt ^ RIHtHtHt R.t];tt]P:                  R8  d   ^ R	IHt ]P:                  R8  d   ^ R	IHt R
t Rt!Rt"Rt#Rt$Rt%Rt&Rt']PP                  PR                  ^8X  g   Q R4       h]PP                  PT                  ^,8  g   Q R4       hR t+]+! 4       t,R t- ! R R]4      t.RP_                  R4      t0]0^,          R,          t1]0^,          R,          t2 ! R R]4      t3R# ) z"passlib.tests -- test passlib.totpN)partial)exc)unicodeu)TestCase	time_call)totp)TOTP	AppWalletAES_SUPPORT
EngineTest)Errorabcdefs    4AOGGDBBQSYHNTUZs
   c!vΙs   ]90 Dy/4&S3JDVB7QD2R7JPXXJBSWY3DPEHPK3PXPs
   Hello!ޭzunexpected float_info.radixz#double precision unexpectedly smallc                     Rp ^ p V ^,          p \         P                   P                  V^,
          4      P                  pY18  d   MTp KF  T ^,          p Rp\        Y4      #   \        \        \
        3 d     K/  i ; i)z0
helper to calc max_time_t constant (see below)
l    i   @)datetimeutcfromtimestampyear
ValueErrorOSErrorOverflowErrormin)valuer   
next_value	next_yearmax_datetime_timestamps        U/var/www/html/photoedit/myenv/lib/python3.14/site-packages/passlib/tests/test_totp.py_get_max_time_tr   8   s     ED
aZ
	 )):::a<HMMI,  
QJE
 *u--C G]3 	 	s   0A! !A;:A;c                 0    V ^,          ^,           ^,          # )    )raw_sizes   &r   to_b32_sizer$   i   s    qL1""    c                   b   a  ] tR t^ot o RtR tR tR tRR ltR t	R t
RR	 ltR
 tR tRtV tR# )AppWalletTestzpasslib.totp.AppWalletc                   \        4       pV P                  VP                  / 4       V P                  VP                  4       RRRR/p\        V4      pV P                  VP                  V4       V P                  VP                  4       \        R4      pV P                  VP                  V4       \        R4      pV P                  VP                  RRRR/4       \        R4      pV P                  VP                  V4       V P                  \        \         ^{4       V P                  \        \         R	4       V P                  \        \         RR
RR/4       R# )z-constructor -- 'secrets' param -- input types1   aaa2   bbbz
 1: aaa
# comment
 
2: bbb   z"1: aaa: bbb 
# comment
 
2: bbb   s   aaa: bbbz{"1":"aaa","2":"bbb"}z[123]aaa N)	r
   assertEqual_secretsassertFalsehas_secrets
assertTrueassertRaises	TypeErrorr   )selfwalletrefs   &  r   test_secrets_types AppWalletTest.test_secrets_typesv   s#    "-++, FC(3#.**+ ?@#. BC3S&*IJ 23#. 	)Y4 	)Y8 	*i#uc21FGr%   c           	     0   RRRRRR/p\        V4      pV P                  VP                  V4       \        \        R4      R\        R4      R\        R4      R/4      pV P                  VP                  V4       \        ^RRRRR/4      pV P                  VP                  V4       V P	                  \
        \         RR/4       \        RR/4      pV P	                  \        \         R	R/4       V P	                  \        \         R
R/4       \        R\        R4      RRRR/4      pV P                  VP                  V4       V P	                  \
        \         R^{/4       V P	                  \
        \         RR/4       V P	                  \
        \         R. /4       R# )z9constructor -- 'secrets' param -- tag/value normalizationr)   r*   02r,   Cs   cccr-   z1-2_3.4z-abczab*$bbbN)   )r
   r/   r0   r   r4   r5   r   )r6   r8   r7   s   &  r   test_secrets_tagsAppWalletTest.test_secrets_tags   se    FD&#v63#. AcFFAdGVQsVVLM#. AvtVS&AB#. 	)Yu> Iv./ 	*i&%A*i&%A C54VDE#. 	)Yc
;)Yd<)Yb	:r%   c           
        \        RRRR/4      pV P                  VP                  R4       V P                  VP                  VP                  4      R4       \        RRRRRR/4      pV P                  VP                  R4       V P                  VP                  VP                  4      R4       \        RRRRRR/RR	7      pV P                  VP                  R4       V P                  VP                  VP                  4      R
4       V P	                  \
        \         RRRRRR/RR	7       \        4       pV P                  VP                  R4       V P	                  \
        VP                  R4       R# )z"constructor -- 'default_tag' paramr)   oner<   twos   twoAr-   r*   )default_tags   oneBN)r
   r/   rF   
get_secretr4   KeyError)r6   r7   s   & r   test_default_tagAppWalletTest.test_default_tag   sR    Ce45++T2**6+=+=>G CeS%@A++S1**6+=+=>G CeS%@cR++S1**6+=+=>G 	(IUD%e/T&) 	 	+ ++T2(F$5$5t<r%   Nc                    \         '       d   T;'       d    V! 4        R#  R# T;'       d    V P                  \        V4       V P                  R 4      h)z$'cryptography' package not installedN)r   r4   RuntimeErrorskipTest)r6   canarys   &&r   require_aes_support!AppWalletTest.require_aes_support   s@    ;vx>>t((v>-- FGGr%   c                   \        R\        R\        /4      p\        ^^RRRR7      pV P	                  \        VP                  V4      R7       V P                  VP                  V4      ^ ,          \        4       \        ^^RRRR7      pV P                  VP                  V4      ^ ,          \        4       \        ^^R	R
RR7      pV P                  VP                  V4      ^ ,          \        4       VP                  4       pVP                  RR7       V P                  VP                  V4      ^ ,          R4       VP                  4       pVP                  RR7       V P                  \        VP                  V4       VP                  4       pVP                  RR7       V P                  \        VP                  V4       R# )z.decrypt_key()r)   r+   6D7N7W53O7HHS37NLUFQMHCTEGSNPFN5CGBJvcsktrO   SPZJ54Y6IPUD2BYA4C6AZGDXXTVQOWYLC2AUFCCTARTIJWE7CPQHUDKA D2DRS32YESGHHINWFFCELKN7Z6NAHM4MrZ   s
   D6.F7Q3  )rV   N)r
   PASS1PASS2dictrP   r   decrypt_keyr/   KEY1_RAWKEY2_RAWcopyupdater4   rI   r   )r6   r7   CIPHER1CIPHER2CIPHER3temps   &     r   test_decrypt_keyAppWalletTest.test_decrypt_key   s    CU34 b$:+s4  0B0BG(L M 	++G4Q7B b$:+s4++G4Q7B a#9;sD++G4Q7B ||~c++D1!46OP ||~c(F$6$6= ||~c*f&8&8$?r%   c                   V P                  4        \        R\        R\        /^R7      p\	        ^^RRRR7      pV P                  VP                  V4      ^,          4       VP                  4       pVP                  ^R7       V P                  VP                  V4      ^,          4       VP                  4       pVP                  RR7       V P                  VP                  V4      ^,          4       R# )	z$.decrypt_key() -- needs_recrypt flagr)   r+   encrypt_costAAAArU   )rW   r`   N)
rP   r
   rc   rd   re   r1   rf   ri   rj   r3   )r6   r7   r8   rn   s   &   r   test_decrypt_key_needs_recrypt,AppWalletTest.test_decrypt_key_needs_recrypt  s      "CU3"E Q"&C8++C034 xxza**4034 xxzc**4034r%   c                8   V P                  \        V4      \        . RO4      4       V P                  VR,          ^4       V P                  VR,          V4       V P                  VR,          VP                  4       V P                  \        VR,          4      \	        VP
                  4      4       V P                  \        VR,          4      \	        \        V4      4      4       VP                  V4      w  rgV P                  Wc4       V P                  Wu4       R# )z.check encrypt_key() result has expected formatrV   rZ   rW   rX   rY   N)rV   rZ   rW   rX   rY   )r/   setrs   lenr$   	salt_sizerf   )r6   resultr7   keytagneeds_recrypt
result_keyresult_needs_recrypts   &&&&&&  r   assertSaneResultAppWalletTest.assertSaneResult0  s     	Vc*C&DEa(c*f&9&9:VC[);v7G7G+HIVC[);s3x+@A+1+=+=f+E(
)-=r%   c                   \        R\        /^R7      pV P                  \        VP                  \
        4      R7       VP	                  \
        4      pV P                  W!\
        4       VP	                  \
        4      pV P                  W!\
        4       V P                  VR,          VR,          4       V P                  VR,          VR,          4       \        R\        /^R7      pVP	                  \
        4      pV P                  W$\
        4       \        R\        R\        /4      pVP	                  \
        4      pV P                  W$\
        RR7       \        R\        /4      p^@Vn	        VP	                  \
        4      pV P                  W$\
        4       VP	                  \        4      pV P                  W!\        4       V P                  \        VP                  R4       R	# )
z.encrypt_key()r)   rr   r[   rX   rY   r+   )r}   r%   N)r
   rc   rP   r   encrypt_keyrg   r   assertNotEqualrd   rz   rh   r4   r   )r6   r7   r{   otherwallet2s   &    r   test_encrypt_keyAppWalletTest.test_encrypt_keyA  s    C<a8  0B0BH(M N ##H-fh7 ""8,fh7E#Js4E#Js4 S%Lq9$$X.fx8 S%e45$$X.fxSA S%L)$$X.fx8 ##H-fh7 	*f&8&8#>r%   c                   V P                  4        \        RR/4      pV;P                  ^,          un        \        \	        VP
                  \        4      ^ R7      w  r#V;P                  ^,          un        \        \	        VP
                  \        4      ^ R7      w  rCV P                  WB^,          V^,          R,          R7       R# )z verify cost parameter via timingr)   r-   )maxtime      ?)deltaN)rP   r
   rs   r   r   r   rg   assertAlmostEqual)r6   r7   r   _delta2s   &    r   test_encrypt_cost_timing&AppWalletTest.test_encrypt_cost_timingj  s      " C<(q WV%7%7BAN 	q gf&8&8(CQO	 	vQwuQwmDr%   r"   N)r)   F)__name__
__module____qualname____firstlineno__descriptionPrefixr9   r@   rJ   rP   ro   ru   r   r   r   __static_attributes____classdictcell__)__classdict__s   @r   r'   r'   o   sG     00Hd!;J=@H$@L5,>"'?RE Er%   r'   12345678901234567890ascii:N    N:N@   Nc                     a a ] tR tRt oRtRtV 3R ltR tR;R ltR t	]
! RR	^^R
7      t]
! R^R7      R<R=R>R?R@.]
! R^R7      RARBRCRDRE.]
! R^R7      RFRG.]
! ]RR	R7      RHRIRJRKRLRM.]
! ]RRR7      RNRORPRQRRRS.]
! ]RRR7      RTRURVRWRXRY.]
! R^R7      RZR[.]
! R^	^)R7      R\.]
! ]R^<R7      R].]
! ]RR^<R7      R^.]
! ]RR^<R7      R_..tR tR tR tR tR tR tR tR tR tR tR  tR;R! ltR" tR# tR$ tR% tR& t R' t!R`R( lt"R) t#R* t$R+ t%R, t&R;R- lt'R;R. lt(R/ t)R0 t*R1 t+R2 t,R3 t-R4 t.R5 t/R6 t0R7 t1R8 t2R9 t3R:t4Vt5V ;t6# )aTotpTesti  z+
common code shared by TotpTest & HotpTest
zpasslib.totp.TOTPc                   < \         \        V `  4        ^ RIHp VP                  4        V P                  \        RV P                  4       4       R# )    )lookup_hashrngN)	superr   setUppasslib.crypto.digestr   clear_cache	patchAttrtotp_module	getRandom)r6   r   	__class__s   & r   r   TotpTest.setUp  s:    h#% 	6! 	{E4>>+;<r%   c                T    V P                  4       P                  4       \        ,          # )zA
helper to generate random epoch time
:returns float: epoch time
)r   random
max_time_tr6   s   &r   randtimeTotpTest.randtime  s    
 ~~&&(:55r%   c                4   V P                  4       pRV9  d   RVR&   VP                  RVP                  ^^
4      4       VP                  RVP                  . RO4      4       VP                  RVP                  ^
^x4      4       T;'       g    \        ! R/ VB # )	z0
helper which generates a random TOTP instance.
r|   Tnewdigitsalgperiod)sha1sha256sha512r"   )r   
setdefaultrandintchoicer	   )r6   clskwdsr   s   &&, r   randotpTotpTest.randotp  s     nnDK#++a"45szz*FGH#++b#"67t$t$$r%   c                   V P                  4       pV P                  4       pV P                  VP                  VP                  R4       \        ^
4       F0  pVP                  VP                  8w  d    M%V P                  4       pK2  	  V P                  R4       \        ^
4       F1  pVP                  VP                  8w  d    R# V P                  4       pK3  	  V P                  R4       R# )z
internal test -- randotp()
zkey not randomized:zdigits not randomizedzalg not randomizedN)r   r   r|   ranger   failr   )r6   otp1otp2r   s   &   r   test_randotpTotpTest.test_randotp  s     ||~||~DHHdhh0EF rA{{dkk)<<>D 
 II-. rAxx488#<<>D 
 II*+r%   base32r   )formatr   r   r   ACDEFGHJKL234567)r|   r   zS3JD-VB7Q-D2R7-JPXXraw)r|   r   r   r   r   r   )r|   r   r   )r|   r   r   )r|   r   r   r   c           	   #  z  "   ^ RI Hp V P                   F  pV P                  P	                  4       pVP                  V^ ,          4       VR,           F^  p\        V4      ^8X  d   Vw  rVpMVw  rVRp\        P                  RW5Wg4       V! R	/ VB pRVP                  : RV: RV: R2p	WWgV	3x  K`  	  K  	  R# 5i)
z^
helper to iterate over test vectors.
yields ``(totp, time, token, expires, prefix)`` tuples.
r	   :r?   NNNz+test vector: %r time=%r token=%r expires=%rzalg= time= token=z: r"   )
passlib.totpr	   vectorsvector_defaultsri   rj   ry   logdebugr   )
r6   r	   rowr   entrytimetokenexpiresotpprefixs
   &         r   iter_test_vectorsTotpTest.iter_test_vectors.  s     
 	&<<C'',,.DKKARu:?+0(D"'KD"G 		GUZdlTl8;uM77 !  s   B9B;c                    V P                  \        \        4       V P                  \        \        RRR7       \        RR7      p\        RR7      pV P                  VP                  VP                  4       R# )zconstructor -- 'new'  parameter4aoggdbbqsyhntuzT)r|   r   r   N)r4   r5   r	   r   r|   )r6   r   r   s   &  r   test_ctor_w_newTotpTest.test_ctor_w_newG  sX     	)T*)T/AtL tn~CGGTXX.r%   c           	        V P                  \        \        RRR7      P                  4      ^4       V P                  \        \        RRR7      P                  4      ^ 4       V P                  \        \        RRR7      P                  4      ^@4       V P                  \        \        R^
R7      P                  4      ^
4       V P                  \        \        R^R7      P                  4      ^4       V P	                  \
        \        R^RR7       V P	                  \
        \        R^	R7       V P                  \        \        P                  RR	7      .4      ;_uu_ 4        \        RR
4      pRRR4       R#   + '       g   i     R# ; i)z constructor -- 'size'  parameterTr   )r   r   r   r   r   size)r   r   r   z-.*for security purposes, secret key must be.*category
message_rehexN0A0A0A0A0A0A0A0A0A)
r/   ry   r	   r|   r4   r   assertWarningListre   r   PasslibSecurityWarning)r6   r   s   & r   test_ctor_w_sizeTotpTest.test_ctor_w_sizeS  s2    	Td7;;<bATd9==>CTd9==>C 	Td48892>Td48892> 	*d26J 	*d1= ##c88Etu%   VU#A   s   E66F	c                F   V P                  \        \        4      P                  \        4       V P                  \        \        P                  4       4      P                  \        4       V P                  \        R4      P                  \        4       V P                  \        \        R4       V P                  \        RR4      P                  \        4       V P                  \        \        RR4       V P                  \        \        R4      P                  \        4       R# )z,constructor -- 'key' and 'format' parametersz 4aog gdbb qsyh ntuz zao!ggdbbqsyhntuze01c630c2184b076ce99r   X01c630c2184b076ce99r   N)	r/   r	   KEY1r|   rg   lowerr4   Base32DecodeErrorBase16DecodeErrorr   s   &r   test_ctor_w_key_and_format#TotpTest.test_ctor_w_key_and_formatk  s     	d2 	djjl+//: 	56::HE 	+T3EF 	4e<@@(K 	+T3I5Q 	h.22H=r%   c                    V P                  \        \        RR7      P                  R4       V P                  \        \        RR7      P                  R4       V P	                  \
        \        \        RR7       R# )zconstructor -- 'alg' parameterzSHA-256r   r   SHA256zSHA-333N)r/   r	   r   r   r4   r   r   s   &r   test_ctor_w_algTotpTest.test_ctor_w_alg  sW     	d	266Ad155x@ 	*dDi@r%   c                6   V P                  \        \        \        ^R7       V P	                  \        \        ^R7      P
                  ^4       V P	                  \        \        ^
R7      P
                  ^
4       V P                  \        \        \        ^R7       R# )z!constructor -- 'digits' parameterr   N)r4   r   r	   r   r/   r   r   s   &r   test_ctor_w_digitsTotpTest.test_ctor_w_digits  sj    *dD;d1-44a8d2.55r:*dD<r%   c                   V P                  \        \        4      P                  ^4       V P                  \        \        ^?R7      P                  ^?4       V P	                  \
        \        \        RR7       V P	                  \
        \        \        RR7       V P	                  \        \        \        ^ R7       V P	                  \        \        \        RR7       R# )z!constructor -- 'period' parameterr         ?abcN)r/   r	   r   r   r4   r5   r   r   s   &r   test_ctor_w_periodTotpTest.test_ctor_w_period  s     	d**B/ 	d2.55r: 	)T4<)T4> 	*dD;*dD<r%   c                    V P                  \        \        4      P                  R4       V P                  \        \        RR7      P                  R4       V P	                  \
        \        \        RR7       R# )z constructor -- 'label' parameterNzfoo@bar)labelzfoo:bar)r/   r	   r   r  r4   r   r   s   &r   test_ctor_w_labelTotpTest.test_ctor_w_label  sP    d))40d)4::IF*dD	Br%   c                    V P                  \        \        4      P                  R4       V P                  \        \        RR7      P                  R4       V P	                  \
        \        \        RR7       R# )z!constructor -- 'issuer' parameterNzfoo.comissuerzfoo.com:bar)r/   r	   r   r  r4   r   r   s   &r   test_ctor_w_issuerTotpTest.test_ctor_w_issuer  sP    d**D1d95<<iH*dDGr%   c                   V P                  \        \        4      P                  ^4       V P                  \        P                  ! ^?R7      ! \        4      P                  ^?4       V P                  \        \        P                  RR7       V P                  \        \        P                  RR7       V P                  \        \        P                  ^ R7       V P                  \        \        P                  RR7       R# )zusing() -- 'period' parameterr  r  r  Nr  )r/   r	   r   r   usingr4   r5   r   r   s   &r   test_using_w_periodTotpTest.test_using_w_period  s     	d**B/ 	2.t4;;R@ 	)TZZ<)TZZ> 	*djj;*djj<r%   c                  a V P                  4       pV P                  VP                  \        P                  4       V P                  VP                  R4      \        \        P                  ! 4       4      4       R.oV3R lpV P                  \        P                  ! VR7      R7      pV P                  VP                  R4      ^~4       V P                  VP                  R4      ^4       V P                  \        \        P                  ^{R7       RpV P                  \        V\        P                  R R7       V P                  \        V\        P                  R R7       R# )	zusing -- 'now' parameterNgHz^@c                  @   < S ^ ;;,          ^,          uu&   S ^ ,          # )r   r"   )counters   r   now&TotpTest.test_using_w_now.<locals>.now  s    AJ!OJ1:r%   r  )r   z)now\(\) function must return non-negativec                      R # )r  r"   r"   r%   r   <lambda>+TotpTest.test_using_w_now.<locals>.<lambda>  s    ur%   c                      R# )r?   r  r"   r"   r%   r   r  r     s    rr%   )r   assertIsr  _timer   r   normalize_timeintr	   r  r/   r4   r5   assertRaisesRegexAssertionError)r6   r   r  msg_rer  s   &   @r   test_using_w_nowTotpTest.test_using_w_now  s    llncgguzz*s11$7UZZ\9JK (	 lltzzc2l3++D137++D137 	)TZZS9 >~vtzz}U 	~vtzzzRr%   c                   Vf   V P                  ^R7      pV P                  VP                  \        R4      4      R4       V P                  VP                  R4      R4       V P                  VP                  R4      R4       V P                  VP                  R4      R4       V P	                  \
        VP                  R4       V P	                  \
        VP                  R4       V P	                  \        P                  VP                  R	4       V P	                  \        P                  VP                  R
4       V P	                  \        P                  VP                  R4       R# )z$normalize_token() -- instance methodNr  1234567s   1234567i iG 0234567g    2A12345601234567iNa )r   r/   normalize_tokenr   r4   r5   r   MalformedTokenErrorr6   r   s   &&r   test_normalize_token_instance&TotpTest.test_normalize_token_instance  s   ;,,a,(C 	,,Qy\:IF,,Z8)D 	,,W5yA 	,,V4i@ 	)S%8%8)D)S%8%8$? 	#1133F3FQ 	#1133F3F
S#1133F3FQr%   c                T    V P                  \        P                  ! ^R7      R7       R# )z!normalize_token() -- class methodr  )r   N)r3  r	   r  r   s   &r   test_normalize_token_class#TotpTest.test_normalize_token_class  s    **tzz/C*Dr%   c                  a \         P                  ! 4       pV P                  V4      p\        ^
4       EF  pV P	                  4       o\        S4      pV P                  VP                  S4      V4       V P                  VP                  VR,           4      V4       V P                  VP                  V4      V4       \        P                  P                  S4      pV P                  VP                  V4      V4       VP                  p \        V3R l4      Vn
        V P                  VP                  R4      V4       Wan
        EK  	  V P                  \        VP                  R4       R#   Yan
        i ; i)znormalize_time()r   c                     < S # r   r"   r   s   r   r  .TotpTest.test_normalize_time.<locals>.<lambda>  s    tr%   N1234)r	   r  r   r   r   r%  r/   r$  r   r   r  staticmethodr4   r5   )r6   TotpFactoryr   r   tintdtorigr   s   &      @r   test_normalize_timeTotpTest.test_normalize_time  s!   jjlll;'rA==?Dt9DS//5t<S//s
;TBS//5t<""33D9BS//3T:??D'".|"<  !3!3D!94@"&# & 	)S%7%7@ #'s   	5E,,E4c                   V P                  4       p\        \        R4      pV P                  VP                  \        4       V P                  VP
                  R4       V P                  VP                  \        4       V P                  VP                  4       R4       V P                  VP                  RR7      R4       V P                  VP                  RR7      \        4       V P                  VP                  RR	7      R
4       \        RVP                  ^
^4      R7      pVP
                  pVP                  pVP                  4       pR# )z pretty_key() and .key attributesr   r   z4AOG-GDBB-QSYH-NTUZ )sepz4AOG GDBB QSYH NTUZFr   )r   ze01c-630c-2184-b076-ce99Tr   N)
r   r	   rg   r/   r|   hex_key
base32_keyr   
pretty_keyr   )r6   r   r   r   s   &   r   test_key_attrsTotpTest.test_key_attrs&  s    nn 8U#(+&<=. 	)+@AC02GHE2D9u57QR t#++b""56KKNNNNr%   c                   ^ RI HpHp V! R4      pVP                  R4      pV P	                  WB4       V P                  VP                  R4       V P                  VP                  R4       V P                  VP                  R4       V P                  VR4       V P                  \        V4      ^4       V P                  V^ ,          R4       V P                  V^,          R4       V P                  \        VP                  R4       V P                  \        VP                  ^4       V P                  V4       R Vn        V P                  VP                  R4       V P                  VP                   4       R	 Vn        V P                  VP                  ^ 4       V P#                  VP                   4       VP                  R4      pV P%                  WT4       V P                  WT4       VP                  R
4      pV P%                  Wd4       V P                  Wd4       VP                  R4      pV P'                  Wt4       R# )zgenerate() -- TotpToken() class)r	   	TotpTokens3jdvb7qd2r7jpxxST897212iTTc                      R # )g  Tn'Ar"   r"   r%   r   r  *TotpTest.test_totp_token.<locals>.<lambda>T  s    <r%   r   c                      R # )iUTr"   r"   r%   r   r  rS  X  s    :r%   i7TiWTN)rP  rQ  )r   r	   rM  generateassertIsInstancer/   r   r  expire_timery   r4   
IndexError__getitem__r3   r  	remainingvalidr1   assertIsNotr   )r6   r	   rM  r   r{   result2result3result4s   &       r   test_totp_tokenTotpTest.test_totp_token?  s   0 %&j)f0x02++Z8!78Va(H-J/*f&8&8"=*f&8&8!< ())3/%%))1-& ,,z*)) ,,z*)) ,,z*G,r%   c                z  a ^ RI Hp V! RR7      pV P                  4       oVP                  S4      pVP                  pV P                  V\        4       VP                  ^,          pV P                  VP                  V^,           4      P                  V4       V P                  VP                  V^,           4      P                  V4       \        P                  P                  S4      pV P                  \        VP                  V4      4      \        S4      4       V P                  VP                  V4      P                  V4       VP                  ! V3R lR7      ! VP                  R7      pV P                  VP                  4       P                  V4       V P!                  \"        VP                  R4       R# )	z
generate()r   Tr   c                     < S # r   r"   r:  s   r   r  (TotpTest.test_generate.<locals>.<lambda>  s    dr%   r  )r|   Nr  )r   r	   r   rV  r   rW  r   r  r/   r   r   r   r%  r$  r  rH  r4   r   )	r6   r	   r   r{   r   
start_timer@  r   r   s	   &       @r   test_generateTotpTest.test_generatej  sE   % tn}}d#eW-^^b(
 	j2o6<<eD 	CLLb9??G //5S//34c$i@ 	b)//7 zzl+?..6 	*cllB7r%   c                @   V P                  4        F  w  rr4pVP                  V4      pV P                  VP                  W5R7       V P                  VP                  W!P
                  ,          VR7       V'       g   Km  V P                  VP                  V4       K  	  R# )zgenerate() -- reference vectorsmsgN)r   rV  r/   r   r  r   rX  )r6   r   r   r   r   r   r{   s   &      r   !test_generate_w_reference_vectors*TotpTest.test_generate_w_reference_vectors  s}    151G1G1I-Cuv\\$'FV\\5=V^^TZZ-?VLw  !3!3W= 2Jr%   c                F   ^ RI Hp V P                  W4       V P                  VP                  \        4       V P                  VP                  P                  V4       V P                  VP                  W&R,           R7       W$,          pW,           p	V P                  VP                  WR,           R7       V P                  VP                  WR,           R7       V P                  VP                  W6R,           R7       V P                  VP                  WE,           4       V	^,           V,          p
V P                  VP                  V
4       V P                  VP                  W,           4       V P                  \        V4      ^4       V P                  WV34       V P                  \         VP"                  R4       V P                  V^ ,          V	4       V P                  V^,          V4       V P                  \         VP"                  ^4       V P%                  V4       R# )	r   	TotpMatchz matched time:rj  z matched counter:z expected counter:z	 skipped:NrU  )r   rp  rW  r   r	   r/   r   r   r  expected_counterskippedcache_secondsrX  
cache_timery   r4   rY  rZ  r3   )r6   matchr   rr  r   windowrk  rp  expectedr  rX  s   &&&&&&&    r   assertTotpMatchTotpTest.assertTotpMatch  s   * 	e/ 	ejj$/**F3 	T5E/EF>$;N5NO//EY?YZ;5FG,,fo>{f,**K8));+?@ 	UQ'$0*e&7&7<q7+q4(*e&7&7; 	r%   c                   a RoRp\         P                  ! V3R lR7      ! \        4      pVP                  VS4      pV P	                  VS^ R7       R# )z!match() -- valid TotpMatch objectk781501c                     < S R,           #    iQ r"   r:  s   r   r  8TotpTest.test_totp_match_w_valid_token.<locals>.<lambda>  
    TI%5r%   r  r   rr  Nr	   r  KEY3ru  rx  r6   r   r   r{   r   s   &   @r   test_totp_match_w_valid_token&TotpTest.test_totp_match_w_valid_token  sF    jj56t<5$'V$:r%   c                   a ^ RI Hp RoRp\        P                  ! V3R lR7      ! \        4      pVP                  VS^,
          4      pV P                  VS^,
          ^R7       R# )z3match() -- valid TotpMatch object with future tokenro  r{  r|  c                     < S R,           # r~  r"   r:  s   r   r  8TotpTest.test_totp_match_w_older_token.<locals>.<lambda>  r  r%   r  r  N)r   rp  r	   r  r  ru  rx  )r6   rp  r   r   r{   r   s   &    @r   test_totp_match_w_older_token&TotpTest.test_totp_match_w_older_token  sQ    *jj56t<5$),V$)Q?r%   c                   a RoRp\         P                  ! V3R lR7      ! \        4      pVP                  VS^,           4      pV P	                  VS^,           RR7       R# )z1match() -- valid TotpMatch object with past tokenr{  r|  c                     < S R,           # r~  r"   r:  s   r   r  6TotpTest.test_totp_match_w_new_token.<locals>.<lambda>  r  r%   r  r  Nr  r  r  s   &   @r   test_totp_match_w_new_token$TotpTest.test_totp_match_w_new_token  sN    jj56t<5$),V$)R@r%   c                   a RoRp\         P                  ! V3R lR7      ! \        4      pV P                  \        P
                  VP                  VS^<,           4       R# )z#match() -- invalid TotpMatch objectr{  r|  c                     < S R,           # r~  r"   r:  s   r   r  :TotpTest.test_totp_match_w_invalid_token.<locals>.<lambda>  r  r%   r  N)r	   r  r  r4   r   InvalidTokenErrorru  )r6   r   r   r   s   &  @r   test_totp_match_w_invalid_token(TotpTest.test_totp_match_w_invalid_token  sC    jj56t<#//E4"9Mr%   c                   RVP                   : RVP                  : RVP                  : RV: RV: RV: R2pVP                  ! W#3/ VB pV P	                  VVP                  V4      VP                  VP                  R^4      VVR	7       R
# )z,helper to test otp.match() output is correctkey= alg= period=r   
 gen_time=r   :rv  )r   r   rv  rr  rk  N)rH  r   r   ru  rx  r$  get)	r6   expect_skippedr   r   r   gen_timer   rk  r{   s	   &&&&&&,  r   assertVerifyMatchesTotpTest.assertVerifyMatches  sv    
 ~~sww

E8TK5/$/V"%"4"4T":$'JJ$(HHXr$:%3!$ 	 	&r%   c                    RVP                   : RVP                  : RVP                  : RV: RV: RV: R2pV P                  ! WP                  W#3RV/VB # )	z/helper to test otp.match() throws correct errorr  r  r  r   r  r   r  __msg__)rH  r   r   r4   ru  )r6   	exc_classr   r   r   r  r   rk  s   &&&&&&, r   assertVerifyRaisesTotpTest.assertVerifyRaises  sP     ~~sww

E8TK  IIu 6),6046 	6r%   c                   V P                  4       pVP                  pV P                  4       pVP                  V4      P                  p\        WR7      p\        V P                  3/ VB p\        V P                  3/ VB pV! \        P                  WCV,
          ^ R7       V! ^WCV,
          VR7       V! ^WCV,
          ^V,          R7       V! ^ WC^ R7       V! \        P                  WCV,           ^ R7       V! RWCV,           VR7       V! RWCV,           ^V,          R7       V! \        P                  WC^V,          ,           ^ R7       V! \        P                  WC^V,          ,           VR7       V! RWC^V,          ,           ^V,          R7       \        P                  P                  V4      pV! ^ WH^ R7       V! \        VR4       R# )z)match() -- 'time' and 'window' parametersr   r  rv  Nr  )r   r   r   rV  r   re   r   r  r  r   r  r   r   r   )	r6   r   r   r   r   commonassertMatchesr4   r@  s	   &        r   test_match_w_windowTotpTest.test_match_w_window  st    lln}}T"((#- 8 8CFCt66A&A 	S**E&=Kb%v>b%q6zB 	aQ/ 	S**E&=Kb%v>b%q6zB 	S**E!f*3DQOS**E!f*3DVTb%F
!21v:F //5a1- 	Z+r%   c                   V P                  4       pVP                  pV P                  4       p\        WR7      p\	        V P
                  3/ VB p\	        V P                  3/ VB p^V,          pVP                  W7,
          4      P                  pV! \        P                  W^ R7       V! RW^ V) R7       VP                  W7,           4      P                  p	V! \        P                  W^ R7       V! ^W^ VR7       R# )zmatch() -- 'skew' parametersr  r  )rv  skewNrU  )r   r   r   re   r   r  r  rV  r   r   r  )
r6   r   r   r   r  r  r4   r  behind_tokenahead_tokens
   &         r   test_match_w_skewTotpTest.test_match_w_skew&  s     lln}}#- 8 8CFCt66A&A 6z||DK066S**LqIb,QdUC ll4;/55S**KaHb+ADAr%   c                   V P                  4       pVP                  pV P                  4       pVP                  V4      pVP                  pVP
                  pVP                  p\        WR7      p\        V P                  3/ VB p	\        V P                  3/ VB p
V	! RWSV,           VR7       V	! RWSV,           V^,
          VR7       V
! \        P                  WS^V,          ,           WbR7       V
! \        P                  WSV,           WbR7      pV P                  VP                  V4       V
! \        P                  WSV^ R7      pV P                  VP                  V4       R# )z0match() -- 'reuse' and 'last_counter' parametersr  r  )last_counterrv  Nr  )r   r   r   rV  r   r  rX  re   r   r  r  r   r  UsedTokenErrorr/   )r6   r   r   r   tdatar   r  rX  r  r  r4   errs   &           r   test_match_w_reuseTotpTest.test_match_w_reuse=  s0    lln}}T"--''#- 8 8CFCt66A&A 	b%v> 	b%WQY#	%
 	S**E!f*3D")	:
 3--uVm(/@+6 3--u(/;+6r%   c                d   \        R4      pVP                  pRpV P                  V! RV4      4       V P                  V! RV4      4       V P                  \        P
                  VRV4       V P                  \        P
                  VRV4       V P                  \        P
                  VRV4       R# )	zmatch() -- token normalizationotxl2f5cctbprpzx6Tz    3 32-136  s   3321361234512345X0123456N)r	   ru  r3   r4   r   r1  )r6   r   ru  r   s   &   r    test_match_w_token_normalization)TotpTest.test_match_w_token_normalizationf  s     %&		 	.56 	i./ 	#115'4H 	#115(DI 	#115)TJr%   c           	     6   V P                  4        F  w  rr4pVP                  pV! W24      pV P                  V4       V P                  VP                  W!P
                  ,          VR7       V P                  \        P                  WcV^d,           ^ R7       K  	  R# )zmatch() -- reference vectorsrj  r  N)	r   ru  r3   r/   r  r   r4   r   r  )r6   r   r   r   r   rk  ru  r{   s   &       r   test_match_w_reference_vectors'TotpTest.test_match_w_reference_vectors|  s    .2.D.D.F*CusIIE 5'FOOF#V^^TZZ-?SI c33U4#:VWX /Gr%   c                  a ^ RI Hp RoVP                  ! V3R lR7      p\        ^RRR7      pVP	                  RV4      pV P                  VSR	7       \        ^RRR7      pV P                  \        P                  VP                  R
V4       \        ^RR7      pV P                  \        VP                  R
V4       RpVP	                  RV4      pV P                  VSR	7       RpVP	                  RV4      pV P                  VSR	7       R# )zverify()r   r  c                     < S # r   r"   r:  s   r   r  &TotpTest.test_verify.<locals>.<lambda>  s    Tr%   r  r   r  rV   typer|   332136r:  332155rV   r  z3{"v": 1, "type": "totp", "key": "otxl2f5cctbprpzx"}z,otpauth://totp/Label?secret=otxl2f5cctbprpzxN)
r   r	   r  re   verifyrx  r4   r   r  r   )r6   r	   r>  source1ru  source1json
source1urir   s   &      @r   test_verifyTotpTest.test_verify  s   
 	&jj\2 -?@""8W5U. -?@#//1C1CXwW (*k&8&8(GL L""8[9U. D
""8Z8U.r%   c                   ^ RI Hp VP                  pV! \        R4      4      pV P	                  VP
                  \        4       V! R4      pV P	                  VP
                  \        4       V! \        ^R\        R7      4      pV P	                  VP
                  \        4       V! \        R4      4      pV P	                  VP
                  \        4       V! R4      pV P	                  VP
                  \        4       V P                  V! V4      V4       \        4       pVP                  ! VR7      P                  V4      pV P                  WS4       V P	                  VP                  4       VP                  4       4       VP                  ! VR7      P                  V4      pV P                  We4       V P                  \        V\        R	4      4       V P                  \        VR
4       R# )zfrom_source()r   Notpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&issuer=ExamplesN   otpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&issuer=Exampler   r  z3{"v": 1, "type": "totp", "key": "JBSWY3DPEHPK3PXP"}s3   {"v": 1, "type": "totp", "key": "JBSWY3DPEHPK3PXP"})r7   foos   fooN)r   r	   from_sourcer   r/   r|   KEY4_RAWre   KEY4r"  r
   r  r]  to_dictr4   r   )r6   r	   r  r   wallet1r   r   s   &      r   test_from_sourceTotpTest.test_from_source  s   %&& ! - . /(+  , -(+ $T:;(+ !QRS(+ PQ(+ 	k#&, +zz)55c:#7 zz)55d;d! 	*k1U8<*k6:r%   c                4   ^ RI Hp VP                  pV! R4      pV P                  W14       V P	                  VP
                  \        4       V P	                  VP                  R4       V P	                  VP                  R4       V P	                  VP                  R4       V P	                  VP                  ^4       V P	                  VP                  ^4       V! R4      pV P	                  VP
                  \        4       V P                  \        VR4       V P                  \        VR4       V! R	4      pV P	                  VP                  R
4       V P	                  VP                  R4       V! R4      pV P	                  VP                  R4       V P	                  VP                  R4       V! R4      pV P	                  VP                  R4       V P	                  VP                  R4       V P                  \        VP                  R4       V! R4      pV P	                  VP                  R4       V P                  \        VR4       V! R4      pV P	                  VP                  ^4       V P                  \        VR4       V P                  \        VR4       V P                  \        VR4       V! R4      pV P	                  VP                  ^?4       V P                  \        VR4       V P                  \        VR4       V P                  \!        \"        P$                  RR7      .4      ;_uu_ 4        V! R4      pRRR4       V P	                  VP&                  \(        4       V P	                  VP                  ^?4       R#   + '       g   i     LN; i)z
from_uri()r   r  alice@google.comExampler   zNotpauth://totp/Example:alice@google.com?secret=jbswy3dpehpk3pxp&issuer=Examplez0otpauth://totp/Example:alice@google.com?digits=6z?otpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHP@3PXPzOotpauth://totp/Provider1:Alice%20Smith?secret=JBSWY3DPEHPK3PXP&issuer=Provider1Alice Smith	Provider1zMotpauth://totp/Big%20Corporation%3A%20alice@bigco.com?secret=JBSWY3DPEHPK3PXPzalice@bigco.comzBig CorporationzOotpauth://totp/alice@bigco.com?secret=JBSWY3DPEHPK3PXP&issuer=Big%20CorporationzGotpauth://totp/Provider1:alice?secret=JBSWY3DPEHPK3PXP&issuer=Provider2zPotpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&algorithm=SHA256r   zPotpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&algorithm=SHA333zHotpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&digits=8zHotpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&digits=AzJotpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&digits=%20zIotpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&digits=15zIotpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&period=63zHotpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&period=0zIotpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&period=-1z!unexpected parameters encounteredr   zQotpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&foo=bar&period=63N)r   r	   from_urirW  r/   r|   r  r  r  r   r   r   r4   r   r   r   re   r   PasslibRuntimeWarningrH  r  )r6   r	   r  r   s   &   r   test_from_uriTotpTest.test_from_uri  s(   %==  ( )c((+$67Y/&)R(Q'  ( )(+ 	*h0bc 	+X 8Q 	R  * +M2[1  1 2$56%67 hi$56%67 	*dmmc	e ij(+ 	*h 1[ 	\ abQ' 	*h0z{*h0|}*h0{| bcR( 	*h 1S 	T 	*h 1T 	U ###33@cd%
    / 0C
 	.R( s   8	NN	c                8   \        \        R^^R7      pV P                  VP                  RR4      R4       V P	                  \
        VP                  RR4       V P                  VP                  R4      R4       RVn        V P                  VP                  4       R4       RVn        V P                  VP                  4       R4       V P	                  \
        VP                  R4       V P	                  \
        VP                  RR	4       V P                  \        \        R
R7      P                  R4      R4       V P                  \        \        ^R7      P                  R4      R4       V P                  \        \        ^?R7      P                  R4      R4       R# )zto_uri()r   r   r   r   r  Example OrgzZotpauth://totp/Example%20Org:alice@google.com?secret=JBSWY3DPEHPK3PXP&issuer=Example%20OrgNz7otpauth://totp/alice@google.com?secret=JBSWY3DPEHPK3PXPzlabel:with:semicolonszissuer:with:semicolonsr   r   zHotpauth://totp/alice@google.com?secret=JBSWY3DPEHPK3PXP&algorithm=SHA256r  z@otpauth://totp/alice@google.com?secret=JBSWY3DPEHPK3PXP&digits=8r  zAotpauth://totp/alice@google.com?secret=JBSWY3DPEHPK3PXP&period=63)r	   r  r/   to_urir4   r   r  r  r2  s   & r   test_to_uriTotpTest.test_to_uriW  si    4VAb9$6F0	1
 	*cjj$F 	$67R	T '	R	T #
1	2
 	*cjj2IJ 	*cjj2DF^_
 	d1889KL,	- 	d1-445GH$	% 	d2.556HI%	&r%   c                   ^ RI Hp VP                  pV! \        ^R\        RRR7      4      pV P                  W14       V P                  VP                  \        4       V P                  VP                  R4       V P                  VP                  R4       V P                  VP                  R4       V P                  VP                  ^4       V P                  VP                  ^4       V P                  \        V\        R\        R7      4       V P                  \        V\        ^ R\        R7      4       V P                  \        V\        R	R\        R7      4       V P                  \        V\        ^\        R
7      4       V! \        ^R\        P!                  4       RRR7      4      pV P                  VP                  \        4       V P                  \        V\        ^RR7      4       V P                  \"        V\        ^RRR7      4       V! \        ^R\        RRR7      4      pV P                  VP                  R4       V P                  VP                  R4       V! \        ^R\        RR7      4      pV P                  VP                  R4       V P                  \        V\        ^R\        RR7      4       V! \        ^R\        ^R7      4      pV P                  VP                  ^4       V P                  \$        V\        ^R\        RR7      4       V P                  \        V\        ^R\        ^R7      4       V! \        ^R\        ^?R7      4      pV P                  VP                  ^?4       V P                  \        V\        ^R\        ^ R7      4       V P                  \        V\        ^R\        RR7      4       V P                  \$        V\        ^R\        ^{R7      4       R# )zfrom_dict()r   r   r  r  rV   r  r|   r  r  r   )r  r|   r  rb   )rV   r|   r  zJBSWY3DPEHP@3PXPr  r  r   rV   r  r|   r   sha333rV   r  r|   r   rE   rV   r  r|   r   )rV   r  r|   INVALIDNr  )r   r	   	from_dictre   r  rW  r/   r|   r  r  r  r   r   r   r4   r   r   r   r5   )r6   r	   r  r   s   &   r   test_from_dictTotpTest.test_from_dict  s   %NN	
 qv4?QZcdec((+$67Y/&)R(Q' 	*i6t1LM 	*iD1QR*i&d1ST 	*it1DE qv4::<GYbklm(+ 	*i1GH 	+Y5GH	J qv4}U`abM2[1 qv4XFG(+ 	*iDV^1_` qv4BCQ' 	)Yqv4X[0\]*iDY[1\] qv4CDR( 	*iDYZ1[\*iDY[1\]
 	)Yqv4Y\0]^r%   c                   \        \        R^^R7      pV P                  VP                  4       \	        ^R\        R7      4       \        \        R^^RRR7      pV P                  VP                  4       \	        ^R\        RRR7      4       \        \        R^^RR	7      pV P                  VP                  4       \	        ^R\        RR
7      4       \        \        R^^RR7      pV P                  VP                  4       \	        ^R\        RR7      4       \         P
                  ! RR7      pV! \        4      pV P                  VP                  4       \	        ^R\        R7      4       V! \        RR7      pV P                  VP                  4       \	        ^R\        R7      4       V P                  \        \        RR7      P                  4       \	        ^R\        RR7      4       V P                  \        \        ^R7      P                  4       \	        ^R\        ^R7      4       V P                  \        \        ^?R7      P                  4       \	        ^R\        ^?R7      4       R# )z	to_dict()r   r  r   r  r  r  )r   r   r   r  r  r  )r   r   r   r  )rV   r  r|   r  )r   r   r   r  )rV   r  r|   r  r  r   r   r  r  r  r  r  N)r	   r  r/   r  re   r  )r6   r   r>  s   &  r   test_to_dictTotpTest.test_to_dict  s    4VAb9qv4(HI 4VAb+MCD$6}N	O
 4VAb+-D$68	9
 4VAb')D%24	5
 jj6$qv4(HI $}5D)IJ
 	d199;DhG	I 	d1-557DC	E 	d2.668DD	Fr%   r"   r   )鷼6T221105)鸼6T178491)鹼6Tr  )ռ6Tr  )ּ6T915114)r  20221105)r  86178491)r   r  )r  r  )r  03915114)i5T000492)rO  rP  );   94287082)5:B07081804)5:B14050471)I89005924) 5w69279037)    H/P 65353130)r  46119246)r
  68084774)r  67062674)r  91819424)r  90698825)r  77737706)r  90693936)r
  25091201)r  99943326)r  93441116)r  38618901)r  47863826)iS727248)i.ѡT122419)iѡT	662331049)r  19360094)r  40857319)r  37023009)r      r&  r.   )7r   r   r   r   __doc__r   r   r   r   r   re   r   RFC_KEY_BYTES_20RFC_KEY_BYTES_32RFC_KEY_BYTES_64r   r   r   r   r   r   r  r	  r  r  r  r)  r3  r6  rB  rJ  ra  rg  rl  rx  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   __classcell__)r   r   s   @@r   r   r     sL     ,
=6
%,< (r!LO 
$Q	/"""""	
 
$Q	/$$$$$	
 
'	2""	
 
"5f	=$$$$%	
 
"5h	?$$$$%	
 
"5h	?$$$$%	
 
$Q	/1GI_`	$Qr	:<UV 
"5	<>VW	"5hr	JLde	"5hr	JLdeaRGh82
/$0>0A=="CH="SDR4EA<2)-V8@>B;@AN&6.,`B.'7RK,Y"/H*;^u)n8&z\_|9F 9Fr%   r   )   r   )r,  r,  )4r'  r   	functoolsr   logging	getLoggerr   r   sysr   r#  passlibr   passlib.utils.compatr   r   passlib.tests.utilsr   r   r   r   r   r	   r
   r   __all__r5   r   r   version_infobinasciir   rc   rd   r   rg   rh   r  r  r  
float_inforadixmant_digr   r   r$   r'   encoder(  r)  r*  r   r"   r%   r   <module>r;     sG   (
   g''1 
   + 3 ' 5 5  )2 1 %u3u3-C$ ~~q  ?"? ? 
~~"$ K&K K$+.^ 
#JEH JEj *009 $Q&, $Q&, 
`Fx `Fr%   