o
    àý°j¸  ã                   @  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 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)ÚBufferÚ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'   ú /root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/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Úkeyr   Ú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__ÚcounterÚbytesc                 C  s<   t |tƒs	tdƒ‚|  |¡}|d| j  }d || j¡ ¡ S )Nz*Counter parameter must be an integer type.é
   z{0:0{1}})r8   r,   r9   Ú_dynamic_truncater   ÚformatÚencode)r:   r<   Útruncated_valuer   r'   r'   r(   ÚgenerateF   s
   

zHOTP.generater   c                 C  s   t  |  |¡|¡stdƒ‚d S )Nz#Supplied HOTP value does not match.)r   Úbytes_eqrC   r
   )r:   r   r<   r'   r'   r(   ÚverifyN   s   ÿzHOTP.verifyc                 C  s†   t  | j| j¡}z| |jddd�¡ W n ty#   tdd› d�ƒ‚w | ¡ }|t	|ƒd  d@ }|||d	 … }t
j|dd
�d@ S )Nr5   Úbig)r+   Ú	byteorderzCounter must be between 0 and l   ÿÿÿÿ Ú.é   é   é   )rG   iÿÿÿ)r   ÚHMACr   r    ÚupdateÚto_bytesÚOverflowErrorr7   Úfinalizer6   r,   Ú
from_bytes)r:   r<   ÚctxÚ
hmac_valueÚoffsetÚpr'   r'   r(   r?   R   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_uri`   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;   rC   rE   r?   rV   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
   Úcryptography.utilsr   ÚUnionr-   r)   r   r'   r'   r'   r(   Ú<module>   s   
