3 lá˜_w ã@sœddlmZmZmZddlZddlZddlmZmZddl m Z ddl m Z ddl mZmZddlmZmZmZddlmZdd lmZGd d „d eƒZdS) é)Úabsolute_importÚdivisionÚprint_functionN)ÚUnsupportedAlgorithmÚ_Reasons)Ú _get_backend)Ú HMACBackend)Ú constant_timeÚhmac)ÚSHA1ÚSHA256ÚSHA512)Ú InvalidToken)Ú _generate_uric@s6eZdZd dd„Zdd„Zdd„Zd d „Zd d „ZdS)ÚHOTPNTcCsšt|ƒ}t|tƒstdtjƒ‚t|ƒdkr:|dkr:tdƒ‚t|tj ƒsNt dƒ‚|dks^|dkrftdƒ‚t|t t t fƒs~t 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.)rÚ isinstancerrrZBACKEND_MISSING_INTERFACEÚlenÚ ValueErrorÚsixZ integer_typesÚ TypeErrorr r r Ú_keyÚ_lengthÚ _algorithmÚ_backend)ÚselfÚkeyZlengthÚ algorithmZbackendZenforce_key_length©r ú/usr/lib64/python3.6/hotp.pyÚ__init__s"  z HOTP.__init__cCs*|j|ƒ}|d|j}dj||jƒjƒS)Né z{0:0{1}})Ú_dynamic_truncaterÚformatÚencode)rÚcounterZtruncated_valueÚhotpr r r!Úgenerate0s z HOTP.generatecCstj|j|ƒ|ƒstdƒ‚dS)Nz#Supplied HOTP value does not match.)r Zbytes_eqr)r)rr(r'r r r!Úverify5sz HOTP.verifycCsjtj|j|j|jƒ}|jtjd|ƒƒ|jƒ}t j |t |ƒdƒd@}|||d…}tj d|ƒdd@S)Nz>Qéééz>Iriÿÿÿ) r ZHMACrrrÚupdateÚstructÚpackÚfinalizerZ indexbytesrÚunpack)rr'ZctxZ hmac_valueÚoffsetÚpr r r!r$9s zHOTP._dynamic_truncatecCst|d||dt|ƒfgƒS)Nr(r')rÚint)rZ account_namer'Zissuerr r r!Úget_provisioning_uriBszHOTP.get_provisioning_uri)NT)Ú__name__Ú __module__Ú __qualname__r"r)r*r$r6r r r r!rs   r)Z __future__rrrr/rZcryptography.exceptionsrrZcryptography.hazmat.backendsrZ'cryptography.hazmat.backends.interfacesrZcryptography.hazmat.primitivesr r Z%cryptography.hazmat.primitives.hashesr r r Z(cryptography.hazmat.primitives.twofactorrZ.cryptography.hazmat.primitives.twofactor.utilsrÚobjectrr r r r!Ús