o
    Df                     @  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/home/ubuntu/webapp/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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   
