o
    Ƌi                     @   sl  d Z ddlZddlmZ ddlZe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 ZZejd
krUd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szJ dej(j*dksJ ddd Z+e+ Z,dd Z-G dd deZ.d/d Z0e0d dd! Z1e0d" dd# Z2G d$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               
   C   sh   d} d}	 | d> }zt j |d j}W n tttfy    Y n	w ||k r&n|} q| d8 } 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_timestamp r!   [/home/air/goalskill_sales/back/venv/lib/python3.10/site-packages/passlib/tests/test_totp.py_get_max_time_t8   s    
r#   c                 C   s   | d d d S )N         r!   )raw_sizer!   r!   r"   to_b32_sizei   s   r(   c                   @   s`   e Zd ZdZdd Zdd Zdd Zdd	d
Zdd Zdd Z			dddZ
dd Zdd ZdS )AppWalletTestzpasslib.totp.AppWalletc                 C   s   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refr!   r!   r"   test_secrets_typesv   s    
z AppWalletTest.test_secrets_typesc                 C   s  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 normalizationr*   r+   s   ccc)r-   02Cr-   r=   r>   )r   r=   r>   )r   r0   z1-2_3.4z-abczab*$bbbr/   N)r
   r2   r3   r   r7   r8   r   )r9   r;   r:   r!   r!   r"   test_secrets_tags   s     zAppWalletTest.test_secrets_tagsc                 C   s   t ddd}| |jd | ||jd t dddd}| |jd | ||jd	 t ddddd
d}| |jd
 | ||jd | jtt dddddd t  }| |jd | t|jd dS )z"constructor -- 'default_tag' paramonetwo)r-   r=   r=   s   twor0   )r-   r=   ArC   r*   r-   )default_tags   oneBN)r
   r2   rD   
get_secretr7   KeyError)r9   r:   r!   r!   r"   test_default_tag   s   zAppWalletTest.test_default_tagNc                 C   s>   t r|o	|  d S  d S |o| t| | d | d)Nz$'cryptography' package not installed)r   r7   RuntimeErrorskipTest)r9   canaryr!   r!   r"   require_aes_support   s   

z!AppWalletTest.require_aes_supportc                 C   s  t ttd}tdddddd}| jt|j|d | ||d	 t tddd
ddd}| ||d	 t tdddddd}| ||d	 t	 |
 }|jdd | ||d	 d |
 }|jdd | t|j| |
 }|jdd | t|j| dS )z.decrypt_key()r,   r      6D7N7W53O7HHS37NLUFQMHCTEGSNPFN5CGBJr-   vcsktrK   r   SPZJ54Y6IPUD2BYA4C6AZGDXXTVQOWYLC2AUr$   FCCTARTIJWE7CPQHUDKA D2DRS32YESGHHINWFFCELKN7Z6NAHM4Mr.   rU   s
   D6.F7Q3  )rQ   N)r
   PASS1PASS2dictrL   r   decrypt_keyr2   KEY1_RAWKEY2_RAWcopyupdater7   rG   r   )r9   r:   CIPHER1CIPHER2CIPHER3tempr!   r!   r"   test_decrypt_key   s.   zAppWalletTest.test_decrypt_keyc                 C   s   |    tttddd}tdddddd}| ||d  | }|jdd	 | 	||d  | }|jd
d | 	||d  dS )z$.decrypt_key() -- needs_recrypt flagr,   rM   encrypt_costr   AAAAr.   rP   r$   )rR   r-   r[   N)
rL   r
   r^   r_   r`   r4   ra   rd   re   r6   )r9   r:   r;   ri   r!   r!   r"   test_decrypt_key_needs_recrypt  s   z,AppWalletTest.test_decrypt_key_needs_recryptr-   Fc                 C   s   |  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)rQ   rU   rR   rS   rT   rQ   r   rU   rR   rS   rT   N)r2   setrl   lenr(   	salt_sizera   )r9   resultr:   keytagneeds_recrypt
result_keyresult_needs_recryptr!   r!   r"   assertSaneResult0  s   zAppWalletTest.assertSaneResultc                 C   s$  t dtidd}| jt|jtd |t}| ||t |t}| ||t | |d |d  | |d |d  t dtidd}|t}| ||t t ttd}|t}| j||td	d
 t dti}d|_	|t}| ||t |t
}| ||t
 | t|jd dS )z.encrypt_key()r-   r&   rk   rV   rS   rT      r,   r.   )rt   @       N)r
   r^   rL   r   encrypt_keyrb   rx   assertNotEqualr_   rq   rc   r7   r   )r9   r:   rr   otherwallet2r!   r!   r"   test_encrypt_keyA  s*   





zAppWalletTest.test_encrypt_keyc                 C   s   |    tddi}| jd8  _tt|jtdd\}}| jd7  _tt|jtdd\}}| j||d |d d d	 d
S )z verify cost parameter via timingr-   r0   r   r   )maxtimer   r$         ?)deltaN)rL   r
   rl   r   r   r|   rb   assertAlmostEqual)r9   r:   r   _delta2r!   r!   r"   test_encrypt_cost_timingj  s    z&AppWalletTest.test_encrypt_cost_timingN)r-   F)__name__
__module____qualname__descriptionPrefixr<   r@   rH   rL   rj   rn   rx   r   r   r!   r!   r!   r"   r)   o   s    2%
 &
)r)   12345678901234567890ascii    r%   rz   c                       s\  e Zd ZdZdZ fddZdd Zddd	Zd
d Ze	dddddZ
e	ddddddddge	ddddddddge	ddddd ge	ed!dd"d#d$d%d&d'd(ge	ed!d)d"d*d+d,d-d.d/ge	ed!d0d"d1d2d3d4d5d6ge	d7ddd8d9ge	d7d:d;d<d=ge	ed!d>d?d@ge	ed!d)d>dAdBge	ed!d0d>dAdCggZdDdE ZdFdG ZdHdI ZdJdK ZdLdM ZdNdO ZdPdQ ZdRdS ZdTdU ZdVdW ZdXdY ZddZd[Zd\d] Zd^d_ Zd`da Zdbdc Zddde Zdfdg Z ddjdkZ!dldm Z"dndo Z#dpdq Z$drds Z%	ddtduZ&	ddvdwZ'dxdy Z(dzd{ Z)d|d} Z*d~d Z+dd Z,dd Z-dd Z.dd Z/dd Z0dd Z1dd Z2  Z3S )TotpTestz3
    common code shared by TotpTest & HotpTest
    zpasslib.totp.TOTPc                    s8   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)r9   r   	__class__r!   r"   r     s   zTotpTest.setUpc                 C   s   |    t S )zY
        helper to generate random epoch time
        :returns float: epoch time
        )r   random
max_time_tr9   r!   r!   r"   randtime  s   zTotpTest.randtimeNc                 K   sh   |   }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.
        rs   Tnewdigitsry   
   alg)sha1sha256sha512periodx   Nr!   )r   
setdefaultrandintchoicer	   )r9   clskwdsr   r!   r!   r"   randotp  s   zTotpTest.randotpc                 C   s   |   }|   }| |j|jd tdD ]}|j|jkr n
|   }q| d tdD ]}|j|jkr8 dS |   }q-| d dS )z,
        internal test -- randotp()
        zkey not randomized:r   zdigits not randomizedzalg not randomizedN)r   r}   rs   ranger   failr   )r9   otp1otp2r   r!   r!   r"   test_randotp  s   


zTotpTest.test_randotpbase32r      r$   )formatr   r   r   ACDEFGHJKL234567ry   )rs   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)rs   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	   )   )rs   r   r   )iѡT	662331049<   )rs   r   r   )r   19360094)rs   r   r   r   )r   40857319)r   37023009c           
   	   c   s    ddl m} | jD ]I}| j }||d  |dd D ]4}t|dkr,|\}}}n|\}}d}td|||| |di |}d|j	||f }	|||||	fV  qq
d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=%r time=%r token=%r: r!   )
passlib.totpr	   vectorsvector_defaultsrd   re   rp   logdebugr   )
r9   r	   rowr   entrytimetokenexpiresotpprefixr!   r!   r"   iter_test_vectors.  s    

zTotpTest.iter_test_vectorsc                 C   sF   |  tt | j ttddd tdd}tdd}| |j|j dS )zconstructor -- 'new'  parameter4aoggdbbqsyhntuzT)rs   r   r   N)r7   r8   r	   r}   rs   )r9   r   r   r!   r!   r"   test_ctor_w_newG  s
   

zTotpTest.test_ctor_w_newc                 C   s   |  ttdddjd |  ttdddjd |  ttdddjd |  ttdd	d
jd	 |  ttddd
jd | jttdddd | jttddd
 | ttj	ddg tdd}W d   dS 1 spw   Y  dS )z constructor -- 'size'  parameterTr   )r   r      r   r   r   rz   r   r   size      )r   r   r   r   z-.*for security purposes, secret key must be.*category
message_re0A0A0A0A0A0A0A0A0AhexN)
r2   rp   r	   rs   r7   r   assertWarningListr`   r   PasslibSecurityWarning)r9   r   r!   r!   r"   test_ctor_w_sizeS  s   "zTotpTest.test_ctor_w_sizec                 C   s   |  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)	r2   r	   KEY1rs   rb   lowerr7   Base32DecodeErrorBase16DecodeErrorr   r!   r!   r"   test_ctor_w_key_and_formatk  s   z#TotpTest.test_ctor_w_key_and_formatc                 C   sB   |  ttddjd |  ttddjd | jtttdd dS )zconstructor -- 'alg' parameterzSHA-256r   r   SHA256zSHA-333N)r2   r	   r  r   r7   r   r   r!   r!   r"   test_ctor_w_alg  s   zTotpTest.test_ctor_w_algc                 C   sT   | j tttdd | ttddjd | ttddjd | j tttdd dS )z!constructor -- 'digits' parameterr&   r   ry   r      N)r7   r   r	   r  r2   r   r   r!   r!   r"   test_ctor_w_digits  s   zTotpTest.test_ctor_w_digitsc                 C   st   |  ttjd |  ttddjd | jtttdd | jtttdd | jtttdd | jtttdd dS )	z!constructor -- 'period' parameterr   ?   r         ?abcr   N)r2   r	   r  r   r7   r8   r   r   r!   r!   r"   test_ctor_w_period  s   zTotpTest.test_ctor_w_periodc                 C   >   |  ttjd |  ttddjd | jtttdd dS )z constructor -- 'label' parameterNzfoo@bar)labelzfoo:bar)r2   r	   r  r  r7   r   r   r!   r!   r"   test_ctor_w_label     zTotpTest.test_ctor_w_labelc                 C   r  )z!constructor -- 'issuer' parameterNzfoo.comissuerzfoo.com:bar)r2   r	   r  r  r7   r   r   r!   r!   r"   test_ctor_w_issuer  r  zTotpTest.test_ctor_w_issuerc                 C   sx   |  ttjd |  tjddtjd | jttjdd | jttjdd | jttjdd | jttjdd dS )	zusing() -- 'period' parameterr   r  r  r  r  r   r  N)r2   r	   r  r   usingr7   r8   r   r   r!   r!   r"   test_using_w_period  s   zTotpTest.test_using_w_periodc                    s   |   }| |jtj | |dtt  dg  fdd}| j tj	|dd}| 
|dd | 
|dd | jttj	d	d d
}| jt|tj	dd d | jt|tj	dd d dS )zusing -- 'now' parameterNgHz^@c                      s    d  d7  <  d S )Nr   r   r!   r!   counterr!   r"   now  s   z&TotpTest.test_using_w_now.<locals>.nowr$  )r   ~      r/   z)now\(\) function must return non-negativec                   S      dS )Nr  r!   r!   r!   r!   r"   <lambda>      z+TotpTest.test_using_w_now.<locals>.<lambda>c                   S   r(  )Nr  r!   r!   r!   r!   r"   r)    r*  )r   assertIsr$  _timer   r   normalize_timeintr	   r   r2   r7   r8   assertRaisesRegexAssertionError)r9   r   r$  msg_rer!   r"  r"   test_using_w_now  s   zTotpTest.test_using_w_nowc                 C   s   |du r
| j d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   r2   normalize_tokenr   r7   r8   r   MalformedTokenErrorr9   r   r!   r!   r"   test_normalize_token_instance  s   z&TotpTest.test_normalize_token_instancec                 C   s   | j tjddd dS )z!normalize_token() -- class methodr3  r  )r   N)r;  r	   r   r   r!   r!   r"   test_normalize_token_class  s   z#TotpTest.test_normalize_token_classc              	      s   t  }| |}tdD ]T}|   t }| | | | ||d | | ||| tj	 }| ||| |j
}zt fdd|_
| |d| W ||_
q||_
w | t|jd dS )znormalize_time()r   r   c                          S r   r!   r!   r   r!   r"   r)    r*  z.TotpTest.test_normalize_time.<locals>.<lambda>N1234)r	   r   r   r   r   r.  r2   r-  r   r   r$  staticmethodr7   r8   )r9   TotpFactoryr   r   tintdtorigr!   r>  r"   test_normalize_time  s    
zTotpTest.test_normalize_timec                 C   s   |   }ttd}| |jt | |jd | |jt | | d | |jddd | |jddt | |jdd	d
 td|	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	   rb   r2   rs   hex_key
base32_keyr  
pretty_keyr   )r9   r   r   r   r!   r!   r"   test_key_attrs&  s   
zTotpTest.test_key_attrsc                 C   sd  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d |_| |jd | |j dd |_| |jd | |j |d}| || | || |d}| || | || |d}| || dS )zgenerate() -- TotpToken() classr   )r	   	TotpTokens3jdvb7qd2r7jpxxr   r   iTT)r   rN  r   r   c                   S   r(  )Ng  Tn'Ar!   r!   r!   r!   r"   r)  T  r*  z*TotpTest.test_totp_token.<locals>.<lambda>r   c                   S   r(  )NiUTr!   r!   r!   r!   r"   r)  X  r*  i7TiWTN)r   r	   rL  generateassertIsInstancer2   r   r#  expire_timerp   r7   
IndexError__getitem__r6   r$  	remainingvalidr4   assertIsNotr}   )r9   r	   rL  r   rr   result2result3result4r!   r!   r"   test_totp_token?  s8   






zTotpTest.test_totp_tokenc                    s   ddl m} |dd}|   | }|j}| |t |jd }| ||d j| | 	||d j| t
j
 }| t||t  | ||j| |j fddd	|jd
}| | j| | t|jd dS )z
generate()r   r   Tr   r      c                      r=  r   r!   r!   r>  r!   r"   r)    r*  z(TotpTest.test_generate.<locals>.<lambda>r%  )rs   r  N)r   r	   r   rP  r   rQ  r   r#  r2   r}   r   r   r.  r-  r   rI  r7   r   )r9   r	   r   rr   r   
start_timerC  r   r!   r>  r"   test_generatej  s   


zTotpTest.test_generatec                 C   sb   |   D ]*\}}}}}||}| j|j||d | j|j||j |d |r.| |j| qdS )zgenerate() -- reference vectorsmsgN)r   rP  r2   r   r#  r   rR  )r9   r   r   r   r   r   rr   r!   r!   r"   !test_generate_w_reference_vectors  s   
z*TotpTest.test_generate_w_reference_vectorsr   r1   c                 C   sJ  ddl m} | || | |jt | |jj| | j|j||d d || }|| }	| j|j|	|d d | j|j	||d d | j|j
||d d | |j||  |	d | }
| |j|
 | |j|
|  | 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   rO  )r   rc  rQ  r   r	   r2   r   r   r#  expected_counterskippedcache_secondsrR  
cache_timerp   r7   rS  rT  r6   )r9   matchr   re  r   windowr`  rc  expectedr#  rR  r!   r!   r"   assertTotpMatch  s*   zTotpTest.assertTotpMatchc                    s@   d d}t j fdddt}|| }| j| dd dS )	z!match() -- valid TotpMatch objectk781501c                          d S NiQ r!   r!   r>  r!   r"   r)        z8TotpTest.test_totp_match_w_valid_token.<locals>.<lambda>r%  r   r   re  Nr	   r   KEY3rh  rk  r9   r   r   rr   r!   r>  r"   test_totp_match_w_valid_token  s
   z&TotpTest.test_totp_match_w_valid_tokenc                    sT   ddl m} d d}tj fdddt}|| d }| j| d d	d
 dS )z3match() -- valid TotpMatch object with future tokenr   rb  rl  rm  c                      rn  ro  r!   r!   r>  r!   r"   r)    rp  z8TotpTest.test_totp_match_w_older_token.<locals>.<lambda>r%  r   r   rq  N)r   rc  r	   r   rs  rh  rk  )r9   rc  r   r   rr   r!   r>  r"   test_totp_match_w_older_token  s   z&TotpTest.test_totp_match_w_older_tokenc                    sH   d d}t j fdddt}|| d }| j| d dd d	S )
z1match() -- valid TotpMatch object with past tokenrl  rm  c                      rn  ro  r!   r!   r>  r!   r"   r)    rp  z6TotpTest.test_totp_match_w_new_token.<locals>.<lambda>r%  r   r  rq  Nrr  rt  r!   r>  r"   test_totp_match_w_new_token  s
   z$TotpTest.test_totp_match_w_new_tokenc                    s<   d d}t j fdddt}| tj|j| d  dS )z#match() -- invalid TotpMatch objectrl  rm  c                      rn  ro  r!   r!   r>  r!   r"   r)    rp  z:TotpTest.test_totp_match_w_invalid_token.<locals>.<lambda>r%  r   N)r	   r   rs  r7   r   InvalidTokenErrorrh  )r9   r   r   r!   r>  r"   test_totp_match_w_invalid_token  s   z(TotpTest.test_totp_match_w_invalid_tokenc           	      K   sX   d|j |j|j|||f }|j||fi |}| j||||j|dd||d dS )z,helper to test otp.match() output is correct5key=%r alg=%r period=%r token=%r gen_time=%r time=%r:ri  r   )r   r   ri  re  r`  N)rI  r   r   rh  rk  r-  get)	r9   expect_skippedr   r   r   gen_timer   r`  rr   r!   r!   r"   assertVerifyMatches  s   

zTotpTest.assertVerifyMatchesc                 K   s8   d|j |j|j|||f }| j||j||fd|i|S )z/helper to test otp.match() throws correct errorrz  __msg__)rI  r   r   r7   rh  )r9   	exc_classr   r   r   r}  r   r`  r!   r!   r"   assertVerifyRaises  s   zTotpTest.assertVerifyRaisesc           	      C   sb  |   }|j}|  }||j}t||d}t| jfi |}t| jfi |}|t	j
||| dd |d||| |d |d||| d| d |d||dd |t	j
||| dd |d||| |d |d||| d| d |t	j
||d|  dd |t	j
||d|  |d |d||d|  d| d tj|}|d||dd |t|d dS )	z)match() -- 'time' and 'window' parametersr   r}  r   ri  r   r   r  N)r   r   r   rP  r   r`   r   r~  r  r   rx  r   r   r   )	r9   r   r   r   r   commonassertMatchesr7   rC  r!   r!   r"   test_match_w_window  s(   
zTotpTest.test_match_w_windowc           
      C   s   |   }|j}|  }t||d}t| jfi |}t| jfi |}d| }||| j}|t	j
||dd |d||d| d ||| j}	|t	j
|	|dd |d|	|d|d dS )zmatch() -- 'skew' parametersr  r   r   r  rO  )ri  skewN)r   r   r   r`   r   r~  r  rP  r   r   rx  )
r9   r   r   r   r  r  r7   r  behind_tokenahead_tokenr!   r!   r"   test_match_w_skew&  s   zTotpTest.test_match_w_skewc                 C   s   |   }|j}|  }||}|j}|j}|j}t||d}t| j	fi |}	t| j
fi |}
|	d||| |d |	d||| |d |d |
tj||d|  ||d |
tj||| ||d}| |j| |
tj|||dd}| |j| dS )	z0match() -- 'reuse' and 'last_counter' parametersr  r  r  r   )last_counterri  r   r   N)r   r   r   rP  r   r#  rR  r`   r   r~  r  r   rx  UsedTokenErrorr2   )r9   r   r   r   tdatar   r#  rR  r  r  r7   errr!   r!   r"   test_match_w_reuse=  s2   

zTotpTest.test_match_w_reusec                 C   sl   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	   rh  r6   r7   r   r9  )r9   r   rh  r   r!   r!   r"    test_match_w_token_normalizationf  s   z)TotpTest.test_match_w_token_normalizationc                 C   sh   |   D ]-\}}}}}|j}|||}| | | j|j||j |d | jtj|||d dd qdS )zmatch() -- reference vectorsr_  d   r   r  N)	r   rh  r6   r2   r#  r   r7   r   rx  )r9   r   r   r   r   r`  rh  rr   r!   r!   r"   test_match_w_reference_vectors|  s   

z'TotpTest.test_match_w_reference_vectorsc                    s   ddl m} d |j fddd}tddd	d
}|d|}| j| d tddd	d
}| tj|jd| tddd}| t	|jd| d}|d|}| j| d d}|d|}| j| d dS )zverify()r   r   r  c                      r=  r   r!   r!   r>  r!   r"   r)    r*  z&TotpTest.test_verify.<locals>.<lambda>r%  r   r   r  rQ   typers   332136r>  332155rQ   r  z3{"v": 1, "type": "totp", "key": "otxl2f5cctbprpzx"}z,otpauth://totp/Label?secret=otxl2f5cctbprpzxN)
r   r	   r   r`   verifyrk  r7   r   rx  r   )r9   r	   rA  source1rh  source1json
source1urir!   r>  r"   test_verify  s    zTotpTest.test_verifyc                 C   s  ddl m} |j}|td}| |jt |d}| |jt |tddtd}| |jt |td}| |jt |d	}| |jt | 	||| t
 }|j|d
|}| || | | |  |j|d
|}| 	|| | 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   r2   rs   KEY4_RAWr`   KEY4r+  r
   r   rW  to_dictr7   r   )r9   r	   r  r   wallet1r   r   r!   r!   r"   test_from_source  s*   zTotpTest.test_from_sourcec                 C   s  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 d!g |d"}W d#   n1 sw   Y  | |jt | |j
d d#S )$z
from_uri()r   r   r  alice@google.comExampler   r   ry   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_urirQ  r2   rs   r  r  r  r   r   r   r7   r   r
  r  r`   r   PasslibRuntimeWarningrI  r  )r9   r	   r  r   r!   r!   r"   test_from_uri  sZ   

zTotpTest.test_from_uric                 C   s   t td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d | t tdddd | t tdddd dS )zto_uri()r   ry   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  r2   to_urir7   r   r  r  r:  r!   r!   r"   test_to_uriW  s6   

zTotpTest.test_to_uric              
   C   sr  ddl m} |j}|tddtddd}| || | |jt | |j	d | |j
d | |jd | |jd	 | |jd
 | t|tdtd | t|tddtd | t|tddtd | t|tdtd |tddt ddd}| |jt | t|tddd | t|tdddd |tddtddd}| |j	d | |j
d |tddtdd}| |jd | t|tddtdd |tddtdd}| |jd | t|tddtdd | t|tddtdd |tddtdd}| |jd | t|tddtdd | t|tddtdd | t|tddtdd dS ) zfrom_dict()r   r   r   r   r  r  rQ   r  rs   r  r  r   r   ry   )r  rs   r  r]   )rQ   rs   r  zJBSWY3DPEHP@3PXPr  r  r   rQ   r  rs   r   sha333r$   rQ   r  rs   r   rC      r  rQ   r  rs   r   r  r/   )rQ   r  rs   INVALIDN)r   r	   	from_dictr`   r  rQ  r2   rs   r  r  r  r   r   r   r7   r   r	  r
  r8   )r9   r	   r  r   r!   r!   r"   test_from_dict  sF   zTotpTest.test_from_dictc              
   C   s|  t tdddd}| | tddtd t tddddd	d
}| | tddtdd	d t tddddd}| | tddtdd t tdddd	d}| | tddtd	d t jd	d}|t}| | tddtd |td	d}| | tddtd | t tdd tddtdd | t tdd tddtdd | t tdd tddtdd dS )z	to_dict()r   ry   r   r  r   r   r  r  r  )r   r   r   r  r  r  )r   r   r   r  )rQ   r  rs   r  )r   r   r   r  )rQ   r  rs   r  r  r   r  r  r$   r  r  r  r  r  N)r	   r  r2   r  r`   r   )r9   r   rA  r!   r!   r"   test_to_dict  sP   





zTotpTest.test_to_dictr   )r   r   r   r1   )4r   r   r   __doc__r   r   r   r   r   r`   r   RFC_KEY_BYTES_20RFC_KEY_BYTES_32RFC_KEY_BYTES_64r   r   r   r  r  r  r  r  r  r  r!  r2  r;  r<  rE  rK  r[  r^  ra  rk  ru  rv  rw  ry  r~  r  r  r  r  r  r  r  r  r  r  r  r  __classcell__r!   r!   r   r"   r     s    







T

"+ 
!



0)$/w=^r   )4r  r   	functoolsr   logging	getLoggerr   r   sysr   r,  passlibr   passlib.utils.compatr   r   passlib.tests.utilsr   r   r   r   r   r	   r
   r   __all__r8   r
  r  version_infobinasciir   r^   r_   r  rb   rc   rs  r  r  
float_inforadixmant_digr#   r   r(   r)   encoder  r  r  r   r!   r!   r!   r"   <module>   sL    

/  
