File: //opt/alt/python38/lib64/python3.8/site-packages/Crypto/Util/__pycache__/number.cpython-38.pyc
U
��_�t � @ s2 d Z ddlmZmZ ddlmZ ddlZddlZddl T e
Zzddlm
Z
W n ek
rd dZ
Y nX e
dk r~e
js~ede� ddlT d d
� Zd+dd�Zd,d
d�Zd-dd�Zd.dd�Zdd� Zdd� Zd/dd�Zd0dd�Zd1dd�Zd2dd�ZddlZd3d d!�Zd"d#� ZddlZd4d$d%�Zd&d'� Z d(d)� Z!d*Z"dS )5z$Id$� )�"GetRandomNumber_DeprecationWarning�PowmInsecureWarning)�warnN)�*)� _fastmathzcNot using mpz_powm_sec. You should rebuild using libgmp >= 5 to avoid timing attack vulnerability.� c C s d}| |? r|d7 }q|S )zEsize(N:long) : int
Returns the size of the number N in bits.
r r � )�N�bitsr r �E/opt/alt/python38/lib64/python3.8/site-packages/Crypto/Util/number.py�sizeK s
r c C s t �dt� t| |�S )zBDeprecated. Use getRandomInteger or getRandomNBitInteger instead.z�Crypto.Util.number.getRandomNumber has confusing semanticsand has been deprecated. Use getRandomInteger or getRandomNBitInteger instead.)�warningsr r �getRandomNBitInteger)r �randfuncr r r �getRandomNumberT s �r c C s` |dkrt � t�� j}|| d? �}| d }|dkrTt|d��d| ? }t|�| }t|�}|S )z�getRandomInteger(N:int, randfunc:callable):long
Return a random number with at most N bits.
If randfunc is omitted, then Random.new().read is used.
This function is for internal use only and may be renamed or removed in
the future.
N� � r r )�_import_Random�Random�new�read�ordZbchr�
bytes_to_long)r r �SZodd_bits�char�valuer r r �getRandomInteger[ s
r c C s: || d }t |�}t||�}||kr2t||�}q| | S )a getRandomRange(a:int, b:int, randfunc:callable):long
Return a random number n so that a <= n < b.
If randfunc is omitted, then Random.new().read is used.
This function is for internal use only and may be renamed or removed in
the future.
r )r r )�a�br Zrange_r
r r r r �getRandomRangep s
r c C s2 t | d |�}|d| d O }t|�| ks.t�|S )a6 getRandomInteger(N:int, randfunc:callable):long
Return a random number with exactly N-bits, i.e. a random number
between 2**(N-1) and (2**N)-1.
If randfunc is omitted, then Random.new().read is used.
This function is for internal use only and may be renamed or removed in
the future.
r � )r r �AssertionError)r r r r r r r � s
r c C s, t | �} t |�}| dkr(|| | } }q|S )z=GCD(x:long, y:long): long
Return the GCD of x and y.
r )�abs)�x�yr r r �GCD� s
r% c C sl t | �t |� }}d\}}|dkrVt||�d }|||| }}|||| }}q|dk rh|| }qV|S )zDinverse(u:long, v:long):long
Return the inverse of u mod v.
)r r r )�int�divmod)�u�vZu3Zv3Zu1Zv1�qr r r �inverse� s
r+ c C s@ |dkrt � t�� j}t| |�dB }t||d�s<|d }q&|S )z�getPrime(N:int, randfunc:callable):long
Return a random N-bit prime number.
If randfunc is omitted, then Random.new().read is used.
Nr )r r )r r r r r �isPrime)r r Znumberr r r �getPrime� s
r- c C s� | dk s| d@ dkr| dkS | d }d}|}|d@ dkrJ|d7 }|dL }q,g }t t|| d ��D ]�}td| |�}||kr�td| |�}qp|�|� t||| �} | dks`| |kr�q`d}
t |�D ]0}| | | } | dkr� dS | |kr�d}
q�q�|
r` dS q`dS )aq _rabinMillerTest(n:long, rounds:int, randfunc:callable):int
Tests if n is prime.
Returns 0 when n is definitly composite.
Returns 1 when n is probably prime.
Returns 2 when n is definitly prime.
If randfunc is omitted, then Random.new().read is used.
This function is for internal use only and may be renamed or removed in
the future.
r r r r )�range�minr �append�pow)�n�roundsr Zn_1r �mZtested�ir �z� composite�rr r r �_rabinMillerTest� s8
r9 ���ư>c C s� t dk r t �t| �t|�||�S | dk s4| d dkr<td��tt�t�|� t�d� ��}| d d? }tdd d
d| d�d }ddd| >