class Nfe::Signer::Signature

Attributes

cert[RW]
document[RW]
key[RW]

Public Class Methods

new(document, key, cert) click to toggle source
# File lib/nfe/signer/signature.rb, line 8
def initialize(document, key, cert)
  @document = document
  @key  = key
  @cert = cert
  document.root.add_child signature
end

Public Instance Methods

key_info() click to toggle source
# File lib/nfe/signer/signature.rb, line 57
def key_info
  # Create KeyInfo
  node = Nokogiri::XML::Node.new('KeyInfo', @document)
  
  # Add X509 Data and Certificate
  x509_data = Nokogiri::XML::Node.new('X509Data', @document)
  x509_certificate = Nokogiri::XML::Node.new('X509Certificate', @document)
  x509_certificate.content = @cert.to_pem.gsub(/\-\-\-\-\-[A-Z]+ CERTIFICATE\-\-\-\-\-/, "").gsub(/\n/,"")

  x509_data.add_child x509_certificate
  node.add_child x509_data
  node
end
reference() click to toggle source
# File lib/nfe/signer/signature.rb, line 71
def reference
  infNFe = @document.at_css("infNFe")

  # Calculate digest
  xml_canon = infNFe.canonicalize(Nokogiri::XML::XML_C14N_EXCLUSIVE_1_0)
  xml_digest = Base64.encode64(OpenSSL::Digest::SHA1.digest(xml_canon)).strip

  # Create Reference
  node = Nokogiri::XML::Node.new('Reference', @document)
  node['URI'] = "##{infNFe['Id']}"
  node.add_child transforms

  # Add Digest
  child_node  = Nokogiri::XML::Node.new('DigestMethod', @document)
  child_node['Algorithm'] = 'http://www.w3.org/2000/09/xmldsig#sha1'
  node.add_child child_node
  
  # Add DigestValue
  child_node  = Nokogiri::XML::Node.new('DigestValue', @document)
  child_node.content = xml_digest
  node.add_child child_node        
  node
end
signature() click to toggle source
# File lib/nfe/signer/signature.rb, line 15
def signature
  # Create Signature
  node = Nokogiri::XML::Node.new('Signature', @document)
  node.default_namespace = 'http://www.w3.org/2000/09/xmldsig#'
  node.add_child signature_info
  node.add_child signature_value
  node.add_child key_info
  node
end
signature_info() click to toggle source
# File lib/nfe/signer/signature.rb, line 25
def signature_info
  # Create SignatureInfo
  signature_info_node = Nokogiri::XML::Node.new('SignedInfo', @document)

  # Add CanonicalizationMethod
  child_node = Nokogiri::XML::Node.new('CanonicalizationMethod', @document)
  child_node['Algorithm'] = 'http://www.w3.org/TR/2001/REC-xml-c14n-20010315'
  signature_info_node.add_child child_node

  # Add SignatureMethod
  child_node = Nokogiri::XML::Node.new('SignatureMethod', @document)
  child_node['Algorithm'] = 'http://www.w3.org/2000/09/xmldsig#rsa-sha1'
  signature_info_node.add_child child_node

  # Add Reference
  signature_info_node.add_child reference
  signature_info_node
end
signature_value() click to toggle source
# File lib/nfe/signer/signature.rb, line 44
def signature_value
  # Sign Signature
  xml = Nokogiri::XML(signature_info.to_xml, &:noblanks)
  xml.root["xmlns"] = 'http://www.w3.org/2000/09/xmldsig#'
  sign_canon = xml.canonicalize(Nokogiri::XML::XML_C14N_EXCLUSIVE_1_0)
  signature_hash = @key.sign(OpenSSL::Digest::SHA1.new, sign_canon)

  # Add SignatureValue
  node = Nokogiri::XML::Node.new('SignatureValue', @document)
  node.content = Base64.encode64(signature_hash).gsub("\n", '')
  node
end
transforms() click to toggle source
# File lib/nfe/signer/signature.rb, line 95
def transforms
  # Add Transforms
  node = Nokogiri::XML::Node.new('Transforms', @document)

  # Add Transform
  child_node  = Nokogiri::XML::Node.new('Transform', @document)
  child_node['Algorithm'] = 'http://www.w3.org/2000/09/xmldsig#enveloped-signature'
  node.add_child child_node

  # Add Transform
  child_node  = Nokogiri::XML::Node.new('Transform', @document)
  child_node['Algorithm'] = 'http://www.w3.org/TR/2001/REC-xml-c14n-20010315'
  node.add_child child_node
  node
end