Browse Source

reasonable decaf encode; try to tweak a little more

master
Michael Hamburg 7 years ago
parent
commit
b1467a60ae
1 changed files with 30 additions and 6 deletions
  1. +30
    -6
      aux/ristretto.sage

+ 30
- 6
aux/ristretto.sage View File

@@ -19,11 +19,13 @@ def optimized_version_of(spec):
try: opt_ans = f(self,*args,**kwargs),None
except Exception as e: opt_ans = None,e
if spec_ans[1] is None and opt_ans[1] is not None:
raise SpecException("Mismatch in %s: spec returned %s but opt threw %s"
% (f.__name__,str(spec_ans[0]),str(opt_ans[1])))
raise
#raise SpecException("Mismatch in %s: spec returned %s but opt threw %s"
# % (f.__name__,str(spec_ans[0]),str(opt_ans[1])))
if spec_ans[1] is not None and opt_ans[1] is None:
raise SpecException("Mismatch in %s: spec threw %s but opt returned %s"
% (f.__name__,str(spec_ans[1]),str(opt_ans[0])))
raise
#raise SpecException("Mismatch in %s: spec threw %s but opt returned %s"
# % (f.__name__,str(spec_ans[1]),str(opt_ans[0])))
if spec_ans[0] != opt_ans[0]:
raise SpecException("Mismatch in %s: %s != %s"
% (f.__name__,str(spec_ans[0]),str(opt_ans[0])))
@@ -262,7 +264,7 @@ class Decaf_1_1_Point(QuotientEdwardsPoint):
if self.cofactor==8 and negative(x*y*self.isoMagic):
x,y = self.torque()
isr2 = isqrt(a*(y^2-1)) / self.magic
isr2 = isqrt(a*(y^2-1)) * sqrt(a*d-1)
sr = xsqrt(1-a*x^2)
assert sr in [isr2*x*y,-isr2*x*y]
@@ -294,7 +296,29 @@ class Decaf_1_1_Point(QuotientEdwardsPoint):
@optimized_version_of("encodeSpec")
def encode(self):
"""Encode, optimized version"""
return self.encodeSpec() # TODO
a,d = self.a,self.d
x,y,z,t = self.xyzt()
if x==0 or y==0: return(self.gfToBytes(0))
num = (z+y)*(z-y)
den = t*z
tmp = isqrt(num*(a-d)*den^2)
if self.cofactor==8 and negative(tmp^2*den*num*(a-d)*t^2*self.isoMagic):
den,num = num,den
tmp *= sqrt(a-d) # witness that cofactor is 8
yisr = x*sqrt(a)
toggle = (a==1)
else:
yisr = y*(a*d-1)
toggle = False
tiisr = tmp*num
altx = tiisr*t*self.isoMagic
if negative(altx) != toggle: tiisr =- tiisr
s = tmp*den*yisr*(tiisr*z - 1)
return self.gfToBytes(s,mustBePositive=True)
@classmethod
@optimized_version_of("decodeSpec")


Loading…
Cancel
Save