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);
83 client = nfc.handover.HandoverClient()
85 print "Trying handover";
87 print "Connected for handover"
88 except nfc.llcp.ConnectRefused:
89 print "Handover connection refused"
94 print "Sending handover request"
96 if not client.send(message):
97 print "Failed to send handover request"
99 print "Receiving handover response"
100 message = client._recv()
101 print "Handover select received"
102 print message.pretty()
103 wpas_put_handover_sel(message)
108 print "Done with handover"
111 def wps_tag_read(tag):
112 if len(tag.ndef.message):
113 message = nfc.ndef.Message(tag.ndef.message)
114 print "message type " + message.type
116 for record in message:
117 print "record type " + record.type
118 if record.type == "application/vnd.wfa.wsc":
119 print "WPS tag - send to wpa_supplicant"
120 wpas_tag_read(tag.ndef.message)
126 while tag.is_present:
132 if nfc.llcp.connected():
133 print "LLCP connected"
134 general_bytes = nfc.llcp.startup({})
135 peer = clf.listen(ord(os.urandom(1)) + 200, general_bytes)
136 if isinstance(peer, nfc.DEP):
137 print "listen -> DEP";
138 if peer.general_bytes.startswith("Ffm"):
141 print "mismatch in general_bytes"
142 print peer.general_bytes
144 peer = clf.poll(general_bytes)
145 if isinstance(peer, nfc.DEP):
147 if peer.general_bytes.startswith("Ffm"):
150 print "mismatch in general_bytes"
151 print peer.general_bytes
159 clf = nfc.ContactlessFrontend()
163 print "Waiting for a tag or peer to be touched"
166 if isinstance(tag, nfc.DEP):
167 wps_handover_init(tag)
174 print "Not an NDEF tag - remove tag"
175 while tag.is_present:
178 except KeyboardInterrupt:
185 if __name__ == '__main__':