
    g                     6   S r SSK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  SSKJr  SSKJrJrJr  S	/r\=rr\R:                  S
:  a  SSKJr  \R:                  S:  a  SSKJr  Sr Sr!Sr"Sr#Sr$Sr%Sr&Sr'\RP                  RR                  S:X  d   S5       e\RP                  RT                  S:  d   S5       eS r+\+" 5       r,S r- " S S\5      r.SR_                  S5      r0\0S-  SS r1\0S -  SS! r2 " S" S#\5      r3g)$z"passlib.tests -- test passlib.totp    N)partial)exc)unicodeu)TestCase	time_call)totp)TOTP	AppWalletAES_SUPPORT
EngineTest)   r   )Error)r   r   abcdefs    4AOGGDBBQSYHNTUZs
   c!vΙs   ]90 Dy/4&S3JDVB7QD2R7JPXXJBSWY3DPEHPK3PXPs
   Hello!ޭ   zunexpected float_info.radix,   z#double precision unexpectedly smallc                      Sn Sn U S-  n [         R                   R                  US-
  5      R                  nX1:  a  OUn M<  U S-  n Sn[        X5      $ ! [        [        [
        4 a     M*  f = f)z0
helper to calc max_time_t constant (see below)
i   @r      l    )datetimeutcfromtimestampyear
ValueErrorOSErrorOverflowErrormin)valuer   
next_value	next_yearmax_datetime_timestamps        P/home/matz/Project1/venv/lib/python3.13/site-packages/passlib/tests/test_totp.py_get_max_time_tr$   8   s     ED
aZ
	 )):::a<HMMI, 9 > 
QJE
 *u--C G]3 	 	s   ,A A-,A-c                     U S-  S-   S-  $ )N          )raw_sizes    r#   to_b32_sizer+   i   s    qL1""    c                   Z    \ rS rSrSrS rS rS rSS jrS r	S	 r
  SS
 jrS rS rSrg)AppWalletTesto   zpasslib.totp.AppWalletc                    [        5       nU R                  UR                  0 5        U R                  UR                  5        SSS.n[        U5      nU R                  UR                  U5        U R                  UR                  5        [        S5      nU R                  UR                  U5        [        S5      nU R                  UR                  SSS.5        [        S5      nU R                  UR                  U5        U R                  [        [         S5        U R                  [        [         S	5        U R                  [        [         S
SS.5        g)z-constructor -- 'secrets' param -- input types   aaa   bbb12z
 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    "-++, (3#.**+ ?@#. BC&*IJ 23#. 	)Y4 	)Y8 	*iu21FGr,   c           	      "   SSSS.n[        U5      nU R                  UR                  U5        [        [        S5      S[        S5      S[        S5      S05      nU R                  UR                  U5        [        SSSS.5      nU R                  UR                  U5        U R	                  [
        [         S	S
05        [        SS05      nU R	                  [        [         SS
05        U R	                  [        [         SS
05        [        [        S
5      SSS.5      nU R                  UR                  U5        U R	                  [
        [         SS05        U R	                  [
        [         SS05        U R	                  [
        [         S/ 05        g)z9constructor -- 'secrets' param -- tag/value normalizationr1   r2   s   ccc)r4   02Cr4   rF   rG   )r   rF   rG   )r   r7   z1-2_3.4z-abczab*$bbbr6   N)r   r9   r:   r   r>   r?   r   )r@   rB   rA   s      r#   test_secrets_tagsAppWalletTest.test_secrets_tags   sS    &v63#. AcFFAdGVQsVVLM#. vV&AB#. 	)Yu> Iv./ 	*i&%A*i&%A 5VDE#. 	)Yc
;)Yd<)Yb	:r,   c                    [        SSS.5      nU R                  UR                  S5        U R                  UR                  UR                  5      S5        [        SSSS.5      nU R                  UR                  S5        U R                  UR                  UR                  5      S	5        [        SSSS.S
S9nU R                  UR                  S
5        U R                  UR                  UR                  5      S5        U R	                  [
        [         SSSS.SS9  [        5       nU R                  UR                  S5        U R	                  [
        UR                  S5        g)z"constructor -- 'default_tag' paramonetwo)r4   rF   rF   s   twor7   )r4   rF   ArN   r1   r4   )default_tags   oneBN)r   r9   rO   
get_secretr>   KeyError)r@   rA   s     r#   test_default_tagAppWalletTest.test_default_tag   s<    e45++T2**6+=+=>G e%@A++S1**6+=+=>G e%@cR++S1**6+=+=>G 	(IU%e/T&) 	 	+ ++T2(F$5$5t<r,   Nc                     [         (       a  U=(       a	    U" 5         g   g U=(       a    U R                  [        U5        U R                  S5      e)Nz$'cryptography' package not installed)r   r>   RuntimeErrorskipTest)r@   canarys     r#   require_aes_support!AppWalletTest.require_aes_support   s:    ;vx>t((v>-- FGGr,   c                 :   [        [        [        S.5      n[        SSSSSS9nU R	                  [        UR                  U5      S9  U R                  UR                  U5      S	   [        5        [        SSS
SSS9nU R                  UR                  U5      S	   [        5        [        SSSSSS9nU R                  UR                  U5      S	   [        5        UR                  5       nUR                  SS9  U R                  UR                  U5      S	   S5        UR                  5       nUR                  SS9  U R                  [        UR                  U5        UR                  5       nUR                  SS9  U R                  [        UR                  U5        g)z.decrypt_key()r3   r      6D7N7W53O7HHS37NLUFQMHCTEGSNPFN5CGBJr4   vcsktrX   r   SPZJ54Y6IPUD2BYA4C6AZGDXXTVQOWYLC2AUr&   FCCTARTIJWE7CPQHUDKA D2DRS32YESGHHINWFFCELKN7Z6NAHM4Mr5   rd   s
   D6.F7Q3  )r`   N)r   PASS1PASS2dictrY   r   decrypt_keyr9   KEY1_RAWKEY2_RAWcopyupdater>   rR   r   )r@   rA   CIPHER1CIPHER2CIPHER3temps         r#   test_decrypt_keyAppWalletTest.test_decrypt_key   s~    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                    U R                  5         [        [        [        S.SS9n[	        SSSSSS9nU R                  UR                  U5      S   5        UR                  5       nUR                  SS	9  U R                  UR                  U5      S   5        UR                  5       nUR                  S
S9  U R                  UR                  U5      S   5        g)z$.decrypt_key() -- needs_recrypt flagr3   r\   encrypt_costr   AAAAr5   r_   r&   )ra   r4   rj   N)
rY   r   rm   rn   ro   r;   rp   rs   rt   r=   )r@   rA   rB   rx   s       r#   test_decrypt_key_needs_recrypt,AppWalletTest.test_decrypt_key_needs_recrypt  s      "U3"E Q"&C8++C034 xxza**4034 xxzc**4034r,   c                    U R                  [        U5      [        / SQ5      5        U R                  US   S5        U R                  US   U5        U R                  US   UR                  5        U R                  [        US   5      [	        UR
                  5      5        U R                  [        US   5      [	        [        U5      5      5        UR                  U5      u  pgU R                  Xc5        U R                  Xu5        g)	z.check encrypt_key() result has expected format)r`   rd   ra   rb   rc   r`   r   rd   ra   rb   rc   N)r9   setr}   lenr+   	salt_sizerp   )r@   resultrA   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                    [        S[        0SS9nU R                  [        UR                  [
        5      S9  UR	                  [
        5      nU R                  X![
        5        UR	                  [
        5      nU R                  X![
        5        U R                  US   US   5        U R                  US   US   5        [        S[        0SS9nUR	                  [
        5      nU R                  X$[
        5        [        [        [        S.5      nUR	                  [
        5      nU R                  X$[
        S	S
9  [        S[        05      nSUl	        UR	                  [
        5      nU R                  X$[
        5        UR	                  [        5      nU R                  X![        5        U R                  [        UR                  S5        g)z.encrypt_key()r4   r(   r|   re   rb   rc      r3   r5   )r   @   r,   N)r   rm   rY   r   encrypt_keyrq   r   assertNotEqualrn   r   rr   r>   r   )r@   rA   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 %e45$$X.fxSA S%L)$$X.fx8 ##H-fh7 	*f&8&8#>r,   c                 T   U R                  5         [        SS05      nU=R                  S-  sl        [        [	        UR
                  [        5      SS9u  p#U=R                  S-  sl        [        [	        UR
                  [        5      SS9u  pCU R                  XBS-  US-  S-  S	9  g
)z verify cost parameter via timingr4   r7   r   r   )maxtimer   r&         ?)deltaN)rY   r   r}   r   r   r   rq   assertAlmostEqual)r@   rA   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)r4   F)__name__
__module____qualname____firstlineno__descriptionPrefixrC   rI   rS   rY   ry   r   r   r   r   __static_attributes__r)   r,   r#   r.   r.   o   sF    00Hd!;J=@H$@L5, 9<',>"'?REr,   r.   12345678901234567890ascii    r'   r   c                   <  ^  \ rS rSrSrSrU 4S jrS rSeS jrS r	\
" SS	S
SS9r\
" SSS9SSSSS/\
" SSS9SSSSS/\
" SSS9SS/\
" \SS	S9SS S!S"S#S$/\
" \SS%S9S&S'S(S)S*S+/\
" \SS,S9S-S.S/S0S1S2/\
" S3SS9S4S5/\
" S3S6S7S89S9/\
" \SS:S;9S</\
" \SS%S:S=9S>/\
" \SS,S:S=9S?//rS@ rSA rSB rSC rSD rSE rSF rSG rSH rSI rSJ rSeSK jrSL rSM rSN rSO rSP r SQ r!SfSR jr"SS r#ST r$SU r%SV r& SeSW jr' SeSX jr(SY r)SZ r*S[ r+S\ r,S] r-S^ r.S_ r/S` r0Sa r1Sb r2Sc r3Sdr4U =r5$ )gTotpTesti  z+
common code shared by TotpTest & HotpTest
zpasslib.totp.TOTPc                    > [         [        U ]  5         SSKJn  UR                  5         U R                  [        SU R                  5       5        g )Nr   )lookup_hashrng)	superr   setUppasslib.crypto.digestr   clear_cache	patchAttrtotp_module	getRandom)r@   r   	__class__s     r#   r   TotpTest.setUp  s:    h#% 	6! 	{E4>>+;<r,   c                 L    U R                  5       R                  5       [        -  $ )zA
helper to generate random epoch time
:returns float: epoch time
)r   random
max_time_tr@   s    r#   randtimeTotpTest.randtime  s    
 ~~&&(:55r,   c                 0   U R                  5       nSU;  a  SUS'   UR                  SUR                  SS5      5        UR                  SUR                  / SQ5      5        UR                  S	UR                  SS
5      5        U=(       d    [        " S0 UD6$ )z0
helper which generates a random TOTP instance.
r   Tnewdigitsr   
   alg)sha1sha256sha512periodx   r)   )r   
setdefaultrandintchoicer
   )r@   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                    U R                  5       nU R                  5       nU R                  UR                  UR                  S5        [        S5       H/  nUR                  UR                  :w  a    O%U R                  5       nM1     U R                  S5        [        S5       H/  nUR                  UR                  :w  a    gU R                  5       nM1     U R                  S5        g)z
internal test -- randotp()
zkey not randomized:r   zdigits not randomizedzalg not randomizedN)r   r   r   ranger   failr   )r@   otp1otp2r   s       r#   test_randotpTotpTest.test_randotp  s     ||~||~DHHdhh0EF rA{{dkk)<<>D 
 II-. rAxx488#<<>D 
 II*+r,   base32r      r&   )formatr   r   r   ACDEFGHJKL234567r   )r   r   )鷼6T221105)鸼6T178491)鹼6Tr   )ռ6Tr   )ּ6T915114)r   20221105)r   86178491)r   r   )r   r   )r   03915114zS3JD-VB7Q-D2R7-JPXX)i5T000492)ST897212raw)r   r   r   );   94287082)5:B07081804)5:B14050471)I89005924) 5w69279037)    H/P 65353130r   )r   46119246)r   68084774)r   67062674)r   91819424)r   90698825)r   77737706r   )r   90693936)r   25091201)r   99943326)r   93441116)r   38618901)r   47863826r   )iS727248)i.ѡT122419	   )   )r   r   r   )iѡT	662331049<   )r   r   r   )r   19360094)r   r   r   r   )r   40857319)r   37023009c           	   #   f  #    SSK Jn  U R                   H  nU R                  R	                  5       nUR                  US   5        USS  H]  n[        U5      S:X  a  Uu  pVnOUu  pVSn[        R                  SX5Xg5        U" S0 UD6nSUR                  < SU< S	U< S
3n	XXgU	4v   M_     M     g7f)z^
helper to iterate over test vectors.
yields ``(totp, time, token, expires, prefix)`` tuples.
r   r
   r   Nr   z+test vector: %r time=%r token=%r expires=%rzalg= time= token=z: r)   )
passlib.totpr
   vectorsvector_defaultsrs   rt   r   logdebugr   )
r@   r
   rowr   entrytimetokenexpiresotpprefixs
             r#   iter_test_vectorsTotpTest.iter_test_vectors.  s     
 	&<<C'',,.DKKAQRu:?+0(D"'KD"G 		GUZdlTl8;uM77 !  s   B/B1c                     U R                  [        [        5        U R                  [        [        SSS9  [        SS9n[        SS9nU R                  UR                  UR                  5        g)zconstructor -- 'new'  parameter4aoggdbbqsyhntuzT)r   r   r   N)r>   r?   r
   r   r   )r@   r  r   s      r#   test_ctor_w_newTotpTest.test_ctor_w_newG  sX     	)T*)T/AtL tn~CGGTXX.r,   c           	         U R                  [        [        SSS9R                  5      S5        U R                  [        [        SSS9R                  5      S5        U R                  [        [        SSS9R                  5      S5        U R                  [        [        SS	S
9R                  5      S	5        U R                  [        [        SSS
9R                  5      S5        U R	                  [
        [        SSSS9  U R	                  [
        [        SSS
9  U R                  [        [        R                  SS9/5         [        SS5      nSSS5        g! , (       d  f       g= f)z constructor -- 'size'  parameterTr   )r   r      r   r   r   r   r   r   size      )r   r#  r   r  z-.*for security purposes, secret key must be.*category
message_re0A0A0A0A0A0A0A0A0AhexN)
r9   r   r
   r   r>   r   assertWarningListro   r   PasslibSecurityWarning)r@   r   s     r#   test_ctor_w_sizeTotpTest.test_ctor_w_sizeS  s(    	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   ?E
E#c                 D   U R                  [        [        5      R                  [        5        U R                  [        [        R                  5       5      R                  [        5        U R                  [        S5      R                  [        5        U R                  [        [        S5        U R                  [        SS5      R                  [        5        U R                  [        [        SS5        U R                  [        [        S5      R                  [        5        g)z,constructor -- 'key' and 'format' parametersz 4aog gdbb qsyh ntuz zao!ggdbbqsyhntuze01c630c2184b076ce99r*  X01c630c2184b076ce99r   N)	r9   r
   KEY1r   rq   lowerr>   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                     U R                  [        [        SS9R                  S5        U R                  [        [        SS9R                  S5        U R	                  [
        [        [        SS9  g)zconstructor -- 'alg' parameterzSHA-256r   r   SHA256zSHA-333N)r9   r
   r2  r   r>   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                    U R                  [        [        [        SS9  U R	                  [        [        SS9R
                  S5        U R	                  [        [        SS9R
                  S5        U R                  [        [        [        SS9  g)z!constructor -- 'digits' parameterr(   r   r   r      N)r>   r   r
   r2  r9   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                    U R                  [        [        5      R                  S5        U R                  [        [        SS9R                  S5        U R	                  [
        [        [        SS9  U R	                  [
        [        [        SS9  U R	                  [        [        [        SS9  U R	                  [        [        [        SS9  g)	z!constructor -- 'period' parameterr   ?   r         ?abcr   N)r9   r
   r2  r   r>   r?   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                     U R                  [        [        5      R                  S5        U R                  [        [        SS9R                  S5        U R	                  [
        [        [        SS9  g)z constructor -- 'label' parameterNzfoo@bar)labelzfoo:bar)r9   r
   r2  rK  r>   r   r   s    r#   test_ctor_w_labelTotpTest.test_ctor_w_label  sP    d))40d)4::IF*dD	Br,   c                     U R                  [        [        5      R                  S5        U R                  [        [        SS9R                  S5        U R	                  [
        [        [        SS9  g)z!constructor -- 'issuer' parameterNzfoo.comissuerzfoo.com:bar)r9   r
   r2  rP  r>   r   r   s    r#   test_ctor_w_issuerTotpTest.test_ctor_w_issuer  sP    d**D1d95<<iH*dDGr,   c                    U R                  [        [        5      R                  S5        U R                  [        R                  " SS9" [        5      R                  S5        U R                  [        [        R                  SS9  U R                  [        [        R                  SS9  U R                  [        [        R                  SS9  U R                  [        [        R                  SS9  g)	zusing() -- 'period' parameterr   rC  rD  rE  rF  r   rG  N)r9   r
   r2  r   usingr>   r?   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                   ^ U R                  5       nU R                  UR                  [        R                  5        U R                  UR                  S5      [        [        R                  " 5       5      5        S/mU4S jnU R                  [        R                  " US9S9nU R                  UR                  S5      S5        U R                  UR                  S5      S5        U R                  [        [        R                  SS9  S	nU R                  [        U[        R                  S
 S9  U R                  [        U[        R                  S S9  g)zusing -- 'now' parameterNgHz^@c                  (   > T S==   S-  ss'   T S   $ )Nr   r   r)   )counters   r#   now&TotpTest.test_using_w_now.<locals>.now  s    AJ!OJ1:r,   rZ  )r   ~      r6   z)now\(\) function must return non-negativec                      g)NrF  r)   r)   r,   r#   <lambda>+TotpTest.test_using_w_now.<locals>.<lambda>  s    ur,   c                      g)NrG  r)   r)   r,   r#   r`  ra    s    rr,   )r   assertIsrZ  _timer  r   normalize_timeintr
   rT  r9   r>   r?   assertRaisesRegexAssertionError)r@   r  rZ  msg_rerY  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                    Uc  U R                  SS9nU R                  UR                  [        S5      5      S5        U R                  UR                  S5      S5        U R                  UR                  S5      S5        U R                  UR                  S5      S5        U R	                  [
        UR                  S	5        U R	                  [
        UR                  S5        U R	                  [        R                  UR                  S
5        U R	                  [        R                  UR                  S5        U R	                  [        R                  UR                  S5        g)z$normalize_token() -- instance methodN   r>  1234567s   1234567i iG 0234567g    2A12345601234567iNa )r   r9   normalize_tokenr   r>   r?   r   MalformedTokenErrorr@   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                 F    U R                  [        R                  " SS9S9  g)z!normalize_token() -- class methodrm  r>  )r  N)ru  r
   rT  r   s    r#   test_normalize_token_class#TotpTest.test_normalize_token_class  s    **tzz/C*Dr,   c                   ^ [         R                  " 5       nU R                  U5      n[        S5       GH  nU R	                  5       m[        T5      nU R                  UR                  T5      U5        U R                  UR                  US-   5      U5        U R                  UR                  U5      U5        [        R                  R                  T5      nU R                  UR                  U5      U5        UR                  n [        U4S j5      Ul
        U R                  UR                  S5      U5        Xal
        GM     U R                  [        UR                  S5        g! Xal
        f = f)znormalize_time()r   r   c                     > T $ r   r)   r  s   r#   r`  .TotpTest.test_normalize_time.<locals>.<lambda>  s    tr,   N1234)r
   rT  r   r   r   rf  r9   re  r   r   rZ  staticmethodr>   r?   )r@   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''E/c                    U R                  5       n[        [        S5      nU R                  UR                  [        5        U R                  UR
                  S5        U R                  UR                  [        5        U R                  UR                  5       S5        U R                  UR                  SS9S5        U R                  UR                  SS9[        5        U R                  UR                  SS	9S
5        [        SUR                  SS5      S9nUR
                  nUR                  nUR                  5       ng)z pretty_key() and .key attributesr   r0  z4AOG-GDBB-QSYH-NTUZ )sepz4AOG GDBB QSYH NTUZFr*  )r   ze01c-630c-2184-b076-ce99Tr   r!  r"  N)
r   r
   rq   r9   r   hex_key
base32_keyr2  
pretty_keyr   )r@   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                 p   SSK JnJn  U" S5      nUR                  S5      nU R	                  XB5        U R                  UR                  S5        U R                  UR                  S5        U R                  UR                  S5        U R                  US5        U R                  [        U5      S	5        U R                  US   S5        U R                  US
   S5        U R                  [        UR                  S5        U R                  [        UR                  S	5        U R                  U5        S Ul        U R                  UR                  S5        U R                  UR                   5        S Ul        U R                  UR                  S5        U R#                  UR                   5        UR                  S5      nU R%                  XT5        U R                  XT5        UR                  S5      nU R%                  Xd5        U R                  Xd5        UR                  S5      nU R'                  Xt5        g)zgenerate() -- TotpToken() classr   )r
   	TotpTokens3jdvb7qd2r7jpxxr   r   iTT)r   r  r   r   c                      g)Ng  Tn'Ar)   r)   r,   r#   r`  *TotpTest.test_totp_token.<locals>.<lambda>T  s    <r,   r   c                      g)NiUTr)   r)   r,   r#   r`  r  X  s    :r,   i7TiWTN)r  r
   r  generateassertIsInstancer9   r  rY  expire_timer   r>   
IndexError__getitem__r=   rZ  	remainingvalidr;   assertIsNotr   )r@   r
   r  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                 N  ^ SSK Jn  U" SS9nU R                  5       mUR                  T5      nUR                  nU R                  U[        5        UR                  S-  nU R                  UR                  US-   5      R                  U5        U R                  UR                  US-   5      R                  U5        [        R                  R                  T5      nU R                  [        UR                  U5      5      [        T5      5        U R                  UR                  U5      R                  U5        UR                  " U4S jS9" UR                  S	9nU R                  UR                  5       R                  U5        U R!                  ["        UR                  S
5        g)z
generate()r   r
  Tr  r      c                     > T $ r   r)   r|  s   r#   r`  (TotpTest.test_generate.<locals>.<lambda>  s    dr,   r\  )r   rG  N)r  r
   r   r  r  r  r   rY  r9   r   r   r   rf  re  rT  r  r>   r   )	r@   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                 (   U R                  5        H~  u  pp4nUR                  U5      nU R                  UR                  X5S9  U R                  UR                  X!R
                  -  US9  U(       d  Mb  U R                  UR                  U5        M     g)zgenerate() -- reference vectorsmsgN)r  r  r9   r  rY  r   r  )r@   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                    SSK Jn  U R                  X5        U R                  UR                  [        5        U R                  UR                  R                  U5        U R                  UR                  X&S-   S9  X$-  nX-   n	U R                  UR                  XS-   S9  U R                  UR                  XS-   S9  U R                  UR                  X6S-   S9  U R                  UR                  XE-   5        U	S-   U-  n
U R                  UR                  U
5        U R                  UR                  X-   5        U R                  [        U5      S	5        U R                  XU45        U R                  [         UR"                  S
5        U R                  US   U	5        U R                  US   U5        U R                  [         UR"                  S	5        U R%                  U5        g )Nr   	TotpMatchz matched time:r  z matched counter:z expected counter:z	 skipped:r   r   r  )r  r  r  r	   r
   r9   r   r  rY  expected_counterskippedcache_secondsr  
cache_timer   r>   r  r  r=   )r@   matchr  r  r   windowr  r  expectedrY  r  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                    ^ SmSn[         R                  " U4S jS9" [        5      nUR                  UT5      nU R	                  UTSS9  g)z!match() -- valid TotpMatch objectk781501c                     > T S-   $ NiQ r)   r|  s   r#   r`  8TotpTest.test_totp_match_w_valid_token.<locals>.<lambda>  
    TI%5r,   r\  r   r  r  Nr
   rT  KEY3r  r  r@   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                    ^ SSK Jn  SmSn[        R                  " U4S jS9" [        5      nUR                  UTS-
  5      nU R                  UTS-
  SS	9  g
)z3match() -- valid TotpMatch object with future tokenr   r  r  r  c                     > T S-   $ r  r)   r|  s   r#   r`  8TotpTest.test_totp_match_w_older_token.<locals>.<lambda>  r  r,   r\  r   r   r  N)r  r  r
   rT  r  r  r  )r@   r  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                    ^ SmSn[         R                  " U4S jS9" [        5      nUR                  UTS-   5      nU R	                  UTS-   SS9  g)	z1match() -- valid TotpMatch object with past tokenr  r  c                     > T S-   $ r  r)   r|  s   r#   r`  6TotpTest.test_totp_match_w_new_token.<locals>.<lambda>  r  r,   r\  r   rG  r  Nr  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                    ^ SmSn[         R                  " U4S jS9" [        5      nU R                  [        R
                  UR                  UTS-   5        g)z#match() -- invalid TotpMatch objectr  r  c                     > T S-   $ r  r)   r|  s   r#   r`  :TotpTest.test_totp_match_w_invalid_token.<locals>.<lambda>  r  r,   r\  r  N)r
   rT  r  r>   r   InvalidTokenErrorr  )r@   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                    SUR                   < SUR                  < SUR                  < SU< SU< SU< S3nUR                  " X#40 UD6nU R	                  UUR                  U5      UR                  UR                  SS	5      UUS
9  g)z,helper to test otp.match() output is correctkey= alg= period=r  
 gen_time=r  :r  r   )r  r   r  r  r  N)r  r   r   r  r  re  get)	r@   expect_skippedr  r  r  gen_timer   r  r   s	            r#   assertVerifyMatchesTotpTest.assertVerifyMatches  sv    
 ~~sww

E8TK5/$/V"%"4"4T":$'JJ$(HHXr$:%3!$ 	 	&r,   c                     SUR                   < SUR                  < SUR                  < SU< SU< SU< S3nU R                  " XR                  X#4SU0UD6$ )	z/helper to test otp.match() throws correct errorr  r  r  r  r  r  r  __msg__)r  r   r   r>   r  )r@   	exc_classr  r  r  r  r   r  s           r#   assertVerifyRaisesTotpTest.assertVerifyRaises  sP     ~~sww

E8TK  IIu 6),6046 	6r,   c                    U R                  5       nUR                  nU R                  5       nUR                  U5      R                  n[        XS9n[        U R                  40 UD6n[        U R                  40 UD6nU" [        R                  XCU-
  SS9  U" SXCU-
  US9  U" SXCU-
  SU-  S9  U" SXCSS9  U" [        R                  XCU-   SS9  U" SXCU-   US9  U" SXCU-   SU-  S9  U" [        R                  XCSU-  -   SS9  U" [        R                  XCSU-  -   US9  U" SXCSU-  -   SU-  S9  [        R                  R                  U5      nU" SXHSS9  U" [        US5        g)	z)match() -- 'time' and 'window' parametersr  r  r   r  r   r   rG  N)r   r   r   r  r  ro   r   r  r  r   r  r   r   r   )	r@   r  r   r  r  commonassertMatchesr>   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                    U R                  5       nUR                  nU R                  5       n[        XS9n[	        U R
                  40 UD6n[	        U R                  40 UD6nSU-  nUR                  X7-
  5      R                  nU" [        R                  XSS9  U" SXSU* S9  UR                  X7-   5      R                  n	U" [        R                  XSS9  U" SXSUS9  g)zmatch() -- 'skew' parametersr  r   r   r  r  )r  skewN)r   r   r   ro   r   r  r  r  r  r   r  )
r@   r  r   r  r  r  r>   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                 l   U R                  5       nUR                  nU R                  5       nUR                  U5      nUR                  nUR
                  nUR                  n[        XS9n[        U R                  40 UD6n	[        U R                  40 UD6n
U	" SXSU-   US9  U	" SXSU-   US-
  US9  U
" [        R                  XSSU-  -   XbS9  U
" [        R                  XSU-   XbS9nU R                  UR                  U5        U
" [        R                  XSUSS9nU R                  UR                  U5        g)	z0match() -- 'reuse' and 'last_counter' parametersr  rG  r  r   )last_counterr  r   r   N)r   r   r   r  r  rY  r  ro   r   r  r  r   r  UsedTokenErrorr9   )r@   r  r   r  tdatar  rY  r  r  r  r>   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                 b   [        S5      nUR                  nSnU R                  U" SU5      5        U R                  U" SU5      5        U R                  [        R
                  USU5        U R                  [        R
                  USU5        U R                  [        R
                  USU5        g)	zmatch() -- token normalizationotxl2f5cctbprpzx6Tz    3 32-136  s   3321361234512345X0123456N)r
   r  r=   r>   r   rs  )r@   r  r  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           	         U R                  5        Hv  u  pp4nUR                  nU" X25      nU R                  U5        U R                  UR                  X!R
                  -  US9  U R                  [        R                  XcUS-   SS9  Mx     g)zmatch() -- reference vectorsr  d   r   r  N)	r  r  r=   r9   rY  r   r>   r   r  )r@   r  r  r  r  r  r  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                   ^ SSK Jn  SmUR                  " U4S jS9n[        SSSS	9nUR	                  S
U5      nU R                  UTS9  [        SSSS	9nU R                  [        R                  UR                  SU5        [        SSS9nU R                  [        UR                  SU5        SnUR	                  S
U5      nU R                  UTS9  SnUR	                  S
U5      nU R                  UTS9  g)zverify()r   r
  r  c                     > T $ r   r)   r|  s   r#   r`  &TotpTest.test_verify.<locals>.<lambda>  s    Tr,   r\  r   r	   r  r`   typer   332136r|  332155r`   r  z3{"v": 1, "type": "totp", "key": "otxl2f5cctbprpzx"}z,otpauth://totp/Label?secret=otxl2f5cctbprpzxN)
r  r
   rT  ro   verifyr  r>   r   r  r   )r@   r
   r  source1r  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                    SSK Jn  UR                  nU" [        S5      5      nU R	                  UR
                  [        5        U" S5      nU R	                  UR
                  [        5        U" [        SS[        S95      nU R	                  UR
                  [        5        U" [        S5      5      nU R	                  UR
                  [        5        U" S	5      nU R	                  UR
                  [        5        U R                  U" U5      U5        [        5       nUR                  " US
9R                  U5      nU R                  XS5        U R	                  UR                  5       UR                  5       5        UR                  " US
9R                  U5      nU R                  Xe5        U R                  [        U[        S5      5        U R                  [        US5        g)zfrom_source()r   r
  Notpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&issuer=ExamplesN   otpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&issuer=Exampler   r	   r  z3{"v": 1, "type": "totp", "key": "JBSWY3DPEHPK3PXP"}s3   {"v": 1, "type": "totp", "key": "JBSWY3DPEHPK3PXP"})rA   foos   fooN)r  r
   from_sourcer   r9   r   KEY4_RAWro   KEY4rc  r   rT  r  to_dictr>   r   )r@   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                    SSK Jn  UR                  nU" S5      nU R                  X15        U R	                  UR
                  [        5        U R	                  UR                  S5        U R	                  UR                  S5        U R	                  UR                  S5        U R	                  UR                  S5        U R	                  UR                  S5        U" S	5      nU R	                  UR
                  [        5        U R                  [        US
5        U R                  [        US5        U" S5      nU R	                  UR                  S5        U R	                  UR                  S5        U" S5      nU R	                  UR                  S5        U R	                  UR                  S5        U" S5      nU R	                  UR                  S5        U R	                  UR                  S5        U R                  [        UR                  S5        U" S5      nU R	                  UR                  S5        U R                  [        US5        U" S5      nU R	                  UR                  S5        U R                  [        US5        U R                  [        US5        U R                  [        US5        U" S5      nU R	                  UR                  S5        U R                  [        US5        U R                  [        US5        U R                  [!        ["        R$                  S S!9/5         U" S"5      nS#S#S#5        U R	                  UR&                  [(        5        U R	                  UR                  S5        g#! , (       d  f       NK= f)$z
from_uri()r   r
  r  alice@google.comExampler   r   r   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=8r&   zHotpauth://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=63rC  zHotpauth://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_urir  r9   r   r  rK  rP  r   r   r   r>   r   r4  r+  ro   r   PasslibRuntimeWarningr  r  )r@   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   -	M;;
N	c                    [        [        SSSS9nU R                  UR                  SS5      S5        U R	                  [
        UR                  SS5        U R                  UR                  S5      S	5        SUl        U R                  UR                  5       S	5        SUl        U R                  UR                  5       S5        U R	                  [
        UR                  S
5        U R	                  [
        UR                  SS5        U R                  [        [        SS9R                  S5      S5        U R                  [        [        SS9R                  S5      S5        U R                  [        [        SS9R                  S5      S5        g)zto_uri()r   r   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   r9  zHotpauth://totp/alice@google.com?secret=JBSWY3DPEHPK3PXP&algorithm=SHA256r&   r>  z@otpauth://totp/alice@google.com?secret=JBSWY3DPEHPK3PXP&digits=8rC  rD  zAotpauth://totp/alice@google.com?secret=JBSWY3DPEHPK3PXP&period=63)r
   r  r9   to_urir>   r   rK  rP  rt  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                 z   SSK Jn  UR                  nU" [        SS[        SSS95      nU R                  X15        U R                  UR                  [        5        U R                  UR                  S5        U R                  UR                  S5        U R                  UR                  S5        U R                  UR                  S	5        U R                  UR                  S
5        U R                  [        U[        S[        S95        U R                  [        U[        SS[        S95        U R                  [        U[        SS[        S95        U R                  [        U[        S[        S95        U" [        SS[        R!                  5       SSS95      nU R                  UR                  [        5        U R                  [        U[        SSS95        U R                  ["        U[        SSSS95        U" [        SS[        SSS95      nU R                  UR                  S5        U R                  UR                  S5        U" [        SS[        SS95      nU R                  UR                  S5        U R                  [        U[        SS[        SS95        U" [        SS[        SS95      nU R                  UR                  S5        U R                  [$        U[        SS[        SS95        U R                  [        U[        SS[        SS95        U" [        SS[        SS95      nU R                  UR                  S5        U R                  [        U[        SS[        SS95        U R                  [        U[        SS[        SS95        U R                  [$        U[        SS[        SS95        g) zfrom_dict()r   r
  r   r	   r"  r#  r`   r  r   rK  rP  r   r   r   )r  r   r  rl   )r`   r   r  zJBSWY3DPEHP@3PXPr$  r%  r   r`   r  r   r   sha333r&   r`   r  r   r   rN      rC  r`   r  r   r   rG  r6   )r`   r  r   INVALIDN)r  r
   	from_dictro   r  r  r9   r   r  rK  rP  r   r   r   r>   r   r3  r4  r?   )r@   r
   r8  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                 b   [        [        SSSS9nU R                  UR                  5       [	        SS[        S95        [        [        SSSSS	S
9nU R                  UR                  5       [	        SS[        SS	S95        [        [        SSSSS9nU R                  UR                  5       [	        SS[        SS95        [        [        SSSS	S9nU R                  UR                  5       [	        SS[        S	S95        [         R
                  " S	S9nU" [        5      nU R                  UR                  5       [	        SS[        S95        U" [        S	S9nU R                  UR                  5       [	        SS[        S95        U R                  [        [        SS9R                  5       [	        SS[        SS95        U R                  [        [        SS9R                  5       [	        SS[        SS95        U R                  [        [        SS9R                  5       [	        SS[        SS95        g)z	to_dict()r   r   r   r+  r   r	   r  r"  r,  )r   r   r   rK  rP  r1  )r   r   r   rK  )r`   r  r   rK  )r   r   r   rP  )r`   r  r   rP  rO  r   r9  r2  r&   r>  r4  rC  rD  r6  N)r
   r  r9   r  ro   rT  )r@   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   )r   r   r   r8   )6r   r   r   r   __doc__r   r   r   r   r   ro   r  RFC_KEY_BYTES_20RFC_KEY_BYTES_32RFC_KEY_BYTES_64r  r  r  r-  r6  r;  r@  rH  rL  rQ  rU  rj  ru  rx  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r(  r.  r9  r<  r   __classcell__)r   s   @r#   r   r     sT    ,
=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   )4r>  r   	functoolsr   logging	getLoggerr   r  sysr  rd  passlibr   passlib.utils.compatr   r   passlib.tests.utilsr   r   r	   r   r  r
   r   r   __all__r?   r4  r5  version_infobinasciir   rm   rn   r2  rq   rr   r  r  r  
float_inforadixmant_digr$   r   r+   r.   encoder?  r@  rA  r   r)   r,   r#   <module>rQ     sK   (
   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,   