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
@@ -0,0 +1,364 @@
|
|
1
|
+
|
2
|
+
module GPGME
|
3
|
+
|
4
|
+
Meta.define_ffi_forwarder :gpgme_engine_check_version,
|
5
|
+
:gpgme_set_engine_info,
|
6
|
+
:gpgme_pubkey_algo_name,
|
7
|
+
:gpgme_hash_algo_name,
|
8
|
+
:gpgme_data_get_encoding,
|
9
|
+
:gpgme_data_set_encoding,
|
10
|
+
:gpgme_set_protocol,
|
11
|
+
:gpgme_get_protocol,
|
12
|
+
:gpgme_set_armor,
|
13
|
+
:gpgme_get_armor,
|
14
|
+
:gpgme_set_textmode,
|
15
|
+
:gpgme_get_textmode,
|
16
|
+
:gpgme_get_include_certs,
|
17
|
+
:gpgme_set_include_certs,
|
18
|
+
:gpgme_set_keylist_mode,
|
19
|
+
:gpgme_get_keylist_mode,
|
20
|
+
:gpgme_get_locale,
|
21
|
+
:gpgme_op_keylist_start,
|
22
|
+
:gpgme_op_keylist_ext_start,
|
23
|
+
:gpgme_op_keylist_end,
|
24
|
+
:gpgme_op_genkey,
|
25
|
+
:gpgme_op_genkey_start,
|
26
|
+
:gpgme_op_export,
|
27
|
+
:gpgme_op_export_start,
|
28
|
+
:gpgme_op_export_ext,
|
29
|
+
:gpgme_op_export_ext_start,
|
30
|
+
:gpgme_op_export_keys,
|
31
|
+
:gpgme_op_export_keys_start,
|
32
|
+
:gpgme_op_import,
|
33
|
+
:gpgme_op_import_start,
|
34
|
+
:gpgme_op_import_keys,
|
35
|
+
:gpgme_op_import_keys_start,
|
36
|
+
:gpgme_op_delete,
|
37
|
+
:gpgme_op_delete_start,
|
38
|
+
:gpgme_op_trustlist_start,
|
39
|
+
:gpgme_op_trustlist_end,
|
40
|
+
:gpgme_op_decrypt,
|
41
|
+
:gpgme_op_decrypt_start,
|
42
|
+
:gpgme_op_verify,
|
43
|
+
:gpgme_op_verify_start,
|
44
|
+
:gpgme_op_decrypt_verify,
|
45
|
+
:gpgme_op_decrypt_verify_start,
|
46
|
+
:gpgme_signers_clear,
|
47
|
+
:gpgme_signers_add,
|
48
|
+
:gpgme_op_sign,
|
49
|
+
:gpgme_op_sign_start,
|
50
|
+
:gpgme_op_encrypt,
|
51
|
+
:gpgme_op_encrypt_start,
|
52
|
+
:gpgme_op_encrypt_sign,
|
53
|
+
:gpgme_op_encrypt_sign_start
|
54
|
+
|
55
|
+
Meta.define_op_edit :gpgme_op_edit,
|
56
|
+
:gpgme_op_edit_start,
|
57
|
+
:gpgme_op_card_edit,
|
58
|
+
:gpgme_op_card_edit_start
|
59
|
+
|
60
|
+
def self.gpgme_check_version(required)
|
61
|
+
Library.gpgme_check_version_internal required, Library::Signature.offset_of(:validity)
|
62
|
+
end
|
63
|
+
|
64
|
+
def self.gpgme_get_engine_info(rinfo)
|
65
|
+
engine_info = Library::EngineInfo.new
|
66
|
+
err = Library.gpgme_get_engine_info engine_info.to_ptr
|
67
|
+
|
68
|
+
return err if gpgme_err_code(err) != GPG_ERR_NO_ERROR
|
69
|
+
|
70
|
+
ptr = engine_info.to_ptr
|
71
|
+
until ptr.null?
|
72
|
+
engine = Library::EngineInfo.new ptr
|
73
|
+
|
74
|
+
rinfo << EngineInfo.new_from_struct(engine)
|
75
|
+
|
76
|
+
ptr = engine[:next]
|
77
|
+
end
|
78
|
+
|
79
|
+
err
|
80
|
+
end
|
81
|
+
|
82
|
+
|
83
|
+
def self.gpgme_err_code(code)
|
84
|
+
code & GPG_ERR_CODE_MASK
|
85
|
+
end
|
86
|
+
|
87
|
+
def self.gpgme_err_source(code)
|
88
|
+
(code & GPG_ERR_SOURCE_MASK) >> GPG_ERR_SOURCE_SHIFT
|
89
|
+
end
|
90
|
+
|
91
|
+
def self.gpgme_err_make(source, code)
|
92
|
+
if code == GPG_ERR_NO_ERROR
|
93
|
+
return GPG_ERR_NO_ERROR
|
94
|
+
end
|
95
|
+
|
96
|
+
((source << GPG_ERR_SOURCE_SHIFT) & GPG_ERR_SOURCE_MASK) | (code & GPG_ERR_CODE_MASK)
|
97
|
+
end
|
98
|
+
|
99
|
+
def self.gpgme_strerror(error)
|
100
|
+
Library.gpgme_strerror error
|
101
|
+
end
|
102
|
+
|
103
|
+
def self.gpgme_data_new(rdata)
|
104
|
+
buf = FFI::Buffer.new :pointer, 1
|
105
|
+
err = Library.gpgme_data_new buf
|
106
|
+
|
107
|
+
if gpgme_err_code(err) == GPG_ERR_NO_ERROR
|
108
|
+
rdata << Data.new_from_struct(buf.read_pointer)
|
109
|
+
end
|
110
|
+
|
111
|
+
err
|
112
|
+
end
|
113
|
+
|
114
|
+
def self.gpgme_data_new_from_mem(rdata, buffer, size)
|
115
|
+
buf = FFI::Buffer.new :pointer, 1
|
116
|
+
err = Library.gpgme_data_new_from_mem buf, buffer, size, 1
|
117
|
+
|
118
|
+
if gpgme_err_code(err) == GPG_ERR_NO_ERROR
|
119
|
+
rdata << Data.new_from_struct(buf.read_pointer)
|
120
|
+
end
|
121
|
+
|
122
|
+
err
|
123
|
+
end
|
124
|
+
|
125
|
+
if RUBY_PLATFORM == "java"
|
126
|
+
def self.gpgme_data_new_from_fd(rdata, fd)
|
127
|
+
raise NotImplementedError, "GPGME::gpgme_data_new_from_fd cannot be used on JRuby due to NIO API limitations."
|
128
|
+
end
|
129
|
+
else
|
130
|
+
def self.gpgme_data_new_from_fd(rdata, fd)
|
131
|
+
buf = FFI::Buffer.new :pointer, 1
|
132
|
+
err = Library.gpgme_data_new_from_fd buf, fd
|
133
|
+
|
134
|
+
if gpgme_err_code(err) == GPG_ERR_NO_ERROR
|
135
|
+
rdata << Data.new_from_struct(buf.read_pointer)
|
136
|
+
end
|
137
|
+
|
138
|
+
err
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
def self.gpgme_data_new_from_cbs(rdata, ruby_cbs, ruby_handle)
|
143
|
+
buf = FFI::Buffer.new :pointer, 1
|
144
|
+
cbs = Library::Callbacks.new
|
145
|
+
|
146
|
+
cbs[:read] = FFI::Function.new(:ssize_t, [ :pointer, :pointer, :size_t ]) do |handle, buffer, size|
|
147
|
+
data = ruby_cbs.read ruby_handle, size
|
148
|
+
|
149
|
+
if data.nil?
|
150
|
+
0
|
151
|
+
else
|
152
|
+
|
153
|
+
buffer.write_bytes data, 0, data.length
|
154
|
+
|
155
|
+
data.length
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
cbs[:write] = FFI::Function.new(:ssize_t, [ :pointer, :pointer, :size_t ]) do |handle, buffer, size|
|
160
|
+
data = buffer.read_bytes size
|
161
|
+
|
162
|
+
ruby_cbs.write ruby_handle, data, size
|
163
|
+
end
|
164
|
+
|
165
|
+
cbs[:seek] = FFI::Function.new(:off_t, [ :pointer, :off_t, :int ]) do |handle, offset, whence|
|
166
|
+
ruby_cbs.seek ruby_handle, offset, whence
|
167
|
+
end
|
168
|
+
|
169
|
+
cbs[:release] = FFI::Pointer::NULL
|
170
|
+
|
171
|
+
err = Library.gpgme_data_new_from_cbs buf, cbs.to_ptr, FFI::Pointer::NULL
|
172
|
+
if gpgme_err_code(err) == GPG_ERR_NO_ERROR
|
173
|
+
rdata << Data.new_from_struct(buf.read_pointer, cbs)
|
174
|
+
end
|
175
|
+
|
176
|
+
err
|
177
|
+
end
|
178
|
+
|
179
|
+
def self.gpgme_data_read(data, length)
|
180
|
+
buf = FFI::Buffer.new(:uint8, (length > 0) ? length : 1)
|
181
|
+
|
182
|
+
bytes = Library.gpgme_data_read data.context_pointer, buf, length
|
183
|
+
|
184
|
+
if bytes == -1
|
185
|
+
raise "gpgme_data_read failed with error #{FFI.errno}"
|
186
|
+
end
|
187
|
+
|
188
|
+
return nil if bytes == 0
|
189
|
+
|
190
|
+
buf.read_bytes bytes
|
191
|
+
end
|
192
|
+
|
193
|
+
def self.gpgme_data_write(data, buffer, length)
|
194
|
+
buf = FFI::Buffer.new(:uint8, (length > 0) ? length : 1)
|
195
|
+
if length > 0
|
196
|
+
buf.write_bytes buffer, 0, length
|
197
|
+
end
|
198
|
+
|
199
|
+
bytes = Library.gpgme_data_write data.context_pointer, buf, length
|
200
|
+
|
201
|
+
if bytes == -1
|
202
|
+
raise "gpgme_data_write failed with error #{FFI.errno}"
|
203
|
+
end
|
204
|
+
|
205
|
+
bytes
|
206
|
+
end
|
207
|
+
|
208
|
+
def self.gpgme_data_seek(data, offset, whence)
|
209
|
+
pos = Library.gpgme_data_seek data.context_pointer, offset, whence
|
210
|
+
|
211
|
+
if pos == -1
|
212
|
+
raise "gpgme_data_seek failed with error #{FFI.errno}"
|
213
|
+
end
|
214
|
+
|
215
|
+
pos
|
216
|
+
end
|
217
|
+
|
218
|
+
def self.gpgme_new(rctx)
|
219
|
+
buf = FFI::Buffer.new :pointer, 1
|
220
|
+
err = Library.gpgme_new buf
|
221
|
+
|
222
|
+
if gpgme_err_code(err) == GPG_ERR_NO_ERROR
|
223
|
+
rctx << Ctx.new_from_struct(buf.read_pointer)
|
224
|
+
end
|
225
|
+
|
226
|
+
err
|
227
|
+
end
|
228
|
+
|
229
|
+
def self.gpgme_release(ctx)
|
230
|
+
ctx.release_pointer
|
231
|
+
|
232
|
+
nil
|
233
|
+
end
|
234
|
+
|
235
|
+
def self.gpgme_set_passphrase_cb(context, ruby_callback, ruby_hook_value)
|
236
|
+
callback = FFI::Function.new(:uint, [ :pointer, :string, :string, :int, :int ]) do |hook, uid_hint, passphrase_info, prev_was_bad, fd|
|
237
|
+
ruby_callback.call ruby_hook_value, uid_hint, passphrase_info, prev_was_bad, fd
|
238
|
+
|
239
|
+
gpgme_err_make GPG_ERR_SOURCE_USER_1, GPG_ERR_NO_ERROR
|
240
|
+
end
|
241
|
+
|
242
|
+
context.context_passphrase_callback = [ ruby_callback, ruby_hook_value, callback ]
|
243
|
+
|
244
|
+
Library.gpgme_set_passphrase_cb context.context_pointer, callback, FFI::Pointer::NULL
|
245
|
+
end
|
246
|
+
|
247
|
+
def self.gpgme_get_passphrase_cb(context, rruby_callback, rruby_hook_value)
|
248
|
+
ruby_callback, ruby_hook_value, ffi_wrapper = context.context_passphrase_callback
|
249
|
+
|
250
|
+
rruby_callback << ruby_callback
|
251
|
+
rruby_hook_value << ruby_hook_value
|
252
|
+
|
253
|
+
nil
|
254
|
+
end
|
255
|
+
|
256
|
+
def self.gpgme_set_progress_cb(context, ruby_callback, ruby_hook_value)
|
257
|
+
callback = FFI::Function.new(:void, [ :pointer, :string, :int, :int, :int ]) do |hook, what, type, current, total|
|
258
|
+
ruby_callback.call ruby_hook_value, what, type, current, total
|
259
|
+
end
|
260
|
+
|
261
|
+
context.context_progress_callback = [ ruby_callback, ruby_hook_value, callback ]
|
262
|
+
|
263
|
+
Library.gpgme_set_progress_cb context.context_pointer, callback, FFI::Pointer::NULL
|
264
|
+
end
|
265
|
+
|
266
|
+
def self.gpgme_get_progress_cb(context, rruby_callback, rruby_hook_value)
|
267
|
+
ruby_callback, ruby_hook_value, ffi_wrapper = context.context_progress_callback
|
268
|
+
|
269
|
+
rruby_callback << ruby_callback
|
270
|
+
rruby_hook_value << ruby_hook_value
|
271
|
+
|
272
|
+
nil
|
273
|
+
end
|
274
|
+
|
275
|
+
def self.gpgme_op_keylist_next(context, rkey)
|
276
|
+
key = FFI::Buffer.new :pointer, 1
|
277
|
+
|
278
|
+
ret = Library.gpgme_op_keylist_next context.context_pointer, key
|
279
|
+
|
280
|
+
if gpgme_err_code(ret) == GPG_ERR_NO_ERROR
|
281
|
+
rkey << Key.new_from_struct(key.read_pointer)
|
282
|
+
end
|
283
|
+
|
284
|
+
ret
|
285
|
+
end
|
286
|
+
|
287
|
+
def self.gpgme_get_key(context, fingerprint, rkey, secret)
|
288
|
+
key = FFI::Buffer.new :pointer, 1
|
289
|
+
|
290
|
+
ret = Library.gpgme_get_key context.context_pointer, fingerprint, key, secret
|
291
|
+
|
292
|
+
if gpgme_err_code(ret) == GPG_ERR_NO_ERROR
|
293
|
+
rkey << Key.new_from_struct(key.read_pointer)
|
294
|
+
end
|
295
|
+
|
296
|
+
ret
|
297
|
+
end
|
298
|
+
|
299
|
+
def self.gpgme_op_import_result(context)
|
300
|
+
result = Library::ImportResult.new Library.gpgme_op_import_result(context.context_pointer)
|
301
|
+
|
302
|
+
ImportResult.new_from_struct result
|
303
|
+
end
|
304
|
+
|
305
|
+
|
306
|
+
def self.gpgme_op_trustlist_next(context, ritem)
|
307
|
+
buf = FFI::Buffer.new :pointer, 1
|
308
|
+
|
309
|
+
err = Library.gpgme_op_trustlist_next context, buf
|
310
|
+
|
311
|
+
if gpgme_err_code(err) == GPG_ERR_NO_ERROR
|
312
|
+
ritem << TrustItem.new_from_struct(buf.read_pointer)
|
313
|
+
end
|
314
|
+
|
315
|
+
err
|
316
|
+
end
|
317
|
+
|
318
|
+
def self.gpgme_op_decrypt_result(context)
|
319
|
+
struct = Library::DecryptResult.new Library::gpgme_op_decrypt_result(context.context_pointer)
|
320
|
+
|
321
|
+
DecryptResult.new_from_struct struct
|
322
|
+
end
|
323
|
+
|
324
|
+
|
325
|
+
def self.gpgme_op_verify_result(context)
|
326
|
+
struct = Library::VerifyResult.new Library::gpgme_op_verify_result(context.context_pointer)
|
327
|
+
|
328
|
+
VerifyResult.new_from_struct struct
|
329
|
+
end
|
330
|
+
|
331
|
+
def self.gpgme_signers_enum(context, index)
|
332
|
+
ptr = Library.gpgme_signers_enum context.context_pointer, index
|
333
|
+
|
334
|
+
return nil if ptr.null?
|
335
|
+
|
336
|
+
Key.new_from_struct Library::Key.new(ptr)
|
337
|
+
end
|
338
|
+
|
339
|
+
|
340
|
+
def self.gpgme_op_sign_result(context)
|
341
|
+
struct = Library::SignResult.new Library::gpgme_op_verify_result(context.context_pointer)
|
342
|
+
|
343
|
+
SignResult.new_from_struct struct
|
344
|
+
end
|
345
|
+
|
346
|
+
|
347
|
+
def self.gpgme_op_encrypt_result(context)
|
348
|
+
struct = Library::EncryptResult.new Library::gpgme_op_encrypt_result(context.context_pointer)
|
349
|
+
|
350
|
+
EncryptResult.new_from_struct struct
|
351
|
+
end
|
352
|
+
|
353
|
+
def self.gpgme_wait(context, rstatus, hang)
|
354
|
+
buf = FFI::Buffer.new :uint, 1
|
355
|
+
|
356
|
+
rctx = Library.gpgme_wait Meta.ffize_value(context), buf, hang
|
357
|
+
|
358
|
+
return nil if rctx.null?
|
359
|
+
|
360
|
+
rstatus << buf.read_uint
|
361
|
+
|
362
|
+
Ctx.new_from_struct rctx
|
363
|
+
end
|
364
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module GPGME
|
2
|
+
class ImportResult
|
3
|
+
def self.new_from_struct(struct)
|
4
|
+
instance = allocate
|
5
|
+
|
6
|
+
instance.instance_exec do
|
7
|
+
@considered = struct[:considered]
|
8
|
+
@no_user_id = struct[:no_user_id]
|
9
|
+
@imported = struct[:imported]
|
10
|
+
@imported_rsa = struct[:imported_rsa]
|
11
|
+
@unchanged = struct[:unchanged]
|
12
|
+
@new_user_ids = struct[:new_user_ids]
|
13
|
+
@new_sub_keys = struct[:new_sub_keys]
|
14
|
+
@new_signatures = struct[:new_signatures]
|
15
|
+
@new_revocations = struct[:new_revocations]
|
16
|
+
@secret_read = struct[:secret_read]
|
17
|
+
@secret_imported = struct[:secret_imported]
|
18
|
+
@secret_unchanged = struct[:secret_unchanged]
|
19
|
+
@not_imported = struct[:not_imported]
|
20
|
+
|
21
|
+
@imports = []
|
22
|
+
pointer = struct[:imports]
|
23
|
+
until pointer.null?
|
24
|
+
status = Library::ImportStatus.new pointer
|
25
|
+
|
26
|
+
@imports << ImportStatus.new_from_struct(status)
|
27
|
+
|
28
|
+
pointer = status[:next]
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
instance
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module GPGME
|
2
|
+
class Key
|
3
|
+
class Pointer < FFI::AutoPointer
|
4
|
+
def self.release(ptr)
|
5
|
+
Library.gpgme_key_unref ptr
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.new_from_struct(pointer)
|
10
|
+
instance = allocate
|
11
|
+
|
12
|
+
instance.instance_exec do
|
13
|
+
@ptr = Pointer.new pointer
|
14
|
+
|
15
|
+
struct = Library::Key.new @ptr
|
16
|
+
@keylist_mode = struct[:keylist_mode]
|
17
|
+
@revoked = (struct[:flags] >> 0) & 1
|
18
|
+
@expired = (struct[:flags] >> 1) & 1
|
19
|
+
@disabled = (struct[:flags] >> 2) & 1
|
20
|
+
@invalid = (struct[:flags] >> 3) & 1
|
21
|
+
@can_encrypt = (struct[:flags] >> 4) & 1
|
22
|
+
@can_sign = (struct[:flags] >> 5) & 1
|
23
|
+
@can_certify = (struct[:flags] >> 6) & 1
|
24
|
+
@secret = (struct[:flags] >> 7) & 1
|
25
|
+
@can_authenticate = (struct[:flags] >> 8) & 1
|
26
|
+
@protocol = struct[:protocol]
|
27
|
+
@issuer_serial = struct[:issuer_serial]
|
28
|
+
@issuer_name = struct[:issuer_name]
|
29
|
+
@chain_id = struct[:chain_id]
|
30
|
+
@owner_trust = struct[:owner_trust]
|
31
|
+
|
32
|
+
@subkeys = []
|
33
|
+
pointer = struct[:subkeys]
|
34
|
+
until pointer.null?
|
35
|
+
subkey = Library::SubKey.new pointer
|
36
|
+
|
37
|
+
@subkeys << SubKey.new_from_struct(subkey)
|
38
|
+
|
39
|
+
pointer = subkey[:next]
|
40
|
+
end
|
41
|
+
|
42
|
+
@uids = []
|
43
|
+
pointer = struct[:uids]
|
44
|
+
until pointer.null?
|
45
|
+
uid = Library::UserID.new pointer
|
46
|
+
|
47
|
+
@uids << UserID.new_from_struct(uid)
|
48
|
+
|
49
|
+
pointer = uid[:next]
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
instance
|
54
|
+
end
|
55
|
+
|
56
|
+
def context_pointer
|
57
|
+
@ptr
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module GPGME
|
2
|
+
class KeySig
|
3
|
+
def self.new_from_struct(struct)
|
4
|
+
instance = allocate
|
5
|
+
|
6
|
+
instance.instance_exec do
|
7
|
+
@revoked = (struct[:flags] >> 0) & 1
|
8
|
+
@expired = (struct[:flags] >> 1) & 1
|
9
|
+
@invalid = (struct[:invalid] >> 2) & 1
|
10
|
+
@exportable = (struct[:exportable] >> 3) & 1
|
11
|
+
@pubkey_algo = struct[:pubkey_algo]
|
12
|
+
@keyid = struct[:keyid]
|
13
|
+
@timestamp = struct[:timestamp]
|
14
|
+
@expires = struct[:expires]
|
15
|
+
end
|
16
|
+
|
17
|
+
instance
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|