
    K}bg                     2   d Z ddlZddlmZ ddlZ ej        e          ZddlZddl	Z
ddlmZ ddlmZmZ ddlmZmZ ddlmZ ddlmZmZmZ d	gZexZZej        d
k    rddlmZ ej        dk    rddlmZ dZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'ej(        j)        dk    s
J d            ej(        j*        dk    s
J d            d Z+ e+            Z,d Z- G d de          Z.d/                    d          Z0e0dz  dd         Z1e0d z  dd!         Z2 G d" d#e          Z3dS )$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                      d} d}	 | dz  }	 t           j                             |dz
            j        }n# t          t          t
          f$ r Y nw xY w||k     rn|} U| dz  } d}t          | |          S )z8
    helper to calc max_time_t constant (see below)
    i   @r   T   l    )datetimeutcfromtimestampyear
ValueErrorOSErrorOverflowErrormin)valuer   
next_value	next_yearmax_datetime_timestamps        j/home/e360mart.nyusoft.in/public_html/e360mart_env/lib/python3.11/site-packages/passlib/tests/test_totp.py_get_max_time_tr$   8   s     EDaZ
	 ):::a<HHMIIG]3 	 	 	 E	* t9> 
QJE
 *u,---s   '4 AAc                     | dz  dz   dz  S )N          )raw_sizes    r#   to_b32_sizer+   i   s    qL1""    c                   P    e Zd ZdZd Zd Zd ZddZd Zd Z		 	 ddZ
d Zd ZdS )AppWalletTestzpasslib.totp.AppWalletc                    t                      }|                     |j        i            |                     |j                   ddd}t          |          }|                     |j        |           |                     |j                   t          d          }|                     |j        |           t          d          }|                     |j        ddd           t          d          }|                     |j        |           |                     t          t           d           |                     t          t           d	           |                     t          t           d
dd           dS )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_typesz AppWalletTest.test_secrets_typesv   s_    "---+,,, ((3#...*+++ ?@@#... BCC&*I*IJJJ 233#... 	)Y444 	)Y888 	*iu21F1FGGGGGr,   c           	         dddd}t          |          }|                     |j        |           t          t          d          dt          d          dt          d          di          }|                     |j        |           t          dddd          }|                     |j        |           |                     t
          t           d	d
i           t          ddi          }|                     t          t           dd
i           |                     t          t           dd
i           t          t          d
          ddd          }|                     |j        |           |                     t
          t           ddi           |                     t
          t           ddi           |                     t
          t           dg i           dS )z9constructor -- 'secrets' param -- tag/value normalizationr0   r1   s   ccc)r3   02Cr3   rD   rE   )r   rD   rE   )r   r6   z1-2_3.4z-abczab*$bbbr5   N)r   r8   r9   r   r=   r>   r   )r?   rA   r@   s      r#   test_secrets_tagszAppWalletTest.test_secrets_tags   s    &v663#... AcFFFAdGGVQsVVVLMM#... vV&AABB#... 	)Yu>>> Iv.// 	*i&%AAA*i&%AAA 5VDDEE#... 	)Yc
;;;)Yd<<<)Yb	:::::r,   c                    t          ddd          }|                     |j        d           |                     |                    |j                  d           t          dddd          }|                     |j        d           |                     |                    |j                  d	           t          ddddd
          }|                     |j        d
           |                     |                    |j                  d           |                     t
          t           ddddd           t                      }|                     |j        d           |                     t
          |j        d           dS )z"constructor -- 'default_tag' paramonetwo)r3   rD   rD   s   twor6   )r3   rD   ArK   r0   r3   )default_tags   oneBN)r   r8   rL   
get_secretr=   KeyError)r?   r@   s     r#   test_default_tagzAppWalletTest.test_default_tag   s    e4455+T222**6+=>>GGG e%@@AA+S111**6+=>>GGG e%@@cRRR+S111**6+=>>GGG 	(IU%e/T/T&) 	 	+ 	+ 	+ +T222(F$5t<<<<<r,   Nc                     t           r|o |             d S  d S |o|                     t          |           |                     d          )Nz$'cryptography' package not installed)r   r=   RuntimeErrorskipTest)r?   canarys     r#   require_aes_supportz!AppWalletTest.require_aes_support   sT     	Hvvxxxxx>t((v>>-- FGGGr,   c                    t          t          t          d          }t          ddddd          }|                     t          |j        |                     |                     |                    |          d	         t                     t          ddd
dd          }|                     |                    |          d	         t                     t          ddddd          }|                     |                    |          d	         t                     |
                                }|                    d           |                     |                    |          d	         d           |
                                }|                    d           |                     t          |j        |           |
                                }|                    d           |                     t          |j        |           dS )z.decrypt_key()r2   r      6D7N7W53O7HHS37NLUFQMHCTEGSNPFN5CGBJr3   vcsktrT   r   SPZJ54Y6IPUD2BYA4C6AZGDXXTVQOWYLC2AUr&   FCCTARTIJWE7CPQHUDKA D2DRS32YESGHHINWFFCELKN7Z6NAHM4Mr4   r_   s
   D6.F7Q3  )r[   N)r   PASS1PASS2dictrU   r   decrypt_keyr8   KEY1_RAWKEY2_RAWcopyupdater=   rO   r   )r?   r@   CIPHER1CIPHER2CIPHER3temps         r#   test_decrypt_keyzAppWalletTest.test_decrypt_key   s    U3344 b$:+s4 4 4  0BG(L(L MMM 	++G44Q7BBB b$:+s4 4 4++G44Q7BBB a#9;sD D D++G44Q7BBB ||~~c++D11!46OPPP ||~~c(F$6=== ||~~c*f&8$?????r,   c                 N   |                                   t          t          t          dd          }t	          ddddd          }|                     |                    |          d                    |                                }|                    d	           | 	                    |                    |          d                    |                                }|                    d
           | 	                    |                    |          d                    dS )z$.decrypt_key() -- needs_recrypt flagr2   rW   encrypt_costr   AAAAr4   rZ   r&   )r\   r3   re   N)
rU   r   rh   ri   rj   r:   rk   rn   ro   r<   )r?   r@   rA   rs   s       r#   test_decrypt_key_needs_recryptz,AppWalletTest.test_decrypt_key_needs_recrypt  s     """U33"EEE Q"&C888++C003444 xxzza**4003444 xxzzc**400344444r,   r3   Fc                    |                      t          |          t          g d                     |                      |d         d           |                      |d         |           |                      |d         |j                   |                      t          |d                   t	          |j                             |                      t          |d                   t	          t          |                               |                    |          \  }}|                      ||           |                      ||           dS )	z.check encrypt_key() result has expected format)r[   r_   r\   r]   r^   r[   r   r_   r\   r]   r^   N)r8   setrw   lenr+   	salt_sizerk   )r?   resultr@   keytagneeds_recrypt
result_keyresult_needs_recrypts           r#   assertSaneResultzAppWalletTest.assertSaneResult0  s)    	Vc*C*C*C&D&DEEEa(((c***f&9:::VC[));v7G+H+HIIIVC[));s3xx+@+@AAA+1+=+=f+E+E(
(S)))-}=====r,   c                    t          dt          id          }|                     t          |j        t
                               |                    t
                    }|                     ||t
                     |                    t
                    }|                     ||t
                     |                     |d         |d                    |                     |d         |d                    t          dt          id          }|                    t
                    }|                     ||t
                     t          t          t          d          }|                    t
                    }|                     ||t
          d	
           t          dt          i          }d|_	        |                    t
                    }|                     ||t
                     |                    t                    }|                     ||t                     |                     t          |j        d           dS )z.encrypt_key()r3   r(   rv   r`   r]   r^      r2   r4   )r   @   r,   N)r   rh   rU   r   encrypt_keyrl   r   assertNotEqualri   r}   rm   r=   r   )r?   r@   r~   otherwallet2s        r#   test_encrypt_keyzAppWalletTest.test_encrypt_keyA  s    C<a888  0BH(M(M NNN ##H--ffh777 ""8,,ffh777E#Js444E#Js444 S%Lq999$$X..fgx888 %e4455$$X..fgxSAAA S%L))$$X..fgx888 ##H--ffh777 	*f&8#>>>>>r,   c                    |                                   t          ddi          }|xj        dz  c_        t          t	          |j        t                    d          \  }}|xj        dz  c_        t          t	          |j        t                    d          \  }}|                     ||dz  |dz  dz  	           d
S )z verify cost parameter via timingr3   r6   r   r   )maxtimer   r&         ?)deltaN)rU   r   rw   r   r   r   rl   assertAlmostEqual)r?   r@   r   _delta2s        r#   test_encrypt_cost_timingz&AppWalletTest.test_encrypt_cost_timingj  s      """ C<((q WV%7BBANNNq 	q gf&8(CCQOOO	 	vuQwuQwmDDDDDr,   N)r3   F)__name__
__module____qualname__descriptionPrefixrB   rG   rP   rU   rt   ry   r   r   r   r)   r,   r#   r.   r.   o   s        00H 0H 0Hd!; !; !;J= = =@H H H H$@ $@ $@L5 5 5, 9<',> > > >"'? '? '?RE E E E Er,   r.   12345678901234567890ascii    r'   r   c                       e Zd ZdZdZ fdZd ZdfdZd Z e	dd	d
d          Z
 e	dd          dddddg e	dd          dddddg e	dd          ddg e	edd	          dd d!d"d#d$g e	edd%          d&d'd(d)d*d+g e	edd,          d-d.d/d0d1d2g e	d3d          d4d5g e	d3d6d78          d9g e	edd:;          d<g e	edd%d:=          d>g e	edd,d:=          d?ggZd@ ZdA ZdB ZdC ZdD ZdE ZdF ZdG ZdH ZdI ZdJ ZdfdKZdL ZdM ZdN ZdO ZdP ZdQ Z dgdTZ!dU Z"dV Z#dW Z$dX Z%	 dfdYZ&	 dfdZZ'd[ Z(d\ Z)d] Z*d^ Z+d_ Z,d` Z-da Z.db Z/dc Z0dd Z1de Z2 xZ3S )hTotpTestz3
    common code shared by TotpTest & HotpTest
    zpasslib.totp.TOTPc                     t          t          |                                            ddlm} |                                 |                     t          d|                                            d S )Nr   )lookup_hashrng)	superr   setUppasslib.crypto.digestr   clear_cache	patchAttrtotp_module	getRandom)r?   r   	__class__s     r#   r   zTotpTest.setUp  sm    h##%%% 	655555!!! 	{E4>>+;+;<<<<<r,   c                 ^    |                                                                  t          z  S )zY
        helper to generate random epoch time
        :returns float: epoch time
        )r   random
max_time_tr?   s    r#   randtimezTotpTest.randtime  s%    
 ~~&&((:55r,   Nc                 X   |                                  }d|vrd|d<   |                    d|                    dd                     |                    d|                    g d                     |                    d	|                    dd
                      |pt          di |S )z@
        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#   randotpzTotpTest.randotp  s     nnDK#++a"4"4555szz*F*F*FGGHHH#++b#"6"6777t$$t$$$r,   c                    |                                  }|                                  }|                     |j        |j        d           t          d          D ](}|j        |j        k    r n*|                                  })|                     d           t          d          D ])}|j        |j        k    r dS |                                  }*|                     d           dS )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_randotpzTotpTest.test_randotp  s     ||~~||~~DHdh0EFFF r 	/ 	/A{dk))<<>>DDII-... r 	, 	,Ax48##<<>>DD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           	   #   n  K   ddl m} | j        D ]}| j                                        }|                    |d                    |dd         D ]c}t          |          dk    r|\  }}}n|\  }}d}t                              d||||            |di |}d|j	        d|d	|d
}	|||||	fV  ddS )zv
        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_defaultsrn   ro   r|   logdebugr   )
r?   r
   rowr   entrytimetokenexpiresotpprefixs
             r#   iter_test_vectorszTotpTest.iter_test_vectors.  s     
 	&%%%%%< 	8 	8C',,..DKKAQRR 8 8u::??+0(D%"'KD%"G 		GtUZ\cddddllTll8;uuuM4777778	8 	8r,   c                    |                      t          t                     |                      t          t          dd           t          d          }t          d          }|                     |j        |j                   dS )zconstructor -- 'new'  parameter4aoggdbbqsyhntuzT)r   r   r   N)r=   r>   r
   r   r   )r?   r  r   s      r#   test_ctor_w_newzTotpTest.test_ctor_w_newG  st     	)T***)T/AtLLL tnnn~~~CGTX.....r,   c                 j   |                      t          t          dd          j                  d           |                      t          t          dd          j                  d           |                      t          t          dd          j                  d           |                      t          t          dd	
          j                  d	           |                      t          t          dd
          j                  d           |                     t
          t          ddd           |                     t
          t          dd
           |                     t          t          j	        d          g          5  t          dd          }ddd           dS # 1 swxY w Y   dS )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)
r8   r|   r
   r   r=   r   assertWarningListrj   r   PasslibSecurityWarning)r?   r   s     r#   test_ctor_w_sizezTotpTest.test_ctor_w_sizeS  s    	Td777;<<bAAATd999=>>CCCTd999=>>CCC 	Td4448992>>>Td4448992>>> 	*d26JJJ 	*d1=== ##c8Etuuu%   	$ 	$ VU##A	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$s   
F((F,/F,c                    |                      t          t                    j        t                     |                      t          t                                                    j        t                     |                      t          d          j        t                     |                     t          t          d           |                      t          dd          j        t                     |                     t          t          dd           |                      t          t          d          j        t                     dS )z,constructor -- 'key' and 'format' parametersz 4aog gdbb qsyh ntuz zao!ggdbbqsyhntuze01c630c2184b076ce99r  X01c630c2184b076ce99r   N)	r8   r
   KEY1r   rl   lowerr=   Base32DecodeErrorBase16DecodeErrorr   s    r#   test_ctor_w_key_and_formatz#TotpTest.test_ctor_w_key_and_formatk  s     	d222 	djjll++/::: 	566:HEEE 	+T3EFFF 	4e<<@(KKK 	+T3I5QQQ 	h..2H=====r,   c                    |                      t          t          d          j        d           |                      t          t          d          j        d           |                     t
          t          t          d           dS )zconstructor -- 'alg' parameterzSHA-256r   r   SHA256zSHA-333N)r8   r
   r  r   r=   r   r   s    r#   test_ctor_w_algzTotpTest.test_ctor_w_alg  su     	d	2226AAAd1115x@@@ 	*dDi@@@@@r,   c                 b   |                      t          t          t          d           |                     t          t          d          j        d           |                     t          t          d          j        d           |                      t          t          t          d           dS )z!constructor -- 'digits' parameterr(   r   r   r      N)r=   r   r
   r  r8   r   r   s    r#   test_ctor_w_digitszTotpTest.test_ctor_w_digits  s    *dD;;;d1---4a888d2...5r:::*dD<<<<<r,   c                    |                      t          t                    j        d           |                      t          t          d          j        d           |                     t
          t          t          d           |                     t
          t          t          d           |                     t          t          t          d           |                     t          t          t          d           dS )	z!constructor -- 'period' parameterr   ?   r         ?abcr   N)r8   r
   r  r   r=   r>   r   r   s    r#   test_ctor_w_periodzTotpTest.test_ctor_w_period  s     	d*B/// 	d2...5r::: 	)T4<<<)T4>>> 	*dD;;;*dD<<<<<r,   c                    |                      t          t                    j        d           |                      t          t          d          j        d           |                     t
          t          t          d           dS )z constructor -- 'label' parameterNzfoo@bar)labelzfoo:bar)r8   r
   r  r4  r=   r   r   s    r#   test_ctor_w_labelzTotpTest.test_ctor_w_label  sj    d)4000d)444:IFFF*dD	BBBBBr,   c                    |                      t          t                    j        d           |                      t          t          d          j        d           |                     t
          t          t          d           dS )z!constructor -- 'issuer' parameterNzfoo.comissuerzfoo.com:bar)r8   r
   r  r8  r=   r   r   s    r#   test_ctor_w_issuerzTotpTest.test_ctor_w_issuer  sj    d*D111d9555<iHHH*dDGGGGGr,   c                    |                      t          t                    j        d           |                       t          j        d          t                    j        d           |                     t          t          j        d           |                     t          t          j        d           |                     t          t          j        d           |                     t          t          j        d           dS )	zusing() -- 'period' parameterr   r-  r.  r/  r0  r   r1  N)r8   r
   r  r   usingr=   r>   r   r   s    r#   test_using_w_periodzTotpTest.test_using_w_period  s     	d*B/// 	.2...t44;R@@@ 	)TZ<<<)TZ>>> 	*dj;;;*dj<<<<<r,   c                    |                                  }|                     |j        t          j                   |                     |                    d          t          t          j                                         dgfd}|                      t          j	        |                    }| 
                    |                    d          d           | 
                    |                    d          d           |                     t          t          j	        d           d	}|                     t          |t          j	        d
            |                     t          |t          j	        d            dS )zusing -- 'now' parameterNgHz^@c                  4     dxx         dz  cc<    d         S )Nr   r   r)   )counters   r#   nowz&TotpTest.test_using_w_now.<locals>.now  s"    AJJJ!OJJJ1:r,   r@  )r   ~      r5   z)now\(\) function must return non-negativec                      dS )Nr0  r)   r)   r,   r#   <lambda>z+TotpTest.test_using_w_now.<locals>.<lambda>  s    u r,   c                      dS )Nr1  r)   r)   r,   r#   rE  z+TotpTest.test_using_w_now.<locals>.<lambda>  s    r r,   )r   assertIsr@  _timer  r   normalize_timeintr
   r;  r8   r=   r>   assertRaisesRegexAssertionError)r?   r  r@  msg_rer?  s       @r#   test_using_w_nowzTotpTest.test_using_w_now  sX    llnncguz***s11$77UZ\\9J9JKKK (	 	 	 	 	 lltzc222l33++D113777++D113777 	)TZS999 >~vtz}}UUU 	~vtzzzRRRRRr,   c                     ||                      d          }|                     |                    t          d                    d           |                     |                    d          d           |                     |                    d          d           |                     |                    d          d           |                     t
          |j        d	           |                     t
          |j        d           |                     t          j        |j        d
           |                     t          j        |j        d           |                     t          j        |j        d           dS )z$normalize_token() -- instance methodN   r)  1234567s   1234567i iG 0234567g    2A12345601234567iNa )r   r8   normalize_tokenr   r=   r>   r   MalformedTokenErrorr?   r  s     r#   test_normalize_token_instancez&TotpTest.test_normalize_token_instance  sR   ;,,a,((C 	,,Qy\\::IFFF,,Z88)DDD 	,,W55yAAA 	,,V44i@@@ 	)S%8)DDD)S%8$??? 	#133FQQQ 	#133F
SSS#133FQQQQQr,   c                 X    |                      t          j        d                     dS )z!normalize_token() -- class methodrP  r)  )r  N)rX  r
   r;  r   s    r#   test_normalize_token_classz#TotpTest.test_normalize_token_class  s,    **tz/C/C/C*DDDDDr,   c                 J   t          j                    }|                     |          }t          d          D ]G}|                                 t                    }|                     |                              |           |                     |                    |dz             |           |                     |                    |          |           t          j        	                              }|                     |                    |          |           |j
        }	 t          fd          |_
        |                     |                    d          |           ||_
        =# ||_
        w xY w|                     t          |j        d           dS )znormalize_time()r   r   c                       S r   r)   r  s   r#   rE  z.TotpTest.test_normalize_time.<locals>.<lambda>  s    t r,   N1234)r
   r;  r   r   r   rJ  r8   rI  r   r   r@  staticmethodr=   r>   )r?   TotpFactoryr  r   tintdtorigr  s          @r#   test_normalize_timezTotpTest.test_normalize_time  sx   jllll;''r 	' 	'A==??Dt99DS//55t<<<S//s
;;TBBBS//55t<<<"33D99BS//33T:::?D'".||||"<"<  !3!3D!9!94@@@"&$&&&&)S%7@@@@@s   -A E66	E?c                    |                                  }t          t          d          }|                     |j        t                     |                     |j        d           |                     |j        t                     |                     |                                d           |                     |                    d          d           |                     |                    d          t                     |                     |                    d	          d
           t          d|	                    dd                    }|j        }|j        }|                                }dS )z pretty_key() and .key attributesr   r  z4AOG-GDBB-QSYH-NTUZ )sepz4AOG GDBB QSYH NTUZFr  )r   ze01c-630c-2184-b076-ce99Tr   r  r  N)
r   r
   rl   r8   r   hex_key
base32_keyr  
pretty_keyr   )r?   r   r  r   s       r#   test_key_attrszTotpTest.test_key_attrs&  s?   nn 8U##(+++&<===... 	))+@AAAC002GHHHE22D999u557QRRR t#++b""5"5666KNNNr,   c                    ddl m}m}  |d          }|                    d          }|                     ||           |                     |j        d           |                     |j        d           |                     |j        d           |                     |d           |                     t          |          d	           |                     |d         d           |                     |d
         d           | 
                    t          |j        d           | 
                    t          |j        d	           |                     |           d |_        |                     |j        d           |                     |j                   d |_        |                     |j        d           |                     |j                   |                    d          }|                     ||           |                     ||           |                    d          }|                     ||           |                     ||           |                    d          }|                     ||           dS )zgenerate() -- TotpToken() classr   )r
   	TotpTokens3jdvb7qd2r7jpxxr   r   iTT)r   ro  r   r   c                      dS )Ng  Tn'Ar)   r)   r,   r#   rE  z*TotpTest.test_totp_token.<locals>.<lambda>T  s    < r,   r   c                      dS )NiUTr)   r)   r,   r#   rE  z*TotpTest.test_totp_token.<locals>.<lambda>X  s    : r,   i7TiWTN)r   r
   rm  generateassertIsInstancer8   r  r?  expire_timer|   r=   
IndexError__getitem__r<   r@  	remainingvalidr:   assertIsNotr   )r?   r
   rm  r  r~   result2result3result4s           r#   test_totp_tokenzTotpTest.test_totp_token?  sj   00000000 d%&&j))fi000x000222+Z888!7888Va(((H---J///*f&8"===*f&8!<<< (')3///%%%%%)1---&&& ,,z**&)))&))) ,,z**&)))&))) ,,z**GV,,,,,r,   c                    ddl m}  |d          }|                                 |                              }|j        }|                     |t                     |j        dz  }|                     |                    |dz             j        |           | 	                    |                    |dz             j        |           t          j
                                      }|                     t          |                    |                    t                               |                     |                    |          j        |             |j        fd          |j        	          }|                     |                                j        |           |                     t"          |j        d
           dS )z
generate()r   r   Tr  r      c                       S r   r)   r]  s   r#   rE  z(TotpTest.test_generate.<locals>.<lambda>  s    d r,   rA  )r   r1  N)r   r
   r   rs  r  rt  r   r?  r8   r   r   r   rJ  rI  r;  ri  r=   r   )	r?   r
   r  r~   r  
start_timerb  r   r  s	           @r#   test_generatezTotpTest.test_generatej  s   %%%%%% dtnnn}}d##eW---^b(
 	j2o66<eDDD 	CLLb99?GGG //55S//3344c$ii@@@ 	b))/777 ,ztzllll+++???.666 	*clB77777r,   c                 (   |                                  D ]|\  }}}}}|                    |          }|                     |j        ||           |                     |j        ||j        z  |           |r|                     |j        |           }dS )zgenerate() -- reference vectorsmsgN)r	  rs  r8   r  r?  r   ru  )r?   r  r  r  r  r  r~   s          r#   !test_generate_w_reference_vectorsz*TotpTest.test_generate_w_reference_vectors  s    151G1G1I1I 	> 	>-Cugv\\$''FV\5f===V^TSZ-?VLLL >  !3W===	> 	>r,   r   r7   c                 $   ddl m} |                     ||           |                     |j        t                     |                     |j        j        |           |                     |j        ||dz              ||z  }||z   }	|                     |j        |	|dz              |                     |j	        ||dz              |                     |j
        ||dz              |                     |j        ||z              |	dz   |z  }
|                     |j        |
           |                     |j        |
|z              |                     t          |          d	           |                     ||	|f           |                     t           |j        d
           |                     |d         |	           |                     |d         |           |                     t           |j        d	           |                     |           d S )Nr   	TotpMatchz matched time:r  z matched counter:z expected counter:z	 skipped:r   r   rp  )r   r  rt  r	   r
   r8   r   r  r?  expected_counterskippedcache_secondsru  
cache_timer|   r=   rv  rw  r<   )r?   matchr  r  r   windowr  r  expectedr?  ru  s              r#   assertTotpMatchzTotpTest.assertTotpMatch  s    ****** 	eY/// 	ej$///*F333 	Ts5E/EFFF6>W$S;N5NOOO/sEY?YZZZS;5FGGG,fvo>>>{f,*K888);+?@@@ 	UQ'''$000*e&7<<<q7+++q4(((*e&7;;; 	r,   c                     dd} t          j        fd          t                    }|                    |          }|                     |d           dS )z!match() -- valid TotpMatch objectk781501c                       dz   S NiQ r)   r]  s   r#   rE  z8TotpTest.test_totp_match_w_valid_token.<locals>.<lambda>      TI%5 r,   rA  r   r  r  Nr
   r;  KEY3r  r  r?   r  r  r~   r  s       @r#   test_totp_match_w_valid_tokenz&TotpTest.test_totp_match_w_valid_token  sg    6dj5555666t<<5$''V$:::::r,   c                     ddl m} dd} t          j        fd          t                    }|                    |dz
            }|                     |dz
  d	           d
S )z3match() -- valid TotpMatch object with future tokenr   r  r  r  c                       dz   S r  r)   r]  s   r#   rE  z8TotpTest.test_totp_match_w_older_token.<locals>.<lambda>  r  r,   rA  r   r   r  N)r   r  r
   r;  r  r  r  )r?   r  r  r  r~   r  s        @r#   test_totp_match_w_older_tokenz&TotpTest.test_totp_match_w_older_token  s    ******6dj5555666t<<5$),,V$)Q?????r,   c                     dd} t          j        fd          t                    }|                    |dz             }|                     |dz   d           dS )	z1match() -- valid TotpMatch object with past tokenr  r  c                       dz   S r  r)   r]  s   r#   rE  z6TotpTest.test_totp_match_w_new_token.<locals>.<lambda>  r  r,   rA  r   r1  r  Nr  r  s       @r#   test_totp_match_w_new_tokenz$TotpTest.test_totp_match_w_new_token  so    6dj5555666t<<5$),,V$)R@@@@@r,   c                     dd} t          j        fd          t                    }|                     t          j        |j        |dz              dS )z#match() -- invalid TotpMatch objectr  r  c                       dz   S r  r)   r]  s   r#   rE  z:TotpTest.test_totp_match_w_invalid_token.<locals>.<lambda>  r  r,   rA  r   N)r
   r;  r  r=   r   InvalidTokenErrorr  )r?   r  r  r  s      @r#   test_totp_match_w_invalid_tokenz(TotpTest.test_totp_match_w_invalid_token  s\    6dj5555666t<<#/E4"9MMMMMr,   c                     d|j         d|j        d|j        d|d|d|d} |j        ||fi |}|                     ||                    |          |j        |                    dd	          ||
           dS )z,helper to test otp.match() output is correctkey= alg= period=r   
 gen_time=r   :r  r   )r  r   r  r  r  N)ri  r   r   r  r  rI  get)	r?   expect_skippedr  r  r  gen_timer   r  r~   s	            r#   assertVerifyMatcheszTotpTest.assertVerifyMatches  s     
 ~~~swww


EEE888TTTK5$//$//V"%"4"4T":":$'J$(HHXr$:$:%3!$ 	 	& 	& 	& 	& 	&r,   c                 z    d|j         d|j        d|j        d|d|d|d} | j        ||j        ||fd|i|S )	z/helper to test otp.match() throws correct errorr  r  r  r   r  r   r  __msg__)ri  r   r   r=   r  )r?   	exc_classr  r  r  r  r   r  s           r#   assertVerifyRaiseszTotpTest.assertVerifyRaises  so      ~~~swww


EEE888TTTK t CIud 6 6),6046 6 	6r,   c                 X   |                                  }|j        }|                                 }|                    |          j        }t          ||          }t          | j        fi |}t          | j        fi |} |t          j
        |||z
  d            |d|||z
  |            |d|||z
  d|z              |d||d            |t          j
        |||z   d            |d|||z   |            |d|||z   d|z              |t          j
        ||d|z  z   d            |t          j
        ||d|z  z   |            |d||d|z  z   d|z             t          j                            |          } |d||d            |t          |d           dS )	z)match() -- 'time' and 'window' parametersr  r  r   r  r   r   r1  N)r   r   r   rs  r  rj   r   r  r  r   r  r   r   r   )	r?   r  r   r  r  commonassertMatchesr=   rb  s	            r#   test_match_w_windowzTotpTest.test_match_w_window  s    llnn}}T""(#--- 8CCFCCt6AA&AA 	S*E4&=KKKKb%v>>>>b%q6zBBBB 	aQ//// 	S*E4&=KKKKb%v>>>>b%q6zBBBB 	S*E4!f*3DQOOOOS*E4!f*3DVTTTTb%F
!21v:FFFF //55a1---- 	Z+++++r,   c                    |                                  }|j        }|                                 }t          ||          }t	          | j        fi |}t	          | j        fi |}d|z  }|                    ||z
            j        } |t          j
        ||d            |d||d|            |                    ||z             j        }	 |t          j
        |	|d            |d|	|d|           dS )zmatch() -- 'skew' parametersr  r   r   r  rp  )r  skewN)r   r   r   rj   r   r  r  rs  r  r   r  )
r?   r  r   r  r  r  r=   r  behind_tokenahead_tokens
             r#   test_match_w_skewzTotpTest.test_match_w_skew&  s    llnn}}#--- 8CCFCCt6AA&AA 6z||D4K006S*L$qIIIIb,QdUCCCC ll4$;//5S*KaHHHHb+tADAAAAAAr,   c                    |                                  }|j        }|                                 }|                    |          }|j        }|j        }|j        }t          ||          }t          | j	        fi |}	t          | j
        fi |}
 |	d|||z   |            |	d|||z   |dz
  |            |
t          j        ||d|z  z   ||            |
t          j        |||z   ||          }|                     |j        |            |
t          j        |||d          }|                     |j        |           dS )	z0match() -- 'reuse' and 'last_counter' parametersr  r1  r  r   )last_counterr  r   r   N)r   r   r   rs  r  r?  ru  rj   r   r  r  r   r  UsedTokenErrorr8   )r?   r  r   r  tdatar  r?  ru  r  r  r=   errs               r#   test_match_w_reusezTotpTest.test_match_w_reuse=  s    llnn}}T""-'#--- 8CCFCCt6AA&AA 	b%v>>>> 	b%WQY#	% 	% 	% 	%
 	S*E4!f*3D")&	: 	: 	: 	:
 l3-udVm(/@ @ @+666 l3-ud(/; ; ;+66666r,   c                 ~   t          d          }|j        }d}|                      |d|                     |                      |d|                     |                     t          j        |d|           |                     t          j        |d|           |                     t          j        |d|           dS )	zmatch() -- token normalizationotxl2f5cctbprpzx6Tz    3 32-136  s   3321361234512345X0123456N)r
   r  r<   r=   r   rV  )r?   r  r  r  s       r#    test_match_w_token_normalizationz)TotpTest.test_match_w_token_normalizationf  s     %&&	 	.55666 	i../// 	#15'4HHH 	#15(DIII 	#15)TJJJJJr,   c                 (   |                                  D ]|\  }}}}}|j        } |||          }|                     |           |                     |j        ||j        z  |           |                     t          j        |||dz   d           }dS )zmatch() -- reference vectorsr  d   r   r  N)	r	  r  r<   r8   r?  r   r=   r   r  )r?   r  r  r  r  r  r  r~   s           r#   test_match_w_reference_vectorsz'TotpTest.test_match_w_reference_vectors|  s    .2.D.D.F.F 
	Y 
	Y*CugsIE U5$''FOOF###V^TSZ-?SIII c3UE4#:VWXXXX
	Y 
	Yr,   c                 R   ddl m} d |j        fd          }t          ddd	          }|                    d
|          }|                     |           t          ddd	          }|                     t          j        |j        d|           t          dd          }|                     t          |j        d|           d}|                    d
|          }|                     |           d}|                    d
|          }|                     |           dS )zverify()r   r   r  c                       S r   r)   r]  s   r#   rE  z&TotpTest.test_verify.<locals>.<lambda>  s    T r,   rA  r   r	   r  r[   typer   332136r]  332155r[   r  z3{"v": 1, "type": "totp", "key": "otxl2f5cctbprpzx"}z,otpauth://totp/Label?secret=otxl2f5cctbprpzxN)
r   r
   r;  rj   verifyr  r=   r   r  r   )r?   r
   r`  source1r  source1json
source1urir  s          @r#   test_verifyzTotpTest.test_verify  sU   
 	&%%%%% dj\\\\222 -?@@@""8W55U... -?@@@#/1CXwWWW (((*k&8(GLLL L""8[99U... D
""8Z88U.....r,   c                 l   ddl m} |j        } |t          d                    }|                     |j        t                      |d          }|                     |j        t                      |t          ddt                              }|                     |j        t                      |t          d                    }|                     |j        t                      |d	          }|                     |j        t                     | 	                     ||          |           t                      } |j        |
                              |          }|                     ||           |                     |                                |                                            |j        |
                              |          }| 	                    ||           |                     t          |t          d                     |                     t          |d           dS )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"})r@   foos   fooN)r   r
   from_sourcer   r8   r   KEY4_RAWrj   KEY4rG  r   r;  rz  to_dictr=   r   )r?   r
   r  r  wallet1r   r   s          r#   test_from_sourcezTotpTest.test_from_source  s   %%%%%%& k! - . . / /(+++ k , - -(+++ k$T:::;;(+++ k!QRRSS(+++ kPQQ(+++ 	kk#&&,,, ++tz)))55c::s###777 tz)))55d;;dD!!! 	*k1U88<<<*k6:::::r,   c                    ddl m} |j        } |d          }|                     ||           |                     |j        t                     |                     |j        d           |                     |j        d           |                     |j	        d           |                     |j
        d           |                     |j        d            |d	          }|                     |j        t                     |                     t          |d
           |                     t          |d            |d          }|                     |j        d           |                     |j        d            |d          }|                     |j        d           |                     |j        d            |d          }|                     |j        d           |                     |j        d           |                     t          |j        d            |d          }|                     |j	        d           |                     t          |d            |d          }|                     |j        d           |                     t          |d           |                     t          |d           |                     t          |d            |d          }|                     |j
        d           |                     t          |d           |                     t          |d           |                     t!          t"          j        d !          g          5   |d"          }d#d#d#           n# 1 swxY w Y   |                     |j        t(                     |                     |j
        d           d#S )$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=63r-  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_urirt  r8   r   r  r4  r8  r   r   r   r=   r   r!  r  rj   r   PasslibRuntimeWarningri  r  )r?   r
   r  r  s       r#   test_from_urizTotpTest.test_from_uri  s_   %%%%%%= h ( ) )c4((((+++$6777Y///&)))R(((Q''' h ( ) )(+++ 	*h0bccc 	+X 8Q 	R 	R 	R h * + +M222[111 h 1 2 2$5666%6777 hhii$5666%6777 	*dmc	e 	e 	e hijj(+++ 	*h 1[ 	\ 	\ 	\ habbQ''' 	*h0z{{{*h0|}}}*h0{||| hbccR((( 	*h 1S 	T 	T 	T 	*h 1T 	U 	U 	U ###3@cddd%
   	0 	0 ( / 0 0C	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0
 	...R(((((s   &M>>NNc                    t          t          ddd          }|                     |                    dd          d           |                     t
          |j        dd           |                     |                    d          d	           d|_        |                     |                                d	           d|_        |                     |                                d           |                     t
          |j        d
           |                     t
          |j        dd           |                     t          t          d                              d          d           |                     t          t          d                              d          d           |                     t          t          d                              d          d           dS )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   r%  zHotpauth://totp/alice@google.com?secret=JBSWY3DPEHPK3PXP&algorithm=SHA256r&   r)  z@otpauth://totp/alice@google.com?secret=JBSWY3DPEHPK3PXP&digits=8r-  r.  zAotpauth://totp/alice@google.com?secret=JBSWY3DPEHPK3PXP&period=63)r
   r  r8   to_urir=   r   r4  r8  rW  s     r#   test_to_urizTotpTest.test_to_uriW  s    4VAb999$6FF0	1 	1 	1
 	*cj$FFF 	$677R	T 	T 	T '	R	T 	T 	T #
1	2 	2 	2
 	*cj2IJJJ 	*cj2DF^___
 	d111889KLL,	- 	- 	- 	d1---445GHH$	% 	% 	% 	d2...556HII%	& 	& 	& 	& 	&r,   c           
      (	   ddl m} |j        } |t          ddt          dd                    }|                     ||           |                     |j        t                     |                     |j	        d           |                     |j
        d           |                     |j        d           |                     |j        d	           |                     |j        d
           |                     t          |t          dt                               |                     t          |t          ddt                               |                     t          |t          ddt                               |                     t          |t          dt                                |t          ddt                                          dd                    }|                     |j        t                     |                     t          |t          dd                     |                     t"          |t          ddd                      |t          ddt          dd                    }|                     |j	        d           |                     |j
        d            |t          ddt          d                    }|                     |j        d           |                     t          |t          ddt          d                      |t          ddt          d                    }|                     |j        d           |                     t$          |t          ddt          d                     |                     t          |t          ddt          d                      |t          ddt          d                    }|                     |j        d           |                     t          |t          ddt          d                     |                     t          |t          ddt          d                     |                     t$          |t          ddt          d                     dS ) zfrom_dict()r   r   r   r	   r  r  r[   r  r   r4  r8  r   r   r   )r  r   r  rg   )r[   r   r  zJBSWY3DPEHP@3PXPr  r  r   r[   r  r   r   sha333r&   r[   r  r   r   rK      r-  r[   r  r   r   r1  r5   )r[   r  r   INVALIDN)r   r
   	from_dictrj   r  rt  r8   r   r  r4  r8  r   r   r   r=   r   r   r!  r>   )r?   r
   r  r  s       r#   test_from_dictzTotpTest.test_from_dict  s5   %%%%%%N	
 iqv4?QZcdddeec4((((+++$6777Y///&)))R(((Q''' 	*i6t1L1L1LMMM 	*iD1Q1Q1QRRR*i&d1S1S1STTT 	*it1D1D1DEEE iqv4::<<GYbklllmm(+++ 	*i1G1G1GHHH 	+Y5GHHH	J 	J 	J iqv4}U`aaabbM222[111 iqv4XFFFGG(+++ 	*iDV^1_1_1_``` iqv4BBBCCQ''' 	)Yqv4X[0\0\0\]]]*iDY[1\1\1\]]] iqv4CCCDDR((( 	*iDYZ1[1[1[\\\*iDY[1\1\1\]]]
 	)Yqv4Y\0]0]0]^^^^^r,   c           
         t          t          ddd          }|                     |                                t	          ddt                               t          t          ddddd	
          }|                     |                                t	          ddt          dd	                     t          t          dddd          }|                     |                                t	          ddt          d                     t          t          dddd	          }|                     |                                t	          ddt          d	                     t          j        d	          } |t                    }|                     |                                t	          ddt                                |t          d	          }|                     |                                t	          ddt                               |                     t          t          d                                          t	          ddt          d                     |                     t          t          d                                          t	          ddt          d                     |                     t          t          d                                          t	          ddt          d                     dS )z	to_dict()r   r   r   r  r   r	   r  r  r  )r   r   r   r4  r8  r  )r   r   r   r4  )r[   r  r   r4  )r   r   r   r8  )r[   r  r   r8  r7  r   r%  r  r&   r)  r  r-  r.  r  N)r
   r  r8   r  rj   r;  )r?   r  r`  s      r#   test_to_dictzTotpTest.test_to_dict  s    4VAb999qv4(H(H(HIII 4VAb+MC C CD$6}N N N	O 	O 	O
 4VAb+- - -D$68 8 8	9 	9 	9
 4VAb') ) )D%24 4 4	5 	5 	5
 j666k$qv4(H(H(HIII k$}555D)I)I)IJJJ
 	d11199;;DhGGG	I 	I 	I 	d1---5577DCCC	E 	E 	E 	d2...6688DDDD	F 	F 	F 	F 	Fr,   r   )r   r   r   r7   )4r   r   r   __doc__r   r   r   r   r   rj   r   RFC_KEY_BYTES_20RFC_KEY_BYTES_32RFC_KEY_BYTES_64r   r	  r  r  r#  r'  r+  r2  r5  r9  r<  rN  rX  rZ  rd  rk  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  __classcell__)r   s   @r#   r   r     s         ,
= = = = =6 6 6
% 
% 
% 
%, , ,< d(r!LLLO 
$Q	/	/	/"""""	
 
$Q	/	/	/$$$$$	
 
'	2	2	2""	
 
"5f	=	=	=$$$$%	
 
"5h	?	?	?$$$$%	
 
"5h	?	?	?$$$$%	
 
$Q	/	/	/1GI_`	$Qr	:	:	:<UV 
"5	<	<	<>VW	"5hr	J	J	JLde	"5hr	J	J	JLdeaRGh8 8 82
/ 
/ 
/$ $ $0> > >0A A A= = == = ="C C CH H H= = ="S S SDR R R R4E E EA A A<  2)- )- )-V8 8 8@> > >   B; ; ;@ @ @A A AN N N +/& & & & )-6 6 6 6., ., .,`B B B.'7 '7 '7RK K K,Y Y Y"/ / /H*; *; *;^u) u) u)n8& 8& 8&z\_ \_ \_|9F 9F 9F 9F 9F 9F 9Fr,   r   )4r   r   	functoolsr   logging	getLoggerr   r   sysr  rH  passlibr   passlib.utils.compatr   r   passlib.tests.utilsr   r   r	   r   r   r
   r   r   __all__r>   r!  r"  version_infobinasciir   rh   ri   r  rl   rm   r  r  r  
float_inforadixmant_digr$   r   r+   r.   encoder  r  r  r   r)   r,   r#   <module>r     s}   ( (
        'g'11 



           + + + + + + + + 3 3 3 3 3 3 3 3 ' ' ' ' ' ' 5 5 5 5 5 5 5 5 5 5  )2 1 %u333333u333333-C$ ~q   "?   
~"$$$&K$$$+. +. +.^ _
# # #JE JE JE JE JEH JE JE JEj *0099 $Q&, $Q&, 
`F `F `F `F `Fx `F `F `F `F `Fr,   