o
    _6÷dÒ  ã                   @   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s„J 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_SUPPORTZ
EngineTest)é   r   )ÚError)r   r   Zabcdefs    ÿZ4AOGGDBBQSYHNTUZs
   àc!„°vÎ™s   î]Ë9‡0 DÈy/¥4&äœÂZ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   Z
next_valueZ	next_yearZmax_datetime_timestamp© r   únC:\Users\jesus\OneDrive\Desktop\erpjis_fastapi\backend\jisbackend\Lib\site-packages\passlib/tests/test_totp.pyÚ_get_max_time_t8   s    óä
r   c                 C   s   | d d d S )Né   é   é   r   )Z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ÚassertFalseZ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%   r4   r5   )r   r4   r5   )r   r(   z1-2_3.4z-abczab*$Úbbbr'   N)r
   r*   r+   r   r.   r/   r   )r0   r2   r1   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%   r4   r4   s   twor(   )r%   r4   ÚAr:   r"   r%   )Údefault_tags   oneÚBN)r
   r*   r;   Z
get_secretr.   ÚKeyError)r0   r1   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   r.   ÚRuntimeErrorZskipTest)r0   Ú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   é   Z6D7N7W53O7HHS37NLUFQZMHCTEGSNPFN5CGBJr%   ©ÚvÚcÚsÚkÚt©r@   r   ZSPZJ54Y6IPUD2BYA4C6AZZGDXXTVQOWYLC2AUr   ZFCCTARTIJWE7CPQHUDKAZ D2DRS32YESGHHINWFFCELKN7Z6NAHM4Mr&   ©rH   s
   ¯D6.F7ëQÚ3éç  )rD   N)r
   ÚPASS1ÚPASS2ÚdictrA   r   Údecrypt_keyr*   ÚKEY1_RAWÚKEY2_RAWÚcopyÚupdater.   r=   r   )r0   r1   ZCIPHER1ZCIPHER2Z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$   rB   ©Úencrypt_costr   ZAAAAr&   rC   r   )rE   r%   rJ   N)
rA   r
   rM   rN   rO   r,   rP   rS   rT   r-   )r0   r1   r2   rU   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)rD   rH   rE   rF   rG   rD   r   rH   rE   rF   rG   N)r*   ÚsetrX   Úlenr    Ú	salt_sizerP   )r0   Úresultr1   ÚkeyÚtagZneeds_recryptZ
result_keyZ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   rW   rI   rF   rG   é   r$   r&   )r_   é@   ó    N)r
   rM   rA   r   Úencrypt_keyrQ   r`   ÚassertNotEqualrN   r\   rR   r.   r   )r0   r1   r]   ÚotherZ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%   r(   r   r   )Zmaxtimer   r   ç      à?)ÚdeltaN)rA   r
   rX   r   r   rd   rQ   ÚassertAlmostEqual)r0   r1   ri   Ú_Zdelta2r   r   r   Útest_encrypt_cost_timingj  s    z&AppWalletTest.test_encrypt_cost_timing©N)r%   F)Ú__name__Ú
__module__Ú__qualname__ÚdescriptionPrefixr3   r7   r>   rA   rV   rY   r`   rg   rl   r   r   r   r   r!   o   s    2%
 &
ÿ)r!   Z12345678901234567890Úasciié    r   rb   c                       s\  e Zd ZdZdZ‡ fdd„Zdd„ ZdŽd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dŽdZd[„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%	dŽdtdu„Z&	dŽdvdw„Z'dxdy„ Z(dzd{„ Z)d|d}„ Z*d~d„ Z+d€d„ Z,d‚dƒ„ Z-d„d…„ Z.d†d‡„ Z/dˆd‰„ Z0dŠd‹„ Z1dŒd„ 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)	Úsuperrt   ÚsetUpZpasslib.crypto.digestru   Úclear_cacheZ	patchAttrÚtotp_moduleÚ	getRandom)r0   ru   ©Ú	__class__r   r   rx   ˜  s   zTotpTest.setUpc                 C   s   |   ¡  ¡ t S )zY
        helper to generate random epoch time
        :returns float: epoch time
        )r{   ÚrandomÚ
max_time_t©r0   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.
        r^   TÚnewÚdigitsra   é
   Úalg)Úsha1Úsha256Úsha512Úperiodéx   Nr   )r{   Ú
setdefaultÚrandintÚchoicer	   )r0   ÚclsÚkwdsrv   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   re   r^   Úrangerƒ   Zfailr…   )r0   Úotp1Úotp2rk   r   r   r   Útest_randotp¸  s   


zTotpTest.test_randotpZbase32r†   é   r   )Úformatr…   r‰   rƒ   ZACDEFGHJKL234567ra   )r^   rƒ   )é·¼6TZ221105)é¸¼6TÚ178491)é¹¼6Tr™   )éÕ¼6Tr™   )éÖ¼6TZ915114)r—   Z20221105)r˜   Ú86178491)rš   r   )r›   r   )rœ   Z03915114zS3JD-VB7Q-D2R7-JPXX)i5¹TZ000492)éS¹TÚ897212Úraw)r^   r–   r…   )é;   Z94287082)éÅ5:BZ07081804)éÇ5:BZ14050471)éÒ–IZ89005924)é ”5wZ69279037)ì    H/P Z65353130r‡   )r¡   Z46119246)r¢   Z68084774)r£   Z67062674)r¤   Z91819424)r¥   Z90698825)r¦   Z77737706rˆ   )r¡   Z90693936)r¢   Z25091201)r£   Z99943326)r¤   Z93441116)r¥   Z38618901)r¦   Z47863826r   )iî‘þSZ727248)i.Ñ¡TZ122419é	   é)   )r^   rƒ   r‰   )iÐÑ¡TZ	662331049é<   )r^   r–   r‰   )r£   Z19360094)r^   r–   r…   r‰   )r£   Z40857319)r£   Z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_defaultsrS   rT   r[   ÚlogÚdebugr…   )
r0   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'  parameterZ4aoggdbbqsyhntuzT)r^   r‚   ©r‚   N)r.   r/   r	   re   r^   )r0   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‡   rs   rˆ   rb   r„   ©r‚   Úsizeé   é   )r‚   r¼   r…   r§   z-.*for security purposes, secret key must be.*©ÚcategoryZ
message_reZ0A0A0A0A0A0A0A0A0AÚhexN)
r*   r[   r	   r^   r.   r   ÚassertWarningListrO   r   ZPasslibSecurityWarning)r0   rk   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Á   ZX01c630c2184b076ce99r    N)	r*   r	   ÚKEY1r^   rQ   Úlowerr.   Ú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)r*   r	   rÅ   r…   r.   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ƒ   ra   r„   é   N)r.   r   r	   rÅ   r*   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)r*   r	   rÅ   r‰   r.   r/   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)r*   r	   rÅ   r×   r.   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)r*   r	   rÅ   rÛ   r.   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)r*   r	   rÅ   r‰   Úusingr.   r/   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' parameterNgHáz®Ç^@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²   rj   Únormalize_timeÚintr	   rÝ   r*   r.   r/   ÚassertRaisesRegexÚAssertionError)r0   rµ   rá   Z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Í   Z1234567s   1234567i‡Ö iG” Z0234567g    ‡Ö2AZ123456Ú01234567iNa¼ )r   r*   Znormalize_tokenr   r.   r/   r   ÚMalformedTokenError©r0   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 methodrï   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„   rh   c                      ó   ˆ S rm   r   r   ©r²   r   r   ræ     rç   z.TotpTest.test_normalize_time.<locals>.<lambda>NÚ1234)r	   rÝ   r   r‘   r   rë   r*   rê   r   r   rá   Ústaticmethodr.   r/   )r0   ÚTotpFactoryrµ   rk   Z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	   rQ   r*   r^   Zhex_keyÚ
base32_keyrÅ   Z
pretty_keyrŒ   )r0   rv   rµ   rk   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	   Ú	TotpTokenZs3jdvb7qd2r7jpxxrž   rŸ   iµÒéT¹T)rŸ   r  r   r   éýÿÿÿc                   S   rå   )Ng  àTn'ÕAr   r   r   r   r   ræ   T  rç   z*TotpTest.test_totp_token.<locals>.<lambda>rh   c                   S   rå   )NiU¹Tr   r   r   r   r   ræ   X  rç   i7¹TiWºTN)r«   r	   r  ÚgenerateÚassertIsInstancer*   r³   rà   Úexpire_timer[   r.   Ú
IndexErrorÚ__getitem__r-   rá   Ú	remainingZvalidr,   ÚassertIsNotre   )r0   r	   r  rµ   r]   Zresult2Zresult3Z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õ   rm   r   r   rö   r   r   ræ   „  rç   z(TotpTest.test_generate.<locals>.<lambda>râ   )r^   rÔ   N)r«   r	   r   r  r³   r  r   rà   r*   re   r   r   rë   rê   rÝ   rÿ   r.   r   )r0   r	   rµ   r]   r³   Ú
start_timerú   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·   r  r*   r³   rà   r‰   r  )r0   rµ   r²   r³   r´   r¶   r]   r   r   r   Ú!test_generate_w_reference_vectorsŠ  s   
€úz*TotpTest.test_generate_w_reference_vectorsr   r)   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   r  )r«   r  r  r   r	   r*   r‰   r²   rà   Zexpected_counterÚskippedZcache_secondsr  Z
cache_timer[   r.   r  r  r-   )r0   Úmatchr²   r  r‰   Úwindowr  r  Úexpectedrà   r  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 ©Ni€Q r   r   rö   r   r   ræ   ½  ó    z8TotpTest.test_totp_match_w_valid_token.<locals>.<lambda>râ   r   ©r²   r  N©r	   rÝ   ÚKEY3r  r  ©r0   r³   rµ   r]   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   r  r  r  c                      r  r  r   r   rö   r   r   ræ   Ç  r  z8TotpTest.test_totp_match_w_older_token.<locals>.<lambda>râ   r•   r   r  N)r«   r  r	   rÝ   r   r  r  )r0   r  r³   rµ   r]   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 tokenr  r  c                      r  r  r   r   rö   r   r   ræ   Ï  r  z6TotpTest.test_totp_match_w_new_token.<locals>.<lambda>râ   r•   rÔ   r  Nr  r!  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 objectr  r  c                      r  r  r   r   rö   r   r   ræ   ×  r  z:TotpTest.test_totp_match_w_invalid_token.<locals>.<lambda>râ   r©   N)r	   rÝ   r   r.   r   ÚInvalidTokenErrorr  )r0   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 correctú5key=%r alg=%r period=%r token=%r gen_time=%r time=%r:r  r•   )r²   r‰   r  r  r  N)rÿ   r…   r‰   r  r  rê   Úget)	r0   Zexpect_skippedr³   r²   rµ   Úgen_timer   r  r]   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 errorr'  Z__msg__)rÿ   r…   r‰   r.   r  )r0   Ú	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   ©r  r   r   rÔ   éþÿÿÿN)r   r‰   r   r  r³   rO   r   r*  r,  r   r%  r   r   r   )	r0   rµ   r‰   r²   r³   ÚcommonÚassertMatchesr.   rú   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.  r  )r  ÚskewN)r   r‰   r   rO   r   r*  r,  r  r³   r   r%  )
r0   rµ   r‰   r²   r0  r1  r.   r3  Zbehind_tokenZ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   )Zlast_counterr  r   r   N)r   r‰   r   r  r³   rà   r  rO   r   r*  r,  r   r%  ZUsedTokenErrorr*   )r0   rµ   r‰   r²   Ztdatar³   rà   r  r0  r1  r.   Ú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   332136Z12345Z12345XZ0123456N)r	   r  r-   r.   r   rñ   )r0   rµ   r  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·   r  r-   r*   rà   r‰   r.   r   r%  )r0   rµ   r²   r³   r´   r  r  r]   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ª   r8  c                      rõ   rm   r   r   rö   r   r   ræ   •  rç   z&TotpTest.test_verify.<locals>.<lambda>râ   r   r   r7  ©rD   Útyper^   Z332136rö   Z332155©rD   r=  z3{"v": 1, "type": "totp", "key": "otxl2f5cctbprpzx"}z,otpauth://totp/Label?secret=otxl2f5cctbprpzxN)
r«   r	   rÝ   rO   Úverifyr  r.   r   r%  r   )r0   r	   rù   Zsource1r  Zsource1jsonZ
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"})r1   Zfoos   fooN)r«   r	   Úfrom_sourcer   r*   r^   ÚKEY4_RAWrO   ÚKEY4rè   r
   rÝ   r
  Úto_dictr.   r   )r0   r	   rB  rµ   Z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 sùw   Y  |  |jt¡ |  |j
d¡ d#S )$z
from_uri()r   rª   rA  úalice@google.comÚExampler†   r•   ra   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_urir  r*   r^   rC  r×   rÛ   r…   r‰   rƒ   r.   r   rÇ   rÂ   rO   r   ZPasslibRuntimeWarningrÿ   rD  )r0   r	   rK  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†   ra   r•   ©r…   rƒ   r‰   rG  ú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	   rD  r*   Zto_urir.   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   rG  rH  ©rD   r=  r^   r×   rÛ   r†   r•   ra   )r=  r^   r<  rL   )rD   r^   r>  zJBSWY3DPEHP@3PXPrI  rJ  r‡   ©rD   r=  r^   r…   Zsha333r   ©rD   r=  r^   rƒ   r:   é   rÐ   ©rD   r=  r^   r‰   rÔ   r'   )rD   r=  r^   ÚINVALIDN)r«   r	   Ú	from_dictrO   rD  r  r*   r^   rC  r×   rÛ   r…   r‰   rƒ   r.   r   rÆ   rÇ   r/   )r0   r	   rV  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†   ra   r•   rM  r   r   r<  rG  rN  )r…   rƒ   r‰   r×   rÛ   rP  )r…   rƒ   r‰   r×   )rD   r=  r^   r×   )r…   rƒ   r‰   rÛ   )rD   r=  r^   rÛ   rÚ   r‡   rÊ   rQ  r   rÍ   rR  rÐ   rÑ   rT  N)r	   rD  r*   rE  rO   rÝ   )r0   rµ   rù   r   r   r   Útest_to_dictò  sP   
ÿ
ÿÿ
ÿ
ÿÿ
ÿ
ÿÿÿÿÿzTotpTest.test_to_dictrm   )r   r•   r•   r)   )4rn   ro   rp   Ú__doc__rq   rx   r   r   r”   rO   r­   ÚRFC_KEY_BYTES_20ÚRFC_KEY_BYTES_32ÚRFC_KEY_BYTES_64r¬   r·   r¹   rÃ   rÉ   rÌ   rÏ   rÕ   rØ   rÜ   rÞ   rî   ró   rô   rü   r   r  r  r  r  r"  r#  r$  r&  r*  r,  r2  r4  r6  r9  r;  r@  rF  rL  rO  rW  rX  Ú__classcell__r   r   r|   r   rt   ‹  s¼    

ú

ú

þú
ú
ú°T

"+ 
!

ÿ
ÿ
0)$/w=^rt   )4rY  r   Ú	functoolsr   ÚloggingÚ	getLoggerrn   r®   Úsysr²   ré   Zpasslibr   Zpasslib.utils.compatr   r   Zpasslib.tests.utilsr   r   r   rz   r«   r	   r
   r   Ú__all__r/   rÇ   rÈ   Úversion_infoÚbinasciir   rM   rN   rÅ   rQ   rR   r   rD  rC  Ú
float_infoÚradixÚmant_digr   r   r    r!   ÚencoderZ  r[  r\  rt   r   r   r   r   Ú<module>   sL    ÿ

/  
