transit: set key on both ends, instead of generate+send

This commit is contained in:
Brian Warner 2015-02-19 18:24:10 -08:00
parent 66ad6fb272
commit 01dbec820b
3 changed files with 22 additions and 10 deletions

View File

@ -29,7 +29,8 @@ encrypted_filesize = filesize + SecretBox.NONCE_SIZE+16
# now receive the rest of the owl # now receive the rest of the owl
tdata = data["transit"] tdata = data["transit"]
transit_receiver.set_transit_key(tdata["key"]) transit_key = r.derive_key(APPID+"/transit-key")
transit_receiver.set_transit_key(transit_key)
transit_receiver.add_sender_direct_hints(tdata["direct_connection_hints"]) transit_receiver.add_sender_direct_hints(tdata["direct_connection_hints"])
transit_receiver.add_sender_relay_hints(tdata["relay_connection_hints"]) transit_receiver.add_sender_relay_hints(tdata["relay_connection_hints"])
skt = transit_receiver.establish_connection() skt = transit_receiver.establish_connection()

View File

@ -1,6 +1,5 @@
from __future__ import print_function from __future__ import print_function
import os, sys, json import os, sys, json
from binascii import hexlify
from nacl.secret import SecretBox from nacl.secret import SecretBox
from wormhole.blocking.transcribe import Initiator from wormhole.blocking.transcribe import Initiator
from wormhole.blocking.transit import TransitSender from wormhole.blocking.transit import TransitSender
@ -11,7 +10,6 @@ APPID = "lothar.com/wormhole/file-xfer"
filename = sys.argv[1] filename = sys.argv[1]
assert os.path.isfile(filename) assert os.path.isfile(filename)
transit_sender = TransitSender() transit_sender = TransitSender()
transit_key = transit_sender.get_transit_key()
direct_hints = transit_sender.get_direct_hints() direct_hints = transit_sender.get_direct_hints()
relay_hints = transit_sender.get_relay_hints() relay_hints = transit_sender.get_relay_hints()
@ -22,7 +20,6 @@ data = json.dumps({
"filesize": filesize, "filesize": filesize,
}, },
"transit": { "transit": {
"key": hexlify(transit_key),
"direct_connection_hints": direct_hints, "direct_connection_hints": direct_hints,
"relay_connection_hints": relay_hints, "relay_connection_hints": relay_hints,
}, },
@ -45,6 +42,8 @@ nonce = os.urandom(SecretBox.NONCE_SIZE)
encrypted = box.encrypt(plaintext, nonce) encrypted = box.encrypt(plaintext, nonce)
tdata = them_d["transit"] tdata = them_d["transit"]
transit_key = i.derive_key(APPID+"/transit-key")
transit_sender.set_transit_key(transit_key)
transit_sender.add_receiver_hints(tdata["direct_connection_hints"]) transit_sender.add_receiver_hints(tdata["direct_connection_hints"])
skt = transit_sender.establish_connection() skt = transit_sender.establish_connection()

View File

@ -1,5 +1,5 @@
from __future__ import print_function from __future__ import print_function
import os, threading, socket, SocketServer import threading, socket, SocketServer
from binascii import hexlify from binascii import hexlify
from ..util import ipaddrs from ..util import ipaddrs
from ..util.hkdf import HKDF from ..util.hkdf import HKDF
@ -149,11 +149,11 @@ class MyTCPServer(SocketServer.TCPServer):
class TransitSender: class TransitSender:
def __init__(self): def __init__(self):
self.key = os.urandom(32)
self.winning = threading.Event() self.winning = threading.Event()
self._negotiation_check_lock = threading.Lock() self._negotiation_check_lock = threading.Lock()
def get_transit_key(self): self._have_transit_key = threading.Condition()
return self.key self._transit_key = None
def get_direct_hints(self): def get_direct_hints(self):
return [] return []
def get_relay_hints(self): def get_relay_hints(self):
@ -161,9 +161,21 @@ class TransitSender:
def add_receiver_hints(self, hints): def add_receiver_hints(self, hints):
self.receiver_hints = hints self.receiver_hints = hints
def set_transit_key(self, key):
# This _have_transit_key condition/lock protects us against the race
# where the sender knows the hints and the key, and connects to the
# receiver's transit socket before the receiver gets relay message
# (and thus the key).
self._have_transit_key.acquire()
self._transit_key = key
#self.handler_send_handshake = build_receiver_handshake(key)
#self.handler_expected_handshake = build_sender_handshake(key) + "go\n"
self._have_transit_key.notify_all()
self._have_transit_key.release()
def establish_connection(self): def establish_connection(self):
sender_handshake = build_sender_handshake(self.key) sender_handshake = build_sender_handshake(self._transit_key)
receiver_handshake = build_receiver_handshake(self.key) receiver_handshake = build_receiver_handshake(self._transit_key)
self.listener = None self.listener = None
self.connectors = [] self.connectors = []
self.winning_skt = None self.winning_skt = None