signature_dfe 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ebe21fdf284216178ca792906a643e8246cd96a9b4cf948729343b7e015a4a82
4
- data.tar.gz: 87db1c580cee2c5bd9ac8800a12780e033da743e6ee22ec2f874932b7225a1eb
3
+ metadata.gz: c802eaf476623cebfcfb4142191d0497d653b10a7c3d0f7b446a94cc3804e61a
4
+ data.tar.gz: 7a88f5520538835ac8cd22fa7b61c94042837d7aaeb3fce8de512d915aaf4388
5
5
  SHA512:
6
- metadata.gz: ea69d110856af0bcb6afa790a475edd8f37aeefb711c536393fc561075aa5cf7c6b449829697c8d3b1f6b5ef69494609c1b2608c950927b61215eb0364f2dd04
7
- data.tar.gz: 13a849a8fb96bc6ff76400ec698d3000838e911f28f8c47ed9c18d659a8b0351a7a1b4dafefc6b51660903fe364efb2a0e071d2d3992ab6257df2b92ef534c46
6
+ metadata.gz: 5d13f7aec53106b1bc3b8aa80ed9a99adcd9c9523037dd5393c9a59484666d78018015f6903d3f72acc6266c5ad3b07b1b886244175fc2e7801ff483c19f0799
7
+ data.tar.gz: d1469960231b9af6fb343ac320e3a62ae60173b2d76ee4a0b3cd8405eb11a6c3a6a7e5c9a822b6c6ce5baf00bde671801748512fa15c55ae5c3f4b38dbd9de54
data/.gitignore CHANGED
@@ -1,3 +1,4 @@
1
+ Gemfile.lock
1
2
  .DS_Store
2
3
  *.gem
3
4
  /.bundle/
data/CHANGELOG CHANGED
@@ -1,2 +1,5 @@
1
+ v 0.1.2
2
+ - fix bug with pkcs12 signature
3
+ - add event for NF-e NFA-e NFC-e
1
4
  v 0.1.1
2
5
  - add NF-e NFA-e NFC-e
data/README.md CHANGED
@@ -1,3 +1,5 @@
1
+ [![Travis CI](https://travis-ci.org/thiaguerd/signature_dfe.svg?branch=master)](https://travis-ci.org/thiaguerd/signature_dfe) [![Gem Version](https://badge.fury.io/rb/signature_dfe.svg)](https://rubygems.org/gems/signature_dfe)
2
+
1
3
  # SignatureDfe
2
4
 
3
5
  Assinatura digital de documentos fiscais eletrônicos (DF-e)
@@ -42,7 +44,7 @@ SignatureDfe::SSL.config.password = "sua_senha"
42
44
  SignatureDfe::SSL.config.cert. = "caminho/para/seu/certificado_publico.pem"
43
45
  ```
44
46
 
45
- Feito esta configuração você testa, no cado se tudo certo, o resultado será true
47
+ Feito esta configuração você testa, no caso de tudo certo, o resultado será true
46
48
 
47
49
  ```ruby
48
50
  SignatureDfe::SSL.test
@@ -53,6 +55,7 @@ Feito esta configuração vc já está pronto para assinar seus documentos.
53
55
  ## Assinatura digital NF-e NFC-e e NFA-e
54
56
 
55
57
  Observe que os 3 documentos possuem a mesma estrutura
58
+
56
59
  Para assinar sua nf-e existem duas formas
57
60
 
58
61
  A forma qual vc tem a xml da assinautra completo onde vc passa o seu xml contendo a tag <b>infNFe</b>
@@ -72,7 +75,7 @@ Onde a resposta será
72
75
  <SignedInfo>
73
76
  <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
74
77
  <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
75
- <Reference URI="#NFe#{ch_nfe}">
78
+ <Reference URI="#NFe...">
76
79
  <Transforms>
77
80
  <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
78
81
  <Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
@@ -90,7 +93,7 @@ Onde a resposta será
90
93
  </Signature>
91
94
  ```
92
95
 
93
- Ou você pode obter os valores do <b>DigestValue</b>, <b>SignatureValue</b> e <b>X509Certificate</b> manualmente, e assim montar da forma como desejar seu xml
96
+ E a forma qual onde você pode obter os valores do <b>DigestValue</b>, <b>SignatureValue</b> e <b>X509Certificate</b> manualmente, e assim montar da forma como desejar seu xml
94
97
 
95
98
  ```ruby
96
99
  inf_nfe = %{
@@ -103,6 +106,60 @@ signature_value = SignatureDfe::NFe.signature_value ch_nfe, digest_value
103
106
  x509certificate = SignatureDfe::SSL.cert
104
107
  ```
105
108
 
109
+ ## Assinatura digital Evento de NF-e NFC-e e NFA-e
110
+
111
+ Observe que os 3 documentos possuem a mesma estrutura
112
+
113
+ Para assinar sua nf-e existem duas formas
114
+
115
+ A forma qual vc tem a xml da assinautra completo onde vc passa o seu xml contendo a tag <b>infNFe</b>
116
+
117
+ ```ruby
118
+ inf_evento = %{
119
+ <infEvento Id="ID1101115515151515151515151515156546546546545646544701">
120
+ ...
121
+ </infEvento>}
122
+ SignatureDfe::NFe::Event.sign inf_evento
123
+ ```
124
+
125
+ Onde a resposta será
126
+
127
+ ```xml
128
+ <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
129
+ <SignedInfo>
130
+ <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
131
+ <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
132
+ <Reference URI="#ID1...">
133
+ <Transforms>
134
+ <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
135
+ <Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
136
+ </Transforms>
137
+ <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
138
+ <DigestValue>...</DigestValue>
139
+ </Reference>
140
+ </SignedInfo>
141
+ <SignatureValue>...</SignatureValue>
142
+ <KeyInfo>
143
+ <X509Data>
144
+ <X509Certificate>...</X509Certificate>
145
+ </X509Data>
146
+ </KeyInfo>
147
+ </Signature>
148
+ ```
149
+
150
+ E a forma qual onde você pode obter os valores do <b>DigestValue</b>, <b>SignatureValue</b> e <b>X509Certificate</b> manualmente, e assim montar da forma como desejar seu xml
151
+
152
+ ```ruby
153
+ inf_evento = %{
154
+ <infEvento Id="ID1101115515151515151515151515156546546546545646544701">
155
+ ...
156
+ </infEvento>}
157
+ event_id = "ID1101115515151515151515151515156546546546545646544701"
158
+ digest_value = SignatureDfe::NFe::Event.digest_value inf_evento
159
+ signature_value = SignatureDfe::NFe::Event.signature_value event_id, digest_value
160
+ x509certificate = SignatureDfe::SSL.cert
161
+ ```
162
+
106
163
  ## License
107
164
 
108
165
  The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/lib/signature_dfe.rb CHANGED
@@ -16,4 +16,5 @@ module SignatureDfe
16
16
  end
17
17
 
18
18
  require "signature_dfe/ssl"
19
- require "signature_dfe/nfe"
19
+ require "signature_dfe/nfe"
20
+ require "signature_dfe/evento_nfe"
@@ -0,0 +1,72 @@
1
+ require 'base64'
2
+ require 'nokogiri'
3
+
4
+ module SignatureDfe
5
+ class NFe
6
+ class Event
7
+
8
+ def self.digest_value something
9
+ inf_event = something.scan(/\<infevento[\s\S]*?\<\/infevento\>/i)[0].gsub(/>\s+</,"><")
10
+ inf_event_canonized = canonize_inf_event inf_event
11
+ Base64.encode64(OpenSSL::Digest::SHA1.digest(inf_event_canonized)).strip
12
+ end
13
+
14
+ def self.signature_value event_id, digest_value
15
+ signed_info = %{
16
+ <SignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
17
+ <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
18
+ <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
19
+ <Reference URI="#ID#{event_id}">
20
+ <Transforms>
21
+ <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
22
+ <Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
23
+ </Transforms>
24
+ <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
25
+ <DigestValue>#{digest_value}</DigestValue>
26
+ </Reference>
27
+ </SignedInfo>
28
+ }
29
+ signed_info_canonized = SignatureDfe.canonize signed_info
30
+ Base64.encode64(SignatureDfe::SSL.sign signed_info_canonized).strip
31
+ end
32
+
33
+ def self.sign something
34
+ digest_value_ = digest_value something
35
+
36
+ event_id = something.scan(/\<infEvento[\s\S]*?\>/i)[0].scan(/\d/).join("")
37
+
38
+ signature_value_ = signature_value event_id, digest_value_
39
+
40
+ %{
41
+ <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
42
+ <SignedInfo>
43
+ <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
44
+ <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
45
+ <Reference URI="#ID#{event_id}">
46
+ <Transforms>
47
+ <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
48
+ <Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
49
+ </Transforms>
50
+ <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
51
+ <DigestValue>#{digest_value_}</DigestValue>
52
+ </Reference>
53
+ </SignedInfo>
54
+ <SignatureValue>#{signature_value_}</SignatureValue>
55
+ <KeyInfo>
56
+ <X509Data>
57
+ <X509Certificate>#{SignatureDfe::SSL.cert.to_s.gsub(/\-\-\-\-\-[A-Z]+ CERTIFICATE\-\-\-\-\-/, "").strip}</X509Certificate>
58
+ </X509Data>
59
+ </KeyInfo>
60
+ </Signature>
61
+ }.gsub(/\>\s{1,}\</,"><").strip
62
+ end
63
+
64
+ def self.canonize_inf_event inf_nfe
65
+ tag_inf_nfe = inf_nfe.scan(/\<infevento[\s\S]*?\>/i)[0]
66
+ SignatureDfe.canonize(tag_inf_nfe.include?(%{xmlns="http://www.portalfiscal.inf.br/nfe"}) ? tag_inf_nfe : inf_nfe.gsub(%{<infEvento},%{<infEvento xmlns="http://www.portalfiscal.inf.br/nfe"}))
67
+ end
68
+
69
+ private_class_method :canonize_inf_event
70
+ end
71
+ end
72
+ end
@@ -38,11 +38,7 @@ module SignatureDfe
38
38
 
39
39
  def self.cert
40
40
  self.test unless defined?(@@pk)
41
- if @@pk.is_a? OpenSSL::PKCS12
42
- @@pk.certificate
43
- else
44
- @@cert.to_s.gsub(/\-\-\-\-\-[A-Z]+ CERTIFICATE\-\-\-\-\-/, "").strip
45
- end
41
+ @@cert.to_s.gsub(/\-\-\-\-\-[A-Z]+ CERTIFICATE\-\-\-\-\-/, "").strip
46
42
  end
47
43
 
48
44
  def self.test
@@ -50,7 +46,9 @@ module SignatureDfe
50
46
  if config.pkcs12
51
47
  if File.exist? config.pkcs12
52
48
  begin
53
- @@pk = OpenSSL::PKCS12.new File.read(config.pkcs12), config.instance_variable_get(:@password)
49
+ aux = OpenSSL::PKCS12.new(File.read(config.pkcs12), config.instance_variable_get(:@password))
50
+ @@pk = aux.key
51
+ @@cert = aux.certificate
54
52
  rescue OpenSSL::PKCS12::PKCS12Error => e
55
53
  raise SignatureDfe::Error.new "Wrong password for '#{config.pkcs12}'"
56
54
  end
@@ -1,3 +1,3 @@
1
1
  module SignatureDfe
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: signature_dfe
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thiago Feitosa
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-01-06 00:00:00.000000000 Z
11
+ date: 2019-01-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -93,7 +93,6 @@ files:
93
93
  - CHANGELOG
94
94
  - CODE_OF_CONDUCT.md
95
95
  - Gemfile
96
- - Gemfile.lock
97
96
  - LICENSE.txt
98
97
  - README.md
99
98
  - Rakefile
@@ -104,6 +103,7 @@ files:
104
103
  - certs/gen.sh
105
104
  - certs/key.pem
106
105
  - lib/signature_dfe.rb
106
+ - lib/signature_dfe/evento_nfe.rb
107
107
  - lib/signature_dfe/nfe.rb
108
108
  - lib/signature_dfe/ssl.rb
109
109
  - lib/signature_dfe/version.rb
data/Gemfile.lock DELETED
@@ -1,43 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- signature_dfe (0.1.0)
5
-
6
- GEM
7
- remote: https://rubygems.org/
8
- specs:
9
- diff-lcs (1.3)
10
- ipaddr (1.2.2)
11
- mini_portile2 (2.4.0)
12
- nokogiri (1.9.1)
13
- mini_portile2 (~> 2.4.0)
14
- openssl (2.1.2)
15
- ipaddr
16
- rake (10.5.0)
17
- rspec (3.8.0)
18
- rspec-core (~> 3.8.0)
19
- rspec-expectations (~> 3.8.0)
20
- rspec-mocks (~> 3.8.0)
21
- rspec-core (3.8.0)
22
- rspec-support (~> 3.8.0)
23
- rspec-expectations (3.8.2)
24
- diff-lcs (>= 1.2.0, < 2.0)
25
- rspec-support (~> 3.8.0)
26
- rspec-mocks (3.8.0)
27
- diff-lcs (>= 1.2.0, < 2.0)
28
- rspec-support (~> 3.8.0)
29
- rspec-support (3.8.0)
30
-
31
- PLATFORMS
32
- ruby
33
-
34
- DEPENDENCIES
35
- bundler (~> 1.17)
36
- nokogiri (~> 1.9.1)
37
- openssl (~> 2.1.2)
38
- rake (~> 10.0)
39
- rspec (~> 3.0)
40
- signature_dfe!
41
-
42
- BUNDLED WITH
43
- 1.17.2