o
    n~b(                     @   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dedd	Ze	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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dfd'd(Zejdfd)d*Zejd+d, Zejdfd-d.Zejd/d0 Zejd1d2 Zejd3d4 Zejd5d6 Z ejd7d8 Z!ejd9d: Z"ejd;d< Z#ejd=d> Z$ejd?d@ Z%ejdAdB Z&ejdCdD Z'ejdEdF Z(ejdGdH Z)ejdIdJ Z*ejdKdL Z+ejdMdN Z,ejdOdP Z-ejdQdR Z.ejdSdT Z/ejdUdV Z0ejdWdX Z1ejdYdZ Z2ejd[d\ Z3e	ejd]d^ Z4e	d_d` Z5e6dadb Z7e6dcdd Z8d&S )gIntegerBasec                 C      d S N selfr
   r
   G/usr/local/lib/python3.10/dist-packages/Cryptodome/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   c                 C   r   r	   r
   )r   
block_sizer
   r
   r   to_bytes5   r   zIntegerBase.to_bytesc                 C   r   r	   r
   )Zbyte_stringr
   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
   r5   r
   r
   r   __irshift__   r   zIntegerBase.__irshift__c                 C   r   r	   r
   r5   r
   r
   r   
__lshift__   r   zIntegerBase.__lshift__c                 C   r   r	   r
   r5   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
   )rC   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            rM      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irD   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 exclusiverM      r   )popr   newreadrR   r   r   r   )	clskwargsr_   r`   ra   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_exclusivera   zUnknown keywords: z8max_inclusive and max_exclusive cannot be both specifiedrM   z(Missing keyword to identify the intervalr   )r`   ra   )	rc   rR   strkeysr   rd   re   r?   ri   )	rf   rg   rj   rk   rl   ra   Znorm_maximumZbits_neededZnorm_candidater
   r
   r   random_rangeY  s4   
zIntegerBase.random_range)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,   r.   r/   r0   r1   r2   r3   r4   r7   r8   r9   r:   r<   r=   r>   r?   r@   rA   rB   rE   rG   rH   rI   rJ   rK   rL   r^   classmethodri   rp   r
   r
   r
   r   r   &   s    








































@
/r   )	rt   ZCryptodome.Util.py3compatr   r   r   r   Z
Cryptodomer   r   r
   r
   r
   r   <module>   s   