U
    La                     @   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rddlmZ ejdkrd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st*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   ]90 Dy/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   ;/tmp/pip-unpacked-wheel-8v2dfbvt/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' paramZoneZtwo)r%   r4   r4   s   twor(   )r%   r4   Ar8   r"   r%   )default_tags   oneBN)r
   r*   r9   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&   rF   s
   D6.F7Q3  )rB   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&   rA   r   )rC   r%   rH   N)
r?   r
   rK   rL   rM   r,   rN   rQ   rR   r-   )r0   r1   r2   rS   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 formatrB   rF   rC   rD   rE   r   N)r*   setrV   lenr    	salt_sizerN   )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   rU   rG   rD   rE      r$   r&   )r]   @       N)r
   rK   r?   r   encrypt_keyrO   r^   assertNotEqualrL   rZ   rP   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)r?   r
   rV   r   r   rb   rO   assertAlmostEqual)r0   r1   rg   _Zdelta2r   r   r   test_encrypt_cost_timingj  s    z&AppWalletTest.test_encrypt_cost_timing)N)r%   F)__name__
__module____qualname__descriptionPrefixr3   r7   r<   r?   rT   rW   r^   re   rj   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ddd	Zd
d Ze	dddddZ
e	ddddddddge	ddddddddge	ddddd ge	ed!dd"d#d$d%d&d'd(ge	ed!d)d"d*d+d,d-d.d/ge	ed!d0d"d1d2d3d4d5d6ge	d7ddd8d9ge	d7d:d;d<d=ge	ed!d>d?d@ge	ed!d)d>dAdBge	ed!d0d>dAdCggZdDdE ZdFdG ZdHdI ZdJdK ZdLdM ZdNdO ZdPdQ ZdRdS ZdTdU ZdVdW ZdXdY ZddZd[Zd\d] Zd^d_ Zd`da Zdbdc Zddde Zdfdg Z ddjdkZ!dldm Z"dndo Z#dpdq Z$drds Z%ddtduZ&ddvdwZ'dxdy Z(dzd{ Z)d|d} Z*d~d Z+dd Z,dd Z-dd Z.dd Z/dd Z0dd Z1dd Z2  Z3S )TotpTestz3
    common code shared by TotpTest & HotpTest
    zpasslib.totp.TOTPc                    s8   t t|   ddlm} |  | td|   d S )Nr   )lookup_hashrng)	superrq   setUpZpasslib.crypto.digestrr   clear_cacheZ	patchAttrtotp_module	getRandom)r0   rr   	__class__r   r   ru     s    zTotpTest.setUpc                 C   s   |    t S )zY
        helper to generate random epoch time
        :returns float: epoch time
        )rx   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periodx   )rx   
setdefaultrandintchoicer	   )r0   clskwdsrs   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   rc   r\   ranger   Zfailr   )r0   otp1otp2ri   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)i5TZ000492)ST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   )iSZ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_defaultsrQ   rR   rY   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	   rc   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   rp   r   r`   r   r   size      )r   r   r   r   z-.*for security purposes, secret key must be.*categoryZ
message_reZ0A0A0A0A0A0A0A0A0AhexN)
r*   rY   r	   r\   r.   r   assertWarningListrM   r   ZPasslibSecurityWarning)r0   ri   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\   rO   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   r_   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' parameterNgHz^@c                      s    d  d7  <  d S )Nr   r   r   r   counterr   r   now  s    z&TotpTest.test_using_w_now.<locals>.nowr   )r   ~      r'   z)now\(\) function must return non-negativec                   S   s   dS )Nr   r   r   r   r   r   <lambda>  ra   z+TotpTest.test_using_w_now.<locals>.<lambda>c                   S   s   dS )Nr   r   r   r   r   r   r     ra   )r   assertIsr   _timer   rh   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   rf   c                      s    S Nr   r   r   r   r   r     ra   z.TotpTest.test_normalize_time.<locals>.<lambda>NZ1234)r	   r   r   r   r~   r   r*   r   r   r   r   staticmethodr.   r/   )r0   TotpFactoryr   ri   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)
rx   r	   rO   r*   r\   Zhex_key
base32_keyr   Z
pretty_keyr   )r0   rs   r   ri   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TT)r   r   r   r   c                   S   s   dS )Ng  Tn'Ar   r   r   r   r   r   T  ra   z*TotpTest.test_totp_token.<locals>.<lambda>rf   c                   S   s   dS )NiUTr   r   r   r   r   r   X  ra   i7TiWTN)r   r	   r   generateassertIsInstancer*   r   r   expire_timerY   r.   
IndexError__getitem__r-   r   	remainingZvalidr,   assertIsNotrc   )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     ra   z(TotpTest.test_generate.<locals>.<lambda>r   )r\   r   N)r   r	   r~   r   r   r   r   r   r*   rc   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_timerY   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 NiQ r   r   r   r   r   r     ra   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     ra   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     ra   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     ra   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 correct5key=%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   rM   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~   rM   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   rM   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   r.  c                      s    S r   r   r   r   r   r   r     ra   z&TotpTest.test_verify.<locals>.<lambda>r   r   r   r-  rB   typer\   Z332136r   Z332155rB   r3  z3{"v": 1, "type": "totp", "key": "otxl2f5cctbprpzx"}z,otpauth://totp/Label?secret=otxl2f5cctbprpzxN)
r   r	   r   rM   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   r2  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_RAWrM   KEY4r   r
   r   r  to_dictr.   r   )r0   r	   r8  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   r7  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\   r9  r   r   r   r   r   r.   r   r   r   rM   r   ZPasslibRuntimeWarningr   r:  )r0   r	   rA  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   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=  r>  rB   r3  r\   r   r   r   r   r_   )r3  r\   r2  rJ   )rB   r\   r4  zJBSWY3DPEHP@3PXPr?  r@  r   rB   r3  r\   r   Zsha333r   rB   r3  r\   r   r8      r   rB   r3  r\   r   r   r'   )rB   r3  r\   INVALIDN)r   r	   	from_dictrM   r:  r   r*   r\   r9  r   r   r   r   r   r.   r   r   r   r/   )r0   r	   rL  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   rC  r   r   r2  r=  rD  )r   r   r   r   r   rF  )r   r   r   r   )rB   r3  r\   r   )r   r   r   r   )rB   r3  r\   r   r   r   r   rG  r   r   rH  r   r   rJ  N)r	   r:  r*   r;  rM   r   )r0   r   r   r   r   r   test_to_dict  sT    
 
 



zTotpTest.test_to_dict)N)N)r   r   r   r)   )N)N)4rk   rl   rm   __doc__rn   ru   r~   r   r   rM   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/  r1  r6  r<  rB  rE  rM  rN  __classcell__r   r   ry   r   rq     s   





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

0)$/w=^rq   )5rO  r   	functoolsr   logging	getLoggerrk   r   sysr   r   Zpasslibr   Zpasslib.utils.compatr   r   Zpasslib.tests.utilsr   r   r   rw   r   r	   r
   r   __all__r/   r   r   version_infobinasciir   rK   rL   r   rO   rP   r  r:  r9  
float_inforadixr   mant_digr   r|   r    r!   encoderP  rQ  rR  rq   r   r   r   r   <module>   sL    


/  
