U
    ø¹ÖhÒ  ã                   @   sn  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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ôt*dƒ‚ej(j+dks
t*dƒ‚dd„ Z,e,ƒ Z-dd„ Z.G dd„ deƒZ/d 0d ¡Z1e1d dd!… Z2e1d" dd#… Z3G d$d%„ d%eƒZ4d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   sl   d} d}| d> }zt j  |d ¡j}W n tttfk
rD   Y qVY nX ||k rPqV|} q| d8 } d}t| |ƒS )z8
    helper to calc max_time_t constant (see below)
    i   @r   é   l   Ðéë )ÚdatetimeÚutcfromtimestampÚyearÚ
ValueErrorÚOSErrorÚOverflowErrorÚmin)Úvaluer   Z
next_valueZ	next_yearZmax_datetime_timestamp© r   ú=./venv/lib/python3.8/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*$Z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' paramZoneZtwo)r%   r4   r4   s   twor(   )r%   r4   ÚAr7   r"   r%   )Údefault_tags   oneÚBN)r
   r*   r8   Z
get_secretr.   ÚKeyError)r0   r1   r   r   r   Útest_default_tagÍ   s    ÿzAppWalletTest.test_default_tagNc                 C   s.   t r|o|ƒ  n|o|  t|¡ |  d¡‚d S )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&   ©rE   s
   ¯D6.F7ëQÚ3éç  )rA   N)r
   ÚPASS1ÚPASS2Údictr>   r   Údecrypt_keyr*   ÚKEY1_RAWÚKEY2_RAWÚcopyÚupdater.   r:   r   )r0   r1   ZCIPHER1ZCIPHER2ZCIPHER3Útempr   r   r   Útest_decrypt_keyô   s4     ÿ ÿ ÿ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$   r?   ©Úencrypt_costr   ZAAAAr&   r@   r   )rB   r%   rG   N)
r>   r
   rJ   rK   rL   r,   rM   rP   rQ   r-   )r0   r1   r2   rR   r   r   r   Útest_decrypt_key_needs_recrypt  s    z,AppWalletTest.test_decrypt_key_needs_recryptr%   Fc              	   C   s°   |   t|ƒtdddddgƒ¡ |   |d d¡ |   |d |¡ |   |d |j¡ |   t|d ƒt|jƒ¡ |   t|d ƒtt|ƒƒ¡ | |¡\}}|   ||¡ |   ||¡ dS )z.check encrypt_key() result has expected formatrA   rE   rB   rC   rD   r   N)r*   ÚsetrU   Úlenr    Ú	salt_sizerM   )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   rT   rF   rC   rD   é   r$   r&   )r\   é@   ó    N)r
   rJ   r>   r   Úencrypt_keyrN   r]   ÚassertNotEqualrK   rY   rO   r.   r   )r0   r1   rZ   Ú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)r>   r
   rU   r   r   ra   rN   ÚassertAlmostEqual)r0   r1   rf   Ú_Zdelta2r   r   r   Útest_encrypt_cost_timingj  s    z&AppWalletTest.test_encrypt_cost_timing)N)r%   F)Ú__name__Ú
__module__Ú__qualname__ÚdescriptionPrefixr3   r6   r;   r>   rS   rV   r]   rd   ri   r   r   r   r   r!   o   s   2% 
&  ÿ
)r!   Z12345678901234567890Úasciié    r   r_   c                       sX  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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%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)	Úsuperrp   ÚsetUpZpasslib.crypto.digestrq   Zclear_cacheZ	patchAttrÚtotp_moduleÚ	getRandom)r0   rq   ©Ú	__class__r   r   rt   ˜  s    zTotpTest.setUpc                 C   s   |   ¡  ¡ t S )zY
        helper to generate random epoch time
        :returns float: epoch time
        )rv   ZrandomÚ
max_time_t©r0   r   r   r   Úrandtime¥  s    zTotpTest.randtimeNc                 K   sf   |   ¡ }d|krd|d< | d| dd¡¡ | d| dd	d
g¡¡ | d| dd¡¡ |p^tf |ŽS )z@
        helper which generates a random TOTP instance.
        r[   TÚnewÚdigitsr^   é
   ÚalgÚsha1Úsha256Úsha512Úperiodéx   )rv   Ú
setdefaultÚrandintÚchoicer	   )r0   ÚclsÚkwdsrr   r   r   r   Úrandotp¬  s    zTotpTest.randotpc                 C   s†   |   ¡ }|   ¡ }|  |j|jd¡ tdƒD ]}|j|jkr> qR|   ¡ }q*|  d¡ tdƒD ]}|j|jkrn q‚|   ¡ }qZ|  d¡ dS )z,
        internal test -- randotp()
        zkey not randomized:r~   zdigits not randomizedzalg not randomizedN)rŠ   rb   r[   Úranger}   Zfailr   )r0   Úotp1Úotp2rh   r   r   r   Útest_randotp¸  s    


zTotpTest.test_randotpZbase32r€   é   r   )Úformatr   rƒ   r}   ZACDEFGHJKL234567r^   )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 ]Ž}| j ¡ }| |d ¡ |dd… D ]d}t|ƒdkrV|\}}}n|\}}d}t d||||¡ |f |Ž}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: )
Úpasslib.totpr	   ÚvectorsÚvector_defaultsrP   rQ   rX   Ú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	   rb   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 5 Q R X dS )z constructor -- 'size'  parameterTr€   )r|   r   é   r   ro   r‚   r_   r~   ©r|   Úsizeé   é   )r|   r¶   r   r¡   z-.*for security purposes, secret key must be.*©ÚcategoryZ
message_reZ0A0A0A0A0A0A0A0A0AÚhexN)
r*   rX   r	   r[   r.   r   ÚassertWarningListrL   r   ZPasslibSecurityWarning)r0   rh   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[   rN   Úlowerr.   ÚBase32DecodeErrorÚBase16DecodeErrorrz   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   ZSHA256zSHA-333N)r*   r	   r¿   r   r.   r   rz   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}   r^   r~   é   N)r.   r   r	   r¿   r*   r}   rz   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   rz   r   r   r   Útest_ctor_w_period”  s    zTotpTest.test_ctor_w_periodc                 C   s>   |   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   rz   r   r   r   Útest_ctor_w_label¥  s    zTotpTest.test_ctor_w_labelc                 C   s>   |   ttƒjd¡ |   ttddjd¡ | jtttdd dS )z!constructor -- 'issuer' parameterNzfoo.com©Úissuerzfoo.com:bar)r*   r	   r¿   rÒ   r.   r   rz   r   r   r   Útest_ctor_w_issuer«  s    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   rz   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   s   dS )NrÌ   r   r   r   r   r   Ú<lambda>á  r`   z+TotpTest.test_using_w_now.<locals>.<lambda>c                   S   s   dS )NrÍ   r   r   r   r   r   rÜ   ä  r`   )rŠ   ÚassertIsrØ   Ú_timer¬   rg   Únormalize_timeÚintr	   rÔ   r*   r.   r/   ZassertRaisesRegexÚAssertionError)r0   r¯   rØ   Zmsg_rer   rÖ   r   Útest_using_w_nowÈ  s    zTotpTest.test_using_w_nowc                 C   sº   |dk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123456Z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Ô   rz   r   r   r   Útest_normalize_token_class  s    z#TotpTest.test_normalize_token_classc              	      sÔ   t  ¡ }|  |¡}tdƒD ]¤}|  ¡ ‰ tˆ ƒ}|  | ˆ ¡|¡ |  | |d ¡|¡ |  | |¡|¡ tj 	ˆ ¡}|  | |¡|¡ |j
}z(t‡ fdd„ƒ|_
|  | d¡|¡ W 5 ||_
X q|  t|jd¡ dS )znormalize_time()r~   re   c                      s   ˆ S ©Nr   r   ©r¬   r   r   rÜ     r`   z.TotpTest.test_normalize_time.<locals>.<lambda>NZ1234)r	   rÔ   rŠ   r‹   r{   rà   r*   rß   r   r   rØ   Ústaticmethodr.   r/   )r0   ÚTotpFactoryr¯   rh   ZtintÚdtZ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)
rv   r	   rN   r*   r[   Zhex_keyÚ
base32_keyr¿   Z
pretty_keyr†   )r0   rr   r¯   rh   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   s   dS )Ng  àTn'ÕAr   r   r   r   r   rÜ   T  r`   z*TotpTest.test_totp_token.<locals>.<lambda>re   c                   S   s   dS )NiU¹Tr   r   r   r   r   rÜ   X  r`   i7¹TiWºTN)r¥   r	   rò   ÚgenerateÚassertIsInstancer*   r­   r×   Úexpire_timerX   r.   Ú
IndexErrorÚ__getitem__r-   rØ   Z	remainingZvalidr,   ÚassertIsNotrb   )r0   r	   rò   r¯   rZ   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                      s   ˆ S rè   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*   rb   r   r   rà   rß   rÔ   rð   r.   r   )r0   r	   r¯   rZ   r­   Z
start_timerì   r   r   ré   r   Útest_generatej  s    


zTotpTest.test_generatec                 C   sb   |   ¡ D ]T\}}}}}| |¡}| 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°   rZ   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_timerX   r.   rø   rù   r-   )r0   Úmatchr¬   r  rƒ   Úwindowrÿ   r  Z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                      s   ˆ d S ©Ni€Q r   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¯   rZ   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                      s   ˆ d S 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¯   rZ   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                      s   ˆ d S 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                      s   ˆ d S 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   sT   d|j |j|j|||f }|j||f|Ž}| 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ÿ   rZ   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   Z	exc_classr­   r¬   r¯   r  r‰   rÿ   r   r   r   ÚassertVerifyRaisesì  s    ÿÿÿzTotpTest.assertVerifyRaisesc           	      C   sZ  |   ¡ }|j}|  ¡ }| |¡j}t||d}t| jf|Ž}t| jf|Ž}|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­   rL   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|Ž}t| jf|Ž}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{   rL   r   r  r  rõ   r­   r   r  )
r0   r¯   rƒ   r¬   r  r  r.   r  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|Ž}	t| j
f|Ž}
|	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÷   rL   r   r  r  r   r  ZUsedTokenErrorr*   )r0   r¯   rƒ   r¬   Ztdatar­   r×   r÷   r  r  r.   Úerrr   r   r   Útest_match_w_reuse=  s8    
ÿ ÿ ÿ
 ÿ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 ]Z\}}}}}|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  rZ   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                      s   ˆ S rè   r   r   ré   r   r   rÜ   •  r`   z&TotpTest.test_verify.<locals>.<lambda>rÙ   r   r   r"  ©rA   Útyper[   Z332136ré   Z332155©rA   r(  z3{"v": 1, "type": "totp", "key": "otxl2f5cctbprpzx"}z,otpauth://totp/Label?secret=otxl2f5cctbprpzxN)
r¥   r	   rÔ   rL   Z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_RAWrL   ÚKEY4rÝ   r
   rÔ   rú   Úto_dictr.   r   )r0   r	   r,  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 5 Q R X |  |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_urirö   r*   r[   r-  rÏ   rÒ   r   rƒ   r}   r.   r   rÁ   r¼   rL   r   ZPasslibRuntimeWarningrð   r.  )r0   r	   r5  r¯   r   r   r   Útest_from_urià  sX    
ÿÿ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€   r^   r   ©r   r}   rƒ   r1  ú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.  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   r1  r2  ©rA   r(  r[   rÏ   rÒ   r€   r   r^   )r(  r[   r'  rI   )rA   r[   r)  zJBSWY3DPEHP@3PXPr3  r4  r   ©rA   r(  r[   r   Zsha333r   ©rA   r(  r[   r}   r7   é   rÉ   ©rA   r(  r[   rƒ   rÍ   r'   )rA   r(  r[   ÚINVALIDN)r¥   r	   Ú	from_dictrL   r.  rö   r*   r[   r-  rÏ   rÒ   r   rƒ   r}   r.   r   rÀ   rÁ   r/   )r0   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€   r^   r   r7  r   r   r'  r1  r8  )r   r}   rƒ   rÏ   rÒ   r:  )r   r}   rƒ   rÏ   )rA   r(  r[   rÏ   )r   r}   rƒ   rÒ   )rA   r(  r[   rÒ   rÑ   r   rÄ   r;  r   rÆ   r<  rÉ   rÊ   r>  N)r	   r.  r*   r/  rL   rÔ   )r0   r¯   rë   r   r   r   Útest_to_dictò  sT    
 ÿ
 ÿÿ
ÿ
ÿÿ
ÿ
ÿÿÿÿÿzTotpTest.test_to_dict)N)N)r   r   r   r)   )N)N)4rj   rk   rl   Ú__doc__rm   rt   r{   rŠ   rŽ   rL   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  r  r  r!  r$  r&  r*  r0  r6  r9  rA  rB  Ú__classcell__r   r   rw   r   rp   ‹  sº   

ú

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

þú
ú
ú°T
"
+ 
!
 ÿ
 ÿ

0)$/w=^rp   )5rC  r   Ú	functoolsr   ZloggingZ	getLoggerrj   r¨   Úsysr¬   rÞ   Zpasslibr   Zpasslib.utils.compatr   r   Zpasslib.tests.utilsr   r   r   ru   r¥   r	   r
   r   Ú__all__r/   rÁ   rÂ   Úversion_infoZbinasciir   rJ   rK   r¿   rN   rO   r  r.  r-  Ú
float_infoÚradixrá   Úmant_digr   ry   r    r!   ÚencoderD  rE  rF  rp   r   r   r   r   Ú<module>   sL    
ÿ

/  
