o
    )%a
                     @   s   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 ejeeef ZG d	d
 d
eZdS )    N)UnsupportedAlgorithm_Reasons)_get_backend)HMACBackend)constant_timehmac)SHA1SHA256SHA512)InvalidToken)_generate_uric                	   @   s   e Zd Z		ddedededefddZd	ed
efddZded	ed
dfddZ	d	ed
efddZ
ded	edeje d
efddZdS )HOTPNTkeylength	algorithmenforce_key_lengthc                 C   s   t |}t|tstdtjt|dk r|du rtdt|ts&t	d|dk s.|dkr2t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   BACKEND_MISSING_INTERFACElen
ValueErrorint	TypeErrorr   r	   r
   _key_length
_algorithm_backend)selfr   r   r   backendr    r!   O/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/twofactor/hotp.py__init__   s$   


zHOTP.__init__counterreturnc                 C   s*   |  |}|d| j  }d|| j S )N
   z{0:0{1}})_dynamic_truncater   formatencode)r   r$   truncated_valuehotpr!   r!   r"   generate6   s   
zHOTP.generater+   c                 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"   verify;   s   zHOTP.verifyc                 C   sf   t | j| j| j}|td| | }|t	|d  d@ }|||d  }t
d|d d@ S )Nz>Q         z>Ir   i)r   HMACr   r   r   updatestructpackfinalizer   unpack)r   r$   ctx
hmac_valueoffsetpr!   r!   r"   r'   ?   s   zHOTP._dynamic_truncateaccount_nameissuerc                 C   s   t | d||dt|fgS )Nr+   r$   )r   r   )r   r<   r$   r=   r!   r!   r"   get_provisioning_uriH   s   zHOTP.get_provisioning_uri)NT)__name__
__module____qualname__bytesr   _ALLOWED_HASH_TYPESboolr#   r,   r.   r'   strtypingOptionalr>   r!   r!   r!   r"   r      s0    
 	r   )r4   rF   cryptography.exceptionsr   r   cryptography.hazmat.backendsr   'cryptography.hazmat.backends.interfacesr   cryptography.hazmat.primitivesr   r   %cryptography.hazmat.primitives.hashesr   r	   r
   (cryptography.hazmat.primitives.twofactorr   .cryptography.hazmat.primitives.twofactor.utilsr   UnionrC   objectr   r!   r!   r!   r"   <module>   s   