a
    còf   ã                   @  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d	d
ddœdd„ZG dd„ dƒZdS )é    )ÚannotationsN)ÚquoteÚ	urlencode)Úconstant_timeÚhmac)ÚSHA1ÚSHA256ÚSHA512)ÚInvalidTokenÚHOTPÚstrú
str | Nonezlist[tuple[str, int]])ÚhotpÚ	type_nameÚaccount_nameÚissuerÚextra_parametersÚreturnc                 C  s„   d| j fdt | j¡fd| jj ¡ fg}|d ur>| d|f¡ | |¡ |rbt	|ƒ› 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%   új/home/httpd/docs/test/DocsMgr/lib/python3.9/site-packages/cryptography/hazmat/primitives/twofactor/hotp.pyÚ_generate_uri   s    ý
ÿýr'   c                   @  sl   e Zd Zdddddddd	œd
d„Zdddœdd„Zddddœdd„Zdddœdd„Zdddddœdd„ZdS )r   NTÚbytesÚintÚHOTPHashTypesz
typing.AnyÚboolÚNone)ÚkeyÚlengthr   ÚbackendÚenforce_key_lengthr   c                 C  st   t |ƒdk r|du rtdƒ‚t|tƒs.tdƒ‚|dk s>|dkrFt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__)Úcounterr   c                 C  s*   |   |¡}|d| j  }d || j¡ ¡ S )Né
   z{0:0{1}})Ú_dynamic_truncater   ÚformatÚencode)r8   r:   Ztruncated_valuer   r%   r%   r&   ÚgenerateE   s    
zHOTP.generate)r   r:   r   c                 C  s   t  |  |¡|¡stdƒ‚d S )Nz#Supplied HOTP value does not match.)r   Zbytes_eqr?   r
   )r8   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 )	Nr3   Úbig)r.   Ú	byteorderé   é   é   )rB   iÿÿÿ)
r   ÚHMACr   r   ÚupdateÚto_bytesÚfinalizer4   r)   Ú
from_bytes)r8   r:   ÚctxZ
hmac_valueÚoffsetÚpr%   r%   r&   r<   N   s    zHOTP._dynamic_truncater   r   )r   r:   r   r   c                 C  s   t | d||dt|ƒfgƒS )Nr   r:   )r'   r)   )r8   r   r:   r   r%   r%   r&   Úget_provisioning_uriW   s    ÿzHOTP.get_provisioning_uri)NT)Ú__name__Ú
__module__Ú__qualname__r9   r?   r@   r<   rN   r%   r%   r%   r&   r   ,   s     ú	)Ú
__future__r   r   ÚtypingÚurllib.parser   r   Zcryptography.hazmat.primitivesr   r   Z%cryptography.hazmat.primitives.hashesr   r   r	   Z(cryptography.hazmat.primitives.twofactorr
   ÚUnionr*   r'   r   r%   r%   r%   r&   Ú<module>   s   