a ¹a( ã@sªddlZddlZddlZddlmZmZddlmZmZddl m Z m Z m Z ddl mZeje e e fZdeeejeejejeefedœdd „ZGd d„deƒZdS) éN)ÚquoteÚ urlencode)Ú constant_timeÚhmac)ÚSHA1ÚSHA256ÚSHA512)Ú InvalidTokenÚHOTP)ÚhotpÚ type_nameÚ account_nameÚissuerÚextra_parametersÚreturncCs„d|jfdt |j¡fd|jj ¡fg}|dur>| d|f¡| |¡||rbdt |ƒt |ƒfnt |ƒt |ƒdœ}dj fi|¤ŽS)NÚdigitsZsecretÚ algorithmrz%s:%s)ÚtypeZlabelÚ parametersz%otpauth://{type}/{label}?{parameters}) Ú_lengthÚbase64Z b32encodeÚ_keyÚ _algorithmÚnameÚupperÚappendÚextendrrÚformat)r r r rrrZuriparts©rúS/usr/lib64/python3.9/site-packages/cryptography/hazmat/primitives/twofactor/hotp.pyÚ _generate_urisý ÿù r c@steZdZdeeeejeddœdd„Z eedœdd„Z eedd œd d „Z eedœd d „Z e eeje e dœdd„ZdS)r NT)ÚkeyÚlengthrÚbackendÚenforce_key_lengthrcCstt|ƒdkr|durtdƒ‚t|tƒs.tdƒ‚|dks>|dkrFtdƒ‚t|tttfƒs^tdƒ‚||_||_ ||_ dS) NéTz'Key length has to be at least 128 bits.z)Length parameter must be an integer type.ééz(Length of HOTP has to be between 6 to 8.z)Algorithm must be SHA1, SHA256 or SHA512.) ÚlenÚ ValueErrorÚ isinstanceÚintÚ TypeErrorrrrrrr)Úselfr!r"rr#r$rrrÚ__init__2s z HOTP.__init__)ÚcounterrcCs*| |¡}|d|j}d ||j¡ ¡S)Né z{0:0{1}})Ú_dynamic_truncaterrÚencode)r-r/Ztruncated_valuer rrrÚgenerateJs z HOTP.generate)r r/rcCst | |¡|¡stdƒ‚dS)Nz#Supplied HOTP value does not match.)rZbytes_eqr3r )r-r r/rrrÚverifyOsz HOTP.verifycCsbt |j|j¡}| t d|¡¡| ¡}|t|ƒdd@}|||d…}t  d|¡dd@S)Nz>Qéééz>Iriÿÿÿ) rZHMACrrÚupdateÚstructÚpackÚfinalizer(Úunpack)r-r/ÚctxZ hmac_valueÚoffsetÚprrrr1Ss zHOTP._dynamic_truncate)r r/rrcCst|d||dt|ƒfgƒS)Nr r/)r r+)r-r r/rrrrÚget_provisioning_uri\sÿzHOTP.get_provisioning_uri)NT)Ú__name__Ú __module__Ú __qualname__Úbytesr+Ú_ALLOWED_HASH_TYPESÚtypingÚAnyÚboolr.r3r4r1ÚstrÚOptionalr@rrrrr 1s úù  þ)rr9rFÚ urllib.parserrZcryptography.hazmat.primitivesrrZ%cryptography.hazmat.primitives.hashesrrrZ(cryptography.hazmat.primitives.twofactorr ÚUnionrErIrJÚListÚTupler+r Úobjectr rrrrÚs ú