o
    ™¨Êh
  ã                   @   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                   @   s8   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 r|du rtdƒ‚t |tjƒs#t	dƒ‚|dk s+|dkr/t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.)Ú
isinstancer   r   r   ÚBACKEND_MISSING_INTERFACEÚlenÚ
ValueErrorÚsixÚinteger_typesÚ	TypeErrorr
   r   r   Ú_keyÚ_lengthÚ
_algorithmÚ_backend)ÚselfÚkeyÚlengthÚ	algorithmÚbackendÚenforce_key_length© r$   ú_/var/www/html/env/lib/python3.10/site-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   ÚcounterÚ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   Ú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	   ÚHMACr   r   r   ÚupdateÚstructÚpackÚfinalizer   Ú
indexbytesr   Úunpack)r   r+   ÚctxÚ
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   Úaccount_namer+   Úissuerr$   r$   r%   Úget_provisioning_uriA   s   

ÿzHOTP.get_provisioning_uriN)T)Ú__name__Ú
__module__Ú__qualname__r&   r.   r0   r(   rB   r$   r$   r$   r%   r      s    
ÿ	r   )Ú
__future__r   r   r   r6   r   Úcryptography.exceptionsr   r   Ú'cryptography.hazmat.backends.interfacesr   Úcryptography.hazmat.primitivesr   r	   Ú%cryptography.hazmat.primitives.hashesr
   r   r   Ú(cryptography.hazmat.primitives.twofactorr   Ú.cryptography.hazmat.primitives.twofactor.utilsr   Úobjectr   r$   r$   r$   r%   Ú<module>   s   