示例#1
0
def test_element_generation():
    f = finite.Field(17)
    el = f.element(10)
    assert el.coeff == [10]

    f = finite.Field(16)
    el = f.element(10)
    assert el.coeff == [0, 1, 0, 1]

    f = finite.Field(9)
    el = f.element(7)
    assert el.coeff == [1, 2]
示例#2
0
def test_characteristic(n):
    f = finite.Field(n)
    _sanity_run_check = False
    for m in int_sampler(n, limit=int(MAX_ITER_N / f.prime) + 1):
        _sanity_run_check = True
        el = f.element(m)
        assert sum(el for _ in range(f.prime)) == f.element(0)
    assert _sanity_run_check
示例#3
0
def test_mul_identity(n):
    f = finite.Field(n)
    multiplicitive_identity = f.element(1)
    for m in range(n):
        el = f.element(m)
        x = el * multiplicitive_identity
        print(x)
        print(el.unreduced_mul(multiplicitive_identity))
        assert el * multiplicitive_identity == el
示例#4
0
def test_div_identity(n):
    f = finite.Field(n)
    multiplicitive_identity = f.element(1)
    for m in range(n):
        el = f.element(m)
        quot = el / multiplicitive_identity

        # repad quotient to same number of coefficients
        quot = quot + [0] * (f.power - len(quot))

        assert f.element(quot) == el
示例#5
0
def test_aes_examples():
    """Examples from FIPS 197 (AES) section 4.2.1"""
    f = finite.Field(2**8)
    assert f.mod_poly == [1, 1, 0, 1, 1, 0, 0, 0, 1]

    assert f.E(0x57) * f.E(0x01) == f.E(0x57)
    assert f.E(0x57) * f.E(0x02) == f.E(0xAE)
    assert f.E(0x57) * f.E(0x08) == f.E(0x8E)
    assert f.E(0x57) * f.E(0x10) == f.E(0x07)
    assert f.E(0x57) * f.E(0x13) == f.E(0xFE)

    assert f.E(0x57) * (f.E(0x01) + f.E(0x02) + f.E(0x10)) == f.E(0xFE)
    assert f.E(0x57) + f.E(0xAE) + f.E(0x07) == f.E(0xFE)
示例#6
0
def test_associative(n, func):
    f = finite.Field(n)
    _op = "*" if func is operator.mul else "+"

    for na, nb, nc in int_sampler([n, n, n], seed=n):
        a = f.element(na)
        b = f.element(nb)
        c = f.element(nc)
        if func(func(a, b), c) != func(a, func(b, c)):
            print(na, nb, nc)
            ab = func(a, b)
            bc = func(b, c)
            ab_c = func(ab, c)
            a_bc = func(a, bc)
            print(f)
            print(f.mod_poly)
            print(f"a: {na} -> {a}")
            print(f"b: {nb} -> {b}")
            print(f"c: {nc} -> {c}")
            print(f"{ab=}, {ab_c=}")
            print(f"{bc=}, {a_bc=}")
            _note = f"in {f}: ({na} {_op} {nb}) {_op} {nc} != {na} {_op} ({nb} {_op} {nc})"
            pytest.fail(_note)
示例#7
0
def test_add_identity(n, func):
    f = finite.Field(n)
    additive_identity = f.element(0)
    for m in int_sampler(n):
        el = f.element(m)
        assert func(el, additive_identity) == el
示例#8
0
def test_element_roundtrip(n):
    f = finite.Field(n)
    for m in int_sampler(n):
        el = f.element(m)
        assert int(el) == m
示例#9
0
def test_invalid_fields(n, factorization):
    with pytest.raises(ValueError, match=re.escape(factorization)):
        finite.Field(n)
示例#10
0
def test_field_creation(n, ex_prime, ex_pow):
    f = finite.Field(n)
    assert f.prime == ex_prime
    assert f.power == ex_pow
示例#11
0
def test_unreduced_multiplication():
    f = finite.Field(27)
    assert f.element([2, 1,
                      2]).unreduced_mul(f.element([2, 1,
                                                   2])) == [1, 1, 0, 1, 1]
示例#12
0
def test_sub(n):
    f = finite.Field(n)
    additive_identity = f.element(0)
    for m in range(min(n, MAX_ITER_N)):
        el = f.element(m)
        assert el - el == additive_identity
示例#13
0
def test_commutative(n, func):
    f = finite.Field(n)
    for na, nb in int_sampler([n, n]):
        a = f.element(na)
        b = f.element(nb)
        assert func(a, b) == func(b, a), (a, b)
示例#14
0
def test_add_inverse(n):
    f = finite.Field(n)
    additive_identity = f.element(0)
    for m in int_sampler(n):
        el = f.element(m)
        assert el + (-el) == additive_identity