o
    Z2h                     @  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'   ~/home/skpark/git/infrasmart_work/infrasmart/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   
