Module: SepayPgRuby::IPN

Defined in:
lib/sepay_pg_ruby/ipn.rb

Class Method Summary collapse

Class Method Details

.secure_compare(a, b) ⇒ Object



22
23
24
25
26
27
28
29
# File 'lib/sepay_pg_ruby/ipn.rb', line 22

def secure_compare(a, b)
  return false unless a.is_a?(String) && b.is_a?(String)
  return false unless a.bytesize == b.bytesize

  result = 0
  a.bytes.zip(b.bytes) { |x, y| result |= x ^ y }
  result.zero?
end

.verify_signature(payload, secret_key) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
19
20
# File 'lib/sepay_pg_ruby/ipn.rb', line 7

def verify_signature(payload, secret_key)
  payload_hash = payload.transform_keys(&:to_s)
  received_signature = payload_hash['signature']
  return false if received_signature.nil? || received_signature.empty?

  data_to_verify = payload_hash.reject { |k, _| k == 'signature' }
  sorted_keys = data_to_verify.keys.select { |k| !data_to_verify[k].nil? }.sort
  query_string = sorted_keys.map { |key| "#{key}=#{data_to_verify[key]}" }.join('&')

  calculated = OpenSSL::HMAC.hexdigest('sha256', secret_key.to_s, query_string)
  secure_compare(received_signature, calculated)
rescue StandardError
  false
end