Class: Mail::Gpg::GpgmeHelper

Inherits:
Object
  • Object
show all
Defined in:
lib/mail/gpg/gpgme_helper.rb

Class Method Summary collapse

Class Method Details

.decrypt(cipher, options = {}) ⇒ Object



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/mail/gpg/gpgme_helper.rb', line 41

def self.decrypt(cipher, options = {})
  cipher_data = GPGME::Data.new(cipher)
  plain_data  = GPGME::Data.new(options[:output])

  GPGME::Ctx.new(options) do |ctx|
    begin
      if options[:verify]
        ctx.decrypt_verify(cipher_data, plain_data)
      else
        ctx.decrypt(cipher_data, plain_data)
      end
    rescue GPGME::Error::UnsupportedAlgorithm => exc
      exc.algorithm = ctx.decrypt_result.unsupported_algorithm
      raise exc
    rescue GPGME::Error::WrongKeyUsage => exc
      exc.key_usage = ctx.decrypt_result.wrong_key_usage
      raise exc
    end
  end

  plain_data.seek(0)
  plain_data
end

.encrypt(plain, options = {}) ⇒ Object



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/mail/gpg/gpgme_helper.rb', line 6

def self.encrypt(plain, options = {})
  options = options.merge({armor: true})

  plain_data  = GPGME::Data.new(plain)
  cipher_data = GPGME::Data.new(options[:output])

  recipient_keys = keys_for_data options[:recipients], options.delete(:keys)

  flags = 0
  flags |= GPGME::ENCRYPT_ALWAYS_TRUST if options[:always_trust]

  GPGME::Ctx.new(options) do |ctx|
    begin
      if options[:sign]
        if options[:signers]
          signers = GPGME::Key.find(:public, options[:signers], :sign)
          ctx.add_signer(*signers)
        end
        ctx.encrypt_sign(recipient_keys, plain_data, cipher_data, flags)
      else
        ctx.encrypt(recipient_keys, plain_data, cipher_data, flags)
      end
    rescue GPGME::Error::UnusablePublicKey => exc
      exc.keys = ctx.encrypt_result.invalid_recipients
      raise exc
    rescue GPGME::Error::UnusableSecretKey => exc
      exc.keys = ctx.sign_result.invalid_signers
      raise exc
    end
  end

  cipher_data.seek(0)
  cipher_data
end

.sign(plain, options = {}) ⇒ Object



65
66
67
68
69
70
71
72
73
# File 'lib/mail/gpg/gpgme_helper.rb', line 65

def self.sign(plain, options = {})
  options.merge!({
    armor: true,
    signer: options.delete(:sign_as),
    mode: GPGME::SIG_MODE_DETACH
  })
  crypto = GPGME::Crypto.new
  crypto.sign GPGME::Data.new(plain), options
end