3
lá˜_w
ã @ sœ d dl mZmZmZ d dlZd dlZd dlmZmZ d dl m
Z
d dlmZ d dl
mZmZ d dlmZmZmZ d dlmZ d d lmZ G d
d„ deƒZdS )é )Úabsolute_importÚdivisionÚprint_functionN)ÚUnsupportedAlgorithmÚ_Reasons)Ú_get_backend)ÚHMACBackend)Ú
constant_timeÚhmac)ÚSHA1ÚSHA256ÚSHA512)ÚInvalidToken)Ú
_generate_uric @ s6 e Zd Zd
dd„Zdd„ Zdd„ Zd d
„ Zdd„ ZdS )ÚHOTPNTc C sš t |ƒ}t|tƒstdtjƒ‚t|ƒdk r:|dkr:tdƒ‚t|tj ƒsNt
dƒ‚|dk s^|dkrftdƒ‚t|ttt
fƒs~t
d ƒ‚|| _|| _|| _|| _d S )
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 Ú
isinstancer r r ZBACKEND_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__c C s* | j |ƒ}|d| j }dj|| jƒjƒ S )Né
z{0:0{1}})Ú_dynamic_truncater ÚformatÚencode)r ÚcounterZtruncated_valueÚhotpr r r! Úgenerate0 s
z
HOTP.generatec C s t j| j|ƒ|ƒstdƒ‚d S )Nz#Supplied HOTP value does not match.)r Zbytes_eqr) r )r r( r' r r r! Úverify5 s zHOTP.verifyc C sj t j| j| j| jƒ}|jtjd|ƒƒ |jƒ }t j
|t|ƒd ƒd@ }|||d … }tjd|ƒd d@ S )Nz>Qé é é z>Ir iÿÿÿ)
r
ZHMACr r r ÚupdateÚstructÚpackÚfinalizer Z
indexbytesr Úunpack)r r' ZctxZ
hmac_valueÚoffsetÚpr r r! r$ 9 s zHOTP._dynamic_truncatec C s t | d||dt|ƒfgƒS )Nr( r' )r Úint)r Zaccount_namer' Zissuerr r r! Úget_provisioning_uriB s zHOTP.get_provisioning_uri)NT)Ú__name__Ú
__module__Ú__qualname__r" r) r* r$ r6 r r r r! r s
r )Z
__future__r r r r/ r Zcryptography.exceptionsr r Zcryptography.hazmat.backendsr Z'cryptography.hazmat.backends.interfacesr Zcryptography.hazmat.primitivesr r
Z%cryptography.hazmat.primitives.hashesr r r
Z(cryptography.hazmat.primitives.twofactorr Z.cryptography.hazmat.primitives.twofactor.utilsr Úobjectr r r r r! Ú