<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
        integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
</html>
3
lá˜_w
  ã               @   sœ   d dl mZmZmZ d dlZd dlZd dlmZmZ d dl	m
Z
 d dl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 G d
d„ deƒZdS )é    )Úabsolute_importÚdivisionÚprint_functionN)ÚUnsupportedAlgorithmÚ_Reasons)Ú_get_backend)ÚHMACBackend)Úconstant_timeÚhmac)ÚSHA1ÚSHA256ÚSHA512)ÚInvalidToken)Ú_generate_uric               @   s6   e Zd Zddd„Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )ÚHOTPNTc             C   sš   t |ƒ}t|tƒstdtjƒ‚t|ƒdk r:|dkr:tdƒ‚t|tj	ƒsNt
dƒ‚|dk s^|dkrft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ÚsixZinteger_typesÚ	TypeErrorr   r   r   Ú_keyÚ_lengthÚ
_algorithmÚ_backend)ÚselfÚkeyZlengthÚ	algorithmZbackendZenforce_key_length© r    ú/usr/lib64/python3.6/hotp.pyÚ__init__   s"    
zHOTP.__init__c             C   s*   | j |ƒ}|d| j  }dj|| jƒjƒ S )Né
   z{0:0{1}})Ú_dynamic_truncater   ÚformatÚencode)r   ÚcounterZtruncated_valueÚhotpr    r    r!   Úgenerate0   s    
zHOTP.generatec             C   s   t j| j|ƒ|ƒstdƒ‚d S )Nz#Supplied HOTP value does not match.)r	   Zbytes_eqr)   r   )r   r(   r'   r    r    r!   Úverify5   s    zHOTP.verifyc             C   sj   t j| j| j| jƒ}|jtjd|ƒƒ |jƒ }t	j
|t|ƒd ƒd@ }|||d … }tjd|ƒd d@ S )Nz>Qé   é   é   z>Ir   iÿÿÿ)r
   ZHMACr   r   r   ÚupdateÚstructÚpackÚfinalizer   Z
indexbytesr   Úunpack)r   r'   ZctxZ
hmac_valueÚoffsetÚpr    r    r!   r$   9   s    zHOTP._dynamic_truncatec             C   s   t | d||dt|ƒfgƒS )Nr(   r'   )r   Úint)r   Zaccount_namer'   Zissuerr    r    r!   Úget_provisioning_uriB   s    zHOTP.get_provisioning_uri)NT)Ú__name__Ú
__module__Ú__qualname__r"   r)   r*   r$   r6   r    r    r    r!   r      s
   
	r   )Z
__future__r   r   r   r/   r   Zcryptography.exceptionsr   r   Zcryptography.hazmat.backendsr   Z'cryptography.hazmat.backends.interfacesr   Zcryptography.hazmat.primitivesr	   r
   Z%cryptography.hazmat.primitives.hashesr   r   r   Z(cryptography.hazmat.primitives.twofactorr   Z.cryptography.hazmat.primitives.twofactor.utilsr   Úobjectr   r    r    r    r!   Ú<module>   s   