o
    e*                     @   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dhd*d+Zejd,d- Zejdhd.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 )iIntegerBasec                 C      d S N selfr
   r
   HD:\Projects\ConvertPro\env\Lib\site-packages\Crypto/Math/_IntegerBase.py__int__)      zIntegerBase.__int__c                 C   r   r	   r
   r   r
   r
   r   __str__-   r   zIntegerBase.__str__c                 C   r   r	   r
   r   r
   r
   r   __repr__1   r   zIntegerBase.__repr__r   bigc                 C   r   r	   r
   )r   
block_size	byteorderr
   r
   r   to_bytes5   r   zIntegerBase.to_bytesc                 C   r   r	   r
   )Zbyte_stringr   r
   r
   r   
from_bytes9      zIntegerBase.from_bytesc                 C   r   r	   r
   r   termr
   r
   r   __eq__?   r   zIntegerBase.__eq__c                 C   r   r	   r
   r   r
   r
   r   __ne__C   r   zIntegerBase.__ne__c                 C   r   r	   r
   r   r
   r
   r   __lt__G   r   zIntegerBase.__lt__c                 C   r   r	   r
   r   r
   r
   r   __le__K   r   zIntegerBase.__le__c                 C   r   r	   r
   r   r
   r
   r   __gt__O   r   zIntegerBase.__gt__c                 C   r   r	   r
   r   r
   r
   r   __ge__S   r   zIntegerBase.__ge__c                 C   r   r	   r
   r   r
   r
   r   __nonzero__W   r   zIntegerBase.__nonzero__c                 C   r   r	   r
   r   r
   r
   r   is_negative\   r   zIntegerBase.is_negativec                 C   r   r	   r
   r   r
   r
   r   __add__a   r   zIntegerBase.__add__c                 C   r   r	   r
   r   r
   r
   r   __sub__e   r   zIntegerBase.__sub__c                 C   r   r	   r
   )r   factorr
   r
   r   __mul__i   r   zIntegerBase.__mul__c                 C   r   r	   r
   r   Zdivisorr
   r
   r   __floordiv__m   r   zIntegerBase.__floordiv__c                 C   r   r	   r
   r&   r
   r
   r   __mod__q   r   zIntegerBase.__mod__Nc                 C   r   r	   r
   r   exponentmodulusr
   r
   r   inplace_powu   r   zIntegerBase.inplace_powc                 C   r   r	   r
   r)   r
   r
   r   __pow__y   r   zIntegerBase.__pow__c                 C   r   r	   r
   r   r
   r
   r   __abs__}   r   zIntegerBase.__abs__c                 C   r   r	   r
   r   r+   r
   r
   r   sqrt   r   zIntegerBase.sqrtc                 C   r   r	   r
   r   r
   r
   r   __iadd__   r   zIntegerBase.__iadd__c                 C   r   r	   r
   r   r
   r
   r   __isub__   r   zIntegerBase.__isub__c                 C   r   r	   r
   r   r
   r
   r   __imul__   r   zIntegerBase.__imul__c                 C   r   r	   r
   r   r
   r
   r   __imod__   r   zIntegerBase.__imod__c                 C   r   r	   r
   r   r
   r
   r   __and__   r   zIntegerBase.__and__c                 C   r   r	   r
   r   r
   r
   r   __or__   r   zIntegerBase.__or__c                 C   r   r	   r
   r   posr
   r
   r   
__rshift__   r   zIntegerBase.__rshift__c                 C   r   r	   r
   r7   r
   r
   r   __irshift__   r   zIntegerBase.__irshift__c                 C   r   r	   r
   r7   r
   r
   r   
__lshift__   r   zIntegerBase.__lshift__c                 C   r   r	   r
   r7   r
   r
   r   __ilshift__   r   zIntegerBase.__ilshift__c                 C   r   r	   r
   )r   nr
   r
   r   get_bit   r   zIntegerBase.get_bitc                 C   r   r	   r
   r   r
   r
   r   is_odd   r   zIntegerBase.is_oddc                 C   r   r	   r
   r   r
   r
   r   is_even   r   zIntegerBase.is_evenc                 C   r   r	   r
   r   r
   r
   r   size_in_bits   r   zIntegerBase.size_in_bitsc                 C   r   r	   r
   r   r
   r
   r   size_in_bytes   r   zIntegerBase.size_in_bytesc                 C   r   r	   r
   r   r
   r
   r   is_perfect_square   r   zIntegerBase.is_perfect_squarec                 C   r   r	   r
   )r   Zsmall_primer
   r
   r   fail_if_divisible_by   r   z IntegerBase.fail_if_divisible_byc                 C   r   r	   r
   )r   abr
   r
   r   multiply_accumulate   r   zIntegerBase.multiply_accumulatec                 C   r   r	   r
   )r   sourcer
   r
   r   set   r   zIntegerBase.setc                 C   r   r	   r
   r/   r
   r
   r   inplace_inverse   r   zIntegerBase.inplace_inversec                 C   r   r	   r
   r/   r
   r
   r   inverse   r   zIntegerBase.inversec                 C   r   r	   r
   r   r
   r
   r   gcd   r   zIntegerBase.gcdc                 C   r   r	   r
   r   r
   r
   r   lcm   r   zIntegerBase.lcmc                 C   r   r	   r
   )rE   r=   r
   r
   r   jacobi_symbol   r   zIntegerBase.jacobi_symbolc                 C   s  | dv r| S |d dkr$t | |d d |}t |d|| kr"td|S d}|d d }|d@ s<|d7 }|dL }|d@ r0| d}	 t ||d d |}|dkrU|d7 }qA||d kr\ntd|}t |||}t | ||}	t | |d d |}
|	dkrtd|D ]}t |	d| |dkr nq||krtd	| |f t |d|| d  |}|}|d | }|	|d  | }	|
| | }
|	dks|t |
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            rO      zCannot compute square rootTr   z'Cannot compute square root of %d mod %d)pow
ValueError	__class__r   )r=   prootsqzZeulermctrirF   r
   r
   r   _tonelli_shanks   sT   
zIntegerBase._tonelli_shanksc           	      K   s   | dd}| dd}| dd}|du rt j}|du r'|du r'td|dur3|dur3td|p6|}|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 exclusiverO      r   )popr   newreadrT   r   r   r   )	clskwargsra   rb   rc   bitsZbytes_neededZsignificant_bits_msbZmsbr
   r
   r   random)  s"   
zIntegerBase.randomc           	      K   s   | dd}| dd}| dd}| dd}|r#tdt|j d||fvr-td|dur5|d }d||fv r?td	|du rHt j}|| }| | }d
}d|  kr^|ksun | j||d}d|  krs|kr_|| S  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_exclusiverc   zUnknown keywords: z8max_inclusive and max_exclusive cannot be both specifiedrO   z(Missing keyword to identify the intervalr   )rb   rc   )	re   rT   strkeysr   rf   rg   rA   rk   )	rh   ri   rl   rm   rn   rc   Znorm_maximumZbits_neededZnorm_candidater
   r
   r   random_rangeY  s4   
zIntegerBase.random_range)r   r   )r   r	   )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.   r0   r1   r2   r3   r4   r5   r6   r9   r:   r;   r<   r>   r?   r@   rA   rB   rC   rD   rG   rI   rJ   rK   rL   rM   rN   r`   classmethodrk   rr   r
   r
   r
   r   r   &   s    








































@
/r   )	rv   ZCrypto.Util.py3compatr   r   r   r   ZCryptor   r   r
   r
   r
   r   <module>   s   