class SunatInvoice::Signature

Constants

C14N_ALGORITHM
DIGEST_ALGORITHM
SIGNATURE_ALGORITHM
TRANSFORMATION_ALGORITHM

Attributes

provider[RW]

Public Instance Methods

build_digital_attachment(xml) click to toggle source
# File lib/sunat_invoice/signature.rb, line 38
def build_digital_attachment(xml)
  xml['cac'].DigitalSignatureAttachment do
    xml['cac'].ExternalReference do
      xml['cbc'].URI "##{provider.signature_location_id}"
    end
  end
end
build_signatory_party(xml) click to toggle source
# File lib/sunat_invoice/signature.rb, line 27
def build_signatory_party(xml)
  xml['cac'].SignatoryParty do
    xml['cac'].PartyIdentification do
      xml['cbc'].ID provider.ruc
    end
    xml['cac'].PartyName do
      xml['cbc'].Name provider.name
    end
  end
end
build_transforms(xml) click to toggle source
# File lib/sunat_invoice/signature.rb, line 73
def build_transforms(xml)
  xml['ds'].Transforms do
    xml['ds'].Transform Algorithm: TRANSFORMATION_ALGORITHM
  end
end
sign(invoice_xml) click to toggle source
# File lib/sunat_invoice/signature.rb, line 46
def sign(invoice_xml)
  options = { id_attr: provider.signature_location_id }
  doc = Xmldsig::SignedDocument.new(invoice_xml, options)
  doc.sign(private_key)
end
signature_ext(xml) click to toggle source
# File lib/sunat_invoice/signature.rb, line 52
def signature_ext(xml)
  ubl_ext(xml) do
    xml['ds'].Signature(Id: provider.signature_location_id) do
      signed_info xml
      signature_value xml
    end
  end
end
signature_value(xml) click to toggle source
# File lib/sunat_invoice/signature.rb, line 79
def signature_value(xml)
  xml['ds'].SignatureValue
  xml['ds'].KeyInfo do
    xml['ds'].X509Data do
      xml['ds'].X509Certificate encoded_certificate
    end
  end
end
signed_info(xml) click to toggle source
# File lib/sunat_invoice/signature.rb, line 61
def signed_info(xml)
  xml['ds'].SignedInfo do
    xml['ds'].CanonicalizationMethod Algorithm: C14N_ALGORITHM
    xml['ds'].SignatureMethod Algorithm: SIGNATURE_ALGORITHM
    xml['ds'].Reference URI: '' do
      build_transforms(xml)
      xml['ds'].DigestMethod Algorithm: DIGEST_ALGORITHM
      xml['ds'].DigestValue
    end
  end
end
signer_data(xml) click to toggle source
# File lib/sunat_invoice/signature.rb, line 19
def signer_data(xml)
  xml['cac'].Signature do
    xml['cbc'].ID provider.signature_id
    build_signatory_party(xml)
    build_digital_attachment(xml)
  end
end

Private Instance Methods

certificate() click to toggle source
# File lib/sunat_invoice/signature.rb, line 102
def certificate
  OpenSSL::X509::Certificate.new(file_content(provider.cert_file))
end
encoded_certificate() click to toggle source
# File lib/sunat_invoice/signature.rb, line 90
def encoded_certificate
  Base64.encode64(certificate.to_der).gsub(/\n/, '')
end
file_content(file) click to toggle source
# File lib/sunat_invoice/signature.rb, line 94
def file_content(file)
  open(file) { |f| f.read }
end
private_key() click to toggle source
# File lib/sunat_invoice/signature.rb, line 98
def private_key
  OpenSSL::PKey::RSA.new(file_content(provider.pk_file))
end