reavetard
Version:
CoffeeScript modules that provide AP rotation support and a host of data management and general usability enhancements for Reaver-WPS Cracker and its partner in crime, Wash-WPS Scanner
77 lines (68 loc) • 2.49 kB
text/coffeescript
# Reavetard - Reaver WPS (+Wash) extension scripts
# pins.coffee :: Convenient WPS PIN collection class that can calculate standard
# the pins based on indices or keys to save resources when
# Author: Robbie Saunders http://eibbors.com/[/p/reavetard]
# ==============================================================================
# These are supposedly common reaver explicitly defines them by default.
{REAVER_DEFAULT_KEYS} = require './config'
# Pad (prepend 0's to) an integer to its proper key width
padKey = (key, width) ->
len = Math.max(0, width - "#{key}".length)
Array(len + 1).join('0') + key
# Calculate the chucksum digit of a 7-digit pin (pair of keys)
calcChecksum = (pin) ->
accum = 0
while pin > 0
accum += 3 * (pin % 10)
pin = parseInt(pin / 10)
accum += pin % 10
pin = parseInt(pin / 10)
return (10 - accum % 10) % 10
# Sequentially exhaust every key of a given length, klen
enumKeys = (klen) ->
max = Math.pow(10, klen)
padKey("#{i}", klen) for i in [0...max]
class WPSPinCollection
# Takes an array of explicit keys and calculates values whenever possible
# instead of storing all 11,000 as reaver does.
constructor: (explicits) ->
@keys = { '1': [], '2': [] }
# Can be used to add keys post initialization
@keys.add = (key) =>
if key.length in [7,8]
@keys[1].push key[0..3]
@keys[2].push key[4..6]
if key.length is 4
@keys[1].push key
if key.length is 3
@keys[2].push key
# Add the explicitly defined keys passed to us
explicits ?= REAVER_DEFAULT_KEYS
(@keys.add k) for k in explicits
# Calculate the key at a certain index
keyAt: (set, kindex, pad=true) ->
keys = @keys[set]
if kindex >= keys.length
key = kindex - keys.length
for k in keys
if Number(k) < (kindex - 1) then key++
else
key = keys[kindex] ? '0000'
if pad then padKey(key, 5 - set)
else key
# Get / calculate the pin at provided indices
get: (ki1, ki2) ->
p1 = "#{@keyAt(1, ki1)}"
p2 = "#{@keyAt(2, ki2)}"
cs = calcChecksum Number(p1 + p2)
return "#{p1}#{p2}#{cs}"
# Builds an array of all possible keys in .wpc file format used for session storage, ie:
# [4-digit explicits, remaining 4-digit, 3-digit explicits, remaining 3-digit]
buildEnum: () ->
kset = { '1': enumKeys(4), '2': enumKeys(3) }
for i in [1..2]
removed = 0
for k in @keys[i].slice(0).sort()
kset[i].splice Number(k) - removed++, 1
@keys[1].concat(kset[1], @keys[2], kset[2])
module.exports = WPSPinCollection