Beginning of verifying Ursula's interface.

pull/101/head
jMyles 2017-11-05 17:51:11 -08:00
parent 4dc146b2d6
commit 745e5a43b4
7 changed files with 42 additions and 9 deletions

View File

@ -254,7 +254,7 @@ class Ursula(Character):
if not self.port and self.interface:
raise RuntimeError("Must listen before publishing interface information.")
ip_dht_key = self.ip_dht_key()
setter = self.server.set(key=ip_dht_key, value=msgpack.dumps((self.port, self.interface)))
setter = self.server.set(key=ip_dht_key, value=msgpack.dumps((self.port, self.interface, bytes(self.seal))))
blockchain_client._ursulas_on_blockchain.append(ip_dht_key)
loop = asyncio.get_event_loop()
loop.run_until_complete(setter)

View File

@ -36,6 +36,15 @@ class NuCypherHashProtocol(KademliaProtocol):
else:
return NODE_HAS_NO_STORAGE, False
def rpc_store(self, sender, nodeid, key, value):
source = NuCypherNode(nodeid, sender[0], sender[1])
self.welcomeIfNewNode(source)
self.log.debug("got a store request from %s" % str(sender))
if value.startswith(b"uaddr"):
assert False
self.storage[key] = value
return True
class NuCypherSeedOnlyProtocol(NuCypherHashProtocol):
def __init__(self, *args, **kwargs):

View File

@ -1,8 +1,5 @@
import asyncio
import random
import types
import msgpack
from kademlia.crawling import NodeSpiderCrawl
from kademlia.network import Server
@ -20,7 +17,8 @@ class NuCypherDHTServer(Server):
def __init__(self, ksize=20, alpha=3, id=None, storage=None, *args, **kwargs):
super().__init__(ksize=20, alpha=3, id=None, storage=None, *args, **kwargs)
self.node = NuCypherNode(id or digest(random.getrandbits(255))) # TODO: Assume that this can be attacked to get closer to desired kFrags.
self.node = NuCypherNode(id or digest(
random.getrandbits(255))) # TODO: Assume that this can be attacked to get closer to desired kFrags.
def serialize_capabilities(self):
return [ServerCapability.stringify(capability) for capability in self.capabilities]
@ -70,6 +68,14 @@ class NuCypherDHTServer(Server):
loop = asyncio.get_event_loop()
return loop.run_until_complete(self.get(key))
async def set(self, key, value):
"""
Set the given string key to the given value in the network.
"""
self.log.debug("setting '%s' = '%s' on network" % (key, value))
key = digest(key)
return await self.set_digest(key, value)
class NuCypherSeedOnlyDHTServer(NuCypherDHTServer):
protocol_class = NuCypherSeedOnlyProtocol

View File

@ -218,3 +218,6 @@ class TreasureMap(object):
def __eq__(self, other):
return self.nodes == other.nodes
def __iter__(self):
pass

View File

@ -56,7 +56,7 @@ def test_alice_finds_ursula():
getter = ALICE.server.get(all_ursulas[ursula_index])
loop = asyncio.get_event_loop()
interface_bytes = loop.run_until_complete(getter)
port, interface = msgpack.loads(interface_bytes)
port, interface, ursula_pubkey_sig = msgpack.loads(interface_bytes)
assert port == URSULA_PORT + ursula_index
@ -126,6 +126,7 @@ def test_treasure_map_from_ursula_to_bob():
def test_cannot_offer_policy_without_finding_ursula():
networky_stuff = MockNetworkyStuff()
policy = Policy(Alice())
with pytest.raises(Ursula.NotFound):
policy_offer = policy.encrypt_payload_for_ursula()
@ -170,3 +171,17 @@ def test_trying_to_find_unknown_actor_raises_not_found():
verification, NO_DECRYPTION_PERFORMED = tony_clifton.verify_from(ALICE, signature, message)
assert verification is True
def test_bob_and_ursula_upgrade_to_tls():
treasure_map, treasure_map_as_set_on_network, signature, policy_group = test_treasure_map_from_alice_to_ursula()
networky_stuff = MockNetworkyStuff()
# Of course, in the real world, Bob has sufficient information to reconstitute a PolicyGroup, gleaned, we presume, through a side-channel with Alice.
treasure_map_from_wire = BOB.get_treasure_map(policy_group, signature)
# for ursula in treasure_map_from_wire:
# pass
#
# BOB

View File

@ -114,8 +114,8 @@ def test_seed_only_node_knows_it_can_store_on_full_node():
event_loop.run_until_complete(seed_only_server.bootstrap([("127.0.0.1", 8468)]))
# The seed-only will try to store a value.
key_to_store = "llamas"
value_to_store = "tons_of_things_keyed_llamas"
key_to_store = b"llamas"
value_to_store = b"tons_of_things_keyed_llamas"
setter = seed_only_server.set(key_to_store, value_to_store)
# But watch - unlike before, this node knows it can set values.

View File

@ -1,4 +1,4 @@
def test_bob_and_ursula_upgrade_to_tls():
assert False
pass