U +Mb(@s@ddlZddlmZmZmZmZddlmZGdddeZdS)N) iter_rangebordbchrABC)Randomc@seZdZejddZejddZejddZejdedd Ze ejd d Z ejd d Z ejddZ ejddZ ejddZejddZejddZejddZeZejddZejddZejddZejd d!Zejd"d#Zejd$d%Zejdfd'd(Zejdgd)d*Zejd+d,Zejdhd-d.Zejd/d0Zejd1d2Zejd3d4Zejd5d6Z ejd7d8Z!ejd9d:Z"ejd;d<Z#ejd=d>Z$ejd?d@Z%ejdAdBZ&ejdCdDZ'ejdEdFZ(ejdGdHZ)ejdIdJZ*ejdKdLZ+ejdMdNZ,ejdOdPZ-ejdQdRZ.ejdSdTZ/ejdUdVZ0ejdWdXZ1ejdYdZZ2ejd[d\Z3e ejd]d^Z4e d_d`Z5e6dadbZ7e6dcddZ8d&S)i IntegerBasecCsdSNselfr r ?/tmp/pip-target-t616c12r/lib/python/Crypto/Math/_IntegerBase.py__int__)szIntegerBase.__int__cCsdSrr r r r r __str__-szIntegerBase.__str__cCsdSrr r r r r __repr__1szIntegerBase.__repr__rcCsdSrr )r block_sizer r r to_bytes5szIntegerBase.to_bytescCsdSrr )Z byte_stringr r r from_bytes9szIntegerBase.from_bytescCsdSrr r termr r r __eq__?szIntegerBase.__eq__cCsdSrr rr r r __ne__CszIntegerBase.__ne__cCsdSrr rr r r __lt__GszIntegerBase.__lt__cCsdSrr rr r r __le__KszIntegerBase.__le__cCsdSrr rr r r __gt__OszIntegerBase.__gt__cCsdSrr rr r r __ge__SszIntegerBase.__ge__cCsdSrr r r r r __nonzero__WszIntegerBase.__nonzero__cCsdSrr r r r r is_negative\szIntegerBase.is_negativecCsdSrr rr r r __add__aszIntegerBase.__add__cCsdSrr rr r r __sub__eszIntegerBase.__sub__cCsdSrr )r factorr r r __mul__iszIntegerBase.__mul__cCsdSrr r Zdivisorr r r __floordiv__mszIntegerBase.__floordiv__cCsdSrr r!r r r __mod__qszIntegerBase.__mod__NcCsdSrr r exponentmodulusr r r inplace_powuszIntegerBase.inplace_powcCsdSrr r$r r r __pow__yszIntegerBase.__pow__cCsdSrr r r r r __abs__}szIntegerBase.__abs__cCsdSrr r r&r r r sqrtszIntegerBase.sqrtcCsdSrr rr r r __iadd__szIntegerBase.__iadd__cCsdSrr rr r r __isub__szIntegerBase.__isub__cCsdSrr rr r r __imul__szIntegerBase.__imul__cCsdSrr rr r r __imod__szIntegerBase.__imod__cCsdSrr rr r r __and__szIntegerBase.__and__cCsdSrr rr r r __or__szIntegerBase.__or__cCsdSrr r posr r r __rshift__szIntegerBase.__rshift__cCsdSrr r2r r r __irshift__szIntegerBase.__irshift__cCsdSrr r2r r r __lshift__szIntegerBase.__lshift__cCsdSrr r2r r r __ilshift__szIntegerBase.__ilshift__cCsdSrr )r nr r r get_bitszIntegerBase.get_bitcCsdSrr r r r r is_oddszIntegerBase.is_oddcCsdSrr r r r r is_evenszIntegerBase.is_evencCsdSrr r r r r size_in_bitsszIntegerBase.size_in_bitscCsdSrr r r r r size_in_bytesszIntegerBase.size_in_bytescCsdSrr r r r r is_perfect_squareszIntegerBase.is_perfect_squarecCsdSrr )r Z small_primer r r fail_if_divisible_bysz IntegerBase.fail_if_divisible_bycCsdSrr )r abr r r multiply_accumulateszIntegerBase.multiply_accumulatecCsdSrr )r sourcer r r setszIntegerBase.setcCsdSrr r*r r r inplace_inverseszIntegerBase.inplace_inversecCsdSrr r*r r r inverseszIntegerBase.inversecCsdSrr rr r r gcdszIntegerBase.gcdcCsdSrr rr r r lcmszIntegerBase.lcmcCsdSrr )r@r8r r r jacobi_symbolszIntegerBase.jacobi_symbolc Cs|dkr |S|ddkrHt||dd|}t|d||krDtd|Sd}|dd}|d@sr|d7}|dL}qX|d}t||dd|}|dkr|d7}q|||dkrqtdq||}t|||}t|||} t||dd|} | dkr~td|D]} t| d| |dkrqq| |kr8td||ft|d|| d|} | }| d|}| | d|} | | |} qt| d||krtd| S) aTonelli-shanks algorithm for computing the square root of n modulo a prime p. n must be in the range [0..p-1]. p must be at least even. The return value r is the square root of modulo p. If non-zero, another solution will also exist (p-r). Note we cannot assume that p is really a prime: if it's not, we can either raise an exception or return the correct value. )rrJzCannot compute square rootrz'Cannot compute square root of %d mod %d)pow ValueError __class__r) r8prootsqzZeulermctrirAr r r _tonelli_shankssL           zIntegerBase._tonelli_shanksc Ks|dd}|dd}|dd}|dkr6tj}|dkrN|dkrNtd|dk rf|dk rftd|pl|}|ddd}d|d|}t|dd }|dk r|d|d>O}|d|>dM}|t|||dS) a!Generate a random natural integer of a certain size. :Keywords: exact_bits : positive integer The length in bits of the resulting random Integer number. The number is guaranteed to fulfil the relation: 2^bits > result >= 2^(bits - 1) max_bits : positive integer The maximum length in bits of the resulting random Integer number. The number is guaranteed to fulfil the relation: 2^bits > result >=0 randfunc : callable A function that returns a random byte string. The length of the byte string is passed as parameter. Optional. If not provided (or ``None``), randomness is read from the system RNG. :Return: a Integer object exact_bitsNmax_bitsrandfuncz3Either 'exact_bits' or 'max_bits' must be specifiedz2'exact_bits' and 'max_bits' are mutually exclusiverJr)poprnewreadrOrrr) clskwargsr\r]r^bitsZ bytes_neededZsignificant_bits_msbZmsbr r r random)s"    zIntegerBase.randomc Ks|dd}|dd}|dd}|dd}|rFtdt|jd||fkrZtd|dk rj|d}d||fkr~td |dkrtj}||}||}d }d |kr|ksn|j||d }q||S) aGenerate a random integer within a given internal. :Keywords: min_inclusive : integer The lower end of the interval (inclusive). max_inclusive : integer The higher end of the interval (inclusive). max_exclusive : integer The higher end of the interval (exclusive). randfunc : callable A function that returns a random byte string. The length of the byte string is passed as parameter. Optional. If not provided (or ``None``), randomness is read from the system RNG. :Returns: An Integer randomly taken in the given interval. min_inclusiveN max_inclusive max_exclusiver^zUnknown keywords: z8max_inclusive and max_exclusive cannot be both specifiedrJz(Missing keyword to identify the intervalr)r]r^) r`rOstrkeysrrarbr<rf) rcrdrgrhrir^Z norm_maximumZ bits_neededZnorm_candidater r r random_rangeYs.        zIntegerBase.random_range)r)N)N)N)9__name__ __module__ __qualname__abcabstractmethodr rrr staticmethodrrrrrrrr__bool__rrrr r"r#r'r(r)r+r,r-r.r/r0r1r4r5r6r7r9r:r;r<r=r>r?rBrDrErFrGrHrIr[ classmethodrfrmr r r r r&s                                               @ /r) rqZCrypto.Util.py3compatrrrrZCryptorrr r r r s