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
|
|||
|
|