def test_mult_fixed_window() -> None: for w in range(1, _MAX_W): for ec in low_card_curves.values(): assert ec._jac_equality(_mult_fixed_window(0, ec.GJ, ec, w), INFJ) assert ec._jac_equality(_mult_fixed_window(0, INFJ, ec, w), INFJ) assert ec._jac_equality(_mult_fixed_window(1, INFJ, ec, w), INFJ) assert ec._jac_equality(_mult_fixed_window(1, ec.GJ, ec, w), ec.GJ) PJ = _mult_fixed_window(2, ec.GJ, ec, w) assert ec._jac_equality(PJ, ec._add_jac(ec.GJ, ec.GJ)) PJ = _mult_fixed_window(ec.n - 1, ec.GJ, ec, w) assert ec._jac_equality(ec.negate_jac(ec.GJ), PJ) assert ec._jac_equality(_mult_fixed_window(ec.n - 1, INFJ, ec, w), INFJ) assert ec._jac_equality(ec._add_jac(PJ, ec.GJ), INFJ) assert ec._jac_equality(_mult_fixed_window(ec.n, ec.GJ, ec, w), INFJ) assert ec._jac_equality(_mult_mont_ladder(ec.n, INFJ, ec), INFJ) with pytest.raises(BTClibValueError, match="negative m: "): _mult_fixed_window(-1, ec.GJ, ec, w) with pytest.raises(BTClibValueError, match="non positive w: "): _mult_fixed_window(1, ec.GJ, ec, -w) ec = ec23_31 for w in range(1, 10): for k1 in range(ec.n): K1 = _mult_fixed_window(k1, ec.GJ, ec, w) assert ec._jac_equality(K1, _mult_jac(k1, ec.GJ, ec))
def test_mult_jac() -> None: for ec in all_curves.values(): assert ec._jac_equality(_mult_jac(0, ec.GJ, ec), INFJ) assert ec._jac_equality(_mult_jac(0, INFJ, ec), INFJ) assert ec._jac_equality(_mult_jac(1, INFJ, ec), INFJ) assert ec._jac_equality(_mult_jac(1, ec.GJ, ec), ec.GJ) PJ = ec._add_jac(ec.GJ, ec.GJ) assert ec._jac_equality(PJ, _mult_jac(2, ec.GJ, ec)) PJ = _mult_jac(ec.n - 1, ec.GJ, ec) assert ec._jac_equality(ec.negate_jac(ec.GJ), PJ) assert ec._jac_equality(_mult_jac(ec.n - 1, INFJ, ec), INFJ) assert ec._jac_equality(ec._add_jac(PJ, ec.GJ), INFJ) assert ec._jac_equality(_mult_jac(ec.n, ec.GJ, ec), INFJ) with pytest.raises(ValueError, match="negative m: "): _mult_jac(-1, ec.GJ, ec)
from btclib.curve import secp256k1 as ec from btclib.curvegroup import ( _mult_aff, _mult_jac, _mult_recursive_aff, _mult_recursive_jac, ) # setup random.seed(42) qs = [random.getrandbits(ec.nlen) % ec.n for _ in range(100)] start = time.time() for q in qs: # starts from affine coordinates, ends with affine coordinates ec._aff_from_jac(_mult_jac(q, ec.GJ, ec)) benchmark = time.time() - start print("Benchmark completed") start = time.time() for q in qs: _mult_recursive_aff(q, ec.G, ec) recursive_aff = time.time() - start print(f"Recursive aff : {recursive_aff / benchmark:.0%}") start = time.time() for q in qs: ec._aff_from_jac(_mult_recursive_jac(q, ec.GJ, ec)) recursive_jac = time.time() - start print(f"Recursive jac : {recursive_jac / benchmark:.0%}")
gen_only = True print("generator only") if gen_only else print("random points") cached_multiples.cache_clear() cached_multiples(ec.GJ, ec) T = ec.GJ start = time.time() for q in qs: T = _mult(q, ec.GJ, ec) if gen_only else _mult(q, T, ec) benchmark = time.time() - start print("Benchmark completed", cached_multiples.cache_info()) T = ec.GJ start = time.time() for q in qs: T = _mult_jac(q, ec.GJ, ec) if gen_only else _mult_jac(q, T, ec) double_and_add = time.time() - start print(f"Double & add : {double_and_add / benchmark:.0%}") T = ec.GJ start = time.time() for q in qs: T = _mult_mont_ladder(q, ec.GJ, ec) if gen_only else _mult_mont_ladder( q, T, ec) montgomery = time.time() - start print(f"Montgomery ladder: {montgomery / benchmark:.0%}") cached_multiples.cache_clear() cached_multiples(ec.GJ, ec) T = ec.GJ start = time.time()
def test_mult_jac() -> None: for ec in all_curves.values(): assert ec._jac_equality(_mult_jac(0, ec.GJ, ec), INFJ) assert ec._jac_equality(_mult_jac(0, INFJ, ec), INFJ) assert ec._jac_equality(_mult_jac(1, INFJ, ec), INFJ) assert ec._jac_equality(_mult_jac(1, ec.GJ, ec), ec.GJ) PJ = ec._add_jac(ec.GJ, ec.GJ) assert ec._jac_equality(PJ, _mult_jac(2, ec.GJ, ec)) PJ = _mult_jac(ec.n - 1, ec.GJ, ec) assert ec._jac_equality(ec.negate_jac(ec.GJ), PJ) assert ec._jac_equality(_mult_jac(ec.n - 1, INFJ, ec), INFJ) assert ec._jac_equality(ec._add_jac(PJ, ec.GJ), INFJ) assert ec._jac_equality(_mult_jac(ec.n, ec.GJ, ec), INFJ) assert ec._jac_equality(_mult_jac(ec.n, INFJ, ec), INFJ) with pytest.raises(BTClibValueError, match="negative m: "): _mult_jac(-1, ec.GJ, ec) ec = ec23_31 for k1 in range(ec.n): K1 = _mult_jac(k1, ec.GJ, ec) assert ec._jac_equality(K1, _mult(k1, ec.GJ, ec))
from btclib.curve import secp256k1 as ec from btclib.curvegroup import ( _mult_base_3, _mult_fixed_window, _mult_jac, _mult_mont_ladder, ) # setup random.seed(42) qs = [random.getrandbits(ec.nlen) % ec.n for _ in range(300)] T = ec.GJ start = time.time() for q in qs: T = _mult_jac(q, T, ec) benchmark = time.time() - start print("Benchmark completed") T = ec.GJ start = time.time() for q in qs: T = _mult_jac(q, T, ec) double_and_add = time.time() - start print(f"Double & add : {double_and_add / benchmark:.0%}") T = ec.GJ start = time.time() for q in qs: T = _mult_mont_ladder(q, T, ec) montgomery = time.time() - start