File: //opt/alt/python37/lib/python3.7/site-packages/rsa/__pycache__/common.cpython-37.pyc
B
��f� � @ s� d Z ddlZG dd� de�Zeed�dd�Zeed�d d
�Zeeed�dd
�Zeeejeeef d�dd�Z eeed�dd�Z
eje eje ed�dd�Ze
dkr�ddlZe�� dS )z/Common functionality shared by several modules.� Nc s, e Zd Zdeeeedd�� fdd�
Z� ZS )�NotRelativePrimeError� N)�a�b�d�msg�returnc s0 t � �|pd|||f � || _|| _|| _d S )Nz.%d and %d are not relatively prime, divider=%i)�super�__init__r r r )�selfr r r r )� __class__� �;/opt/alt/python37/lib/python3.7/site-packages/rsa/common.pyr
s zNotRelativePrimeError.__init__)r )�__name__�
__module__�__qualname__�int�strr
�
__classcell__r
r
)r r r s r )�numr c
C sB y| � � S tk
r< } ztdt| � �|�W dd}~X Y nX dS )a�
Number of bits needed to represent a integer excluding any prefix
0 bits.
Usage::
>>> bit_size(1023)
10
>>> bit_size(1024)
11
>>> bit_size(1025)
11
:param num:
Integer value. If num is 0, returns 0. Only the absolute value of the
number is considered. Therefore, signed integers will be abs(num)
before the number's bit length is determined.
:returns:
Returns the number of bits in the integer.
z,bit_size(num) only supports integers, not %rN)�
bit_length�AttributeError� TypeError�type)r �exr
r
r �bit_size s r )�numberr c C s | dkrdS t t| �d�S )a�
Returns the number of bytes required to hold a specific long number.
The number of bytes is rounded up.
Usage::
>>> byte_size(1 << 1023)
128
>>> byte_size((1 << 1024) - 1)
128
>>> byte_size(1 << 1024)
129
:param number:
An unsigned integer
:returns:
The number of bytes required to hold a specific long number.
r � � )�ceil_divr )r r
r
r � byte_size8 s r )r �divr c C s t | |�\}}|r|d7 }|S )av
Returns the ceiling function of a division between `num` and `div`.
Usage::
>>> ceil_div(100, 7)
15
>>> ceil_div(100, 10)
10
>>> ceil_div(1, 4)
1
:param num: Division's numerator, a number
:param div: Division's divisor, a number
:return: Rounded up result of the division between the parameters.
r )�divmod)r r! �quanta�modr
r
r r Q s r )r r r c C s� d}d}d}d}| }|}xF|dkr^| | }|| | } }||| | }}||| | }}qW |dk rp||7 }|dk r�||7 }| ||fS )z;Returns a tuple (r, i, j) such that r = gcd(a, b) = ia + jbr r r
) r r �x�yZlxZlyZoa�ob�qr
r
r �extended_gcdi s
r) )r% �nr c C s( t | |�\}}}|dkr$t| ||��|S )z�Returns the inverse of x % n under multiplication, a.k.a x^-1 (mod n)
>>> inverse(7, 4)
3
>>> (inverse(143, 4) * 143) % 4
1
r )r) r )r% r* �divider�inv�_r
r
r �inverse� s r. )�a_values�
modulo_valuesr c C s` d}d}x|D ]}||9 }qW x<t || �D ].\}}|| }t||�}||| | | }q*W |S )a� Chinese Remainder Theorem.
Calculates x such that x = a[i] (mod m[i]) for each i.
:param a_values: the a-values of the above equation
:param modulo_values: the m-values of the above equation
:returns: x such that x = a[i] (mod m[i]) for each i
>>> crt([2, 3], [3, 5])
8
>>> crt([2, 3, 2], [3, 5, 7])
23
>>> crt([2, 3, 0], [7, 11, 15])
135
r r )�zipr. ) r/ r0 �mr% ZmoduloZm_iZa_iZM_ir, r
r
r �crt� s
r3 �__main__)�__doc__�typing�
ValueErrorr r r r r �Tupler) r. �Iterabler3 r �doctest�testmodr
r
r
r �<module> s #