gpgme-ffi 3.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.
- data/examples/edit.rb +77 -0
- data/examples/genkey.rb +55 -0
- data/examples/keylist.rb +7 -0
- data/examples/roundtrip.rb +42 -0
- data/examples/sign.rb +31 -0
- data/examples/verify.rb +8 -0
- data/ext/gpgme/Makefile.in +55 -0
- data/ext/gpgme/extconf.rb +8 -0
- data/ext/gpgme/extract_enums.rb +88 -0
- data/ext/gpgme/gpgme-1.3.1.tar.bz2 +0 -0
- data/ext/gpgme/libassuan-2.0.2.tar.bz2 +0 -0
- data/ext/gpgme/libgpg-error-1.10.tar.bz2 +0 -0
- data/ext/gpgme/libgpgme_gem.so +0 -0
- data/lib/gpgme/compat.rb +48 -0
- data/lib/gpgme/constants.rb +187 -0
- data/lib/gpgme/crypto.rb +357 -0
- data/lib/gpgme/ctx.rb +462 -0
- data/lib/gpgme/data.rb +189 -0
- data/lib/gpgme/engine.rb +76 -0
- data/lib/gpgme/error.rb +66 -0
- data/lib/gpgme/ffi/ctx.rb +36 -0
- data/lib/gpgme/ffi/data.rb +24 -0
- data/lib/gpgme/ffi/decrypt_result.rb +14 -0
- data/lib/gpgme/ffi/encrypt_result.rb +22 -0
- data/lib/gpgme/ffi/engine_info.rb +17 -0
- data/lib/gpgme/ffi/enums.rb +687 -0
- data/lib/gpgme/ffi/functions.rb +364 -0
- data/lib/gpgme/ffi/import_result.rb +35 -0
- data/lib/gpgme/ffi/import_status.rb +15 -0
- data/lib/gpgme/ffi/invalid_key.rb +14 -0
- data/lib/gpgme/ffi/key.rb +60 -0
- data/lib/gpgme/ffi/key_sig.rb +20 -0
- data/lib/gpgme/ffi/library.rb +279 -0
- data/lib/gpgme/ffi/meta.rb +57 -0
- data/lib/gpgme/ffi/new_signature.rb +18 -0
- data/lib/gpgme/ffi/sig_notation.rb +12 -0
- data/lib/gpgme/ffi/sign_result.rb +33 -0
- data/lib/gpgme/ffi/signature.rb +35 -0
- data/lib/gpgme/ffi/sub_key.rb +27 -0
- data/lib/gpgme/ffi/trust_item.rb +31 -0
- data/lib/gpgme/ffi/user_id.rb +30 -0
- data/lib/gpgme/ffi/verify_result.rb +22 -0
- data/lib/gpgme/ffi.rb +22 -0
- data/lib/gpgme/io_callbacks.rb +21 -0
- data/lib/gpgme/key.rb +242 -0
- data/lib/gpgme/key_common.rb +43 -0
- data/lib/gpgme/key_sig.rb +35 -0
- data/lib/gpgme/misc.rb +66 -0
- data/lib/gpgme/signature.rb +85 -0
- data/lib/gpgme/sub_key.rb +58 -0
- data/lib/gpgme/user_id.rb +20 -0
- data/lib/gpgme/version.rb +3 -0
- data/lib/gpgme.rb +106 -0
- data/test/crypto_test.rb +246 -0
- data/test/ctx_test.rb +432 -0
- data/test/data_test.rb +129 -0
- data/test/files/testkey_pub.gpg +52 -0
- data/test/files/testkey_sec.gpg +54 -0
- data/test/gpgme_test.rb +12 -0
- data/test/key_test.rb +209 -0
- data/test/signature_test.rb +52 -0
- data/test/sub_key_test.rb +48 -0
- data/test/support/resources.rb +516 -0
- data/test/test_helper.rb +84 -0
- metadata +203 -0
data/test/data_test.rb
ADDED
@@ -0,0 +1,129 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require 'test_helper'
|
3
|
+
|
4
|
+
describe GPGME::Data do
|
5
|
+
describe :new do
|
6
|
+
it "smartly creates an empty buffer if nothing passed" do
|
7
|
+
data = GPGME::Data.new
|
8
|
+
assert_instance_of GPGME::Data, data
|
9
|
+
assert_respond_to data, :read
|
10
|
+
assert_respond_to data, :write
|
11
|
+
end
|
12
|
+
|
13
|
+
it "doesn't create a new object if the object passed is a Data already" do
|
14
|
+
data = GPGME::Data.new
|
15
|
+
new_data = GPGME::Data.new(data)
|
16
|
+
|
17
|
+
assert_equal data, new_data
|
18
|
+
end
|
19
|
+
|
20
|
+
it "creates a data from strings" do
|
21
|
+
data = GPGME::Data.new("wadus")
|
22
|
+
assert_equal "wadus", data.read
|
23
|
+
end
|
24
|
+
|
25
|
+
it "creates a data from a file" do
|
26
|
+
# magic fromfile
|
27
|
+
data = GPGME::Data.new(File.open(__FILE__))
|
28
|
+
assert_match /magic fromfile/, data.read
|
29
|
+
end
|
30
|
+
|
31
|
+
it "creates a data from file descriptor" do
|
32
|
+
skip "cannot be implemented on JRuby" if RUBY_PLATFORM == "java"
|
33
|
+
|
34
|
+
# magic filedescriptor
|
35
|
+
File.open(__FILE__) do |f|
|
36
|
+
data = GPGME::Data.new(f.fileno)
|
37
|
+
assert_match /magic filedescriptor/, data.read
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe :read do
|
43
|
+
it "allows to read only a length of the object" do
|
44
|
+
data = GPGME::Data.new("wadus")
|
45
|
+
assert_equal "wad", data.read(3)
|
46
|
+
end
|
47
|
+
|
48
|
+
it "returns nil if reading 0 length" do
|
49
|
+
data = GPGME::Data.new("wadus")
|
50
|
+
assert_nil data.read(0)
|
51
|
+
end
|
52
|
+
|
53
|
+
it "returns the full thing if reading without parameter" do
|
54
|
+
data = GPGME::Data.new("wadus")
|
55
|
+
assert_equal "wadus", data.read
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
##
|
60
|
+
# We consider seek tested by these ones, since we have to seek(0) before
|
61
|
+
# reading.
|
62
|
+
describe :write do
|
63
|
+
it "writes data to it" do
|
64
|
+
data = GPGME::Data.new
|
65
|
+
data.write("wadus")
|
66
|
+
data.seek(0)
|
67
|
+
assert_equal "wadus", data.read
|
68
|
+
end
|
69
|
+
|
70
|
+
it "writes data to it, specifying the length of the things to write" do
|
71
|
+
data = GPGME::Data.new
|
72
|
+
data.write("wadus", 5)
|
73
|
+
data.seek(0)
|
74
|
+
assert_equal "wadus", data.read
|
75
|
+
end
|
76
|
+
|
77
|
+
it "writes only a limited part if specified a small number" do
|
78
|
+
data = GPGME::Data.new
|
79
|
+
data.write("wadus", 3)
|
80
|
+
data.seek(0)
|
81
|
+
assert_equal "wad", data.read
|
82
|
+
end
|
83
|
+
|
84
|
+
# TODO: test doesn't pass, I believe there might be a security issue here,
|
85
|
+
# random crap is written to the buffer if a longer size is passed.
|
86
|
+
#
|
87
|
+
# it "writes only the full data passed even if the length is bigger" do
|
88
|
+
# data = GPGME::Data.new
|
89
|
+
# data.write("wadus", 100)
|
90
|
+
# data.seek(0)
|
91
|
+
# assert_equal "wadus", data.read
|
92
|
+
# end
|
93
|
+
end
|
94
|
+
|
95
|
+
describe :encoding do
|
96
|
+
it "has encoding 0 by default (DATA_ENCODING_NONE)" do
|
97
|
+
data = GPGME::Data.new("wadus")
|
98
|
+
assert_equal GPGME::DATA_ENCODING_NONE, data.encoding
|
99
|
+
end
|
100
|
+
|
101
|
+
it "can set encodings" do
|
102
|
+
data = GPGME::Data.new("wadus")
|
103
|
+
[ GPGME::DATA_ENCODING_ARMOR, GPGME::DATA_ENCODING_BASE64,
|
104
|
+
GPGME::DATA_ENCODING_BINARY,GPGME::DATA_ENCODING_NONE ].each do |encoding|
|
105
|
+
data.encoding = encoding
|
106
|
+
assert_equal encoding, data.encoding
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
it "breaks if not set a proper encoding value" do
|
111
|
+
data = GPGME::Data.new("wadus")
|
112
|
+
assert_raises GPGME::Error::InvalidValue do
|
113
|
+
data.encoding = 64
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
describe :to_s do
|
119
|
+
it "returns the entire content of data" do
|
120
|
+
data = GPGME::Data.new("wadus")
|
121
|
+
data.read
|
122
|
+
old_pos = data.seek(0, IO::SEEK_CUR)
|
123
|
+
assert_equal "wadus", data.to_s
|
124
|
+
new_pos = data.seek(0, IO::SEEK_CUR)
|
125
|
+
assert_equal old_pos, new_pos
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
@@ -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-----
|
@@ -0,0 +1,54 @@
|
|
1
|
+
-----BEGIN PGP PRIVATE KEY BLOCK-----
|
2
|
+
Version: GnuPG v1.4.11 (Darwin)
|
3
|
+
|
4
|
+
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
|
52
|
+
u+DMAdQjSwNi0/7uqGbnAyZuRpBaKWJu9s4YRdU=
|
53
|
+
=kQA4
|
54
|
+
-----END PGP PRIVATE KEY BLOCK-----
|
data/test/gpgme_test.rb
ADDED
data/test/key_test.rb
ADDED
@@ -0,0 +1,209 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require 'test_helper'
|
3
|
+
|
4
|
+
describe GPGME::Key do
|
5
|
+
before do
|
6
|
+
skip unless GPGME::Engine.check_version GPGME::PROTOCOL_OpenPGP
|
7
|
+
end
|
8
|
+
|
9
|
+
it "has certain attributes" do
|
10
|
+
key = GPGME::Key.find(:secret).first
|
11
|
+
[:keylist_mode, :protocol, :owner_trust, :issuer_serial,
|
12
|
+
:issuer_name, :chain_id, :subkeys, :uids].each do |attrib|
|
13
|
+
assert key.respond_to?(attrib), "Key doesn't respond to #{attrib}"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
it "won't allow the creation of GPGME::Key's without the C API" do
|
18
|
+
assert_raises NoMethodError do
|
19
|
+
GPGME::Key.new
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
it "can compare one with another even though if they're not the same object" do
|
24
|
+
key1 = GPGME::Key.find(:secret).first
|
25
|
+
key2 = GPGME::Key.find(:secret).first
|
26
|
+
refute_equal key1.object_id, key2.object_id
|
27
|
+
assert_equal key1, key2
|
28
|
+
end
|
29
|
+
|
30
|
+
it "can compare a key with any other object" do
|
31
|
+
key1 = GPGME::Key.find(:secret).first
|
32
|
+
refute_equal key1, nil
|
33
|
+
end
|
34
|
+
|
35
|
+
describe :find do
|
36
|
+
it "should return all by default" do
|
37
|
+
keys = GPGME::Key.find :secret
|
38
|
+
assert_instance_of GPGME::Key, keys.first
|
39
|
+
assert 0 < keys.size
|
40
|
+
end
|
41
|
+
|
42
|
+
it "returns an array even if you pass only one descriptor" do
|
43
|
+
keys_one = GPGME::Key.find(:secret, KEYS.first[:sha]).map{|key| key.subkeys.map(&:keyid)}
|
44
|
+
keys_array = GPGME::Key.find(:secret, [KEYS.first[:sha]]).map{|key| key.subkeys.map(&:keyid)}
|
45
|
+
assert_equal keys_one, keys_array
|
46
|
+
end
|
47
|
+
|
48
|
+
it "returns only secret keys if told to do so" do
|
49
|
+
keys = GPGME::Key.find :secret
|
50
|
+
assert keys.all?(&:secret?)
|
51
|
+
end
|
52
|
+
|
53
|
+
it "returns only public keys if told to do so" do
|
54
|
+
keys = GPGME::Key.find :public
|
55
|
+
assert keys.none?(&:secret?)
|
56
|
+
end
|
57
|
+
|
58
|
+
it "filters by capabilities" do
|
59
|
+
GPGME::Key.any_instance.stubs(:usable_for?).returns(false)
|
60
|
+
keys = GPGME::Key.find :public, "", :wadusing
|
61
|
+
assert keys.empty?
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
describe :export do
|
66
|
+
# Testing the lazy way with expectations. I think tests in
|
67
|
+
# the Ctx class are enough.
|
68
|
+
it "exports any key that matches the pattern" do
|
69
|
+
GPGME::Ctx.any_instance.expects(:export_keys).with("", anything)
|
70
|
+
GPGME::Key.export("")
|
71
|
+
end
|
72
|
+
|
73
|
+
it "exports any key that matches the pattern, can specify output" do
|
74
|
+
data = GPGME::Data.new
|
75
|
+
GPGME::Ctx.any_instance.expects(:export_keys).with("wadus", data)
|
76
|
+
ret = GPGME::Key.export("wadus", :output => data)
|
77
|
+
assert_equal data, ret
|
78
|
+
end
|
79
|
+
|
80
|
+
it "can specify options for Ctx" do
|
81
|
+
GPGME::Ctx.expects(:new).with(:armor => true).yields(mock(:export_keys => true))
|
82
|
+
GPGME::Key.export("wadus", :armor => true)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
describe "#export" do
|
87
|
+
it "can export from the key instance" do
|
88
|
+
key = GPGME::Key.find(:public).first
|
89
|
+
GPGME::Key.expects(:export).with(key.sha, {})
|
90
|
+
|
91
|
+
key.export
|
92
|
+
end
|
93
|
+
|
94
|
+
it "can export from the key instance passing variables" do
|
95
|
+
key = GPGME::Key.find(:public).first
|
96
|
+
GPGME::Key.expects(:export).with(key.sha, {:armor => true})
|
97
|
+
|
98
|
+
key.export :armor => true
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
describe :import do
|
103
|
+
it "can import keys" do
|
104
|
+
data = GPGME::Data.new
|
105
|
+
GPGME::Ctx.any_instance.expects(:import_keys).with(data)
|
106
|
+
GPGME::Ctx.any_instance.expects(:import_result).returns("wadus")
|
107
|
+
|
108
|
+
assert_equal "wadus", GPGME::Key.import(data)
|
109
|
+
end
|
110
|
+
|
111
|
+
it "can specify options for Ctx" do
|
112
|
+
GPGME::Ctx.expects(:new).with(:armor => true).yields(mock(:import_keys => true, :import_result => true))
|
113
|
+
GPGME::Key.import("wadus", :armor => true)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
# describe :trust do
|
118
|
+
# it "returns :revoked if it is so"
|
119
|
+
# it "returns :expired if it is expired"
|
120
|
+
# it "returns :disabled if it is so"
|
121
|
+
# it "returns :invalid if it is so"
|
122
|
+
# it "returns nil otherwise"
|
123
|
+
# end
|
124
|
+
|
125
|
+
# describe :capability do
|
126
|
+
# it "returns an array of possible capabilities"
|
127
|
+
# end
|
128
|
+
|
129
|
+
# describe :secret? do
|
130
|
+
# "returns true/false depending on the instance variable"
|
131
|
+
# end
|
132
|
+
|
133
|
+
describe :usable_for? do
|
134
|
+
it "checks for the capabilities of the key and returns true if it matches all" do
|
135
|
+
key = GPGME::Key.find(:secret).first
|
136
|
+
|
137
|
+
key.stubs(:capability).returns([:encrypt, :sign])
|
138
|
+
assert key.usable_for?([])
|
139
|
+
|
140
|
+
key.stubs(:capability).returns([:encrypt, :sign])
|
141
|
+
assert key.usable_for?([:encrypt])
|
142
|
+
|
143
|
+
key.stubs(:capability).returns([:encrypt, :sign])
|
144
|
+
refute key.usable_for?([:certify])
|
145
|
+
end
|
146
|
+
|
147
|
+
it "returns false if the key is expired or revoked or disabled or disabled" do
|
148
|
+
key = GPGME::Key.find(:secret).first
|
149
|
+
key.stubs(:trust).returns(:revoked)
|
150
|
+
key.stubs(:capability).returns([:encrypt, :sign])
|
151
|
+
refute key.usable_for?([:encrypt])
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
describe :delete! do
|
156
|
+
it "deletes the key itself and its secret one if called with true" do
|
157
|
+
begin
|
158
|
+
key = KEYS.first
|
159
|
+
GPGME::Key.find(:public, key[:sha]).first.delete!(true)
|
160
|
+
|
161
|
+
assert_empty GPGME::Key.find(:public, key[:sha])
|
162
|
+
assert_empty GPGME::Key.find(:secret, key[:sha])
|
163
|
+
ensure
|
164
|
+
import_key key
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
it "raises GPGME::Error::Conflict if we're deleting a key that is secret" do
|
169
|
+
key = KEYS.first
|
170
|
+
assert_raises GPGME::Error::Conflict do
|
171
|
+
GPGME::Key.find(:secret, key[:sha]).first.delete!
|
172
|
+
end
|
173
|
+
refute_empty GPGME::Key.find(:secret, key[:sha])
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
it "knows if the key is expired" do
|
178
|
+
key = GPGME::Key.find(:secret).first
|
179
|
+
refute key.expired
|
180
|
+
|
181
|
+
with_key EXPIRED_KEY do
|
182
|
+
key = GPGME::Key.find(:secret, EXPIRED_KEY[:sha]).first
|
183
|
+
assert key.expired
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
it "returns the expiry date of the first subkey" do
|
188
|
+
key = GPGME::Key.find(:secret).first
|
189
|
+
subkey = key.primary_subkey
|
190
|
+
subkey.expects(:expired).returns(true)
|
191
|
+
|
192
|
+
assert key.expired
|
193
|
+
end
|
194
|
+
|
195
|
+
describe :inspect do
|
196
|
+
it "can be inspected" do
|
197
|
+
key = GPGME::Key.find(:secret).first
|
198
|
+
key.inspect
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
describe :to_s do
|
203
|
+
it "can be coerced into a String" do
|
204
|
+
key = GPGME::Key.find(:secret).first
|
205
|
+
key.to_s
|
206
|
+
end
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require 'test_helper'
|
3
|
+
|
4
|
+
describe GPGME::Signature do
|
5
|
+
before do
|
6
|
+
skip unless GPGME::Engine.check_version GPGME::PROTOCOL_OpenPGP
|
7
|
+
end
|
8
|
+
|
9
|
+
it "#valid? is true when the signature is valid" do
|
10
|
+
crypto = GPGME::Crypto.new
|
11
|
+
signatures = 0
|
12
|
+
sign = crypto.sign "Hi there"
|
13
|
+
|
14
|
+
crypto.verify(sign) do |signature|
|
15
|
+
assert_instance_of GPGME::Signature, signature
|
16
|
+
assert signature.valid?
|
17
|
+
refute signature.expired_signature?
|
18
|
+
refute signature.expired_key?
|
19
|
+
refute signature.revoked_key?
|
20
|
+
refute signature.bad?
|
21
|
+
refute signature.no_key?
|
22
|
+
signatures += 1
|
23
|
+
end
|
24
|
+
|
25
|
+
assert_equal 1, signatures
|
26
|
+
end
|
27
|
+
|
28
|
+
it "#expired_key? is true when the key has expired" do
|
29
|
+
with_key EXPIRED_KEY do
|
30
|
+
crypto = GPGME::Crypto.new
|
31
|
+
signatures = 0
|
32
|
+
crypto.verify(TEXT[:expired_key_sign]) do |signature|
|
33
|
+
assert_instance_of GPGME::Signature, signature
|
34
|
+
refute signature.valid?
|
35
|
+
refute signature.expired_signature?
|
36
|
+
assert signature.expired_key?
|
37
|
+
refute signature.revoked_key?
|
38
|
+
refute signature.bad?
|
39
|
+
refute signature.no_key?
|
40
|
+
signatures += 1
|
41
|
+
end
|
42
|
+
|
43
|
+
assert_equal 1, signatures
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
# TODO Find how to test these
|
48
|
+
# it "#expired_signature? is true when the signature has expired"
|
49
|
+
# it "#revoked_key? is true when the key has been revoked"
|
50
|
+
# it "#bad? is true when the signature is bad"
|
51
|
+
# it "#no_key? is true when we don't have the key to verify the signature"
|
52
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require 'test_helper'
|
3
|
+
|
4
|
+
describe GPGME::SubKey do
|
5
|
+
before do
|
6
|
+
skip unless GPGME::Engine.check_version GPGME::PROTOCOL_OpenPGP
|
7
|
+
end
|
8
|
+
|
9
|
+
# We trust Key for common methods that come from KeyCommon
|
10
|
+
|
11
|
+
it "has certain attributes" do
|
12
|
+
subkey = GPGME::Key.find(:secret).first.primary_subkey
|
13
|
+
[:pubkey_algo, :length, :keyid, :fpr, :fingerprint].each do |attrib|
|
14
|
+
assert subkey.respond_to?(attrib), "Key doesn't respond to #{attrib}"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
it "won't allow the creation of GPGME::SubKey's without the C API" do
|
19
|
+
assert_raises NoMethodError do
|
20
|
+
GPGME::SubKey.new
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
it "knows if the key is expired" do
|
25
|
+
subkey = GPGME::Key.find(:secret).first.primary_subkey
|
26
|
+
refute subkey.expired
|
27
|
+
|
28
|
+
with_key EXPIRED_KEY do
|
29
|
+
subkey = GPGME::Key.find(:secret, EXPIRED_KEY[:sha]).first.primary_subkey
|
30
|
+
assert subkey.expired
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe :inspect do
|
35
|
+
it "can be inspected" do
|
36
|
+
subkey = GPGME::Key.find(:secret).first.primary_subkey
|
37
|
+
subkey.inspect
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe :to_s do
|
42
|
+
it "can be coerced into a String" do
|
43
|
+
subkey = GPGME::Key.find(:secret).first.primary_subkey
|
44
|
+
subkey.to_s
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|