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]
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
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
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
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)
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)
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
def test_element_roundtrip(n): f = finite.Field(n) for m in int_sampler(n): el = f.element(m) assert int(el) == m
def test_invalid_fields(n, factorization): with pytest.raises(ValueError, match=re.escape(factorization)): finite.Field(n)
def test_field_creation(n, ex_prime, ex_pow): f = finite.Field(n) assert f.prime == ex_prime assert f.power == ex_pow
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]
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
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)
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