gpgme 2.0.18 → 2.0.22
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 +4 -4
- data/ext/gpgme/extconf.rb +11 -10
- data/ext/gpgme/gpgme_n.c +457 -454
- data/lib/gpgme/crypto.rb +1 -1
- data/lib/gpgme/ctx.rb +3 -2
- data/lib/gpgme/data.rb +10 -2
- data/lib/gpgme/engine.rb +1 -1
- data/lib/gpgme/key.rb +13 -1
- data/lib/gpgme/version.rb +1 -1
- data/ports/archives/gpgme-1.18.0.tar.bz2 +0 -0
- data/ports/archives/libassuan-2.5.5.tar.bz2 +0 -0
- data/ports/archives/libgpg-error-1.46.tar.bz2 +0 -0
- data/test/crypto_test.rb +7 -16
- data/test/ctx_test.rb +25 -74
- data/test/files/testkey_pub_invalid.gpg +52 -0
- data/test/key_test.rb +20 -4
- data/test/pinentry +22 -0
- data/test/sub_key_test.rb +5 -2
- data/test/support/resources.rb +30 -0
- data/test/test_helper.rb +6 -0
- metadata +18 -20
- data/ports/archives/gpgme-1.12.0.tar.bz2 +0 -0
- data/ports/archives/gpgme-1.9.0.tar.bz2 +0 -0
- data/ports/archives/libassuan-2.4.3.tar.bz2 +0 -0
- data/ports/archives/libassuan-2.5.1.tar.bz2 +0 -0
- data/ports/archives/libgpg-error-1.27.tar.bz2 +0 -0
- data/ports/archives/libgpg-error-1.32.tar.bz2 +0 -0
data/lib/gpgme/crypto.rb
CHANGED
@@ -129,7 +129,7 @@ module GPGME
|
|
129
129
|
# * +:output+ if specified, it will write the output into it. It will
|
130
130
|
# me converted to a {GPGME::Data} object, so it can also be a file,
|
131
131
|
# for example.
|
132
|
-
# * If the file was encrypted with
|
132
|
+
# * If the file was encrypted with symmetric encryption, must provide
|
133
133
|
# a :password option.
|
134
134
|
# * Any other option accepted by {GPGME::Ctx.new}
|
135
135
|
#
|
data/lib/gpgme/ctx.rb
CHANGED
@@ -370,8 +370,8 @@ module GPGME
|
|
370
370
|
#
|
371
371
|
# If passed, the key will be exported to +keydata+, which must be
|
372
372
|
# a {GPGME::Data} object.
|
373
|
-
def export_keys(recipients, keydata = Data.new)
|
374
|
-
err = GPGME::gpgme_op_export(self, recipients,
|
373
|
+
def export_keys(recipients, keydata = Data.new, mode=0)
|
374
|
+
err = GPGME::gpgme_op_export(self, recipients, mode, keydata)
|
375
375
|
exc = GPGME::error_to_exception(err)
|
376
376
|
raise exc if exc
|
377
377
|
keydata
|
@@ -517,6 +517,7 @@ keylist_mode=#{KEYLIST_MODE_NAMES[keylist_mode]}>"
|
|
517
517
|
|
518
518
|
def self.pass_function(pass, uid_hint, passphrase_info, prev_was_bad, fd)
|
519
519
|
io = IO.for_fd(fd, 'w')
|
520
|
+
io.autoclose = false
|
520
521
|
io.puts pass
|
521
522
|
io.flush
|
522
523
|
end
|
data/lib/gpgme/data.rb
CHANGED
@@ -165,8 +165,16 @@ module GPGME
|
|
165
165
|
end
|
166
166
|
|
167
167
|
##
|
168
|
-
# Sets the encoding for this buffer. Accepts only values
|
169
|
-
#
|
168
|
+
# Sets the encoding for this buffer. Accepts only integer values 0 to 7:
|
169
|
+
#
|
170
|
+
# 0 = GPGME_DATA_ENCODING_NONE (Not specified)
|
171
|
+
# 1 = GPGME_DATA_ENCODING_BINARY
|
172
|
+
# 2 = GPGME_DATA_ENCODING_BASE64
|
173
|
+
# 3 = GPGME_DATA_ENCODING_ARMOR (Either PEM or OpenPGP Armor)
|
174
|
+
# 4 = GPGME_DATA_ENCODING_URL (LF delimited URL list)
|
175
|
+
# 5 = GPGME_DATA_ENCODING_URLESC (Ditto, but percent escaped)
|
176
|
+
# 6 = GPGME_DATA_ENCODING_URL0 (Nul delimited URL list)
|
177
|
+
# 7 = GPGME_DATA_ENCODING_MIME (Data is a MIME part)
|
170
178
|
#
|
171
179
|
# @raise [GPGME::Error::InvalidValue] if the value isn't accepted.
|
172
180
|
def encoding=(encoding)
|
data/lib/gpgme/engine.rb
CHANGED
@@ -52,7 +52,7 @@ module GPGME
|
|
52
52
|
# The directory name of the configuration directory.
|
53
53
|
#
|
54
54
|
# @example
|
55
|
-
# GPGME::Engine.
|
55
|
+
# GPGME::Engine.set_info(GPGME::PROTOCOL_OpenPGP, '/usr/local/bin/gpg', home_dir)
|
56
56
|
#
|
57
57
|
def set_info(proto, file_name, home_dir)
|
58
58
|
err = GPGME::gpgme_set_engine_info(proto, file_name, home_dir)
|
data/lib/gpgme/key.rb
CHANGED
@@ -81,6 +81,7 @@ module GPGME
|
|
81
81
|
# @param [Hash] options
|
82
82
|
# * +:output+ specify where to write the key to. It will be converted to
|
83
83
|
# a {GPGME::Data}, so it could be a file, for example.
|
84
|
+
# * +:minimal+ set to true to let the export mode be 'minimal'.
|
84
85
|
# * Any other option accepted by {GPGME::Ctx.new}
|
85
86
|
#
|
86
87
|
# @return [GPGME::Data] the exported key.
|
@@ -94,9 +95,14 @@ module GPGME
|
|
94
95
|
#
|
95
96
|
def export(pattern, options = {})
|
96
97
|
output = Data.new(options[:output])
|
98
|
+
if options.delete(:minimal) == true
|
99
|
+
export_mode = 4
|
100
|
+
else
|
101
|
+
export_mode = 0
|
102
|
+
end
|
97
103
|
|
98
104
|
GPGME::Ctx.new(options) do |ctx|
|
99
|
-
ctx.export_keys(pattern, output)
|
105
|
+
ctx.export_keys(pattern, output, export_mode)
|
100
106
|
end
|
101
107
|
|
102
108
|
output.seek(0)
|
@@ -122,6 +128,12 @@ module GPGME
|
|
122
128
|
ctx.import_result
|
123
129
|
end
|
124
130
|
end
|
131
|
+
|
132
|
+
# Checks if a key is valid
|
133
|
+
def valid?(key)
|
134
|
+
GPGME::Key.import(key).considered == 1
|
135
|
+
end
|
136
|
+
|
125
137
|
end
|
126
138
|
|
127
139
|
##
|
data/lib/gpgme/version.rb
CHANGED
Binary file
|
Binary file
|
Binary file
|
data/test/crypto_test.rb
CHANGED
@@ -128,10 +128,13 @@ describe GPGME::Crypto do
|
|
128
128
|
end
|
129
129
|
|
130
130
|
describe "symmetric encryption/decryption" do
|
131
|
+
before do
|
132
|
+
info = GPGME::Engine.info.first
|
133
|
+
skip if /\A2\.[01]|\A1\./ === info.version
|
134
|
+
end
|
135
|
+
|
131
136
|
it "requires a password to encrypt" do
|
132
|
-
|
133
|
-
GPGME::Crypto.new.encrypt TEXT[:plain], :symmetric => true
|
134
|
-
end
|
137
|
+
GPGME::Crypto.new.encrypt TEXT[:plain], :symmetric => true
|
135
138
|
end
|
136
139
|
|
137
140
|
it "requires a password to decrypt" do
|
@@ -139,9 +142,7 @@ describe GPGME::Crypto do
|
|
139
142
|
encrypted_data = crypto.encrypt TEXT[:plain],
|
140
143
|
:symmetric => true, :password => "gpgme"
|
141
144
|
|
142
|
-
|
143
|
-
crypto.decrypt encrypted_data
|
144
|
-
end
|
145
|
+
crypto.decrypt encrypted_data
|
145
146
|
end
|
146
147
|
|
147
148
|
it "can encrypt and decrypt with the same password" do
|
@@ -151,16 +152,6 @@ describe GPGME::Crypto do
|
|
151
152
|
|
152
153
|
assert_equal "Hi there", plain.read
|
153
154
|
end
|
154
|
-
|
155
|
-
it "but breaks with different ones" do
|
156
|
-
crypto = GPGME::Crypto.new
|
157
|
-
encrypted_data = crypto.encrypt TEXT[:plain],
|
158
|
-
:symmetric => true, :password => "gpgme"
|
159
|
-
|
160
|
-
assert_raises GPGME::Error::DecryptFailed do
|
161
|
-
crypto.decrypt encrypted_data, :password => "wrong one"
|
162
|
-
end
|
163
|
-
end
|
164
155
|
end
|
165
156
|
|
166
157
|
describe :decrypt do
|
data/test/ctx_test.rb
CHANGED
@@ -27,6 +27,11 @@ describe GPGME::Ctx do
|
|
27
27
|
end
|
28
28
|
|
29
29
|
describe :new do
|
30
|
+
before do
|
31
|
+
info = GPGME::Engine.info.first
|
32
|
+
skip if /\A2\.[01]|\A1\./ === info.version
|
33
|
+
end
|
34
|
+
|
30
35
|
# We consider :armor, :protocol, :textmode and :keylist_mode as tested
|
31
36
|
# with the other tests of this file. Here we test the rest
|
32
37
|
|
@@ -51,80 +56,6 @@ describe GPGME::Ctx do
|
|
51
56
|
end
|
52
57
|
end
|
53
58
|
end
|
54
|
-
|
55
|
-
it ":passphrase_callback sets the callback for the password" do
|
56
|
-
def test_pass_func(obj,par2,par3,prev_was_bad,fd)
|
57
|
-
# prev_was_bad is 0 the first time, 1 the rest
|
58
|
-
if @var == 0
|
59
|
-
assert_equal 0, prev_was_bad
|
60
|
-
else
|
61
|
-
assert_equal 1, prev_was_bad
|
62
|
-
end
|
63
|
-
|
64
|
-
@var += 1
|
65
|
-
|
66
|
-
io = IO.for_fd(fd, 'w')
|
67
|
-
io.puts "wrong pasword"
|
68
|
-
io.flush
|
69
|
-
end
|
70
|
-
|
71
|
-
def with_correct_pass_func(obj,par2,par3,prev_was_bad,fd)
|
72
|
-
io = IO.for_fd(fd, 'w')
|
73
|
-
io.puts "gpgme"
|
74
|
-
io.flush
|
75
|
-
end
|
76
|
-
|
77
|
-
with_key PASSWORD_KEY do
|
78
|
-
input = GPGME::Data.new(TEXT[:passwored])
|
79
|
-
output = GPGME::Data.new
|
80
|
-
@var = 0
|
81
|
-
|
82
|
-
assert_raises GPGME::Error::BadPassphrase do
|
83
|
-
GPGME::Ctx.new(:passphrase_callback => method(:test_pass_func)) do |ctx|
|
84
|
-
ctx.decrypt_verify input, output
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
# Since we request the key 3 times, we should've gone through the
|
89
|
-
# callback 3 times.
|
90
|
-
assert_equal 3, @var
|
91
|
-
|
92
|
-
input.seek 0
|
93
|
-
output.seek 0
|
94
|
-
|
95
|
-
# Shouldn't crash
|
96
|
-
GPGME::Ctx.new(:passphrase_callback => method(:with_correct_pass_func)) do |ctx|
|
97
|
-
ctx.decrypt_verify input, output
|
98
|
-
end
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
it ":passphrase_callback_value passes a value to the callback function" do
|
103
|
-
def checking_value(value,par2,par3,par4,fd)
|
104
|
-
assert_equal "superman", value
|
105
|
-
io = IO.for_fd(fd, 'w')
|
106
|
-
io.puts "gpgme"
|
107
|
-
io.flush
|
108
|
-
end
|
109
|
-
|
110
|
-
with_key PASSWORD_KEY do
|
111
|
-
input = GPGME::Data.new(TEXT[:passwored])
|
112
|
-
output = GPGME::Data.new
|
113
|
-
|
114
|
-
options = {
|
115
|
-
:passphrase_callback => method(:checking_value),
|
116
|
-
:passphrase_callback_value => "superman"
|
117
|
-
}
|
118
|
-
|
119
|
-
GPGME::Ctx.new(options) do |ctx|
|
120
|
-
ctx.decrypt_verify input, output
|
121
|
-
end
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
# TODO Don't know how to use them yet
|
126
|
-
# it ":progress_callback"
|
127
|
-
# it ":progress_callback_value"
|
128
59
|
end
|
129
60
|
|
130
61
|
describe :decrypt_result do
|
@@ -399,6 +330,26 @@ RUBY
|
|
399
330
|
import_keys # If the test fails for some reason, it won't break others.
|
400
331
|
end
|
401
332
|
|
333
|
+
it "exports a minimal key if given the mode" do
|
334
|
+
remove_all_keys
|
335
|
+
GPGME::Key.import(KEY_WITH_SIGNATURE[:public])
|
336
|
+
key = GPGME::Key.find(KEY_WITH_SIGNATURE[:sha]).first
|
337
|
+
output_normal = GPGME::Data.new
|
338
|
+
output_minimal = GPGME::Data.new
|
339
|
+
ctx = GPGME::Ctx.new
|
340
|
+
|
341
|
+
ctx.export_keys(key.sha, output_normal)
|
342
|
+
ctx.export_keys(key.sha, output_minimal, 4)
|
343
|
+
|
344
|
+
output_normal.seek(0)
|
345
|
+
output_minimal.seek(0)
|
346
|
+
|
347
|
+
assert_equal output_normal.read.size, 849
|
348
|
+
assert_equal output_minimal.read.size, 668
|
349
|
+
|
350
|
+
import_keys # If the test fails for some reason, it won't break others.
|
351
|
+
end
|
352
|
+
|
402
353
|
it "exports only one key" do
|
403
354
|
original_keys = GPGME::Key.find(:public)
|
404
355
|
key = original_keys.first
|
@@ -0,0 +1,52 @@
|
|
1
|
+
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
2
|
+
Version: GnuPG v1.4.11 (Darwin)
|
3
|
+
|
4
|
+
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
|
38
|
+
VxCd5t3Exzi+3ZOOTJnECMABZc6lK7rIOiQHHLW6vHIy5MggT/Dz6NuQuT9ID2uO
|
39
|
+
wzx6w9XMdRXJ0uuEJlhTZtcjlKu+B8i9hHgj1zqNT67Zkkz0/YTVHtNYDpOzjc7A
|
40
|
+
c+m/Qok/ERUjVcYS6dIJnJU+3V4L5APTAAMFC/sHCYUR5oa/uCktq//r09xRc/bu
|
41
|
+
4uuzNJvsLzHcUA4udFSq2AneqrH/HCkrE0G4U79GMVpSddb+IamNWgJwfk4YHfNV
|
42
|
+
Vx2NhAWoCAIve0q+ueXGTGKkHyb0QobT/AmM/4Mtuln7cUfrkEmI8N8YIwPDqCGz
|
43
|
+
rWxvoPaOSUSxNfkyrV6IX8vjotx3NKm9n/6f5l/ncDrNSNruSywMq0fiLYS1+bCb
|
44
|
+
jsrTfWJKcM284ZwazKgcuhcCkXombkNQtQv7uD8FveWNVhC+LXtsyLGrzFNJVbNr
|
45
|
+
khKYfUFyoMY50PdvF4Ai1uJ0IYXQvIPnHbxPXMWa5PezrTWzlIXaVvVfgypC/tCY
|
46
|
+
p1QgiS+ln60NoK1m2ZFrUO3rklM44L1BNO9qjrUjYFVlmRd+qEBoXWGJLFp1g7Nh
|
47
|
+
1mijiKdrwmCzWsnRSmPRYtOujeojP8bH4ca9RekwqLbRVeX/dLi02GD0pOp6SI6B
|
48
|
+
Bk3J0Wzp2Ko47Vj8v03hdBozKZT93a4NeyrNZdiIYQQYEQgACQUCTW05ZgIbDAAK
|
49
|
+
CRDLUpBCN9v3ISGmAP0VXwY7BH81NRpwAYp/eeSGP1vxBCdqVAHMc4o3TUoWHAEA
|
50
|
+
vioivJ/Qvnb7nlHwagl5rLNXhiz/H71jmFS9x0x7FLg=
|
51
|
+
=T/Ce
|
52
|
+
-----END PGP PUBLIC KEY BLOCK-----
|
data/test/key_test.rb
CHANGED
@@ -66,13 +66,13 @@ describe GPGME::Key do
|
|
66
66
|
# Testing the lazy way with expectations. I think tests in
|
67
67
|
# the Ctx class are enough.
|
68
68
|
it "exports any key that matches the pattern" do
|
69
|
-
GPGME::Ctx.any_instance.expects(:export_keys).with("", anything)
|
69
|
+
GPGME::Ctx.any_instance.expects(:export_keys).with("", anything, 0)
|
70
70
|
GPGME::Key.export("")
|
71
71
|
end
|
72
72
|
|
73
73
|
it "exports any key that matches the pattern, can specify output" do
|
74
74
|
data = GPGME::Data.new
|
75
|
-
GPGME::Ctx.any_instance.expects(:export_keys).with("wadus", data)
|
75
|
+
GPGME::Ctx.any_instance.expects(:export_keys).with("wadus", data, 0)
|
76
76
|
ret = GPGME::Key.export("wadus", :output => data)
|
77
77
|
assert_equal data, ret
|
78
78
|
end
|
@@ -81,6 +81,11 @@ describe GPGME::Key do
|
|
81
81
|
GPGME::Ctx.expects(:new).with(:armor => true).yields(mock(:export_keys => true))
|
82
82
|
GPGME::Key.export("wadus", :armor => true)
|
83
83
|
end
|
84
|
+
|
85
|
+
it "can export a minimal key" do
|
86
|
+
GPGME::Ctx.any_instance.expects(:export_keys).with("wadus", anything, 4)
|
87
|
+
GPGME::Key.export("wadus", :minimal => true)
|
88
|
+
end
|
84
89
|
end
|
85
90
|
|
86
91
|
describe "#export" do
|
@@ -180,7 +185,7 @@ describe GPGME::Key do
|
|
180
185
|
|
181
186
|
with_key EXPIRED_KEY do
|
182
187
|
key = GPGME::Key.find(:secret, EXPIRED_KEY[:sha]).first
|
183
|
-
assert key.expired
|
188
|
+
assert key.expired if key
|
184
189
|
end
|
185
190
|
end
|
186
191
|
|
@@ -199,6 +204,18 @@ describe GPGME::Key do
|
|
199
204
|
end
|
200
205
|
end
|
201
206
|
|
207
|
+
describe :valid? do
|
208
|
+
it "returns true on a valid key" do
|
209
|
+
valid_key = File.read("test/files/testkey_pub.gpg")
|
210
|
+
assert GPGME::Key.valid?(valid_key)
|
211
|
+
end
|
212
|
+
|
213
|
+
it "returns false on an invalid key" do
|
214
|
+
invalid_key = File.read("test/files/testkey_pub_invalid.gpg")
|
215
|
+
assert !GPGME::Key.valid?(invalid_key)
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
202
219
|
describe :to_s do
|
203
220
|
it "can be coerced into a String" do
|
204
221
|
key = GPGME::Key.find(:secret).first
|
@@ -206,4 +223,3 @@ describe GPGME::Key do
|
|
206
223
|
end
|
207
224
|
end
|
208
225
|
end
|
209
|
-
|
data/test/pinentry
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
#! /bin/bash
|
2
|
+
# Dummy pinentry
|
3
|
+
#
|
4
|
+
# Copyright 2008 g10 Code GmbH
|
5
|
+
#
|
6
|
+
# This file is free software; as a special exception the author gives
|
7
|
+
# unlimited permission to copy and/or distribute it, with or without
|
8
|
+
# modifications, as long as this notice is preserved.
|
9
|
+
#
|
10
|
+
# This file is distributed in the hope that it will be useful, but
|
11
|
+
# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
|
12
|
+
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
13
|
+
# PURPOSE.
|
14
|
+
|
15
|
+
echo OK Your orders please
|
16
|
+
|
17
|
+
while read cmd; do
|
18
|
+
case $cmd in
|
19
|
+
GETPIN) echo D gpgme; echo OK;;
|
20
|
+
*) echo OK;;
|
21
|
+
esac
|
22
|
+
done
|
data/test/sub_key_test.rb
CHANGED
@@ -26,8 +26,11 @@ describe GPGME::SubKey do
|
|
26
26
|
refute subkey.expired
|
27
27
|
|
28
28
|
with_key EXPIRED_KEY do
|
29
|
-
|
30
|
-
|
29
|
+
key = GPGME::Key.find(:secret, EXPIRED_KEY[:sha]).first
|
30
|
+
if key
|
31
|
+
subkey = key.primary_subkey
|
32
|
+
assert subkey.expired
|
33
|
+
end
|
31
34
|
end
|
32
35
|
end
|
33
36
|
|
data/test/support/resources.rb
CHANGED
@@ -386,6 +386,31 @@ HyEbgNA=
|
|
386
386
|
-----END PGP PRIVATE KEY BLOCK-----
|
387
387
|
RUBY
|
388
388
|
|
389
|
+
key_with_signature = <<-RUBY
|
390
|
+
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
391
|
+
|
392
|
+
mI0ETbL4sAEEANBs/WsOxRCLdsW1h8LKGT6eJpAs6omGV/G7TJnMsk92BUIub3oZ
|
393
|
+
9oRC1L0l4EKB6o8/vULziT815dbbVxwQIOyDXEqP4sokRxjSNNkpPb+RuIjdmP6e
|
394
|
+
SJ2NxCxV/GxLhjZZTHG5SPH4Gei3TtdiHMHoar0rwEcVdS693K/6Ww8ZABEBAAG0
|
395
|
+
IVRlc3QgbnVtYmVyIDEgPHRlc3QxQGV4YW1wbGUuY29tPoi4BBMBAgAiBQJNsviw
|
396
|
+
AhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRD7yLd2W11cdyxOA/4gPEK1
|
397
|
+
qF8bp0YJfc91Ob/J70N5gNuO06AeBa8o6MHTUheCp5CMFD8RISDegsiYey3O+Wvk
|
398
|
+
rg+BmIQWqGTglDIDOM8B1Bmc+T+C0sRwIwmHqDo5a9mR2QnlcFqZ3SNV5MdxDUa4
|
399
|
+
GJk4LbUj/JwU2nR8Z4eA7OC1LjOexFKAfLX654izBBABCAAdFiEEVsoxCW7JMuDZ
|
400
|
+
Ydv9OSviynfWZWYFAl1ziQcACgkQOSviynfWZWYScwP/a/shuIWvLCZLllW0YWy8
|
401
|
+
NUPgTZ4TnJogOp4zm9+uNla9GJepM1Wj7+m1ZNzXskqESoAB00k2dYOGwek0hPHp
|
402
|
+
1MwpcMJvAu7m+LrfGVcG6IAkjQWvifsP8QIe05yNW3jsK+qQJpy1dejzgaHt7dLL
|
403
|
+
/rS6ySBxhIvpo5tsfe+C8PO4jQRNsviwAQQAvVKqiSoVA6oQ8nT3zLEGDgNeED3M
|
404
|
+
fHMeYbFMi7GTpvURsTXcPH0SLXzGVn8Aevaa+ConFWMQuWMsTPiqVQR6/kKE8RJ/
|
405
|
+
ynDHbnXuOGNdOBd96GdsIgqTMwrtWVvzhSKFrhDB1y8iFyQ9QlVTJG4jo8EcaN6L
|
406
|
+
T0hoo64XJktD5CUAEQEAAYifBBgBAgAJBQJNsviwAhsMAAoJEPvIt3ZbXVx3X/8E
|
407
|
+
AIiCsyWlIOUvhFN5a/V2TyA2XjXEKSn9iWi7uLhVT7ShrWSGGhdNBwiqJuDh5KxX
|
408
|
+
3VXa9fePMXrfbALdj1fRqCAFfKZAcKrNNls+psSaYLJwLhCUzD8Ht9M+LrGeZDPz
|
409
|
+
wzAqTfgPb5M2Inssarr5Lpdlu1X8y37cfNVHscqBZyfS
|
410
|
+
=KOQt
|
411
|
+
-----END PGP PUBLIC KEY BLOCK-----
|
412
|
+
RUBY
|
413
|
+
|
389
414
|
encrypted_text = <<-RUBY
|
390
415
|
-----BEGIN PGP MESSAGE-----
|
391
416
|
Version: GnuPG v1.4.11 (Darwin)
|
@@ -506,6 +531,11 @@ EXPIRED_KEY = {
|
|
506
531
|
:secret => expired_key_secret
|
507
532
|
}
|
508
533
|
|
534
|
+
KEY_WITH_SIGNATURE = {
|
535
|
+
:sha => 'test1@example.com',
|
536
|
+
:public => key_with_signature
|
537
|
+
}
|
538
|
+
|
509
539
|
TEXT = {
|
510
540
|
:plain => "Hi there",
|
511
541
|
:encrypted => encrypted_text.chomp,
|
data/test/test_helper.rb
CHANGED
@@ -99,11 +99,17 @@ def ensure_keys(proto)
|
|
99
99
|
# We use a different home directory for the keys to not disturb current
|
100
100
|
# installation
|
101
101
|
require 'tmpdir'
|
102
|
+
require 'pathname'
|
102
103
|
|
103
104
|
if DIRS.empty?
|
104
105
|
dir = Dir.mktmpdir
|
105
106
|
GPGME::Engine.home_dir = dir
|
106
107
|
DIRS.push(dir)
|
108
|
+
pinentry = Pathname.new(__FILE__).dirname + 'pinentry'
|
109
|
+
gpg_agent_conf = Pathname.new(dir) + 'gpg-agent.conf'
|
110
|
+
gpg_agent_conf.open('w+') {|io|
|
111
|
+
io.write("pinentry-program #{pinentry}\n")
|
112
|
+
}
|
107
113
|
remove_all_keys
|
108
114
|
import_keys
|
109
115
|
end
|
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gpgme
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.22
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daiki Ueno
|
8
8
|
- Albert Llop
|
9
|
-
autorequire:
|
9
|
+
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2022-11-25 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: mini_portile2
|
@@ -17,14 +17,14 @@ dependencies:
|
|
17
17
|
requirements:
|
18
18
|
- - "~>"
|
19
19
|
- !ruby/object:Gem::Version
|
20
|
-
version: '2.
|
20
|
+
version: '2.7'
|
21
21
|
type: :runtime
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
25
|
- - "~>"
|
26
26
|
- !ruby/object:Gem::Version
|
27
|
-
version: '2.
|
27
|
+
version: '2.7'
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: mocha
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
@@ -68,7 +68,7 @@ dependencies:
|
|
68
68
|
- !ruby/object:Gem::Version
|
69
69
|
version: 0.9.11
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
|
-
name:
|
71
|
+
name: coveralls_reborn
|
72
72
|
requirement: !ruby/object:Gem::Requirement
|
73
73
|
requirements:
|
74
74
|
- - ">="
|
@@ -85,16 +85,16 @@ dependencies:
|
|
85
85
|
name: byebug
|
86
86
|
requirement: !ruby/object:Gem::Requirement
|
87
87
|
requirements:
|
88
|
-
- - "
|
88
|
+
- - ">="
|
89
89
|
- !ruby/object:Gem::Version
|
90
|
-
version:
|
90
|
+
version: '0'
|
91
91
|
type: :development
|
92
92
|
prerelease: false
|
93
93
|
version_requirements: !ruby/object:Gem::Requirement
|
94
94
|
requirements:
|
95
|
-
- - "
|
95
|
+
- - ">="
|
96
96
|
- !ruby/object:Gem::Version
|
97
|
-
version:
|
97
|
+
version: '0'
|
98
98
|
description: |-
|
99
99
|
Ruby-GPGME is a Ruby language binding of GPGME (GnuPG
|
100
100
|
Made Easy). GnuPG Made Easy (GPGME) is a library designed to make access to
|
@@ -131,19 +131,18 @@ files:
|
|
131
131
|
- lib/gpgme/sub_key.rb
|
132
132
|
- lib/gpgme/user_id.rb
|
133
133
|
- lib/gpgme/version.rb
|
134
|
-
- ports/archives/gpgme-1.
|
135
|
-
- ports/archives/
|
136
|
-
- ports/archives/
|
137
|
-
- ports/archives/libassuan-2.5.1.tar.bz2
|
138
|
-
- ports/archives/libgpg-error-1.27.tar.bz2
|
139
|
-
- ports/archives/libgpg-error-1.32.tar.bz2
|
134
|
+
- ports/archives/gpgme-1.18.0.tar.bz2
|
135
|
+
- ports/archives/libassuan-2.5.5.tar.bz2
|
136
|
+
- ports/archives/libgpg-error-1.46.tar.bz2
|
140
137
|
- test/crypto_test.rb
|
141
138
|
- test/ctx_test.rb
|
142
139
|
- test/data_test.rb
|
143
140
|
- test/files/testkey_pub.gpg
|
141
|
+
- test/files/testkey_pub_invalid.gpg
|
144
142
|
- test/files/testkey_sec.gpg
|
145
143
|
- test/gpgme_test.rb
|
146
144
|
- test/key_test.rb
|
145
|
+
- test/pinentry
|
147
146
|
- test/signature_test.rb
|
148
147
|
- test/sub_key_test.rb
|
149
148
|
- test/support/resources.rb
|
@@ -152,7 +151,7 @@ homepage: http://github.com/ueno/ruby-gpgme
|
|
152
151
|
licenses:
|
153
152
|
- LGPL-2.1+
|
154
153
|
metadata: {}
|
155
|
-
post_install_message:
|
154
|
+
post_install_message:
|
156
155
|
rdoc_options: []
|
157
156
|
require_paths:
|
158
157
|
- lib
|
@@ -168,9 +167,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
168
167
|
- !ruby/object:Gem::Version
|
169
168
|
version: '0'
|
170
169
|
requirements: []
|
171
|
-
|
172
|
-
|
173
|
-
signing_key:
|
170
|
+
rubygems_version: 3.3.7
|
171
|
+
signing_key:
|
174
172
|
specification_version: 4
|
175
173
|
summary: Ruby binding of GPGME.
|
176
174
|
test_files: []
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|