From 6c448be106980683249332f4b9a103df61427bb4 Mon Sep 17 00:00:00 2001 From: Piotr Szyma Date: Mon, 3 Feb 2020 22:59:01 +0100 Subject: [PATCH 1/5] Import test_data fixed, added explicit method names --- mcl/structures/Fr.py | 24 +++++++++++++++++++++ tests/test_fr.py | 50 ++++++++++++++++++++++++++++++++++++++++---- tests/test_g1.py | 2 +- tests/test_g2.py | 2 +- tests/test_gt.py | 2 +- 5 files changed, 73 insertions(+), 7 deletions(-) diff --git a/mcl/structures/Fr.py b/mcl/structures/Fr.py index 95618ff..e8415a1 100644 --- a/mcl/structures/Fr.py +++ b/mcl/structures/Fr.py @@ -23,3 +23,27 @@ ) class Fr(ctypes.Structure): _fields_ = [("v", ctypes.c_ulonglong * consts.FR_SIZE)] + + def deserialize(self, value: str) -> None: + ... + + def getStr(self, value: str) -> None: + ... + + def isOne(self) -> None: + ... + + def isZero(self) -> None: + ... + + def serialize(self) -> None: + ... + + def setByCSPRNG(self) -> None: + ... + + def setInt(self, value: int) -> None: + ... + + def setStr(self, value: str) -> None: + ... \ No newline at end of file diff --git a/tests/test_fr.py b/tests/test_fr.py index c3d9e81..b587873 100644 --- a/tests/test_fr.py +++ b/tests/test_fr.py @@ -3,17 +3,56 @@ from mcl import Fr +def createRandomFr() -> Fr: + fr = Fr() + fr.setByCSPRNG() + return fr + + class FrTests(unittest.TestCase): + + @unittest.skip("Init args not yet supported") + def testAdd(self): + self.assertEqual(Fr(30), Fr(10) + Fr(20)) + + @unittest.skip("Init args not yet supported") + def testEquals(self): + self.assertEqual(Fr(20), Fr(20)) + + @unittest.skip("Init args not yet supported") + def testInvert(self): + self.assertEqual(Fr(10), ~~Fr(10)) + + @unittest.skip("Init args not yet supported") + def testMul(self): + self.assertEqual(Fr(8), Fr(4) * Fr(2)) + + @unittest.skip("Init args not yet supported") + def testNeg(self): + self.assertEqual(-Fr(10), Fr(8)) + def testInitFr(self): self.assertIsNotNone(Fr()) def testSetStr(self): - Fr().setStr(b"12345678901234567") + # Arrange. + expected = b"12345678901234567" + fr = Fr() + + # Act. + fr.setStr(b"12345678901234567") + + # Assert. + self.assertEqual(expected, fr.getStr()) def testIsEqual(self): - l = Fr() - l.setByCSPRNG() - self.assertTrue(l == l) + # Arrange. + fr = createRandomFr() + + fr2 = Fr() + fr2.setStr(fr.getStr()) + + self.assertEqual(fr, fr2) def testSetInt(self): Fr().setInt(1) @@ -29,3 +68,6 @@ def testGetStr(self): def testByCSPRNG(self): Fr().setByCSPRNG() + + def testIsEqual(self): + self.assertEqual(Fr(), Fr()) diff --git a/tests/test_g1.py b/tests/test_g1.py index 9faa9f4..df76bc4 100644 --- a/tests/test_g1.py +++ b/tests/test_g1.py @@ -3,7 +3,7 @@ from mcl import G1 from mcl import Fr -from . import test_data +from tests import test_data class G1Tests(unittest.TestCase): diff --git a/tests/test_g2.py b/tests/test_g2.py index 0045546..97a7827 100644 --- a/tests/test_g2.py +++ b/tests/test_g2.py @@ -3,7 +3,7 @@ from mcl import G2 from mcl import Fr -from . import test_data +from tests import test_data class G2Tests(unittest.TestCase): diff --git a/tests/test_gt.py b/tests/test_gt.py index 2b527cf..8cae55d 100644 --- a/tests/test_gt.py +++ b/tests/test_gt.py @@ -5,7 +5,7 @@ from mcl import G1 from mcl import Fr -from . import test_data +from tests import test_data class GTTests(unittest.TestCase): From 39dd788b751a11be07de78627ad5ae4b858d6130 Mon Sep 17 00:00:00 2001 From: Piotr Szyma Date: Mon, 3 Feb 2020 23:21:11 +0100 Subject: [PATCH 2/5] WIP: more declarative bindings abstraction --- mcl/bindings.py | 22 +++++++++++ mcl/structures/Fr.py | 89 ++++++++++++++++++++++++++++++++------------ tests/test_fr.py | 3 +- 3 files changed, 88 insertions(+), 26 deletions(-) create mode 100644 mcl/bindings.py diff --git a/mcl/bindings.py b/mcl/bindings.py new file mode 100644 index 0000000..67806cb --- /dev/null +++ b/mcl/bindings.py @@ -0,0 +1,22 @@ +import inspect + + +def is_mcl_method(obj): + return inspect.ismethod(obj) and hasattr(fn, "__mcl_name__") + + +def method_binding(method_name = None): + def decorator(fn): + fn.__mcl_name__ = method_name or fn.__name__ + return fn + + return method_binding + + +def class_binding(): + def decorator(cls): + methods = inspect.getmembers(cls, predicate=is_mcl_method) + + return cls + + return class_binding diff --git a/mcl/structures/Fr.py b/mcl/structures/Fr.py index e8415a1..0e4b660 100644 --- a/mcl/structures/Fr.py +++ b/mcl/structures/Fr.py @@ -3,47 +3,88 @@ from .. import builder from .. import consts +from mcl.bindings import class_binding +from mcl.bindings import method_binding -@builder.provide_methods( - builder.method("__add__").using(builder.buildThreeOp).with_args("add"), - builder.method("__eq__").using(builder.buildIsEqual), - builder.method("__invert__").using(builder.buildTwoOp).with_args("inv"), - builder.method("__mul__").using(builder.buildThreeOp).with_args("mul"), - builder.method("__neg__").using(builder.buildTwoOp).with_args("neg"), - builder.method("__sub__").using(builder.buildThreeOp).with_args("sub"), - builder.method("__truediv__").using(builder.buildThreeOp).with_args("div"), - builder.method("deserialize"), - builder.method("getStr"), - builder.method("isOne"), - builder.method("isZero"), - builder.method("serialize"), - builder.method("setByCSPRNG"), - builder.method("setInt"), - builder.method("setStr"), -) + +# @builder.provide_methods( +# builder.method("__add__").using(builder.buildThreeOp).with_args("add"), +# builder.method("__eq__").using(builder.buildIsEqual), +# builder.method("__invert__").using(builder.buildTwoOp).with_args("inv"), +# builder.method("__mul__").using(builder.buildThreeOp).with_args("mul"), +# builder.method("__neg__").using(builder.buildTwoOp).with_args("neg"), +# builder.method("__sub__").using(builder.buildThreeOp).with_args("sub"), +# builder.method("__truediv__").using(builder.buildThreeOp).with_args("div"), +# builder.method("deserialize"), +# builder.method("getStr"), +# builder.method("isOne"), +# builder.method("isZero"), +# builder.method("serialize"), +# builder.method("setByCSPRNG"), +# builder.method("setInt"), +# builder.method("setStr"), +# ) +@class_binding("mclBnFr") class Fr(ctypes.Structure): _fields_ = [("v", ctypes.c_ulonglong * consts.FR_SIZE)] - def deserialize(self, value: str) -> None: + @classmethod + @method_binding("deserialize") + def deserialize(cls, value: str) -> None: + ... + + @method_binding("getStr") + def getStr(self, value: str) -> str: ... - def getStr(self, value: str) -> None: + @method_binding("isOne") + def isOne(self) -> bool: ... - def isOne(self) -> None: + @method_binding("isZero") + def isZero(self) -> bool: ... - def isZero(self) -> None: - ... - + @method_binding("serialize") def serialize(self) -> None: ... + @method_binding("setByCSPRNG") def setByCSPRNG(self) -> None: ... + @method_binding("setInt") def setInt(self, value: int) -> None: ... + @method_binding("setStr") def setStr(self, value: str) -> None: - ... \ No newline at end of file + ... + + @method_binding("add") + def __add__(self, other: "Fr") -> "Fr": + ... + + @method_binding("sub") + def __sub__(self, other: "Fr") -> "Fr": + ... + + @method_binding("div") + def __truediv__(self, other: "Fr") -> "Fr": + ... + + @method_binding("isEqual") + def __eq__(self, other: "Fr") -> "Fr": + ... + + @method_binding("inv") + def __invert__(self) -> "Fr": + ... + + @method_binding("mul") + def __mul__(self, other: "Fr") -> "Fr": + ... + + @method_binding("mul") + def __neg__(self) -> "Fr": + ... diff --git a/tests/test_fr.py b/tests/test_fr.py index b587873..2616686 100644 --- a/tests/test_fr.py +++ b/tests/test_fr.py @@ -10,11 +10,10 @@ def createRandomFr() -> Fr: class FrTests(unittest.TestCase): - @unittest.skip("Init args not yet supported") def testAdd(self): self.assertEqual(Fr(30), Fr(10) + Fr(20)) - + @unittest.skip("Init args not yet supported") def testEquals(self): self.assertEqual(Fr(20), Fr(20)) From 223dbe1ca8539867e78f252bfb0494421c283dcf Mon Sep 17 00:00:00 2001 From: Piotr Szyma Date: Mon, 3 Feb 2020 23:25:24 +0100 Subject: [PATCH 3/5] Full explicit names of wrapped mcl methods --- mcl/bindings.py | 5 +++-- mcl/structures/Fr.py | 32 ++++++++++++++++---------------- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/mcl/bindings.py b/mcl/bindings.py index 67806cb..321d12e 100644 --- a/mcl/bindings.py +++ b/mcl/bindings.py @@ -1,13 +1,14 @@ import inspect +MCL_NAME = "__mcl_name__" def is_mcl_method(obj): - return inspect.ismethod(obj) and hasattr(fn, "__mcl_name__") + return inspect.ismethod(obj) and hasattr(fn, MCL_NAME) def method_binding(method_name = None): def decorator(fn): - fn.__mcl_name__ = method_name or fn.__name__ + setattr(fn, MCL_NAME, method_name or fn.__name__) return fn return method_binding diff --git a/mcl/structures/Fr.py b/mcl/structures/Fr.py index 0e4b660..8cdb203 100644 --- a/mcl/structures/Fr.py +++ b/mcl/structures/Fr.py @@ -24,67 +24,67 @@ # builder.method("setInt"), # builder.method("setStr"), # ) -@class_binding("mclBnFr") +@class_binding() class Fr(ctypes.Structure): _fields_ = [("v", ctypes.c_ulonglong * consts.FR_SIZE)] @classmethod - @method_binding("deserialize") + @method_binding("mclBnFr_deserialize") def deserialize(cls, value: str) -> None: ... - @method_binding("getStr") + @method_binding("mclBnFr_getStr") def getStr(self, value: str) -> str: ... - @method_binding("isOne") + @method_binding("mclBnFr_isOne") def isOne(self) -> bool: ... - @method_binding("isZero") + @method_binding("mclBnFr_isZero") def isZero(self) -> bool: ... - @method_binding("serialize") + @method_binding("mclBnFr_serialize") def serialize(self) -> None: ... - @method_binding("setByCSPRNG") + @method_binding("mclBnFr_setByCSPRNG") def setByCSPRNG(self) -> None: ... - @method_binding("setInt") + @method_binding("mclBnFr_setInt") def setInt(self, value: int) -> None: ... - @method_binding("setStr") + @method_binding("mclBnFr_setStr") def setStr(self, value: str) -> None: ... - @method_binding("add") + @method_binding("mclBnFr_add") def __add__(self, other: "Fr") -> "Fr": ... - @method_binding("sub") + @method_binding("mclBnFr_sub") def __sub__(self, other: "Fr") -> "Fr": ... - @method_binding("div") + @method_binding("mclBnFr_div") def __truediv__(self, other: "Fr") -> "Fr": ... - @method_binding("isEqual") + @method_binding("mclBnFr_isEqual") def __eq__(self, other: "Fr") -> "Fr": ... - @method_binding("inv") + @method_binding("mclBnFr_inv") def __invert__(self) -> "Fr": ... - @method_binding("mul") + @method_binding("mclBnFr_mul") def __mul__(self, other: "Fr") -> "Fr": ... - @method_binding("mul") + @method_binding("mclBnFr_neg") def __neg__(self) -> "Fr": ... From 00f183c9f4a58438b2c566d790481dcd1c43b809 Mon Sep 17 00:00:00 2001 From: Piotr Szyma Date: Wed, 21 Oct 2020 23:28:25 +0200 Subject: [PATCH 4/5] Back to explicit definitions of methods --- .flake8 | 3 + mcl/bindings.py | 50 ++++++++++--- mcl/builder.py | 26 +++++-- mcl/structures/Fp.py | 8 ++- mcl/structures/Fr.py | 168 +++++++++++++++++++++---------------------- mcl/structures/G1.py | 5 +- pyproject.toml | 2 + tests/test_fr.py | 22 ++---- 8 files changed, 159 insertions(+), 125 deletions(-) create mode 100644 .flake8 create mode 100644 pyproject.toml diff --git a/.flake8 b/.flake8 new file mode 100644 index 0000000..8dd399a --- /dev/null +++ b/.flake8 @@ -0,0 +1,3 @@ +[flake8] +max-line-length = 88 +extend-ignore = E203 diff --git a/mcl/bindings.py b/mcl/bindings.py index 321d12e..c997ca3 100644 --- a/mcl/bindings.py +++ b/mcl/bindings.py @@ -1,23 +1,51 @@ +import ctypes import inspect +from . import hook, utils + MCL_NAME = "__mcl_name__" + def is_mcl_method(obj): - return inspect.ismethod(obj) and hasattr(fn, MCL_NAME) + return inspect.ismethod(obj) and hasattr(obj, MCL_NAME) -def method_binding(method_name = None): - def decorator(fn): - setattr(fn, MCL_NAME, method_name or fn.__name__) - return fn +def method_binding(method_name=None): + def decorator(method_obj): + setattr(method_obj, MCL_NAME, method_name or method_obj.__name__) + return method_obj - return method_binding + return decorator -def class_binding(): - def decorator(cls): - methods = inspect.getmembers(cls, predicate=is_mcl_method) +def _build_mcl_ctypes_binding(method_obj, mcl_method_name, klass_instance): + wrapper = utils.wrap_function( + hook.mclbls12_384, + mcl_method_name, + [ + ctypes.POINTER(klass_instance), + ctypes.c_char_p, + ctypes.c_size_t, + ctypes.c_int64, + ], + ) + return wrapper - return cls - return class_binding +def class_binding(): + def decorator(klass_instance): + method_name_obj_pairs = inspect.getmembers( + klass_instance, predicate=is_mcl_method + ) + + for method_name, method_obj in method_name_obj_pairs: + mcl_method_name = getattr(method_obj, MCL_NAME) + setattr( + klass_instance, + method_name, + _build_mcl_ctypes_binding(method_obj, mcl_method_name, klass_instance), + ) + + return klass_instance + + return decorator diff --git a/mcl/builder.py b/mcl/builder.py index 7c0cb57..6203111 100644 --- a/mcl/builder.py +++ b/mcl/builder.py @@ -2,13 +2,12 @@ import dataclasses import inspect -from . import hook -from . import utils +from . import hook, utils BUFFER_SIZE = 2048 -def tryGetBuilderMethodFromGlobals(method_name: str) -> callable: +def tryGetBuilderMethodFromGlobals(method_name: str): return globals().get("build" + method_name[0].upper() + method_name[1:]) @@ -51,7 +50,12 @@ def buildSetStr(cls): wrapper = utils.wrap_function( hook.mclbls12_384, f"mclBn{cls.__name__}_setStr", - [ctypes.POINTER(cls), ctypes.c_char_p, ctypes.c_size_t, ctypes.c_int64], + [ + ctypes.POINTER(cls), + ctypes.c_char_p, + ctypes.c_size_t, + ctypes.c_int64, + ], ) def setStr(self, value, mode=10): @@ -75,7 +79,9 @@ def setInt(self, value): def buildSetByCSPRNG(cls): wrapper = utils.wrap_function( - hook.mclbls12_384, f"mclBn{cls.__name__}_setByCSPRNG", [ctypes.POINTER(cls)], + hook.mclbls12_384, + f"mclBn{cls.__name__}_setByCSPRNG", + [ctypes.POINTER(cls)], ) def setByCSPRNG(self): @@ -120,7 +126,9 @@ def isEqual(self, other): def buildIsOne(cls): wrapper = utils.wrap_function( - hook.mclbls12_384, f"mclBn{cls.__name__}_isOne", [ctypes.POINTER(cls)], + hook.mclbls12_384, + f"mclBn{cls.__name__}_isOne", + [ctypes.POINTER(cls)], ) def isOne(self, other): @@ -248,7 +256,11 @@ def buildPairing(cls, left_group, right_group): wrapper = utils.wrap_function( hook.mclbls12_384, f"mclBn_pairing", - (ctypes.POINTER(cls), ctypes.POINTER(left_group), ctypes.POINTER(right_group)), + ( + ctypes.POINTER(cls), + ctypes.POINTER(left_group), + ctypes.POINTER(right_group), + ), ) @staticmethod diff --git a/mcl/structures/Fp.py b/mcl/structures/Fp.py index 9bb65f3..524cb3c 100644 --- a/mcl/structures/Fp.py +++ b/mcl/structures/Fp.py @@ -1,7 +1,6 @@ import ctypes -from .. import builder -from .. import consts +from .. import builder, consts @builder.provide_methods( @@ -23,3 +22,8 @@ ) class Fp(ctypes.Structure): _fields_ = [("v", ctypes.c_ulonglong * consts.FP_SIZE)] + + def __repr__(self): + import pdb + + pdb.set_trace() diff --git a/mcl/structures/Fr.py b/mcl/structures/Fr.py index 8cdb203..8065329 100644 --- a/mcl/structures/Fr.py +++ b/mcl/structures/Fr.py @@ -1,90 +1,88 @@ import ctypes -from .. import builder -from .. import consts - -from mcl.bindings import class_binding -from mcl.bindings import method_binding - - -# @builder.provide_methods( -# builder.method("__add__").using(builder.buildThreeOp).with_args("add"), -# builder.method("__eq__").using(builder.buildIsEqual), -# builder.method("__invert__").using(builder.buildTwoOp).with_args("inv"), -# builder.method("__mul__").using(builder.buildThreeOp).with_args("mul"), -# builder.method("__neg__").using(builder.buildTwoOp).with_args("neg"), -# builder.method("__sub__").using(builder.buildThreeOp).with_args("sub"), -# builder.method("__truediv__").using(builder.buildThreeOp).with_args("div"), -# builder.method("deserialize"), -# builder.method("getStr"), -# builder.method("isOne"), -# builder.method("isZero"), -# builder.method("serialize"), -# builder.method("setByCSPRNG"), -# builder.method("setInt"), -# builder.method("setStr"), -# ) -@class_binding() -class Fr(ctypes.Structure): - _fields_ = [("v", ctypes.c_ulonglong * consts.FR_SIZE)] - - @classmethod - @method_binding("mclBnFr_deserialize") - def deserialize(cls, value: str) -> None: - ... - - @method_binding("mclBnFr_getStr") - def getStr(self, value: str) -> str: - ... - - @method_binding("mclBnFr_isOne") - def isOne(self) -> bool: - ... - - @method_binding("mclBnFr_isZero") - def isZero(self) -> bool: - ... - - @method_binding("mclBnFr_serialize") - def serialize(self) -> None: - ... - - @method_binding("mclBnFr_setByCSPRNG") - def setByCSPRNG(self) -> None: - ... +from .. import hook - @method_binding("mclBnFr_setInt") - def setInt(self, value: int) -> None: - ... +mclbn384_256 = hook.mclbls12_384 - @method_binding("mclBnFr_setStr") - def setStr(self, value: str) -> None: - ... - @method_binding("mclBnFr_add") - def __add__(self, other: "Fr") -> "Fr": - ... - - @method_binding("mclBnFr_sub") - def __sub__(self, other: "Fr") -> "Fr": - ... - - @method_binding("mclBnFr_div") - def __truediv__(self, other: "Fr") -> "Fr": - ... - - @method_binding("mclBnFr_isEqual") - def __eq__(self, other: "Fr") -> "Fr": - ... - - @method_binding("mclBnFr_inv") - def __invert__(self) -> "Fr": - ... - - @method_binding("mclBnFr_mul") - def __mul__(self, other: "Fr") -> "Fr": - ... - - @method_binding("mclBnFr_neg") - def __neg__(self) -> "Fr": - ... +class Fr(ctypes.Structure): + _fields_ = [("v", ctypes.c_ulonglong * 6)] + + def __init__(self, value=None): + if value is None: + return + + if isinstance(value, str): + self.setStr(value) + elif isinstance(value, int): + self.setInt(value) + + def setInt(self, v): + mclbn384_256.mclBnFr_setInt(ctypes.byref(self.v), v) + + def setStr(self, value: str): + value = value if isinstance(value, bytes) else value.encode() + error = mclbn384_256.mclBnFr_setStr( + ctypes.byref(self.v), ctypes.c_char_p(value), len(value), 10 + ) + if error: + raise RuntimeError("mclBnFr_setStr failed") + + def getStr(self): + svLen = 2048 + sv = ctypes.create_string_buffer(b"\0" * svLen) + mclbn384_256.mclBnFr_getStr(sv, svLen, ctypes.byref(self.v), 10) + return sv.value.decode() + + def isZero(self): + return mclbn384_256.mclBnFr_isZero(ctypes.byref(self.v)) != 0 + + def isOne(self): + return mclbn384_256.mclBnFr_isOne(ctypes.byref(self.v)) != 0 + + def setByCSPRNG(self): + return mclbn384_256.mclBnFr_setByCSPRNG(ctypes.byref(self.v)) + + def __eq__(self, rhs): + return ( + mclbn384_256.mclBnFr_isEqual(ctypes.byref(self.v), ctypes.byref(rhs.v)) != 0 + ) + + def __ne__(self, rhs): + return not (self == rhs) + + def __add__(self, rhs): + ret = Fr() + mclbn384_256.mclBnFr_add( + ctypes.byref(ret.v), ctypes.byref(self.v), ctypes.byref(rhs.v) + ) + return ret + + def __sub__(self, rhs): + ret = Fr() + mclbn384_256.mclBnFr_sub( + ctypes.byref(ret.v), ctypes.byref(self.v), ctypes.byref(rhs.v) + ) + return ret + + def __mul__(self, rhs): + ret = Fr() + mclbn384_256.mclBnFr_mul( + ctypes.byref(ret.v), ctypes.byref(self.v), ctypes.byref(rhs.v) + ) + return ret + + def __div__(self, rhs): + ret = Fr() + mclbn384_256.mclBnFr_div( + ctypes.byref(ret.v), ctypes.byref(self.v), ctypes.byref(rhs.v) + ) + return ret + + def __invert__(self): + ret = Fr() + mclbn384_256.mclBnFr_neg(ctypes.byref(ret.v), ctypes.byref(self.v)) + return ret + + def __repr__(self): + return f"Fr({self.getStr()})" diff --git a/mcl/structures/G1.py b/mcl/structures/G1.py index 69152fe..e260e2c 100644 --- a/mcl/structures/G1.py +++ b/mcl/structures/G1.py @@ -1,8 +1,7 @@ -import types import ctypes +import types -from .. import utils -from .. import builder +from .. import builder, utils from .Fp import Fp from .Fr import Fr diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..6d6e6fb --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,2 @@ +[tool.black] +exclude = 'venv' diff --git a/tests/test_fr.py b/tests/test_fr.py index 2616686..641868e 100644 --- a/tests/test_fr.py +++ b/tests/test_fr.py @@ -10,36 +10,29 @@ def createRandomFr() -> Fr: class FrTests(unittest.TestCase): - @unittest.skip("Init args not yet supported") + def testAdd(self): self.assertEqual(Fr(30), Fr(10) + Fr(20)) - @unittest.skip("Init args not yet supported") def testEquals(self): self.assertEqual(Fr(20), Fr(20)) - @unittest.skip("Init args not yet supported") def testInvert(self): self.assertEqual(Fr(10), ~~Fr(10)) - @unittest.skip("Init args not yet supported") def testMul(self): self.assertEqual(Fr(8), Fr(4) * Fr(2)) - @unittest.skip("Init args not yet supported") - def testNeg(self): - self.assertEqual(-Fr(10), Fr(8)) - def testInitFr(self): self.assertIsNotNone(Fr()) def testSetStr(self): # Arrange. - expected = b"12345678901234567" + expected = "1234567" fr = Fr() # Act. - fr.setStr(b"12345678901234567") + fr.setStr("1234567") # Assert. self.assertEqual(expected, fr.getStr()) @@ -56,17 +49,12 @@ def testIsEqual(self): def testSetInt(self): Fr().setInt(1) - def testMul(self): - Fr() * Fr() - def testGetStr(self): fr = Fr() - fr.setStr(b"255") + fr.setStr("255") s = fr.getStr() - self.assertEqual(b"255", s) + self.assertEqual("255", s) def testByCSPRNG(self): Fr().setByCSPRNG() - def testIsEqual(self): - self.assertEqual(Fr(), Fr()) From d74f39b253817e7f37f37762316dc8799913df70 Mon Sep 17 00:00:00 2001 From: Piotr Szyma Date: Wed, 21 Oct 2020 23:29:45 +0200 Subject: [PATCH 5/5] Random Fr value added --- mcl/structures/Fr.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mcl/structures/Fr.py b/mcl/structures/Fr.py index 8065329..f0a4063 100644 --- a/mcl/structures/Fr.py +++ b/mcl/structures/Fr.py @@ -43,6 +43,12 @@ def isOne(self): def setByCSPRNG(self): return mclbn384_256.mclBnFr_setByCSPRNG(ctypes.byref(self.v)) + @classmethod + def random(cls): + value = cls() + value.setByCSPRNG() + return value + def __eq__(self, rhs): return ( mclbn384_256.mclBnFr_isEqual(ctypes.byref(self.v), ctypes.byref(rhs.v)) != 0