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