3 L] @sddlmZmZmZddlZddlZddlmZmZddl m Z ddl m Z m Z ddlmZmZmZddlmZddlmZGd d d eZdS) )absolute_importdivisionprint_functionN)UnsupportedAlgorithm_Reasons) HMACBackend) constant_timehmac)SHA1SHA256SHA512) InvalidToken) _generate_uric@s6eZdZd ddZddZddZdd Zd d Zd S)HOTPTcCst|tstdtjt|dkr2|dkr2tdt|tjsFt d|dksV|dkr^tdt|t t t fsvt d ||_ ||_||_||_dS) Nz.Backend object does not implement HMACBackend.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.) isinstancerrrZBACKEND_MISSING_INTERFACElen ValueErrorsix integer_types TypeErrorr r r _key_length _algorithm_backend)selfkeylength algorithmbackendZenforce_key_lengthr"W/tmp/pip-install-wfra5znf/cryptography/cryptography/hazmat/primitives/twofactor/hotp.py__init__s   z HOTP.__init__cCs*|j|}|d|j}dj||jjS)N z{0:0{1}})_dynamic_truncaterformatencode)rcounterZtruncated_valuehotpr"r"r#generate/s z HOTP.generatecCstj|j||stddS)Nz#Supplied HOTP value does not match.)rZbytes_eqr+r )rr*r)r"r"r#verify4sz HOTP.verifycCsjtj|j|j|j}|jtjd||j}t j |t |dd@}|||d}tj d|dd@S)Nz>Qz>Iri) r HMACrrrupdatestructpackfinalizer indexbytesrunpack)rr)ctxZ hmac_valueoffsetpr"r"r#r&8s zHOTP._dynamic_truncatecCst|d||dt|fgS)Nr*r))rint)rZ account_namer)Zissuerr"r"r#get_provisioning_uriAs zHOTP.get_provisioning_uriN)T)__name__ __module__ __qualname__r$r+r,r&r;r"r"r"r#rs   r) __future__rrrr2rZcryptography.exceptionsrrZ'cryptography.hazmat.backends.interfacesrZcryptography.hazmat.primitivesrr Z%cryptography.hazmat.primitives.hashesr r r Z(cryptography.hazmat.primitives.twofactorr Z.cryptography.hazmat.primitives.twofactor.utilsrobjectrr"r"r"r#s