class AppleReceipt::Validator

Validator allows one to check the validity of a receipt.

Constants

INTERMEDIATE_CERT_MAPPING

Attributes

receipt[R]

Public Class Methods

new(receipt, certificates: []) click to toggle source
# File lib/apple_receipt/validator.rb, line 13
def initialize(receipt, certificates: [])
  populate_certificate_store(receipt.version, certificates)
  @receipt = receipt
end

Public Instance Methods

add_certificates(certificates) click to toggle source
# File lib/apple_receipt/validator.rb, line 33
def add_certificates(certificates)
  certificates.each do |cert|
    store.add_cert(cert)
  end
end
add_named_certificate(name) click to toggle source
# File lib/apple_receipt/validator.rb, line 27
def add_named_certificate(name)
  cert_path = File.expand_path("../../certificates/#{name}.cer", __dir__)
  cert_file = File.read(cert_path)
  store.add_cert(OpenSSL::X509::Certificate.new(cert_file))
end
populate_certificate_store(version, provided_certificates) click to toggle source
# File lib/apple_receipt/validator.rb, line 18
def populate_certificate_store(version, provided_certificates)
  if provided_certificates.any?
    add_certificates(provided_certificates)
  else
    add_named_certificate('AppleRootCA')
    add_named_certificate(INTERMEDIATE_CERT_MAPPING[version])
  end
end
public_key() click to toggle source
# File lib/apple_receipt/validator.rb, line 45
def public_key
  receipt.certificate.public_key
end
signed_data() click to toggle source
# File lib/apple_receipt/validator.rb, line 49
def signed_data
  [receipt.version, receipt.data].pack('CA*')
end
store() click to toggle source
# File lib/apple_receipt/validator.rb, line 53
def store
  @store ||= OpenSSL::X509::Store.new
end
valid?() click to toggle source
# File lib/apple_receipt/validator.rb, line 39
def valid?
  store.verify(receipt.certificate) &&
    public_key.verify(OpenSSL::Digest::SHA1.new,
                      receipt.signature, signed_data)
end