U
    *”}fw
  ã                   @   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 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)Ú_get_backend)Ú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 )ÚHOTPNTc                 C   sš   t |ƒ}t|tƒstdtjƒ‚t|ƒdk r:|dkr:tdƒ‚t|tj	ƒsNt
dƒ‚|dk s^|dkrftdƒ‚t|ttt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   ZBACKEND_MISSING_INTERFACEÚlenÚ
ValueErrorÚsixÚinteger_typesÚ	TypeErrorr   r   r   Ú_keyÚ_lengthÚ
_algorithmÚ_backend)ÚselfÚkeyÚlengthÚ	algorithmÚbackendZenforce_key_length© r#   úQ/tmp/pip-unpacked-wheel-x36vw73o/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$   Úgenerate0   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$   Úverify5   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
   ÚHMACr   r   r   ÚupdateÚstructÚpackÚfinalizer   Ú
indexbytesr   Úunpack)r   r*   ÚctxZ
hmac_valueÚoffsetÚpr#   r#   r$   r'   9   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_uriB   s        ÿzHOTP.get_provisioning_uri)NT)Ú__name__Ú
__module__Ú__qualname__r%   r,   r-   r'   r<   r#   r#   r#   r$   r      s      ÿ
	r   )Ú
__future__r   r   r   r3   r   Zcryptography.exceptionsr   r   Zcryptography.hazmat.backendsr   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   