rnp 0.1.0 → 0.2.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.
- checksums.yaml +4 -4
- data/.gitignore +12 -0
- data/.rspec +2 -0
- data/.travis.yml +5 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +26 -0
- data/README.adoc +208 -0
- data/Rakefile +6 -0
- data/Use_Cases.adoc +119 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/example-usage.rb +766 -0
- data/examples/highlevel/decrypt_mem.rb +44 -0
- data/examples/highlevel/encrypt_mem.rb +46 -0
- data/examples/lowlevel/decrypt_file.rb +76 -0
- data/examples/lowlevel/decrypt_mem.rb +80 -0
- data/examples/lowlevel/encrypt_file.rb +68 -0
- data/examples/lowlevel/encrypt_mem.rb +75 -0
- data/examples/lowlevel/load_pubkey.rb +118 -0
- data/examples/lowlevel/print_keyring_file.rb +68 -0
- data/examples/lowlevel/print_keyring_mem.rb +96 -0
- data/examples/lowlevel/sign_file.rb +104 -0
- data/examples/lowlevel/sign_mem.rb +96 -0
- data/examples/lowlevel/verify_file.rb +55 -0
- data/examples/lowlevel/verify_mem.rb +61 -0
- data/lib/rnp/highlevel/constants.rb +96 -0
- data/lib/rnp/highlevel/keyring.rb +259 -0
- data/lib/rnp/highlevel/publickey.rb +150 -0
- data/lib/rnp/highlevel/secretkey.rb +318 -0
- data/lib/rnp/highlevel/utils.rb +119 -0
- data/lib/rnp/highlevel.rb +5 -0
- data/lib/rnp/lowlevel/constants.rb +11 -0
- data/lib/rnp/lowlevel/dynarray.rb +129 -0
- data/lib/rnp/lowlevel/enums.rb +243 -0
- data/lib/rnp/lowlevel/libc.rb +28 -0
- data/lib/rnp/lowlevel/libopenssl.rb +15 -0
- data/lib/rnp/lowlevel/librnp.rb +213 -0
- data/lib/rnp/lowlevel/structs.rb +541 -0
- data/lib/rnp/lowlevel/utils.rb +25 -0
- data/lib/rnp/lowlevel.rb +6 -0
- data/lib/rnp/version.rb +3 -0
- data/lib/rnp.rb +5 -0
- data/rnp/lib/rnp.rb +5 -0
- data/rnp/spec/rnp_spec.rb +11 -0
- data/rnp.gemspec +35 -0
- metadata +82 -9
@@ -0,0 +1,541 @@
|
|
1
|
+
require 'ffi'
|
2
|
+
|
3
|
+
require_relative 'enums'
|
4
|
+
require_relative 'constants'
|
5
|
+
|
6
|
+
module LibRNP
|
7
|
+
extend FFI::Library
|
8
|
+
|
9
|
+
class PGPErrCode < FFI::Struct
|
10
|
+
layout :errcode, :pgp_errcode_t
|
11
|
+
end
|
12
|
+
|
13
|
+
class PGPError < FFI::Struct
|
14
|
+
layout :errcode, :pgp_errcode_t,
|
15
|
+
:sys_errno, :int,
|
16
|
+
:comment, :string,
|
17
|
+
:file, :string,
|
18
|
+
:line, :int,
|
19
|
+
:next, :pointer
|
20
|
+
end
|
21
|
+
|
22
|
+
class PGPPTag < FFI::Struct
|
23
|
+
layout :new_format, :uint,
|
24
|
+
:type, :uint, #:pgp_content_enum?
|
25
|
+
:length_type, :pgp_ptag_of_lt_t,
|
26
|
+
:length, :uint,
|
27
|
+
:position, :uint,
|
28
|
+
:size, :uint
|
29
|
+
end
|
30
|
+
|
31
|
+
class PGPDSAPubKey < FFI::Struct
|
32
|
+
layout :p, :pointer,
|
33
|
+
:q, :pointer,
|
34
|
+
:g, :pointer,
|
35
|
+
:y, :pointer
|
36
|
+
end
|
37
|
+
|
38
|
+
class PGPRSAPubKey < FFI::Struct
|
39
|
+
layout :n, :pointer,
|
40
|
+
:e, :pointer
|
41
|
+
end
|
42
|
+
|
43
|
+
class PGPElGamalPubKey < FFI::Struct
|
44
|
+
layout :p, :pointer,
|
45
|
+
:g, :pointer,
|
46
|
+
:y, :pointer
|
47
|
+
end
|
48
|
+
|
49
|
+
class PGPPubKeyU < FFI::Union
|
50
|
+
layout :dsa, PGPDSAPubKey,
|
51
|
+
:rsa, PGPRSAPubKey,
|
52
|
+
:elgamal, PGPElGamalPubKey
|
53
|
+
end
|
54
|
+
|
55
|
+
class PGPPubKey < FFI::Struct
|
56
|
+
layout :version, :pgp_version_t,
|
57
|
+
:birthtime, :time_t,
|
58
|
+
:duration, :time_t,
|
59
|
+
:days_valid, :uint,
|
60
|
+
:alg, :pgp_pubkey_alg_t,
|
61
|
+
:key, PGPPubKeyU
|
62
|
+
|
63
|
+
# Note: This is not a ManagedStruct because this struct is a non-pointer
|
64
|
+
# member in other structs and that will cause issues.
|
65
|
+
# Use FFI::AutoPointer.
|
66
|
+
def self.release(ptr)
|
67
|
+
LibRNP::pgp_pubkey_free(ptr)
|
68
|
+
LibC::free(ptr)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
class PGPData < FFI::Struct
|
73
|
+
layout :len, :size_t,
|
74
|
+
:contents, :pointer,
|
75
|
+
:mmapped, :uint8
|
76
|
+
end
|
77
|
+
|
78
|
+
class PGPRSASig < FFI::Struct
|
79
|
+
layout :sig, :pointer
|
80
|
+
end
|
81
|
+
|
82
|
+
class PGPDSASig < FFI::Struct
|
83
|
+
layout :r, :pointer,
|
84
|
+
:s, :pointer
|
85
|
+
end
|
86
|
+
|
87
|
+
class PGPElGamalSig < FFI::Struct
|
88
|
+
layout :r, :pointer,
|
89
|
+
:s, :pointer
|
90
|
+
end
|
91
|
+
|
92
|
+
class PGPSigInfoU < FFI::Union
|
93
|
+
layout :rsa, PGPRSASig,
|
94
|
+
:dsa, PGPDSASig,
|
95
|
+
:elgamal, PGPElGamalSig,
|
96
|
+
:unknown, PGPData
|
97
|
+
end
|
98
|
+
|
99
|
+
class PGPSigInfo < FFI::Struct
|
100
|
+
layout :version, :pgp_version_t,
|
101
|
+
:type, :pgp_sig_type_t,
|
102
|
+
:birthtime, :time_t,
|
103
|
+
:duration, :time_t,
|
104
|
+
:signer_id, [:uint8, PGP_KEY_ID_SIZE],
|
105
|
+
:key_alg, :pgp_pubkey_alg_t,
|
106
|
+
:hash_alg, :pgp_hash_alg_t,
|
107
|
+
:sig, PGPSigInfoU,
|
108
|
+
:v4_hashlen, :size_t,
|
109
|
+
:v4_hashed, :pointer,
|
110
|
+
:flags, :uint # bitfields
|
111
|
+
end
|
112
|
+
|
113
|
+
class PGPSig < FFI::Struct
|
114
|
+
layout :info, PGPSigInfo,
|
115
|
+
:hash2, [:uint8, 2],
|
116
|
+
:v4_hashstart, :size_t,
|
117
|
+
:hash, :pointer
|
118
|
+
end
|
119
|
+
|
120
|
+
class PGPSSRaw < FFI::Struct
|
121
|
+
layout :tag, :pgp_content_enum,
|
122
|
+
:length, :size_t,
|
123
|
+
:raw, :pointer
|
124
|
+
end
|
125
|
+
|
126
|
+
class PGPSSTrust < FFI::Struct
|
127
|
+
layout :level, :uint8,
|
128
|
+
:amount, :uint8
|
129
|
+
end
|
130
|
+
|
131
|
+
class PGPSSNotation < FFI::Struct
|
132
|
+
layout :flags, PGPData,
|
133
|
+
:name, PGPData,
|
134
|
+
:value, PGPData
|
135
|
+
end
|
136
|
+
|
137
|
+
class PGPSubPacket < FFI::Struct
|
138
|
+
layout :length, :size_t,
|
139
|
+
:raw, :pointer
|
140
|
+
end
|
141
|
+
|
142
|
+
class PGPOnePassSig < FFI::Struct
|
143
|
+
layout :version, :uint8,
|
144
|
+
:sig_type, :pgp_sig_type_t,
|
145
|
+
:hash_alg, :pgp_hash_alg_t,
|
146
|
+
:key_alg, :pgp_pubkey_alg_t,
|
147
|
+
:keyid, [:uint8, PGP_KEY_ID_SIZE],
|
148
|
+
:nested, :uint
|
149
|
+
end
|
150
|
+
|
151
|
+
class PGPSSRevocationKey < FFI::Struct
|
152
|
+
layout :class, :uint8,
|
153
|
+
:algid, :uint8,
|
154
|
+
:fingerprint, [:uint8, PGP_FINGERPRINT_SIZE]
|
155
|
+
end
|
156
|
+
|
157
|
+
class PGPLitDataHeader < FFI::Struct
|
158
|
+
layout :format, :pgp_litdata_enum,
|
159
|
+
:filename, [:char, 256],
|
160
|
+
:mtime, :time_t
|
161
|
+
end
|
162
|
+
|
163
|
+
class PGPLitDataBody < FFI::Struct
|
164
|
+
layout :length, :uint,
|
165
|
+
:data, :pointer,
|
166
|
+
:mem, :pointer
|
167
|
+
end
|
168
|
+
|
169
|
+
class PGPDynBody < FFI::Struct
|
170
|
+
layout :length, :uint,
|
171
|
+
:data, :pointer
|
172
|
+
end
|
173
|
+
|
174
|
+
class PGPSSSigTarget < FFI::Struct
|
175
|
+
layout :pka_alg, :pgp_pubkey_alg_t,
|
176
|
+
:hash_alg, :pgp_hash_alg_t,
|
177
|
+
:hash, PGPData
|
178
|
+
end
|
179
|
+
|
180
|
+
class PGPSSRevocation < FFI::Struct
|
181
|
+
layout :code, :uint8,
|
182
|
+
:reason, :string
|
183
|
+
end
|
184
|
+
|
185
|
+
class PGPRSASecKey < FFI::Struct
|
186
|
+
layout :d, :pointer,
|
187
|
+
:p, :pointer,
|
188
|
+
:q, :pointer,
|
189
|
+
:u, :pointer
|
190
|
+
end
|
191
|
+
|
192
|
+
class PGPDSASecKey < FFI::Struct
|
193
|
+
layout :x, :pointer
|
194
|
+
end
|
195
|
+
|
196
|
+
class PGPElGamalSecKey < FFI::Struct
|
197
|
+
layout :x, :pointer
|
198
|
+
end
|
199
|
+
|
200
|
+
class PGPSecKeyU < FFI::Union
|
201
|
+
layout :rsa, PGPRSASecKey,
|
202
|
+
:dsa, PGPDSASecKey,
|
203
|
+
:elgamal, PGPElGamalSecKey
|
204
|
+
end
|
205
|
+
|
206
|
+
class PGPSecKey < FFI::Struct
|
207
|
+
layout :pubkey, PGPPubKey,
|
208
|
+
:s2k_usage, :pgp_s2k_usage_t,
|
209
|
+
:s2k_specifier, :pgp_s2k_specifier_t,
|
210
|
+
:alg, :pgp_symm_alg_t,
|
211
|
+
:hash_alg, :pgp_hash_alg_t,
|
212
|
+
:salt, [:uint8, PGP_SALT_SIZE],
|
213
|
+
:octetc, :uint,
|
214
|
+
:iv, [:uint8, PGP_MAX_BLOCK_SIZE],
|
215
|
+
:key, PGPSecKeyU,
|
216
|
+
:checksum, :uint,
|
217
|
+
:checkhash, :pointer
|
218
|
+
end
|
219
|
+
|
220
|
+
class PGPHeaders < FFI::Struct
|
221
|
+
layout :headers, :pointer,
|
222
|
+
:headerc, :uint
|
223
|
+
end
|
224
|
+
|
225
|
+
class PGPArmourHeader < FFI::Struct
|
226
|
+
layout :type, :string,
|
227
|
+
:headers, PGPHeaders
|
228
|
+
end
|
229
|
+
|
230
|
+
class PGPFixedBody < FFI::Struct
|
231
|
+
layout :length, :uint,
|
232
|
+
:data, [:uint8, 8192]
|
233
|
+
end
|
234
|
+
|
235
|
+
class PGPHash < FFI::Struct
|
236
|
+
layout :alg, :pgp_hash_alg_t,
|
237
|
+
:size, :size_t,
|
238
|
+
:name, :string,
|
239
|
+
:init, :pointer,
|
240
|
+
:add, :pointer,
|
241
|
+
:data, :pointer
|
242
|
+
end
|
243
|
+
|
244
|
+
class PGPPKSessKeyParamsRSA < FFI::Struct
|
245
|
+
layout :encrypted_m, :pointer,
|
246
|
+
:m, :pointer
|
247
|
+
end
|
248
|
+
|
249
|
+
class PGPPKSessKeyParamsElGamal < FFI::Struct
|
250
|
+
layout :g_to_k, :pointer,
|
251
|
+
:encrypted_m, :pointer
|
252
|
+
end
|
253
|
+
|
254
|
+
class PGPPKSessKeyParamsU < FFI::Union
|
255
|
+
layout :rsa, PGPPKSessKeyParamsRSA,
|
256
|
+
:elgamal, PGPPKSessKeyParamsElGamal
|
257
|
+
end
|
258
|
+
|
259
|
+
class PGPPKSessKey < FFI::Struct
|
260
|
+
layout :version, :uint,
|
261
|
+
:key_id, [:uint8, PGP_KEY_ID_SIZE],
|
262
|
+
:alg, :pgp_pubkey_alg_t,
|
263
|
+
:params, PGPPKSessKeyParamsU,
|
264
|
+
:symm_alg, :pgp_symm_alg_t,
|
265
|
+
:key, [:uint8, PGP_MAX_KEY_SIZE],
|
266
|
+
:checksum, :uint16
|
267
|
+
end
|
268
|
+
|
269
|
+
class PGPSecKeyPassphrase < FFI::Struct
|
270
|
+
layout :seckey, :pointer,
|
271
|
+
:passphrase, :pointer
|
272
|
+
end
|
273
|
+
|
274
|
+
class PGPGetSecKey < FFI::Struct
|
275
|
+
layout :seckey, :pointer,
|
276
|
+
:pk_sesskey, :pointer
|
277
|
+
end
|
278
|
+
|
279
|
+
class PGPContents < FFI::Union
|
280
|
+
layout :error, :string,
|
281
|
+
:errcode, PGPErrCode,
|
282
|
+
:ptag, PGPPTag,
|
283
|
+
:pubkey, PGPPubKey,
|
284
|
+
:trust, PGPData,
|
285
|
+
:userid, :string,
|
286
|
+
:userattr, PGPData,
|
287
|
+
:sig, PGPSig,
|
288
|
+
:ss_raw, PGPSSRaw,
|
289
|
+
:ss_trust, PGPSSTrust,
|
290
|
+
:ss_revocable, :uint,
|
291
|
+
:ss_time, :time_t,
|
292
|
+
:ss_issuer, [:uint8, PGP_KEY_ID_SIZE],
|
293
|
+
:ss_notation, PGPSSNotation,
|
294
|
+
:packet, PGPSubPacket,
|
295
|
+
:compressed, :pgp_compression_type_t,
|
296
|
+
:one_pass_sig, PGPOnePassSig,
|
297
|
+
:ss_skapref, PGPData,
|
298
|
+
:ss_hashpref, PGPData,
|
299
|
+
:ss_zpref, PGPData,
|
300
|
+
:ss_key_flags, PGPData,
|
301
|
+
:ss_key_server_prefs, PGPData,
|
302
|
+
:ss_primary_userid, :uint,
|
303
|
+
:ss_regexp, :string,
|
304
|
+
:ss_policy, :string,
|
305
|
+
:ss_keyserv, :string,
|
306
|
+
:ss_revocation_key, PGPSSRevocationKey,
|
307
|
+
:ss_userdef, PGPData,
|
308
|
+
:ss_unknown, PGPData,
|
309
|
+
:litdata_header, PGPLitDataHeader,
|
310
|
+
:litdata_body, PGPLitDataBody,
|
311
|
+
:mdc, PGPDynBody,
|
312
|
+
:ss_features, PGPData,
|
313
|
+
:ss_sig_target, PGPSSSigTarget,
|
314
|
+
:ss_embedded_sig, PGPData,
|
315
|
+
:ss_revocation, PGPSSRevocation,
|
316
|
+
:seckey, PGPSecKey,
|
317
|
+
:ss_signer, :pointer,
|
318
|
+
:armour_header, PGPArmourHeader,
|
319
|
+
:armour_trailer, :string,
|
320
|
+
:cleartext_head, PGPHeaders,
|
321
|
+
:cleartext_body, PGPFixedBody,
|
322
|
+
:cleartext_trailer, PGPHash,
|
323
|
+
:unarmoured_text, PGPDynBody,
|
324
|
+
:pk_sesskey, PGPPKSessKey,
|
325
|
+
:skey_passphrase, PGPSecKeyPassphrase,
|
326
|
+
:se_ip_data_header, :uint,
|
327
|
+
:se_ip_data_body, PGPDynBody,
|
328
|
+
:se_data_body, PGPFixedBody,
|
329
|
+
:get_seckey, PGPGetSecKey
|
330
|
+
end
|
331
|
+
|
332
|
+
class PGPPacket < FFI::Struct
|
333
|
+
layout :tag, :pgp_content_enum,
|
334
|
+
:critical, :uint8,
|
335
|
+
:u, PGPContents
|
336
|
+
end
|
337
|
+
|
338
|
+
callback :pgp_reader_func,
|
339
|
+
[:pointer, :pointer, :size_t, :pointer, :pointer, :pointer], :int
|
340
|
+
callback :pgp_reader_destroyer,
|
341
|
+
[:pointer], :void
|
342
|
+
callback :pgp_cbfunc_t,
|
343
|
+
[PGPPacket.by_ref, :pointer],
|
344
|
+
:pgp_cb_ret_t
|
345
|
+
|
346
|
+
class PGPReader < FFI::Struct
|
347
|
+
layout :reader, :pgp_reader_func,
|
348
|
+
:destroyer, :pgp_reader_destroyer,
|
349
|
+
:arg, :pointer,
|
350
|
+
:accumulate, :uint, # bitfield
|
351
|
+
:accumulated, :pointer,
|
352
|
+
:asize, :uint,
|
353
|
+
:alength, :uint,
|
354
|
+
:position, :uint,
|
355
|
+
:next, :pointer,
|
356
|
+
:parent, :pointer
|
357
|
+
end
|
358
|
+
|
359
|
+
class PGPCryptInfo < FFI::Struct
|
360
|
+
layout :passphrase, :pointer,
|
361
|
+
:secring, :pointer,
|
362
|
+
:keydata, :pointer,
|
363
|
+
:getpassphrase, :pointer,
|
364
|
+
:pubring, :pointer
|
365
|
+
end
|
366
|
+
|
367
|
+
class PGPPrintState < FFI::Struct
|
368
|
+
layout :unarmoured, :uint,
|
369
|
+
:skipipng, :uint,
|
370
|
+
:indent, :int
|
371
|
+
end
|
372
|
+
|
373
|
+
class PGPCBData < FFI::Struct
|
374
|
+
layout :cbfunc, :pointer,
|
375
|
+
:arg, :pointer,
|
376
|
+
:errors, :pointer,
|
377
|
+
:next, :pointer,
|
378
|
+
:output, :pointer,
|
379
|
+
:io, :pointer,
|
380
|
+
:passfp, :pointer,
|
381
|
+
:cryptinfo, PGPCryptInfo,
|
382
|
+
:printstate, PGPPrintState,
|
383
|
+
:sshseckey, :pointer,
|
384
|
+
:numtries, :int,
|
385
|
+
:gotpass, :int
|
386
|
+
end
|
387
|
+
|
388
|
+
class PGPCrypt < FFI::Struct
|
389
|
+
PGP_MAX_BLOCK_SIZE = 16
|
390
|
+
layout :alg, :pgp_symm_alg_t,
|
391
|
+
:blocksize, :size_t,
|
392
|
+
:keysize, :size_t,
|
393
|
+
:set_iv, :pointer,
|
394
|
+
:set_crypt_key, :pointer,
|
395
|
+
:base_init, :pointer,
|
396
|
+
:decrypt_resync, :pointer,
|
397
|
+
:block_encrypt, :pointer,
|
398
|
+
:block_decrypt, :pointer,
|
399
|
+
:cfb_encrypt, :pointer,
|
400
|
+
:cfb_decrypt, :pointer,
|
401
|
+
:decrypt_finish, :pointer,
|
402
|
+
:iv, [:uint8, PGP_MAX_BLOCK_SIZE],
|
403
|
+
:civ, [:uint8, PGP_MAX_BLOCK_SIZE],
|
404
|
+
:siv, [:uint8, PGP_MAX_BLOCK_SIZE],
|
405
|
+
:key, [:uint8, PGP_MAX_KEY_SIZE],
|
406
|
+
:num, :int,
|
407
|
+
:encrypt_key, :pointer,
|
408
|
+
:decrypt_key, :pointer
|
409
|
+
end
|
410
|
+
|
411
|
+
class PGPStream < FFI::ManagedStruct
|
412
|
+
NTAGS = 0x100
|
413
|
+
layout :ss_raw, [:uint8, NTAGS / 8],
|
414
|
+
:ss_parsed, [:uint8, NTAGS / 8],
|
415
|
+
:readinfo, PGPReader,
|
416
|
+
:cbinfo, PGPCBData,
|
417
|
+
:errors, :pointer,
|
418
|
+
:io, :pointer,
|
419
|
+
:decrypt, PGPCrypt,
|
420
|
+
:cryptinfo, PGPCryptInfo,
|
421
|
+
:hashc, :size_t,
|
422
|
+
:hashes, :pointer,
|
423
|
+
:flags, :uint, # bitfields
|
424
|
+
:virtualc, :uint,
|
425
|
+
:virtualoff, :uint,
|
426
|
+
:virtualpkt, :pointer
|
427
|
+
|
428
|
+
def self.release(ptr)
|
429
|
+
LibRNP::pgp_stream_delete(ptr)
|
430
|
+
end
|
431
|
+
end
|
432
|
+
|
433
|
+
class PGPIO < FFI::Struct
|
434
|
+
layout :outs, :pointer,
|
435
|
+
:errs, :pointer,
|
436
|
+
:res, :pointer
|
437
|
+
end
|
438
|
+
|
439
|
+
class PGPKeyring < FFI::ManagedStruct
|
440
|
+
layout :keyc, :uint,
|
441
|
+
:keyvsize, :uint,
|
442
|
+
:keys, :pointer,
|
443
|
+
:hashtype, :pgp_hash_alg_t
|
444
|
+
|
445
|
+
def self.release(ptr)
|
446
|
+
LibRNP::pgp_keyring_free(ptr)
|
447
|
+
LibC::free(ptr)
|
448
|
+
end
|
449
|
+
|
450
|
+
end
|
451
|
+
|
452
|
+
class PGPKeyDataKey < FFI::Union
|
453
|
+
layout :pubkey, PGPPubKey,
|
454
|
+
:seckey, PGPSecKey
|
455
|
+
end
|
456
|
+
|
457
|
+
class PGPFingerprint < FFI::Struct
|
458
|
+
layout :fingerprint, [:uint8, PGP_FINGERPRINT_SIZE],
|
459
|
+
:length, :uint,
|
460
|
+
:hashtype, :pgp_hash_alg_t
|
461
|
+
end
|
462
|
+
|
463
|
+
class PGPRevoke < FFI::Struct
|
464
|
+
layout :uid, :uint32,
|
465
|
+
:code, :uint8,
|
466
|
+
:reason, :string
|
467
|
+
end
|
468
|
+
|
469
|
+
class PGPKey < FFI::Struct
|
470
|
+
layout :uidc, :uint,
|
471
|
+
:uidvsize, :uint,
|
472
|
+
:uids, :pointer,
|
473
|
+
:packetc, :uint,
|
474
|
+
:packetvsize, :uint,
|
475
|
+
:packets, :pointer,
|
476
|
+
:subsigc, :uint,
|
477
|
+
:subsigvsize, :uint,
|
478
|
+
:subsigs, :pointer,
|
479
|
+
:revokec, :uint,
|
480
|
+
:revokevsize, :uint,
|
481
|
+
:revokes, :pointer,
|
482
|
+
:type, :pgp_content_enum,
|
483
|
+
:key, PGPKeyDataKey,
|
484
|
+
:sigkey, PGPPubKey,
|
485
|
+
:sigid, [:uint8, PGP_KEY_ID_SIZE],
|
486
|
+
:sigfingerprint, PGPFingerprint,
|
487
|
+
:enckey, PGPPubKey,
|
488
|
+
:encid, [:uint8, PGP_KEY_ID_SIZE],
|
489
|
+
:encfingerprint, PGPFingerprint,
|
490
|
+
:uid0, :uint32,
|
491
|
+
:revoked, :uint8,
|
492
|
+
:revocation, PGPRevoke
|
493
|
+
|
494
|
+
def self.release(ptr)
|
495
|
+
LibRNP::pgp_keydata_free(ptr)
|
496
|
+
end
|
497
|
+
end
|
498
|
+
|
499
|
+
class PGPMemory < FFI::Struct
|
500
|
+
layout :buf, :pointer,
|
501
|
+
:length, :size_t,
|
502
|
+
:allocated, :size_t,
|
503
|
+
:mmapped, :uint
|
504
|
+
end
|
505
|
+
|
506
|
+
class PGPValidation < FFI::ManagedStruct
|
507
|
+
layout :validc, :uint,
|
508
|
+
:valid_sigs, :pointer,
|
509
|
+
:invalidc, :uint,
|
510
|
+
:invalid_sigs, :pointer,
|
511
|
+
:unknownc, :uint,
|
512
|
+
:unknown_sigs, :pointer,
|
513
|
+
:birthtime, :time_t,
|
514
|
+
:duration, :time_t
|
515
|
+
|
516
|
+
def self.release(ptr)
|
517
|
+
LibRNP::pgp_validate_result_free(ptr)
|
518
|
+
end
|
519
|
+
end
|
520
|
+
|
521
|
+
class PGPWriter < FFI::Struct
|
522
|
+
layout :writer, :pointer,
|
523
|
+
:finaliser, :pointer,
|
524
|
+
:destroyer, :pointer,
|
525
|
+
:arg, :pointer,
|
526
|
+
:next, :pointer,
|
527
|
+
:io, :pointer
|
528
|
+
end
|
529
|
+
|
530
|
+
class PGPOutput < FFI::Struct
|
531
|
+
layout :writer, PGPWriter,
|
532
|
+
:errors, :pointer
|
533
|
+
end
|
534
|
+
|
535
|
+
class PGPFingerprint < FFI::Struct
|
536
|
+
layout :fingerprint, [:uint8, PGP_FINGERPRINT_SIZE],
|
537
|
+
:length, :uint,
|
538
|
+
:hashtype, :pgp_hash_alg_t
|
539
|
+
end
|
540
|
+
end
|
541
|
+
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require_relative 'libopenssl'
|
2
|
+
require_relative 'libc'
|
3
|
+
|
4
|
+
module LibRNP
|
5
|
+
|
6
|
+
# BIGNUM* to hexadecimal string
|
7
|
+
def self.bn2hex(bn)
|
8
|
+
str, ptr = LibOpenSSL::BN_bn2hex(bn)
|
9
|
+
LibC::free(ptr)
|
10
|
+
str
|
11
|
+
end
|
12
|
+
|
13
|
+
# Ruby Fixnum to BIGNUM*
|
14
|
+
def self.num2bn(num)
|
15
|
+
bn_ptr = FFI::MemoryPointer.new(:pointer)
|
16
|
+
hex = num.to_s(16)
|
17
|
+
ret = LibOpenSSL::BN_hex2bn(bn_ptr, hex)
|
18
|
+
raise 'Fixnum to BIGNUM conversion failed' if ret == 0
|
19
|
+
bn = bn_ptr.get_pointer(0)
|
20
|
+
bn_ptr.free
|
21
|
+
bn
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
data/lib/rnp/lowlevel.rb
ADDED
data/lib/rnp/version.rb
ADDED
data/lib/rnp.rb
ADDED
data/rnp/lib/rnp.rb
ADDED
data/rnp.gemspec
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'rnp/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "rnp"
|
8
|
+
spec.version = Rnp::VERSION
|
9
|
+
spec.authors = ["Ribose Inc."]
|
10
|
+
spec.email = ["open.source@ribose.com"]
|
11
|
+
|
12
|
+
spec.summary = %q{Ruby bindings for the rnp OpenPGP library}
|
13
|
+
spec.description = %q{Support rnp's OpenPGP functionality via ruby-ffi. Requires librnp.so.}
|
14
|
+
spec.homepage = "https://www.ribose.com"
|
15
|
+
|
16
|
+
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
17
|
+
# to allow pushing to a single host or delete this section to allow pushing to any host.
|
18
|
+
# if spec.respond_to?(:metadata)
|
19
|
+
# spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com'"
|
20
|
+
# else
|
21
|
+
# raise "RubyGems 2.0 or newer is required to protect against " \
|
22
|
+
# "public gem pushes."
|
23
|
+
# end
|
24
|
+
|
25
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
26
|
+
f.match(%r{^(test|spec|features)/})
|
27
|
+
end
|
28
|
+
spec.bindir = "exe"
|
29
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
30
|
+
spec.require_paths = ["lib"]
|
31
|
+
|
32
|
+
spec.add_development_dependency "bundler", "~> 1.14"
|
33
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
34
|
+
spec.add_development_dependency "rspec", "~> 3.5"
|
35
|
+
end
|