wpa_supplicant - detectando que minha senha está incorreta?

wpa_supplicant - detectando que minha senha está incorreta?

Se eu especificar uma senha incorreta ao me conectar a uma rede WiFi, existe alguma maneira de detectar que o motivo pelo qual não consigo me conectar é a senha incorreta (em vez de um dos muitos outros motivos possíveis pelos quais alguém pode não conseguir se conectar).

Por exemplo, aqui eu adiciono uma rede, mas especifico deliberadamente a senha errada. Se eu verificar o status, vejo que éSCANNING

# wpa_cli add_network
Selected interface 'wlan0'
1
# wpa_cli set_network 1 ssid \"MyPlace\"
Selected interface 'wlan0'
OK
# wpa_cli set_network 1 psk \"SuperSecret\"
Selected interface 'wlan0'
OK
# wpa_cli select_network 1
Selected interface 'wlan0'
OK
# wpa_cli status
Selected interface 'wlan0'
wpa_state=SCANNING
p2p_device_address=fe:c2:de:37:93:11
address=fc:c2:de:37:93:11

Se eu escrever um script para ser executado wpa_cli statusrepetidamente após selecionar a rede, posso ver que ele passa pelas fases:

SCANNING
ASSOCIATING
4WAY_HANDSHAKE
DISCONNECTED
SCANNING

Então, há alguma maneira de descobrir que a fase de associação/handshake falhou devido a uma senha incorreta? Por exemplo, o evento de desconexão relata algum motivo armazenado e que posso consultar?

Responder1

Se olharmoswpa_supplicant/events.c:2326Nós vemos:

if (could_be_psk_mismatch(wpa_s, reason_code, locally_generated)) {
    wpa_msg(wpa_s, MSG_INFO, "WPA: 4-Way Handshake failed - "
        "pre-shared key may be incorrect");
    if (wpas_p2p_4way_hs_failed(wpa_s) > 0)
        return; /* P2P group removed */
    wpas_auth_failed(wpa_s, "WRONG_KEY");
}

Então, quando essa lógica é atingida, ela registra WPA: 4-Way Handshake failed - pre-shared key may be incorrect.

Depois segue parawpa_supplicant/wpa_supplicant.c:5136e vemos:

wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_TEMP_DISABLED
    "id=%d ssid=\"%s\" auth_failures=%u duration=%d reason=%s",
    ssid->id, wpa_ssid_txt(ssid->ssid, ssid->ssid_len),
    ssid->auth_failures, dur, reason);

Então aqui <3>CTRL-EVENT-SSID-TEMP-DISABLED id=0 ssid="MyPlace" auth_failures=1 duration=10 reason=WRONG_KEYestá registrado.

Portanto, posso garantir que wpa_supplicantseja iniciado de forma que registre sua saída em um arquivo e, em seguida, greppara essas mensagens.

Ou posso executar wpa_clino modo interativo - quando estiver nesse modo, ele assinará e enviará quaisquer wpa_supplicantmensagens.

Então, a solução muito hackeada que encontrei foi executar wpa_clium script e enganá-lo fazendo-o pensar que está no modo interativo:

#!/bin/bash

function poke {
    while true
    do
        printf '\n'
        sleep 1
    done
}

function watch {
    (poke) | wpa_cli | while read line
    do
        case "$line" in
            *'4-Way Handshake failed'*)
                echo "incorrect key"
                return
            ;;
            *'CTRL-EVENT-CONNECTED'*)
                echo "connected"
                return
            ;;
        esac
    done
}

wpa_cli disable_network 0 > /dev/null
wpa_cli enable_network 0 > /dev/null

watch

wpa_clisó emitirá quaisquer mensagens recebidas após a ocorrência de alguma entrada do usuário, portanto, a pokefunção fornece isso.

Este script habilita a 0ª rede e analisa quais wpa_supplicantsaídas ao fazer isso.

Como eu disse, isso é bastante hacky, mas funciona.

informação relacionada