a fŸWcÒã@sndZddlZddlmZddlZe e¡ZddlZddl Z ddl m Z ddl mZmZddlmZmZddl mZddlmZmZmZd gZeZZejd krªdd lmZejd krÀdd lmZd Z dZ!dZ"dZ#dZ$dZ%dZ&dZ'ej(j)dksôJdƒ‚ej(j*dks Jdƒ‚dd„Z+e+ƒZ,dd„Z-Gdd„deƒZ.d /d ¡Z0e0ddd!…Z1e0d"dd#…Z2Gd$d%„d%eƒZ3dS)&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!Þ­¾ïézunexpected float_info.radixé,z#double precision unexpectedly smallc 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_sizeisr c@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%r4r5)rr4r5)rr(z1-2_3.4z-abczab*$Zbbbr'N)r r*r+rr.r/r)r0r2r1rrrÚ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%r4r4stwor()r%r4ÚAr7r"r%)Ú default_tagsoneÚBN)r r*r8Z get_secretr.ÚKeyError)r0r1rrrÚtest_default_tagÍsÿzAppWalletTest.test_default_tagNcCs.tr|o |ƒn|o| t|¡| d¡‚dS)Nz$'cryptography' package not installed)r r.Ú RuntimeErrorZskipTest)r0Ú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&©rEs ¯D6.F7ëQÚ3éç)rAN)r ÚPASS1ÚPASS2Údictr>rÚ decrypt_keyr*ÚKEY1_RAWÚKEY2_RAWÚcopyÚupdater.r:r)r0r1ZCIPHER1ZCIPHER2ZCIPHER3Ú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)rBr%rGN) r>r rJrKrLr,rMrPrQr-)r0r1r2rRrrrÚ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)rArErBrCrDrArrErBrCrDN)r*ÚsetrUÚlenr Ú salt_sizerM)r0Úresultr1Ú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%rrTrFrCrDér$r&)r\é@óN) r rJr>rÚ encrypt_keyrNr]ÚassertNotEqualrKrYrOr.r)r0r1rZÚ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(rr)Zmaxtimer rçà?)ÚdeltaN)r>r rUrrrarNÚassertAlmostEqual)r0r1rfÚ_Zdelta2rrrÚtest_encrypt_cost_timingjs z&AppWalletTest.test_encrypt_cost_timing)N)r%F) Ú__name__Ú __module__Ú __qualname__ÚdescriptionPrefixr3r6r;r>rSrVr]rdrirrrrr!os2% &ÿ )r!Z12345678901234567890Úasciié 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) ÚsuperrpÚsetUpZpasslib.crypto.digestrqÚ clear_cacheZ patchAttrÚ totp_moduleÚ getRandom)r0rq©Ú __class__rrrt˜s zTotpTest.setUpcCs| ¡ ¡tS)zY helper to generate random epoch time :returns float: epoch time )rwZrandomÚ max_time_t©r0rrrÚrandtime¥szTotpTest.randtimeNcKsh| ¡}d|vrd|d<| d| dd¡¡| d| gd¢¡¡| d | dd ¡¡|p\tfi|¤ŽS) z@ helper which generates a random TOTP instance. r[TÚnewÚdigitsr^é Úalg)Úsha1Úsha256Úsha512Úperiodéx)rwÚ setdefaultÚrandintÚchoicer )r0ÚclsÚkwdsrrrrrÚ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:rzdigits not randomizedzalg not randomizedN)r‹rbr[Úranger~Zfailr€)r0Úotp1Úotp2rhrrrÚ test_randotp¸s       zTotpTest.test_randotpZbase32rér)Úformatr€r„r~ZACDEFGHJKL234567r^)r[r~)é·¼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)r[r‘r€)é;Z94287082)éÅ5:BZ07081804)éÇ5:BZ14050471)éÒ–IZ89005924)é”5wZ69279037)ìH/PZ65353130r‚)rœZ46119246)rZ68084774)ržZ67062674)rŸZ91819424)r Z90698825)r¡Z77737706rƒ)rœZ90693936)rZ25091201)ržZ99943326)rŸZ93441116)r Z38618901)r¡Z47863826r)iî‘þSZ727248)i.Ñ¡TZ122419é é))r[r~r„)iÐÑ¡TZ 662331049é<)r[r‘r„)ržZ19360094)r[r‘r€r„)ržZ40857319)ržZ37023009c 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_defaultsrPrQrXÚlogÚdebugr€) r0r ÚrowrŠÚentryÚtimeÚtokenÚexpiresÚotpÚprefixrrrÚiter_test_vectors.s     zTotpTest.iter_test_vectorscCsF| tt¡|jttdddtdd}tdd}| |j|j¡dS)zconstructor -- 'new' parameterZ4aoggdbbqsyhntuzT)r[r}©r}N)r.r/r rbr[)r0r°rŽrrrÚ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€ér‚rorƒr_r©r}Úsizeéé)r}r·r€r¢z-.*for security purposes, secret key must be.*©ÚcategoryZ message_reZ0A0A0A0A0A0A0A0A0AÚhexN) r*rXr r[r.rÚassertWarningListrLrZPasslibSecurityWarning)r0rhrrrÚ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 ÚKEY1r[rNÚlowerr.ÚBase32DecodeErrorÚBase16DecodeErrorr{rrrÚtest_ctor_w_key_and_formatksz#TotpTest.test_ctor_w_key_and_formatcCsB| ttddjd¡| ttddjd¡|jtttdddS)zconstructor -- 'alg' parameterzSHA-256©r€r‚ZSHA256zSHA-333N)r*r rÀr€r.rr{rrrÚ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~r{rrrÚ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/rr{rrrÚ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.rr{rrrÚ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.rr{rrrÚ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/rr{rrrÚ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­rgÚnormalize_timeÚintr rÕr*r.r/ZassertRaisesRegexÚAssertionError)r0r°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©r0r°rrrÚtest_normalize_token_instanceês z&TotpTest.test_normalize_token_instancecCs|jtjddddS)z!normalize_token() -- class methodrärÇ)r°N)rçr rÕr{rrrÚ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()rrecsˆS©Nrr©r­rrrÝr`z.TotpTest.test_normalize_time..NZ1234)r rÕr‹rŒr|rár*ràrrrÙÚ staticmethodr.r/)r0Ú TotpFactoryr°rhZtintÚ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¼)r‘ze01c-630c-2184-b076-ce99Trrµr¶N) rwr rNr*r[Zhex_keyÚ base32_keyrÀZ pretty_keyr‡)r0rrr°rhrrrÚ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ôrréýÿÿÿcSsdS)NgàTn'ÕArrrrrrÝTr`z*TotpTest.test_totp_token..recSsdS)NiU¹TrrrrrrÝXr`i7¹TiWºTN)r¦r róÚgenerateÚassertIsInstancer*r®rØÚ expire_timerXr.Ú IndexErrorÚ __getitem__r-rÙZ remainingZvalidr,Ú assertIsNotrb)r0r rór°rZZresult2Zresult3Zresult4rrrÚ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Ú)r[rÎN)r¦r r|rör®r÷rrØr*rbrrráràrÕrñr.r)r0r r°rZr®Z start_timerírŽrrê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ø)r0r°r­r®r¯r±rZrrrÚ!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:rrrõ)r¦rr÷rr r*r„r­rØZexpected_counterÚskippedZ cache_secondsrøZ cache_timerXr.rùrúr-) r0Úmatchr­rr„ÚwindowrrZexpectedrØ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©r0r®r°rZrrê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 tokenrrrr csˆdSr rrrêrrrÝÇr`z8TotpTest.test_totp_match_w_older_token..rÚrrr N)r¦rr rÕr rr)r0rr®r°rZrrê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 tokenrr csˆdSr rrrêrrrÝÏr`z6TotpTest.test_totp_match_w_new_token..rÚrrÎr Nr rrrê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 objectrr csˆdSr rrrêrrrÝ×r`z:TotpTest.test_totp_match_w_invalid_token..rÚr¤N)r rÕr r.rÚInvalidTokenErrorr)r0r®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„rrrN)rñr€r„rrràÚget) r0Zexpect_skippedr®r­r°Úgen_timerŠrrZrrrÚassertVerifyMatchesÞsÿ ûzTotpTest.assertVerifyMatchescKs8d|j|j|j|||f}|j||j||fd|i|¤ŽS)z/helper to test otp.match() throws correct errorrZ__msg__)rñr€r„r.r)r0Z exc_classr®r­r°rrŠrrrrÚ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©rrrrÎéþÿÿÿN)r‹r„r|rör®rLrrrrrrrr) r0r°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|rLrrrrör®rr) r0r°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_counterrrrN)r‹r„r|rör®rØrørLrrrrrZUsedTokenErrorr*) r0r°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å)r0r°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)r0r°r­r®r¯rrrZrrrÚ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#©rAÚtyper[Z332136rêZ332155©rAr)z3{"v": 1, "type": "totp", "key": "otxl2f5cctbprpzx"}z,otpauth://totp/Label?secret=otxl2f5cctbprpzxN) r¦r rÕrLZverifyrr.rrr)r0r 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"})r1ZfoosfooN)r¦r Ú from_sourcerr*r[ÚKEY4_RAWrLÚKEY4rÞr rÕrûÚto_dictr.r)r0r r-r°Zwallet1rrŽrrrÚ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ÚExamplerrr^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=SHA256r‚zPotpauth://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*r[r.rÐrÓr€r„r~r.rrÂr½rLrZPasslibRuntimeWarningrñr/)r0r r6r°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()rr^r©r€r~r„r2ú Example OrgzZotpauth://totp/Example%20Org:alice@google.com?secret=JBSWY3DPEHPK3PXP&issuer=Example%20OrgNz7otpauth://totp/alice@google.com?secret=JBSWY3DPEHPK3PXPzlabel:with:semicolonszissuer:with:semicolonsr‚rÅ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¥rrr2r3©rAr)r[rÐrÓrrr^)r)r[r(rI)rAr[r*zJBSWY3DPEHP@3PXPr4r5r‚©rAr)r[r€Zsha333r©rAr)r[r~r7érÊ©rAr)r[r„rÎr')rAr)r[ÚINVALIDN)r¦r Ú from_dictrLr/r÷r*r[r.rÐrÓr€r„r~r.rrÁrÂr/)r0r rAr°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()rr^rr8rrr(r2r9)r€r~r„rÐrÓr;)r€r~r„rÐ)rAr)r[rÐ)r€r~r„rÓ)rAr)r[rÓrÒr‚rÅr<rrÇr=rÊrËr?N)r r/r*r0rLrÕ)r0r°rìrrrÚ test_to_dictòsP ÿ ÿÿ ÿ ÿÿ ÿ ÿÿ  ÿÿÿzTotpTest.test_to_dict)N)N)rrrr))N)N)4rjrkrlÚ__doc__rmrtr|r‹rrLr¨Ú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þrrrrrrrrrr r"r%r'r+r1r7r:rBrCÚ __classcell__rrrxrrp‹sº   ú ú þ ú ú ú°T   " +  !  ÿ ÿ 0)$/w=^rp)4rDrÚ functoolsrZloggingZ getLoggerrjr©Úsysr­rßZpasslibrZpasslib.utils.compatrrZpasslib.tests.utilsrrrrvr¦r r r Ú__all__r/rÂrÃÚ version_infoZbinasciir rJrKrÀrNrOr r/r.Ú float_infoÚradixÚmant_digrrzr r!ÚencoderErFrGrprrrrÚsJ   ÿ     /