o
    ç÷¡gó  ã                   @   sJ   d Z ddlZddlmZ ddlmZ ddlmZ dd„ ZG dd	„ d	ƒZ	dS )
z,
Utility functions for dealing with primes.
é    N)Úutil)Ú	byte_mask)ÚSSHExceptionc                 C   sv   t  | d ¡}|d d }td|d ƒd }	 t |¡}|dkr-t|d |ƒ|dd…  }t  |d¡}|| k r:	 |S q)z returns a random # from 0 to N-1é   é   é   é   Tr   N)r   Ú
bit_lengthÚpowÚosÚurandomr   Úinflate_long)ÚnÚbitsÚ
byte_countÚ
hbyte_maskÚxÚnum© r   ú:/usr/local/lib/python3.10/dist-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 s8|dk s8|d@ rB|dk rB|dk rB| j |df¡ d S |dkrHd}t |¡}	|	|krd|	|d krd| j |d	 |¡f¡ d S |	| jvrng | j|	< | j|	  ||f¡ d S )
Né   r   é   r   éd   z does not meet basic requirementsr   r   z"incorrectly reported bit length {})ÚsplitÚintr   Úappendr   r	   Úformatr   )
r   ÚlineÚ	timestampÚmod_typeÚtestsÚtriesÚsizeÚ	generatorÚmodulusÚblr   r   r   Ú_parse_modulus?   sF   	ø
ÿÿ
ÿ

zModulusPack._parse_modulusc                 C   sz   i | _ t|dƒ�+}|D ]}| ¡ }t|ƒdks|d dkrqz|  |¡ W q   Y qW d  ƒ dS 1 s6w   Y  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 s'|dkr)|}q|dkrA|D ]}||kr@||kr@||kr@|}q0|dkrQ|d }||krQ|d }tt| j| ƒƒ}| j| | S )Nr   zno moduli availableéÿÿÿÿ)Úsortedr   Úkeysr1   r   r   )r   ÚminÚpreferÚmaxÚbitsizesÚgoodÚbr   r   r   r   Úget_modulus|   s&    €€zModulusPack.get_modulusN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r,   r4   r>   r   r   r   r   r   4   s    .r   )
rB   r   Úparamikor   Úparamiko.commonr   Úparamiko.ssh_exceptionr   r   r   r   r   r   r   Ú<module>   s   