o
    MfGk                     @   s  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r3eded	eZd	ed
ZeedrFeded dkred dlmZmZmZmZ G dd deZdd Zn
d dlmZ dd ZG dd deZe Z G d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                   @   s"   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_ r!   r!   X/var/www/html/humari/django-venv/lib/python3.10/site-packages/Crypto/Math/_IntegerGMP.pyr   p   s
    r   c                   C   s
   t t S N)r   r   r!   r!   r!   r"   new_mpzu      
r$   )ffic                   C   s
   t dS )NzMPZ*)r&   newr!   r!   r!   r"   r$   |   r%   c                   @   s   e Zd Zdd ZdS )_GMPc                 C   s^   | drd|dd   }n| drd|dd   }ntd| tt|}t| || |S )Nmpz___gmpz_   gmp___gmp_zAttribute %s is invalid)
startswithAttributeErrorgetattrlibsetattr)selfname	func_namefuncr!   r!   r"   __getattr__   s   


z_GMP.__getattr__N)r   r   r   r7   r!   r!   r!   r"   r(      s    r(   c                   @   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!dod3d4Z"d5d6 Z#dod7d8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 )p
IntegerGMPz#A fast, arbitrary precision integerr   c              	   C   s6  t  | _d| _t|trtdt|rt| j d| _|dkr#dS t  }t| zG|dk}t	|}|
 d d d }|dkrl|d }t|td||d ? @  t||t|d  t| j| j| |dksBW t| nt| w |st| j| j dS dS t|trt| 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_negr8   mpz_init_setNotImplementedError)r3   valuetmppositivereduceslotsr!   r!   r"   __init__   s@   



zIntegerGMP.__init__c              	   C   s   t  }t|| j z9d}d}t|| jdkr=t|d@ }|||d > O }t||td |d }t|| jdksW t	| nt	| w | dk rQ| }t
|S )Nr   r:   r9   r   )r$   r@   rI   r;   mpz_cmp_zero_mpz_p
mpz_get_uimpz_tdiv_q_2expr
   rG   int)r3   rL   rK   slotlsbr!   r!   r"   __int__   s    zIntegerGMP.__int__c                 C      t t| S r#   )strrU   r3   r!   r!   r"   __str__      zIntegerGMP.__str__c                 C   s   dt |  S )NzInteger(%s))rZ   r[   r!   r!   r"   __repr__   r]   zIntegerGMP.__repr__c                 C   rY   r#   )hexrU   r[   r!   r!   r"   __hex__   r]   zIntegerGMP.__hex__c                 C   s   t | S r#   )rU   r[   r!   r!   r"   	__index__   s   zIntegerGMP.__index__bigc              	   C   s   | dk rt dt| jdd d }||  kr dkr!t d t|}t|tdtddtd| j dtd||  t	| }|d	krI	 |S |d
kr[t
|}|  t|}|S t d)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       rb   littleIncorrect byteorder)r?   r@   mpz_sizeinbaser;   r	   
mpz_exportr   r   maxr   	bytearrayreversebytes)r3   
block_size	byteorderbuf_lenbufresultr!   r!   r"   to_bytes   s4   	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   rb   rh   ri   r   )
r8   rm   rn   r?   r@   
mpz_importr;   r   lenr   )byte_stringrq   rt   r!   r!   r"   
from_bytes  s"   

zIntegerGMP.from_bytesc                 C   s    t |ts	t|}|| j|jS r#   )r=   r8   r;   )r3   r6   termr!   r!   r"   _apply_and_return7  s   
zIntegerGMP._apply_and_returnc                 C   s(   t |tst|sdS | tj|dkS )NFr   r=   r8   r   r{   r@   rQ   r3   rz   r!   r!   r"   __eq__<     zIntegerGMP.__eq__c                 C   s(   t |tst|sdS | tj|dkS )NTr   r|   r}   r!   r!   r"   __ne__A  r   zIntegerGMP.__ne__c                 C   s   |  tj|dk S Nr   r{   r@   rQ   r}   r!   r!   r"   __lt__F     zIntegerGMP.__lt__c                 C   s   |  tj|dkS r   r   r}   r!   r!   r"   __le__I  r   zIntegerGMP.__le__c                 C   s   |  tj|dkS r   r   r}   r!   r!   r"   __gt__L  r   zIntegerGMP.__gt__c                 C   s   |  tj|dkS r   r   r}   r!   r!   r"   __ge__O  r   zIntegerGMP.__ge__c                 C   s   t | j| jdkS r   r@   rQ   r;   rR   r[   r!   r!   r"   __nonzero__R     zIntegerGMP.__nonzero__c                 C   s   t | j| jdk S r   r   r[   r!   r!   r"   is_negativeV  r   zIntegerGMP.is_negativec                 C   N   t d}t|t szt |}W n ty   t Y S w t|j| j|j |S r   )r8   r=   rJ   NotImplementedr@   rF   r;   r3   rz   rt   r!   r!   r"   __add__Z     
zIntegerGMP.__add__c                 C   r   r   )r8   r=   rJ   r   r@   mpz_subr;   r   r!   r!   r"   __sub__f  r   zIntegerGMP.__sub__c                 C   r   r   )r8   r=   rJ   r   r@   mpz_mulr;   r   r!   r!   r"   __mul__r  r   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=   r8   r@   rQ   r;   rR   ZeroDivisionError
mpz_fdiv_q)r3   divisorrt   r!   r!   r"   __floordiv__~  s   
zIntegerGMP.__floordiv__c                 C   sb   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	r=   r8   r@   rQ   r;   rR   r   r?   mpz_mod)r3   r   comprt   r!   r!   r"   __mod__  s   
zIntegerGMP.__mod__Nc                 C   s   |d u r#|dk rt d|dkrt dt| j| jtt| | S t|ts,t|}|s2td|	 r:t dt
|r^|dk rFt d|dk rYt| j| jt||j | S t|}n|	 rft dt| j| j|j|j | S )Nr   zExponent must not be negative   zExponent is too bigr   r      )r?   r@   
mpz_pow_uir;   r
   rU   r=   r8   r   r   r   mpz_powm_uimpz_powm)r3   exponentmodulusr!   r!   r"   inplace_pow  sF   


zIntegerGMP.inplace_powc                 C   s   t | }|||S r#   )r8   r   )r3   r   r   rt   r!   r!   r"   __pow__  s   zIntegerGMP.__pow__c                 C   s   t d}t|j| j |S r   )r8   r@   mpz_absr;   )r3   rt   r!   r!   r"   __abs__  s   zIntegerGMP.__abs__c                 C   sh   |du r| dk rt dtd}t|j| j |S |dkr"t dt|}t| t| | |}|S )zGReturn the largest Integer that does not
        exceed the square rootNr   zSquare root of negative valuer   )r?   r8   r@   mpz_sqrtr;   rU   _tonelli_shanksr3   r   rt   r!   r!   r"   sqrt  s   zIntegerGMP.sqrtc                 C      t |r;d|  krdk rn nt| j| jt| | S d|  k r'dk r7n nt| j| jt|  | S t|}t| j| j|j | S Nr   r    )r   r@   
mpz_add_uir;   r
   
mpz_sub_uir8   rF   r}   r!   r!   r"   __iadd__  &   zIntegerGMP.__iadd__c                 C   r   r   )r   r@   r   r;   r
   r   r8   r   r}   r!   r!   r"   __isub__  r   zIntegerGMP.__isub__c                 C   s   t |rCd|  krdk rn nt| j| jt| | S d|  k r'dk r?n nt| j| jt|  t| j| j | S t|}t| j| j|j | S r   )r   r@   
mpz_mul_uir;   r
   rH   r8   r   r}   r!   r!   r"   __imul__  s(   zIntegerGMP.__imul__c                 C   sZ   t |ts	t|}t|j|j}|dkrtd|dk r!tdt| j| j|j | S r   r   )r3   r   r   r!   r!   r"   __imod__  s   
zIntegerGMP.__imod__c                 C   2   t d}t|t st |}t|j| j|j |S r   )r8   r=   r@   mpz_andr;   r   r!   r!   r"   __and__!     
zIntegerGMP.__and__c                 C   r   r   )r8   r=   r@   mpz_iorr;   r   r!   r!   r"   __or__*  r   zIntegerGMP.__or__c                 C   sN   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   )r8   r?   r@   rT   r;   r
   rU   r3   posrt   r!   r!   r"   
__rshift__3  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   )r?   r@   rT   r;   r
   rU   r3   r   r!   r!   r"   __irshift__A  s   
zIntegerGMP.__irshift__c                 C   sJ   t d}d|  krdk std tdt|j| jtt| |S Nr   r   zIncorrect shift count)r8   r?   r@   rE   r;   r
   rU   r   r!   r!   r"   
__lshift__N  s   
zIntegerGMP.__lshift__c                 C   sB   d|  krdk st d t dt| j| jtt| | S r   )r?   r@   rE   r;   r
   rU   r   r!   r!   r"   __ilshift__W  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   )r?   boolr@   
mpz_tstbitr;   r
   rU   )r3   nr!   r!   r"   get_bit_  s   

zIntegerGMP.get_bitc                 C   s   t | jddkS )Nr   r   r@   r   r;   r[   r!   r!   r"   is_oddm  r   zIntegerGMP.is_oddc                 C   s   t | jddkS r   r   r[   r!   r!   r"   is_evenp  r   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   rc   rd   )r?   r@   rj   r;   r[   r!   r!   r"   size_in_bitss  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   rf   )r   r[   r!   r!   r"   size_in_bytesz  s   zIntegerGMP.size_in_bytesc                 C   s   t | jdkS r   )r@   mpz_perfect_square_pr;   r[   r!   r!   r"   is_perfect_square~  s   zIntegerGMP.is_perfect_squarec                 C   sb   t |r#d|  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   r@   mpz_divisible_ui_pr;   r
   r?   r8   mpz_divisible_p)r3   small_primer!   r!   r"   fail_if_divisible_by  s   zIntegerGMP.fail_if_divisible_byc                 C   s   t |ts	t|}t|rDd|  k rdk r&n nt| j|jt| | S d|  k r0d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=   r8   r   r@   mpz_addmul_uir;   r
   mpz_submul_ui
mpz_addmul)r3   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=   r8   r@   mpz_setr;   )r3   sourcer!   r!   r"   set  s   
zIntegerGMP.setc                 C   sf   t |ts	t|}t|j| j}|dkrtd|dk r!tdt| j| j|j}|s1t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)	r=   r8   r@   rQ   r;   rR   r   r?   
mpz_invert)r3   r   r   rt   r!   r!   r"   inplace_inverse  s    
zIntegerGMP.inplace_inversec                 C   s   t | }|| |S r#   )r8   r   r   r!   r!   r"   inverse  s   
zIntegerGMP.inversec                 C   sb   t d}t|r%d|  k rdk r!n 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  )r8   r   r@   
mpz_gcd_uir;   r
   mpz_gcdr   r!   r!   r"   gcd  s   zIntegerGMP.gcdc                 C   r   )zQCompute the least common multiplier between this
        number and another term.r   )r8   r=   r@   mpz_lcmr;   r   r!   r!   r"   lcm  s
   
zIntegerGMP.lcmc                 C   sL   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)r=   r8   r   r?   r@   
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st|}|dk r#td|dkr+td|d@ dkr5tdt| }| | | |}|S )Nr   r   r   r   zOdd modulus is required)r=   r8   r?   r   rw   ru   )term1term2r   numbers_lenrt   r!   r!   r"   _mult_modulo_bytes  s   


zIntegerGMP._mult_modulo_bytesc                 C   s>   z| j d ur| jrt| j  d | _ W d S  ty   Y d S w r#   )r;   r<   r@   rG   r/   r[   r!   r!   r"   __del__  s   
zIntegerGMP.__del__)r   rb   )rb   r#   )?r   r   r   __doc__r$   rR   r@   mpz_init_set_uir
   rP   rX   r\   r^   r`   ra   ru   staticmethodry   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"   r8      sx    +
2 

'
				


r8   )"sysCrypto.Util.py3compatr   r   Crypto.Util._raw_apir   r   r   r   r   r	   r
   r   r   _IntegerBaser   gmp_defsplatformImportErrorr1   implementationhasattrr   r   r   r   r   r   r$   r&   objectr(   r@   r8   r!   r!   r!   r"   <module>   s(   ,
7



