mirror of https://github.com/nucypher/pyUmbral.git
128 lines
3.3 KiB
Python
128 lines
3.3 KiB
Python
import pytest
|
||
|
||
from umbral.curve import CURVE
|
||
from umbral.curve_scalar import CurveScalar
|
||
from umbral.hashing import Hash
|
||
|
||
|
||
def test_random():
|
||
r1 = CurveScalar.random_nonzero()
|
||
r2 = CurveScalar.random_nonzero()
|
||
assert r1 != r2
|
||
assert not r1.is_zero()
|
||
assert not r2.is_zero()
|
||
|
||
|
||
def test_from_and_to_int():
|
||
zero = CurveScalar.from_int(0)
|
||
assert zero.is_zero()
|
||
assert int(zero) == 0
|
||
|
||
one = CurveScalar.one()
|
||
assert not one.is_zero()
|
||
assert int(one) == 1
|
||
|
||
big_int = CURVE.order - 2
|
||
big_scalar = CurveScalar.from_int(big_int)
|
||
assert int(big_scalar) == big_int
|
||
|
||
# normalization check
|
||
with pytest.raises(ValueError):
|
||
CurveScalar.from_int(CURVE.order)
|
||
|
||
# disable normalization check
|
||
too_big = CurveScalar.from_int(CURVE.order, check_normalization=False)
|
||
|
||
|
||
def test_from_digest():
|
||
digest = Hash(b'asdf')
|
||
digest.update(b'some info')
|
||
s1 = CurveScalar.from_digest(digest)
|
||
|
||
digest = Hash(b'asdf')
|
||
digest.update(b'some info')
|
||
s2 = CurveScalar.from_digest(digest)
|
||
|
||
assert s1 == s2
|
||
assert int(s1) == int(s2)
|
||
|
||
|
||
def test_eq():
|
||
random = CurveScalar.random_nonzero()
|
||
same = CurveScalar.from_int(int(random))
|
||
different = CurveScalar.random_nonzero()
|
||
assert random == same
|
||
assert random == int(same)
|
||
assert random != different
|
||
assert random != int(different)
|
||
|
||
|
||
def test_serialization_rotations_of_1():
|
||
|
||
size_in_bytes = CURVE.scalar_size
|
||
for i in range(size_in_bytes):
|
||
lonely_one = 1 << i
|
||
bn = CurveScalar.from_int(lonely_one)
|
||
lonely_one_in_bytes = lonely_one.to_bytes(size_in_bytes, 'big')
|
||
|
||
# Check serialization
|
||
assert bytes(bn) == lonely_one_in_bytes
|
||
|
||
# Check deserialization
|
||
assert CurveScalar.from_bytes(lonely_one_in_bytes) == bn
|
||
|
||
|
||
def test_invalid_deserialization():
|
||
size_in_bytes = CURVE.scalar_size
|
||
|
||
# All-ones bytestring is invalid (since it's greater than the order)
|
||
lots_of_ones = b'\xFF' * size_in_bytes
|
||
with pytest.raises(ValueError):
|
||
CurveScalar.from_bytes(lots_of_ones)
|
||
|
||
# Serialization of `order` is invalid since it's not strictly lower than
|
||
# the order of the curve
|
||
order = CURVE.order
|
||
with pytest.raises(ValueError):
|
||
CurveScalar.from_bytes(order.to_bytes(size_in_bytes, 'big'))
|
||
|
||
# On the other hand, serialization of `order - 1` is valid
|
||
order -= 1
|
||
CurveScalar.from_bytes(order.to_bytes(size_in_bytes, 'big'))
|
||
|
||
|
||
def test_add():
|
||
r1 = CurveScalar.random_nonzero()
|
||
r2 = CurveScalar.random_nonzero()
|
||
r1i = int(r1)
|
||
r2i = int(r2)
|
||
assert r1 + r2 == (r1i + r2i) % CURVE.order
|
||
assert r1 + r2i == (r1i + r2i) % CURVE.order
|
||
|
||
|
||
def test_sub():
|
||
r1 = CurveScalar.random_nonzero()
|
||
r2 = CurveScalar.random_nonzero()
|
||
r1i = int(r1)
|
||
r2i = int(r2)
|
||
assert r1 - r2 == (r1i - r2i) % CURVE.order
|
||
assert r1 - r2i == (r1i - r2i) % CURVE.order
|
||
|
||
|
||
def test_mul():
|
||
r1 = CurveScalar.random_nonzero()
|
||
r2 = CurveScalar.random_nonzero()
|
||
r1i = int(r1)
|
||
r2i = int(r2)
|
||
assert r1 * r2 == (r1i * r2i) % CURVE.order
|
||
assert r1 * r2i == (r1i * r2i) % CURVE.order
|
||
|
||
|
||
def test_invert():
|
||
r1 = CurveScalar.random_nonzero()
|
||
r1i = int(r1)
|
||
r1inv = r1.invert()
|
||
assert r1 * r1inv == CurveScalar.one()
|
||
assert (r1i * int(r1inv)) % CURVE.order == 1
|
||
|