Exemplo n.º 1
0
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))
Exemplo n.º 2
0
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)
Exemplo n.º 3
0
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%}")
Exemplo n.º 4
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()
Exemplo n.º 5
0
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))
Exemplo n.º 6
0
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