mirror of
https://github.com/dkam/hsmr.git
synced 2025-12-28 08:44:53 +00:00
Migrate to test::unit. Start moving functionality into HSMR Module and mixin to key and component models to reduce duplication.
This commit is contained in:
79
lib/hsmr.rb
79
lib/hsmr.rb
@@ -8,6 +8,81 @@ module HSMR
|
||||
DOUBLE=128
|
||||
TRIPLE=192
|
||||
|
||||
## Mixin functionality
|
||||
|
||||
def kcv()
|
||||
des = OpenSSL::Cipher::Cipher.new("des-cbc") if @key.length == 8
|
||||
des = OpenSSL::Cipher::Cipher.new("des-ede-cbc") if @key.length == 16
|
||||
des.encrypt
|
||||
des.key=@key
|
||||
des.update("\x00"*8).unpack('H*').first[0...6].upcase
|
||||
end
|
||||
|
||||
def generate(length)
|
||||
(0...(length/4)).collect { rand(16).to_s(16).upcase }.join
|
||||
end
|
||||
|
||||
|
||||
def to_s
|
||||
@key.unpack('H4'*(@key.length/2)).join(" ").upcase
|
||||
end
|
||||
|
||||
def odd_parity?
|
||||
# http://csrc.nist.gov/publications/nistpubs/800-67/SP800-67.pdf
|
||||
#
|
||||
# The eight error detecting bits are set to make the parity of each 8-bit
|
||||
# byte of the key odd. That is, there is an odd number of "1"s in each 8-bit byte.
|
||||
|
||||
#3.to_s(2).count('1')
|
||||
#@key.unpack("H2").first.to_i(16).to_s(2)
|
||||
|
||||
working=@key.unpack('H2'*(@key.length))
|
||||
working.each do |o|
|
||||
freq = o.to_i(16).to_s(2).count('1').to_i
|
||||
if( freq%2 == 0)
|
||||
#puts "#{o} is #{o.to_i(16).to_s(2).count('1').to_i } - even"
|
||||
return false
|
||||
else
|
||||
return true
|
||||
#puts "#{o} is #{o.to_i(16).to_s(2).count('1').to_i } - odd"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def set_odd_parity
|
||||
return true if self.odd_parity? == true
|
||||
|
||||
working=@key.unpack('H2'*(@key.length))
|
||||
working.each_with_index do |o,i|
|
||||
freq = o.to_i(16).to_s(2).count('1').to_i
|
||||
if( freq%2 == 0)
|
||||
c1 = o[0].chr
|
||||
c2 = case o[1].chr
|
||||
when "0" then "1"
|
||||
when "1" then "0"
|
||||
when "2" then "3"
|
||||
when "3" then "2"
|
||||
when "4" then "5"
|
||||
when "5" then "4"
|
||||
when "6" then "7"
|
||||
when "7" then "6"
|
||||
when "8" then "9"
|
||||
when "9" then "8"
|
||||
when "a" then "b"
|
||||
when "b" then "a"
|
||||
when "c" then "d"
|
||||
when "d" then "c"
|
||||
when "e" then "f"
|
||||
when "f" then "e"
|
||||
end
|
||||
working[i]="#{c1}#{c2}"
|
||||
end
|
||||
end
|
||||
@key = working.join.unpack('a2'*(working.length)).map{|x| x.hex}.pack('c'*(working.length))
|
||||
end
|
||||
|
||||
## Module Methods
|
||||
|
||||
def self.encrypt_pin(key, pin)
|
||||
@pin = pin.unpack('a2'*(pin.length/2)).map{|x| x.hex}.pack('c'*(pin.length/2))
|
||||
des = OpenSSL::Cipher::Cipher.new("des-ede")
|
||||
@@ -74,6 +149,10 @@ module HSMR
|
||||
result = des.update(@tsp).unpack('H*').first.upcase
|
||||
decimalise(result, :visa)[0..3].join
|
||||
end
|
||||
|
||||
def self.cvv(key_left, key_right, account, exp, service_code)
|
||||
|
||||
end
|
||||
|
||||
def self.xor(component1, *rest)
|
||||
return if rest.length == 0
|
||||
|
||||
Reference in New Issue
Block a user