U +Mbe@sddlZddlmZmZddlmZmZmZmZm Z m Z m Z m Z ddl mZdZejdkrbeded eZd ed Zeed red ed dkrddlmZmZmZmZGdddeZddZnddlmZddZGdddeZeZGdddeZ dS)N)tobytes is_native_int)backendload_libget_raw_buffer get_c_string null_pointercreate_string_bufferc_ulongc_size_t) 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); void mpz_clear (mpz_t x); 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); win32zNot using GMP on WindowsZgmp)ZlibraryapiZ__mpir_versionzMPIR library detectedrctypes) Structurec_intc_void_pbyrefc@s"eZdZdefdefdefgZdS)_MPZZ _mp_allocZ_mp_sizeZ_mp_dN)__name__ __module__ __qualname__rr_fields_rr>/tmp/pip-target-t616c12r/lib/python/Crypto/Math/_IntegerGMP.pyrqsrcCs ttSN)rrrrrrnew_mpzvsr)fficCs tdS)NzMPZ*)rnewrrrrr}sc@seZdZddZdS)_GMPcCs^|drd|dd}n(|dr8d|dd}n td|tt|}t||||S)NZmpz_Z__gmpz_Zgmp_Z__gmp_zAttribute %s is invalid) startswithAttributeErrorgetattrlibsetattr)selfname func_namefuncrrr __getattr__s     z_GMP.__getattr__N)rrrr+rrrrr sr c@seZdZdZeZeeedddZ ddZ ddZ d d Z d d Z d dZdjddZeddZddZddZddZddZddZddZdd Zd!d"ZeZd#d$Zd%d&Zd'd(Zd)d*Zd+d,Zd-d.Z dkd0d1Z!dld2d3Z"d4d5Z#dmd6d7Z$d8d9Z%d:d;Z&dd?Z(d@dAZ)dBdCZ*dDdEZ+dFdGZ,dHdIZ-dJdKZ.dLdMZ/dNdOZ0dPdQZ1dRdSZ2dTdUZ3dVdWZ4dXdYZ5dZd[Z6d\d]Z7d^d_Z8d`daZ9dbdcZ:dddeZ;edfdgZO}t||t d|d}qW5t|X|dkr| }t |S)Nrr.r-r ) rr4r;r/r5mpz_cmp _zero_mpz_pZ mpz_get_uimpz_tdiv_q_2expr int)r'r>r=ZslotZlsbrrr__int__s zIntegerGMP.__int__cCs tt|Sr)strrEr'rrr__str__szIntegerGMP.__str__cCs dt|S)Nz Integer(%s))rGrHrrr__repr__szIntegerGMP.__repr__cCs tt|Sr)hexrErHrrr__hex__szIntegerGMP.__hex__cCst|Sr)rErHrrr __index__szIntegerGMP.__index__c Cs|dkrtdt|jddd}||kr:dkrFnntdt|}t|tdtddtd|jdtd||t |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. :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 numbersz@Number is too big to convert to byte string of prescribed lengthr ) r3r4mpz_sizeinbaser/r Z mpz_exportrr maxr)r' block_sizebuf_lenbufrrrto_bytess  zIntegerGMP.to_bytesc Cs4td}t|jtt|dtddtd||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. :Return: The ``Integer`` object carrying the same value as the input. rr )r,r4Z mpz_importr/r len)Z byte_stringresultrrr from_bytes s  zIntegerGMP.from_bytescCs t|tst|}||j|jSr)r1r,r/)r'r*termrrr_apply_and_return"s zIntegerGMP._apply_and_returncCs(t|tst|sdS|tj|dkS)NFrr1r,rr]r4rBr'r\rrr__eq__'szIntegerGMP.__eq__cCs(t|tst|sdS|tj|dkS)NTrr^r_rrr__ne__,szIntegerGMP.__ne__cCs|tj|dkSNrr]r4rBr_rrr__lt__1szIntegerGMP.__lt__cCs|tj|dkSrbrcr_rrr__le__4szIntegerGMP.__le__cCs|tj|dkSrbrcr_rrr__gt__7szIntegerGMP.__gt__cCs|tj|dkSrbrcr_rrr__ge__:szIntegerGMP.__ge__cCst|j|jdkSrbr4rBr/rCrHrrr __nonzero__=szIntegerGMP.__nonzero__cCst|j|jdkSrbrhrHrrr is_negativeAszIntegerGMP.is_negativecCsPtd}t|ts8z t|}Wntk r6tYSXt|j|j|j|Srb)r,r1r<NotImplementedr4r9r/r'r\rZrrr__add__Es   zIntegerGMP.__add__cCsPtd}t|ts8z t|}Wntk r6tYSXt|j|j|j|Srb)r,r1r<rkr4mpz_subr/rlrrr__sub__Qs   zIntegerGMP.__sub__cCsPtd}t|ts8z t|}Wntk r6tYSXt|j|j|j|Srb)r,r1r<rkr4mpz_mulr/rlrrr__mul__]s   zIntegerGMP.__mul__cCsNt|tst|}t|j|jdkr.tdtd}t|j|j|j|S)NrDivision by zero)r1r,r4rBr/rCZeroDivisionErrorZ mpz_fdiv_q)r'divisorrZrrr __floordiv__is zIntegerGMP.__floordiv__cCsbt|tst|}t|j|j}|dkr2td|dkrBtdtd}t|j|j|j|SNrrrModulus must be positive r1r,r4rBr/rCrsr3Zmpz_mod)r'rtcomprZrrr__mod__us zIntegerGMP.__mod__NcCs|dkrD|dkrtd|dkr(tdt|j|jtt|nt|tsVt|}|sbtd| rrtdt |r|dkrtd|dkrt |j|jt||j|St|}n| rtdt |j|j|j|j|S)NrzExponent must not be negativezExponent is too bigrrrw) r3r4Z mpz_pow_uir/r rEr1r,rsrjrZ mpz_powm_uiZmpz_powm)r'exponentmodulusrrr inplace_powsD   zIntegerGMP.inplace_powcCst|}|||Sr)r,r)r'r}r~rZrrr__pow__szIntegerGMP.__pow__cCstd}t|j|j|Srb)r,r4Zmpz_absr/)r'rZrrr__abs__szIntegerGMP.__abs__cCsf|dkr2|dkrtdtd}t|j|jn0|dkrBtdt|}t|t|||}|S)zGReturn the largest Integer that does not exceed the square rootNrzSquare root of negative valuerw)r3r,r4Zmpz_sqrtr/rEZ_tonelli_shanksr'r~rZrrrsqrtszIntegerGMP.sqrtcCst|rvd|krdkr:nnt|j|jt||Sd|krNdkrnnnt|j|jt| |St|}t|j|j|j|SNrr|)rr4 mpz_add_uir/r mpz_sub_uir,r9r_rrr__iadd__s&zIntegerGMP.__iadd__cCst|rvd|krdkr:nnt|j|jt||Sd|krNdkrnnnt|j|jt| |St|}t|j|j|j|Sr)rr4rr/r rr,rnr_rrr__isub__s&zIntegerGMP.__isub__cCst|rd|krdkr:nnt|j|jt||Sd|krNdkr~nn,t|j|jt| t|j|j|St|}t|j|j|j|Sr)rr4Z mpz_mul_uir/r r:r,rpr_rrr__imul__s(zIntegerGMP.__imul__cCsZt|tst|}t|j|j}|dkr2td|dkrBtdt|j|j|j|Srvrx)r'rtryrrr__imod__s zIntegerGMP.__imod__cCs2td}t|tst|}t|j|j|j|Srb)r,r1r4Zmpz_andr/rlrrr__and__ s zIntegerGMP.__and__cCs2td}t|tst|}t|j|j|j|Srb)r,r1r4Zmpz_iorr/rlrrr__or__s zIntegerGMP.__or__cCsNtd}|dkrtd|dkr0|dkr,dSdSt|j|jtt||SNrznegative shift countr|)r,r3r4rDr/r rEr'posrZrrr __rshift__s zIntegerGMP.__rshift__cCsF|dkrtd|dkr(|dkr$dSdSt|j|jtt||Sr)r3r4rDr/r rEr'rrrr __irshift__,s zIntegerGMP.__irshift__cCsDtd}d|krdks&ntdt|j|jtt||SNrr|zIncorrect shift count)r,r3r4r8r/r rErrrr __lshift__9s zIntegerGMP.__lshift__cCs<d|krdksntdt|j|jtt||Sr)r3r4r8r/r rErrrr __ilshift__Bs zIntegerGMP.__ilshift__cCsF|dkrtd|dkr td|dkr,dStt|jtt|S)zPReturn True if the n-th bit is set to 1. Bit 0 is the least significant.rz)no bit representation for negative valuesznegative bit countr|)r3boolr4 mpz_tstbitr/r rE)r'nrrrget_bitJs  zIntegerGMP.get_bitcCst|jddkS)Nrr r4rr/rHrrris_oddXszIntegerGMP.is_oddcCst|jddkSrbrrHrrris_even[szIntegerGMP.is_evencCs|dkrtdt|jdS)z=Return the minimum number of bits that can encode the number.rrNrO)r3r4rSr/rHrrr size_in_bits^szIntegerGMP.size_in_bitscCs|dddS)z>Return the minimum number of bytes that can encode the number.r rQ)rrHrrr size_in_byteseszIntegerGMP.size_in_bytescCst|jdkSrb)r4Zmpz_perfect_square_pr/rHrrris_perfect_squareiszIntegerGMP.is_perfect_squarecCsbt|rFd|krdkr>nnt|jt|r:tddSt|}t|j|jr^tddS)z3Raise an exception if the small prime is a divisor.rr|zThe value is compositeN)rr4Zmpz_divisible_ui_pr/r r3r,Zmpz_divisible_p)r'Z small_primerrrfail_if_divisible_bylszIntegerGMP.fail_if_divisible_bycCst|tst|}t|rd|kr.dkrLnnt|j|jt||Sd|kr`dkrnnt|j|jt| |St|}t|j|j|j|S)z/Increment the number by the product of a and b.rr|r) r1r,rr4Z mpz_addmul_uir/r Z mpz_submul_uiZ mpz_addmul)r'abrrrmultiply_accumulatezs* zIntegerGMP.multiply_accumulatecCs&t|tst|}t|j|j|S)z'Set the Integer to have the given value)r1r,r4Zmpz_setr/)r'sourcerrrsets  zIntegerGMP.setcCsft|tst|}t|j|j}|dkr2td|dkrBtdt|j|j|j}|sbtd|S)zCompute the inverse of this number in the ring of modulo integers. Raise an exception if no inverse exists. rzModulus cannot be zerorwz No inverse value can be computed) r1r,r4rBr/rCrsr3Z mpz_invert)r'r~ryrZrrrinplace_inverses  zIntegerGMP.inplace_inversecCst|}|||Sr)r,rrrrrinverses zIntegerGMP.inversecCsbtd}t|rJd|kr$dkrBnnt|j|jt||St|}t|j|j|j|S)zUCompute the greatest common denominator between this number and another term.ri)r,rr4Z mpz_gcd_uir/r Zmpz_gcdrlrrrgcdszIntegerGMP.gcdcCs2td}t|tst|}t|j|j|j|S)zQCompute the least common multiplier between this number and another term.r)r,r1r4Zmpz_lcmr/rlrrrlcms  zIntegerGMP.lcmcCsLt|tst|}t|ts$t|}|dks4|rrrr__doc__rrCr4Zmpz_init_set_uir rArFrIrJrLrMrX staticmethodr[r]r`rardrerfrgri__bool__rjrmrorqrurzrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr,sr+ &      '         r,)!sysZCrypto.Util.py3compatrrZCrypto.Util._raw_apirrrrrr r r Z _IntegerBaser Zgmp_defsplatform ImportErrorr%implementationhasattrrrrrrrrrobjectr r4r,rrrrs&( 8