URI: 
       tfix #4717 - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit d1f11f5fe94264f85a6c03afd2c43edb6134aeab
   DIR parent f05f3b430aa0d9060ed51f720607a0b012f3ce99
  HTML Author: SomberNight <somber.night@protonmail.com>
       Date:   Fri, 14 Sep 2018 16:12:47 +0200
       
       fix #4717
       
       Diffstat:
         M electrum/ecc.py                     |      20 ++++++++++----------
       
       1 file changed, 10 insertions(+), 10 deletions(-)
       ---
   DIR diff --git a/electrum/ecc.py b/electrum/ecc.py
       t@@ -38,6 +38,7 @@ from ecdsa.util import string_to_number, number_to_string
        from .util import bfh, bh2u, assert_bytes, print_error, to_bytes, InvalidPassword, profiler
        from .crypto import (Hash, aes_encrypt_with_iv, aes_decrypt_with_iv, hmac_oneshot)
        from .ecc_fast import do_monkey_patching_of_python_ecdsa_internals_with_libsecp256k1
       +from . import msqr
        
        
        do_monkey_patching_of_python_ecdsa_internals_with_libsecp256k1()
       t@@ -94,20 +95,19 @@ def point_to_ser(P, compressed=True) -> bytes:
            return bfh('04'+('%064x' % x)+('%064x' % y))
        
        
       -def get_y_coord_from_x(x, odd=True):
       +def get_y_coord_from_x(x: int, odd: bool=True) -> int:
            curve = curve_secp256k1
            _p = curve.p()
            _a = curve.a()
            _b = curve.b()
       -    for offset in range(128):
       -        Mx = x + offset
       -        My2 = pow(Mx, 3, _p) + _a * pow(Mx, 2, _p) + _b % _p
       -        My = pow(My2, (_p + 1) // 4, _p)
       -        if curve.contains_point(Mx, My):
       -            if odd == bool(My & 1):
       -                return My
       -            return _p - My
       -    raise Exception('ECC_YfromX: No Y found')
       +    x = x % _p
       +    y2 = (pow(x, 3, _p) + _a * x + _b) % _p
       +    y = msqr.modular_sqrt(y2, _p)
       +    if curve.contains_point(x, y):
       +        if odd == bool(y & 1):
       +            return y
       +        return _p - y
       +    raise InvalidECPointException()
        
        
        def ser_to_point(ser: bytes) -> (int, int):