o
    
c                     @   s   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ed	ed
eje dejejeef  defddZG dd dZdS )    N)quote	urlencode)constant_timehmac)SHA1SHA256SHA512)InvalidTokenhotp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 || |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"   Z/opt/certbot/lib/python3.10/site-packages/cryptography/hazmat/primitives/twofactor/hotp.py_generate_uri   s   
r$   c                   @   s   e Zd Z		ddedededejdeddfd	d
Z	dedefddZ
dededdfddZdedefddZdededeje defddZdS )r   NT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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
isinstanceint	TypeErrorr   r   r   r   r   r   )selfr%   r&   r   r'   r(   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)r1   r3   truncated_valuer
   r"   r"   r#   generateD   s   
zHOTP.generater
   c                 C   s   t | ||stdd S )Nz#Supplied HOTP value does not match.)r   bytes_eqr9   r	   )r1   r
   r3   r"   r"   r#   verifyI   s   zHOTP.verifyc                 C   sb   t | j| j}||jddd | }|t|d  d@ }|||d  }tj	|ddd@ S )	Nr+   big)r&   	byteorder         )r=   i)
r   HMACr   r   updateto_bytesfinalizer,   r/   
from_bytes)r1   r3   ctx
hmac_valueoffsetpr"   r"   r#   r5   M   s   zHOTP._dynamic_truncater   r   c                 C   s   t | d||dt|fgS )Nr
   r3   )r$   r/   )r1   r   r3   r   r"   r"   r#   get_provisioning_uriV   s   zHOTP.get_provisioning_uri)NT)__name__
__module____qualname__bytesr/   _ALLOWED_HASH_TYPEStypingAnyboolr2   r9   r;   r5   strOptionalrJ   r"   r"   r"   r#   r   +   s8    
	)r   rP   urllib.parser   r   cryptography.hazmat.primitivesr   r   %cryptography.hazmat.primitives.hashesr   r   r   (cryptography.hazmat.primitives.twofactorr	   UnionrO   rS   rT   ListTupler/   r$   r   r"   r"   r"   r#   <module>   s*   
