Class: Cfdi40::SignatureValidator

Inherits:
Object
  • Object
show all
Defined in:
lib/cfdi40/signature_validator.rb

Instance Method Summary collapse

Constructor Details

#initialize(xml) ⇒ SignatureValidator

Returns a new instance of SignatureValidator.



6
7
8
9
# File 'lib/cfdi40/signature_validator.rb', line 6

def initialize(xml)
  @xml_doc = Nokogiri::XML(xml)

end

Instance Method Details

#certObject

Raises:



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/cfdi40/signature_validator.rb', line 23

def cert
  return @cert if defined?(@cert)

  cert_string = @xml_doc.root.attributes["Certificado"].to_s
  raise Cfdi40::Error, 'Certificate is not included in XML' if cert_string == ''
  sat_csd = SatCsd.new
  sat_csd.cert64 = cert_string
  sat_csd.x509_cert.serial

  if @xml_doc.root.attributes["NoCertificado"].to_s != sat_csd.no_certificado
    raise Cfdi40::Error, 'Certificate number in XML does not correspond to the included certificate'
  end

  @cert = sat_csd.x509_cert
end

#signObject

Raises:



16
17
18
19
20
21
# File 'lib/cfdi40/signature_validator.rb', line 16

def sign
  sign = @xml_doc.root.attributes["Sello"].to_s
  raise Cfdi40::Error, 'CFDI is not signed' if sign == ''

  Base64.decode64 sign
end

#valid?Boolean

Returns:

  • (Boolean)


11
12
13
14
# File 'lib/cfdi40/signature_validator.rb', line 11

def valid?
  original_content = OriginalContent.generate(@xml_doc.to_s)
  cert.public_key.verify(OpenSSL::Digest.new('SHA256'), sign, original_content)
end