U
    ʹh                     @  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	d
dd	dddZG dd dZdS )    )annotationsN)quote	urlencode)constant_timehmac)SHA1SHA256SHA512)InvalidToken)Buffer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 k	r>|d|f || |rbt	| dt	| nt	|}d| d| dt
| S )	NdigitsZsecret	algorithmr   :z
otpauth:///?)_lengthbase64Z	b32encode_key
_algorithmnameupperappendextendr   r   )r   r   r   r   r   Z
parametersZlabel r"   S./venv/lib/python3.8/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   NTr   intHOTPHashTypesz
typing.AnyboolNone)keylengthr   backendenforce_key_lengthr   c                 C  st   t |dk r|dk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+   r,   r"   r"   r#   __init__.   s    
zHOTP.__init__bytes)counterr   c                 C  s<   t |tstd| |}|d| j  }d|| j S )Nz*Counter parameter must be an integer type.
   z{0:0{1}})r2   r%   r3   _dynamic_truncater   formatencode)r4   r7   Ztruncated_valuer   r"   r"   r#   generateF   s
    

zHOTP.generate)r   r7   r   c                 C  s   t | ||stdd S )Nz#Supplied HOTP value does not match.)r   Zbytes_eqr<   r
   )r4   r   r7   r"   r"   r#   verifyN   s    zHOTP.verifyc                 C  s   t | j| j}z||jddd W n$ tk
rL   tdd dY nX | }|t	|d  d@ }|||d	  }t
j|dd
d@ S )Nr/   Zbig)r*   	byteorderzCounter must be between 0 and l    .         )r>   i)r   ZHMACr   r   updateto_bytesOverflowErrorr1   finalizer0   r%   
from_bytes)r4   r7   ZctxZ
hmac_valueoffsetpr"   r"   r#   r9   R   s    zHOTP._dynamic_truncater   r   )r   r7   r   r   c                 C  s   t | d||dt|fgS )Nr   r7   )r$   r%   )r4   r   r7   r   r"   r"   r#   get_provisioning_uri`   s        zHOTP.get_provisioning_uri)NT)__name__
__module____qualname__r5   r<   r=   r9   rJ   r"   r"   r"   r#   r   -   s     )Z
__future__r   r   typingZurllib.parser   r   Zcryptography.hazmat.primitivesr   r   Z%cryptography.hazmat.primitives.hashesr   r   r	   Z(cryptography.hazmat.primitives.twofactorr
   Zcryptography.utilsr   ZUnionr&   r$   r   r"   r"   r"   r#   <module>   s   