o
    k9_                     @   s   d dl mZ d dl mZ d dlZd dlZd dlZd dlZddlmZ ddl	m
Z
mZmZmZmZmZmZmZ g dZedZddededefddZdededefddZdededefddZ	d dedededededefddZdeddfddZdS )!    )absolute_import)divisionN   )_bcrypt)
__author____copyright__	__email____license____summary__	__title____uri____version__)r   r
   r   r   r   r   r	   r   gensalthashpwkdfcheckpws   ^\$2y\$      2broundsprefixreturnc                 C   s~   |dvrt d| dk s| dkrt dtd}tjdd}tj||t| d	| d	 d
|  	d d	 tj
| S )N)s   2ar   z%Supported prefixes are b'2a' or b'2b'      zInvalid rounds   char[]      $z%2.2uascii)
ValueErrorosurandomr   ffinewlibencode_base64lenencodestring)r   r   saltoutput r*   1/usr/lib/python3/dist-packages/bcrypt/__init__.pyr   9   s&   

r   passwordr(   c                 C   s   t | tjst |tjrtdd| v rtd| d d } |td|}}tj	dd}tj
| ||t|}|dkrAtd	|d d
 tj|d
d   S )N.Unicode-objects must be encoded before hashing    z"password may not contain NUL bytesH   s   $2b$r      r   zInvalid saltr   )
isinstancesix	text_type	TypeErrorr   _normalize_resubr   r!   r"   r#   bcrypt_hashpassr%   r'   )r,   r(   original_salthashedretvalr*   r*   r+   r   N   s    r   hashed_passwordc                 C   sn   t | tjst |tjrtdd| v sd|v rtdt| |}t|t|kr+dS tj	||t|dkS )Nz/Unicode-objects must be encoded before checkingr.   z6password and hashed_password may not contain NUL bytesFr   )
r1   r2   r3   r4   r   r   r%   r   r#   timingsafe_bcmp)r,   r;   retr*   r*   r+   r   t   s   
r   Fdesired_key_bytesignore_few_roundsc              	   C   s   t | tjst |tjrtdt| dkst|dkr td|dks(|dkr,td|dk r4td|dk rE|sEtjd	|t	d
d t
jd|}t
j| t| |t||t||}t|dk t
j||d d  S )Nr-   r   z#password and salt must not be emptyi   zdesired_key_bytes must be 1-512r   zrounds must be 1 or more2   zrWarning: bcrypt.kdf() called with only {0} round(s). This few is not secure: the parameter is linear, like PBKDF2.   )
stacklevelz	uint8_t[])r1   r2   r3   r4   r%   r   warningswarnformatUserWarningr   r!   r"   r#   bcrypt_pbkdf_bcrypt_assertbuffer)r,   r(   r>   r   r?   keyresr*   r*   r+   r      s*   	r   okc                 C   s   | st dd S )Nzbcrypt assertion failed)SystemError)rL   r*   r*   r+   rH      s   rH   )r   r   )F)
__future__r   r   r   rerC   r2    r   	__about__r   r   r   r	   r
   r   r   r   __all__compiler5   intbytesr   r   boolr   r   rH   r*   r*   r*   r+   <module>   s8   (
&
)