rnp 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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