§
    8·tcö(  ã                   óN   — d dl Z d dlmZmZmZmZ d dlmZ  G d„ de¦  «        ZdS )é    N)Ú
iter_rangeÚbordÚbchrÚABC)ÚRandomc                   ó<  — e Zd Zej        d„ ¦   «         Zej        d„ ¦   «         Zej        d„ ¦   «         Zej        d4d„¦   «         Ze	ej        d„ ¦   «         ¦   «         Z
ej        d„ ¦   «         Zej        d„ ¦   «         Zej        d	„ ¦   «         Zej        d
„ ¦   «         Zej        d„ ¦   «         Zej        d„ ¦   «         Zej        d„ ¦   «         ZeZej        d„ ¦   «         Zej        d„ ¦   «         Zej        d„ ¦   «         Zej        d„ ¦   «         Zej        d„ ¦   «         Zej        d„ ¦   «         Zej        d5d„¦   «         Zej        d5d„¦   «         Zej        d„ ¦   «         Zej        d5d„¦   «         Zej        d„ ¦   «         Zej        d„ ¦   «         Zej        d„ ¦   «         Zej        d„ ¦   «         Z ej        d„ ¦   «         Z!ej        d„ ¦   «         Z"ej        d„ ¦   «         Z#ej        d „ ¦   «         Z$ej        d!„ ¦   «         Z%ej        d"„ ¦   «         Z&ej        d#„ ¦   «         Z'ej        d$„ ¦   «         Z(ej        d%„ ¦   «         Z)ej        d&„ ¦   «         Z*ej        d'„ ¦   «         Z+ej        d(„ ¦   «         Z,ej        d)„ ¦   «         Z-ej        d*„ ¦   «         Z.ej        d+„ ¦   «         Z/ej        d,„ ¦   «         Z0ej        d-„ ¦   «         Z1ej        d.„ ¦   «         Z2ej        d/„ ¦   «         Z3e	ej        d0„ ¦   «         ¦   «         Z4e	d1„ ¦   «         Z5e6d2„ ¦   «         Z7e6d3„ ¦   «         Z8dS )6ÚIntegerBasec                 ó   — d S ©N© ©Úselfs    ú>/usr/lib/python3/dist-packages/Cryptodome/Math/_IntegerBase.pyÚ__int__zIntegerBase.__int__)   ó   € àˆó    c                 ó   — d S r   r   r   s    r   Ú__str__zIntegerBase.__str__-   r   r   c                 ó   — d S r   r   r   s    r   Ú__repr__zIntegerBase.__repr__1   r   r   r   c                 ó   — d S r   r   )r   Ú
block_sizes     r   Úto_byteszIntegerBase.to_bytes5   r   r   c                 ó   — d S r   r   )Úbyte_strings    r   Ú
from_byteszIntegerBase.from_bytes9   ó	   € ð 	ˆr   c                 ó   — d S r   r   ©r   Úterms     r   Ú__eq__zIntegerBase.__eq__?   r   r   c                 ó   — d S r   r   r   s     r   Ú__ne__zIntegerBase.__ne__C   r   r   c                 ó   — d S r   r   r   s     r   Ú__lt__zIntegerBase.__lt__G   r   r   c                 ó   — d S r   r   r   s     r   Ú__le__zIntegerBase.__le__K   r   r   c                 ó   — d S r   r   r   s     r   Ú__gt__zIntegerBase.__gt__O   r   r   c                 ó   — d S r   r   r   s     r   Ú__ge__zIntegerBase.__ge__S   r   r   c                 ó   — d S r   r   r   s    r   Ú__nonzero__zIntegerBase.__nonzero__W   r   r   c                 ó   — d S r   r   r   s    r   Úis_negativezIntegerBase.is_negative\   r   r   c                 ó   — d S r   r   r   s     r   Ú__add__zIntegerBase.__add__a   r   r   c                 ó   — d S r   r   r   s     r   Ú__sub__zIntegerBase.__sub__e   r   r   c                 ó   — d S r   r   )r   Úfactors     r   Ú__mul__zIntegerBase.__mul__i   r   r   c                 ó   — d S r   r   ©r   Údivisors     r   Ú__floordiv__zIntegerBase.__floordiv__m   r   r   c                 ó   — d S r   r   r8   s     r   Ú__mod__zIntegerBase.__mod__q   r   r   Nc                 ó   — d S r   r   ©r   ÚexponentÚmoduluss      r   Úinplace_powzIntegerBase.inplace_powu   r   r   c                 ó   — d S r   r   r>   s      r   Ú__pow__zIntegerBase.__pow__y   r   r   c                 ó   — d S r   r   r   s    r   Ú__abs__zIntegerBase.__abs__}   r   r   c                 ó   — d S r   r   ©r   r@   s     r   ÚsqrtzIntegerBase.sqrt�   r   r   c                 ó   — d S r   r   r   s     r   Ú__iadd__zIntegerBase.__iadd__…   r   r   c                 ó   — d S r   r   r   s     r   Ú__isub__zIntegerBase.__isub__‰   r   r   c                 ó   — d S r   r   r   s     r   Ú__imul__zIntegerBase.__imul__�   r   r   c                 ó   — d S r   r   r   s     r   Ú__imod__zIntegerBase.__imod__‘   r   r   c                 ó   — d S r   r   r   s     r   Ú__and__zIntegerBase.__and__–   r   r   c                 ó   — d S r   r   r   s     r   Ú__or__zIntegerBase.__or__š   r   r   c                 ó   — d S r   r   ©r   Úposs     r   Ú
__rshift__zIntegerBase.__rshift__ž   r   r   c                 ó   — d S r   r   rV   s     r   Ú__irshift__zIntegerBase.__irshift__¢   r   r   c                 ó   — d S r   r   rV   s     r   Ú
__lshift__zIntegerBase.__lshift__¦   r   r   c                 ó   — d S r   r   rV   s     r   Ú__ilshift__zIntegerBase.__ilshift__ª   r   r   c                 ó   — d S r   r   )r   Úns     r   Úget_bitzIntegerBase.get_bit®   r   r   c                 ó   — d S r   r   r   s    r   Úis_oddzIntegerBase.is_odd³   r   r   c                 ó   — d S r   r   r   s    r   Úis_evenzIntegerBase.is_even·   r   r   c                 ó   — d S r   r   r   s    r   Úsize_in_bitszIntegerBase.size_in_bits»   r   r   c                 ó   — d S r   r   r   s    r   Úsize_in_byteszIntegerBase.size_in_bytes¿   r   r   c                 ó   — d S r   r   r   s    r   Úis_perfect_squarezIntegerBase.is_perfect_squareÃ   r   r   c                 ó   — d S r   r   )r   Úsmall_primes     r   Úfail_if_divisible_byz IntegerBase.fail_if_divisible_byÇ   r   r   c                 ó   — d S r   r   )r   ÚaÚbs      r   Úmultiply_accumulatezIntegerBase.multiply_accumulateË   r   r   c                 ó   — d S r   r   )r   Úsources     r   ÚsetzIntegerBase.setÏ   r   r   c                 ó   — d S r   r   rG   s     r   Úinplace_inversezIntegerBase.inplace_inverseÓ   r   r   c                 ó   — d S r   r   rG   s     r   ÚinversezIntegerBase.inverse×   r   r   c                 ó   — d S r   r   r   s     r   ÚgcdzIntegerBase.gcdÛ   r   r   c                 ó   — d S r   r   r   s     r   ÚlcmzIntegerBase.lcmß   r   r   c                 ó   — d S r   r   )rp   r`   s     r   Újacobi_symbolzIntegerBase.jacobi_symbolã   r   r   c                 óP  — | dv r| S |dz  dk    r=t          | |dz   dz  |¦  «        }t          |d|¦  «        | k    rt          d¦  «        ‚|S d}|dz
  dz  }|dz  s|dz  }|dz  }|dz  ¯|                      d¦  «        }	 t          ||dz
  dz  |¦  «        }|dk    r|dz  }Œ$||dz
  k    rnt          d¦  «        ‚|}t          |||¦  «        }t          | ||¦  «        }	t          | |dz   dz  |¦  «        }
|	dk    r„t          d|¦  «        D ]}t          |	d|z  |¦  «        dk    r nŒ||k    rt          d	| |fz  ¦  «        ‚t          |d||z
  dz
  z  |¦  «        }|}|dz  |z  }|	|dz  z  |z  }	|
|z  |z  }
|	dk    °„t          |
d|¦  «        | k    rt          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   é   é   é   r�   é   zCannot compute square rootTr   z'Cannot compute square root of %d mod %d)ÚpowÚ
ValueErrorÚ	__class__r   )r`   ÚpÚrootÚsÚqÚzÚeulerÚmÚcÚtÚrÚirq   s                r   Ú_tonelli_shankszIntegerBase._tonelli_shanksè   s(  € ð" �ˆ;ˆ;ØˆHàˆq‰5�AŠ:ˆ:Ý�q˜1˜q™5 Q™,¨Ñ*Ô*ˆDÝ�4˜˜A‰Œ !Ò#Ð#Ý Ð!=Ñ>Ô>Ð>ØˆKàˆØ�‰U�q‰LˆØ�q‘5ð 	Ø�‰FˆAØ�!‰GˆAð �q‘5ð 	ð �KŠK˜‰NŒNˆð	;Ý˜˜A ™E a™<¨Ñ+Ô+ˆEØ˜ŠzˆzØ�Q‘�ØØ˜˜A™Š~ˆ~ØåÐ9Ñ:Ô:Ð:àˆÝ��1�a‰LŒLˆÝ��1�a‰LŒLˆÝ��A˜‘E˜a‘< Ñ#Ô#ˆà�1ŠfˆfÝ  1Ñ%Ô%ð ð �Ý�q˜!˜Q™$ ‘?”? aÒ'Ð'Ø�Eð (à�AŠvˆvÝ Ð!JÈaÐQRÈVÑ!SÑTÔTÐTÝ�A�q˜1˜q™5 1™9‘~ qÑ)Ô)ˆAØˆAØ�1‘�q‘ˆAØ�Q˜‘T‘˜Q‘ˆAØ�Q‘˜!‘ˆAð �1Šfˆfõ ˆq�!�Q‰<Œ<˜1ÒÐÝÐ9Ñ:Ô:Ð:àˆr   c                 ó  — |                      dd¦  «        }|                      dd¦  «        }|                      dd¦  «        }|€t          j        ¦   «         j        }|€|€t	          d¦  «        ‚|�|�t	          d¦  «        ‚|p|}|dz
  dz  dz   }d|dz  |z
  z
  }t           |d¦  «        d	         ¦  «        }|�|d|dz
  z  z  }|d|z  dz
  z  }|                      t          |¦  «         ||dz
  ¦  «        z   ¦  «        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 exclusiver�   é   r   )Úpopr   ÚnewÚreadr†   r   r   r   )	ÚclsÚkwargsr•   r–   r—   ÚbitsÚbytes_neededÚsignificant_bits_msbÚmsbs	            r   ÚrandomzIntegerBase.random)  s+  € ð2 —Z’Z ¨dÑ3Ô3ˆ
Ø—:’:˜j¨$Ñ/Ô/ˆØ—:’:˜j¨$Ñ/Ô/ˆàÐÝ”z‘|”|Ô(ˆHàÐ (Ð"2ÝÐRÑSÔSÐSàÐ! hÐ&:ÝÐQÑRÔRÐRàÐ%˜XˆØ ™ a™¨1Ñ,ˆØ  L°1Ñ$4°tÑ$;Ñ<ÐÝ�8�8˜A‘;”;˜q”>Ñ"Ô"ˆØÐ!Ø�1Ð-°Ñ1Ñ2Ñ2ˆCØ�Ð)Ñ)¨QÑ.Ñ.ˆà�~Š~�d 3™iœi¨(¨(°<À!Ñ3CÑ*DÔ*DÑDÑEÔEÐEr   c                 óR  — |                      dd¦  «        }|                      dd¦  «        }|                      dd¦  «        }|                      dd¦  «        }|r$t          dt          |j        ¦  «        z   ¦  «        ‚d||fvrt          d¦  «        ‚|�|dz
  }d||fv rt          d	¦  «        ‚|€t	          j        ¦   «         j        }||z
  } | |¦  «                             ¦   «         }d
}d|cxk    r|k    s)n |                      ||¬¦  «        }d|cxk    r|k    ¯$n Œ'||z   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 specifiedr�   z(Missing keyword to identify the intervaléÿÿÿÿr   )r–   r—   )	r™   r†   ÚstrÚkeysr   rš   r›   rg   r¢   )	rœ   r�   r¤   r¥   r¦   r—   Únorm_maximumÚbits_neededÚnorm_candidates	            r   Úrandom_rangezIntegerBase.random_rangeY  sy  € ð& Ÿ
š
 ?°DÑ9Ô9ˆØŸ
š
 ?°DÑ9Ô9ˆØŸ
š
 ?°DÑ9Ô9ˆØ—:’:˜j¨$Ñ/Ô/ˆàð 	FÝÐ1µC¸¼Ñ4DÔ4DÑDÑEÔEÐEØ˜ }Ð5Ð5Ð5Ýð &ñ 'ô 'ð 'àÐ$Ø)¨AÑ-ˆMØ�M =Ð1Ð1Ð1ÝÐGÑHÔHÐHàÐÝ”z‘|”|Ô(ˆHà$ }Ñ4ˆØ�c˜,Ñ'Ô'×4Ò4Ñ6Ô6ˆàˆØ�~Ð5Ð5Ò5Ð5¨Ò5Ð5Ð5Ð5Ø ŸZšZØ-8Ø-5ð (ñ &ô &ˆNð �~Ð5Ð5Ò5Ð5¨Ò5Ð5Ð5Ð5Ð5ð
  Ñ-Ð-r   )r   r   )9Ú__name__Ú
__module__Ú__qualname__ÚabcÚabstractmethodr   r   r   r   Ústaticmethodr   r!   r#   r%   r'   r)   r+   r-   Ú__bool__r/   r1   r3   r6   r:   r<   rA   rC   rE   rH   rJ   rL   rN   rP   rR   rT   rX   rZ   r\   r^   ra   rc   re   rg   ri   rk   rn   rr   ru   rw   ry   r{   r}   r   r“   Úclassmethodr¢   r­   r   r   r   r	   r	   &   s'  € € € € € ð 	Ôðð ñ Ôðð 	Ôðð ñ Ôðð 	Ôðð ñ Ôðð 	Ôðð ð ñ Ôðð ØÔðð ñ Ôñ „\ðð 	Ôðð ñ Ôðð 	Ôðð ñ Ôðð 	Ôðð ñ Ôðð 	Ôðð ñ Ôðð 	Ôðð ñ Ôðð 	Ôðð ñ Ôðð 	Ôðð ñ Ôðà€HàÔðð ñ Ôðð 	Ôðð ñ Ôðð 	Ôðð ñ Ôðð 	Ôðð ñ Ôðð 	Ôðð ñ Ôðð 	Ôðð ñ Ôðð 	Ôðð ð ñ Ôðð 	Ôðð ð ñ Ôðð 	Ôðð ñ Ôðð 	Ôðð ð ñ Ôðð 	Ôðð ñ Ôðð 	Ôðð ñ Ôðð 	Ôðð ñ Ôðð 	Ôðð ñ Ôðð 	Ôðð ñ Ôðð 	Ôðð ñ Ôðð 	Ôðð ñ Ôðð 	Ôðð ñ Ôðð 	Ôðð ñ Ôðð 	Ôðð ñ Ôðð 	Ôðð ñ Ôðð 	Ôðð ñ Ôðð 	Ôðð ñ Ôðð 	Ôðð ñ Ôðð 	Ôðð ñ Ôðð 	Ôðð ñ Ôðð 	Ôðð ñ Ôðð 	Ôðð ñ Ôðð 	Ôðð ñ Ôðð 	Ôðð ñ Ôðð 	Ôðð ñ Ôðð 	Ôðð ñ Ôðð 	Ôðð ñ Ôðð ØÔðð ñ Ôñ „\ðð ð>ð >ñ „\ð>ð@ ð-Fð -Fñ „[ð-Fð^ ð-.ð -.ñ „[ð-.ð -.ð -.r   r	   )	r±   ÚCryptodome.Util.py3compatr   r   r   r   Ú
Cryptodomer   r	   r   r   r   ú<module>r¸      s„   ðð> €
€
€
à AÐ AÐ AÐ AÐ AÐ AÐ AÐ AÐ AÐ AÐ AÐ Aà Ð Ð Ð Ð Ð ða.ð a.ð a.ð a.ð a.�#ñ a.ô a.ð a.ð a.ð a.r   