U
    ÈZjÝl  ã                   @   s  d dl Z d dlZd dlmZ d dlmZmZmZmZm	Z	 ddl
mZ dZe jdkrZedƒ‚ed	eƒZd	ed
œZeedƒr€edƒ‚G dd„ deƒZeƒ Zed dkrÜd dlmZmZmZmZ G dd„ deƒZdd„ Zeej_nd dlmZ dd„ Zde d¡ Z G dd„ deƒZ!dS )é    N)Úis_native_int)ÚbackendÚload_libÚc_ulongÚc_size_tÚc_uint8_ptré   )ÚIntegerBaseaÆ  typedef unsigned long UNIX_ULONG;
        typedef struct { int a; int b; void *c; } MPZ;
        typedef MPZ mpz_t[1];
        typedef UNIX_ULONG mp_bitcnt_t;

        void __gmpz_init (mpz_t x);
        void __gmpz_init_set (mpz_t rop, const mpz_t op);
        void __gmpz_init_set_ui (mpz_t rop, UNIX_ULONG op);

        UNIX_ULONG __gmpz_get_ui (const mpz_t op);
        void __gmpz_set (mpz_t rop, const mpz_t op);
        void __gmpz_set_ui (mpz_t rop, UNIX_ULONG op);
        void __gmpz_add (mpz_t rop, const mpz_t op1, const mpz_t op2);
        void __gmpz_add_ui (mpz_t rop, const mpz_t op1, UNIX_ULONG op2);
        void __gmpz_sub_ui (mpz_t rop, const mpz_t op1, UNIX_ULONG op2);
        void __gmpz_addmul (mpz_t rop, const mpz_t op1, const mpz_t op2);
        void __gmpz_addmul_ui (mpz_t rop, const mpz_t op1, UNIX_ULONG op2);
        void __gmpz_submul_ui (mpz_t rop, const mpz_t op1, UNIX_ULONG op2);
        void __gmpz_import (mpz_t rop, size_t count, int order, size_t size,
                            int endian, size_t nails, const void *op);
        void * __gmpz_export (void *rop, size_t *countp, int order,
                              size_t size,
                              int endian, size_t nails, const mpz_t op);
        size_t __gmpz_sizeinbase (const mpz_t op, int base);
        void __gmpz_sub (mpz_t rop, const mpz_t op1, const mpz_t op2);
        void __gmpz_mul (mpz_t rop, const mpz_t op1, const mpz_t op2);
        void __gmpz_mul_ui (mpz_t rop, const mpz_t op1, UNIX_ULONG op2);
        int __gmpz_cmp (const mpz_t op1, const mpz_t op2);
        void __gmpz_powm (mpz_t rop, const mpz_t base, const mpz_t exp, const
                          mpz_t mod);
        void __gmpz_powm_ui (mpz_t rop, const mpz_t base, UNIX_ULONG exp,
                             const mpz_t mod);
        void __gmpz_pow_ui (mpz_t rop, const mpz_t base, UNIX_ULONG exp);
        void __gmpz_sqrt(mpz_t rop, const mpz_t op);
        void __gmpz_mod (mpz_t r, const mpz_t n, const mpz_t d);
        void __gmpz_neg (mpz_t rop, const mpz_t op);
        void __gmpz_abs (mpz_t rop, const mpz_t op);
        void __gmpz_and (mpz_t rop, const mpz_t op1, const mpz_t op2);
        void __gmpz_ior (mpz_t rop, const mpz_t op1, const mpz_t op2);
        void __gmpz_clear (mpz_t x);
        void __gmpz_tdiv_q_2exp (mpz_t q, const mpz_t n, mp_bitcnt_t b);
        void __gmpz_fdiv_q (mpz_t q, const mpz_t n, const mpz_t d);
        void __gmpz_mul_2exp (mpz_t rop, const mpz_t op1, mp_bitcnt_t op2);
        int __gmpz_tstbit (const mpz_t op, mp_bitcnt_t bit_index);
        int __gmpz_perfect_square_p (const mpz_t op);
        int __gmpz_jacobi (const mpz_t a, const mpz_t b);
        void __gmpz_gcd (mpz_t rop, const mpz_t op1, const mpz_t op2);
        UNIX_ULONG __gmpz_gcd_ui (mpz_t rop, const mpz_t op1,
                                     UNIX_ULONG op2);
        void __gmpz_lcm (mpz_t rop, const mpz_t op1, const mpz_t op2);
        int __gmpz_invert (mpz_t rop, const mpz_t op1, const mpz_t op2);
        int __gmpz_divisible_p (const mpz_t n, const mpz_t d);
        int __gmpz_divisible_ui_p (const mpz_t n, UNIX_ULONG d);

        size_t __gmpz_size (const mpz_t op);
        UNIX_ULONG __gmpz_getlimbn (const mpz_t op, size_t n);
        Úwin32zNot using GMP on WindowsZgmp)ÚlibraryÚapiZ__mpir_versionzMPIR library detectedc                   @   s   e Zd Zdd„ ZdS )Ú_GMPc                 C   s^   |  d¡rd|dd …  }n(|  d¡r8d|dd …  }ntd| ƒ‚tt|ƒ}t| ||ƒ |S )NZmpz_Z__gmpz_é   Zgmp_Z__gmp_zAttribute %s is invalid)Ú
startswithÚAttributeErrorÚgetattrÚlibÚsetattr)ÚselfÚnameÚ	func_nameÚfunc© r   úZ/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/Crypto/Math/_IntegerGMP.pyÚ__getattr__p   s    


z_GMP.__getattr__N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   n   s   r   r   Úctypes)Ú	StructureÚc_intÚc_void_pÚbyrefc                   @   s"   e Zd ZdefdefdefgZdS )Ú_MPZZ	_mp_allocZ_mp_sizeZ_mp_dN)r   r   r   r    r!   Z_fields_r   r   r   r   r#   …   s   þr#   c                   C   s
   t tƒ ƒS ©N)r"   r#   r   r   r   r   Únew_mpzŠ   s    r%   )Úffic                   C   s
   t  d¡S )NzMPZ*)r&   Únewr   r   r   r   r%   “   s    é   ÚPc                   @   sà  e Zd ZdZeƒ Ze eedƒ¡ dd„ Z	dd„ Z
dd„ Zd	d
„ Zdd„ Zdd„ Zdmdd„Zedndd„ƒZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ ZeZd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Z dod1d2„Z!dpd3d4„Z"d5d6„ Z#dqd7d8„Z$d9d:„ Z%d;d<„ Z&d=d>„ Z'd?d@„ Z(dAdB„ Z)dCdD„ Z*dEdF„ Z+dGdH„ Z,dIdJ„ Z-dKdL„ Z.dMdN„ Z/dOdP„ Z0dQdR„ Z1dSdT„ Z2dUdV„ Z3dWdX„ Z4dYdZ„ Z5d[d\„ Z6d]d^„ Z7d_d`„ Z8dadb„ Z9dcdd„ Z:dedf„ Z;edgdh„ ƒZ<edidj„ ƒZ=dkdl„ Z>d0S )rÚ
IntegerGMPz#A fast, arbitrary precision integerr   c              	   C   s$  t ƒ | _d| _t|tƒr tdƒ‚t|ƒrøt | j¡ d| _|dkrFdS t ƒ }t |¡ z~|dk}t
|ƒ}| ¡ d d d }|dkrÒ|d }t |td||d ? @ ƒ¡ t ||t|d ƒ¡ t | j| j|¡ q|W 5 t 	|¡ X |söt | j| j¡ n(t|tƒ�rt | j|j¡ d| _nt‚dS )	z*Initialize the integer to the given value.Fz-A floating point type is not a natural numberTr   Nr   é    ì   ÿÿ )r%   Ú_mpz_pÚ_initializedÚ
isinstanceÚfloatÚ
ValueErrorr   Ú_gmpZmpz_initÚ	mpz_clearÚabsÚ
bit_lengthZ
mpz_set_uir   Úmpz_mul_2expÚmpz_addÚmpz_negr*   Úmpz_init_setÚNotImplementedError)r   ÚvalueÚtmpZpositiveÚreduceÚslotsr   r   r   Ú__init__¡   s:    

ÿzIntegerGMP.__init__c              	   C   s�   t ƒ }t || j¡ zXd}d}t || j¡dkrjt |¡d@ }|||d > O }t ||t	dƒ¡ |d }qW 5 t |¡ X | dk rˆ| }t
|ƒS )Nr   r,   r+   r   )r%   r2   r9   r-   r3   Úmpz_cmpÚ_zero_mpz_pZ
mpz_get_uiÚmpz_tdiv_q_2expr   Úint)r   r<   r;   ZslotZlsbr   r   r   Ú__int__Ë   s    zIntegerGMP.__int__c                 C   s   t t| ƒƒS r$   )ÚstrrC   ©r   r   r   r   Ú__str__Þ   s    zIntegerGMP.__str__c                 C   s   dt | ƒ S )NzInteger(%s))rE   rF   r   r   r   Ú__repr__á   s    zIntegerGMP.__repr__c                 C   s   t t| ƒƒS r$   )ÚhexrC   rF   r   r   r   Ú__hex__å   s    zIntegerGMP.__hex__c                 C   s   t | ƒS r$   )rC   rF   r   r   r   Ú	__index__é   s    zIntegerGMP.__index__Úbigc                    sF  ˆdk rt dƒ‚t ˆj¡‰ tdkr>d}tdˆ |d d ƒ‰ n*tdkr`d	}tdˆ |d
 d ƒ‰ nt dƒ‚‡ ‡fdd„tˆ ƒD ƒ}tjd|ˆ   f|žŽ }t	|ƒ| }|dkr¸| 
d¡}nJ|dkrê|d|… d| krÜt dƒ‚||d… }n|dk �rd|  | }|dk�r|ddd… }n|dk�r(nt dƒ‚t	|ƒdk�rBd}|S )aª  Convert the number into a byte string.

        This method encodes the number in network order and prepends
        as many zero bytes as required. It only works for non-negative
        values.

        :Parameters:
          block_size : integer
            The exact size the output byte string must have.
            If zero, the string has the minimal length.
          byteorder : string
            'big' for big-endian integers (default), 'little' for litte-endian.
        :Returns:
          A byte string.
        :Raise ValueError:
          If the value is negative or if ``block_size`` is
          provided and the length of the byte string would exceed it.
        r   ú.Conversion only valid for non-negative numbersr+   ÚLr   é   r   é@   ÚQé   r(   zUnknown limb sizec                    s"   g | ]}t  ˆjˆ | d  ¡‘qS )r   )r2   Úmpz_getlimbnr-   )Ú.0Úi©Z	num_limbsr   r   r   Ú
<listcomp>  s     z'IntegerGMP.to_bytes.<locals>.<listcomp>ú>ó    Nz@Number is too big to convert to byte string of prescribed lengthÚlittleéÿÿÿÿrL   úIncorrect byteorder)r1   r2   Zmpz_sizer-   Ú	_sys_bitsÚmaxÚrangeÚstructÚpackÚlenÚlstrip)r   Ú
block_sizeÚ	byteorderZspcharZlimbsÚresultZ
cutoff_lenr   rV   r   Úto_bytesì   s:    


zIntegerGMP.to_bytesc              
   C   sd   t dƒ}|dkrn"|dkr,t| ƒ} |  ¡  ntdƒ‚t |jtt| ƒƒdtdƒdtdƒt	| ƒ¡ |S )aŽ  Convert a byte string into a number.

        :Parameters:
          byte_string : byte string
            The input number, encoded in network order.
            It can only be non-negative.
          byteorder : string
            'big' for big-endian integers (default), 'little' for litte-endian.

        :Return:
          The ``Integer`` object carrying the same value as the input.
        r   rL   rZ   r\   r   )
r*   Ú	bytearrayÚreverser1   r2   Z
mpz_importr-   r   rb   r   )Zbyte_stringre   rf   r   r   r   Ú
from_bytes(  s"    

ùzIntegerGMP.from_bytesc                 C   s    t |tƒst|ƒ}|| j|jƒS r$   )r/   r*   r-   )r   r   Útermr   r   r   Ú_apply_and_returnI  s    
zIntegerGMP._apply_and_returnc                 C   s(   t |tƒst|ƒsdS |  tj|¡dkS )NFr   ©r/   r*   r   rl   r2   r@   ©r   rk   r   r   r   Ú__eq__N  s    zIntegerGMP.__eq__c                 C   s(   t |tƒst|ƒsdS |  tj|¡dkS )NTr   rm   rn   r   r   r   Ú__ne__S  s    zIntegerGMP.__ne__c                 C   s   |   tj|¡dk S ©Nr   ©rl   r2   r@   rn   r   r   r   Ú__lt__X  s    zIntegerGMP.__lt__c                 C   s   |   tj|¡dkS rq   rr   rn   r   r   r   Ú__le__[  s    zIntegerGMP.__le__c                 C   s   |   tj|¡dkS rq   rr   rn   r   r   r   Ú__gt__^  s    zIntegerGMP.__gt__c                 C   s   |   tj|¡dkS rq   rr   rn   r   r   r   Ú__ge__a  s    zIntegerGMP.__ge__c                 C   s   t  | j| j¡dkS rq   ©r2   r@   r-   rA   rF   r   r   r   Ú__nonzero__d  s    zIntegerGMP.__nonzero__c                 C   s   t  | j| j¡dk S rq   rw   rF   r   r   r   Úis_negativeh  s    zIntegerGMP.is_negativec                 C   sP   t dƒ}t|t ƒs8zt |ƒ}W n tk
r6   t Y S X t |j| j|j¡ |S rq   )r*   r/   r:   ÚNotImplementedr2   r7   r-   ©r   rk   rf   r   r   r   Ú__add__l  s    

þzIntegerGMP.__add__c                 C   sP   t dƒ}t|t ƒs8zt |ƒ}W n tk
r6   t Y S X t |j| j|j¡ |S rq   )r*   r/   r:   rz   r2   Úmpz_subr-   r{   r   r   r   Ú__sub__x  s    

þzIntegerGMP.__sub__c                 C   sP   t dƒ}t|t ƒs8zt |ƒ}W n tk
r6   t Y S X t |j| j|j¡ |S rq   )r*   r/   r:   rz   r2   Úmpz_mulr-   r{   r   r   r   Ú__mul__„  s    

þzIntegerGMP.__mul__c                 C   sN   t |tƒst|ƒ}t |j| j¡dkr.tdƒ‚tdƒ}t |j| j|j¡ |S )Nr   úDivision by zero)r/   r*   r2   r@   r-   rA   ÚZeroDivisionErrorZ
mpz_fdiv_q)r   Údivisorrf   r   r   r   Ú__floordiv__�  s    
ÿÿþzIntegerGMP.__floordiv__c                 C   sb   t |tƒst|ƒ}t |j| j¡}|dkr2tdƒ‚|dk rBtdƒ‚tdƒ}t |j| j|j¡ |S ©Nr   r�   úModulus must be positive©	r/   r*   r2   r@   r-   rA   r‚   r1   Zmpz_mod)r   rƒ   Úcomprf   r   r   r   Ú__mod__œ  s    
ÿþzIntegerGMP.__mod__Nc                 C   sæ   |d krD|dk rt dƒ‚|dkr(t dƒ‚t | j| jtt|ƒƒ¡ nžt|tƒsVt|ƒ}|sbtdƒ‚| 	¡ rrt dƒ‚t
|ƒrº|dk rŠt dƒ‚|dk r°t | j| jt|ƒ|j¡ | S t|ƒ}n| 	¡ rÊt dƒ‚t | j| j|j|j¡ | S )Nr   zExponent must not be negativeé   zExponent is too bigr�   r†   é   )r1   r2   Z
mpz_pow_uir-   r   rC   r/   r*   r‚   ry   r   Zmpz_powm_uiZmpz_powm)r   ÚexponentÚmodulusr   r   r   Úinplace_pow«  sD    
þ
ý
ýzIntegerGMP.inplace_powc                 C   s   t | ƒ}| ||¡S r$   )r*   rŽ   )r   rŒ   r�   rf   r   r   r   Ú__pow__Ò  s    zIntegerGMP.__pow__c                 C   s   t dƒ}t |j| j¡ |S rq   )r*   r2   Zmpz_absr-   )r   rf   r   r   r   Ú__abs__Ö  s    zIntegerGMP.__abs__c                 C   sf   |dkr2| dk rt dƒ‚tdƒ}t |j| j¡ n0|dkrBt dƒ‚t|ƒ}t|  t| ƒ| |¡ƒ}|S )zGReturn the largest Integer that does not
        exceed the square rootNr   zSquare root of negative valuer†   )r1   r*   r2   Zmpz_sqrtr-   rC   Z_tonelli_shanks©r   r�   rf   r   r   r   ÚsqrtÛ  s    ÿzIntegerGMP.sqrtc                 C   sŽ   t |ƒrvd|  krdk r:n nt | j| jt|ƒ¡ | S d|  k rNdk rnn nt | j| jt| ƒ¡ | S t|ƒ}t | j| j|j¡ | S ©Nr   r‹   é ÿÿ)r   r2   Ú
mpz_add_uir-   r   Ú
mpz_sub_uir*   r7   rn   r   r   r   Ú__iadd__í  s&    þþþzIntegerGMP.__iadd__c                 C   sŽ   t |ƒrvd|  krdk r:n nt | j| jt|ƒ¡ | S d|  k rNdk rnn nt | j| jt| ƒ¡ | S t|ƒ}t | j| j|j¡ | S r“   )r   r2   r–   r-   r   r•   r*   r}   rn   r   r   r   Ú__isub__ÿ  s&    þþþzIntegerGMP.__isub__c                 C   sž   t |ƒr†d|  krdk r:n nt | j| jt|ƒ¡ | S d|  k rNdk r~n n,t | j| jt| ƒ¡ t | j| j¡ | S t|ƒ}t | j| j|j¡ | S r“   )r   r2   Z
mpz_mul_uir-   r   r8   r*   r   rn   r   r   r   Ú__imul__  s(    þþþzIntegerGMP.__imul__c                 C   sZ   t |tƒst|ƒ}t |j|j¡}|dkr2tdƒ‚|dk rBtdƒ‚t | j| j|j¡ | S r…   r‡   )r   rƒ   rˆ   r   r   r   Ú__imod__$  s    
ÿþzIntegerGMP.__imod__c                 C   s2   t dƒ}t|t ƒst |ƒ}t |j| j|j¡ |S rq   )r*   r/   r2   Zmpz_andr-   r{   r   r   r   Ú__and__3  s    
þzIntegerGMP.__and__c                 C   s2   t dƒ}t|t ƒst |ƒ}t |j| j|j¡ |S rq   )r*   r/   r2   Zmpz_iorr-   r{   r   r   r   Ú__or__<  s    
þzIntegerGMP.__or__c                 C   sN   t dƒ}|dk rtdƒ‚|dkr0| dk r,dS dS t |j| jtt|ƒƒ¡ |S ©Nr   znegative shift countr‹   r[   )r*   r1   r2   rB   r-   r   rC   ©r   Úposrf   r   r   r   Ú
__rshift__E  s    
þzIntegerGMP.__rshift__c                 C   sF   |dk rt dƒ‚|dkr(| dk r$dS dS t | j| jtt|ƒƒ¡ | S r�   )r1   r2   rB   r-   r   rC   ©r   rŸ   r   r   r   Ú__irshift__S  s    
þzIntegerGMP.__irshift__c                 C   sD   t dƒ}d|  krdk s&n tdƒ‚t |j| jtt|ƒƒ¡ |S ©Nr   r‹   zIncorrect shift count)r*   r1   r2   r6   r-   r   rC   rž   r   r   r   Ú
__lshift__`  s    
þzIntegerGMP.__lshift__c                 C   s<   d|  krdk sn t dƒ‚t | j| jtt|ƒƒ¡ | S r£   )r1   r2   r6   r-   r   rC   r¡   r   r   r   Ú__ilshift__i  s    
þzIntegerGMP.__ilshift__c                 C   sF   | dk rt dƒ‚|dk r t dƒ‚|dkr,dS tt | jtt|ƒƒ¡ƒS )zPReturn True if the n-th bit is set to 1.
        Bit 0 is the least significant.r   z)no bit representation for negative valuesznegative bit countr‹   )r1   Úboolr2   Ú
mpz_tstbitr-   r   rC   )r   Únr   r   r   Úget_bitq  s    

ÿzIntegerGMP.get_bitc                 C   s   t  | jd¡dkS )Nr   r   ©r2   r§   r-   rF   r   r   r   Úis_odd  s    zIntegerGMP.is_oddc                 C   s   t  | jd¡dkS rq   rª   rF   r   r   r   Úis_even‚  s    zIntegerGMP.is_evenc                 C   s   | dk rt dƒ‚t | jd¡S )z=Return the minimum number of bits that can encode the number.r   rM   é   )r1   r2   Zmpz_sizeinbaser-   rF   r   r   r   Úsize_in_bits…  s    zIntegerGMP.size_in_bitsc                 C   s   |   ¡ d d d S )z>Return the minimum number of bytes that can encode the number.r   r(   )r®   rF   r   r   r   Úsize_in_bytesŒ  s    zIntegerGMP.size_in_bytesc                 C   s   t  | j¡dkS rq   )r2   Zmpz_perfect_square_pr-   rF   r   r   r   Úis_perfect_square�  s    zIntegerGMP.is_perfect_squarec                 C   sb   t |ƒrFd|  k rdk r>n nt | jt|ƒ¡r:tdƒ‚dS t|ƒ}t | j|j¡r^tdƒ‚dS )z3Raise an exception if the small prime is a divisor.r   r‹   zThe value is compositeN)r   r2   Zmpz_divisible_ui_pr-   r   r1   r*   Zmpz_divisible_p)r   Zsmall_primer   r   r   Úfail_if_divisible_by“  s    ÿÿzIntegerGMP.fail_if_divisible_byc                 C   s    t |tƒst|ƒ}t|ƒrˆd|  k r.dk rLn nt | j|jt|ƒ¡ | S d|  k r`dk r€n nt | j|jt| ƒ¡ | S t|ƒ}t | j|j|j¡ | S )z/Increment the number by the product of a and b.r   r‹   r”   )	r/   r*   r   r2   Zmpz_addmul_uir-   r   Zmpz_submul_uiZ
mpz_addmul)r   ÚaÚbr   r   r   Úmultiply_accumulate¡  s*    
þþþzIntegerGMP.multiply_accumulatec                 C   s&   t |tƒst|ƒ}t | j|j¡ | S )z'Set the Integer to have the given value)r/   r*   r2   Zmpz_setr-   )r   Úsourcer   r   r   Úset·  s    
ÿzIntegerGMP.setc                 C   sf   t |tƒst|ƒ}t |j| j¡}|dkr2tdƒ‚|dk rBtdƒ‚t | j| j|j¡}|sbtdƒ‚| S )z…Compute the inverse of this number in the ring of
        modulo integers.

        Raise an exception if no inverse exists.
        r   úModulus cannot be zeror†   z No inverse value can be computed)	r/   r*   r2   r@   r-   rA   r‚   r1   Z
mpz_invert)r   r�   rˆ   rf   r   r   r   Úinplace_inverseÀ  s     
ÿþzIntegerGMP.inplace_inversec                 C   s   t | ƒ}| |¡ |S r$   )r*   r¸   r‘   r   r   r   ÚinverseØ  s    
zIntegerGMP.inversec                 C   sb   t dƒ}t|ƒrJd|  k r$dk rBn nt |j| jt|ƒ¡ |S t |ƒ}t |j| j|j¡ |S )zUCompute the greatest common denominator between this
        number and another term.r   iÿÿ  )r*   r   r2   Z
mpz_gcd_uir-   r   Zmpz_gcdr{   r   r   r   ÚgcdÝ  s    þzIntegerGMP.gcdc                 C   s2   t dƒ}t|t ƒst |ƒ}t |j| j|j¡ |S )zQCompute the least common multiplier between this
        number and another term.r   )r*   r/   r2   Zmpz_lcmr-   r{   r   r   r   Úlcmì  s
    
zIntegerGMP.lcmc                 C   sL   t | tƒst| ƒ} t |tƒs$t|ƒ}|dks4| ¡ r<tdƒ‚t | j|j¡S )zCompute the Jacobi symbolr   z,n must be positive odd for the Jacobi symbol)r/   r*   r¬   r1   r2   Z
mpz_jacobir-   )r²   r¨   r   r   r   Újacobi_symbolö  s    

zIntegerGMP.jacobi_symbolc                 C   s„   t | tƒst| ƒ} t |tƒs$t|ƒ}t |tƒs6t|ƒ}|dk rFtdƒ‚|dkrVtdƒ‚|d@ dkrjtdƒ‚| | | }| | ¡ ¡S )Nr   r†   r·   r   zOdd modulus is required)r/   r*   r1   r‚   rg   r¯   )Zterm1Zterm2r�   Úproductr   r   r   Ú_mult_modulo_bytes  s    


zIntegerGMP._mult_modulo_bytesc                 C   s@   z&| j d k	r| jrt | j ¡ d | _ W n tk
r:   Y nX d S r$   )r-   r.   r2   r3   r   rF   r   r   r   Ú__del__  s    

zIntegerGMP.__del__)r   rL   )rL   )N)N)N)?r   r   r   Ú__doc__r%   rA   r2   Zmpz_init_set_uir   r?   rD   rG   rH   rJ   rK   rg   Ústaticmethodrj   rl   ro   rp   rs   rt   ru   rv   rx   Ú__bool__ry   r|   r~   r€   r„   r‰   rŽ   r�   r�   r’   r—   r˜   r™   rš   r›   rœ   r    r¢   r¤   r¥   r©   r«   r¬   r®   r¯   r°   r±   r´   r¶   r¸   r¹   rº   r»   r¼   r¾   r¿   r   r   r   r   r*   ›   sv   *
< 
'

				


r*   )"Úsysr`   ZCrypto.Util.py3compatr   ZCrypto.Util._raw_apir   r   r   r   r   Z_IntegerBaser	   Zgmp_defsÚplatformÚImportErrorr   ÚimplementationÚhasattrÚobjectr   r2   r   r   r    r!   r"   r#   r%   rS   Úrestyper&   Úcalcsizer]   r*   r   r   r   r   Ú<module>   s,   :




