U
    e]
                     @   s   d dl mZmZmZ d dlZd dlZd dlmZmZ d dl	m
Z
 d dlmZmZ d dlmZmZmZ d dlmZ d dlmZ G d	d
 d
eZdS )    )absolute_importdivisionprint_functionN)UnsupportedAlgorithm_Reasons)HMACBackend)constant_timehmac)SHA1SHA256SHA512)InvalidToken)_generate_uric                   @   s6   e Zd ZdddZdd Zdd Zdd	 Zd
d ZdS )HOTPTc                 C   s   t |tstdtjt|dk r2|dkr2tdt |tjsFt	d|dk sV|dkr^tdt |t
ttfsvt	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.)
isinstancer   r   r   ZBACKEND_MISSING_INTERFACElen
ValueErrorsixZinteger_types	TypeErrorr
   r   r   _key_length
_algorithm_backend)selfkeyZlength	algorithmZbackendZenforce_key_length r   O/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/twofactor/hotp.py__init__   s"    
zHOTP.__init__c                 C   s*   |  |}|d| j  }d|| j S )N
   z{0:0{1}})_dynamic_truncater   formatencode)r   counterZtruncated_valuehotpr   r   r    generate/   s    
zHOTP.generatec                 C   s   t | ||stdd S )Nz#Supplied HOTP value does not match.)r   Zbytes_eqr(   r   )r   r'   r&   r   r   r    verify4   s    zHOTP.verifyc                 C   sj   t | j| j| j}|td| | }t	
|t|d d@ }|||d  }td|d d@ S )Nz>Q         z>Ir   i)r	   ZHMACr   r   r   updatestructZpackfinalizer   Z
indexbytesr   Zunpack)r   r&   ZctxZ
hmac_valueoffsetpr   r   r    r#   8   s    zHOTP._dynamic_truncatec                 C   s   t | d||dt|fgS )Nr'   r&   )r   int)r   Zaccount_namer&   Zissuerr   r   r    get_provisioning_uriA   s    

zHOTP.get_provisioning_uriN)T)__name__
__module____qualname__r!   r(   r)   r#   r3   r   r   r   r    r      s    
	r   )Z
__future__r   r   r   r.   r   Zcryptography.exceptionsr   r   Z'cryptography.hazmat.backends.interfacesr   Zcryptography.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    <module>   s   