aboutsummaryrefslogtreecommitdiffstats
path: root/wpa_supplicant/examples/dpp-qrcode.py
diff options
context:
space:
mode:
authorJouni Malinen <jouni@qca.qualcomm.com>2017-06-22 11:52:28 (GMT)
committerJouni Malinen <j@w1.fi>2017-06-22 11:52:28 (GMT)
commita82349347dae59de16599def8e80527d6246d0dd (patch)
tree99cd653db93cef8ef4dbf97e0be4e04994f6b68f /wpa_supplicant/examples/dpp-qrcode.py
parent6a7182a9c3c0a6ea4710ee42bd19f2de7ebd7bdc (diff)
downloadhostap-a82349347dae59de16599def8e80527d6246d0dd.zip
hostap-a82349347dae59de16599def8e80527d6246d0dd.tar.gz
hostap-a82349347dae59de16599def8e80527d6246d0dd.tar.bz2
DPP: Add an example python script for QR Code operations
This script can be used to process Android logcat information for scanned QR Codes (e.g., from Barcode Scanner app) and also to display QR Codes for locally generated bootstrap keys. Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
Diffstat (limited to 'wpa_supplicant/examples/dpp-qrcode.py')
-rwxr-xr-xwpa_supplicant/examples/dpp-qrcode.py130
1 files changed, 130 insertions, 0 deletions
diff --git a/wpa_supplicant/examples/dpp-qrcode.py b/wpa_supplicant/examples/dpp-qrcode.py
new file mode 100755
index 0000000..e2a00c9
--- /dev/null
+++ b/wpa_supplicant/examples/dpp-qrcode.py
@@ -0,0 +1,130 @@
+#!/usr/bin/python
+#
+# Example Android logcat to wpa_supplicant wrapper for QR Code scans
+# Copyright (c) 2017, Qualcomm Atheros, Inc.
+#
+# This software may be distributed under the terms of the BSD license.
+# See README for more details.
+
+import os
+import sys
+import argparse
+import logging
+import qrcode
+
+scriptsdir = os.path.dirname(os.path.realpath(sys.modules[__name__].__file__))
+sys.path.append(os.path.join(scriptsdir, '..', '..', 'wpaspy'))
+
+import wpaspy
+
+wpas_ctrl = '/var/run/wpa_supplicant'
+
+def wpas_connect():
+ ifaces = []
+ if os.path.isdir(wpas_ctrl):
+ try:
+ ifaces = [os.path.join(wpas_ctrl, i) for i in os.listdir(wpas_ctrl)]
+ except OSError, error:
+ print "Could not find wpa_supplicant: ", error
+ return None
+
+ if len(ifaces) < 1:
+ print "No wpa_supplicant control interface found"
+ return None
+
+ for ctrl in ifaces:
+ try:
+ wpas = wpaspy.Ctrl(ctrl)
+ return wpas
+ except Exception, e:
+ pass
+ return None
+
+def dpp_logcat():
+ for line in iter(sys.stdin.readline, ''):
+ if "ResultHandler: Launching intent: Intent" not in line:
+ continue
+ if "act=android.intent.action.VIEW" not in line:
+ continue
+ uri = None
+ for val in line.split(' '):
+ if val.startswith('dat='):
+ uri = val.split('=', 1)[1]
+ break
+ if not uri:
+ continue
+ if not uri.startswith('DPP:'):
+ continue
+ print "Found DPP bootstrap info URI:"
+ print uri
+ wpas = wpas_connect()
+ if not wpas:
+ print "Could not connect to wpa_supplicant"
+ print
+ continue
+ res = wpas.request("DPP_QR_CODE " + uri);
+ try:
+ id = int(res)
+ except ValueError:
+ print "QR Code URI rejected"
+ continue
+ print "QR Code URI accepted - ID=%d" % id
+ print wpas.request("DPP_BOOTSTRAP_INFO %d" % id)
+ del wpas
+
+def dpp_display(curve):
+ wpas = wpas_connect()
+ if not wpas:
+ print "Could not connect to wpa_supplicant"
+ return
+ res = wpas.request("STATUS")
+ addr = None
+ for line in res.splitlines():
+ if line.startswith("address="):
+ addr = line.split('=')[1]
+ break
+ cmd = "DPP_BOOTSTRAP_GEN type=qrcode"
+ cmd += " chan=81/1"
+ if addr:
+ cmd += " mac=" + addr.replace(':','')
+ if curve:
+ cmd += " curve=" + curve
+ res = wpas.request(cmd)
+ try:
+ id = int(res)
+ except ValueError:
+ print "Failed to generate bootstrap info URI"
+ return
+ print "Bootstrap information - ID=%d" % id
+ print wpas.request("DPP_BOOTSTRAP_INFO %d" % id)
+ uri = wpas.request("DPP_BOOTSTRAP_GET_URI %d" % id)
+ print uri
+ print "ID=%d" % id
+ qr = qrcode.QRCode(error_correction=qrcode.constants.ERROR_CORRECT_M,
+ border=3)
+ qr.add_data(uri, optimize=5)
+ qr.print_ascii(tty=True)
+ print "ID=%d" % id
+ del wpas
+
+def main():
+ parser = argparse.ArgumentParser(description='Android logcat to wpa_supplicant integration for DPP QR Code operations')
+ parser.add_argument('-d', const=logging.DEBUG, default=logging.INFO,
+ action='store_const', dest='loglevel',
+ help='verbose debug output')
+ parser.add_argument('--curve', '-c',
+ help='set a specific curve (P-256, P-384, P-521, BP-256R1, BP-384R1, BP-512R1) for key generation')
+ parser.add_argument('command', choices=['logcat',
+ 'display'],
+ nargs='?')
+ args = parser.parse_args()
+
+ logging.basicConfig(level=args.loglevel)
+
+ if args.command == "logcat":
+ dpp_logcat()
+ elif args.command == "display":
+ dpp_display(args.curve)
+
+if __name__ == '__main__':
+ main()