diff --git a/src/ecdsa/numbertheory.py b/src/ecdsa/numbertheory.py index e5cc888d..7b3ef892 100644 --- a/src/ecdsa/numbertheory.py +++ b/src/ecdsa/numbertheory.py @@ -62,8 +62,23 @@ def modular_exp(base, exponent, modulus): # pragma: no cover raise NegativeExponentError( "Negative exponents (%d) not allowed" % exponent ) - return pow(base, exponent, modulus) - + if (type(exponent)==int): + return fast_modular_exponentiation(base, exponent, modulus) + else: + return pow(base, exponent, modulus) + +def fast_modular_exponentiation(base, exponent, modulas): + + """Log(N) computation required to find the final Exponent""" + binary = bin(exponent)[-1:1:-1] + l = {} + ans = 1 + for i in range(len(binary)): + l[i] = base + base = (base**2)%modulas + if binary[i]=='1': + ans *= l[i]%modulas + return ans%modulas def polynomial_reduce_mod(poly, polymod, p): """Reduce poly by polymod, integer arithmetic modulo p.