U
    EZh                     @   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eeeje ejejeef  ed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 k	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"   t/home/aprabhat/apps/x.techxrdev.in/venv/lib/python3.8/site-packages/cryptography/hazmat/primitives/twofactor/hotp.py_generate_uri   s    
r$   c                   @   st   e Zd ZdeeeejeddddZ	eedddZ
eedd	d
dZeedddZeeeje edddZdS )r
   NT)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
isinstanceint	TypeErrorr   r   r   r   r   r   )selfr%   r&   r   r'   r(   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)r1   r3   Ztruncated_valuer   r"   r"   r#   generateD   s    
zHOTP.generate)r   r3   r   c                 C   s   t | ||stdd S )Nz#Supplied HOTP value does not match.)r   Zbytes_eqr8   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   ctxZ
hmac_valueoffsetpr"   r"   r#   r5   M   s    zHOTP._dynamic_truncate)r   r3   r   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/   HOTPHashTypestypingAnyboolr2   r8   r9   r5   strOptionalrG   r"   r"   r"   r#   r
   +   s$     
  )r   rM   urllib.parser   r   Zcryptography.hazmat.primitivesr   r   Z%cryptography.hazmat.primitives.hashesr   r   r   Z(cryptography.hazmat.primitives.twofactorr	   UnionrL   rP   rQ   ListTupler/   r$   r
   r"   r"   r"   r#   <module>   s   