a
    !f)                     @   s@   d dl Z d dlmZmZmZmZ d dlmZ G dd deZdS )    N)
iter_rangebordbchrABC)Randomc                   @   s  e Zd Zejdd Zejdd Zejdd Zejdfd	d
Ze	ejdgddZ
ejdd Zejdd Zejdd Zejdd Zejdd Zejdd Zejdd ZeZejdd Zejdd Zejdd  Zejd!d" Zejd#d$ Zejd%d& Zejdhd(d)Zejdid*d+Zejd,d- Zejdjd.d/Zejd0d1 Zejd2d3 Zejd4d5 Zejd6d7 Z ejd8d9 Z!ejd:d; Z"ejd<d= Z#ejd>d? Z$ejd@dA Z%ejdBdC Z&ejdDdE Z'ejdFdG Z(ejdHdI Z)ejdJdK Z*ejdLdM Z+ejdNdO Z,ejdPdQ Z-ejdRdS Z.ejdTdU Z/ejdVdW Z0ejdXdY Z1ejdZd[ Z2ejd\d] Z3e	ejd^d_ Z4e	d`da Z5e6dbdc Z7e6ddde Z8d'S )kIntegerBasec                 C   s   d S N selfr	   r	   ]/var/www/html/python-backend/venv/lib/python3.9/site-packages/Cryptodome/Math/_IntegerBase.py__int__)   s    zIntegerBase.__int__c                 C   s   d S r   r	   r
   r	   r	   r   __str__-   s    zIntegerBase.__str__c                 C   s   d S r   r	   r
   r	   r	   r   __repr__1   s    zIntegerBase.__repr__r   bigc                 C   s   d S r   r	   )r   
block_size	byteorderr	   r	   r   to_bytes5   s    zIntegerBase.to_bytesc                 C   s   d S r   r	   )Zbyte_stringr   r	   r	   r   
from_bytes9   s    zIntegerBase.from_bytesc                 C   s   d S r   r	   r   termr	   r	   r   __eq__?   s    zIntegerBase.__eq__c                 C   s   d S r   r	   r   r	   r	   r   __ne__C   s    zIntegerBase.__ne__c                 C   s   d S r   r	   r   r	   r	   r   __lt__G   s    zIntegerBase.__lt__c                 C   s   d S r   r	   r   r	   r	   r   __le__K   s    zIntegerBase.__le__c                 C   s   d S r   r	   r   r	   r	   r   __gt__O   s    zIntegerBase.__gt__c                 C   s   d S r   r	   r   r	   r	   r   __ge__S   s    zIntegerBase.__ge__c                 C   s   d S r   r	   r
   r	   r	   r   __nonzero__W   s    zIntegerBase.__nonzero__c                 C   s   d S r   r	   r
   r	   r	   r   is_negative\   s    zIntegerBase.is_negativec                 C   s   d S r   r	   r   r	   r	   r   __add__a   s    zIntegerBase.__add__c                 C   s   d S r   r	   r   r	   r	   r   __sub__e   s    zIntegerBase.__sub__c                 C   s   d S r   r	   )r   factorr	   r	   r   __mul__i   s    zIntegerBase.__mul__c                 C   s   d S r   r	   r   Zdivisorr	   r	   r   __floordiv__m   s    zIntegerBase.__floordiv__c                 C   s   d S r   r	   r#   r	   r	   r   __mod__q   s    zIntegerBase.__mod__Nc                 C   s   d S r   r	   r   exponentmodulusr	   r	   r   inplace_powu   s    zIntegerBase.inplace_powc                 C   s   d S r   r	   r&   r	   r	   r   __pow__y   s    zIntegerBase.__pow__c                 C   s   d S r   r	   r
   r	   r	   r   __abs__}   s    zIntegerBase.__abs__c                 C   s   d S r   r	   r   r(   r	   r	   r   sqrt   s    zIntegerBase.sqrtc                 C   s   d S r   r	   r   r	   r	   r   __iadd__   s    zIntegerBase.__iadd__c                 C   s   d S r   r	   r   r	   r	   r   __isub__   s    zIntegerBase.__isub__c                 C   s   d S r   r	   r   r	   r	   r   __imul__   s    zIntegerBase.__imul__c                 C   s   d S r   r	   r   r	   r	   r   __imod__   s    zIntegerBase.__imod__c                 C   s   d S r   r	   r   r	   r	   r   __and__   s    zIntegerBase.__and__c                 C   s   d S r   r	   r   r	   r	   r   __or__   s    zIntegerBase.__or__c                 C   s   d S r   r	   r   posr	   r	   r   
__rshift__   s    zIntegerBase.__rshift__c                 C   s   d S r   r	   r4   r	   r	   r   __irshift__   s    zIntegerBase.__irshift__c                 C   s   d S r   r	   r4   r	   r	   r   
__lshift__   s    zIntegerBase.__lshift__c                 C   s   d S r   r	   r4   r	   r	   r   __ilshift__   s    zIntegerBase.__ilshift__c                 C   s   d S r   r	   )r   nr	   r	   r   get_bit   s    zIntegerBase.get_bitc                 C   s   d S r   r	   r
   r	   r	   r   is_odd   s    zIntegerBase.is_oddc                 C   s   d S r   r	   r
   r	   r	   r   is_even   s    zIntegerBase.is_evenc                 C   s   d S r   r	   r
   r	   r	   r   size_in_bits   s    zIntegerBase.size_in_bitsc                 C   s   d S r   r	   r
   r	   r	   r   size_in_bytes   s    zIntegerBase.size_in_bytesc                 C   s   d S r   r	   r
   r	   r	   r   is_perfect_square   s    zIntegerBase.is_perfect_squarec                 C   s   d S r   r	   )r   Zsmall_primer	   r	   r   fail_if_divisible_by   s    z IntegerBase.fail_if_divisible_byc                 C   s   d S r   r	   )r   abr	   r	   r   multiply_accumulate   s    zIntegerBase.multiply_accumulatec                 C   s   d S r   r	   )r   sourcer	   r	   r   set   s    zIntegerBase.setc                 C   s   d S r   r	   r,   r	   r	   r   inplace_inverse   s    zIntegerBase.inplace_inversec                 C   s   d S r   r	   r,   r	   r	   r   inverse   s    zIntegerBase.inversec                 C   s   d S r   r	   r   r	   r	   r   gcd   s    zIntegerBase.gcdc                 C   s   d S r   r	   r   r	   r	   r   lcm   s    zIntegerBase.lcmc                 C   s   d S r   r	   )rB   r:   r	   r	   r   jacobi_symbol   s    zIntegerBase.jacobi_symbolc                 C   s  | dv r| S |d dkrHt | |d d |}t |d|| krDtd|S d}|d d }|d@ sr|d7 }|dL }qX| d}t ||d d |}|dkr|d7 }q|||d krqtdq||}t |||}t | ||}	t | |d d |}
|	dkr~td|D ]}t |	d| |dkr qq||kr8td| |f t |d|| d  |}|}|d | }|	|d  | }	|
| | }
qt |
d|| krtd|
S )	a  Tonelli-shanks algorithm for computing the square root
        of n modulo a prime p.

        n must be in the range [0..p-1].
        p must be at least even.

        The return value r is the square root of modulo p. If non-zero,
        another solution will also exist (p-r).

        Note we cannot assume that p is really a prime: if it's not,
        we can either raise an exception or return the correct value.
        )r            rL      zCannot compute square rootr   z'Cannot compute square root of %d mod %d)pow
ValueError	__class__r   )r:   prootsqzZeulermctrirC   r	   r	   r   _tonelli_shanks   sL    




zIntegerBase._tonelli_shanksc           	      K   s   | dd}| dd}| dd}|du r6t j}|du rN|du rNtd|durf|durftd|pl|}|d d d }d|d |  }t|dd	 }|dur|d|d > O }|d|> d M }| t|||d  S )
a!  Generate a random natural integer of a certain size.

        :Keywords:
          exact_bits : positive integer
            The length in bits of the resulting random Integer number.
            The number is guaranteed to fulfil the relation:

                2^bits > result >= 2^(bits - 1)

          max_bits : positive integer
            The maximum length in bits of the resulting random Integer number.
            The number is guaranteed to fulfil the relation:

                2^bits > result >=0

          randfunc : callable
            A function that returns a random byte string. The length of the
            byte string is passed as parameter. Optional.
            If not provided (or ``None``), randomness is read from the system RNG.

        :Return: a Integer object
        
exact_bitsNmax_bitsrandfuncz3Either 'exact_bits' or 'max_bits' must be specifiedz2'exact_bits' and 'max_bits' are mutually exclusiverL      r   )popr   newreadrQ   r   r   r   )	clskwargsr^   r_   r`   bitsZbytes_neededZsignificant_bits_msbZmsbr	   r	   r   random)  s"    
zIntegerBase.randomc           	      K   s   | dd}| dd}| dd}| dd}|rFtdt|j d||fvrZtd|durj|d }d||fv r~td	|du rt j}|| }| | }d
}d|  kr|ksn | j||d}q|| S )a  Generate a random integer within a given internal.

        :Keywords:
          min_inclusive : integer
            The lower end of the interval (inclusive).
          max_inclusive : integer
            The higher end of the interval (inclusive).
          max_exclusive : integer
            The higher end of the interval (exclusive).
          randfunc : callable
            A function that returns a random byte string. The length of the
            byte string is passed as parameter. Optional.
            If not provided (or ``None``), randomness is read from the system RNG.
        :Returns:
            An Integer randomly taken in the given interval.
        min_inclusiveNmax_inclusivemax_exclusiver`   zUnknown keywords: z8max_inclusive and max_exclusive cannot be both specifiedrL   z(Missing keyword to identify the intervalr   )r_   r`   )	rb   rQ   strkeysr   rc   rd   r>   rh   )	re   rf   ri   rj   rk   r`   Znorm_maximumZbits_neededZnorm_candidater	   r	   r   random_rangeY  s.    
zIntegerBase.random_range)r   r   )r   )N)N)N)9__name__
__module____qualname__abcabstractmethodr   r   r   r   staticmethodr   r   r   r   r   r   r   r   __bool__r   r   r    r"   r$   r%   r)   r*   r+   r-   r.   r/   r0   r1   r2   r3   r6   r7   r8   r9   r;   r<   r=   r>   r?   r@   rA   rD   rF   rG   rH   rI   rJ   rK   r]   classmethodrh   ro   r	   r	   r	   r   r   &   s   








































@
/r   )	rs   ZCryptodome.Util.py3compatr   r   r   r   Z
Cryptodomer   r   r	   r	   r	   r   <module>   s   