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.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +12 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +5 -0
  5. data/CODE_OF_CONDUCT.md +74 -0
  6. data/Gemfile +4 -0
  7. data/Gemfile.lock +26 -0
  8. data/README.adoc +208 -0
  9. data/Rakefile +6 -0
  10. data/Use_Cases.adoc +119 -0
  11. data/bin/console +14 -0
  12. data/bin/setup +8 -0
  13. data/example-usage.rb +766 -0
  14. data/examples/highlevel/decrypt_mem.rb +44 -0
  15. data/examples/highlevel/encrypt_mem.rb +46 -0
  16. data/examples/lowlevel/decrypt_file.rb +76 -0
  17. data/examples/lowlevel/decrypt_mem.rb +80 -0
  18. data/examples/lowlevel/encrypt_file.rb +68 -0
  19. data/examples/lowlevel/encrypt_mem.rb +75 -0
  20. data/examples/lowlevel/load_pubkey.rb +118 -0
  21. data/examples/lowlevel/print_keyring_file.rb +68 -0
  22. data/examples/lowlevel/print_keyring_mem.rb +96 -0
  23. data/examples/lowlevel/sign_file.rb +104 -0
  24. data/examples/lowlevel/sign_mem.rb +96 -0
  25. data/examples/lowlevel/verify_file.rb +55 -0
  26. data/examples/lowlevel/verify_mem.rb +61 -0
  27. data/lib/rnp/highlevel/constants.rb +96 -0
  28. data/lib/rnp/highlevel/keyring.rb +259 -0
  29. data/lib/rnp/highlevel/publickey.rb +150 -0
  30. data/lib/rnp/highlevel/secretkey.rb +318 -0
  31. data/lib/rnp/highlevel/utils.rb +119 -0
  32. data/lib/rnp/highlevel.rb +5 -0
  33. data/lib/rnp/lowlevel/constants.rb +11 -0
  34. data/lib/rnp/lowlevel/dynarray.rb +129 -0
  35. data/lib/rnp/lowlevel/enums.rb +243 -0
  36. data/lib/rnp/lowlevel/libc.rb +28 -0
  37. data/lib/rnp/lowlevel/libopenssl.rb +15 -0
  38. data/lib/rnp/lowlevel/librnp.rb +213 -0
  39. data/lib/rnp/lowlevel/structs.rb +541 -0
  40. data/lib/rnp/lowlevel/utils.rb +25 -0
  41. data/lib/rnp/lowlevel.rb +6 -0
  42. data/lib/rnp/version.rb +3 -0
  43. data/lib/rnp.rb +5 -0
  44. data/rnp/lib/rnp.rb +5 -0
  45. data/rnp/spec/rnp_spec.rb +11 -0
  46. data/rnp.gemspec +35 -0
  47. 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
+
@@ -0,0 +1,6 @@
1
+ require_relative 'lowlevel/librnp'
2
+ require_relative 'lowlevel/libc'
3
+ require_relative 'lowlevel/libopenssl'
4
+ require_relative 'lowlevel/dynarray'
5
+ require_relative 'lowlevel/utils'
6
+
@@ -0,0 +1,3 @@
1
+ module Rnp
2
+ VERSION = "0.2.0"
3
+ end
data/lib/rnp.rb ADDED
@@ -0,0 +1,5 @@
1
+ require "rnp/version"
2
+
3
+ require_relative 'rnp/lowlevel'
4
+ require_relative 'rnp/highlevel'
5
+
data/rnp/lib/rnp.rb ADDED
@@ -0,0 +1,5 @@
1
+ require "rnp/version"
2
+
3
+ module Rnp
4
+ # Your code goes here...
5
+ end
@@ -0,0 +1,11 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Rnp do
4
+ it "has a version number" do
5
+ expect(Rnp::VERSION).not_to be nil
6
+ end
7
+
8
+ it "does something useful" do
9
+ expect(false).to eq(true)
10
+ end
11
+ end
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