B
    ó±ô`
  ã               @   s˜   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 ejeeef ZG d	d
„ d
eƒZdS )é    N)ÚUnsupportedAlgorithmÚ_Reasons)Ú_get_backend)ÚHMACBackend)Úconstant_timeÚhmac)ÚSHA1ÚSHA256ÚSHA512)ÚInvalidToken)Ú_generate_uric               @   sn   e Zd Zdeeee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 )ÚHOTPNT)ÚkeyÚlengthÚ	algorithmÚenforce_key_lengthc             C   s˜   t |ƒ}t|tƒstdtjƒ‚t|ƒdk r:|dkr:tdƒ‚t|tƒsLt	dƒ‚|dk s\|dkrdt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
   Ú_keyÚ_lengthÚ
_algorithmÚ_backend)Úselfr   r   r   Úbackendr   © r    ú\/home/dcms/DCMS/lib/python3.7/site-packages/cryptography/hazmat/primitives/twofactor/hotp.pyÚ__init__   s"    

zHOTP.__init__)ÚcounterÚreturnc             C   s*   |   |¡}|d| j  }d || j¡ ¡ S )Né
   z{0:0{1}})Ú_dynamic_truncater   ÚformatÚencode)r   r#   Ztruncated_valueÚhotpr    r    r!   Úgenerate6   s    
zHOTP.generate)r)   r#   r$   c             C   s   t  |  |¡|¡stdƒ‚d S )Nz#Supplied HOTP value does not match.)r   Zbytes_eqr*   r   )r   r)   r#   r    r    r!   Úverify;   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   r   ÚupdateÚstructÚpackÚfinalizer   Úunpack)r   r#   ÚctxZ
hmac_valueÚoffsetÚpr    r    r!   r&   ?   s    zHOTP._dynamic_truncate)Úaccount_namer#   Úissuerr$   c             C   s   t | d||dt|ƒfgƒS )Nr)   r#   )r   r   )r   r8   r#   r9   r    r    r!   Úget_provisioning_uriH   s    zHOTP.get_provisioning_uri)NT)Ú__name__Ú
__module__Ú__qualname__Úbytesr   Ú_ALLOWED_HASH_TYPESÚboolr"   r*   r+   r&   ÚstrÚtypingÚOptionalr:   r    r    r    r!   r      s    
r   )r1   rB   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   ÚUnionr?   Úobjectr   r    r    r    r!   Ú<module>   s   