gpgme-loongson 2.0.18

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.
@@ -0,0 +1,108 @@
1
+ $:.push File.expand_path("../..", __FILE__) # C extension is in the root
2
+
3
+ require 'gpgme_n'
4
+
5
+ # TODO without this call one can't GPGME::Ctx.new, find out why
6
+ GPGME::gpgme_check_version(nil)
7
+
8
+ require 'gpgme/constants'
9
+ require 'gpgme/ctx'
10
+ require 'gpgme/data'
11
+ require 'gpgme/error'
12
+ require 'gpgme/io_callbacks'
13
+ require 'gpgme/key_common'
14
+ require 'gpgme/key'
15
+ require 'gpgme/sub_key'
16
+ require 'gpgme/key_sig'
17
+ require 'gpgme/misc'
18
+ require 'gpgme/signature'
19
+ require 'gpgme/user_id'
20
+ require 'gpgme/engine'
21
+ require 'gpgme/crypto'
22
+
23
+ module GPGME
24
+ class << self
25
+
26
+ # From the c extension
27
+ alias pubkey_algo_name gpgme_pubkey_algo_name
28
+ alias hash_algo_name gpgme_hash_algo_name
29
+
30
+ ##
31
+ # Auxiliary method used by all the library to generate exceptions
32
+ # from error codes returned by the C extension.
33
+ def error_to_exception(err)
34
+ case GPGME::gpgme_err_code(err)
35
+ when GPG_ERR_EOF
36
+ EOFError.new
37
+ when GPG_ERR_NO_ERROR
38
+ nil
39
+ when GPG_ERR_GENERAL
40
+ Error::General.new(err)
41
+ when GPG_ERR_ENOMEM
42
+ Errno::ENOMEM.new
43
+ when GPG_ERR_INV_VALUE
44
+ Error::InvalidValue.new(err)
45
+ when GPG_ERR_UNUSABLE_PUBKEY
46
+ Error::UnusablePublicKey.new(err)
47
+ when GPG_ERR_UNUSABLE_SECKEY
48
+ Error::UnusableSecretKey.new(err)
49
+ when GPG_ERR_NO_DATA
50
+ Error::NoData.new(err)
51
+ when GPG_ERR_CONFLICT
52
+ Error::Conflict.new(err)
53
+ when GPG_ERR_NOT_IMPLEMENTED
54
+ Error::NotImplemented.new(err)
55
+ when GPG_ERR_DECRYPT_FAILED
56
+ Error::DecryptFailed.new(err)
57
+ when GPG_ERR_BAD_PASSPHRASE
58
+ Error::BadPassphrase.new(err)
59
+ when GPG_ERR_CANCELED
60
+ Error::Canceled.new(err)
61
+ when GPG_ERR_INV_ENGINE
62
+ Error::InvalidEngine.new(err)
63
+ when GPG_ERR_AMBIGUOUS_NAME
64
+ Error::AmbiguousName.new(err)
65
+ when GPG_ERR_WRONG_KEY_USAGE
66
+ Error::WrongKeyUsage.new(err)
67
+ when GPG_ERR_CERT_REVOKED
68
+ Error::CertificateRevoked.new(err)
69
+ when GPG_ERR_CERT_EXPIRED
70
+ Error::CertificateExpired.new(err)
71
+ when GPG_ERR_NO_CRL_KNOWN
72
+ Error::NoCRLKnown.new(err)
73
+ when GPG_ERR_NO_POLICY_MATCH
74
+ Error::NoPolicyMatch.new(err)
75
+ when GPG_ERR_NO_SECKEY
76
+ Error::NoSecretKey.new(err)
77
+ when GPG_ERR_MISSING_CERT
78
+ Error::MissingCertificate.new(err)
79
+ when GPG_ERR_BAD_CERT_CHAIN
80
+ Error::BadCertificateChain.new(err)
81
+ when GPG_ERR_UNSUPPORTED_ALGORITHM
82
+ Error::UnsupportedAlgorithm.new(err)
83
+ when GPG_ERR_BAD_SIGNATURE
84
+ Error::BadSignature.new(err)
85
+ when GPG_ERR_NO_PUBKEY
86
+ Error::NoPublicKey.new(err)
87
+ else
88
+ Error.new(err)
89
+ end
90
+ end
91
+
92
+ ##
93
+ # TODO find out what it does, can't seem to find a proper parameter that
94
+ # returns something other than nil.
95
+ def check_version(options = nil)
96
+ version = nil
97
+ if options.kind_of?(String)
98
+ version = options
99
+ elsif options.include?(:version)
100
+ version = options[:version]
101
+ end
102
+ unless GPGME::gpgme_check_version(version)
103
+ raise Error::InvalidVersion.new
104
+ end
105
+ end
106
+
107
+ end
108
+ end
@@ -0,0 +1,48 @@
1
+ require 'gpgme'
2
+
3
+ # TODO: Find why is this needed. I guess the name compat means it's just
4
+ # backwards compatibility. Consider removing?
5
+ module GPGME
6
+ GpgmeError = Error
7
+ GpgmeData = Data
8
+ GpgmeEngineInfo = EngineInfo
9
+ GpgmeCtx = Ctx
10
+ GpgmeKey = Key
11
+ GpgmeSubKey = SubKey
12
+ GpgmeUserID = UserID
13
+ GpgmeKeySig = KeySig
14
+ GpgmeVerifyResult = VerifyResult
15
+ GpgmeSignature = Signature
16
+ GpgmeDecryptResult = DecryptResult
17
+ GpgmeSignResult = SignResult
18
+ GpgmeEncryptResult = EncryptResult
19
+ GpgmeInvalidKey = InvalidKey
20
+ GpgmeNewSignature = NewSignature
21
+ GpgmeImportStatus = ImportStatus
22
+ GpgmeImportResult = ImportResult
23
+
24
+ class Ctx
25
+ # Set the data pointer to the beginning.
26
+ def rewind
27
+ seek(0)
28
+ end
29
+ end
30
+
31
+ def gpgme_data_rewind(dh)
32
+ begin
33
+ GPGME::gpgme_data_seek(dh, 0, IO::SEEK_SET)
34
+ rescue SystemCallError => e
35
+ return e.errno
36
+ end
37
+ end
38
+ module_function :gpgme_data_rewind
39
+
40
+ def gpgme_op_import_ext(ctx, keydata, nr)
41
+ err = GPGME::gpgme_op_import(ctx, keydata)
42
+ if GPGME::gpgme_err_code(err) == GPGME::GPG_ERR_NO_ERROR
43
+ result = GPGME::gpgme_op_import_result(ctx)
44
+ nr.push(result.considered)
45
+ end
46
+ end
47
+ module_function :gpgme_op_import_ext
48
+ end
@@ -0,0 +1,268 @@
1
+ module GPGME
2
+
3
+ ATTR_ALGO = GPGME_ATTR_ALGO
4
+ ATTR_CAN_CERTIFY = GPGME_ATTR_CAN_CERTIFY
5
+ ATTR_CAN_ENCRYPT = GPGME_ATTR_CAN_ENCRYPT
6
+ ATTR_CAN_SIGN = GPGME_ATTR_CAN_SIGN
7
+ ATTR_CHAINID = GPGME_ATTR_CHAINID
8
+ ATTR_COMMENT = GPGME_ATTR_COMMENT
9
+ ATTR_CREATED = GPGME_ATTR_CREATED
10
+ ATTR_EMAIL = GPGME_ATTR_EMAIL
11
+ ATTR_ERRTOK = GPGME_ATTR_ERRTOK
12
+ ATTR_EXPIRE = GPGME_ATTR_EXPIRE
13
+ ATTR_FPR = GPGME_ATTR_FPR
14
+ ATTR_ISSUER = GPGME_ATTR_ISSUER
15
+ ATTR_IS_SECRET = GPGME_ATTR_IS_SECRET
16
+ ATTR_KEYID = GPGME_ATTR_KEYID
17
+ ATTR_KEY_CAPS = GPGME_ATTR_KEY_CAPS
18
+ ATTR_KEY_DISABLED = GPGME_ATTR_KEY_DISABLED
19
+ ATTR_KEY_EXPIRED = GPGME_ATTR_KEY_EXPIRED
20
+ ATTR_KEY_INVALID = GPGME_ATTR_KEY_INVALID
21
+ ATTR_KEY_REVOKED = GPGME_ATTR_KEY_REVOKED
22
+ ATTR_LEN = GPGME_ATTR_LEN
23
+ ATTR_LEVEL = GPGME_ATTR_LEVEL
24
+ ATTR_NAME = GPGME_ATTR_NAME
25
+ ATTR_OTRUST = GPGME_ATTR_OTRUST
26
+ ATTR_SERIAL = GPGME_ATTR_SERIAL
27
+ ATTR_SIG_STATUS = GPGME_ATTR_SIG_STATUS
28
+ ATTR_SIG_SUMMARY = GPGME_ATTR_SIG_SUMMARY
29
+ ATTR_TYPE = GPGME_ATTR_TYPE
30
+ ATTR_UID_INVALID = GPGME_ATTR_UID_INVALID
31
+ ATTR_UID_REVOKED = GPGME_ATTR_UID_REVOKED
32
+ ATTR_USERID = GPGME_ATTR_USERID
33
+ ATTR_VALIDITY = GPGME_ATTR_VALIDITY
34
+ DATA_ENCODING_ARMOR = GPGME_DATA_ENCODING_ARMOR
35
+ DATA_ENCODING_BASE64 = GPGME_DATA_ENCODING_BASE64
36
+ DATA_ENCODING_BINARY = GPGME_DATA_ENCODING_BINARY
37
+ DATA_ENCODING_NONE = GPGME_DATA_ENCODING_NONE
38
+ ENCRYPT_ALWAYS_TRUST = GPGME_ENCRYPT_ALWAYS_TRUST
39
+ if defined?(GPGME_ENCRYPT_NO_ENCRYPT_TO)
40
+ ENCRYPT_NO_ENCRYPT_TO = GPGME_ENCRYPT_NO_ENCRYPT_TO
41
+ end
42
+ IMPORT_NEW = GPGME_IMPORT_NEW
43
+ IMPORT_SECRET = GPGME_IMPORT_SECRET
44
+ IMPORT_SIG = GPGME_IMPORT_SIG
45
+ IMPORT_SUBKEY = GPGME_IMPORT_SUBKEY
46
+ IMPORT_UID = GPGME_IMPORT_UID
47
+ KEYLIST_MODE_EXTERN = GPGME_KEYLIST_MODE_EXTERN
48
+ KEYLIST_MODE_LOCAL = GPGME_KEYLIST_MODE_LOCAL
49
+ KEYLIST_MODE_SIGS = GPGME_KEYLIST_MODE_SIGS
50
+ KEYLIST_MODE_VALIDATE = GPGME_KEYLIST_MODE_VALIDATE
51
+ if defined?(GPGME_KEYLIST_MODE_SIG_NOTATIONS)
52
+ KEYLIST_MODE_SIG_NOTATIONS = GPGME_KEYLIST_MODE_SIG_NOTATIONS
53
+ end
54
+ if defined?(GPGME_KEYLIST_MODE_EPHEMERAL)
55
+ KEYLIST_MODE_EPHEMERAL = GPGME_KEYLIST_MODE_EPHEMERAL
56
+ end
57
+ if defined?(GPGME_KEYLIST_MODE_WITH_SECRET)
58
+ KEYLIST_MODE_WITH_SECRET = GPGME_KEYLIST_MODE_WITH_SECRET
59
+ end
60
+ MD_CRC24_RFC2440 = GPGME_MD_CRC24_RFC2440
61
+ MD_CRC32 = GPGME_MD_CRC32
62
+ MD_CRC32_RFC1510 = GPGME_MD_CRC32_RFC1510
63
+ MD_HAVAL = GPGME_MD_HAVAL
64
+ MD_MD2 = GPGME_MD_MD2
65
+ MD_MD4 = GPGME_MD_MD4
66
+ MD_MD5 = GPGME_MD_MD5
67
+ MD_RMD160 = GPGME_MD_RMD160
68
+ MD_SHA1 = GPGME_MD_SHA1
69
+ MD_SHA256 = GPGME_MD_SHA256
70
+ if defined?(MD_SHA224)
71
+ MD_SHA224 = GPGME_MD_SHA224
72
+ end
73
+ MD_SHA384 = GPGME_MD_SHA384
74
+ MD_SHA512 = GPGME_MD_SHA512
75
+ MD_TIGER = GPGME_MD_TIGER
76
+ if defined?(gpgme_set_pinentry_mode)
77
+ PINENTRY_MODE_DEFAULT = GPGME_PINENTRY_MODE_DEFAULT
78
+ PINENTRY_MODE_ASK = GPGME_PINENTRY_MODE_ASK
79
+ PINENTRY_MODE_CANCEL = GPGME_PINENTRY_MODE_CANCEL
80
+ PINENTRY_MODE_ERROR = GPGME_PINENTRY_MODE_ERROR
81
+ PINENTRY_MODE_LOOPBACK = GPGME_PINENTRY_MODE_LOOPBACK
82
+ PINENTRY_MODE_NAMES = {
83
+ PINENTRY_MODE_DEFAULT => :default,
84
+ PINENTRY_MODE_ASK => :ask,
85
+ PINENTRY_MODE_CANCEL => :cancel,
86
+ PINENTRY_MODE_ERROR => :error,
87
+ PINENTRY_MODE_LOOPBACK => :loopback
88
+ }
89
+ end
90
+ PK_DSA = GPGME_PK_DSA
91
+ PK_ELG = GPGME_PK_ELG
92
+ PK_ELG_E = GPGME_PK_ELG_E
93
+ PK_RSA = GPGME_PK_RSA
94
+ if defined?(GPGME_PK_ECC)
95
+ PK_ECC = GPGME_PK_ECC
96
+ end
97
+ PROTOCOL_CMS = GPGME_PROTOCOL_CMS
98
+ PROTOCOL_OpenPGP = GPGME_PROTOCOL_OpenPGP
99
+ SIGSUM_BAD_POLICY = GPGME_SIGSUM_BAD_POLICY
100
+ SIGSUM_CRL_MISSING = GPGME_SIGSUM_CRL_MISSING
101
+ SIGSUM_CRL_TOO_OLD = GPGME_SIGSUM_CRL_TOO_OLD
102
+ SIGSUM_GREEN = GPGME_SIGSUM_GREEN
103
+ SIGSUM_KEY_EXPIRED = GPGME_SIGSUM_KEY_EXPIRED
104
+ SIGSUM_KEY_MISSING = GPGME_SIGSUM_KEY_MISSING
105
+ SIGSUM_KEY_REVOKED = GPGME_SIGSUM_KEY_REVOKED
106
+ SIGSUM_RED = GPGME_SIGSUM_RED
107
+ SIGSUM_SIG_EXPIRED = GPGME_SIGSUM_SIG_EXPIRED
108
+ SIGSUM_SYS_ERROR = GPGME_SIGSUM_SYS_ERROR
109
+ SIGSUM_VALID = GPGME_SIGSUM_VALID
110
+ SIG_MODE_CLEAR = GPGME_SIG_MODE_CLEAR
111
+ SIG_MODE_DETACH = GPGME_SIG_MODE_DETACH
112
+ SIG_MODE_NORMAL = GPGME_SIG_MODE_NORMAL
113
+ SIG_STAT_BAD = GPGME_SIG_STAT_BAD
114
+ SIG_STAT_DIFF = GPGME_SIG_STAT_DIFF
115
+ SIG_STAT_ERROR = GPGME_SIG_STAT_ERROR
116
+ SIG_STAT_GOOD = GPGME_SIG_STAT_GOOD
117
+ SIG_STAT_GOOD_EXP = GPGME_SIG_STAT_GOOD_EXP
118
+ SIG_STAT_GOOD_EXPKEY = GPGME_SIG_STAT_GOOD_EXPKEY
119
+ SIG_STAT_NOKEY = GPGME_SIG_STAT_NOKEY
120
+ SIG_STAT_NONE = GPGME_SIG_STAT_NONE
121
+ SIG_STAT_NOSIG = GPGME_SIG_STAT_NOSIG
122
+ STATUS_ABORT = GPGME_STATUS_ABORT
123
+ STATUS_ALREADY_SIGNED = GPGME_STATUS_ALREADY_SIGNED
124
+ STATUS_BADARMOR = GPGME_STATUS_BADARMOR
125
+ STATUS_BADMDC = GPGME_STATUS_BADMDC
126
+ STATUS_BADSIG = GPGME_STATUS_BADSIG
127
+ STATUS_BAD_PASSPHRASE = GPGME_STATUS_BAD_PASSPHRASE
128
+ STATUS_BEGIN_DECRYPTION = GPGME_STATUS_BEGIN_DECRYPTION
129
+ STATUS_BEGIN_ENCRYPTION = GPGME_STATUS_BEGIN_ENCRYPTION
130
+ STATUS_BEGIN_STREAM = GPGME_STATUS_BEGIN_STREAM
131
+ STATUS_DECRYPTION_FAILED = GPGME_STATUS_DECRYPTION_FAILED
132
+ STATUS_DECRYPTION_OKAY = GPGME_STATUS_DECRYPTION_OKAY
133
+ STATUS_DELETE_PROBLEM = GPGME_STATUS_DELETE_PROBLEM
134
+ STATUS_ENC_TO = GPGME_STATUS_ENC_TO
135
+ STATUS_END_DECRYPTION = GPGME_STATUS_END_DECRYPTION
136
+ STATUS_END_ENCRYPTION = GPGME_STATUS_END_ENCRYPTION
137
+ STATUS_END_STREAM = GPGME_STATUS_END_STREAM
138
+ STATUS_ENTER = GPGME_STATUS_ENTER
139
+ STATUS_EOF = GPGME_STATUS_EOF
140
+ STATUS_ERRMDC = GPGME_STATUS_ERRMDC
141
+ STATUS_ERROR = GPGME_STATUS_ERROR
142
+ STATUS_ERRSIG = GPGME_STATUS_ERRSIG
143
+ STATUS_EXPKEYSIG = GPGME_STATUS_EXPKEYSIG
144
+ STATUS_EXPSIG = GPGME_STATUS_EXPSIG
145
+ STATUS_FILE_DONE = GPGME_STATUS_FILE_DONE
146
+ STATUS_FILE_ERROR = GPGME_STATUS_FILE_ERROR
147
+ STATUS_FILE_START = GPGME_STATUS_FILE_START
148
+ STATUS_GET_BOOL = GPGME_STATUS_GET_BOOL
149
+ STATUS_GET_HIDDEN = GPGME_STATUS_GET_HIDDEN
150
+ STATUS_GET_LINE = GPGME_STATUS_GET_LINE
151
+ STATUS_GOODMDC = GPGME_STATUS_GOODMDC
152
+ STATUS_GOODSIG = GPGME_STATUS_GOODSIG
153
+ STATUS_GOOD_PASSPHRASE = GPGME_STATUS_GOOD_PASSPHRASE
154
+ STATUS_GOT_IT = GPGME_STATUS_GOT_IT
155
+ STATUS_IMPORTED = GPGME_STATUS_IMPORTED
156
+ STATUS_IMPORT_RES = GPGME_STATUS_IMPORT_RES
157
+ STATUS_INV_RECP = GPGME_STATUS_INV_RECP
158
+ STATUS_KEYEXPIRED = GPGME_STATUS_KEYEXPIRED
159
+ STATUS_KEYREVOKED = GPGME_STATUS_KEYREVOKED
160
+ STATUS_KEY_CREATED = GPGME_STATUS_KEY_CREATED
161
+ STATUS_LEAVE = GPGME_STATUS_LEAVE
162
+ STATUS_MISSING_PASSPHRASE = GPGME_STATUS_MISSING_PASSPHRASE
163
+ STATUS_NEED_PASSPHRASE = GPGME_STATUS_NEED_PASSPHRASE
164
+ STATUS_NEED_PASSPHRASE_SYM = GPGME_STATUS_NEED_PASSPHRASE_SYM
165
+ STATUS_NODATA = GPGME_STATUS_NODATA
166
+ STATUS_NOTATION_DATA = GPGME_STATUS_NOTATION_DATA
167
+ STATUS_NOTATION_NAME = GPGME_STATUS_NOTATION_NAME
168
+ STATUS_NO_PUBKEY = GPGME_STATUS_NO_PUBKEY
169
+ STATUS_NO_RECP = GPGME_STATUS_NO_RECP
170
+ STATUS_NO_SECKEY = GPGME_STATUS_NO_SECKEY
171
+ if defined?(GPGME_STATUS_PKA_TRUST_BAD)
172
+ STATUS_PKA_TRUST_BAD = GPGME_STATUS_PKA_TRUST_BAD
173
+ end
174
+ if defined?(GPGME_STATUS_PKA_TRUST_GOOD)
175
+ STATUS_PKA_TRUST_GOOD = GPGME_STATUS_PKA_TRUST_GOOD
176
+ end
177
+ if defined?(GPGME_STATUS_PLAINTEXT_LENGTH)
178
+ STATUS_PLAINTEXT_LENGTH = GPGME_STATUS_PLAINTEXT_LENGTH
179
+ end
180
+ if defined?(GPGME_STATUS_MOUNTPOINT)
181
+ STATUS_MOUNTPOINT = GPGME_STATUS_MOUNTPOINT
182
+ end
183
+ if defined?(GPGME_STATUS_PINENTRY_LAUNCHED)
184
+ STATUS_PINENTRY_LAUNCHED = GPGME_STATUS_PINENTRY_LAUNCHED
185
+ end
186
+ if defined?(GPGME_STATUS_ATTRIBUTE)
187
+ STATUS_ATTRIBUTE = GPGME_STATUS_ATTRIBUTE
188
+ end
189
+ if defined?(GPGME_STATUS_BEGIN_SIGNING)
190
+ STATUS_BEGIN_SIGNING = GPGME_STATUS_BEGIN_SIGNING
191
+ end
192
+ if defined?(GPGME_STATUS_KEY_NOT_CREATED)
193
+ STATUS_KEY_NOT_CREATED = GPGME_STATUS_KEY_NOT_CREATED
194
+ end
195
+ STATUS_POLICY_URL = GPGME_STATUS_POLICY_URL
196
+ STATUS_PROGRESS = GPGME_STATUS_PROGRESS
197
+ STATUS_RSA_OR_IDEA = GPGME_STATUS_RSA_OR_IDEA
198
+ STATUS_SESSION_KEY = GPGME_STATUS_SESSION_KEY
199
+ STATUS_SHM_GET = GPGME_STATUS_SHM_GET
200
+ STATUS_SHM_GET_BOOL = GPGME_STATUS_SHM_GET_BOOL
201
+ STATUS_SHM_GET_HIDDEN = GPGME_STATUS_SHM_GET_HIDDEN
202
+ STATUS_SHM_INFO = GPGME_STATUS_SHM_INFO
203
+ STATUS_SIGEXPIRED = GPGME_STATUS_SIGEXPIRED
204
+ STATUS_SIG_CREATED = GPGME_STATUS_SIG_CREATED
205
+ STATUS_SIG_ID = GPGME_STATUS_SIG_ID
206
+ STATUS_TRUNCATED = GPGME_STATUS_TRUNCATED
207
+ STATUS_TRUST_FULLY = GPGME_STATUS_TRUST_FULLY
208
+ STATUS_TRUST_MARGINAL = GPGME_STATUS_TRUST_MARGINAL
209
+ STATUS_TRUST_NEVER = GPGME_STATUS_TRUST_NEVER
210
+ STATUS_TRUST_ULTIMATE = GPGME_STATUS_TRUST_ULTIMATE
211
+ STATUS_TRUST_UNDEFINED = GPGME_STATUS_TRUST_UNDEFINED
212
+ STATUS_UNEXPECTED = GPGME_STATUS_UNEXPECTED
213
+ STATUS_USERID_HINT = GPGME_STATUS_USERID_HINT
214
+ STATUS_VALIDSIG = GPGME_STATUS_VALIDSIG
215
+ VALIDITY_FULL = GPGME_VALIDITY_FULL
216
+ VALIDITY_MARGINAL = GPGME_VALIDITY_MARGINAL
217
+ VALIDITY_NEVER = GPGME_VALIDITY_NEVER
218
+ VALIDITY_ULTIMATE = GPGME_VALIDITY_ULTIMATE
219
+ VALIDITY_UNDEFINED = GPGME_VALIDITY_UNDEFINED
220
+ VALIDITY_UNKNOWN = GPGME_VALIDITY_UNKNOWN
221
+
222
+ PROTOCOL_NAMES = {
223
+ PROTOCOL_OpenPGP => :OpenPGP,
224
+ PROTOCOL_CMS => :CMS
225
+ }
226
+
227
+ if defined?(GPGME_PROTOCOL_ASSUAN)
228
+ PROTOCOL_ASSUAN = GPGME_PROTOCOL_ASSUAN
229
+ PROTOCOL_NAMES[PROTOCOL_ASSUAN] = :ASSUAN
230
+ end
231
+
232
+ if defined?(GPGME_PROTOCOL_SPAWN)
233
+ PROTOCOL_SPAWN = GPGME_PROTOCOL_SPAWN
234
+ PROTOCOL_NAMES[PROTOCOL_SPAWN] = :SPAWN
235
+ SPAWN_DETACHED = GPGME_SPAWN_DETACHED
236
+ SPAWN_ALLOW_SET_FG = GPGME_SPAWN_ALLOW_SET_FG
237
+ end
238
+
239
+ if defined?(GPGME_EXPORT_MODE_EXTERN)
240
+ EXPORT_MODE_EXTERN = GPGME_EXPORT_MODE_EXTERN
241
+ end
242
+
243
+ if defined?(GPGME_EXPORT_MODE_MINIMAL)
244
+ EXPORT_MODE_MINIMAL = GPGME_EXPORT_MODE_MINIMAL
245
+ end
246
+
247
+ if defined?(GPGME_EXPORT_MODE_SECRET)
248
+ EXPORT_MODE_SECRET = GPGME_EXPORT_MODE_SECRET
249
+ EXPORT_MODE_RAW = GPGME_EXPORT_MODE_RAW
250
+ EXPORT_MODE_PKCS12 = GPGME_EXPORT_MODE_PKCS12
251
+ end
252
+
253
+ KEYLIST_MODE_NAMES = {
254
+ KEYLIST_MODE_LOCAL => :local,
255
+ KEYLIST_MODE_EXTERN => :extern,
256
+ KEYLIST_MODE_SIGS => :sigs,
257
+ KEYLIST_MODE_VALIDATE => :validate
258
+ }
259
+
260
+ VALIDITY_NAMES = {
261
+ VALIDITY_UNKNOWN => :unknown,
262
+ VALIDITY_UNDEFINED => :undefined,
263
+ VALIDITY_NEVER => :never,
264
+ VALIDITY_MARGINAL => :marginal,
265
+ VALIDITY_FULL => :full,
266
+ VALIDITY_ULTIMATE => :ultimate
267
+ }
268
+ end
@@ -0,0 +1,357 @@
1
+ module GPGME
2
+
3
+ ##
4
+ # Different, independent methods providing the simplest possible API to
5
+ # execute crypto operations via GPG. All methods accept as options the same
6
+ # common options as {GPGME::Ctx.new}. Read the documentation for that class to
7
+ # know how to customize things further (like output stuff in ASCII armored
8
+ # format, for example).
9
+ #
10
+ # @example
11
+ # crypto = GPGME::Crypto.new :armor => true
12
+ # encrypted = crypto.encrypt 'Plain text'
13
+ #
14
+ class Crypto
15
+
16
+ attr_reader :default_options
17
+
18
+ def initialize(options = {})
19
+ @default_options = options
20
+ end
21
+
22
+ ##
23
+ # Encrypts an element
24
+ #
25
+ # crypto.encrypt something, options
26
+ #
27
+ # Will return a {GPGME::Data} element which can then be read.
28
+ #
29
+ # Must have some key imported, look for {GPGME::Key.import} to know how
30
+ # to import one, or the gpg documentation to know how to create one
31
+ #
32
+ # @param plain
33
+ # Must be something that can be converted into a {GPGME::Data} object, or
34
+ # a {GPGME::Data} object itself.
35
+ #
36
+ # @param [Hash] options
37
+ # The optional parameters are as follows:
38
+ # * +:recipients+ for which recipient do you want to encrypt this file. It
39
+ # will pick the first one available if none specified. Can be an array of
40
+ # identifiers or just one (a string).
41
+ # * +:symmetric+ if set to true, will ignore +:recipients+, and will perform
42
+ # a symmetric encryption. Must provide a password via the +:password+
43
+ # option.
44
+ # * +:always_trust+ if set to true specifies all the recipients to be
45
+ # trusted, thus not requiring confirmation.
46
+ # * +:sign+ if set to true, performs a combined sign and encrypt operation.
47
+ # * +:signers+ if +:sign+ specified to true, a list of additional possible
48
+ # signers. Must be an array of sign identifiers.
49
+ # * +:output+ if specified, it will write the output into it. It will be
50
+ # converted to a {GPGME::Data} object, so it could be a file for example.
51
+ # * Any other option accepted by {GPGME::Ctx.new}
52
+ #
53
+ # @return [GPGME::Data] a {GPGME::Data} object that can be read.
54
+ #
55
+ # @example returns a {GPGME::Data} that can be later encrypted
56
+ # encrypted = crypto.encrypt "Hello world!"
57
+ # encrypted.read # => Encrypted stuff
58
+ #
59
+ # @example to be decrypted by someone@example.com.
60
+ # crypto.encrypt "Hello", :recipients => "someone@example.com"
61
+ #
62
+ # @example If I didn't trust any of my keys by default
63
+ # crypto.encrypt "Hello" # => GPGME::Error::General
64
+ # crypto.encrypt "Hello", :always_trust => true # => Will work fine
65
+ #
66
+ # @example encrypted string that can be decrypted and/or *verified*
67
+ # crypto.encrypt "Hello", :sign => true
68
+ #
69
+ # @example multiple signers
70
+ # crypto.encrypt "Hello", :sign => true, :signers => "extra@example.com"
71
+ #
72
+ # @example writing to a file instead
73
+ # file = File.open("signed.sec","w+")
74
+ # crypto.encrypt "Hello", :output => file # output written to signed.sec
75
+ #
76
+ # @raise [GPGME::Error::General] when trying to encrypt with a key that is
77
+ # not trusted, and +:always_trust+ wasn't specified
78
+ #
79
+ def encrypt(plain, options = {})
80
+ options = @default_options.merge options
81
+
82
+ plain_data = Data.new(plain)
83
+ cipher_data = Data.new(options[:output])
84
+ keys = Key.find(:public, options[:recipients])
85
+ keys = nil if options[:symmetric]
86
+
87
+ flags = 0
88
+ flags |= GPGME::ENCRYPT_ALWAYS_TRUST if options[:always_trust]
89
+
90
+ GPGME::Ctx.new(options) do |ctx|
91
+ begin
92
+ if options[:sign]
93
+ if options[:signers]
94
+ signers = Key.find(:public, options[:signers], :sign)
95
+ ctx.add_signer(*signers)
96
+ end
97
+ ctx.encrypt_sign(keys, plain_data, cipher_data, flags)
98
+ else
99
+ ctx.encrypt(keys, plain_data, cipher_data, flags)
100
+ end
101
+ rescue GPGME::Error::UnusablePublicKey => exc
102
+ exc.keys = ctx.encrypt_result.invalid_recipients
103
+ raise exc
104
+ rescue GPGME::Error::UnusableSecretKey => exc
105
+ exc.keys = ctx.sign_result.invalid_signers
106
+ raise exc
107
+ end
108
+ end
109
+
110
+ cipher_data.seek(0)
111
+ cipher_data
112
+ end
113
+
114
+ ##
115
+ # Decrypts a previously encrypted element
116
+ #
117
+ # crypto.decrypt cipher, options, &block
118
+ #
119
+ # Must have the appropiate key to be able to decrypt, of course. Returns
120
+ # a {GPGME::Data} object which can then be read.
121
+ #
122
+ # @param cipher
123
+ # Must be something that can be converted into a {GPGME::Data} object,
124
+ # or a {GPGME::Data} object itself. It is the element that will be
125
+ # decrypted.
126
+ #
127
+ # @param [Hash] options
128
+ # The optional parameters:
129
+ # * +:output+ if specified, it will write the output into it. It will
130
+ # me converted to a {GPGME::Data} object, so it can also be a file,
131
+ # for example.
132
+ # * If the file was encrypted with symmentric encryption, must provide
133
+ # a :password option.
134
+ # * Any other option accepted by {GPGME::Ctx.new}
135
+ #
136
+ # @param &block
137
+ # In the block all the signatures are yielded, so one could verify them.
138
+ # See examples.
139
+ #
140
+ # @return [GPGME::Data] a {GPGME::Data} that can be read.
141
+ #
142
+ # @example Simple decrypt
143
+ # crypto.decrypt encrypted_data
144
+ #
145
+ # @example symmetric encryption, or passwored key
146
+ # crypto.decrypt encrypted_data, :password => "gpgme"
147
+ #
148
+ # @example Output to file
149
+ # file = File.open("decrypted.txt", "w+")
150
+ # crypto.decrypt encrypted_data, :output => file
151
+ #
152
+ # @example Verifying signatures
153
+ # crypto.decrypt encrypted_data do |signature|
154
+ # raise "Signature could not be verified" unless signature.valid?
155
+ # end
156
+ #
157
+ # @raise [GPGME::Error::UnsupportedAlgorithm] when the cipher was encrypted
158
+ # using an algorithm that's not supported currently.
159
+ #
160
+ # @raise [GPGME::Error::WrongKeyUsage] TODO Don't know when
161
+ #
162
+ # @raise [GPGME::Error::DecryptFailed] when the cipher was encrypted
163
+ # for a key that's not available currently.
164
+ def decrypt(cipher, options = {})
165
+ options = @default_options.merge options
166
+
167
+ plain_data = Data.new(options[:output])
168
+ cipher_data = Data.new(cipher)
169
+
170
+ GPGME::Ctx.new(options) do |ctx|
171
+ begin
172
+ ctx.decrypt_verify(cipher_data, plain_data)
173
+ rescue GPGME::Error::UnsupportedAlgorithm => exc
174
+ exc.algorithm = ctx.decrypt_result.unsupported_algorithm
175
+ raise exc
176
+ rescue GPGME::Error::WrongKeyUsage => exc
177
+ exc.key_usage = ctx.decrypt_result.wrong_key_usage
178
+ raise exc
179
+ end
180
+
181
+ verify_result = ctx.verify_result
182
+ if verify_result && block_given?
183
+ verify_result.signatures.each do |signature|
184
+ yield signature
185
+ end
186
+ end
187
+
188
+ end
189
+
190
+ plain_data.seek(0)
191
+ plain_data
192
+ end
193
+
194
+ ##
195
+ # Creates a signature of a text
196
+ #
197
+ # crypto.sign text, options
198
+ #
199
+ # Must have the appropiate key to be able to decrypt, of course. Returns
200
+ # a {GPGME::Data} object which can then be read.
201
+ #
202
+ # @param text
203
+ # The object that will be signed. Must be something that can be converted
204
+ # to {GPGME::Data}.
205
+ #
206
+ # @param [Hash] options
207
+ # Optional parameters.
208
+ # * +:signer+ sign identifier to sign the text with. Will use the first
209
+ # key it finds if none specified.
210
+ # * +:output+ if specified, it will write the output into it. It will be
211
+ # converted to a {GPGME::Data} object, so it could be a file for example.
212
+ # * +:mode+ Desired type of signature. Options are:
213
+ # - +GPGME::SIG_MODE_NORMAL+ for a normal signature. The default one if
214
+ # not specified.
215
+ # - +GPGME::SIG_MODE_DETACH+ for a detached signature
216
+ # - +GPGME::SIG_MODE_CLEAR+ for a cleartext signature
217
+ # * Any other option accepted by {GPGME::Ctx.new}
218
+ #
219
+ # @return [GPGME::Data] a {GPGME::Data} that can be read.
220
+ #
221
+ # @example normal sign
222
+ # crypto.sign "Hi there"
223
+ #
224
+ # @example outputing to a file
225
+ # file = File.open("text.sign", "w+")
226
+ # crypto.sign "Hi there", :options => file
227
+ #
228
+ # @example doing a detached signature
229
+ # crypto.sign "Hi there", :mode => GPGME::SIG_MODE_DETACH
230
+ #
231
+ # @example specifying the signer
232
+ # crypto.sign "Hi there", :signer => "mrsimo@example.com"
233
+ #
234
+ # @raise [GPGME::Error::UnusableSecretKey] TODO don't know when
235
+ def sign(text, options = {})
236
+ options = @default_options.merge options
237
+
238
+ plain = Data.new(text)
239
+ output = Data.new(options[:output])
240
+ mode = options[:mode] || GPGME::SIG_MODE_NORMAL
241
+
242
+ GPGME::Ctx.new(options) do |ctx|
243
+ if options[:signer]
244
+ signers = Key.find(:secret, options[:signer], :sign)
245
+ ctx.add_signer(*signers)
246
+ end
247
+
248
+ begin
249
+ ctx.sign(plain, output, mode)
250
+ rescue GPGME::Error::UnusableSecretKey => exc
251
+ exc.keys = ctx.sign_result.invalid_signers
252
+ raise exc
253
+ end
254
+ end
255
+
256
+ output.seek(0)
257
+ output
258
+ end
259
+
260
+ # Verifies a previously signed element
261
+ #
262
+ # crypto.verify sig, options, &block
263
+ #
264
+ # Must have the proper keys available.
265
+ #
266
+ # @param sig
267
+ # The signature itself. Must be possible to convert into a {GPGME::Data}
268
+ # object, so can be a file.
269
+ #
270
+ # @param [Hash] options
271
+ # * +:signed_text+ if the sign is detached, then must be the plain text
272
+ # for which the signature was created.
273
+ # * +:output+ where to store the result of the signature. Will be
274
+ # converted to a {GPGME::Data} object.
275
+ # * Any other option accepted by {GPGME::Ctx.new}
276
+ #
277
+ # @param &block
278
+ # In the block all the signatures are yielded, so one could verify them.
279
+ # See examples.
280
+ #
281
+ # @return [GPGME::Data] unless the sign is detached, the {GPGME::Data}
282
+ # object with the plain text. If the sign is detached, will return nil.
283
+ #
284
+ # @example simple verification
285
+ # sign = crypto.sign("Hi there")
286
+ # data = crypto.verify(sign) { |signature| signature.valid? }
287
+ # data.read # => "Hi there"
288
+ #
289
+ # @example saving output to file
290
+ # sign = crypto.sign("Hi there")
291
+ # out = File.open("test.asc", "w+")
292
+ # crypto.verify(sign, :output => out) {|signature| signature.valid?}
293
+ # out.read # => "Hi there"
294
+ #
295
+ # @example verifying a detached signature
296
+ # sign = crypto.detach_sign("Hi there")
297
+ # # Will fail
298
+ # crypto.verify(sign) { |signature| signature.valid? }
299
+ # # Will succeed
300
+ # crypto.verify(sign, :signed_text => "hi there") do |signature|
301
+ # signature.valid?
302
+ # end
303
+ #
304
+ def verify(sig, options = {})
305
+ options = @default_options.merge options
306
+
307
+ sig = Data.new(sig)
308
+ signed_text = Data.new(options[:signed_text])
309
+ output = Data.new(options[:output]) unless options[:signed_text]
310
+
311
+ GPGME::Ctx.new(options) do |ctx|
312
+ ctx.verify(sig, signed_text, output)
313
+ ctx.verify_result.signatures.each do |signature|
314
+ yield signature
315
+ end
316
+ end
317
+
318
+ if output
319
+ output.seek(0)
320
+ output
321
+ end
322
+ end
323
+
324
+ # Clearsigns an element
325
+ #
326
+ # crypto.clearsign text, options
327
+ #
328
+ # Same functionality of {.sign} only doing clearsigns by default.
329
+ #
330
+ def clearsign(text, options = {})
331
+ sign text, options.merge(:mode => GPGME::SIG_MODE_CLEAR)
332
+ end
333
+
334
+ # Creates a detached signature of an element
335
+ #
336
+ # crypto.detach_sign text, options
337
+ #
338
+ # Same functionality of {.sign} only doing detached signs by default.
339
+ #
340
+ def detach_sign(text, options = {})
341
+ sign text, options.merge(:mode => GPGME::SIG_MODE_DETACH)
342
+ end
343
+
344
+ ##
345
+ # Allows calling of methods directly in the module without the need to
346
+ # create a new instance.
347
+ def self.method_missing(method, *args, &block)
348
+ if GPGME::Crypto.instance_methods(false).include?(method)
349
+ crypto = GPGME::Crypto.new
350
+ crypto.send method, *args, &block
351
+ else
352
+ super
353
+ end
354
+ end
355
+
356
+ end # module Crypto
357
+ end # module GPGME