pki_express 1.0.0

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.
Files changed (55) hide show
  1. checksums.yaml +7 -0
  2. data/.gitattributes +3 -0
  3. data/.gitignore +28 -0
  4. data/CHANGELOG.md +2 -0
  5. data/Gemfile +4 -0
  6. data/README.md +24 -0
  7. data/Rakefile +1 -0
  8. data/lib/pki_express.rb +48 -0
  9. data/lib/pki_express/auth_complete_result.rb +22 -0
  10. data/lib/pki_express/auth_start_result.rb +77 -0
  11. data/lib/pki_express/authentication.rb +285 -0
  12. data/lib/pki_express/base_signer.rb +55 -0
  13. data/lib/pki_express/cades_signature_starter.rb +242 -0
  14. data/lib/pki_express/command_error.rb +14 -0
  15. data/lib/pki_express/commands.rb +21 -0
  16. data/lib/pki_express/enum.rb +9 -0
  17. data/lib/pki_express/error_codes.rb +46 -0
  18. data/lib/pki_express/installation_not_found_error.rb +8 -0
  19. data/lib/pki_express/name.rb +48 -0
  20. data/lib/pki_express/pades_horizontal_align.rb +9 -0
  21. data/lib/pki_express/pades_measurement_units.rb +8 -0
  22. data/lib/pki_express/pades_page_optimization.rb +51 -0
  23. data/lib/pki_express/pades_page_orientation.rb +9 -0
  24. data/lib/pki_express/pades_paper_size.rb +21 -0
  25. data/lib/pki_express/pades_signature_starter.rb +232 -0
  26. data/lib/pki_express/pades_size.rb +17 -0
  27. data/lib/pki_express/pades_text_horizontal_align.rb +8 -0
  28. data/lib/pki_express/pades_vertical_align.rb +9 -0
  29. data/lib/pki_express/pades_visual_auto_positioning.rb +22 -0
  30. data/lib/pki_express/pades_visual_image.rb +52 -0
  31. data/lib/pki_express/pades_visual_manual_positioning.rb +17 -0
  32. data/lib/pki_express/pades_visual_positioning.rb +28 -0
  33. data/lib/pki_express/pades_visual_rectangle.rb +74 -0
  34. data/lib/pki_express/pades_visual_representation.rb +22 -0
  35. data/lib/pki_express/pades_visual_text.rb +35 -0
  36. data/lib/pki_express/pk_certificate.rb +62 -0
  37. data/lib/pki_express/pki_brazil_certificate_fields.rb +58 -0
  38. data/lib/pki_express/pki_brazil_certificate_types.rb +19 -0
  39. data/lib/pki_express/pki_express_config.rb +26 -0
  40. data/lib/pki_express/pki_express_operator.rb +216 -0
  41. data/lib/pki_express/pki_italy_certificate_fields.rb +16 -0
  42. data/lib/pki_express/pki_italy_certificate_types.rb +11 -0
  43. data/lib/pki_express/signature_finisher.rb +298 -0
  44. data/lib/pki_express/signature_start_result.rb +13 -0
  45. data/lib/pki_express/signature_starter.rb +115 -0
  46. data/lib/pki_express/signer.rb +106 -0
  47. data/lib/pki_express/standard_signature_policies.rb +36 -0
  48. data/lib/pki_express/timestamp_authority.rb +51 -0
  49. data/lib/pki_express/validation_error.rb +8 -0
  50. data/lib/pki_express/validation_item.rb +43 -0
  51. data/lib/pki_express/validation_results.rb +121 -0
  52. data/lib/pki_express/version.rb +3 -0
  53. data/lib/pki_express/version_manager.rb +21 -0
  54. data/pki_express.gemspec +27 -0
  55. metadata +129 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: c36d5bb060458f62faed18815d8172334787019d8cfebdc82f0438f7d1919658
4
+ data.tar.gz: eb56ce02b6e87563ac1f50344d98967c50cbe45a00adf80388ddb626d994b2fe
5
+ SHA512:
6
+ metadata.gz: 74b1f525ba74647e809a92335bdb9864bcecd09a361c7ab570c4526686c43da6f06cc4ae38ced1018a5d1b6db5e5f4895692643056e74f8187f0c4e08039f8bf
7
+ data.tar.gz: ac293189b668b04e46efda5726f8fd19fbf2367acf62a718336f7fd7d609ae97b62b129c26e7be10eec641e7a63f690fb90ef366df292fa75aa9d7f0e081cfce
@@ -0,0 +1,3 @@
1
+
2
+ # Enable automatic line ending normalization
3
+ * text=auto
@@ -0,0 +1,28 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
15
+ *.gem
16
+ *.rbc
17
+ .DS_Store
18
+ .bundle
19
+ .rvmrc
20
+ .ruby-version
21
+ .yardoc
22
+ .rake_tasks~
23
+ Gemfile.lock
24
+ coverage/*
25
+ doc/*
26
+ log/*
27
+ pkg/*
28
+ .idea/*
@@ -0,0 +1,2 @@
1
+ ## 1.0.0 (2018-04-11)
2
+ * First publicly available version
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify the gem's dependencies in pki_express.gemspec
4
+ gemspec
@@ -0,0 +1,24 @@
1
+ PKI Express for Ruby
2
+ ============================
3
+ [![Gem Version](https://badge.fury.io/rb/rest_pki.svg)](https://badge.fury.io/rb/rest_pki)
4
+
5
+ This library contains classes that encapsulate the calls to PKI Express.
6
+
7
+ The recommended way to install **PKI Expresss lib** is through setting in your Gemfile:
8
+
9
+ ````ruby
10
+ gem 'pki_express', '~> 1.0.0'
11
+ ````
12
+
13
+ And with installing via [Bundler](http://bundler.io/) on your project root folder:
14
+
15
+ bundle install
16
+
17
+ Alternatively, You can install this gem globally by executing the following command:
18
+
19
+ gem install pki_express
20
+
21
+ Samples
22
+ -------
23
+ Please visit the [PKI Suite samples repository](https://github.com/LacunaSoftware/PkiSuiteSamples/tree/master/Ruby)
24
+ for examples on how to use this library.
@@ -0,0 +1 @@
1
+ require 'bundler/gem_tasks'
@@ -0,0 +1,48 @@
1
+ require_relative 'pki_express/pki_express_config'
2
+ require_relative 'pki_express/pki_express_operator'
3
+ require_relative 'pki_express/enum'
4
+ require_relative 'pki_express/base_signer'
5
+ require_relative 'pki_express/signature_starter'
6
+ require_relative 'pki_express/signer'
7
+ require_relative 'pki_express/auth_complete_result'
8
+ require_relative 'pki_express/auth_start_result'
9
+ require_relative 'pki_express/authentication'
10
+ require_relative 'pki_express/cades_signature_starter'
11
+ require_relative 'pki_express/command_error'
12
+ require_relative 'pki_express/commands'
13
+ require_relative 'pki_express/error_codes'
14
+ require_relative 'pki_express/installation_not_found_error'
15
+ require_relative 'pki_express/name'
16
+ require_relative 'pki_express/pades_horizontal_align'
17
+ require_relative 'pki_express/pades_measurement_units'
18
+ require_relative 'pki_express/pades_page_optimization'
19
+ require_relative 'pki_express/pades_page_optimization'
20
+ require_relative 'pki_express/pades_paper_size'
21
+ require_relative 'pki_express/pades_signature_starter'
22
+ require_relative 'pki_express/pades_size'
23
+ require_relative 'pki_express/pades_text_horizontal_align'
24
+ require_relative 'pki_express/pades_vertical_align'
25
+ require_relative 'pki_express/pades_visual_positioning'
26
+ require_relative 'pki_express/pades_visual_auto_positioning'
27
+ require_relative 'pki_express/pades_visual_image'
28
+ require_relative 'pki_express/pades_visual_manual_positioning'
29
+ require_relative 'pki_express/pades_visual_rectangle'
30
+ require_relative 'pki_express/pades_visual_representation'
31
+ require_relative 'pki_express/pades_visual_text'
32
+ require_relative 'pki_express/pk_certificate'
33
+ require_relative 'pki_express/pki_brazil_certificate_fields'
34
+ require_relative 'pki_express/pki_brazil_certificate_types'
35
+ require_relative 'pki_express/pki_italy_certificate_fields'
36
+ require_relative 'pki_express/pki_italy_certificate_types'
37
+ require_relative 'pki_express/signature_finisher'
38
+ require_relative 'pki_express/signature_start_result'
39
+ require_relative 'pki_express/standard_signature_policies'
40
+ require_relative 'pki_express/timestamp_authority'
41
+ require_relative 'pki_express/validation_error'
42
+ require_relative 'pki_express/validation_item'
43
+ require_relative 'pki_express/validation_results'
44
+ require_relative 'pki_express/version'
45
+ require_relative 'pki_express/version_manager'
46
+
47
+ module PkiExpress
48
+ end
@@ -0,0 +1,22 @@
1
+ module PkiExpress
2
+ class AuthCompleteResult
3
+
4
+ attr_accessor :certificate, :validation_results
5
+
6
+ def initialize(model)
7
+ @certificate = nil
8
+ @validation_results = nil
9
+
10
+ if model
11
+ certificate = model.fetch(:certificate)
12
+ if certificate
13
+ @certificate = PKCertificate.new(certificate)
14
+ end
15
+ validation_results = model.fetch(:validationResults)
16
+ if validation_results
17
+ @validation_results = ValidationResults.new(validation_results)
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,77 @@
1
+ module PkiExpress
2
+ class AuthStartResult
3
+ attr_accessor :digest_algorithm_name, :digest_algorithm_oid
4
+
5
+ def initialize(model)
6
+ @nonce_base64 = nil
7
+ @digest_algorithm_name = nil
8
+ @digest_algorithm_oid = nil
9
+
10
+ if model
11
+ @nonce_base64 = model.fetch(:toSignData)
12
+ @digest_algorithm_name = model.fetch(:digestAlgorithmName)
13
+ @digest_algorithm_oid = model.fetch(:digestAlgorithmOid)
14
+ end
15
+ end
16
+
17
+ # region The "nonce" accessors
18
+
19
+ def nonce
20
+ _get_nonce
21
+ end
22
+
23
+ def _get_nonce
24
+ unless @nonce_base64
25
+ return nil
26
+ end
27
+
28
+ Base64.decode64(@nonce_base64)
29
+ end
30
+ private :_get_nonce
31
+
32
+ def nonce=(nonce)
33
+ _set_nonce(nonce)
34
+ end
35
+
36
+ def _set_nonce(nonce)
37
+ unless nonce
38
+ raise 'The provided "nonce" is not valid'
39
+ end
40
+
41
+ begin
42
+ b64 = Base64.encode64(nonce)
43
+ rescue Error
44
+ raise 'The provided "nonce" is not valid.'
45
+ end
46
+
47
+ @nonce_base64 = b64
48
+ end
49
+ private :_set_nonce
50
+
51
+ def nonce_base64
52
+ _get_nonce_base64
53
+ end
54
+
55
+ def _get_nonce_base64
56
+ @nonce_base64
57
+ end
58
+ private :_get_nonce_base64
59
+
60
+ def nonce_base64=(nonce_base64)
61
+ unless nonce_base64
62
+ raise 'The provided "nonce_base64" is not valid'
63
+ end
64
+
65
+ begin
66
+ Base64.decode64(nonce_base64)
67
+ rescue Error
68
+ raise 'The provided "nonce_base64" is not Base64-encoded.'
69
+ end
70
+
71
+ @nonce_base64 = nonce_base64
72
+ end
73
+
74
+ #endregion
75
+
76
+ end
77
+ end
@@ -0,0 +1,285 @@
1
+ module PkiExpress
2
+ class Authentication < PkiExpressOperator
3
+
4
+ attr_accessor :use_external_storage
5
+
6
+ def initialize(config=PkiExpressConfig.new)
7
+ super(config)
8
+ @nonce_base64 = nil
9
+ @certificate_path = nil
10
+ @signature_base64 = nil
11
+ @use_external_storage = false
12
+ end
13
+
14
+ # region The "nonce" accessors
15
+
16
+ def nonce
17
+ _get_nonce
18
+ end
19
+
20
+ def _get_nonce
21
+ unless @nonce_base64
22
+ return nil
23
+ end
24
+
25
+ Base64.decode64(@nonce_base64)
26
+ end
27
+ private :_get_nonce
28
+
29
+ def nonce=(nonce)
30
+ _set_nonce(nonce)
31
+ end
32
+
33
+ def _set_nonce(nonce)
34
+ unless nonce
35
+ raise 'The provided "nonce" is not valid'
36
+ end
37
+
38
+ begin
39
+ b64 = Base64.encode64(nonce)
40
+ rescue Error
41
+ raise 'The provided "nonce" is not valid'
42
+ end
43
+
44
+ @nonce_base64 = b64
45
+ end
46
+ private :_set_nonce
47
+
48
+ def nonce_base64
49
+ _get_nonce_base64
50
+ end
51
+
52
+ def _get_nonce_base64
53
+ @nonce_base64
54
+ end
55
+ private :_get_nonce_base64
56
+
57
+ def nonce_base64=(nonce_base64)
58
+ unless nonce_base64
59
+ raise 'The provided "nonce_base64" is not valid'
60
+ end
61
+
62
+ begin
63
+ Base64.decode64(nonce_base64)
64
+ rescue Error
65
+ raise 'The provided "nonce_base64" is not Base64-encoded'
66
+ end
67
+
68
+ @nonce_base64 = nonce_base64
69
+ end
70
+
71
+ #endregion
72
+
73
+ # region The "certificate" accessors
74
+
75
+ def certificate
76
+ _get_certificate
77
+ end
78
+
79
+ def _get_certificate
80
+ unless @certificate_path
81
+ return nil
82
+ end
83
+
84
+ File.read(@certificate_path)
85
+ end
86
+ private :_get_certificate
87
+
88
+ def certificate=(content_raw)
89
+ _set_certificate(content_raw)
90
+ end
91
+
92
+ def _set_certificate(content_raw)
93
+ unless content_raw
94
+ raise 'The provided "certificate" is not valid'
95
+ end
96
+
97
+ temp_file_path = self.create_temp_file
98
+ File.open(temp_file_path, 'wb') do |f|
99
+ f.write(content_raw)
100
+ end
101
+ @certificate_path = temp_file_path
102
+ end
103
+ private :_set_certificate
104
+
105
+ def certificate_base64
106
+ _get_certificate_base64
107
+ end
108
+
109
+ def _get_certificate_base64
110
+ unless @certificate_path
111
+ return nil
112
+ end
113
+
114
+ content = File.read(@certificate_path)
115
+ Base64.encode64(content)
116
+ end
117
+ private :_get_certificate_base64
118
+
119
+ def certificate_base64=(content_base64)
120
+ _set_certificate_base64(content_base64)
121
+ end
122
+
123
+ def _set_certificate_base64(content_base64)
124
+ unless content_base64
125
+ raise 'The provided "certificate_base64" is not valid'
126
+ end
127
+
128
+ begin
129
+ content_raw = Base64.decode64(content_base64)
130
+ rescue Error
131
+ raise 'The provided "certificate_base64" is not Base64-encoded'
132
+ end
133
+
134
+ _set_certificate(content_raw)
135
+ end
136
+ private :_set_certificate_base64
137
+
138
+ def certificate_path
139
+ _get_certificate_path
140
+ end
141
+
142
+ def _get_certificate_path
143
+ @certificate_path
144
+ end
145
+ private :_get_certificate_path
146
+
147
+ def certificate_path=(path)
148
+ _set_certificate_path(path)
149
+ end
150
+
151
+ def _set_certificate_path(path)
152
+ unless path
153
+ raise 'The provided "certificate_path" is not valid'
154
+ end
155
+ if File.exists?(path)
156
+ raise 'The provided "certificate_path" does not exist'
157
+ end
158
+
159
+ @certificate_path = path
160
+ end
161
+ private :_set_certificate_path
162
+
163
+ # endregion
164
+
165
+ # region The "signature" accessors
166
+
167
+ def signature
168
+ _get_signature
169
+ end
170
+
171
+ def _get_signature
172
+ unless @signature_base64
173
+ return nil
174
+ end
175
+
176
+ Base64.decode64(@signature_base64)
177
+ end
178
+ private :_get_signature
179
+
180
+ def signature=(signature)
181
+ _set_signature(signature)
182
+ end
183
+
184
+ def _set_signature(signature)
185
+ unless signature
186
+ raise 'The provided "signature" is not valid'
187
+ end
188
+ begin
189
+ b64 = Base64.encode64(signature)
190
+ rescue Error
191
+ raise 'The provided "signature" is not valid'
192
+ end
193
+
194
+ @signature_base64 = b64
195
+ end
196
+ private :_set_signature
197
+
198
+ def signature_base64
199
+ _get_signature_base64
200
+ end
201
+
202
+ def _get_signature_base64
203
+ @signature_base64
204
+ end
205
+ private :_get_signature_base64
206
+
207
+ def signature_base64=(signature_base64)
208
+ _set_signature_base64(signature_base64)
209
+ end
210
+
211
+ def _set_signature_base64(signature_base64)
212
+ unless signature_base64
213
+ raise 'The provided "signature_base64" is not valid'
214
+ end
215
+ begin
216
+ Base64.decode64(signature_base64)
217
+ rescue Error
218
+ raise 'The provided "signature_base64" is not Base64-encoded'
219
+ end
220
+
221
+ @signature_base64 = signature_base64
222
+ end
223
+ private :_set_signature_base64
224
+
225
+ # endregion
226
+
227
+ def start
228
+ args = []
229
+
230
+ # The option "use external storage" is used to ignore the PKI Express's
231
+ # nonce verification, to make a own nonce store and nonce verification.
232
+ if @use_external_storage
233
+ args.append('--nonce-store')
234
+ args.append(@config.transfer_data_folder)
235
+ end
236
+
237
+ # This operation can only be used on versions greater then 1.4 of PKI
238
+ # Express.
239
+ @version_manager.require_version('1.4')
240
+
241
+ # Invoke command.
242
+ result = invoke(Commands::START_AUTH, args)
243
+
244
+ # Parse output and return result.
245
+ model = parse_output(result)
246
+ AuthStartResult.new(model)
247
+ end
248
+
249
+ def complete
250
+ unless @nonce_base64
251
+ raise 'The nonce was not set.'
252
+ end
253
+ unless @certificate_path
254
+ raise 'The certificate file was not set.'
255
+ end
256
+ unless @signature_base64
257
+ raise 'The signature was not set.'
258
+ end
259
+
260
+ args = [
261
+ @nonce_base64,
262
+ @certificate_path,
263
+ @signature_base64
264
+ ]
265
+
266
+ # The option "use external storage" is used to ignore the PKI Express's
267
+ # nonce verification, to make a own nonce store and nonce verification.
268
+ unless @use_external_storage
269
+ args.append('--nonce-store')
270
+ args.append(@config.transfer_data_folder)
271
+ end
272
+
273
+ # This configuration can only be used on versions greater than 1.4 of PKI
274
+ # Express.
275
+ @version_manager.require_version('1.4')
276
+
277
+ # Invoke command.
278
+ result = invoke(Commands::COMPLETE_AUTH, args)
279
+
280
+ # Parse output and return result.
281
+ model = parse_output(result)
282
+ AuthCompleteResult.new(model)
283
+ end
284
+ end
285
+ end