o
    5ÎhÒ  ã                   @   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_SUPPORTÚ
EngineTest)é   r   )ÚError)r   r   Úabcdefs    ÿÚ4AOGGDBBQSYHNTUZs
   àc!„°vÎ™s   î]Ë9‡0 DÈy/¥4&äœÂÚS3JDVB7QD2R7JPXXÚJBSWY3DPEHPK3PXPs
   Hello!Þ­¾ïé   zunexpected float_info.radixé,   z#double precision unexpectedly smallc               
   C   sh   d} d}	 | d> }zt j  |d ¡j}W n tttfy    Y n	w ||k r&n|} q| d8 } d}t| |ƒS )z8
    helper to calc max_time_t constant (see below)
    i   @r   Té   l   Ðéë )ÚdatetimeÚutcfromtimestampÚyearÚ
ValueErrorÚOSErrorÚOverflowErrorÚmin)Úvaluer   Ú
next_valueÚ	next_yearÚmax_datetime_timestamp© r!   úk/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/passlib/tests/test_totp.pyÚ_get_max_time_t8   s    óä
r#   c                 C   s   | d d d S )Né   é   é   r!   )Úraw_sizer!   r!   r"   Úto_b32_sizei   s   r(   c                   @   s`   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	d
„Zdd„ Zdd„ Z			ddd„Z
dd„ Zdd„ ZdS )ÚAppWalletTestzpasslib.totp.AppWalletc                 C   sÈ   t ƒ }|  |ji ¡ |  |j¡ dddœ}t |ƒ}|  |j|¡ |  |j¡ t dƒ}|  |j|¡ t dƒ}|  |jdddœ¡ t dƒ}|  |j|¡ |  tt d¡ |  tt d	¡ |  tt d
ddœ¡ dS )z-constructor -- 'secrets' param -- input typesó   aaaó   bbb©Ú1Ú2z
 1: aaa
# comment
 
2: bbb   z"1: aaa: bbb 
# comment
 
2: bbb   s   aaa: bbbz{"1":"aaa","2":"bbb"}é{   z[123]ÚaaaÚ N)	r
   ÚassertEqualÚ_secretsÚassertFalseÚhas_secretsÚ
assertTrueÚassertRaisesÚ	TypeErrorr   )ÚselfÚwalletÚrefr!   r!   r"   Útest_secrets_typesv   s    
z AppWalletTest.test_secrets_typesc                 C   s  ddddœ}t |ƒ}|  |j|¡ t tdƒdtdƒdtdƒdiƒ}|  |j|¡ t ddddœƒ}|  |j|¡ |  tt d	d
i¡ t ddiƒ}|  tt dd
i¡ |  tt dd
i¡ t td
ƒdddœƒ}|  |j|¡ |  tt ddi¡ |  tt ddi¡ |  tt dg i¡ dS )z9constructor -- 'secrets' param -- tag/value normalizationr*   r+   s   ccc)r-   Ú02ÚCr-   r=   r>   )r   r=   r>   )r   r0   z1-2_3.4z-abczab*$Úbbbr/   N)r
   r2   r3   r   r7   r8   r   )r9   r;   r:   r!   r!   r"   Útest_secrets_tags¨   s     zAppWalletTest.test_secrets_tagsc                 C   sÚ   t dddœƒ}|  |jd¡ |  | |j¡d¡ t ddddœƒ}|  |jd¡ |  | |j¡d	¡ t ddddœd
d}|  |jd
¡ |  | |j¡d¡ | jtt ddddœdd t ƒ }|  |jd¡ |  t|jd¡ dS )z"constructor -- 'default_tag' paramÚoneÚtwo)r-   r=   r=   s   twor0   )r-   r=   ÚArC   r*   r-   )Údefault_tags   oneÚBN)r
   r2   rD   Ú
get_secretr7   ÚKeyError)r9   r:   r!   r!   r"   Útest_default_tagÍ   s   ÿzAppWalletTest.test_default_tagNc                 C   s>   t r|o	|ƒ  d S  d S |o|  t|¡ |  d¡‚ |  d¡‚)Nz$'cryptography' package not installed)r   r7   ÚRuntimeErrorÚskipTest)r9   Úcanaryr!   r!   r"   Úrequire_aes_supportí   s   
ÿ
z!AppWalletTest.require_aes_supportc                 C   s  t ttdœƒ}tdddddd}| jt|j|ƒd |  | |¡d	 t¡ tddd
ddd}|  | |¡d	 t¡ tdddddd}|  | |¡d	 t	¡ | 
¡ }|jdd |  | |¡d	 d¡ | 
¡ }|jdd |  t|j|¡ | 
¡ }|jdd |  t|j|¡ dS )z.decrypt_key()r,   r   é   Ú6D7N7W53O7HHS37NLUFQÚMHCTEGSNPFN5CGBJr-   ©ÚvÚcÚsÚkÚt©rK   r   ÚSPZJ54Y6IPUD2BYA4C6AÚZGDXXTVQOWYLC2AUr$   ÚFCCTARTIJWE7CPQHUDKAÚ D2DRS32YESGHHINWFFCELKN7Z6NAHM4Mr.   ©rU   s
   ¯D6.F7ëQÚ3éç  )rQ   N)r
   ÚPASS1ÚPASS2ÚdictrL   r   Údecrypt_keyr2   ÚKEY1_RAWÚKEY2_RAWÚcopyÚupdater7   rG   r   )r9   r:   ÚCIPHER1ÚCIPHER2ÚCIPHER3Útempr!   r!   r"   Útest_decrypt_keyô   s.   ÿÿÿzAppWalletTest.test_decrypt_keyc                 C   s”   |   ¡  tttdœdd}tdddddd}|  | |¡d ¡ | ¡ }|jdd	 |  	| |¡d ¡ | ¡ }|jd
d |  	| |¡d ¡ dS )z$.decrypt_key() -- needs_recrypt flagr,   rM   ©Úencrypt_costr   ÚAAAAr.   rP   r$   )rR   r-   r[   N)
rL   r
   r^   r_   r`   r4   ra   rd   re   r6   )r9   r:   r;   ri   r!   r!   r"   Útest_decrypt_key_needs_recrypt  s   z,AppWalletTest.test_decrypt_key_needs_recryptr-   Fc                 C   sª   |   t|ƒtg d¢ƒ¡ |   |d d¡ |   |d |¡ |   |d |j¡ |   t|d ƒt|jƒ¡ |   t|d ƒtt|ƒƒ¡ | |¡\}}|   ||¡ |   ||¡ dS )	z.check encrypt_key() result has expected format)rQ   rU   rR   rS   rT   rQ   r   rU   rR   rS   rT   N)r2   Úsetrl   Úlenr(   Ú	salt_sizera   )r9   Úresultr:   ÚkeyÚtagÚneeds_recryptÚ
result_keyÚresult_needs_recryptr!   r!   r"   ÚassertSaneResult0  s   zAppWalletTest.assertSaneResultc                 C   s$  t dtidd}| jt|jtƒd | t¡}|  ||t¡ | t¡}|  ||t¡ |  |d |d ¡ |  |d |d ¡ t dtidd}| t¡}|  ||t¡ t ttdœƒ}| t¡}| j||td	d
 t dtiƒ}d|_	| t¡}|  ||t¡ | t
¡}|  ||t
¡ |  t|jd¡ dS )z.encrypt_key()r-   r&   rk   rV   rS   rT   é   r,   r.   )rt   é@   ó    N)r
   r^   rL   r   Úencrypt_keyrb   rx   ÚassertNotEqualr_   rq   rc   r7   r   )r9   r:   rr   ÚotherÚwallet2r!   r!   r"   Útest_encrypt_keyA  s*   





zAppWalletTest.test_encrypt_keyc                 C   s€   |   ¡  tddiƒ}| jd8  _tt|jtƒdd\}}| jd7  _tt|jtƒdd\}}| j||d |d d d	 d
S )z verify cost parameter via timingr-   r0   r   r   )Úmaxtimer   r$   ç      à?)ÚdeltaN)rL   r
   rl   r   r   r|   rb   ÚassertAlmostEqual)r9   r:   rƒ   Ú_Údelta2r!   r!   r"   Útest_encrypt_cost_timingj  s    z&AppWalletTest.test_encrypt_cost_timing©N)r-   F)Ú__name__Ú
__module__Ú__qualname__ÚdescriptionPrefixr<   r@   rH   rL   rj   rn   rx   r€   r‡   r!   r!   r!   r"   r)   o   s    2%
 &
ÿ)r)   Ú12345678901234567890Úasciié    r%   rz   c                       s\  e Zd ZdZdZ‡ fdd„Zdd„ Z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)	Úsuperr   ÚsetUpÚpasslib.crypto.digestr‘   Úclear_cacheÚ	patchAttrÚtotp_moduleÚ	getRandom)r9   r‘   ©Ú	__class__r!   r"   r”   ˜  s   zTotpTest.setUpc                 C   s   |   ¡  ¡ t S )zY
        helper to generate random epoch time
        :returns float: epoch time
        )r™   ÚrandomÚ
max_time_t©r9   r!   r!   r"   Úrandtime¥  s   zTotpTest.randtimeNc                 K   sh   |   ¡ }d|vrd|d< | d| dd¡¡ | d| g d¢¡¡ | d	| dd
¡¡ |p.tdi |¤ŽS )z@
        helper which generates a random TOTP instance.
        rs   TÚnewÚdigitsry   é
   Úalg)Úsha1Úsha256Úsha512Úperiodéx   Nr!   )r™   Ú
setdefaultÚrandintÚchoicer	   )r9   ÚclsÚkwdsr’   r!   r!   r"   Úrandotp¬  s   zTotpTest.randotpc                 C   sˆ   |   ¡ }|   ¡ }|  |j|jd¡ tdƒD ]}|j|jkr n
|   ¡ }q|  d¡ tdƒD ]}|j|jkr8 dS |   ¡ }q-|  d¡ dS )z,
        internal test -- randotp()
        zkey not randomized:r¢   zdigits not randomizedzalg not randomizedN)r®   r}   rs   Úranger¡   Úfailr£   )r9   Úotp1Úotp2r…   r!   r!   r"   Útest_randotp¸  s   


zTotpTest.test_randotpÚbase32r¤   é   r$   )Úformatr£   r§   r¡   ÚACDEFGHJKL234567ry   )rs   r¡   )é·¼6TÚ221105)é¸¼6TÚ178491)é¹¼6Tr»   )éÕ¼6Tr»   )éÖ¼6TÚ915114)r¸   Ú20221105)rº   Ú86178491)r¼   rÁ   )r½   rÁ   )r¾   Ú03915114zS3JD-VB7Q-D2R7-JPXX)i5¹TÚ000492)éS¹TÚ897212Úraw)rs   r¶   r£   )é;   Ú94287082)éÅ5:BÚ07081804)éÇ5:BÚ14050471)éÒ–IÚ89005924)é ”5wÚ69279037)ì    H/P Ú65353130r¥   )rÇ   Ú46119246)rÉ   Ú68084774)rË   Ú67062674)rÍ   Ú91819424)rÏ   Ú90698825)rÑ   Ú77737706r¦   )rÇ   Ú90693936)rÉ   Ú25091201)rË   Ú99943326)rÍ   Ú93441116)rÏ   Ú38618901)rÑ   Ú47863826r   )iî‘þSÚ727248)i.Ñ¡TÚ122419é	   é)   )rs   r¡   r§   )iÐÑ¡TÚ	662331049é<   )rs   r¶   r§   )rË   Ú19360094)rs   r¶   r£   r§   )rË   Ú40857319)rË   Ú37023009c           
   	   c   s¬    ddl m} | jD ]I}| j ¡ }| |d ¡ |dd… D ]4}t|ƒdkr,|\}}}n|\}}d}t d||||¡ |di |¤Ž}d|j	||f }	|||||	fV  qq
dS )	zv
        helper to iterate over test vectors.
        yields ``(totp, time, token, expires, prefix)`` tuples.
        r   ©r	   r   Nr   z+test vector: %r time=%r token=%r expires=%rzalg=%r time=%r token=%r: r!   )
Úpasslib.totpr	   ÚvectorsÚvector_defaultsrd   re   rp   ÚlogÚdebugr£   )
r9   r	   Úrowr­   ÚentryÚtimeÚtokenÚexpiresÚotpÚprefixr!   r!   r"   Úiter_test_vectors.  s    €

õýzTotpTest.iter_test_vectorsc                 C   sF   |   tt¡ | j ttddd tdd}tdd}|  |j|j¡ dS )zconstructor -- 'new'  parameterÚ4aoggdbbqsyhntuzT)rs   r    ©r    N)r7   r8   r	   r}   rs   )r9   ró   r²   r!   r!   r"   Útest_ctor_w_newG  s
   

zTotpTest.test_ctor_w_newc                 C   sî   |   ttdddjƒd¡ |   ttdddjƒd¡ |   ttdddjƒd¡ |   ttdd	d
jƒd	¡ |   ttddd
jƒd¡ | jttdddd | jttddd
 |  ttj	ddg¡ tddƒ}W d  ƒ dS 1 spw   Y  dS )z constructor -- 'size'  parameterTr¤   )r    r£   é   r¥   r   r¦   rz   r¢   ©r    Úsizeé   é   )r    rû   r£   rá   z-.*for security purposes, secret key must be.*©ÚcategoryÚ
message_reÚ0A0A0A0A0A0A0A0A0AÚhexN)
r2   rp   r	   rs   r7   r   ÚassertWarningListr`   r   ÚPasslibSecurityWarning)r9   r…   r!   r!   r"   Útest_ctor_w_sizeS  s   ÿ"ýzTotpTest.test_ctor_w_sizec                 C   s„   |   ttƒjt¡ |   tt ¡ ƒjt¡ |   tdƒjt¡ |  ttd¡ |   tddƒjt¡ |  ttdd¡ |   ttdƒjt¡ dS )z,constructor -- 'key' and 'format' parametersz 4aog gdbb qsyh ntuz zao!ggdbbqsyhntuzÚe01c630c2184b076ce99r  ÚX01c630c2184b076ce99rÆ   N)	r2   r	   ÚKEY1rs   rb   Úlowerr7   ÚBase32DecodeErrorÚBase16DecodeErrorrž   r!   r!   r"   Útest_ctor_w_key_and_formatk  s   z#TotpTest.test_ctor_w_key_and_formatc                 C   sB   |   ttddjd¡ |   ttddjd¡ | jtttdd dS )zconstructor -- 'alg' parameterzSHA-256©r£   r¥   ÚSHA256zSHA-333N)r2   r	   r  r£   r7   r   rž   r!   r!   r"   Útest_ctor_w_algƒ  s   zTotpTest.test_ctor_w_algc                 C   sT   | j tttdd |  ttddjd¡ |  ttddjd¡ | j tttdd dS )z!constructor -- 'digits' parameterr&   ©r¡   ry   r¢   é   N)r7   r   r	   r  r2   r¡   rž   r!   r!   r"   Útest_ctor_w_digits  s   zTotpTest.test_ctor_w_digitsc                 C   st   |   ttƒjd¡ |   ttddjd¡ | jtttdd | jtttdd | jtttdd | jtttdd dS )	z!constructor -- 'period' parameterrµ   é?   ©r§   ç      ø?Úabcr   éÿÿÿÿN)r2   r	   r  r§   r7   r8   r   rž   r!   r!   r"   Útest_ctor_w_period”  s   zTotpTest.test_ctor_w_periodc                 C   ó>   |   ttƒjd¡ |   ttddjd¡ | jtttdd dS )z constructor -- 'label' parameterNzfoo@bar)Úlabelzfoo:bar)r2   r	   r  r  r7   r   rž   r!   r!   r"   Útest_ctor_w_label¥  ó   zTotpTest.test_ctor_w_labelc                 C   r  )z!constructor -- 'issuer' parameterNzfoo.com©Úissuerzfoo.com:bar)r2   r	   r  r  r7   r   rž   r!   r!   r"   Útest_ctor_w_issuer«  r  zTotpTest.test_ctor_w_issuerc                 C   sx   |   ttƒjd¡ |   tjddtƒjd¡ | jttjdd | jttjdd | jttjdd | jttjdd dS )	zusing() -- 'period' parameterrµ   r  r  r  r  r   r  N)r2   r	   r  r§   Úusingr7   r8   r   rž   r!   r!   r"   Útest_using_w_period·  s   zTotpTest.test_using_w_periodc                    sÆ   |   ¡ }|  |jtj¡ |  | d¡tt ¡ ƒ¡ dg‰ ‡ fdd„}| j tj	|dd}|  
| d¡d¡ |  
| d¡d¡ | jttj	d	d d
}| jt|tj	dd„ d | jt|tj	dd„ d dS )zusing -- 'now' 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ð   r„   Únormalize_timeÚintr	   r   r2   r7   r8   ÚassertRaisesRegexÚAssertionError)r9   ró   r$  Úmsg_rer!   r"  r"   Útest_using_w_nowÈ  s   zTotpTest.test_using_w_nowc                 C   sº   |du r
| j dd}|  | tdƒ¡d¡ |  | d¡d¡ |  | d¡d¡ |  | d¡d¡ |  t|jd	¡ |  t|jd¡ |  tj|jd
¡ |  tj|jd¡ |  tj|jd¡ dS )z$normalize_token() -- instance methodNé   r  Ú1234567s   1234567i‡Ö iG” Ú0234567g    ‡Ö2AÚ123456Ú01234567iNa¼ )r®   r2   Únormalize_tokenr   r7   r8   r   ÚMalformedTokenError©r9   ró   r!   r!   r"   Útest_normalize_token_instanceê  s   z&TotpTest.test_normalize_token_instancec                 C   s   | j tjddd dS )z!normalize_token() -- class methodr3  r  )ró   N)r;  r	   r   rž   r!   r!   r"   Útest_normalize_token_class  s   z#TotpTest.test_normalize_token_classc              	      sØ   t  ¡ }|  |¡}tdƒD ]T}|  ¡ ‰ tˆ ƒ}|  | ˆ ¡|¡ |  | |d ¡|¡ |  | |¡|¡ tj 	ˆ ¡}|  | |¡|¡ |j
}zt‡ fdd„ƒ|_
|  | d¡|¡ W ||_
q||_
w |  t|jd¡ dS )znormalize_time()r¢   r‚   c                      ó   ˆ S rˆ   r!   r!   ©rð   r!   r"   r)    r*  z.TotpTest.test_normalize_time.<locals>.<lambda>NÚ1234)r	   r   r®   r¯   rŸ   r.  r2   r-  r   r   r$  Ústaticmethodr7   r8   )r9   ÚTotpFactoryró   r…   ÚtintÚdtÚorigr!   r>  r"   Útest_normalize_time  s    
zTotpTest.test_normalize_timec                 C   s´   |   ¡ }ttdƒ}|  |jt¡ |  |jd¡ |  |jt¡ |  | ¡ d¡ |  |jddd¡ |  |jddt¡ |  |jdd	d
¡ td| 	dd¡d}|j}|j}| ¡ }dS )z pretty_key() and .key attributesrÆ   r  z4AOG-GDBB-QSYH-NTUZú )Úsepz4AOG GDBB QSYH NTUZFr  )r¶   ze01c-630c-2184-b076-ce99Tr¢   rù   rú   N)
r™   r	   rb   r2   rs   Úhex_keyÚ
base32_keyr  Ú
pretty_keyrª   )r9   r’   ró   r…   r!   r!   r"   Útest_key_attrs&  s   
zTotpTest.test_key_attrsc                 C   sd  ddl m}m} |dƒ}| d¡}|  ||¡ |  |jd¡ |  |jd¡ |  |jd¡ |  |d¡ |  t	|ƒd	¡ |  |d d¡ |  |d
 d¡ |  
t|jd¡ |  
t|jd	¡ |  |¡ dd„ |_|  |jd¡ |  |j¡ dd„ |_|  |jd¡ |  |j¡ | d¡}|  ||¡ |  ||¡ | d¡}|  ||¡ |  ||¡ | d¡}|  ||¡ dS )zgenerate() -- TotpToken() classr   )r	   Ú	TotpTokenÚs3jdvb7qd2r7jpxxrÄ   rÅ   iµÒéT¹T)rÅ   rN  r   r   éýÿÿÿc                   S   r(  )Ng  àTn'ÕAr!   r!   r!   r!   r"   r)  T  r*  z*TotpTest.test_totp_token.<locals>.<lambda>r‚   c                   S   r(  )NiU¹Tr!   r!   r!   r!   r"   r)  X  r*  i7¹TiWºTN)ré   r	   rL  ÚgenerateÚassertIsInstancer2   rñ   r#  Úexpire_timerp   r7   Ú
IndexErrorÚ__getitem__r6   r$  Ú	remainingÚvalidr4   ÚassertIsNotr}   )r9   r	   rL  ró   rr   Úresult2Úresult3Úresult4r!   r!   r"   Útest_totp_token?  s8   






zTotpTest.test_totp_tokenc                    sð   ddl m} |dd}|  ¡ ‰ | ˆ ¡}|j}|  |t¡ |jd }|  | |d ¡j|¡ |  	| |d ¡j|¡ t
j
 ˆ ¡}|  t| |¡ƒtˆ ƒ¡ |  | |¡j|¡ |j‡ fdd„d	|jd
}|  | ¡ j|¡ |  t|jd¡ dS )z
generate()r   rè   Tr÷   rµ   é   c                      r=  rˆ   r!   r!   r>  r!   r"   r)  „  r*  z(TotpTest.test_generate.<locals>.<lambda>r%  )rs   r  N)ré   r	   rŸ   rP  rñ   rQ  r   r#  r2   r}   r   r   r.  r-  r   rI  r7   r   )r9   r	   ró   rr   rñ   Ú
start_timerC  r²   r!   r>  r"   Útest_generatej  s   


zTotpTest.test_generatec                 C   sb   |   ¡ D ]*\}}}}}| |¡}| j|j||d | j|j||j |d |r.|  |j|¡ qdS )zgenerate() -- reference vectors©ÚmsgN)rõ   rP  r2   rñ   r#  r§   rR  )r9   ró   rð   rñ   rò   rô   rr   r!   r!   r"   Ú!test_generate_w_reference_vectorsŠ  s   
€úz*TotpTest.test_generate_w_reference_vectorsr   r1   c                 C   sJ  ddl m} |  ||¡ |  |jt¡ |  |jj|¡ | j|j||d d || }|| }	| j|j|	|d d | j|j	||d d | j|j
||d d |  |j|| ¡ |	d | }
|  |j|
¡ |  |j|
| ¡ |  t|ƒd	¡ |  ||	|f¡ |  t|jd
¡ |  |d |	¡ |  |d |¡ |  t|jd	¡ |  |¡ d S )Nr   ©Ú	TotpMatchz matched time:r_  z matched counter:z expected counter:z	 skipped:r   r   rO  )ré   rc  rQ  r   r	   r2   r§   rð   r#  Úexpected_counterÚskippedÚcache_secondsrR  Ú
cache_timerp   r7   rS  rT  r6   )r9   Úmatchrð   re  r§   Úwindowr`  rc  Úexpectedr#  rR  r!   r!   r"   ÚassertTotpMatch˜  s*   zTotpTest.assertTotpMatchc                    s@   d‰ d}t j‡ fdd„dtƒ}| |ˆ ¡}| j|ˆ dd dS )	z!match() -- valid TotpMatch objecté…kÚ781501c                      ó   ˆ d S ©Ni€Q r!   r!   r>  r!   r"   r)  ½  ó    z8TotpTest.test_totp_match_w_valid_token.<locals>.<lambda>r%  r   ©rð   re  N©r	   r   ÚKEY3rh  rk  ©r9   rñ   ró   rr   r!   r>  r"   Útest_totp_match_w_valid_token¹  s
   z&TotpTest.test_totp_match_w_valid_tokenc                    sT   ddl m} d‰ d}tj‡ fdd„dtƒ}| |ˆ d ¡}| j|ˆ d d	d
 dS )z3match() -- valid TotpMatch object with future tokenr   rb  rl  rm  c                      rn  ro  r!   r!   r>  r!   r"   r)  Ç  rp  z8TotpTest.test_totp_match_w_older_token.<locals>.<lambda>r%  rµ   r   rq  N)ré   rc  r	   r   rs  rh  rk  )r9   rc  rñ   ró   rr   r!   r>  r"   Útest_totp_match_w_older_tokenÁ  s   z&TotpTest.test_totp_match_w_older_tokenc                    sH   d‰ d}t j‡ fdd„dtƒ}| |ˆ d ¡}| j|ˆ d dd d	S )
z1match() -- valid TotpMatch object with past tokenrl  rm  c                      rn  ro  r!   r!   r>  r!   r"   r)  Ï  rp  z6TotpTest.test_totp_match_w_new_token.<locals>.<lambda>r%  rµ   r  rq  Nrr  rt  r!   r>  r"   Útest_totp_match_w_new_tokenË  s
   z$TotpTest.test_totp_match_w_new_tokenc                    s<   d‰ d}t j‡ fdd„dtƒ}|  tj|j|ˆ d ¡ dS )z#match() -- invalid TotpMatch objectrl  rm  c                      rn  ro  r!   r!   r>  r!   r"   r)  ×  rp  z:TotpTest.test_totp_match_w_invalid_token.<locals>.<lambda>r%  rä   N)r	   r   rs  r7   r   ÚInvalidTokenErrorrh  )r9   rñ   ró   r!   r>  r"   Útest_totp_match_w_invalid_tokenÓ  s   z(TotpTest.test_totp_match_w_invalid_tokenc           	      K   sX   d|j |j|j|||f }|j||fi |¤Ž}| j|| |¡|j| dd¡||d dS )z,helper to test otp.match() output is correctú5key=%r alg=%r period=%r token=%r gen_time=%r time=%r:ri  rµ   )rð   r§   ri  re  r`  N)rI  r£   r§   rh  rk  r-  Úget)	r9   Úexpect_skippedrñ   rð   ró   Úgen_timer­   r`  rr   r!   r!   r"   ÚassertVerifyMatchesÞ  s   ÿ

ûzTotpTest.assertVerifyMatchesc                 K   s8   d|j |j|j|||f }| j||j||fd|i|¤ŽS )z/helper to test otp.match() throws correct errorrz  Ú__msg__)rI  r£   r§   r7   rh  )r9   Ú	exc_classrñ   rð   ró   r}  r­   r`  r!   r!   r"   ÚassertVerifyRaisesì  s   ÿÿÿzTotpTest.assertVerifyRaisesc           	      C   sb  |   ¡ }|j}|  ¡ }| |¡j}t||d}t| jfi |¤Ž}t| jfi |¤Ž}|t	j
||| dd |d||| |d |d||| d| d |d||dd |t	j
||| dd |d||| |d |d||| d| d |t	j
||d|  dd |t	j
||d|  |d |d||d|  d| d tj |¡}|d||dd |t|dƒ dS )	z)match() -- 'time' and 'window' parameters©ró   r}  r   ©ri  r   r   r  éþÿÿÿN)r®   r§   rŸ   rP  rñ   r`   r   r~  r  r   rx  r   r   r   )	r9   ró   r§   rð   rñ   ÚcommonÚassertMatchesr7   rC  r!   r!   r"   Útest_match_w_windowö  s(   
zTotpTest.test_match_w_windowc           
      C   s¼   |   ¡ }|j}|  ¡ }t||d}t| jfi |¤Ž}t| jfi |¤Ž}d| }| || ¡j}|t	j
||dd |d||d| d | || ¡j}	|t	j
|	|dd |d|	|d|d dS )zmatch() -- 'skew' parametersr‚  r   r   rƒ  rO  )ri  ÚskewN)r®   r§   rŸ   r`   r   r~  r  rP  rñ   r   rx  )
r9   ró   r§   rð   r…  r†  r7   rˆ  Úbehind_tokenÚahead_tokenr!   r!   r"   Útest_match_w_skew&  s   zTotpTest.test_match_w_skewc                 C   sø   |   ¡ }|j}|  ¡ }| |¡}|j}|j}|j}t||d}t| j	fi |¤Ž}	t| j
fi |¤Ž}
|	d||| |d |	d||| |d |d |
tj||d|  ||d |
tj||| ||d}|  |j|¡ |
tj|||dd}|  |j|¡ dS )	z0match() -- 'reuse' and 'last_counter' parametersr‚  r  rƒ  r   )Úlast_counterri  r   r   N)r®   r§   rŸ   rP  rñ   r#  rR  r`   r   r~  r  r   rx  ÚUsedTokenErrorr2   )r9   ró   r§   rð   Útdatarñ   r#  rR  r…  r†  r7   Úerrr!   r!   r"   Útest_match_w_reuse=  s2   
ÿÿÿ
ÿzTotpTest.test_match_w_reusec                 C   sl   t dƒ}|j}d}|  |d|ƒ¡ |  |d|ƒ¡ |  tj|d|¡ |  tj|d|¡ |  tj|d|¡ dS )	zmatch() -- token normalizationÚotxl2f5cctbprpzxéý6Tz    3 32-136  s   332136Ú12345Ú12345XÚ0123456N)r	   rh  r6   r7   r   r9  )r9   ró   rh  rð   r!   r!   r"   Ú test_match_w_token_normalizationf  s   z)TotpTest.test_match_w_token_normalizationc                 C   sh   |   ¡ D ]-\}}}}}|j}|||ƒ}|  |¡ | j|j||j |d | jtj|||d dd qdS )zmatch() -- reference vectorsr_  éd   r   rƒ  N)	rõ   rh  r6   r2   r#  r§   r7   r   rx  )r9   ró   rð   rñ   rò   r`  rh  rr   r!   r!   r"   Útest_match_w_reference_vectors|  s   

öz'TotpTest.test_match_w_reference_vectorsc                    sÌ   ddl m} d‰ |j‡ fdd„d}tddd	d
}| d|¡}| j|ˆ d tddd	d
}|  tj|jd|¡ tddd}|  t	|jd|¡ d}| d|¡}| j|ˆ d d}| d|¡}| j|ˆ d dS )zverify()r   rè   r’  c                      r=  rˆ   r!   r!   r>  r!   r"   r)  •  r*  z&TotpTest.test_verify.<locals>.<lambda>r%  r   r   r‘  ©rQ   Útypers   Ú332136r>  Ú332155©rQ   rš  z3{"v": 1, "type": "totp", "key": "otxl2f5cctbprpzx"}z,otpauth://totp/Label?secret=otxl2f5cctbprpzxN)
ré   r	   r   r`   Úverifyrk  r7   r   rx  r   )r9   r	   rA  Úsource1rh  Úsource1jsonÚ
source1urir!   r>  r"   Útest_verify  s    zTotpTest.test_verifyc                 C   s  ddl m} |j}|tdƒƒ}|  |jt¡ |dƒ}|  |jt¡ |tddtdƒ}|  |jt¡ |tdƒƒ}|  |jt¡ |d	ƒ}|  |jt¡ |  	||ƒ|¡ t
ƒ }|j|d
 |¡}|  ||¡ |  | ¡ | ¡ ¡ |j|d
 |¡}|  	||¡ |  t|tdƒ¡ |  t|d¡ dS )zfrom_source()r   rè   úNotpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&issuer=ExamplesN   otpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&issuer=Exampler   r   r™  z3{"v": 1, "type": "totp", "key": "JBSWY3DPEHPK3PXP"}s3   {"v": 1, "type": "totp", "key": "JBSWY3DPEHPK3PXP"})r:   Úfoos   fooN)ré   r	   Úfrom_sourcer   r2   rs   ÚKEY4_RAWr`   ÚKEY4r+  r
   r   rW  Úto_dictr7   r   )r9   r	   r¥  ró   Úwallet1r±   r²   r!   r!   r"   Útest_from_source±  s*   zTotpTest.test_from_sourcec                 C   s  ddl m} |j}|dƒ}|  ||¡ |  |jt¡ |  |jd¡ |  |jd¡ |  |j	d¡ |  |j
d¡ |  |jd¡ |d	ƒ}|  |jt¡ |  t|d
¡ |  t|d¡ |dƒ}|  |jd¡ |  |jd¡ |dƒ}|  |jd¡ |  |jd¡ |dƒ}|  |jd¡ |  |jd¡ |  t|jd¡ |dƒ}|  |j	d¡ |  t|d¡ |dƒ}|  |jd¡ |  t|d¡ |  t|d¡ |  t|d¡ |dƒ}|  |j
d¡ |  t|d¡ |  t|d¡ |  ttjd d!g¡ |d"ƒ}W d#  ƒ n1 sùw   Y  |  |jt¡ |  |j
d¡ d#S )$z
from_uri()r   rè   r£  úalice@google.comÚExampler¤   rµ   ry   zNotpauth://totp/Example:alice@google.com?secret=jbswy3dpehpk3pxp&issuer=Examplez0otpauth://totp/Example:alice@google.com?digits=6z?otpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHP@3PXPzOotpauth://totp/Provider1:Alice%20Smith?secret=JBSWY3DPEHPK3PXP&issuer=Provider1úAlice SmithÚ	Provider1zMotpauth://totp/Big%20Corporation%3A%20alice@bigco.com?secret=JBSWY3DPEHPK3PXPzalice@bigco.comzBig CorporationzOotpauth://totp/alice@bigco.com?secret=JBSWY3DPEHPK3PXP&issuer=Big%20CorporationzGotpauth://totp/Provider1:alice?secret=JBSWY3DPEHPK3PXP&issuer=Provider2zPotpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&algorithm=SHA256r¥   zPotpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&algorithm=SHA333zHotpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&digits=8r$   zHotpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&digits=AzJotpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&digits=%20zIotpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&digits=15zIotpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&period=63r  zHotpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&period=0zIotpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&period=-1z!unexpected parameters encounteredrþ   zQotpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&foo=bar&period=63N)ré   r	   Úfrom_urirQ  r2   rs   r¦  r  r  r£   r§   r¡   r7   r   r
  r  r`   r   ÚPasslibRuntimeWarningrI  r§  )r9   r	   r¯  ró   r!   r!   r"   Útest_from_urià  sZ   
ÿÿ
ýzTotpTest.test_from_uric                 C   sè   t tdddd}|  | dd¡d¡ |  t|jdd¡ |  | d¡d	¡ d|_|  | ¡ d	¡ d|_|  | ¡ d¡ |  t|jd
¡ |  t|jdd¡ |  t tdd d¡d¡ |  t tdd d¡d¡ |  t tdd d¡d¡ dS )zto_uri()r¤   ry   rµ   ©r£   r¡   r§   r«  úExample OrgzZotpauth://totp/Example%20Org:alice@google.com?secret=JBSWY3DPEHPK3PXP&issuer=Example%20OrgNz7otpauth://totp/alice@google.com?secret=JBSWY3DPEHPK3PXPzlabel:with:semicolonszissuer:with:semicolonsr¥   r  zHotpauth://totp/alice@google.com?secret=JBSWY3DPEHPK3PXP&algorithm=SHA256r$   r  z@otpauth://totp/alice@google.com?secret=JBSWY3DPEHPK3PXP&digits=8r  r  zAotpauth://totp/alice@google.com?secret=JBSWY3DPEHPK3PXP&period=63)r	   r§  r2   Úto_urir7   r   r  r  r:  r!   r!   r"   Útest_to_uriW  s6   ÿÿ
ÿ
ÿÿÿÿzTotpTest.test_to_uric              
   C   sr  ddl m} |j}|tddtdddƒ}|  ||¡ |  |jt¡ |  |j	d¡ |  |j
d¡ |  |jd¡ |  |jd	¡ |  |jd
¡ |  t|tdtd¡ |  t|tddtd¡ |  t|tddtd¡ |  t|tdtd¡ |tddt ¡ dddƒ}|  |jt¡ |  t|tddd¡ |  t|tdddd¡ |tddtdddƒ}|  |j	d¡ |  |j
d¡ |tddtddƒ}|  |jd¡ |  t|tddtdd¡ |tddtddƒ}|  |jd¡ |  t|tddtdd¡ |  t|tddtdd¡ |tddtddƒ}|  |jd¡ |  t|tddtdd¡ |  t|tddtdd¡ |  t|tddtdd¡ dS ) zfrom_dict()r   rè   r   r   r«  r¬  ©rQ   rš  rs   r  r  r¤   rµ   ry   )rš  rs   r™  r]   )rQ   rs   r  zJBSWY3DPEHP@3PXPr­  r®  r¥   ©rQ   rš  rs   r£   Úsha333r$   ©rQ   rš  rs   r¡   rC   é   r  ©rQ   rš  rs   r§   r  r/   )rQ   rš  rs   ÚINVALIDN)ré   r	   Ú	from_dictr`   r§  rQ  r2   rs   r¦  r  r  r£   r§   r¡   r7   r   r	  r
  r8   )r9   r	   r½  ró   r!   r!   r"   Útest_from_dict”  sF   ÿzTotpTest.test_from_dictc              
   C   s|  t tdddd}|  | ¡ tddtd¡ t tddddd	d
}|  | ¡ tddtdd	d¡ t tddddd}|  | ¡ tddtdd¡ t tdddd	d}|  | ¡ tddtd	d¡ t jd	d}|tƒ}|  | ¡ tddtd¡ |td	d}|  | ¡ tddtd¡ |  t tdd ¡ tddtdd¡ |  t tdd ¡ tddtdd¡ |  t tdd ¡ tddtdd¡ dS )z	to_dict()r¤   ry   rµ   r²  r   r   r™  r«  r³  )r£   r¡   r§   r  r  r¶  )r£   r¡   r§   r  )rQ   rš  rs   r  )r£   r¡   r§   r  )rQ   rš  rs   r  r  r¥   r  r·  r$   r  r¹  r  r  r»  N)r	   r§  r2   r¨  r`   r   )r9   ró   rA  r!   r!   r"   Útest_to_dictò  sP   
ÿ
ÿÿ
ÿ
ÿÿ
ÿ
ÿÿÿÿÿzTotpTest.test_to_dictrˆ   )r   rµ   rµ   r1   )4r‰   rŠ   r‹   Ú__doc__rŒ   r”   rŸ   r®   r³   r`   rë   ÚRFC_KEY_BYTES_20ÚRFC_KEY_BYTES_32ÚRFC_KEY_BYTES_64rê   rõ   rø   r  r  r  r  r  r  r  r!  r2  r;  r<  rE  rK  r[  r^  ra  rk  ru  rv  rw  ry  r~  r  r‡  r‹  r  r–  r˜  r¢  rª  r±  rµ  r¾  r¿  Ú__classcell__r!   r!   rš   r"   r   ‹  s¼    

ú

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

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