class GtRubySdk::LocalServer

Constants

TOLERANCE

Public Class Methods

decode(challenge, code_fragment) click to toggle source

解码随机参数

# File lib/gt_ruby_sdk/local_server.rb, line 50
def decode(challenge, code_fragment)
  return 0 if code_fragment.length > 100

  hash = {}
  duplicated_array = []
  numbers = [1, 2, 5, 10, 50]
  count = 0

  challenge.chars.each do |item|
    next if duplicated_array.include?(item)

    value = numbers[count % 5]
    duplicated_array.push(item)
    count += 1

    hash[item] = value
  end

  offset = decode_offset(challenge[32..33])
  code_fragment.chars.inject(0) { |_acc, elem| +hash[elem] } - offset
end
decode_offset(number) click to toggle source

输入的两位的随机数字,解码出偏移量

# File lib/gt_ruby_sdk/local_server.rb, line 73
def decode_offset(number)
  number = number[0..1]

  array = number.codepoints.to_a.map do |codepoint|
    codepoint > 57 ? (codepoint - 87) : (codepoint - 48)
  end

  array[0] * 36 + array[1]
end
register() click to toggle source
# File lib/gt_ruby_sdk/local_server.rb, line 8
def register
  rnd1 = Digest::MD5.hexdigest(Random.rand(100).to_s)
  rnd2 = Digest::MD5.hexdigest(Random.rand(100).to_s)

  [
    rnd1,
    rnd2.to_s[0..1]
  ].join
end
validate(challenge, pin_code, _seccode) click to toggle source
# File lib/gt_ruby_sdk/local_server.rb, line 18
def validate(challenge, pin_code, _seccode)
  return false if pin_code.blank?

  code_fragments = pin_code.split('_')

  ans = decode(challenge, code_fragments[0])
  bg_image_index = decode(challenge, code_fragments[1])
  image_grp_index = decode(challenge, code_fragments[2])

  validate_image(ans, bg_image_index, image_grp_index)
end
validate_image(ans, bg_image_index, image_grp_index) click to toggle source
# File lib/gt_ruby_sdk/local_server.rb, line 30
def validate_image(ans, bg_image_index, image_grp_index)
  full_bg_name = Digest::MD5.hexdigest(bg_image_index.to_s)[0..8]
  bg_name = Digest::MD5.hexdigest(image_grp_index.to_s)[10..18]

  array = 9.times.inject([]) do |collector, i|
    collector.push(
      i.odd? ? bg_name[i] : full_bg_name[i]
    )
  end

  x_decode = array[4..-1].join
  x_int = x_decode.to_i(16)

  result = x_int % 200
  result = result < 40 ? 40 : result

  (ans - result).abs < 4
end