3 # Example nfcpy to wpa_supplicant wrapper for WPS NFC operations
4 # Copyright (c) 2012-2013, Jouni Malinen <j@w1.fi>
6 # This software may be distributed under the terms of the BSD license.
7 # See README for more details.
23 wpas_ctrl = '/var/run/wpa_supplicant'
27 if os.path.isdir(wpas_ctrl):
29 ifaces = [os.path.join(wpas_ctrl, i) for i in os.listdir(wpas_ctrl)]
30 except OSError, error:
31 print "Could not find wpa_supplicant: ", error
35 print "No wpa_supplicant control interface found"
40 wpas = wpactrl.WPACtrl(ctrl)
42 except wpactrl.error, error:
43 print "Error: ", error
48 def wpas_tag_read(message):
52 print wpas.request("WPS_NFC_TAG_READ " + message.encode("hex"))
55 def wpas_get_handover_req():
59 return wpas.request("NFC_GET_HANDOVER_REQ NDEF WPS").rstrip().decode("hex")
62 def wpas_put_handover_sel(message):
66 print wpas.request("NFC_RX_HANDOVER_SEL " + str(message).encode("hex"))
69 def wps_handover_init(peer):
70 print "Trying to initiate WPS handover"
72 data = wpas_get_handover_req()
74 print "Could not get handover request message from wpa_supplicant"
76 print "Handover request from wpa_supplicant: " + data.encode("hex")
77 message = nfc.ndef.Message(data)
78 print "Parsed handover request: " + message.pretty()
80 nfc.llcp.activate(peer);
82 client = nfc.handover.HandoverClient()
84 print "Trying handover";
86 print "Connected for handover"
87 except nfc.llcp.ConnectRefused:
88 print "Handover connection refused"
93 print "Sending handover request"
95 if not client.send(message):
96 print "Failed to send handover request"
98 print "Receiving handover response"
99 message = client._recv()
100 print "Handover select received"
101 print message.pretty()
102 wpas_put_handover_sel(message)
107 print "Done with handover"
110 def wps_tag_read(tag):
111 if len(tag.ndef.message):
112 message = nfc.ndef.Message(tag.ndef.message)
113 print "message type " + message.type
115 for record in message:
116 print "record type " + record.type
117 if record.type == "application/vnd.wfa.wsc":
118 print "WPS tag - send to wpa_supplicant"
119 wpas_tag_read(tag.ndef.message)
125 while tag.is_present:
131 if nfc.llcp.connected():
132 print "LLCP connected"
133 general_bytes = nfc.llcp.startup({})
134 peer = clf.listen(ord(os.urandom(1)) + 200, general_bytes)
135 if isinstance(peer, nfc.DEP):
136 print "listen -> DEP";
137 if peer.general_bytes.startswith("Ffm"):
140 print "mismatch in general_bytes"
141 print peer.general_bytes
143 peer = clf.poll(general_bytes)
144 if isinstance(peer, nfc.DEP):
146 if peer.general_bytes.startswith("Ffm"):
149 print "mismatch in general_bytes"
150 print peer.general_bytes
158 clf = nfc.ContactlessFrontend()
162 print "Waiting for a tag or peer to be touched"
165 if isinstance(tag, nfc.DEP):
166 wps_handover_init(tag)
173 print "Not an NDEF tag - remove tag"
174 while tag.is_present:
177 except KeyboardInterrupt:
184 if __name__ == '__main__':