
    ,hl                        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(  r ed       ed	e      Zd	ed
Z eed      r ed       G 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e      Zd Zeej8                  _        n	d dlmZ d Zd ej>                  d      z  Z  G d de      Z!y)    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 Windowsgmp)libraryapi__mpir_versionzMPIR library detectedc                       e Zd Zd Zy)_GMPc                     |j                  d      r	d|dd  z   }n(|j                  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       Y/var/www/html/Resume-Scraper/venv/lib/python3.12/site-packages/Crypto/Math/_IntegerGMP.py__getattr__z_GMP.__getattr__p   sh    ??6"!DH,I__V$ 48+I !:T!ABBsI&dD!    N)__name__
__module____qualname__r"    r#   r!   r   r   n   s    	r#   r   r   ctypes)	Structurec_intc_void_pbyrefc                   "    e Zd ZdefdefdefgZy)_MPZ	_mp_alloc_mp_size_mp_dN)r$   r%   r&   r*   r+   _fields_r'   r#   r!   r.   r.      s!     %('h')r#   r.   c                  (    t        t                     S N)r,   r.   r'   r#   r!   new_mpzr5      s    TV}r#   )ffic                  ,    t        j                  d      S )NzMPZ*)r6   newr'   r#   r!   r5   r5      s    wwvr#      Pc                      e Zd ZdZ e       Zej                  e ed             d Z	d Z
d Zd Zd Zd Zd8d	Zed9d
       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. Z5d/ Z6d0 Z7d1 Z8d2 Z9d3 Z:d4 Z;ed5        Z<ed6        Z=d7 Z>y);
IntegerGMPz#A fast, arbitrary precision integerr   c           	         t               | _        d| _        t        |t              rt        d      t        |      r>t        j                  | j                         d| _        |dk(  ryt               }t        j                  |       	 |dk\  }t        |      }|j                         dz
  dz  dz   }|dkD  r|dz
  }t        j                  |t        d||dz  z	  z               t        j                  ||t        |dz               t        j                  | j                  | j                  |       |dkD  rt        j                  |       |s+t        j!                  | j                  | j                         yyt        |t"              r2t        j%                  | j                  |j                         d| _        yt&        # t        j                  |       w xY w)	z*Initialize the integer to the given value.Fz-A floating point type is not a natural numberTr   Nr	           )r5   _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)r   valuetmppositivereduceslotss         r!   __init__zIntegerGMP.__init__   s{    i!eU#LMMMM$++& $Dz)CMM#$ A:U**,q0R7!;ai!AIEOOC$+J&URZ:P,Q$RT%%c3
0CDLLdkk3? ai s#T[[$++6  z*dkk5<<8 $D%% s#s   
B.G Gc                    t               }t        j                  || j                         	 d}d}t        j	                  || j
                        dk7  rlt        j                  |      dz  }|||dz  z  z  }t        j                  ||t        d             |dz   }t        j	                  || j
                        dk7  rlt        j                  |       | dk  r| }t        |      S # t        j                  |       w xY w)Nr   r?   r>   r	   )r5   rE   rN   r@   mpz_cmp_zero_mpz_p
mpz_get_uimpz_tdiv_q_2expr   rL   int)r   rQ   rP   slotlsbs        r!   __int__zIntegerGMP.__int__   s    i#t{{+		 ED,,sD$4$45:ooc*Z7++$$S#wr{;ax	 ,,sD$4$45: NN3!8FE5z	 NN3s   BC' 'C>c                 *    t        t        |             S r4   )strr[   r   s    r!   __str__zIntegerGMP.__str__       3t9~r#   c                     dt        |       z  S )NzInteger(%s))r`   ra   s    r!   __repr__zIntegerGMP.__repr__   s    s4y((r#   c                 *    t        t        |             S r4   )hexr[   ra   s    r!   __hex__zIntegerGMP.__hex__   rc   r#   c                     t        |       S r4   )r[   ra   s    r!   	__index__zIntegerGMP.__index__   s    4yr#   c                    | dk  rt        d      t        j                  | j                        }t        dk(  rd}t        d||dz   dz        }n*t        dk(  rd	}t        d||d
z   dz        }nt        d      t        |      D cg c](  }t        j                  | j                  ||z
  dz
        * }}t        j                  d||z  z   g| }t        |      |z
  }|dk(  r|j                  d      }n/|dkD  r|d| d|z  k7  rt        d      ||d }n|dk  r	d| z  |z   }|dk(  r	|ddd   }n|dk(  rnt        d      t        |      dk(  rd}|S c c}w )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   r9   zUnknown limb size>    Nz@Number is too big to convert to byte string of prescribed lengthlittlebigIncorrect byteorder)rD   rE   mpz_sizer@   	_sys_bitsmaxrangempz_getlimbnstructpacklenlstrip)	r   
block_size	byteorder	num_limbsspcharilimbsresult
cutoff_lens	            r!   to_byteszIntegerGMP.to_bytes   s   ( !8MNNMM$++.	?FAy:>a*?@I"_FAy:>a*?@I011 MRR[L\]q""4;;	A0AB]]S6I#55>>[:-
?]]7+F!^kz"g&<<  "D E EJK(F!^,v5F DbD\F%233v;!F1 ^s   -Ec                 $   t        d      }|dk(  rn,|dk(  rt        |       } | j                          nt        d      t        j                  |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   rv   rt   rw   r	   )
r<   	bytearrayreverserD   rE   
mpz_importr@   r   r   r   )byte_stringr   r   s      r!   
from_byteszIntegerGMP.from_bytes(  s     A("#K0K!233 [!12  #K0	2 r#   c                 r    t        |t              st        |      } || j                  |j                        S r4   )rB   r<   r@   )r   r    terms      r!   _apply_and_returnzIntegerGMP._apply_and_returnI  s+    $
+d#DDKK--r#   c                     t        |t              st        |      sy| j                  t        j
                  |      dk(  S )NFr   rB   r<   r   r   rE   rW   r   r   s     r!   __eq__zIntegerGMP.__eq__N  s2    4,d0C%%dllD9Q>>r#   c                     t        |t              st        |      sy| j                  t        j
                  |      dk7  S )NTr   r   r   s     r!   __ne__zIntegerGMP.__ne__S  s2    4,d0C%%dllD9Q>>r#   c                 H    | j                  t        j                  |      dk  S Nr   r   rE   rW   r   s     r!   __lt__zIntegerGMP.__lt__X      %%dllD9A==r#   c                 H    | j                  t        j                  |      dk  S r   r   r   s     r!   __le__zIntegerGMP.__le__[      %%dllD9Q>>r#   c                 H    | j                  t        j                  |      dkD  S r   r   r   s     r!   __gt__zIntegerGMP.__gt__^  r   r#   c                 H    | j                  t        j                  |      dk\  S r   r   r   s     r!   __ge__zIntegerGMP.__ge__a  r   r#   c                 \    t         j                  | j                  | j                        dk7  S r   rE   rW   r@   rX   ra   s    r!   __nonzero__zIntegerGMP.__nonzero__d  s"    ||DKK)9)9:a??r#   c                 \    t         j                  | j                  | j                        dk  S r   r   ra   s    r!   is_negativezIntegerGMP.is_negativeh  s"    ||DKK)9)9:Q>>r#   c                     t        d      }t        |t               s	 t        |      }t        j                  |j                  | j                  |j                         |S # t        $ r	 t        cY S w xY wr   )r<   rB   rO   NotImplementedrE   rK   r@   r   r   r   s      r!   __add__zIntegerGMP.__add__l  d    A$
+&!$' 	V]][[[[	"  ' &%%&   A A10A1c                     t        d      }t        |t               s	 t        |      }t        j                  |j                  | j                  |j                         |S # t        $ r	 t        cY S w xY wr   )r<   rB   rO   r   rE   mpz_subr@   r   s      r!   __sub__zIntegerGMP.__sub__x  r   r   c                     t        d      }t        |t               s	 t        |      }t        j                  |j                  | j                  |j                         |S # t        $ r	 t        cY S w xY wr   )r<   rB   rO   r   rE   mpz_mulr@   r   s      r!   __mul__zIntegerGMP.__mul__  r   r   c                 ,   t        |t              st        |      }t        j                  |j                  | j
                        dk(  rt        d      t        d      }t        j                  |j                  | j                  |j                         |S )Nr   Division by zero)rB   r<   rE   rW   r@   rX   ZeroDivisionError
mpz_fdiv_q)r   divisorr   s      r!   __floordiv__zIntegerGMP.__floordiv__  su    ':. )G<<((*-./#$677A	( r#   c                 P   t        |t              st        |      }t        j                  |j                  | j
                        }|dk(  rt        d      |dk  rt        d      t        d      }t        j                  |j                  | j                  |j                         |S Nr   r   Modulus must be positive	rB   r<   rE   rW   r@   rX   r   rD   mpz_mod)r   r   compr   s       r!   __mod__zIntegerGMP.__mod__  s    ':. )G||GNN ,,.19#$677!8788AV]][[^^	% r#   Nc           	         |_|dk  rt        d      |dkD  rt        d      t        j                  | j                  | j                  t	        t        |                   | S t        |t              st        |      }|st        d      |j                         rt        d      t        |      rb|dk  rt        d      |dk  rAt        j                  | j                  | j                  t	        |      |j                         | S t        |      }n|j                         rt        d      t        j                  | j                  | j                  |j                  |j                         | S )Nr   zExponent must not be negative   zExponent is too bigr   r      )rD   rE   
mpz_pow_uir@   r   r[   rB   r<   r   r   r   mpz_powm_uimpz_powm)r   exponentmoduluss      r!   inplace_powzIntegerGMP.inplace_pow  s<   ?!| !@AA #~ !677OODKK KK#CM28 - gz2$W-'(:;;""$ !;<<X&a<$%DEEe#$$T[[%)[[%,X%6%,^^5  K%h/%%' !@AAMM$++++"//!..* r#   c                 <    t        |       }|j                  ||      S r4   )r<   r   )r   r   r   r   s       r!   __pow__zIntegerGMP.__pow__  s    D!!!(G44r#   c                 p    t        d      }t        j                  |j                  | j                         |S r   )r<   rE   mpz_absr@   )r   r   s     r!   __abs__zIntegerGMP.__abs__  s&    AV]]DKK0r#   c                    |G| dk  rt        d      t        d      }t        j                  |j                  | j                         |S |dk  rt        d      t        |      }t        | j                  t        |       |z  |            }|S )zGReturn the largest Integer that does not
        exceed the square rootr   zSquare root of negative valuer   )rD   r<   rE   mpz_sqrtr@   r[   _tonelli_shanksr   r   r   s      r!   sqrtzIntegerGMP.sqrt  s     ?ax !@AA]FMM&--++'  !| !;<<'lG 4 4SY5H' RSFr#   c                    t        |      rd|cxk  rdk  r9n n6t        j                  | j                  | j                  t	        |             | S d|cxk  rdk  r:n n7t        j                  | j                  | j                  t	        |              | S t        |      }t        j                  | j                  | j                  |j                         | S Nr   r    )r   rE   
mpz_add_uir@   r   
mpz_sub_uir<   rK   r   s     r!   __iadd__zIntegerGMP.__iadd__      D 5  $ '/  q  $ '0 d#DT[[[[[[	" r#   c                    t        |      rd|cxk  rdk  r9n n6t        j                  | j                  | j                  t	        |             | S d|cxk  rdk  r:n n7t        j                  | j                  | j                  t	        |              | S t        |      }t        j                  | j                  | j                  |j                         | S r   )r   rE   r   r@   r   r   r<   r   r   s     r!   __isub__zIntegerGMP.__isub__  r   r#   c                    t        |      rd|cxk  rdk  r9n n6t        j                  | j                  | j                  t	        |             | S d|cxk  rdk  rdn nat        j                  | j                  | j                  t	        |              t        j                  | j                  | j                         | S t        |      }t        j                  | j                  | j                  |j                         | S r   )r   rE   
mpz_mul_uir@   r   rM   r<   r   r   s     r!   __imul__zIntegerGMP.__imul__  s    D 5  $ '/  q  $ '0 T[[$++6d#DT[[[[[[	" r#   c                 :   t        |t              st        |      }t        j                  |j                  |j
                        }|dk(  rt        d      |dk  rt        d      t        j                  | j                  | j                  |j                         | S r   r   )r   r   r   s      r!   __imod__zIntegerGMP.__imod__$  s    ':. )G||GNN#//119#$677!8788T[[[[^^	% r#   c                     t        d      }t        |t               st        |      }t        j                  |j                  | j                  |j                         |S r   )r<   rB   rE   mpz_andr@   r   s      r!   __and__zIntegerGMP.__and__3  F    A$
+d#DV]][[[[	" r#   c                     t        d      }t        |t               st        |      }t        j                  |j                  | j                  |j                         |S r   )r<   rB   rE   mpz_iorr@   r   s      r!   __or__zIntegerGMP.__or__<  r   r#   c           	          t        d      }|dk  rt        d      |dkD  r| dk  ryyt        j                  |j                  | j                  t        t        |                   |S Nr   znegative shift countr   ru   )r<   rD   rE   rZ   r@   r   r[   r   posr   s      r!   
__rshift__zIntegerGMP.__rshift__E  s`    A7344;axV]]![[$SX.	0 r#   c           	          |dk  rt        d      |dkD  r| dk  ryyt        j                  | j                  | j                  t	        t        |                   | S r   )rD   rE   rZ   r@   r   r[   r   r   s     r!   __irshift__zIntegerGMP.__irshift__S  sW    7344;axT[[![[$SX.	0 r#   c           	          t        d      }d|cxk  rdk  st        d       t        d      t        j                  |j                  | j                  t        t        |                   |S Nr   r   zIncorrect shift count)r<   rD   rE   rJ   r@   r   r[   r   s      r!   
__lshift__zIntegerGMP.__lshift__`  sc    AC%455  455&--++!#c(+	- r#   c           	          d|cxk  rdk  st        d       t        d      t        j                  | j                  | j                  t	        t        |                   | S r   )rD   rE   rJ   r@   r   r[   r   s     r!   __ilshift__zIntegerGMP.__ilshift__i  sZ    C%455  455$++++!#c(+	- r#   c           
          | dk  rt        d      |dk  rt        d      |dkD  ryt        t        j                  | 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   )rD   boolrE   
mpz_tstbitr@   r   r[   )r   ns     r!   get_bitzIntegerGMP.get_bitq  s]     !8HIIq5122u9DOODKK$+CFO5 6 	6r#   c                 H    t         j                  | j                  d      dk(  S )Nr   r	   rE   r   r@   ra   s    r!   is_oddzIntegerGMP.is_odd      t{{A.!33r#   c                 H    t         j                  | j                  d      dk(  S r   r   ra   s    r!   is_evenzIntegerGMP.is_even  r   r#   c                 b    | dk  rt        d      t        j                  | j                  d      S )z=Return the minimum number of bits that can encode the number.r   rl      )rD   rE   mpz_sizeinbaser@   ra   s    r!   size_in_bitszIntegerGMP.size_in_bits  s.     !8MNN""4;;22r#   c                 4    | j                         dz
  dz  dz   S )z>Return the minimum number of bytes that can encode the number.r	   r9   )r  ra   s    r!   size_in_byteszIntegerGMP.size_in_bytes  s     !!#a'A-11r#   c                 F    t         j                  | j                        dk7  S r   )rE   mpz_perfect_square_pr@   ra   s    r!   is_perfect_squarezIntegerGMP.is_perfect_square  s    ((5::r#   c                     t        |      rNd|cxk  rdk  r8n n5t        j                  | j                  t	        |            rt        d      yt        |      }t        j                  | j                  |j                        rt        d      y)z3Raise an exception if the small prime is a divisor.r   r   zThe value is compositeN)r   rE   mpz_divisible_ui_pr@   r   rD   r<   mpz_divisible_p)r   small_primes     r!   fail_if_divisible_byzIntegerGMP.fail_if_divisible_by  s}     %;&&**4;;+2;+?A$%=>>$[1K + 2 245664r#   c                    t        |t              st        |      }t        |      rd|cxk  rdk  r9n n6t        j	                  | j
                  |j
                  t        |             | S d|cxk  rdk  r:n n7t        j                  | j
                  |j
                  t        |              | S t        |      }t        j                  | j
                  |j
                  |j
                         | S )z/Increment the number by the product of a and b.r   r   r   )	rB   r<   r   rE   mpz_addmul_uir@   r   mpz_submul_ui
mpz_addmul)r   abs      r!   multiply_accumulatezIntegerGMP.multiply_accumulate  s     !Z(1A1}u}""4;;#$88#*1:/ ~A~""4;;#$88#*A2;0 1A	" r#   c                     t        |t              st        |      }t        j                  | j                  |j                         | S )z'Set the Integer to have the given value)rB   r<   rE   mpz_setr@   )r   sources     r!   setzIntegerGMP.set  s6     &*-'FT[[]]	$r#   c                 T   t        |t              st        |      }t        j                  |j                  | j
                        }|dk(  rt        d      |dk  rt        d      t        j                  | 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)	rB   r<   rE   rW   r@   rX   r   rD   
mpz_invert)r   r   r   r   s       r!   inplace_inversezIntegerGMP.inplace_inverse  s     ':. )G||GNN ,,.19#$<==!8788!%!(1 ?@@r#   c                 >    t        |       }|j                  |       |S r4   )r<   r  r   s      r!   inversezIntegerGMP.inverse  s    D!w'r#   c                 :   t        d      }t        |      rOd|cxk  rdk  r9n n6t        j                  |j                  | j                  t        |             |S t        |      }t        j                  |j                  | j                  |j                         |S )zUCompute the greatest common denominator between this
        number and another term.r   i  )r<   r   rE   
mpz_gcd_uir@   r   mpz_gcdr   s      r!   gcdzIntegerGMP.gcd  st     A4% $ '/ d#DV]]DKK=r#   c                     t        d      }t        |t               st        |      }t        j                  |j                  | j                  |j                         |S )zQCompute the least common multiplier between this
        number and another term.r   )r<   rB   rE   mpz_lcmr@   r   s      r!   lcmzIntegerGMP.lcm  sB     A$
+d#DV]]DKK=r#   c                    t        | t              st        |       } t        |t              st        |      }|dk  s|j                         rt        d      t        j                  | j                  |j                        S )zCompute the Jacobi symbolr   z,n must be positive odd for the Jacobi symbol)rB   r<   r  rD   rE   
mpz_jacobir@   )r  r   s     r!   jacobi_symbolzIntegerGMP.jacobi_symbol  s^     !Z(1A!Z(1A6QYY[KLLqxx22r#   c                 X   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      | |z  |z  }|j	                  |j                               S )Nr   r   r  r	   zOdd modulus is required)rB   r<   rD   r   r   r  )term1term2r   products       r!   _mult_modulo_byteszIntegerGMP._mult_modulo_bytes  s    %,u%E%,u%E':. )GQ;788a<#$<==aKA6775=G+ 5 5 788r#   c                     	 | j                   +| j                  rt        j                  | j                          d | _         y # t        $ r Y y w xY wr4   )r@   rA   rE   rL   r   ra   s    r!   __del__zIntegerGMP.__del__  sC    	{{&$$NN4;;/DK 		s   >A 	AA)r   rv   )rv   r4   )?r$   r%   r&   __doc__r5   rX   rE   mpz_init_set_uir   rU   r^   rb   re   rh   rj   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+  r0  r2  r'   r#   r!   r<   r<      s[   -)Kgaj1'&T&):x  @.
?
?
>?>?@H?



%N5
$$$&64432;7,0
 	3 	3 9 9&	r#   r<   )"sysr}   Crypto.Util.py3compatr   Crypto.Util._raw_apir   r   r   r   r   _IntegerBaser
   gmp_defsplatformImportErrorr   implementationhasattrobjectr   rE   r(   r)   r*   r+   r,   r.   r5   r|   restyper6   calcsizery   r<   r'   r#   r!   <module>rC     s   >   /B B &8t <<7
0
11uh"73
3 !
-
..6  v %H$88)y )
 !(D )
 $$	D
 D
r#   