o aG @sdZddlZGdddeZdedefddZd edefd d Zded edefd dZdededejeeeffddZ dededefddZ dej edej edefddZ e dkrfddlZedSdS)z/Common functionality shared by several modules.Nc s4eZdZd dededededdf fdd ZZS) NotRelativePrimeErrorabdmsgreturnNcs0t|p d|||f||_||_||_dS)Nz.%d and %d are not relatively prime, divider=%i)super__init__rrr)selfrrrr __class__,/usr/lib/python3/dist-packages/rsa/common.pyr s zNotRelativePrimeError.__init__)r)__name__ __module__ __qualname__intstrr __classcell__rrr rrs,rnumrc Cs6z|WSty}z tdt||d}~ww)a Number of bits needed to represent a integer excluding any prefix 0 bits. Usage:: >>> bit_size(1023) 10 >>> bit_size(1024) 11 >>> bit_size(1025) 11 :param num: Integer value. If num is 0, returns 0. Only the absolute value of the number is considered. Therefore, signed integers will be abs(num) before the number's bit length is determined. :returns: Returns the number of bits in the integer. z,bit_size(num) only supports integers, not %rN) bit_lengthAttributeError TypeErrortype)rexrrrbit_sizes  rnumbercCs|dkrdStt|dS)a Returns the number of bytes required to hold a specific long number. The number of bytes is rounded up. Usage:: >>> byte_size(1 << 1023) 128 >>> byte_size((1 << 1024) - 1) 128 >>> byte_size(1 << 1024) 129 :param number: An unsigned integer :returns: The number of bytes required to hold a specific long number. r)ceil_divr)rrrr byte_size8sr!divcCst||\}}|r |d7}|S)av Returns the ceiling function of a division between `num` and `div`. Usage:: >>> ceil_div(100, 7) 15 >>> ceil_div(100, 10) 10 >>> ceil_div(1, 4) 1 :param num: Division's numerator, a number :param div: Division's divisor, a number :return: Rounded up result of the division between the parameters. r)divmod)rr"quantamodrrrr Qsr rrc Csd}d}d}d}|}|}|dkr1||}|||}}||||}}||||}}|dks|dkr9||7}|dkrA||7}|||fS)z;Returns a tuple (r, i, j) such that r = gcd(a, b) = ia + jbrrr) rrxylxlyoaobqrrr extended_gcdis" r-r&ncCs(t||\}}}|dkrt||||S)zReturns the inverse of x % n under multiplication, a.k.a x^-1 (mod n) >>> inverse(7, 4) 3 >>> (inverse(143, 4) * 143) % 4 1 r)r-r)r&r.dividerinv_rrrinverses  r2a_values modulo_valuesc CsXd}d}|D]}||9}qt||D]\}}||}t||}|||||}q|S)aChinese Remainder Theorem. Calculates x such that x = a[i] (mod m[i]) for each i. :param a_values: the a-values of the above equation :param modulo_values: the m-values of the above equation :returns: x such that x = a[i] (mod m[i]) for each i >>> crt([2, 3], [3, 5]) 8 >>> crt([2, 3, 2], [3, 5, 7]) 23 >>> crt([2, 3, 0], [7, 11, 15]) 135 rr)zipr2) r3r4mr&modulom_ia_iM_ir0rrrcrts  r;__main__)__doc__typing ValueErrorrrrr!r Tupler-r2Iterabler;rdoctesttestmodrrrrs""#