[tor-dev] New paper by Goldberg, Stebila, and Ustaoglu with proposed circuit handshake

Ian Goldberg iang at cs.uwaterloo.ca
Thu May 12 00:33:09 UTC 2011


On Wed, May 11, 2011 at 08:01:28PM -0400, Nick Mathewson wrote:
> On Wed, May 11, 2011 at 6:10 PM, Ian Goldberg <iang at cs.uwaterloo.ca> wrote:
>  [...]
> > Remember also that if you have non-black-box access to the
> > exponentiation routine, the server can compute X^y and X^b
> > simultaneously.  That will make a bigger difference in time, but is not
> > really relevant from a spec-level standpoint.
> 
> Can you expand on how this would work?  I didn't ask the first time
> you told me this, on the theory that I could figure it out if I
> thought about it for long enough, but several days later I still don't
> have it.  All the ways I can think of are inefficient,
> non-constant-time, or both.

Use right-to-left exponentiation.  This is totally off the top of my
head.

def exp(base,expon):
    a = base
    mask = 1
    res = 1
    # Invariant: a = base^mask
    do:
	# Be a little cleverer about the if if you
	# care about constant-time; just save the output
	# somewhere useless
	if (expon & mask): # bitwise and
	    res = res*a
	a *= a
	mask <<= 1
    until (mask is larger than the maximum possible expon)
    return res

Then exp2(base, expon1, expon2) will be:

def exp2(base,expon1, expon2):
    a = base
    mask = 1
    res1 = 1
    res2 = 1
    # Invariant: a = base^mask
    do:
	# Be a little cleverer about the if if you
	# care about constant-time; just save the output
	# somewhere useless
	if (expon1 & mask): # bitwise and
	    res1 = res1*a
	if (expon2 & mask): # bitwise and
	    res2 = res2*a
	a *= a
	mask <<= 1
    until (mask is larger than the maximum possible expon)
    return (res1, res2)


The idea is that the squarings are common between the exps, and just the
multiplications have to be done separately.

   - Ian


More information about the tor-dev mailing list