mirror of
https://github.com/vanhoefm/fragattacks.git
synced 2025-02-20 02:53:03 -05:00
NFC: Add summary and success file options for nfcpy scripts
These can be used to get updates on NFC operation status and success for external programs. Signed-hostap: Jouni Malinen <jouni@qca.qualcomm.com>
This commit is contained in:
parent
25cfc6f11e
commit
d6bfaaac69
@ -22,6 +22,20 @@ import wpaspy
|
|||||||
|
|
||||||
wpas_ctrl = '/var/run/hostapd'
|
wpas_ctrl = '/var/run/hostapd'
|
||||||
continue_loop = True
|
continue_loop = True
|
||||||
|
summary_file = None
|
||||||
|
success_file = None
|
||||||
|
|
||||||
|
def summary(txt):
|
||||||
|
print txt
|
||||||
|
if summary_file:
|
||||||
|
with open(summary_file, 'a') as f:
|
||||||
|
f.write(txt + "\n")
|
||||||
|
|
||||||
|
def success_report(txt):
|
||||||
|
summary(txt)
|
||||||
|
if success_file:
|
||||||
|
with open(success_file, 'a') as f:
|
||||||
|
f.write(txt + "\n")
|
||||||
|
|
||||||
def wpas_connect():
|
def wpas_connect():
|
||||||
ifaces = []
|
ifaces = []
|
||||||
@ -48,7 +62,7 @@ def wpas_connect():
|
|||||||
def wpas_tag_read(message):
|
def wpas_tag_read(message):
|
||||||
wpas = wpas_connect()
|
wpas = wpas_connect()
|
||||||
if (wpas == None):
|
if (wpas == None):
|
||||||
return
|
return False
|
||||||
if "FAIL" in wpas.request("WPS_NFC_TAG_READ " + str(message).encode("hex")):
|
if "FAIL" in wpas.request("WPS_NFC_TAG_READ " + str(message).encode("hex")):
|
||||||
return False
|
return False
|
||||||
return True
|
return True
|
||||||
@ -58,21 +72,30 @@ def wpas_get_config_token():
|
|||||||
wpas = wpas_connect()
|
wpas = wpas_connect()
|
||||||
if (wpas == None):
|
if (wpas == None):
|
||||||
return None
|
return None
|
||||||
return wpas.request("WPS_NFC_CONFIG_TOKEN NDEF").rstrip().decode("hex")
|
ret = wpas.request("WPS_NFC_CONFIG_TOKEN NDEF")
|
||||||
|
if "FAIL" in ret:
|
||||||
|
return None
|
||||||
|
return ret.rstrip().decode("hex")
|
||||||
|
|
||||||
|
|
||||||
def wpas_get_password_token():
|
def wpas_get_password_token():
|
||||||
wpas = wpas_connect()
|
wpas = wpas_connect()
|
||||||
if (wpas == None):
|
if (wpas == None):
|
||||||
return None
|
return None
|
||||||
return wpas.request("WPS_NFC_TOKEN NDEF").rstrip().decode("hex")
|
ret = wpas.request("WPS_NFC_TOKEN NDEF")
|
||||||
|
if "FAIL" in ret:
|
||||||
|
return None
|
||||||
|
return ret.rstrip().decode("hex")
|
||||||
|
|
||||||
|
|
||||||
def wpas_get_handover_sel():
|
def wpas_get_handover_sel():
|
||||||
wpas = wpas_connect()
|
wpas = wpas_connect()
|
||||||
if (wpas == None):
|
if (wpas == None):
|
||||||
return None
|
return None
|
||||||
return wpas.request("NFC_GET_HANDOVER_SEL NDEF WPS-CR").rstrip().decode("hex")
|
ret = wpas.request("NFC_GET_HANDOVER_SEL NDEF WPS-CR")
|
||||||
|
if "FAIL" in ret:
|
||||||
|
return None
|
||||||
|
return ret.rstrip().decode("hex")
|
||||||
|
|
||||||
|
|
||||||
def wpas_report_handover(req, sel):
|
def wpas_report_handover(req, sel):
|
||||||
@ -91,7 +114,7 @@ class HandoverServer(nfc.handover.HandoverServer):
|
|||||||
self.success = False
|
self.success = False
|
||||||
|
|
||||||
def process_request(self, request):
|
def process_request(self, request):
|
||||||
print "HandoverServer - request received"
|
summary("HandoverServer - request received")
|
||||||
try:
|
try:
|
||||||
print "Parsed handover request: " + request.pretty()
|
print "Parsed handover request: " + request.pretty()
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
@ -103,14 +126,17 @@ class HandoverServer(nfc.handover.HandoverServer):
|
|||||||
for carrier in request.carriers:
|
for carrier in request.carriers:
|
||||||
print "Remote carrier type: " + carrier.type
|
print "Remote carrier type: " + carrier.type
|
||||||
if carrier.type == "application/vnd.wfa.wsc":
|
if carrier.type == "application/vnd.wfa.wsc":
|
||||||
print "WPS carrier type match - add WPS carrier record"
|
summary("WPS carrier type match - add WPS carrier record")
|
||||||
data = wpas_get_handover_sel()
|
data = wpas_get_handover_sel()
|
||||||
if data is None:
|
if data is None:
|
||||||
print "Could not get handover select carrier record from hostapd"
|
summary("Could not get handover select carrier record from hostapd")
|
||||||
continue
|
continue
|
||||||
print "Handover select carrier record from hostapd:"
|
print "Handover select carrier record from hostapd:"
|
||||||
print data.encode("hex")
|
print data.encode("hex")
|
||||||
wpas_report_handover(carrier.record, data)
|
if "OK" in wpas_report_handover(carrier.record, data):
|
||||||
|
success_report("Handover reported successfully")
|
||||||
|
else:
|
||||||
|
summary("Handover report rejected")
|
||||||
|
|
||||||
message = nfc.ndef.Message(data);
|
message = nfc.ndef.Message(data);
|
||||||
sel.add_carrier(message[0], "active", message[1:])
|
sel.add_carrier(message[0], "active", message[1:])
|
||||||
@ -122,7 +148,7 @@ class HandoverServer(nfc.handover.HandoverServer):
|
|||||||
print e
|
print e
|
||||||
print str(sel).encode("hex")
|
print str(sel).encode("hex")
|
||||||
|
|
||||||
print "Sending handover select"
|
summary("Sending handover select")
|
||||||
self.success = True
|
self.success = True
|
||||||
return sel
|
return sel
|
||||||
|
|
||||||
@ -133,19 +159,23 @@ def wps_tag_read(tag):
|
|||||||
for record in tag.ndef.message:
|
for record in tag.ndef.message:
|
||||||
print "record type " + record.type
|
print "record type " + record.type
|
||||||
if record.type == "application/vnd.wfa.wsc":
|
if record.type == "application/vnd.wfa.wsc":
|
||||||
print "WPS tag - send to hostapd"
|
summary("WPS tag - send to hostapd")
|
||||||
success = wpas_tag_read(tag.ndef.message)
|
success = wpas_tag_read(tag.ndef.message)
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
print "Empty tag"
|
summary("Empty tag")
|
||||||
|
|
||||||
|
if success:
|
||||||
|
success_report("Tag read succeeded")
|
||||||
|
|
||||||
return success
|
return success
|
||||||
|
|
||||||
|
|
||||||
def rdwr_connected_write(tag):
|
def rdwr_connected_write(tag):
|
||||||
print "Tag found - writing"
|
summary("Tag found - writing - " + str(tag))
|
||||||
global write_data
|
global write_data
|
||||||
tag.ndef.message = str(write_data)
|
tag.ndef.message = str(write_data)
|
||||||
|
success_report("Tag write succeeded")
|
||||||
print "Done - remove tag"
|
print "Done - remove tag"
|
||||||
global only_one
|
global only_one
|
||||||
if only_one:
|
if only_one:
|
||||||
@ -156,12 +186,12 @@ def rdwr_connected_write(tag):
|
|||||||
time.sleep(0.1)
|
time.sleep(0.1)
|
||||||
|
|
||||||
def wps_write_config_tag(clf, wait_remove=True):
|
def wps_write_config_tag(clf, wait_remove=True):
|
||||||
print "Write WPS config token"
|
summary("Write WPS config token")
|
||||||
global write_data, write_wait_remove
|
global write_data, write_wait_remove
|
||||||
write_wait_remove = wait_remove
|
write_wait_remove = wait_remove
|
||||||
write_data = wpas_get_config_token()
|
write_data = wpas_get_config_token()
|
||||||
if write_data == None:
|
if write_data == None:
|
||||||
print "Could not get WPS config token from hostapd"
|
summary("Could not get WPS config token from hostapd")
|
||||||
return
|
return
|
||||||
|
|
||||||
print "Touch an NFC tag"
|
print "Touch an NFC tag"
|
||||||
@ -169,12 +199,12 @@ def wps_write_config_tag(clf, wait_remove=True):
|
|||||||
|
|
||||||
|
|
||||||
def wps_write_password_tag(clf, wait_remove=True):
|
def wps_write_password_tag(clf, wait_remove=True):
|
||||||
print "Write WPS password token"
|
summary("Write WPS password token")
|
||||||
global write_data, write_wait_remove
|
global write_data, write_wait_remove
|
||||||
write_wait_remove = wait_remove
|
write_wait_remove = wait_remove
|
||||||
write_data = wpas_get_password_token()
|
write_data = wpas_get_password_token()
|
||||||
if write_data == None:
|
if write_data == None:
|
||||||
print "Could not get WPS password token from hostapd"
|
summary("Could not get WPS password token from hostapd")
|
||||||
return
|
return
|
||||||
|
|
||||||
print "Touch an NFC tag"
|
print "Touch an NFC tag"
|
||||||
@ -183,7 +213,7 @@ def wps_write_password_tag(clf, wait_remove=True):
|
|||||||
|
|
||||||
def rdwr_connected(tag):
|
def rdwr_connected(tag):
|
||||||
global only_one, no_wait
|
global only_one, no_wait
|
||||||
print "Tag connected: " + str(tag)
|
summary("Tag connected: " + str(tag))
|
||||||
|
|
||||||
if tag.ndef:
|
if tag.ndef:
|
||||||
print "NDEF tag: " + tag.type
|
print "NDEF tag: " + tag.type
|
||||||
@ -196,7 +226,8 @@ def rdwr_connected(tag):
|
|||||||
global continue_loop
|
global continue_loop
|
||||||
continue_loop = False
|
continue_loop = False
|
||||||
else:
|
else:
|
||||||
print "Not an NDEF tag - remove tag"
|
summary("Not an NDEF tag - remove tag")
|
||||||
|
return True
|
||||||
|
|
||||||
return not no_wait
|
return not no_wait
|
||||||
|
|
||||||
@ -229,6 +260,10 @@ def main():
|
|||||||
help='run only one operation and exit')
|
help='run only one operation and exit')
|
||||||
parser.add_argument('--no-wait', action='store_true',
|
parser.add_argument('--no-wait', action='store_true',
|
||||||
help='do not wait for tag to be removed before exiting')
|
help='do not wait for tag to be removed before exiting')
|
||||||
|
parser.add_argument('--summary',
|
||||||
|
help='summary file for writing status updates')
|
||||||
|
parser.add_argument('--success',
|
||||||
|
help='success file for writing success update')
|
||||||
parser.add_argument('command', choices=['write-config',
|
parser.add_argument('command', choices=['write-config',
|
||||||
'write-password'],
|
'write-password'],
|
||||||
nargs='?')
|
nargs='?')
|
||||||
@ -240,6 +275,14 @@ def main():
|
|||||||
global no_wait
|
global no_wait
|
||||||
no_wait = args.no_wait
|
no_wait = args.no_wait
|
||||||
|
|
||||||
|
if args.summary:
|
||||||
|
global summary_file
|
||||||
|
summary_file = args.summary
|
||||||
|
|
||||||
|
if args.success:
|
||||||
|
global success_file
|
||||||
|
success_file = args.success
|
||||||
|
|
||||||
logging.basicConfig(level=args.loglevel)
|
logging.basicConfig(level=args.loglevel)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
@ -33,6 +33,20 @@ no_input = False
|
|||||||
srv = None
|
srv = None
|
||||||
continue_loop = True
|
continue_loop = True
|
||||||
terminate_now = False
|
terminate_now = False
|
||||||
|
summary_file = None
|
||||||
|
success_file = None
|
||||||
|
|
||||||
|
def summary(txt):
|
||||||
|
print txt
|
||||||
|
if summary_file:
|
||||||
|
with open(summary_file, 'a') as f:
|
||||||
|
f.write(txt + "\n")
|
||||||
|
|
||||||
|
def success_report(txt):
|
||||||
|
summary(txt)
|
||||||
|
if success_file:
|
||||||
|
with open(success_file, 'a') as f:
|
||||||
|
f.write(txt + "\n")
|
||||||
|
|
||||||
def wpas_connect():
|
def wpas_connect():
|
||||||
ifaces = []
|
ifaces = []
|
||||||
@ -63,7 +77,7 @@ def wpas_connect():
|
|||||||
def wpas_tag_read(message):
|
def wpas_tag_read(message):
|
||||||
wpas = wpas_connect()
|
wpas = wpas_connect()
|
||||||
if (wpas == None):
|
if (wpas == None):
|
||||||
return
|
return False
|
||||||
cmd = "WPS_NFC_TAG_READ " + str(message).encode("hex")
|
cmd = "WPS_NFC_TAG_READ " + str(message).encode("hex")
|
||||||
global force_freq
|
global force_freq
|
||||||
if force_freq:
|
if force_freq:
|
||||||
@ -144,7 +158,7 @@ def p2p_handover_client(llc):
|
|||||||
if include_p2p_req:
|
if include_p2p_req:
|
||||||
data = wpas_get_handover_req()
|
data = wpas_get_handover_req()
|
||||||
if (data == None):
|
if (data == None):
|
||||||
print "Could not get handover request carrier record from wpa_supplicant"
|
summary("Could not get handover request carrier record from wpa_supplicant")
|
||||||
return
|
return
|
||||||
print "Handover request carrier record from wpa_supplicant: " + data.encode("hex")
|
print "Handover request carrier record from wpa_supplicant: " + data.encode("hex")
|
||||||
datamsg = nfc.ndef.Message(data)
|
datamsg = nfc.ndef.Message(data)
|
||||||
@ -173,31 +187,33 @@ def p2p_handover_client(llc):
|
|||||||
|
|
||||||
client = nfc.handover.HandoverClient(llc)
|
client = nfc.handover.HandoverClient(llc)
|
||||||
try:
|
try:
|
||||||
print "Trying handover";
|
summary("Trying to initiate NFC connection handover")
|
||||||
client.connect()
|
client.connect()
|
||||||
print "Connected for handover"
|
summary("Connected for handover")
|
||||||
except nfc.llcp.ConnectRefused:
|
except nfc.llcp.ConnectRefused:
|
||||||
print "Handover connection refused"
|
summary("Handover connection refused")
|
||||||
client.close()
|
client.close()
|
||||||
return
|
return
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
print "Other exception: " + str(e)
|
summary("Other exception: " + str(e))
|
||||||
client.close()
|
client.close()
|
||||||
return
|
return
|
||||||
|
|
||||||
print "Sending handover request"
|
summary("Sending handover request")
|
||||||
|
|
||||||
if not client.send(message):
|
if not client.send(message):
|
||||||
print "Failed to send handover request"
|
summary("Failed to send handover request")
|
||||||
|
client.close()
|
||||||
|
return
|
||||||
|
|
||||||
print "Receiving handover response"
|
summary("Receiving handover response")
|
||||||
message = client._recv()
|
message = client._recv()
|
||||||
if message is None:
|
if message is None:
|
||||||
print "No response received"
|
summary("No response received")
|
||||||
client.close()
|
client.close()
|
||||||
return
|
return
|
||||||
if message.type != "urn:nfc:wkt:Hs":
|
if message.type != "urn:nfc:wkt:Hs":
|
||||||
print "Response was not Hs - received: " + message.type
|
summary("Response was not Hs - received: " + message.type)
|
||||||
client.close()
|
client.close()
|
||||||
return
|
return
|
||||||
|
|
||||||
@ -208,7 +224,7 @@ def p2p_handover_client(llc):
|
|||||||
print e
|
print e
|
||||||
print str(message).encode("hex")
|
print str(message).encode("hex")
|
||||||
message = nfc.ndef.HandoverSelectMessage(message)
|
message = nfc.ndef.HandoverSelectMessage(message)
|
||||||
print "Handover select received"
|
summary("Handover select received")
|
||||||
try:
|
try:
|
||||||
print message.pretty()
|
print message.pretty()
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
@ -218,7 +234,10 @@ def p2p_handover_client(llc):
|
|||||||
print "Remote carrier type: " + carrier.type
|
print "Remote carrier type: " + carrier.type
|
||||||
if carrier.type == "application/vnd.wfa.p2p":
|
if carrier.type == "application/vnd.wfa.p2p":
|
||||||
print "P2P carrier type match - send to wpa_supplicant"
|
print "P2P carrier type match - send to wpa_supplicant"
|
||||||
wpas_report_handover(data, carrier.record, "INIT")
|
if "OK" in wpas_report_handover(data, carrier.record, "INIT"):
|
||||||
|
success_report("P2P handover reported successfully (initiator)")
|
||||||
|
else:
|
||||||
|
summary("P2P handover report rejected")
|
||||||
break
|
break
|
||||||
|
|
||||||
print "Remove peer"
|
print "Remove peer"
|
||||||
@ -275,8 +294,11 @@ class HandoverServer(nfc.handover.HandoverServer):
|
|||||||
print "Handover select carrier record from wpa_supplicant:"
|
print "Handover select carrier record from wpa_supplicant:"
|
||||||
print data.encode("hex")
|
print data.encode("hex")
|
||||||
self.sent_carrier = data
|
self.sent_carrier = data
|
||||||
wpas_report_handover(self.received_carrier, self.sent_carrier,
|
if "OK" in wpas_report_handover(self.received_carrier, self.sent_carrier, "RESP"):
|
||||||
"RESP")
|
success_report("P2P handover reported successfully (responder)")
|
||||||
|
else:
|
||||||
|
summary("P2P handover report rejected")
|
||||||
|
break
|
||||||
|
|
||||||
message = nfc.ndef.Message(data);
|
message = nfc.ndef.Message(data);
|
||||||
sel.add_carrier(message[0], "active", message[1:])
|
sel.add_carrier(message[0], "active", message[1:])
|
||||||
@ -302,8 +324,11 @@ class HandoverServer(nfc.handover.HandoverServer):
|
|||||||
print "Handover select carrier record from wpa_supplicant:"
|
print "Handover select carrier record from wpa_supplicant:"
|
||||||
print data.encode("hex")
|
print data.encode("hex")
|
||||||
self.sent_carrier = data
|
self.sent_carrier = data
|
||||||
wpas_report_handover_wsc(self.received_carrier,
|
if "OK" in wpas_report_handover_wsc(self.received_carrier, self.sent_carrier, "RESP"):
|
||||||
self.sent_carrier, "RESP")
|
success_report("WSC handover reported successfully")
|
||||||
|
else:
|
||||||
|
summary("WSC handover report rejected")
|
||||||
|
break
|
||||||
|
|
||||||
message = nfc.ndef.Message(data);
|
message = nfc.ndef.Message(data);
|
||||||
sel.add_carrier(message[0], "active", message[1:])
|
sel.add_carrier(message[0], "active", message[1:])
|
||||||
@ -317,7 +342,7 @@ class HandoverServer(nfc.handover.HandoverServer):
|
|||||||
print e
|
print e
|
||||||
print str(sel).encode("hex")
|
print str(sel).encode("hex")
|
||||||
|
|
||||||
print "Sending handover select"
|
summary("Sending handover select")
|
||||||
self.success = True
|
self.success = True
|
||||||
return sel
|
return sel
|
||||||
|
|
||||||
@ -356,23 +381,27 @@ def p2p_tag_read(tag):
|
|||||||
for record in tag.ndef.message:
|
for record in tag.ndef.message:
|
||||||
print "record type " + record.type
|
print "record type " + record.type
|
||||||
if record.type == "application/vnd.wfa.wsc":
|
if record.type == "application/vnd.wfa.wsc":
|
||||||
print "WPS tag - send to wpa_supplicant"
|
summary("WPS tag - send to wpa_supplicant")
|
||||||
success = wpas_tag_read(tag.ndef.message)
|
success = wpas_tag_read(tag.ndef.message)
|
||||||
break
|
break
|
||||||
if record.type == "application/vnd.wfa.p2p":
|
if record.type == "application/vnd.wfa.p2p":
|
||||||
print "P2P tag - send to wpa_supplicant"
|
summary("P2P tag - send to wpa_supplicant")
|
||||||
success = wpas_tag_read(tag.ndef.message)
|
success = wpas_tag_read(tag.ndef.message)
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
print "Empty tag"
|
summary("Empty tag")
|
||||||
|
|
||||||
|
if success:
|
||||||
|
success_report("Tag read succeeded")
|
||||||
|
|
||||||
return success
|
return success
|
||||||
|
|
||||||
|
|
||||||
def rdwr_connected_p2p_write(tag):
|
def rdwr_connected_p2p_write(tag):
|
||||||
print "Tag found - writing"
|
summary("Tag found - writing - " + str(tag))
|
||||||
global p2p_sel_data
|
global p2p_sel_data
|
||||||
tag.ndef.message = str(p2p_sel_data)
|
tag.ndef.message = str(p2p_sel_data)
|
||||||
|
success_report("Tag write succeeded")
|
||||||
print "Done - remove tag"
|
print "Done - remove tag"
|
||||||
global only_one
|
global only_one
|
||||||
if only_one:
|
if only_one:
|
||||||
@ -385,7 +414,7 @@ def wps_write_p2p_handover_sel(clf, wait_remove=True):
|
|||||||
print "Write P2P handover select"
|
print "Write P2P handover select"
|
||||||
data = wpas_get_handover_sel(tag=True)
|
data = wpas_get_handover_sel(tag=True)
|
||||||
if (data == None):
|
if (data == None):
|
||||||
print "Could not get P2P handover select from wpa_supplicant"
|
summary("Could not get P2P handover select from wpa_supplicant")
|
||||||
return
|
return
|
||||||
|
|
||||||
global p2p_sel_wait_remove
|
global p2p_sel_wait_remove
|
||||||
@ -407,7 +436,7 @@ def wps_write_p2p_handover_sel(clf, wait_remove=True):
|
|||||||
|
|
||||||
def rdwr_connected(tag):
|
def rdwr_connected(tag):
|
||||||
global only_one, no_wait
|
global only_one, no_wait
|
||||||
print "Tag connected: " + str(tag)
|
summary("Tag connected: " + str(tag))
|
||||||
|
|
||||||
if tag.ndef:
|
if tag.ndef:
|
||||||
print "NDEF tag: " + tag.type
|
print "NDEF tag: " + tag.type
|
||||||
@ -420,7 +449,8 @@ def rdwr_connected(tag):
|
|||||||
global continue_loop
|
global continue_loop
|
||||||
continue_loop = False
|
continue_loop = False
|
||||||
else:
|
else:
|
||||||
print "Not an NDEF tag - remove tag"
|
summary("Not an NDEF tag - remove tag")
|
||||||
|
return True
|
||||||
|
|
||||||
return not no_wait
|
return not no_wait
|
||||||
|
|
||||||
@ -515,6 +545,10 @@ def main():
|
|||||||
help='connection handover only (do not allow tag read)')
|
help='connection handover only (do not allow tag read)')
|
||||||
parser.add_argument('--freq', '-f',
|
parser.add_argument('--freq', '-f',
|
||||||
help='forced frequency of operating channel in MHz')
|
help='forced frequency of operating channel in MHz')
|
||||||
|
parser.add_argument('--summary',
|
||||||
|
help='summary file for writing status updates')
|
||||||
|
parser.add_argument('--success',
|
||||||
|
help='success file for writing success update')
|
||||||
parser.add_argument('command', choices=['write-p2p-sel'],
|
parser.add_argument('command', choices=['write-p2p-sel'],
|
||||||
nargs='?')
|
nargs='?')
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
@ -542,6 +576,14 @@ def main():
|
|||||||
global include_wps_req
|
global include_wps_req
|
||||||
include_wps_req = False
|
include_wps_req = False
|
||||||
|
|
||||||
|
if args.summary:
|
||||||
|
global summary_file
|
||||||
|
summary_file = args.summary
|
||||||
|
|
||||||
|
if args.success:
|
||||||
|
global success_file
|
||||||
|
success_file = args.success
|
||||||
|
|
||||||
if args.no_input:
|
if args.no_input:
|
||||||
global no_input
|
global no_input
|
||||||
no_input = True
|
no_input = True
|
||||||
|
@ -26,6 +26,20 @@ wpas_ctrl = '/var/run/wpa_supplicant'
|
|||||||
srv = None
|
srv = None
|
||||||
continue_loop = True
|
continue_loop = True
|
||||||
terminate_now = False
|
terminate_now = False
|
||||||
|
summary_file = None
|
||||||
|
success_file = None
|
||||||
|
|
||||||
|
def summary(txt):
|
||||||
|
print txt
|
||||||
|
if summary_file:
|
||||||
|
with open(summary_file, 'a') as f:
|
||||||
|
f.write(txt + "\n")
|
||||||
|
|
||||||
|
def success_report(txt):
|
||||||
|
summary(txt)
|
||||||
|
if success_file:
|
||||||
|
with open(success_file, 'a') as f:
|
||||||
|
f.write(txt + "\n")
|
||||||
|
|
||||||
def wpas_connect():
|
def wpas_connect():
|
||||||
ifaces = []
|
ifaces = []
|
||||||
@ -84,14 +98,19 @@ def wpas_get_password_token():
|
|||||||
wpas = wpas_connect()
|
wpas = wpas_connect()
|
||||||
if (wpas == None):
|
if (wpas == None):
|
||||||
return None
|
return None
|
||||||
return wpas.request("WPS_NFC_TOKEN NDEF").rstrip().decode("hex")
|
ret = wpas.request("WPS_NFC_TOKEN NDEF")
|
||||||
|
if "FAIL" in ret:
|
||||||
|
return None
|
||||||
|
return ret.rstrip().decode("hex")
|
||||||
|
|
||||||
def wpas_get_handover_req():
|
def wpas_get_handover_req():
|
||||||
wpas = wpas_connect()
|
wpas = wpas_connect()
|
||||||
if (wpas == None):
|
if (wpas == None):
|
||||||
return None
|
return None
|
||||||
return wpas.request("NFC_GET_HANDOVER_REQ NDEF WPS-CR").rstrip().decode("hex")
|
ret = wpas.request("NFC_GET_HANDOVER_REQ NDEF WPS-CR")
|
||||||
|
if "FAIL" in ret:
|
||||||
|
return None
|
||||||
|
return ret.rstrip().decode("hex")
|
||||||
|
|
||||||
|
|
||||||
def wpas_get_handover_sel(uuid):
|
def wpas_get_handover_sel(uuid):
|
||||||
@ -125,7 +144,7 @@ class HandoverServer(nfc.handover.HandoverServer):
|
|||||||
|
|
||||||
def process_request(self, request):
|
def process_request(self, request):
|
||||||
self.ho_server_processing = True
|
self.ho_server_processing = True
|
||||||
print "HandoverServer - request received"
|
summary("HandoverServer - request received")
|
||||||
try:
|
try:
|
||||||
print "Parsed handover request: " + request.pretty()
|
print "Parsed handover request: " + request.pretty()
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
@ -136,15 +155,18 @@ class HandoverServer(nfc.handover.HandoverServer):
|
|||||||
for carrier in request.carriers:
|
for carrier in request.carriers:
|
||||||
print "Remote carrier type: " + carrier.type
|
print "Remote carrier type: " + carrier.type
|
||||||
if carrier.type == "application/vnd.wfa.wsc":
|
if carrier.type == "application/vnd.wfa.wsc":
|
||||||
print "WPS carrier type match - add WPS carrier record"
|
summary("WPS carrier type match - add WPS carrier record")
|
||||||
data = wpas_get_handover_sel(self.uuid)
|
data = wpas_get_handover_sel(self.uuid)
|
||||||
if data is None:
|
if data is None:
|
||||||
print "Could not get handover select carrier record from wpa_supplicant"
|
summary("Could not get handover select carrier record from wpa_supplicant")
|
||||||
continue
|
continue
|
||||||
print "Handover select carrier record from wpa_supplicant:"
|
print "Handover select carrier record from wpa_supplicant:"
|
||||||
print data.encode("hex")
|
print data.encode("hex")
|
||||||
self.sent_carrier = data
|
self.sent_carrier = data
|
||||||
wpas_report_handover(carrier.record, self.sent_carrier, "RESP")
|
if "OK" in wpas_report_handover(carrier.record, self.sent_carrier, "RESP"):
|
||||||
|
success_report("Handover reported successfully (responder)")
|
||||||
|
else:
|
||||||
|
summary("Handover report rejected (responder)")
|
||||||
|
|
||||||
message = nfc.ndef.Message(data);
|
message = nfc.ndef.Message(data);
|
||||||
sel.add_carrier(message[0], "active", message[1:])
|
sel.add_carrier(message[0], "active", message[1:])
|
||||||
@ -156,17 +178,17 @@ class HandoverServer(nfc.handover.HandoverServer):
|
|||||||
print e
|
print e
|
||||||
print str(sel).encode("hex")
|
print str(sel).encode("hex")
|
||||||
|
|
||||||
print "Sending handover select"
|
summary("Sending handover select")
|
||||||
self.success = True
|
self.success = True
|
||||||
return sel
|
return sel
|
||||||
|
|
||||||
|
|
||||||
def wps_handover_init(llc):
|
def wps_handover_init(llc):
|
||||||
print "Trying to initiate WPS handover"
|
summary("Trying to initiate WPS handover")
|
||||||
|
|
||||||
data = wpas_get_handover_req()
|
data = wpas_get_handover_req()
|
||||||
if (data == None):
|
if (data == None):
|
||||||
print "Could not get handover request carrier record from wpa_supplicant"
|
summary("Could not get handover request carrier record from wpa_supplicant")
|
||||||
return
|
return
|
||||||
print "Handover request carrier record from wpa_supplicant: " + data.encode("hex")
|
print "Handover request carrier record from wpa_supplicant: " + data.encode("hex")
|
||||||
|
|
||||||
@ -184,27 +206,33 @@ def wps_handover_init(llc):
|
|||||||
|
|
||||||
client = nfc.handover.HandoverClient(llc)
|
client = nfc.handover.HandoverClient(llc)
|
||||||
try:
|
try:
|
||||||
print "Trying handover";
|
summary("Trying to initiate NFC connection handover")
|
||||||
client.connect()
|
client.connect()
|
||||||
print "Connected for handover"
|
summary("Connected for handover")
|
||||||
except nfc.llcp.ConnectRefused:
|
except nfc.llcp.ConnectRefused:
|
||||||
print "Handover connection refused"
|
summary("Handover connection refused")
|
||||||
|
client.close()
|
||||||
|
return
|
||||||
|
except Exception, e:
|
||||||
|
summary("Other exception: " + str(e))
|
||||||
client.close()
|
client.close()
|
||||||
return
|
return
|
||||||
|
|
||||||
print "Sending handover request"
|
summary("Sending handover request")
|
||||||
|
|
||||||
if not client.send(message):
|
if not client.send(message):
|
||||||
print "Failed to send handover request"
|
summary("Failed to send handover request")
|
||||||
|
client.close()
|
||||||
|
return
|
||||||
|
|
||||||
print "Receiving handover response"
|
summary("Receiving handover response")
|
||||||
message = client._recv()
|
message = client._recv()
|
||||||
if message is None:
|
if message is None:
|
||||||
print "No response received"
|
summary("No response received")
|
||||||
client.close()
|
client.close()
|
||||||
return
|
return
|
||||||
if message.type != "urn:nfc:wkt:Hs":
|
if message.type != "urn:nfc:wkt:Hs":
|
||||||
print "Response was not Hs - received: " + message.type
|
summary("Response was not Hs - received: " + message.type)
|
||||||
client.close()
|
client.close()
|
||||||
return
|
return
|
||||||
|
|
||||||
@ -215,7 +243,7 @@ def wps_handover_init(llc):
|
|||||||
print e
|
print e
|
||||||
print str(message).encode("hex")
|
print str(message).encode("hex")
|
||||||
message = nfc.ndef.HandoverSelectMessage(message)
|
message = nfc.ndef.HandoverSelectMessage(message)
|
||||||
print "Handover select received"
|
summary("Handover select received")
|
||||||
try:
|
try:
|
||||||
print message.pretty()
|
print message.pretty()
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
@ -225,7 +253,10 @@ def wps_handover_init(llc):
|
|||||||
print "Remote carrier type: " + carrier.type
|
print "Remote carrier type: " + carrier.type
|
||||||
if carrier.type == "application/vnd.wfa.wsc":
|
if carrier.type == "application/vnd.wfa.wsc":
|
||||||
print "WPS carrier type match - send to wpa_supplicant"
|
print "WPS carrier type match - send to wpa_supplicant"
|
||||||
wpas_report_handover(data, carrier.record, "INIT")
|
if "OK" in wpas_report_handover(data, carrier.record, "INIT"):
|
||||||
|
success_report("Handover reported successfully (initiator)")
|
||||||
|
else:
|
||||||
|
summary("Handover report rejected (initiator)")
|
||||||
# nfcpy does not support the new format..
|
# nfcpy does not support the new format..
|
||||||
#wifi = nfc.ndef.WifiConfigRecord(carrier.record)
|
#wifi = nfc.ndef.WifiConfigRecord(carrier.record)
|
||||||
#print wifi.pretty()
|
#print wifi.pretty()
|
||||||
@ -250,11 +281,14 @@ def wps_tag_read(tag, wait_remove=True):
|
|||||||
for record in tag.ndef.message:
|
for record in tag.ndef.message:
|
||||||
print "record type " + record.type
|
print "record type " + record.type
|
||||||
if record.type == "application/vnd.wfa.wsc":
|
if record.type == "application/vnd.wfa.wsc":
|
||||||
print "WPS tag - send to wpa_supplicant"
|
summary("WPS tag - send to wpa_supplicant")
|
||||||
success = wpas_tag_read(tag.ndef.message)
|
success = wpas_tag_read(tag.ndef.message)
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
print "Empty tag"
|
summary("Empty tag")
|
||||||
|
|
||||||
|
if success:
|
||||||
|
success_report("Tag read succeeded")
|
||||||
|
|
||||||
if wait_remove:
|
if wait_remove:
|
||||||
print "Remove tag"
|
print "Remove tag"
|
||||||
@ -265,9 +299,10 @@ def wps_tag_read(tag, wait_remove=True):
|
|||||||
|
|
||||||
|
|
||||||
def rdwr_connected_write(tag):
|
def rdwr_connected_write(tag):
|
||||||
print "Tag found - writing"
|
summary("Tag found - writing - " + str(tag))
|
||||||
global write_data
|
global write_data
|
||||||
tag.ndef.message = str(write_data)
|
tag.ndef.message = str(write_data)
|
||||||
|
success_report("Tag write succeeded")
|
||||||
print "Done - remove tag"
|
print "Done - remove tag"
|
||||||
global only_one
|
global only_one
|
||||||
if only_one:
|
if only_one:
|
||||||
@ -318,7 +353,7 @@ def wps_write_password_tag(clf, wait_remove=True):
|
|||||||
|
|
||||||
def rdwr_connected(tag):
|
def rdwr_connected(tag):
|
||||||
global only_one, no_wait
|
global only_one, no_wait
|
||||||
print "Tag connected: " + str(tag)
|
summary("Tag connected: " + str(tag))
|
||||||
|
|
||||||
if tag.ndef:
|
if tag.ndef:
|
||||||
print "NDEF tag: " + tag.type
|
print "NDEF tag: " + tag.type
|
||||||
@ -331,7 +366,8 @@ def rdwr_connected(tag):
|
|||||||
global continue_loop
|
global continue_loop
|
||||||
continue_loop = False
|
continue_loop = False
|
||||||
else:
|
else:
|
||||||
print "Not an NDEF tag - remove tag"
|
summary("Not an NDEF tag - remove tag")
|
||||||
|
return True
|
||||||
|
|
||||||
return not no_wait
|
return not no_wait
|
||||||
|
|
||||||
@ -398,6 +434,10 @@ def main():
|
|||||||
help='UUID of an AP (used for WPS ER operations)')
|
help='UUID of an AP (used for WPS ER operations)')
|
||||||
parser.add_argument('--id',
|
parser.add_argument('--id',
|
||||||
help='network id (used for WPS ER operations)')
|
help='network id (used for WPS ER operations)')
|
||||||
|
parser.add_argument('--summary',
|
||||||
|
help='summary file for writing status updates')
|
||||||
|
parser.add_argument('--success',
|
||||||
|
help='success file for writing success update')
|
||||||
parser.add_argument('command', choices=['write-config',
|
parser.add_argument('command', choices=['write-config',
|
||||||
'write-er-config',
|
'write-er-config',
|
||||||
'write-password'],
|
'write-password'],
|
||||||
@ -413,6 +453,14 @@ def main():
|
|||||||
global no_wait
|
global no_wait
|
||||||
no_wait = args.no_wait
|
no_wait = args.no_wait
|
||||||
|
|
||||||
|
if args.summary:
|
||||||
|
global summary_file
|
||||||
|
summary_file = args.summary
|
||||||
|
|
||||||
|
if args.success:
|
||||||
|
global success_file
|
||||||
|
success_file = args.success
|
||||||
|
|
||||||
logging.basicConfig(level=args.loglevel)
|
logging.basicConfig(level=args.loglevel)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user