Class: Nfcom::Builder::Signature

Inherits:
Object
  • Object
show all
Defined in:
lib/nfcom/builder/signature.rb

Constant Summary collapse

ALGORITHMS =
{
  c14n: 'http://www.w3.org/TR/2001/REC-xml-c14n-20010315',
  rsa_sha1: 'http://www.w3.org/2000/09/xmldsig#rsa-sha1',
  sha1: 'http://www.w3.org/2000/09/xmldsig#sha1',
  enveloped: 'http://www.w3.org/2000/09/xmldsig#enveloped-signature'
}.freeze
DSIG_NS =
'http://www.w3.org/2000/09/xmldsig#'

Instance Method Summary collapse

Constructor Details

#initialize(configuration) ⇒ Signature

Returns a new instance of Signature.



19
20
21
22
23
24
25
# File 'lib/nfcom/builder/signature.rb', line 19

def initialize(configuration)
  @configuration = configuration
  @certificate = Utils::Certificate.new(
    configuration.certificado_path,
    configuration.certificado_senha
  )
end

Instance Method Details

#assinar(xml_string) ⇒ Object

Raises:



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/nfcom/builder/signature.rb', line 27

def assinar(xml_string)
  # Parse XML
  doc = Nokogiri::XML(xml_string)

  # Find infNFCom element
  inf_nfcom = doc.at_xpath(
    '//nfcom:infNFCom',
    'nfcom' => 'http://www.portalfiscal.inf.br/nfcom'
  )

  raise Errors::XmlError, 'infNFCom element not found' unless inf_nfcom

  # Get reference URI
  ref_uri = "##{inf_nfcom['Id']}"

  # Calculate digest of canonicalized infNFCom
  digest_value = calculate_digest(inf_nfcom)

  # Build SignedInfo
  signed_info = build_signed_info(ref_uri, digest_value)

  # Calculate signature of canonicalized SignedInfo
  signature_value = calculate_signature(signed_info)

  # Build complete Signature element
  signature_xml = build_signature_xml(signed_info, signature_value, certificate_value)

  # Insert Signature into NFCom
  insert_signature(doc, signature_xml)

  # Return signed XML
  doc.to_xml(save_with: Nokogiri::XML::Node::SaveOptions::AS_XML)
end