
    a                     T    d Z ddlZddlmZ ddlmZmZ ddlmZ d Z	 G d de
      Zy)	z,
Utility functions for dealing with primes.
    N)util)	byte_masklong)SSHExceptionc                    t        j                  | dz
        }|dz   dz  }t        d|dz        dz
  }	 t        j                  |      }|dkD  rt        |d   |      |dd z   }t        j                  |d      }|| k  r	 |S N)z returns a random # from 0 to N-1            r   N)r   
bit_lengthpowosurandomr   inflate_long)nbits
byte_count
hbyte_maskxnums         /lib/python3.12/site-packages/paramiko/primes.py_roll_randomr      s    ??1q5!D(qJQq!A%J JJz">!A$
+ae3A1%7J     c                   (    e Zd ZdZd Zd Zd Zd Zy)ModulusPackzx
    convenience object for holding the contents of the /etc/ssh/moduli file,
    on systems that have such a file.
    c                      i | _         g | _        y )N)pack	discarded)selfs    r   __init__zModulusPack.__init__:   s    	r   c                 N   |j                         \  }}}}}}}t        |      }t        |      }t        |      }t        |      }t        |      }t        |d      }|dk  s|dk  s|dz  r(|dk  r#|dk  r| j                  j	                  |df       y |dk(  rd}t        j                  |      }	|	|k7  r5|	|dz   k7  r-| j                  j	                  |d	j                  |      f       y |	| j                  vrg | j                  |	<   | j                  |	   j	                  ||f       y )
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_typeteststriessize	generatormodulusbls
             r   _parse_moduluszModulusPack._parse_modulus?   s/    JJL	
x=E
E
4y	N	w# qLqy	eaiECKNN!!<= >I
 __W%$JR4!8^NN!!>EEdKL TYYDIIbM		"i12r   c                     i | _         t        |d      5 }|D ];  }|j                         }t        |      dk(  s|d   dk(  r*	 | j	                  |       = 	 ddd       y#  Y LxY w# 1 sw Y   yxY w)zM
        :raises IOError: passed from any file operations that fail.
        rr   #N)r   openstriplenr2   )r   filenamefr)   s       r   	read_filezModulusPack.read_filem   s     	(C  	A zz|INQ3''-	 		 	s#   -A&AA&A#!A&&A/c                    t        | j                  j                               }t        |      dk(  rt	        d      d}|D ]  }||k\  s	||k  s||k  s|dk(  s|} |dk(  r|D ]  }||k\  s	||k  s||kD  s|} |dk(  r|d   }||kD  r|d   }t        t        | j                  |               }| j                  |   |   S )Nr   zno moduli available)sortedr   keysr8   r   r   )r   minprefermaxbitsizesgoodbr   s           r   get_moduluszModulusPack.get_modulus|   s    $))..*+x=A455 	AV!s(TTRZ	 2: H18!d(D 2:
 A;DTz|TYYt_-.yyq!!r   N)__name__
__module____qualname____doc__r    r2   r;   rF    r   r   r   r   4   s    

,3\"r   r   )rJ   r   paramikor   paramiko.py3compatr   r   paramiko.ssh_exceptionr   r   objectr   rK   r   r   <module>rP      s+   & 
  . /,`"& `"r   