o
    ÍtBhJ  ã                	   @   sÐ   d Z ddlZG dd„ deƒZdedefdd„Zd	edefd
d„Zdededefdd„Zdededejeeef fdd„Z	dededefdd„Z
deje deje defdd„ZedkrfddlZe ¡  dS dS )z/Common functionality shared by several modules.é    Nc                       s4   e Zd Zd
dededededdf
‡ fdd	„Z‡  ZS )ÚNotRelativePrimeErrorÚ ÚaÚbÚdÚmsgÚreturnNc                    s0   t ƒ  |pd|||f ¡ || _|| _|| _d S )Nz.%d and %d are not relatively prime, divider=%i)ÚsuperÚ__init__r   r   r   )Úselfr   r   r   r   ©Ú	__class__© úa/var/www/html/riverr-enterprise-integrations-main/venv/lib/python3.10/site-packages/rsa/common.pyr
      s   
zNotRelativePrimeError.__init__)r   )Ú__name__Ú
__module__Ú__qualname__ÚintÚstrr
   Ú__classcell__r   r   r   r   r      s    ,r   Únumr   c              
   C   s6   z|   ¡ W S  ty } z	tdt| ƒ ƒ|‚d}~ww )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   Únumberc                 C   s   | dkrdS 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!   Údivc                 C   s   t | |ƒ\}}|r|d7 }|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   c           	      C   sŒ   d}d}d}d}| }|}|dkr1| | }|| | } }|||  |}}|||  |}}|dks|dk r9||7 }|dk rA||7 }| ||fS )z@Returns a tuple (r, i, j) such that r = gcd(a, b) = ia + jb
    r   r   r   )	r   r   ÚxÚyÚlxÚlyÚoaÚobÚqr   r   r   Úextended_gcdi   s"   ü
r-   r&   Únc                 C   s(   t | |ƒ\}}}|dkr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   	r2   Úa_valuesÚmodulo_valuesc           	      C   sX   d}d}|D ]}||9 }qt || ƒD ]\}}|| }t||ƒ}||| |  | }q|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   )Úzipr2   )	r3   r4   Úmr&   ÚmoduloÚm_iÚa_iÚM_ir0   r   r   r   Úcrt“   s   

r;   Ú__main__)Ú__doc__ÚtypingÚ
ValueErrorr   r   r   r!   r    ÚTupler-   r2   ÚIterabler;   r   ÚdoctestÚtestmodr   r   r   r   Ú<module>   s   ""#ý