rnp 1.0.2 → 1.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3ef8ee2f2315bedb5e82708df1ac8773af28ca3e5ac27101fc5c8e77e2f8ffc5
4
- data.tar.gz: '0893d5dec0c0e0c29729422d3cc5980998ef3960be5be6627e357e6bff549401'
3
+ metadata.gz: 3334282a18758db4c39bec6a7b3e3096fe4dadf85d3a8382ec780bd2a816371e
4
+ data.tar.gz: 0a1b13c36fdc0c5479e2a4531355291867481e7d1ec40bf1ec251eeb49a27cef
5
5
  SHA512:
6
- metadata.gz: 64974dec05daf601cbfbe8909b8dad87d5b5b9eb209b42d7070a98b5964c8d3e1f0fcd70a79aaae84a2db897254a2a069487d05e4011d4e178477eac0c2e6bf9
7
- data.tar.gz: 5d037d98989aaaa28b03587d1e7fe0cba204186570442810cb78a0e4332f4872920230e9cca1902f2ba88ec727c3ee91589e24d7c74e4695f310d6ff4dc7a5cf
6
+ metadata.gz: e41f0d9936b9b39c0646d80c6ef385aa658afe247a035a72b7005ec706fafcdfb1ffd9cf3c0f9cdad616ec12e97c0a4417460f693e71c5f56ac9942321ef5d6b
7
+ data.tar.gz: c19e9f0d2775572ac817da0f1754c057ee9281f6bb209404c1a91505532fac0a1474786dd29e73a4c9454afa8bb534b61dab80b0645127f42d7b22e23fa65594
data/CHANGELOG.adoc CHANGED
@@ -1,5 +1,10 @@
1
1
  == Changelog
2
2
 
3
+ === 1.0.3 [08-21-2018]
4
+ * Added support for key exporting.
5
+ * Added support for enarmoring/dearmoring arbitrary data.
6
+ * Added support to retreive the rnp version.
7
+
3
8
  === 1.0.2 [08-14-2018]
4
9
  * Support for newer rnp library naming (librnp-0).
5
10
 
data/lib/rnp/error.rb CHANGED
@@ -18,6 +18,12 @@ class Rnp
18
18
  end
19
19
  end
20
20
 
21
+ class FeatureNotAvailableError < Error
22
+ def initialize(feature)
23
+ super("#{feature} is not available in your version of rnp.")
24
+ end
25
+ end
26
+
21
27
  class BadPasswordError < Error; end
22
28
  class InvalidSignatureError < Error; end
23
29
  class BadFormatError < Error; end
@@ -4,6 +4,8 @@
4
4
 
5
5
  require 'ffi'
6
6
 
7
+ require 'rnp/error'
8
+
7
9
  # @api private
8
10
  module LibRnp
9
11
  extend FFI::Library
@@ -287,6 +289,41 @@ module LibRnp
287
289
  %i[pointer],
288
290
  :uint32
289
291
 
292
+ # some newer APIs that may not be present
293
+ {
294
+ # key export
295
+ rnp_key_export: [%i[pointer pointer uint32], :uint32],
296
+ # enarmor/dearmor
297
+ rnp_enarmor: [%i[pointer pointer pointer], :uint32],
298
+ rnp_dearmor: [%i[pointer pointer], :uint32],
299
+ # versioning
300
+ rnp_version_string: [%i[], :string],
301
+ rnp_version_string_full: [%i[], :string],
302
+ rnp_version: [%i[], :uint32],
303
+ rnp_version_for: [%i[uint32 uint32 uint32], :uint32],
304
+ rnp_version_major: [%i[uint32], :uint32],
305
+ rnp_version_minor: [%i[uint32], :uint32],
306
+ rnp_version_patch: [%i[uint32], :uint32]
307
+ }.each do |name, signature|
308
+ present = ffi_libraries[0].find_function(name.to_s)
309
+ if !present
310
+ class_eval do
311
+ define_singleton_method(name) do |*|
312
+ raise Rnp::FeatureNotAvailableError, name
313
+ end
314
+ end
315
+ else
316
+ attach_function name, signature[0], signature[1]
317
+ end
318
+ class_eval do
319
+ const_set("HAVE_#{name.upcase}", present)
320
+ end
321
+ end
322
+
323
+ RNP_KEY_EXPORT_ARMORED = (1 << 0)
324
+ RNP_KEY_EXPORT_PUBLIC = (1 << 1)
325
+ RNP_KEY_EXPORT_SECRET = (1 << 2)
326
+ RNP_KEY_EXPORT_SUBKEYS = (1 << 3)
290
327
 
291
328
  RNP_LOAD_SAVE_PUBLIC_KEYS = (1 << 0)
292
329
  RNP_LOAD_SAVE_SECRET_KEYS = (1 << 1)
data/lib/rnp/key.rb CHANGED
@@ -182,6 +182,48 @@ class Rnp
182
182
  bool_property(:rnp_key_have_secret)
183
183
  end
184
184
 
185
+ # Export a public key.
186
+ #
187
+ # By default, when exporting a primary key, only the primary key
188
+ # will be exported. When exporting a subkey, the primary key and
189
+ # subkey will both be exported.
190
+ #
191
+ # @param output [Output] the output to write the exported key.
192
+ # If nil, the result will be returned directly as a String.
193
+ # @param armored (see Sign#armored=)
194
+ # @param with_subkeys [Boolean] when exporting a primary key,
195
+ # this controls whether all subkeys should also be exported.
196
+ # When true, the primary key and all subkeys will be exported.
197
+ # When false, only the primary key will be exported.
198
+ # This parameter is not valid when the key is a subkey.
199
+ # @return [nil, String]
200
+ def export_public(armored: true, with_subkeys: false, output: nil)
201
+ Output.default(output) do |output_|
202
+ export(public_key: true, with_subkeys: with_subkeys, armored: armored, output: output_)
203
+ end
204
+ end
205
+
206
+ # Export a secret key.
207
+ #
208
+ # By default, when exporting a primary key, only the primary key
209
+ # will be exported. When exporting a subkey, the primary key and
210
+ # subkey will both be exported.
211
+ #
212
+ # @param output [Output] the output to write the exported key.
213
+ # If nil, the result will be returned directly as a String.
214
+ # @param armored (see Sign#armored=)
215
+ # @param with_subkeys [Boolean] when exporting a primary key,
216
+ # this controls whether all subkeys should also be exported.
217
+ # When true, the primary key and all subkeys will be exported.
218
+ # When false, only the primary key will be exported.
219
+ # This parameter is not valid when the key is a subkey.
220
+ # @return [nil, String]
221
+ def export_secret(armored: true, with_subkeys: false, output: nil)
222
+ Output.default(output) do |output_|
223
+ export(secret_key: true, with_subkeys: with_subkeys, armored: armored, output: output_)
224
+ end
225
+ end
226
+
185
227
  # Returns the raw public key data as PGP packets.
186
228
  #
187
229
  # @return [String]
@@ -270,6 +312,15 @@ class Rnp
270
312
  end
271
313
  end
272
314
  end
315
+
316
+ def export(public_key: false, secret_key: false, with_subkeys: false, armored: true, output: nil)
317
+ flags = 0
318
+ flags |= LibRnp::RNP_KEY_EXPORT_ARMORED if armored
319
+ flags |= LibRnp::RNP_KEY_EXPORT_PUBLIC if public_key
320
+ flags |= LibRnp::RNP_KEY_EXPORT_SECRET if secret_key
321
+ flags |= LibRnp::RNP_KEY_EXPORT_SUBKEYS if with_subkeys
322
+ Rnp.call_ffi(:rnp_key_export, @ptr, output.ptr, flags)
323
+ end
273
324
  end # class
274
325
  end # class
275
326
 
data/lib/rnp/misc.rb CHANGED
@@ -67,5 +67,82 @@ class Rnp
67
67
  LibRnp.rnp_buffer_destroy(pformat)
68
68
  end
69
69
  end
70
+
71
+ # Add ASCII Armor to data.
72
+ #
73
+ # @param input [Input] the input to read data from
74
+ # @param output [Output] the output to write the armored
75
+ # data to. If nil, the result will be returned directly
76
+ # as a String.
77
+ # @return [nil, String]
78
+ def self.enarmor(input:, output: nil, type: nil)
79
+ Output.default(output) do |output_|
80
+ Rnp.call_ffi(:rnp_enarmor, input.ptr, output_.ptr, type)
81
+ end
82
+ end
83
+
84
+ # Remove ASCII Armor from data.
85
+ #
86
+ # @param input [Input] the input to read the ASCII-Armored data from
87
+ # @param output [Output] the output to write the dearmored data to. If
88
+ # nil, the result will be returned directly as a String.
89
+ # @return [nil, String]
90
+ def self.dearmor(input:, output: nil)
91
+ Output.default(output) do |output_|
92
+ Rnp.call_ffi(:rnp_dearmor, input.ptr, output_.ptr)
93
+ end
94
+ end
95
+
96
+ # Get the version of the rnp library as a string.
97
+ #
98
+ # @return [String]
99
+ def self.version_string
100
+ LibRnp.rnp_version_string
101
+ end
102
+
103
+ # Get the detailed version of the rnp library as a string.
104
+ #
105
+ # @return [String]
106
+ def self.version_string_full
107
+ LibRnp.rnp_version_string_full
108
+ end
109
+
110
+ # Get the version stamp of the rnp library as an unsigned
111
+ # 32-bit integer. This number can be compared against other
112
+ # stamps generated with {version_for}.
113
+ #
114
+ # @return [Integer]
115
+ def self.version
116
+ LibRnp.rnp_version
117
+ end
118
+
119
+ # Encode the given major, minor, and patch numbers into a version
120
+ # stamp.
121
+ #
122
+ # @return [Integer]
123
+ def self.version_for(major, minor, patch)
124
+ LibRnp.rnp_version_for(major, minor, patch)
125
+ end
126
+
127
+ # Extract the major version component from the given version stamp.
128
+ #
129
+ # @return [Integer]
130
+ def self.version_major(version)
131
+ LibRnp.rnp_version_major(version)
132
+ end
133
+
134
+ # Extract the minor version component from the given version stamp.
135
+ #
136
+ # @return [Integer]
137
+ def self.version_minor(version)
138
+ LibRnp.rnp_version_minor(version)
139
+ end
140
+
141
+ # Extract the patch version component from the given version stamp.
142
+ #
143
+ # @return [Integer]
144
+ def self.version_patch(version)
145
+ LibRnp.rnp_version_patch(version)
146
+ end
70
147
  end # class
71
148
 
data/lib/rnp/output.rb CHANGED
@@ -116,6 +116,14 @@ class Rnp
116
116
  Rnp.call_ffi(:rnp_output_to_callback, pptr, writercb, nil, nil)
117
117
  Output.new(pptr.read_pointer, writercb)
118
118
  end
119
+
120
+ # @api private
121
+ def self.default(output)
122
+ to_str = output.nil?
123
+ output = Output.to_string if to_str
124
+ yield output
125
+ output.string if to_str
126
+ end
119
127
  end # class
120
128
  end # class
121
129
 
data/lib/rnp/rnp.rb CHANGED
@@ -252,7 +252,7 @@ class Rnp
252
252
  creation_time: nil,
253
253
  expiration_time: nil,
254
254
  hash: nil)
255
- default_output(output) do |output_|
255
+ Output.default(output) do |output_|
256
256
  sign = start_sign(input: input, output: output_)
257
257
  sign.options = {
258
258
  armored: armored,
@@ -280,7 +280,7 @@ class Rnp
280
280
  creation_time: nil,
281
281
  expiration_time: nil,
282
282
  hash: nil)
283
- default_output(output) do |output_|
283
+ Output.default(output) do |output_|
284
284
  sign = start_cleartext_sign(input: input, output: output_)
285
285
  sign.options = {
286
286
  compression: compression,
@@ -309,7 +309,7 @@ class Rnp
309
309
  creation_time: nil,
310
310
  expiration_time: nil,
311
311
  hash: nil)
312
- default_output(output) do |output_|
312
+ Output.default(output) do |output_|
313
313
  sign = start_detached_sign(input: input, output: output_)
314
314
  sign.options = {
315
315
  armored: armored,
@@ -353,7 +353,7 @@ class Rnp
353
353
  armored: nil,
354
354
  compression: nil,
355
355
  cipher: nil)
356
- default_output(output) do |output_|
356
+ Output.default(output) do |output_|
357
357
  enc = start_encrypt(input: input, output: output_)
358
358
  enc.options = {
359
359
  armored: armored,
@@ -383,7 +383,7 @@ class Rnp
383
383
  hash: nil,
384
384
  creation_time: nil,
385
385
  expiration_time: nil)
386
- default_output(output) do |output_|
386
+ Output.default(output) do |output_|
387
387
  enc = start_encrypt(input: input, output: output_)
388
388
  enc.options = {
389
389
  armored: armored,
@@ -417,7 +417,7 @@ class Rnp
417
417
  s2k_hash: nil,
418
418
  s2k_iterations: 0,
419
419
  s2k_cipher: nil)
420
- default_output(output) do |output_|
420
+ Output.default(output) do |output_|
421
421
  enc = start_encrypt(input: input, output: output_)
422
422
  enc.options = {
423
423
  armored: armored,
@@ -442,7 +442,7 @@ class Rnp
442
442
  # If nil, the result will be returned directly as a String.
443
443
  # @return [nil, String]
444
444
  def decrypt(input:, output: nil)
445
- default_output(output) do |output_|
445
+ Output.default(output) do |output_|
446
446
  Rnp.call_ffi(:rnp_decrypt, @ptr, input.ptr, output_.ptr)
447
447
  end
448
448
  end
@@ -584,12 +584,5 @@ class Rnp
584
584
  flags |= LibRnp::RNP_LOAD_SAVE_SECRET_KEYS if secret_keys
585
585
  flags
586
586
  end
587
-
588
- def default_output(output)
589
- to_str = output.nil?
590
- output = Output.to_string if to_str
591
- yield output
592
- output.string if to_str
593
- end
594
587
  end # class
595
588
 
data/lib/rnp/version.rb CHANGED
@@ -3,6 +3,6 @@
3
3
  # (c) 2018 Ribose Inc.
4
4
 
5
5
  class Rnp
6
- VERSION = '1.0.2'
6
+ VERSION = '1.0.3'
7
7
  end # class
8
8
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rnp
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-08-14 00:00:00.000000000 Z
11
+ date: 2018-08-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: asciidoctor