| @@ -11,9 +11,43 @@ Tor = [p_tor4 * i for i in xrange(4)] | |||
| q = 2^446-0x8335dc163bb124b65129c96fde933d8d723a70aadc873d6d54a7bb0d | |||
| FQ = GF(q) | |||
| passing = True | |||
| # TODO: pathological cases | |||
| # TODO: Elligator | |||
| # TODO: double scalar mul | |||
| def random_array(length): | |||
| answer = "".join([chr(randint(0,255)) for i in xrange(length)]) | |||
| return answer | |||
| def from_le(buf): | |||
| return sum([256^i * ord(x) for i,x in enumerate(buf)]) | |||
| def youfail(why,n): | |||
| print ("Fail on test %d!"%n), why | |||
| global passing | |||
| passing = False | |||
| def run_test(i): | |||
| try: | |||
| s = DecafScalar.random() | |||
| t = DecafScalar.random() | |||
| p = DecafPoint.random() | |||
| q = DecafPoint.random() | |||
| s*p + t*q | |||
| if s*(t*p) != (s*t)*p: | |||
| raise Exception("Mul doesn't work") | |||
| (p+q-p-q).ser() # i guess... | |||
| except Exception, e: | |||
| youfail(e,i) | |||
| def run_all_tests(n = 100): | |||
| for testno in xrange(n): | |||
| run_test(testno) | |||
| if passing: | |||
| print "Passed all %d tests." % n | |||
| def to_le(x,n): | |||
| x = int(x) | |||
| if x >= 256^n: | |||
| @@ -57,6 +91,9 @@ class DecafScalar(): | |||
| if csays != sagesays: | |||
| raise Exception("C and SAGE don't agree: %d %d" % (csays, sagesays)) | |||
| return csays | |||
| def __ne__(self,other): | |||
| return not self==other | |||
| def __add__(self,other): | |||
| cstruct = DecafScalar._UNDER() | |||
| @@ -127,6 +164,12 @@ class DecafScalar(): | |||
| raise Exception("scalar didn't decode") | |||
| return cls(cstruct,scalar) | |||
| @classmethod | |||
| def random(cls): | |||
| while True: | |||
| try: return cls.deser(random_array(56)) | |||
| except Exception: pass | |||
| @staticmethod | |||
| def _c_ser(cstruct): | |||
| @@ -192,6 +235,9 @@ class DecafPoint(): | |||
| if csays != sagesays: | |||
| raise Exception("C and SAGE don't agree: %d %d" % (csays, sagesays)) | |||
| return csays | |||
| def __ne__(self,other): | |||
| return not self==other | |||
| def __add__(self,other): | |||
| cstruct = DecafPoint._UNDER() | |||
| @@ -249,6 +295,12 @@ class DecafPoint(): | |||
| raise Exception("Point didn't decode") | |||
| return cls(cstruct,point) | |||
| @classmethod | |||
| def random(cls): | |||
| while True: | |||
| try: return cls.deser(random_array(56)) | |||
| except Exception: pass | |||
| @staticmethod | |||
| def _c_ser(cstruct): | |||
| @@ -277,5 +329,7 @@ class DecafPoint(): | |||
| print cs | |||
| raise Exception("Check failed!") | |||
| return True | |||
| run_all_tests() | |||