U
    ÓZj  ã                   @   sP   d Z ddlZddlmZ ddlmZmZ ddlmZ dd„ Z	G dd	„ d	e
ƒZdS )
z,
Utility functions for dealing with primes.
é    N)Úutil)Ú	byte_maskÚlong)ÚSSHExceptionc                 C   st   t  | d ¡}|d d }td|d ƒd }t |¡}|dkrXt|d |ƒ|dd…  }t  |d¡}|| k r,qpq,|S )z returns a random # from 0 to N-1é   é   é   é   r   N)r   Ú
bit_lengthÚpowÚosÚurandomr   Zinflate_long)ÚnÚbitsZ
byte_countZ
hbyte_maskÚxÚnum© r   úR/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/paramiko/primes.pyÚ_roll_random   s    	
r   c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚModulusPackzx
    convenience object for holding the contents of the /etc/ssh/moduli file,
    on systems that have such a file.
    c                 C   s   i | _ g | _d S )N)ÚpackÚ	discarded)Úselfr   r   r   Ú__init__:   s    zModulusPack.__init__c           
      C   sô   |  ¡ \}}}}}}}t|ƒ}t|ƒ}t|ƒ}t|ƒ}t|ƒ}t|dƒ}|dk sp|dk sp|d@ r„|dk r„|dk r„| j |df¡ d S |dkr�d}t |¡}	|	|krÈ|	|d krÈ| j |d	 |¡f¡ d S |	| jkrÜg | j|	< | j|	  ||f¡ d S )
Né   r	   é   r   éd   z does not meet basic requirementsr   r   z"incorrectly reported bit length {})	ÚsplitÚintr   r   Úappendr   r
   Úformatr   )
r   ÚlineÚ	timestampÚmod_typeZtestsÚtriesÚsizeÚ	generatorÚmodulusÚblr   r   r   Ú_parse_modulus?   sP    	ø
ÿþýýýÿ
ÿ

zModulusPack._parse_modulusc              	   C   sl   i | _ t|dƒ�R}|D ]F}| ¡ }t|ƒdks|d dkr<qz|  |¡ W q   Y qY qX qW 5 Q R X dS )zM
        :raises IOError: passed from any file operations that fail.
        Úrr   ú#N)r   ÚopenÚstripÚlenr)   )r   ÚfilenameÚfr!   r   r   r   Ú	read_filem   s    zModulusPack.read_filec                 C   sÂ   t | j ¡ ƒ}t|ƒdkr"tdƒ‚d}|D ](}||kr*||kr*||k sN|dkr*|}q*|dkr‚|D ] }||kr`||kr`||kr`|}q`|dkr¢|d }||kr¢|d }tt| j| ƒƒ}| j| | S )Nr   zno moduli availableéÿÿÿÿ)Úsortedr   Úkeysr.   r   r   )r   ÚminZpreferÚmaxZbitsizesZgoodÚbr   r   r   r   Úget_modulus|   s"     zModulusPack.get_modulusN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r)   r1   r8   r   r   r   r   r   4   s
   .r   )r<   r   Zparamikor   Zparamiko.py3compatr   r   Zparamiko.ssh_exceptionr   r   Úobjectr   r   r   r   r   Ú<module>   s   