transcribe.Initiator: mostly complete
This commit is contained in:
parent
3ddfac3eeb
commit
c690e8101c
|
@ -1,4 +1,4 @@
|
||||||
import os, random
|
import random
|
||||||
|
|
||||||
WORDLIST = ["able", "baker", "charlie"] # TODO: 1024
|
WORDLIST = ["able", "baker", "charlie"] # TODO: 1024
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import time, requests
|
import time, requests, json
|
||||||
|
from binascii import hexlify, unhexlify
|
||||||
from spake2 import SPAKE2_A, SPAKE2_B
|
from spake2 import SPAKE2_A, SPAKE2_B
|
||||||
from .const import RELAY
|
from .const import RELAY
|
||||||
from .codes import make_code, extract_channel_id
|
from .codes import make_code, extract_channel_id
|
||||||
|
@ -20,6 +21,7 @@ class Initiator:
|
||||||
def __init__(self, appid, data, relay=RELAY):
|
def __init__(self, appid, data, relay=RELAY):
|
||||||
self.appid = appid
|
self.appid = appid
|
||||||
self.data = data
|
self.data = data
|
||||||
|
assert relay.endswith("/")
|
||||||
self.relay = relay
|
self.relay = relay
|
||||||
self.started = time.time()
|
self.started = time.time()
|
||||||
self.wait = 2*SECOND
|
self.wait = 2*SECOND
|
||||||
|
@ -95,12 +97,64 @@ class Receiver:
|
||||||
self.code = code
|
self.code = code
|
||||||
self.channel_id = extract_channel_id(code)
|
self.channel_id = extract_channel_id(code)
|
||||||
self.relay = relay
|
self.relay = relay
|
||||||
|
assert relay.endswith("/")
|
||||||
|
self.started = time.time()
|
||||||
|
self.wait = 2*SECOND
|
||||||
|
self.timeout = 3*MINUTE
|
||||||
|
self.side = "receiver"
|
||||||
self.sp = SPAKE2_B(code.encode("ascii"),
|
self.sp = SPAKE2_B(code.encode("ascii"),
|
||||||
idA=self.appid+":Initiator",
|
idA=self.appid+":Initiator",
|
||||||
idB=self.appid+":Receiver")
|
idB=self.appid+":Receiver")
|
||||||
|
|
||||||
def get_data(self):
|
def get_data(self):
|
||||||
|
# post PAKE message
|
||||||
|
msg = self.sp.start()
|
||||||
|
post_url = self.relay + "pake/post/%d" % self.channel_id
|
||||||
|
post_data = {"side": self.side,
|
||||||
|
"message": hexlify(msg).decode("ascii")}
|
||||||
|
r = requests.post(post_url, data=json.dumps(post_data))
|
||||||
|
r.raise_for_status()
|
||||||
|
|
||||||
# poll for PAKE response
|
# poll for PAKE response
|
||||||
|
pake_url = self.relay + "pake/poll/%d" % self.channel_id
|
||||||
|
post_data = json.dumps({"side": self.side})
|
||||||
|
while True:
|
||||||
|
r = requests.post(pake_url, data=post_data)
|
||||||
|
r.raise_for_status()
|
||||||
|
msgs = r.json()["messages"]
|
||||||
|
if msgs:
|
||||||
|
break
|
||||||
|
if time.time() > (self.started + self.timeout):
|
||||||
|
raise Timeout
|
||||||
|
time.sleep(self.wait)
|
||||||
|
pake_msg = unhexlify(msgs[0].encode("ascii"))
|
||||||
|
self.key = self.sp.finish(pake_msg)
|
||||||
|
|
||||||
|
# post data message
|
||||||
|
post_url = self.relay + "data/post/%d" % self.channel_id
|
||||||
|
post_data = json.dumps({"side": self.side,
|
||||||
|
"message": hexlify(self.data).decode("ascii")})
|
||||||
|
r = requests.post(post_url, data=post_data)
|
||||||
|
r.raise_for_status()
|
||||||
|
|
||||||
# poll for data message
|
# poll for data message
|
||||||
|
data_url = self.relay + "data/poll/%d" % self.channel_id
|
||||||
|
post_data = json.dumps({"side": self.side})
|
||||||
|
while True:
|
||||||
|
r = requests.post(data_url, data=post_data)
|
||||||
|
r.raise_for_status()
|
||||||
|
msgs = r.json()["messages"]
|
||||||
|
if msgs:
|
||||||
|
break
|
||||||
|
if time.time() > (self.started + self.timeout):
|
||||||
|
raise Timeout
|
||||||
|
time.sleep(self.wait)
|
||||||
|
data = unhexlify(msgs[0].encode("ascii"))
|
||||||
|
|
||||||
# deallocate channel
|
# deallocate channel
|
||||||
pass
|
deallocate_url = self.relay + "deallocate/%s" % self.channel_id
|
||||||
|
post_data = json.dumps({"side": self.side})
|
||||||
|
r = requests.post(deallocate, data=post_data)
|
||||||
|
r.raise_for_status()
|
||||||
|
|
||||||
|
return data
|
||||||
|
|
Loading…
Reference in New Issue
Block a user