o
    þÑÐb-  ã                   @   sà   d dl 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
 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
eƒZ dS )é    N)ÚquoteÚ	urlencode)ÚUnsupportedAlgorithmÚ_Reasons)Ú_get_backend)ÚBackendÚHMACBackend)Ú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¡ | |¡ ||r1dt	|ƒt	|ƒf nt	|ƒt
|ƒdœ}djdi |¤ŽS )	NÚdigitsÚsecretÚ	algorithmr   z%s:%s)ÚtypeÚlabelÚ
parametersz%otpauth://{type}/{label}?{parameters}© )Ú_lengthÚbase64Ú	b32encodeÚ_keyÚ
_algorithmÚnameÚupperÚappendÚextendr   r   Úformat)r   r   r   r   r   r   Zuripartsr   r   úl/var/www/secure340b-portal/env/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e 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   s˜   t |ƒ}t|tƒstdtjƒ‚t|ƒdk r|du rtdƒ‚t|tƒs&t	dƒ‚|dk s.|dkr2tdƒ‚t|t
ttfƒs>t	d	ƒ‚|| _|| _|| _|| _d S )
Nz.Backend object does not implement HMACBackend.é   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 to 8.z)Algorithm must be SHA1, SHA256 or SHA512.)r   Ú
isinstancer   r   r   ZBACKEND_MISSING_INTERFACEÚlenÚ
ValueErrorÚintÚ	TypeErrorr   r   r   r    r   r!   Ú_backend)Úselfr)   r*   r   r+   r,   r   r   r'   Ú__init__5   s$   
þ

zHOTP.__init__Úcounterc                 C   s*   |   |¡}|d| j  }d || j¡ ¡ S )Né
   z{0:0{1}})Ú_dynamic_truncater   r&   Úencode)r6   r8   Ztruncated_valuer   r   r   r'   ÚgenerateU   s   
zHOTP.generater   c                 C   s   t  |  |¡|¡stdƒ‚d S )Nz#Supplied HOTP value does not match.)r	   Zbytes_eqr<   r   )r6   r   r8   r   r   r'   ÚverifyZ   s   ÿzHOTP.verifyc                 C   sf   t  | j| j| j¡}| t d|¡¡ | ¡ }|t	|ƒd  d@ }|||d … }t 
d|¡d d@ S )Nz>Qé   é   é   z>Ir   iÿÿÿ)r
   ÚHMACr    r!   r5   ÚupdateÚstructÚpackÚfinalizer1   Úunpack)r6   r8   ÚctxZ
hmac_valueÚoffsetÚpr   r   r'   r:   ^   s   zHOTP._dynamic_truncater   r   c                 C   s   t | d||dt|ƒfgƒS )Nr   r8   )r(   r3   )r6   r   r8   r   r   r   r'   Úget_provisioning_urig   s   ÿzHOTP.get_provisioning_uri)NT)Ú__name__Ú
__module__Ú__qualname__Úbytesr3   Ú_ALLOWED_HASH_TYPESÚtypingÚOptionalr   Úboolr7   r<   r=   r:   ÚstrrJ   r   r   r   r'   r   4   s8    úþýüûú
ù 	ÿÿÿþ)!r   rC   rP   Úurllib.parser   r   Zcryptography.exceptionsr   r   Zcryptography.hazmat.backendsr   Z'cryptography.hazmat.backends.interfacesr   r   Zcryptography.hazmat.primitivesr	   r
   Z%cryptography.hazmat.primitives.hashesr   r   r   Z(cryptography.hazmat.primitives.twofactorr   ÚUnionrO   rS   rQ   ÚListÚTupler3   r(   Úobjectr   r   r   r   r'   Ú<module>   s2   ÿþýüû
ú