o
    ÖèFh   ã                   @  sˆ   d dl mZ d dlZd dlZd dlmZmZ d dlmZm	Z	 d dl
mZmZmZ d dlmZ ejeeef Zddd„ZG dd„ dƒZdS )é    )ÚannotationsN)ÚquoteÚ	urlencode)Úconstant_timeÚhmac)ÚSHA1ÚSHA256ÚSHA512)ÚInvalidTokenÚhotpÚHOTPÚ	type_nameÚstrÚaccount_nameÚissuerú
str | NoneÚextra_parametersúlist[tuple[str, int]]Úreturnc                 C  s„   d| j fdt | j¡fd| jj ¡ fg}|d ur| d|f¡ | |¡ |r1t	|ƒ› dt	|ƒ› �nt	|ƒ}d|› d|› dt
|ƒ› �S )	NÚdigitsÚsecretÚ	algorithmr   ú:z
otpauth://ú/ú?)Ú_lengthÚbase64Ú	b32encodeÚ_keyÚ
_algorithmÚnameÚupperÚappendÚextendr   r   )r   r   r   r   r   Ú
parametersÚlabel© r&   úf/var/www/html/loop/nvenv/lib/python3.10/site-packages/cryptography/hazmat/primitives/twofactor/hotp.pyÚ_generate_uri   s   ý
ÿýr(   c                   @  sD   e Zd Z		dd dd„Zd!dd„Zd"dd„Zd#dd„Zd$dd„ZdS )%r   NTÚkeyÚbytesÚlengthÚintr   ÚHOTPHashTypesÚbackendú
typing.AnyÚenforce_key_lengthÚboolr   ÚNonec                 C  st   t |ƒdk r|du rtdƒ‚t|tƒstdƒ‚|dk s|dkr#tdƒ‚t|tttfƒs/tdƒ‚|| _|| _	|| _
d S )	Né   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 and 8.z)Algorithm must be SHA1, SHA256 or SHA512.)ÚlenÚ
ValueErrorÚ
isinstancer,   Ú	TypeErrorr   r   r	   r   r   r   )Úselfr)   r+   r   r.   r0   r&   r&   r'   Ú__init__-   s   

zHOTP.__init__Úcounterc                 C  s*   |   |¡}|d| j  }d || j¡ ¡ S )Né
   z{0:0{1}})Ú_dynamic_truncater   ÚformatÚencode)r:   r<   Útruncated_valuer   r&   r&   r'   ÚgenerateE   s   
zHOTP.generater   c                 C  s   t  |  |¡|¡stdƒ‚d S )Nz#Supplied HOTP value does not match.)r   Úbytes_eqrB   r
   )r:   r   r<   r&   r&   r'   ÚverifyJ   s   ÿzHOTP.verifyc                 C  sb   t  | j| j¡}| |jddd�¡ | ¡ }|t|ƒd  d@ }|||d … }tj	|dd�d@ S )	Nr5   Úbig)r+   Ú	byteorderé   é   é   )rF   iÿÿÿ)
r   ÚHMACr   r   ÚupdateÚto_bytesÚfinalizer6   r,   Ú
from_bytes)r:   r<   ÚctxÚ
hmac_valueÚoffsetÚpr&   r&   r'   r>   N   s   zHOTP._dynamic_truncater   r   r   r   c                 C  s   t | d||dt|ƒfgƒS )Nr   r<   )r(   r,   )r:   r   r<   r   r&   r&   r'   Úget_provisioning_uriW   s   ÿzHOTP.get_provisioning_uri)NT)r)   r*   r+   r,   r   r-   r.   r/   r0   r1   r   r2   )r<   r,   r   r*   )r   r*   r<   r,   r   r2   )r<   r,   r   r,   )r   r   r<   r,   r   r   r   r   )Ú__name__Ú
__module__Ú__qualname__r;   rB   rD   r>   rS   r&   r&   r&   r'   r   ,   s    ú


	)r   r   r   r   r   r   r   r   r   r   r   r   )Ú
__future__r   r   ÚtypingÚurllib.parser   r   Úcryptography.hazmat.primitivesr   r   Ú%cryptography.hazmat.primitives.hashesr   r   r	   Ú(cryptography.hazmat.primitives.twofactorr
   ÚUnionr-   r(   r   r&   r&   r&   r'   Ú<module>   s   
