[tahoe-dev] [tahoe-lafs] #466: extendable Introducer protocol: dictionary-based, signed announcements
tahoe-lafs
trac at tahoe-lafs.org
Mon Dec 20 06:46:12 UTC 2010
#466: extendable Introducer protocol: dictionary-based, signed announcements
------------------------------+---------------------------------------------
Reporter: warner | Owner:
Type: enhancement | Status: new
Priority: major | Milestone: undecided
Component: code-network | Version: 1.1.0
Resolution: | Keywords: introduction forward-compatibility performance accounting ecdsa pycryptopp
Launchpad Bug: |
------------------------------+---------------------------------------------
Comment (by warner):
Ok, that -ver6 patch is worth reviewing. I think there are a few more
items I
want to add before landing (more tests, mainly), but it's certainly worth
talking about.
This version drops the certchain that was in the previous one: each
announcement is either signed with a single pubkey, or not signed at all.
It
uses an embedded copy of my python-ecdsa library
(https://github.com/warner/python-ecdsa), which is a bit on the slow side,
but still fast enough for announcement/introducer use. It adds code to the
{{{IntroducerClient}}} to add, distribute, and verify signatures, but does
not add any code to the {{{Client}}} or {{{StorageBroker}}} to use those
features: actual UI/tahoe.cfg switches to enable signing or require
signatures is left for a future patch.
The patch creates a new version of the Introducer, as well as its
protocols.
V2 servers (i.e. Introducers) can accept connections from either V1 or V2
clients, and V2 clients can tolerate talking to a V1 server, so all
combinations are covered. Signatures can only be passed from a V2 client,
through a V2 server, off to another V2 client: any V1 components along the
way will lose the signature.
Each announcement is a dictionary with keys to replace everything that was
in
the V1 protocol's tuples. I added some more version information (the full
app-versions dict), which may be too much (especially if you're trying to
be
anonymous).
The quirkiest thing about this scheme is the relationship between FURL
tubids
and ECDSA pubkeys. The Introducer is supposed to recognize multiple
announcements from the same source and let the new one replace the old
one.
When both are V1 tuples with the same tubid in their FURLs, or when both
are
V2 dicts signed by the same pubkey, the relationship is easy. If a client
is
upgraded from V1 to V2 and starts signing its announcements, the V2
announcement won't replace its old V1 announcement. I'm not sure how to
handle this yet.
In addition, we need to think about how/if we want to transition serverids
from being FURL-based to being pubkey-based. Since serverids are baked
into
shares (both via the permuted serverlist and, more directly, by the
Write-Enablers embedded in each mutable share), we can't just casually
change
an existing server's id. For brand-new servers, we could switch to using
the
pubkey as the serverid: this might make non-Foolscap-based share-transport
protocols easier to secure. For old servers with pre-existing shares that
start signing their announcements, we should probably keep using their
tubid
as a serverid, perhaps even after we switch away from foolscap and to some
ECDSA-signature based protocol. But we must validate it: a bad server
could
publish a FURL that they don't actually control, with a tubid that matches
the server they wish to impersonate, knowing that we'll never actually
connect to the FURL and discover the problem. I think the validation
protocol
will involve connecting to the FURL and receiving a copy of the pubkey
back,
to prove that the owner of the FURL really does want to be associated with
that pubkey.
--
Ticket URL: <http://tahoe-lafs.org/trac/tahoe-lafs/ticket/466#comment:11>
tahoe-lafs <http://tahoe-lafs.org>
secure decentralized storage
More information about the tahoe-dev
mailing list