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.
Files changed (65) hide show
  1. data/examples/edit.rb +77 -0
  2. data/examples/genkey.rb +55 -0
  3. data/examples/keylist.rb +7 -0
  4. data/examples/roundtrip.rb +42 -0
  5. data/examples/sign.rb +31 -0
  6. data/examples/verify.rb +8 -0
  7. data/ext/gpgme/Makefile.in +55 -0
  8. data/ext/gpgme/extconf.rb +8 -0
  9. data/ext/gpgme/extract_enums.rb +88 -0
  10. data/ext/gpgme/gpgme-1.3.1.tar.bz2 +0 -0
  11. data/ext/gpgme/libassuan-2.0.2.tar.bz2 +0 -0
  12. data/ext/gpgme/libgpg-error-1.10.tar.bz2 +0 -0
  13. data/ext/gpgme/libgpgme_gem.so +0 -0
  14. data/lib/gpgme/compat.rb +48 -0
  15. data/lib/gpgme/constants.rb +187 -0
  16. data/lib/gpgme/crypto.rb +357 -0
  17. data/lib/gpgme/ctx.rb +462 -0
  18. data/lib/gpgme/data.rb +189 -0
  19. data/lib/gpgme/engine.rb +76 -0
  20. data/lib/gpgme/error.rb +66 -0
  21. data/lib/gpgme/ffi/ctx.rb +36 -0
  22. data/lib/gpgme/ffi/data.rb +24 -0
  23. data/lib/gpgme/ffi/decrypt_result.rb +14 -0
  24. data/lib/gpgme/ffi/encrypt_result.rb +22 -0
  25. data/lib/gpgme/ffi/engine_info.rb +17 -0
  26. data/lib/gpgme/ffi/enums.rb +687 -0
  27. data/lib/gpgme/ffi/functions.rb +364 -0
  28. data/lib/gpgme/ffi/import_result.rb +35 -0
  29. data/lib/gpgme/ffi/import_status.rb +15 -0
  30. data/lib/gpgme/ffi/invalid_key.rb +14 -0
  31. data/lib/gpgme/ffi/key.rb +60 -0
  32. data/lib/gpgme/ffi/key_sig.rb +20 -0
  33. data/lib/gpgme/ffi/library.rb +279 -0
  34. data/lib/gpgme/ffi/meta.rb +57 -0
  35. data/lib/gpgme/ffi/new_signature.rb +18 -0
  36. data/lib/gpgme/ffi/sig_notation.rb +12 -0
  37. data/lib/gpgme/ffi/sign_result.rb +33 -0
  38. data/lib/gpgme/ffi/signature.rb +35 -0
  39. data/lib/gpgme/ffi/sub_key.rb +27 -0
  40. data/lib/gpgme/ffi/trust_item.rb +31 -0
  41. data/lib/gpgme/ffi/user_id.rb +30 -0
  42. data/lib/gpgme/ffi/verify_result.rb +22 -0
  43. data/lib/gpgme/ffi.rb +22 -0
  44. data/lib/gpgme/io_callbacks.rb +21 -0
  45. data/lib/gpgme/key.rb +242 -0
  46. data/lib/gpgme/key_common.rb +43 -0
  47. data/lib/gpgme/key_sig.rb +35 -0
  48. data/lib/gpgme/misc.rb +66 -0
  49. data/lib/gpgme/signature.rb +85 -0
  50. data/lib/gpgme/sub_key.rb +58 -0
  51. data/lib/gpgme/user_id.rb +20 -0
  52. data/lib/gpgme/version.rb +3 -0
  53. data/lib/gpgme.rb +106 -0
  54. data/test/crypto_test.rb +246 -0
  55. data/test/ctx_test.rb +432 -0
  56. data/test/data_test.rb +129 -0
  57. data/test/files/testkey_pub.gpg +52 -0
  58. data/test/files/testkey_sec.gpg +54 -0
  59. data/test/gpgme_test.rb +12 -0
  60. data/test/key_test.rb +209 -0
  61. data/test/signature_test.rb +52 -0
  62. data/test/sub_key_test.rb +48 -0
  63. data/test/support/resources.rb +516 -0
  64. data/test/test_helper.rb +84 -0
  65. metadata +203 -0
@@ -0,0 +1,76 @@
1
+ module GPGME
2
+
3
+ ##
4
+ # Convenience methods to check different aspects of the gpg system
5
+ # installation.
6
+ module Engine
7
+ class << self
8
+
9
+ ##
10
+ # Verify that the engine implementing the protocol +proto+ is installed in
11
+ # the system. Can be one of +PROTOCOL_OpenPGP+ or +PROTOCOL_CMS+.
12
+ #
13
+ # @return [Boolean] true if the engine is installed.
14
+ #
15
+ # @example
16
+ # GPGME::Engine.check_version(GPGME::PROTOCOL_OpenPGP) # => true
17
+ #
18
+ def check_version(proto)
19
+ err = GPGME::gpgme_engine_check_version(proto)
20
+ exc = GPGME::error_to_exception(err)
21
+ !exc
22
+ end
23
+
24
+ ##
25
+ # Return an array of {GPGME::EngineInfo} structures of enabled engines.
26
+ #
27
+ # @example
28
+ # GPGME::Engine.info.first
29
+ # # => #<GPGME::EngineInfo:0x00000100d4fbd8
30
+ # @file_name="/usr/local/bin/gpg",
31
+ # @protocol=0,
32
+ # @req_version="1.3.0",
33
+ # @version="1.4.11">
34
+ #
35
+ def info
36
+ rinfo = []
37
+ GPGME::gpgme_get_engine_info(rinfo)
38
+ rinfo
39
+ end
40
+
41
+ ##
42
+ # Change the default configuration of the crypto engine implementing
43
+ # protocol +proto+.
44
+ #
45
+ # @param proto
46
+ # Can be one of +PROTOCOL_OpenPGP+ or +PROTOCOL_CMS+.
47
+ #
48
+ # @param file_name
49
+ # The file name of the executable program implementing the protocol.
50
+ #
51
+ # @param home_dir
52
+ # The directory name of the configuration directory.
53
+ #
54
+ # @example
55
+ # GPGME::Engine.set
56
+ #
57
+ def set_info(proto, file_name, home_dir)
58
+ err = GPGME::gpgme_set_engine_info(proto, file_name, home_dir)
59
+ exc = GPGME::error_to_exception(err)
60
+ raise exc if exc
61
+ end
62
+
63
+ ##
64
+ # Sets the home dir for the configuration options. This way one could,
65
+ # for example, load the keys from a customized keychain.
66
+ #
67
+ # @example
68
+ # GPGME::Engine.home_dir = '/tmp'
69
+ #
70
+ def home_dir=(home_dir)
71
+ current = info.first
72
+ set_info current.protocol, current.file_name, home_dir
73
+ end
74
+ end # class << self
75
+ end # class Engine
76
+ end # module GPGME
@@ -0,0 +1,66 @@
1
+ module GPGME
2
+ class Error < StandardError
3
+ def initialize(error)
4
+ @error = error
5
+ end
6
+ attr_reader :error
7
+
8
+ # Return the error code.
9
+ #
10
+ # The error code indicates the type of an error, or the reason why
11
+ # an operation failed.
12
+ def code
13
+ GPGME::gpgme_err_code(@error)
14
+ end
15
+
16
+ # Return the error source.
17
+ #
18
+ # The error source has not a precisely defined meaning. Sometimes
19
+ # it is the place where the error happened, sometimes it is the
20
+ # place where an error was encoded into an error value. Usually
21
+ # the error source will give an indication to where to look for
22
+ # the problem. This is not always true, but it is attempted to
23
+ # achieve this goal.
24
+ def source
25
+ GPGME::gpgme_err_source(@error)
26
+ end
27
+
28
+ # Return a description of the error code.
29
+ def message
30
+ GPGME::gpgme_strerror(@error)
31
+ end
32
+
33
+ class General < self; end
34
+ class InvalidValue < self; end
35
+ class UnusablePublicKey < self
36
+ attr_accessor :keys
37
+ end
38
+ class UnusableSecretKey < self
39
+ attr_accessor :keys
40
+ end
41
+ class NoData < self; end
42
+ class Conflict < self; end
43
+ class NotImplemented < self; end
44
+ class DecryptFailed < self; end
45
+ class BadPassphrase < self; end
46
+ class Canceled < self; end
47
+ class InvalidEngine < self; end
48
+ class AmbiguousName < self; end
49
+ class WrongKeyUsage < self
50
+ attr_accessor :key_usage
51
+ end
52
+ class CertificateRevoked < self; end
53
+ class CertificateExpired < self; end
54
+ class NoCRLKnown < self; end
55
+ class NoPolicyMatch < self; end
56
+ class NoSecretKey < self; end
57
+ class MissingCertificate < self; end
58
+ class BadCertificateChain < self; end
59
+ class UnsupportedAlgorithm < self
60
+ attr_accessor :algorithm
61
+ end
62
+ class BadSignature < self; end
63
+ class NoPublicKey < self; end
64
+ class InvalidVersion < self; end
65
+ end
66
+ end
@@ -0,0 +1,36 @@
1
+ module GPGME
2
+ class Ctx
3
+ attr_accessor :context_passphrase_callback
4
+ attr_accessor :context_progress_callback
5
+
6
+ class Pointer < FFI::AutoPointer
7
+ def self.release(ptr)
8
+ GPGME::Library.gpgme_release ptr
9
+ end
10
+ end
11
+
12
+ def self.new_from_struct(pointer)
13
+ instance = allocate
14
+
15
+ instance.instance_exec do
16
+ @context_passphrase_callback = [ nil, nil, nil ]
17
+ @context_progress_callback = [ nil, nil, nil ]
18
+
19
+ @ptr = Pointer.new pointer
20
+ end
21
+
22
+ instance
23
+ end
24
+
25
+ def release_pointer
26
+ raise ArgumentError, "released ctx" if @ptr.nil?
27
+ @ptr.free
28
+ @ptr = nil
29
+ end
30
+
31
+ def context_pointer
32
+ raise "context is already released" if @ptr.nil?
33
+ @ptr
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,24 @@
1
+ module GPGME
2
+ class Data
3
+ class Pointer < FFI::AutoPointer
4
+ def self.release(ptr)
5
+ GPGME::Library.gpgme_data_release ptr
6
+ end
7
+ end
8
+
9
+ def self.new_from_struct(pointer, cbs = nil)
10
+ instance = allocate
11
+
12
+ instance.instance_exec do
13
+ @ptr = Pointer.new pointer
14
+ @cbs = cbs
15
+ end
16
+
17
+ instance
18
+ end
19
+
20
+ def context_pointer
21
+ @ptr
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,14 @@
1
+ module GPGME
2
+ class DecryptResult
3
+ def self.new_from_struct(struct)
4
+ instance = allocate
5
+
6
+ instance.instance_exec do
7
+ @unsupported_algorithm = struct[:unsupported_algorithm]
8
+ @wrong_key_usage = (struct[:flags] >> 0) & 1
9
+ end
10
+
11
+ instance
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,22 @@
1
+ module GPGME
2
+ class EncryptResult
3
+ def self.new_from_struct(struct)
4
+ instance = allocate
5
+
6
+ instance.instance_exec do
7
+ @invalid_recipients = []
8
+
9
+ pointer = struct[:invalid_recipients]
10
+ until pointer.null?
11
+ key = Library::InvalidKey.new pointer
12
+
13
+ @invalid_recipients << InvalidKey.new_from_struct(key)
14
+
15
+ pointer = key[:next]
16
+ end
17
+ end
18
+
19
+ instance
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,17 @@
1
+ module GPGME
2
+ class EngineInfo
3
+ def self.new_from_struct(info)
4
+ instance = allocate
5
+
6
+ instance.instance_exec do
7
+ @protocol = info[:protocol]
8
+ @file_name = info[:file_name]
9
+ @version = info[:version]
10
+ @req_version = info[:req_version]
11
+ @home_dir = info[:home_dir]
12
+ end
13
+
14
+ instance
15
+ end
16
+ end
17
+ end