
    <fGk                        d dl Z d dlmZmZ d dlmZmZmZmZm	Z	m
Z
mZmZmZ ddlmZ dZe j        dk    r ed           ed	e          Zd	ed
Z eed          r ed          ed         dk    rd dlmZmZmZmZ  G d de          Zd Zn	d dlmZ d Z G d de          Z e            Z  G d de          Z!dS )    N)tobytesis_native_int)	backendload_libget_raw_bufferget_c_stringnull_pointercreate_string_bufferc_ulongc_size_tc_uint8_ptr   )IntegerBaseaY  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);
        win32zNot using GMP on Windowsgmp)libraryapi__mpir_versionzMPIR library detectedr   ctypes)	Structurec_intc_void_pbyrefc                   $    e Zd ZdefdefdefgZdS )_MPZ	_mp_alloc_mp_size_mp_dN)__name__
__module____qualname__r   r   _fields_     f/home/panchajanya/Development/work/volatility3/lib/python3.11/site-packages/Crypto/Math/_IntegerGMP.pyr   r   p   s-         %('h')r$   r   c                  8    t          t                                S N)r   r   r#   r$   r%   new_mpzr(   u   s    TVV}}r$   )ffic                  *    t          j        d          S )NzMPZ*)r)   newr#   r$   r%   r(   r(   |   s    wvr$   c                       e Zd Zd ZdS )_GMPc                    |                     d          rd|dd          z   }n5|                     d          rd|dd          z   }nt          d|z            t          t          |          }t	          | ||           |S )Nmpz___gmpz_   gmp___gmp_zAttribute %s is invalid)
startswithAttributeErrorgetattrlibsetattr)selfname	func_namefuncs       r%   __getattr__z_GMP.__getattr__   s    ??6"" 	C!DH,II__V$$ 	C 48+II !:T!ABBBsI&&dD!!!r$   N)r   r    r!   r=   r#   r$   r%   r-   r-      s#        	 	 	 	 	r$   r-   c                      e Zd ZdZ e            Ze                    e ed                     d Z	d Z
d Zd Zd Zd Zd9d
Zed:d            Zd Zd Zd Zd Zd Zd Zd Zd ZeZd Zd Zd Zd Zd Zd Z d;dZ!d;dZ"d Z#d;dZ$d Z%d  Z&d! Z'd" Z(d# Z)d$ Z*d% Z+d& Z,d' Z-d( Z.d) Z/d* Z0d+ Z1d, Z2d- Z3d. Z4d/ Z5d0 Z6d1 Z7d2 Z8d3 Z9d4 Z:d5 Z;ed6             Z<ed7             Z=d8 Z>dS )<
IntegerGMPz#A fast, arbitrary precision integerr   c           	      6   t                      | _        d| _        t          |t                    rt          d          t          |          rt                              | j                   d| _        |dk    rdS t                      }t                              |           	 |dk    }t          |          }|
                                dz
  dz  dz   }|dk    r|dz
  }t                              |t          d||dz  z	  z                       t                              ||t          |dz                       t                              | j        | j        |           |dk    t                              |           n# t                              |           w xY w|s't                              | j        | j                   dS dS t          |t"                    r.t                              | j        |j                   d| _        dS t&          )	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   _gmpmpz_initabs
bit_length
mpz_set_uir   mpz_mul_2expmpz_add	mpz_clearmpz_negr?   mpz_init_setNotImplementedError)r9   valuetmppositivereduceslotss         r%   __init__zIntegerGMP.__init__   s    ii!eU## 	NLMMM 	&MM$+&&& $Dzz))CMM#$ A:U**,,q0R7!;aii!AIEOOC$+J&URZ:P,Q$R$RT T T%%c3
0C0CDDDLLdk3??? aii s####s#### 7T[$+666667 7 z** 	&dk5<888 $D%%s   &CF F#c                 H   t                      }t                              || j                   	 d}d}t                              || j                  dk    rzt                              |          dz  }|||dz  z  z  }t                              ||t          d                     |dz   }t                              || j                  dk    zt          	                    |           n# t          	                    |           w xY w| dk     r| }t          |          S )Nr   rB   rA   r   )r(   rH   rQ   rC   mpz_cmp_zero_mpz_p
mpz_get_uimpz_tdiv_q_2expr   rO   int)r9   rT   rS   slotlsbs        r%   __int__zIntegerGMP.__int__   s   ii#t{+++		 ED,,sD$455::ooc**Z7++$$S#wr{{;;;ax	 ,,sD$455:: NN3DNN3!88FE5zzs   B"C- -D	c                 :    t          t          |                     S r'   )strr^   r9   s    r%   __str__zIntegerGMP.__str__       3t99~~r$   c                 &    dt          |           z  S )NzInteger(%s))rc   rd   s    r%   __repr__zIntegerGMP.__repr__   s    s4yy((r$   c                 :    t          t          |                     S r'   )hexr^   rd   s    r%   __hex__zIntegerGMP.__hex__   rf   r$   c                      t          |           S r'   )r^   rd   s    r%   	__index__zIntegerGMP.__index__   s    4yyr$   bigc           
      J   | dk     rt          d          t                              | j        d          dz   dz  }||cxk    rdk    rn nt          d          t	          |          }t                              |t          dt          d          dt          d          | j                   dt          d||z
            z  t          |          z   }|d	k    rnH|d
k    r3t          |          }|                                 t          |          }nt          d          |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 numbers         z@Number is too big to convert to byte string of prescribed lengthr       rn   littleIncorrect byteorder)rG   rH   mpz_sizeinbaserC   r
   
mpz_exportr	   r   maxr   	bytearrayreversebytes)r9   
block_size	byteorderbuf_lenbufresults         r%   to_byteszIntegerGMP.to_bytes   s=   ( !88MNNN&&t{A66:q@Z####!##### 5 6 6 6"7++ 		 	 	 3q*w"6777.:M:MM(""v&&FNN6]]FF2333r$   c                 p   t          d          }|dk    rn9|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   rn   ru   rv   r   )
r?   rz   r{   rG   rH   
mpz_importrC   r   lenr   )byte_stringr~   r   s      r%   
from_byteszIntegerGMP.from_bytes  s     A(""#K00K!!!!2333 [!1!122  #K00	2 	2 	2 r$   c                 v    t          |t                    st          |          } || j        |j                  S r'   )rE   r?   rC   )r9   r<   terms      r%   _apply_and_returnzIntegerGMP._apply_and_return7  s7    $
++ 	$d##DtDK---r$   c                     t          |t                    st          |          sdS |                     t          j        |          dk    S )NFr   rE   r?   r   r   rH   rZ   r9   r   s     r%   __eq__zIntegerGMP.__eq__<  sE    4,, 	d0C0C 	5%%dlD99Q>>r$   c                     t          |t                    st          |          sdS |                     t          j        |          dk    S )NTr   r   r   s     r%   __ne__zIntegerGMP.__ne__A  sE    4,, 	d0C0C 	4%%dlD99Q>>r$   c                 J    |                      t          j        |          dk     S Nr   r   rH   rZ   r   s     r%   __lt__zIntegerGMP.__lt__F      %%dlD99A==r$   c                 J    |                      t          j        |          dk    S r   r   r   s     r%   __le__zIntegerGMP.__le__I      %%dlD99Q>>r$   c                 J    |                      t          j        |          dk    S r   r   r   s     r%   __gt__zIntegerGMP.__gt__L  r   r$   c                 J    |                      t          j        |          dk    S r   r   r   s     r%   __ge__zIntegerGMP.__ge__O  r   r$   c                 T    t                               | j        | j                  dk    S r   rH   rZ   rC   r[   rd   s    r%   __nonzero__zIntegerGMP.__nonzero__R  s     ||DK)9::a??r$   c                 T    t                               | j        | j                  dk     S r   r   rd   s    r%   is_negativezIntegerGMP.is_negativeV  s     ||DK)9::Q>>r$   c                     t          d          }t          |t                     s(	 t          |          }n# t          $ r
 t          cY S w xY wt                              |j        | j        |j                   |S r   )r?   rE   rR   NotImplementedrH   rN   rC   r9   r   r   s      r%   __add__zIntegerGMP.__add__Z      A$
++ 	&&!$''& & & &%%%%&V][[	" 	" 	"    6 A
	A
c                     t          d          }t          |t                     s(	 t          |          }n# t          $ r
 t          cY S w xY wt                              |j        | j        |j                   |S r   )r?   rE   rR   r   rH   mpz_subrC   r   s      r%   __sub__zIntegerGMP.__sub__f  r   r   c                     t          d          }t          |t                     s(	 t          |          }n# t          $ r
 t          cY S w xY wt                              |j        | j        |j                   |S r   )r?   rE   rR   r   rH   mpz_mulrC   r   s      r%   __mul__zIntegerGMP.__mul__r  r   r   c                 2   t          |t                    st          |          }t                              |j        | j                  dk    rt          d          t          d          }t                              |j        | j        |j                   |S )Nr   Division by zero)rE   r?   rH   rZ   rC   r[   ZeroDivisionError
mpz_fdiv_q)r9   divisorr   s      r%   __floordiv__zIntegerGMP.__floordiv__~  s    ':.. 	* ))G<<(* *-./ /#$6777A	( 	( 	( r$   c                 `   t          |t                    st          |          }t                              |j        | j                  }|dk    rt          d          |dk     rt          d          t          d          }t                              |j        | j        |j                   |S Nr   r   Modulus must be positive	rE   r?   rH   rZ   rC   r[   r   rG   mpz_mod)r9   r   compr   s       r%   __mod__zIntegerGMP.__mod__  s    ':.. 	* ))G||GN ,. .199#$6777!887888AV][^	% 	% 	% r$   Nc           	      $   |l|dk     rt          d          |dk    rt          d          t                              | j        | j        t	          t          |                               n!t          |t                    st          |          }|st          d          |	                                rt          d          t          |          rf|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      )rG   rH   
mpz_pow_uirC   r   r^   rE   r?   r   r   r   mpz_powm_uimpz_powm)r9   exponentmoduluss      r%   inplace_powzIntegerGMP.inplace_pow  s   ?!|| !@AAA #~~ !6777OODK K#CMM22    gz22 .$W-- <'(:;;;""$$ = !;<<<X&& Ba<<$%DEEEe##$$T[%)[%,X%6%6%,^5 5 5  K%h//%%'' B !@AAAMM$++"/!.* * * r$   c                 L    t          |           }|                    ||          S r'   )r?   r   )r9   r   r   r   s       r%   __pow__zIntegerGMP.__pow__  s%    D!!!!(G444r$   c                 n    t          d          }t                              |j        | j                   |S r   )r?   rH   mpz_absrC   )r9   r   s     r%   __abs__zIntegerGMP.__abs__  s*    AV]DK000r$   c                 L   |J| dk     rt          d          t          d          }t                              |j        | j                   nW|dk    rt          d          t          |          }t          |                     t          |           |z  |                    }|S )zGReturn the largest Integer that does not
        exceed the square rootNr   zSquare root of negative valuer   )rG   r?   rH   mpz_sqrtrC   r^   _tonelli_shanksr9   r   r   s      r%   sqrtzIntegerGMP.sqrt  s     ?axx !@AAA]]FMM&-+' ' ' ' !|| !;<<<'llG 4 4SYY5H' R RSSFr$   c                    t          |          rd|cxk    rdk     r8n n5t                              | j        | j        t	          |                     | S d|cxk     rdk     r9n n6t                              | j        | j        t	          |                      | S t          |          }t                              | j        | j        |j                   | S Nr   r    )r   rH   
mpz_add_uirC   r   
mpz_sub_uir?   rN   r   s     r%   __iadd__zIntegerGMP.__iadd__       	$D    5      $ '/ / /     q      $ '0 0 0 d##DT[[[	" 	" 	" r$   c                    t          |          rd|cxk    rdk     r8n n5t                              | j        | j        t	          |                     | S d|cxk     rdk     r9n n6t                              | j        | j        t	          |                      | S t          |          }t                              | j        | j        |j                   | S r   )r   rH   r   rC   r   r   r?   r   r   s     r%   __isub__zIntegerGMP.__isub__  r   r$   c                    t          |          rd|cxk    rdk     r8n n5t                              | j        | j        t	          |                     | S d|cxk     rdk     r^n n[t                              | j        | j        t	          |                      t                              | j        | j                   | S t          |          }t                              | j        | j        |j                   | S r   )r   rH   
mpz_mul_uirC   r   rP   r?   r   r   s     r%   __imul__zIntegerGMP.__imul__  s    	$D    5      $ '/ / /     q      $ '0 0 0 T[$+666d##DT[[[	" 	" 	" r$   c                 B   t          |t                    st          |          }t                              |j        |j                  }|dk    rt          d          |dk     rt          d          t                              | j        | j        |j                   | S r   r   )r9   r   r   s      r%   __imod__zIntegerGMP.__imod__  s    ':.. 	* ))G||GN#/1 1199#$6777!887888T[[^	% 	% 	% r$   c                     t          d          }t          |t                     st          |          }t                              |j        | j        |j                   |S r   )r?   rE   rH   mpz_andrC   r   s      r%   __and__zIntegerGMP.__and__!  W    A$
++ 	$d##DV][[	" 	" 	" r$   c                     t          d          }t          |t                     st          |          }t                              |j        | j        |j                   |S r   )r?   rE   rH   mpz_iorrC   r   s      r%   __or__zIntegerGMP.__or__*  r   r$   c           	          t          d          }|dk     rt          d          |dk    r
| dk     rdS dS t                              |j        | j        t          t          |                               |S Nr   znegative shift countr   )r?   rG   rH   r]   rC   r   r^   r9   posr   s      r%   
__rshift__zIntegerGMP.__rshift__3  sz    A773444;;axxrqV]![$SXX..	0 	0 	0 r$   c           	          |dk     rt          d          |dk    r
| dk     rdS dS t                              | j        | j        t	          t          |                               | S r   )rG   rH   r]   rC   r   r^   r9   r   s     r%   __irshift__zIntegerGMP.__irshift__A  so    773444;;axxrqT[![$SXX..	0 	0 	0 r$   c           	          t          d          }d|cxk    rdk     sn t          d          t                              |j        | j        t          t          |                               |S Nr   r   zIncorrect shift count)r?   rG   rH   rM   rC   r   r^   r   s      r%   
__lshift__zIntegerGMP.__lshift__N  st    AC%4555&-+!#c((++	- 	- 	- r$   c           	          d|cxk    rdk     sn t          d          t                              | j        | j        t	          t          |                               | S r   )rG   rH   rM   rC   r   r^   r   s     r%   __ilshift__zIntegerGMP.__ilshift__W  si    C%4555$++!#c((++	- 	- 	- r$   c           
          | 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   )rG   boolrH   
mpz_tstbitrC   r   r^   )r9   ns     r%   get_bitzIntegerGMP.get_bit_  sw     !88HIIIq551222u991DOODK$+CFFOO5 5 6 6 	6r$   c                 J    t                               | j        d          dk    S )Nr   r   rH   r   rC   rd   s    r%   is_oddzIntegerGMP.is_oddm      t{A..!33r$   c                 J    t                               | j        d          dk    S r   r   rd   s    r%   is_evenzIntegerGMP.is_evenp  r   r$   c                 l    | dk     rt          d          t                              | j        d          S )z=Return the minimum number of bits that can encode the number.r   rp   rq   )rG   rH   rw   rC   rd   s    r%   size_in_bitszIntegerGMP.size_in_bitss  s4     !88MNNN""4;222r$   c                 <    |                                  dz
  dz  dz   S )z>Return the minimum number of bytes that can encode the number.r   rs   )r   rd   s    r%   size_in_byteszIntegerGMP.size_in_bytesz  s#    !!##a'A-11r$   c                 H    t                               | j                  dk    S r   )rH   mpz_perfect_square_prC   rd   s    r%   is_perfect_squarezIntegerGMP.is_perfect_square~  s    ((55::r$   c                 F   t          |          r]d|cxk     rdk     rAn 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   rH   mpz_divisible_ui_prC   r   rG   r?   mpz_divisible_p)r9   small_primes     r%   fail_if_divisible_byzIntegerGMP.fail_if_divisible_by  s     %% 	2;&&&&&&&&&**4;+2;+?+?A A ?$%=>>>$[11K + 24 4 	75666	7 	7r$   c                    t          |t                    st          |          }t          |          rd|cxk     rdk     r8n n5t                              | j        |j        t          |                     | S d|cxk     rdk     r9n n6t                              | j        |j        t          |                      | S t          |          }t                              | j        |j        |j                   | S )z/Increment the number by the product of a and b.r   r   r   )	rE   r?   r   rH   mpz_addmul_uirC   r   mpz_submul_ui
mpz_addmul)r9   abs      r%   multiply_accumulatezIntegerGMP.multiply_accumulate  s     !Z(( 	1A 	1}}}}u}}}}}""4;#$8#*1::/ / / ~~~~A~~~~~""4;#$8#*A2;;0 0 0 1A	" 	" 	" r$   c                     t          |t                    st          |          }t                              | j        |j                   | S )z'Set the Integer to have the given value)rE   r?   rH   mpz_setrC   )r9   sources     r%   setzIntegerGMP.set  sG     &*-- 	(''FT[]	$ 	$ 	$r$   c                 d   t          |t                    st          |          }t                              |j        | j                  }|dk    rt          d          |dk     rt          d          t                              | j        | j        |j                  }|st          d          | S )zCompute 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)	rE   r?   rH   rZ   rC   r[   r   rG   
mpz_invert)r9   r   r   r   s       r%   inplace_inversezIntegerGMP.inplace_inverse  s     ':.. 	* ))G||GN ,. .199#$<===!887888!%!(1 1  	A?@@@r$   c                 N    t          |           }|                    |           |S r'   )r?   r  r   s      r%   inversezIntegerGMP.inverse  s(    D!!w'''r$   c                 @   t          d          }t          |          rTd|cxk     rdk     r8n n5t                              |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   rH   
mpz_gcd_uirC   r   mpz_gcdr   s      r%   gcdzIntegerGMP.gcd  s     A 	$4% $ '/ / / d##DV]DK===r$   c                     t          d          }t          |t                     st          |          }t                              |j        | j        |j                   |S )zQCompute the least common multiplier between this
        number and another term.r   )r?   rE   rH   mpz_lcmrC   r   s      r%   lcmzIntegerGMP.lcm  sO     A$
++ 	$d##DV]DK===r$   c                 .   t          | t                    st          |           } t          |t                    st          |          }|dk    s|                                rt          d          t                              | j        |j                  S )zCompute the Jacobi symbolr   z,n must be positive odd for the Jacobi symbol)rE   r?   r   rG   rH   
mpz_jacobirC   )r  r   s     r%   jacobi_symbolzIntegerGMP.jacobi_symbol  sz     !Z(( 	1A!Z(( 	1A66QYY[[6KLLLqx222r$   c                    t          | t                    st          |           } t          |t                    st          |          }t          |t                    st          |          }|dk     rt          d          |dk    rt          d          |dz  dk    rt          d          t	          |                                          }| |z  |z                      |          }|S )Nr   r   r  r   zOdd modulus is required)rE   r?   rG   r   r   r   )term1term2r   numbers_lenr   s        r%   _mult_modulo_byteszIntegerGMP._mult_modulo_bytes  s    %,, 	&u%%E%,, 	&u%%E':.. 	* ))GQ;;7888a<<#$<===aKA6777'**,,--5=G+55kBBr$   c                     	 | j         &| j        rt                              | j                    d | _         d S # t          $ r Y d S w xY wr'   )rC   rD   rH   rO   r5   rd   s    r%   __del__zIntegerGMP.__del__  s[    	{&$ 0NN4;///DKKK 	 	 	DD	s   48 
AA)r   rn   )rn   r'   )?r   r    r!   __doc__r(   r[   rH   mpz_init_set_uir   rX   ra   re   rh   rk   rm   r   staticmethodr   r   r   r   r   r   r   r   r   __bool__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?   r?      s       --'))Kggajj111'& '& '&V  &  ) ) )    0 0 0 0d    \@. . .
? ? ?
? ? ?
> > >? ? ?> > >? ? ?@ @ @H? ? ?
 
 

 
 

 
 

 
 
  % % % %N5 5 5 5  
   $  $  $  &              6 6 64 4 44 4 43 3 32 2 2; ; ;7 7 7  ,    0  
     	3 	3 \	3   \(	 	 	 	 	r$   r?   )"sysCrypto.Util.py3compatr   r   Crypto.Util._raw_apir   r   r   r   r	   r
   r   r   r   _IntegerBaser   gmp_defsplatformImportErrorr7   implementationhasattrr   r   r   r   r   r   r(   r)   objectr-   rH   r?   r#   r$   r%   <module>r8     s8  > 


 8 8 8 8 8 8 8 8B B B B B B B B B B B B B B B B B B B B B B
 & % % % % %5n <7
+0
1
11huh"733
73 !! /
+-
.
..
 %H$$888888888888) ) ) ) )y ) ) )
   
 )(((((  
    6    tvv|	 |	 |	 |	 |	 |	 |	 |	 |	 |	r$   