gpgme-loongson 2.0.18

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