U
    #°iÒ  ã                   @   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   ú_/var/www/html/me.goteku.com/backend/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*$Ú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|ƒ  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&   ©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ô   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$   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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 formatrD   rH   rE   rF   rG   r   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                       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)	Úsuperrs   ÚsetUpZpasslib.crypto.digestrt   Úclear_cacheZ	patchAttrÚtotp_moduleÚ	getRandom)r0   rt   ©Ú	__class__r   r   rw   ˜  s    zTotpTest.setUpc                 C   s   |   ¡  ¡ t S )zY
        helper to generate random epoch time
        :returns float: epoch time
        )rz   Ú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Údigitsra   é
   ÚalgÚsha1Úsha256Úsha512Úperiodéx   )rz   Ú
setdefaultÚrandintÚchoicer	   )r0   ÚclsÚkwdsru   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   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 ]Ž}| 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_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 5 Q R X dS )z constructor -- 'size'  parameterTr…   )r   r„   é   r†   rr   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   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   r   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   r   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   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   s   dS )NrÒ   r   r   r   r   r   Ú<lambda>á  rc   z+TotpTest.test_using_w_now.<locals>.<lambda>c                   S   s   dS )NrÓ   r   r   r   r   r   râ   ä  rc   )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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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ˆ ƒ}|  | ˆ ¡|¡ |  | |d ¡|¡ |  | |¡|¡ tj 	ˆ ¡}|  | |¡|¡ |j
}z(t‡ fdd„ƒ|_
|  | d¡|¡ W 5 ||_
X q|  t|jd¡ dS )znormalize_time()rƒ   rh   c                      s   ˆ S ©Nr   r   ©r±   r   r   râ     rc   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)
rz   r	   rQ   r*   r^   Zhex_keyÚ
base32_keyrÄ   Z
pretty_keyr‹   )r0   ru   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   s   dS )Ng  àTn'ÕAr   r   r   r   r   râ   T  rc   z*TotpTest.test_totp_token.<locals>.<lambda>rh   c                   S   s   dS )NiU¹Tr   r   r   r   r   râ   X  rc   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                      s   ˆ S rð   r   r   rñ   r   r   râ   „  rc   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 ]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µ   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                      s   ˆ d S ©Ni€Q r   r   rñ   r   r   râ   ½  rc   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                      s   ˆ d S r  r   r   rñ   r   r   râ   Ç  rc   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                      s   ˆ d S r  r   r   rñ   r   r   râ   Ï  rc   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â   ×  rc   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  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   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²   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|Ž}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€   rO   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  rO   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  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©   r1  c                      s   ˆ S rð   r   r   rñ   r   r   râ   •  rc   z&TotpTest.test_verify.<locals>.<lambda>rß   r   r   r0  ©rD   Útyper^   Z332136rñ   Z332155©rD   r6  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   r5  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	   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”   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^   r<  rÕ   rØ   r„   rˆ   r‚   r.   r   rÆ   rÁ   rO   r   ZPasslibRuntimeWarningrú   r=  )r0   r	   rD  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…   ra   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=  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   r@  rA  ©rD   r6  r^   rÕ   rØ   r…   r”   ra   )r6  r^   r5  rL   )rD   r^   r7  zJBSWY3DPEHP@3PXPrB  rC  r†   ©rD   r6  r^   r„   Zsha333r   ©rD   r6  r^   r‚   r:   é   rÏ   ©rD   r6  r^   rˆ   rÓ   r'   )rD   r6  r^   ÚINVALIDN)rª   r	   Ú	from_dictrO   r=  r   r*   r^   r<  rÕ   rØ   r„   rˆ   r‚   r.   r   rÅ   rÆ   r/   )r0   r	   rO  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”   rF  r   r   r5  r@  rG  )r„   r‚   rˆ   rÕ   rØ   rI  )r„   r‚   rˆ   rÕ   )rD   r6  r^   rÕ   )r„   r‚   rˆ   rØ   )rD   r6  r^   rØ   r×   r†   rÉ   rJ  r   rÌ   rK  rÏ   rÐ   rM  N)r	   r=  r*   r>  rO   rÚ   )r0   r´   rô   r   r   r   Útest_to_dictò  sT    
 ÿ
 ÿÿ
ÿ
ÿÿ
ÿ
ÿÿÿÿÿzTotpTest.test_to_dict)N)N)r   r”   r”   r)   )N)N)4rm   rn   ro   Ú__doc__rp   rw   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%  r+  r-  r/  r2  r4  r9  r?  rE  rH  rP  rQ  Ú__classcell__r   r   r{   r   rs   ‹  sº   

ú

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

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

0)$/w=^rs   )5rR  r   Ú	functoolsr   ÚloggingÚ	getLoggerrm   r­   Úsysr±   rä   Zpasslibr   Zpasslib.utils.compatr   r   Zpasslib.tests.utilsr   r   r   ry   rª   r	   r
   r   Ú__all__r/   rÆ   rÇ   Úversion_infoÚbinasciir   rM   rN   rÄ   rQ   rR   r  r=  r<  Ú
float_infoÚradixrè   Úmant_digr   r~   r    r!   ÚencoderS  rT  rU  rs   r   r   r   r   Ú<module>   sL    
ÿ

/  
