a fŸWcÒã@sDdZddlZddlmZddlZe e¡ZddlZddl Z ddl m Z ddl mZmZddlmZmZddl mZddlmZmZmZd gZeZZejd krªdd lmZejd krÀdd lmZd Z dZ!dZ"dZ#dZ$dZ%dZ&dZ'dd„Z(e(ƒZ)dd„Z*Gdd„deƒZ+d ,d¡Z-e-ddd…Z.e-ddd …Z/Gd!d"„d"eƒZ0dS)#z"passlib.tests -- test passlib.totpéN)Úpartial)Úexc)ÚunicodeÚu)ÚTestCaseÚ time_call)Útotp)ÚTOTPÚ AppWalletÚ AES_SUPPORTZ EngineTest)ér)ÚError)r r ZabcdefsÿZ4AOGGDBBQSYHNTUZs àc !„°vΙsî]Ë9‡0 DÈy/¥4&äœÂZS3JDVB7QD2R7JPXXÚJBSWY3DPEHPK3PXPs Hello!Þ­¾ïc Csjd}d}|d>}ztj |d¡j}WntttfyBYqTYn0||krNqT|}q|d8}d}t||ƒS)z8 helper to calc max_time_t constant (see below) i@rélÐéë)ÚdatetimeÚutcfromtimestampÚyearÚ ValueErrorÚOSErrorÚ OverflowErrorÚmin)ÚvaluerZ next_valueZ next_yearZmax_datetime_timestamp©rú;/usr/lib/python3.9/site-packages/passlib/tests/test_totp.pyÚ_get_max_time_t8s rcCs|dddS)Nééér)Zraw_sizerrrÚ to_b32_sizeisrc@s\eZdZdZdd„Zdd„Zdd„Zdd d „Zd d „Zd d„Z ddd„Z dd„Z dd„Z dS)Ú AppWalletTestzpasslib.totp.AppWalletcCsÈtƒ}| |ji¡| |j¡dddœ}t|ƒ}| |j|¡| |j¡tdƒ}| |j|¡tdƒ}| |jdddœ¡tdƒ}| |j|¡| ttd¡| ttd ¡| ttd 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 saaa: bbbz{"1":"aaa","2":"bbb"}é{z[123]ÚaaaÚN) r Ú assertEqualÚ_secretsÚ assertFalseZ has_secretsÚ assertTrueÚ assertRaisesÚ TypeErrorr)ÚselfÚwalletÚrefrrrÚtest_secrets_typesvs    z AppWalletTest.test_secrets_typescCs ddddœ}t|ƒ}| |j|¡ttdƒdtdƒdtdƒdiƒ}| |j|¡tddddœƒ}| |j|¡| ttd d i¡td diƒ}| ttd d i¡| ttd d i¡ttd ƒdddœƒ}| |j|¡| ttddi¡| ttddi¡| ttdgi¡dS)z9constructor -- 'secrets' param -- tag/value normalizationr r!sccc)r#Ú02ÚCr#r2r3)rr2r3)rr&z1-2_3.4z-abczab*$Zbbbr%N)r r(r)rr,r-r)r.r0r/rrrÚtest_secrets_tags¨s    zAppWalletTest.test_secrets_tagscCsÚtdddœƒ}| |jd¡| | |j¡d¡tddddœƒ}| |jd¡| | |j¡d ¡tddddœd d }| |jd ¡| | |j¡d ¡|jttddddœd d tƒ}| |jd¡| t|jd¡dS)z"constructor -- 'default_tag' paramZoneZtwo)r#r2r2stwor&)r#r2ÚAr5r r#)Ú default_tagsoneÚBN)r r(r6Z get_secretr,ÚKeyError)r.r/rrrÚtest_default_tagÍsÿzAppWalletTest.test_default_tagNcCs.tr|o |ƒn|o| t|¡| d¡‚dS)Nz$'cryptography' package not installed)r r,Ú RuntimeErrorZskipTest)r.ÚcanaryrrrÚrequire_aes_supportís z!AppWalletTest.require_aes_supportcCstttdœƒ}tdddddd}|jt|j|ƒd| | |¡d t¡tddd d dd}| | |¡d t¡tdd d ddd}| | |¡d t ¡|  ¡}|j dd| | |¡d d¡|  ¡}|j dd|  t |j|¡|  ¡}|j dd|  t|j|¡dS)z.decrypt_key()r"ré Z6D7N7W53O7HHS37NLUFQZMHCTEGSNPFN5CGBJr#©ÚvÚcÚsÚkÚt©r;rZSPZJ54Y6IPUD2BYA4C6AZZGDXXTVQOWYLC2AUrZFCCTARTIJWE7CPQHUDKAZ D2DRS32YESGHHINWFFCELKN7Z6NAHM4Mr$©rCs ¯D6.F7ëQÚ3éç)r?N)r ÚPASS1ÚPASS2Údictr<rÚ decrypt_keyr(ÚKEY1_RAWÚKEY2_RAWÚcopyÚupdater,r8r)r.r/ZCIPHER1ZCIPHER2ZCIPHER3ÚtemprrrÚtest_decrypt_keyôs.ÿÿÿ   zAppWalletTest.test_decrypt_keycCs”| ¡tttdœdd}tdddddd}| | |¡d¡| ¡}|jdd |  | |¡d¡| ¡}|jd d |  | |¡d¡d S) z$.decrypt_key() -- needs_recrypt flagr"r=©Ú encrypt_costrZAAAAr$r>r)r@r#rEN) r<r rHrIrJr*rKrNrOr+)r.r/r0rPrrrÚtest_decrypt_key_needs_recrypts  z,AppWalletTest.test_decrypt_key_needs_recryptr#FcCsª| t|ƒtgd¢ƒ¡| |dd¡| |d|¡| |d|j¡| t|dƒt|jƒ¡| t|dƒtt|ƒƒ¡| |¡\}}| ||¡| ||¡dS) z.check encrypt_key() result has expected format)r?rCr@rArBr?rrCr@rArBN)r(ÚsetrSÚlenrÚ salt_sizerK)r.Úresultr/ÚkeyÚtagZ needs_recryptZ result_keyZresult_needs_recryptrrrÚassertSaneResult0s zAppWalletTest.assertSaneResultcCs$tdtidd}|jt|jtƒd| t¡}| ||t¡| t¡}| ||t¡| |d|d¡| |d|d¡tdtidd}| t¡}| ||t¡tttdœƒ}| t¡}|j||td d tdtiƒ}d |_ | t¡}| ||t¡| t ¡}| ||t ¡|  t |jd ¡d S)z.encrypt_key()r#rrRrDrArBér"r$)rZé@óN) r rHr<rÚ encrypt_keyrLr[ÚassertNotEqualrIrWrMr,r)r.r/rXÚotherZwallet2rrrÚtest_encrypt_keyAs*       zAppWalletTest.test_encrypt_keycCs€| ¡tddiƒ}|jd8_tt|jtƒdd\}}|jd7_tt|jtƒdd\}}|j||d|ddd d S) z verify cost parameter via timingr#r&ér)Zmaxtimer rçà?)ÚdeltaN)r<r rSrrr_rLÚassertAlmostEqual)r.r/reÚ_Zdelta2rrrÚtest_encrypt_cost_timingjs z&AppWalletTest.test_encrypt_cost_timing)N)r#F) Ú__name__Ú __module__Ú __qualname__ÚdescriptionPrefixr1r4r9r<rQrTr[rbrhrrrrros2% &ÿ )rZ12345678901234567890Úasciircé rr]csXeZdZdZdZ‡fdd„Zdd„ZdŽdd „Zd d „Ze d d dddZ e ddddddddge ddddddddge ddddd ge e d!d d"d#d$d%d&d'd(ge e d!d)d"d*d+d,d-d.d/ge e d!d0d"d1d2d3d4d5d6ge d7ddd8d9ge d7d:d;d<d=ge e d!d>d?d@ge e d!d)d>dAdBge e d!d0d>dAdCgg ZdDdE„ZdFdG„ZdHdI„ZdJdK„ZdLdM„ZdNdO„ZdPdQ„ZdRdS„ZdTdU„ZdVdW„ZdXdY„ZddZd[„Zd\d]„Zd^d_„Zd`da„Zdbdc„Zddde„Zdfdg„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 zpasslib.totp.TOTPcs8tt|ƒ ¡ddlm}| ¡| td| ¡¡dS)Nr)Ú lookup_hashÚrng) ÚsuperroÚsetUpZpasslib.crypto.digestrpÚ clear_cacheZ patchAttrÚ totp_moduleÚ getRandom)r.rp©Ú __class__rrrs˜s zTotpTest.setUpcCs| ¡ ¡tS)zY helper to generate random epoch time :returns float: epoch time )rvZrandomÚ max_time_t©r.rrrÚrandtime¥szTotpTest.randtimeNcKsh| ¡}d|vrd|d<| d| dd¡¡| d| gd¢¡¡| d | dd ¡¡|p\tfi|¤ŽS) z@ helper which generates a random TOTP instance. rYTÚnewÚdigitsr\é Úalg)Úsha1Úsha256Úsha512Úperiodéx)rvÚ setdefaultÚrandintÚchoicer )r.ÚclsÚkwdsrqrrrÚrandotp¬szTotpTest.randotpcCs†| ¡}| ¡}| |j|jd¡tdƒD]}|j|jkr>qR| ¡}q*| d¡tdƒD]}|j|jkrnq‚| ¡}qZ| d¡dS)z, internal test -- randotp() zkey not randomized:r~zdigits not randomizedzalg not randomizedN)rŠr`rYÚranger}Zfailr)r.Úotp1Úotp2rgrrrÚ test_randotp¸s       zTotpTest.test_randotpZbase32r€ér)Úformatrrƒr}ZACDEFGHJKL234567r\)rYr})é·¼6TZ221105)鸼6TÚ178491)é¹¼6Tr“)éÕ¼6Tr“)éÖ¼6TZ915114)r‘Z20221105)r’Ú86178491)r”r—)r•r—)r–Z03915114zS3JD-VB7Q-D2R7-JPXX)i5¹TZ000492)éS¹TÚ897212Úraw)rYrr)é;Z94287082)éÅ5:BZ07081804)éÇ5:BZ14050471)éÒ–IZ89005924)é”5wZ69279037)ìH/PZ65353130r)r›Z46119246)rœZ68084774)rZ67062674)ržZ91819424)rŸZ90698825)r Z77737706r‚)r›Z90693936)rœZ25091201)rZ99943326)ržZ93441116)rŸZ38618901)r Z47863826r)iî‘þSZ727248)i.Ñ¡TZ122419é é))rYr}rƒ)iÐÑ¡TZ 662331049é<)rYrrƒ)rZ19360094)rYrrrƒ)rZ40857319)rZ37023009c csªddlm}|jD]’}|j ¡}| |d¡|dd…D]h}t|ƒdkrV|\}}}n |\}}d}t d||||¡|fi|¤Ž}d|j ||f} ||||| fVq:qdS)zv helper to iterate over test vectors. yields ``(totp, time, token, expires, prefix)`` tuples. r©r rNr z+test vector: %r time=%r token=%r expires=%rzalg=%r time=%r token=%r: ) Ú passlib.totpr ÚvectorsÚvector_defaultsrNrOrVÚlogÚdebugr) r.r Úrowr‰ÚentryÚtimeÚtokenÚexpiresÚotpÚprefixrrrÚiter_test_vectors.s     zTotpTest.iter_test_vectorscCsF| tt¡|jttdddtdd}tdd}| |j|j¡dS)zconstructor -- 'new' parameterZ4aoggdbbqsyhntuzT)rYr|©r|N)r,r-r r`rY)r.r¯rrrrÚtest_ctor_w_newGs    zTotpTest.test_ctor_w_newcCsì| ttdddjƒd¡| ttdddjƒd¡| ttdddjƒd¡| ttdd d jƒd ¡| ttdd d jƒd ¡|jttdd dd |jttddd | ttj ddg¡tddƒ}Wdƒn1sÞ0YdS)z constructor -- 'size' parameterTr€)r|rérrnr‚r]r~©r|Úsizeéé)r|r¶rr¡z-.*for security purposes, secret key must be.*©ÚcategoryZ message_reZ0A0A0A0A0A0A0A0A0AÚhexN) r(rVr rYr,rÚassertWarningListrJrZPasslibSecurityWarning)r.rgrrrÚtest_ctor_w_sizeSs ÿzTotpTest.test_ctor_w_sizecCs„| ttƒjt¡| tt ¡ƒjt¡| tdƒjt¡| ttd¡| tddƒjt¡| ttdd¡| ttdƒjt¡dS)z,constructor -- 'key' and 'format' parametersz 4aog gdbb qsyh ntuz zao!ggdbbqsyhntuzÚe01c630c2184b076ce99r»ZX01c630c2184b076ce99ršN) r(r ÚKEY1rYrLÚlowerr,ÚBase32DecodeErrorÚBase16DecodeErrorrzrrrÚtest_ctor_w_key_and_formatksz#TotpTest.test_ctor_w_key_and_formatcCsB| ttddjd¡| ttddjd¡|jtttdddS)zconstructor -- 'alg' parameterzSHA-256©rrZSHA256zSHA-333N)r(r r¿rr,rrzrrrÚtest_ctor_w_algƒszTotpTest.test_ctor_w_algcCsT|jtttdd| ttddjd¡| ttddjd¡|jtttdddS)z!constructor -- 'digits' parameterr©r}r\r~é N)r,rr r¿r(r}rzrrrÚtest_ctor_w_digitsszTotpTest.test_ctor_w_digitscCst| ttƒjd¡| ttddjd¡|jtttdd|jtttdd|jtttdd|jtttdddS) z!constructor -- 'period' parameterré?©rƒçø?ÚabcréÿÿÿÿN)r(r r¿rƒr,r-rrzrrrÚtest_ctor_w_period”s zTotpTest.test_ctor_w_periodcCs>| ttƒjd¡| ttddjd¡|jtttdddS)z constructor -- 'label' parameterNzfoo@bar)Úlabelzfoo:bar)r(r r¿rÏr,rrzrrrÚtest_ctor_w_label¥szTotpTest.test_ctor_w_labelcCs>| ttƒjd¡| ttddjd¡|jtttdddS)z!constructor -- 'issuer' parameterNzfoo.com©Úissuerz foo.com:bar)r(r r¿rÒr,rrzrrrÚtest_ctor_w_issuer«szTotpTest.test_ctor_w_issuercCsx| ttƒjd¡| tjddtƒjd¡|jttjdd|jttjdd|jttjdd|jttjdddS) zusing() -- 'period' parameterrrÉrÊrËrÌrrÍN)r(r r¿rƒÚusingr,r-rrzrrrÚtest_using_w_period·s zTotpTest.test_using_w_periodcsÆ| ¡}| |jtj¡| | d¡tt ¡ƒ¡dg‰‡fdd„}|jtj |dd}|  | d¡d¡|  | d¡d¡|j t tj d dd }|j t|tj d d „d|j t|tj d d „ddS)zusing -- 'now' parameterNgHáz®Ç^@csˆdd7<ˆdS)Nrrrr©ÚcounterrrÚnowÔsz&TotpTest.test_using_w_now..now©rØ)rˆé~ér%z)now\(\) function must return non-negativecSsdS)NrÌrrrrrÚár^z+TotpTest.test_using_w_now..cSsdS)NrÍrrrrrrÜär^)rŠÚassertIsrØÚ_timer¬rfÚnormalize_timeÚintr rÔr(r,r-ZassertRaisesRegexÚAssertionError)r.r¯rØZmsg_rerrÖrÚtest_using_w_nowÈs zTotpTest.test_using_w_nowcCsº|dur|jdd}| | tdƒ¡d¡| | d¡d¡| | d¡d¡| | d¡d¡| t|jd ¡| t|jd¡| tj|jd ¡| tj|jd ¡| tj|jd ¡dS) z$normalize_token() -- instance methodNérÆZ1234567s1234567i‡ÖiG”Z0234567g‡Ö2AZ123456Z01234567iNa¼)rŠr(Znormalize_tokenrr,r-rÚMalformedTokenError©r.r¯rrrÚtest_normalize_token_instanceês z&TotpTest.test_normalize_token_instancecCs|jtjddddS)z!normalize_token() -- class methodrãrÆ)r¯N)rær rÔrzrrrÚtest_normalize_token_classsz#TotpTest.test_normalize_token_classc sÚt ¡}| |¡}tdƒD]ª}| ¡‰tˆƒ}| | ˆ¡|¡| | |d¡|¡| | |¡|¡tj  ˆ¡}| | |¡|¡|j }z.t ‡fdd„ƒ|_ | | d¡|¡W||_ q||_ 0q|  t |jd¡dS)znormalize_time()r~rdcsˆS©Nrr©r¬rrrÜr^z.TotpTest.test_normalize_time..NZ1234)r rÔrŠr‹r{ràr(rßrrrØÚ staticmethodr,r-)r.Ú TotpFactoryr¯rgZtintÚdtZorigrrérÚtest_normalize_times    zTotpTest.test_normalize_timecCs´| ¡}ttdƒ}| |jt¡| |jd¡| |jt¡| | ¡d¡| |jddd¡| |jddt¡| |jdd d ¡td |  d d ¡d}|j}|j}| ¡}dS)z pretty_key() and .key attributesršr¾z4AOG-GDBB-QSYH-NTUZú )Úsepz4AOG GDBB QSYH NTUZFr»)rze01c-630c-2184-b076-ce99Tr~r´rµN) rvr rLr(rYZhex_keyÚ base32_keyr¿Z pretty_keyr†)r.rqr¯rgrrrÚtest_key_attrs&s zTotpTest.test_key_attrscCsdddlm}m}|dƒ}| d¡}| ||¡| |jd¡| |jd¡| |jd¡| |d¡| t |ƒd ¡| |dd¡| |d d¡|  t |j d ¡|  t |j d ¡|  |¡d d „|_| |jd¡|  |j¡dd „|_| |jd¡| |j¡| d¡}| ||¡| ||¡| d¡}| ||¡| ||¡| d¡}| ||¡dS)zgenerate() -- TotpToken() classr)r Ú TotpTokenZs3jdvb7qd2r7jpxxr˜r™iµÒéT¹T)r™rórcréýÿÿÿcSsdS)NgàTn'ÕArrrrrrÜTr^z*TotpTest.test_totp_token..rdcSsdS)NiU¹TrrrrrrÜXr^i7¹TiWºTN)r¥r ròÚgenerateÚassertIsInstancer(r­r×Ú expire_timerVr,Ú IndexErrorÚ __getitem__r+rØZ remainingZvalidr*Ú assertIsNotr`)r.r ròr¯rXZresult2Zresult3Zresult4rrrÚtest_totp_token?s8               zTotpTest.test_totp_tokencsðddlm}|dd}| ¡‰| ˆ¡}|j}| |t¡|jd}| | |d¡j|¡|  | |d¡j|¡t j   ˆ¡}| t |  |¡ƒt ˆƒ¡| | |¡j|¡|j‡fdd„d |jd }| | ¡j|¡| t|jd ¡d S) z generate()rr¤Tr²récsˆSrèrrrérrrÜ„r^z(TotpTest.test_generate..rÙ)rYrÍN)r¥r r{rõr­rörr×r(r`rrràrßrÔrðr,r)r.r r¯rXr­Z start_timerìrrrérÚ test_generatejs      zTotpTest.test_generatecCsb| ¡D]T\}}}}}| |¡}|j|j||d|j|j||j|d|r| |j|¡qdS)zgenerate() -- reference vectors©ÚmsgN)r±rõr(r­r×rƒr÷)r.r¯r¬r­r®r°rXrrrÚ!test_generate_w_reference_vectorsŠs  z*TotpTest.test_generate_w_reference_vectorsrr'c CsJddlm}| ||¡| |jt¡| |jj|¡|j|j||dd||}||} |j|j| |dd|j|j ||dd|j|j ||dd| |j ||¡| d|} | |j | ¡| |j | |¡| t|ƒd ¡| || |f¡| t|jd ¡| |d| ¡| |d|¡| t|jd ¡| |¡dS) Nr©Ú TotpMatchz matched time:rþz matched counter:z expected counter:z skipped:rrcrô)r¥rrörr r(rƒr¬r×Zexpected_counterÚskippedZ cache_secondsr÷Z cache_timerVr,rørùr+) r.Úmatchr¬rrƒÚwindowrÿrZexpectedr×r÷rrrÚassertTotpMatch˜s*   zTotpTest.assertTotpMatchcs@d‰d}tj‡fdd„dtƒ}| |ˆ¡}|j|ˆdddS) z!match() -- valid TotpMatch objecté…kÚ781501csˆdS©Ni€Qrrrérrrܽr^z8TotpTest.test_totp_match_w_valid_token..rÙr©r¬rN©r rÔÚKEY3rr©r.r­r¯rXrrérÚtest_totp_match_w_valid_token¹s  z&TotpTest.test_totp_match_w_valid_tokencsTddlm}d‰d}tj‡fdd„dtƒ}| |ˆd¡}|j|ˆdd d d S) z3match() -- valid TotpMatch object with future tokenrrrrcsˆdSr rrrérrrÜÇr^z8TotpTest.test_totp_match_w_older_token..rÙrrr N)r¥rr rÔr rr)r.rr­r¯rXrrérÚtest_totp_match_w_older_tokenÁs  z&TotpTest.test_totp_match_w_older_tokencsHd‰d}tj‡fdd„dtƒ}| |ˆd¡}|j|ˆdddd S) z1match() -- valid TotpMatch object with past tokenrrcsˆdSr rrrérrrÜÏr^z6TotpTest.test_totp_match_w_new_token..rÙrrÍr Nr r rrérÚtest_totp_match_w_new_tokenËs z$TotpTest.test_totp_match_w_new_tokencs<d‰d}tj‡fdd„dtƒ}| tj|j|ˆd¡dS)z#match() -- invalid TotpMatch objectrrcsˆdSr rrrérrrÜ×r^z:TotpTest.test_totp_match_w_invalid_token..rÙr£N)r rÔr r,rÚInvalidTokenErrorr)r.r­r¯rrérÚtest_totp_match_w_invalid_tokenÓsz(TotpTest.test_totp_match_w_invalid_tokenc KsXd|j|j|j|||f}|j||fi|¤Ž}|j|| |¡|j| dd¡||ddS)z,helper to test otp.match() output is correctú5key=%r alg=%r period=%r token=%r gen_time=%r time=%r:rr)r¬rƒrrrÿN)rðrrƒrrrßÚget) r.Zexpect_skippedr­r¬r¯Úgen_timer‰rÿrXrrrÚassertVerifyMatchesÞsÿ ûzTotpTest.assertVerifyMatchescKs8d|j|j|j|||f}|j||j||fd|i|¤ŽS)z/helper to test otp.match() throws correct errorrZ__msg__)rðrrƒr,r)r.Z exc_classr­r¬r¯rr‰rÿrrrÚassertVerifyRaisesìsÿÿÿzTotpTest.assertVerifyRaisesc Csb| ¡}|j}| ¡}| |¡j}t||d}t|jfi|¤Ž}t|jfi|¤Ž}|t j |||dd|d||||d|d|||d|d|d||dd|t j |||dd|d||||d|d|||d|d|t j ||d|dd|t j ||d||d|d||d|d|dt j   |¡}|d||dd|t |dƒdS) z)match() -- 'time' and 'window' parameters©r¯rr©rrrcrÍéþÿÿÿN)rŠrƒr{rõr­rJrrrrrrrr) r.r¯rƒr¬r­ÚcommonÚ assertMatchesr,rìrrrÚtest_match_w_windowös(   zTotpTest.test_match_w_windowc Cs¼| ¡}|j}| ¡}t||d}t|jfi|¤Ž}t|jfi|¤Ž}d|}| ||¡j}|t j ||dd|d||d| d| ||¡j} |t j | |dd|d| |d|ddS)zmatch() -- 'skew' parametersrr rrrô)rÚskewN) rŠrƒr{rJrrrrõr­rr) r.r¯rƒr¬rrr,rZ behind_tokenZ ahead_tokenrrrÚtest_match_w_skew&s zTotpTest.test_match_w_skewc Csø| ¡}|j}| ¡}| |¡}|j}|j}|j}t||d}t|j fi|¤Ž} t|j fi|¤Ž} | d||||d| d||||d|d| t j ||d|||d| t j |||||d} | | j|¡| t j |||dd} | | j|¡dS) z0match() -- 'reuse' and 'last_counter' parametersrrÍrr)Z last_counterrrcrN)rŠrƒr{rõr­r×r÷rJrrrrrZUsedTokenErrorr() r.r¯rƒr¬Ztdatar­r×r÷rrr,ÚerrrrrÚtest_match_w_reuse=s2  ÿÿÿ ÿzTotpTest.test_match_w_reusecCsltdƒ}|j}d}| |d|ƒ¡| |d|ƒ¡| tj|d|¡| tj|d|¡| tj|d|¡dS) zmatch() -- token normalizationÚotxl2f5cctbprpzxéý6Tz 3 32-136 s332136Z12345Z12345XZ0123456N)r rr+r,rrä)r.r¯rr¬rrrÚ test_match_w_token_normalizationfsz)TotpTest.test_match_w_token_normalizationcCsh| ¡D]Z\}}}}}|j}|||ƒ}| |¡|j|j||j|d|jtj|||dddqdS)zmatch() -- reference vectorsrþédrrN) r±rr+r(r×rƒr,rr)r.r¯r¬r­r®rÿrrXrrrÚtest_match_w_reference_vectors|s   z'TotpTest.test_match_w_reference_vectorscsÌddlm}d‰|j‡fdd„d}tddd d }| d |¡}|j|ˆd tddd d }| tj|jd |¡tddd}| t |jd |¡d}| d |¡}|j|ˆd d}| d |¡}|j|ˆd dS)zverify()rr¤r#csˆSrèrrrérrrÜ•r^z&TotpTest.test_verify..rÙrrr"©r?ÚtyperYZ332136réZ332155©r?r(z3{"v": 1, "type": "totp", "key": "otxl2f5cctbprpzx"}z,otpauth://totp/Label?secret=otxl2f5cctbprpzxN) r¥r rÔrJZverifyrr,rrr)r.r rëZsource1rZ source1jsonZ source1urirrérÚ test_verifys      zTotpTest.test_verifycCsddlm}|j}|tdƒƒ}| |jt¡|dƒ}| |jt¡|tddtdƒ}| |jt¡|tdƒƒ}| |jt¡|d ƒ}| |jt¡|  ||ƒ|¡t ƒ}|j |d  |¡}|  ||¡| |  ¡|  ¡¡|j |d  |¡}|  ||¡| t|td ƒ¡| t|d ¡d S)z from_source()rr¤úNotpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&issuer=ExamplesNotpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&issuer=Examplerrr'z3{"v": 1, "type": "totp", "key": "JBSWY3DPEHPK3PXP"}s3{"v": 1, "type": "totp", "key": "JBSWY3DPEHPK3PXP"})r/ZfoosfooN)r¥r Ú from_sourcerr(rYÚKEY4_RAWrJÚKEY4rÝr rÔrúÚto_dictr,r)r.r r,r¯Zwallet1rŒrrrrÚtest_from_source±s*     zTotpTest.test_from_sourcecCsddlm}|j}|dƒ}| ||¡| |jt¡| |jd¡| |jd¡| |j d¡| |j d¡| |j d¡|d ƒ}| |jt¡|  t |d ¡|  t|d ¡|d ƒ}| |jd ¡| |jd¡|dƒ}| |jd¡| |jd¡|dƒ}| |jd¡| |jd¡|  t |jd¡|dƒ}| |j d¡|  t |d¡|dƒ}| |j d¡|  t |d¡|  t |d¡|  t |d¡|dƒ}| |j d¡|  t |d¡|  t |d¡| ttjd d!g¡|d"ƒ}Wd#ƒn1sô0Y| |jt¡| |j d¡d#S)$z from_uri()rr¤r+úalice@google.comÚExampler€rr\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=JBSWY3DPEHPK3PXPzalice@bigco.comzBig 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=SHA256rzPotpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&algorithm=SHA333zHotpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&digits=8rzHotpauth://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(rYr-rÏrÒrrƒr}r,rrÁr¼rJrZPasslibRuntimeWarningrðr.)r.r r5r¯rrrÚ test_from_uriàsX   ÿ ÿ(zTotpTest.test_from_uricCsèttdddd}| | dd¡d¡| t|jdd¡| | d¡d ¡d|_| | ¡d ¡d|_| | ¡d¡| t|jd ¡| t|jdd ¡| ttd d  d¡d¡| ttdd d¡d¡| ttdd d¡d¡dS)zto_uri()r€r\r©rr}rƒr1ú Example OrgzZotpauth://totp/Example%20Org:alice@google.com?secret=JBSWY3DPEHPK3PXP&issuer=Example%20OrgNz7otpauth://totp/alice@google.com?secret=JBSWY3DPEHPK3PXPzlabel:with:semicolonszissuer:with:semicolonsrrÄzHotpauth://totp/alice@google.com?secret=JBSWY3DPEHPK3PXP&algorithm=SHA256rrÆz@otpauth://totp/alice@google.com?secret=JBSWY3DPEHPK3PXP&digits=8rÉrÊzAotpauth://totp/alice@google.com?secret=JBSWY3DPEHPK3PXP&period=63)r r.r(Zto_urir,rrÏrÒrårrrÚ test_to_uriWs6ÿ ÿ ÿ ÿÿÿÿzTotpTest.test_to_uric Csrddlm}|j}|tddtdddƒ}| ||¡| |jt¡| |j d¡| |j d¡| |j d¡| |j d ¡| |j d ¡| t|tdtd ¡| t|tddtd ¡| t|td dtd ¡| t|tdtd¡|tddt ¡dddƒ}| |jt¡| t|tddd¡| t|tdddd ¡|tddtdddƒ}| |j d¡| |j d¡|tddtddƒ}| |j d¡| t|tddtdd¡|tddtddƒ}| |j d¡| t|tddtdd¡| t|tddtdd¡|tddtddƒ}| |j d¡| t|tddtdd¡| t|tddtdd¡| t|tddtdd¡dS) z from_dict()rr¤rrr1r2©r?r(rYrÏrÒr€rr\)r(rYr'rG)r?rYr)zJBSWY3DPEHP@3PXPr3r4r©r?r(rYrZsha333r©r?r(rYr}r5érÉ©r?r(rYrƒrÍr%)r?r(rYÚINVALIDN)r¥r Ú from_dictrJr.rör(rYr-rÏrÒrrƒr}r,rrÀrÁr-)r.r r@r¯rrrÚtest_from_dict”sF   ÿzTotpTest.test_from_dictc Cs|ttdddd}| | ¡tddtd¡ttddddd d }| | ¡tddtdd d ¡ttddddd }| | ¡tddtdd ¡ttdddd d}| | ¡tddtd d¡tjd d}|tƒ}| | ¡tddtd¡|td d}| | ¡tddtd¡| ttdd ¡tddtdd¡| ttdd ¡tddtdd¡| ttdd ¡tddtdd¡dS)z to_dict()r€r\rr7rrr'r1r8)rr}rƒrÏrÒr:)rr}rƒrÏ)r?r(rYrÏ)rr}rƒrÒ)r?r(rYrÒrÑrrÄr;rrÆr<rÉrÊr>N)r r.r(r/rJrÔ)r.r¯rërrrÚ test_to_dictòsP ÿ ÿÿ ÿ ÿÿ ÿ ÿÿ  ÿÿÿzTotpTest.test_to_dict)N)N)rrrr')N)N)4rirjrkÚ__doc__rlrsr{rŠrŽrJr§Ú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ýrrrrrrrrrrr!r$r&r*r0r6r9rArBÚ __classcell__rrrwrro‹sº   ú ú þ ú ú ú°T   " +  !  ÿ ÿ 0)$/w=^ro)1rCrÚ functoolsrZloggingZ getLoggerrir¨Úsysr¬rÞZpasslibrZpasslib.utils.compatrrZpasslib.tests.utilsrrrrur¥r r r Ú__all__r-rÁrÂÚ version_infoZbinasciir rHrIr¿rLrMr r.r-rryrrÚencoderDrErFrorrrrÚsF   ÿ      /