Class: Akabei::Signer

Inherits:
Object
  • Object
show all
Defined in:
lib/akabei/signer.rb

Defined Under Namespace

Classes: AgentNotFound, AmbiguousKey, InvalidSignature, KeyNotFound

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(gpg_key, crypto = nil) ⇒ Signer

Returns a new instance of Signer.



49
50
51
52
53
# File 'lib/akabei/signer.rb', line 49

def initialize(gpg_key, crypto = nil)
  check_gpg_agent!
  @gpg_key = find_secret_key(gpg_key)
  @crypto = crypto || GPGME::Crypto.new
end

Class Method Details

.get(gpg_key, crypto = nil) ⇒ Object



45
46
47
# File 'lib/akabei/signer.rb', line 45

def self.get(gpg_key, crypto = nil)
  gpg_key && new(gpg_key, crypto)
end

Instance Method Details

#check_gpg_agent!Object



55
56
57
58
59
# File 'lib/akabei/signer.rb', line 55

def check_gpg_agent!
  unless ENV['GPG_AGENT_INFO']
    raise AgentNotFound.new
  end
end

#detach_sign(path) ⇒ Object



61
62
63
64
65
66
67
# File 'lib/akabei/signer.rb', line 61

def detach_sign(path)
  File.open(path) do |inp|
    File.open("#{path}.sig", 'w') do |out|
      @crypto.detach_sign(inp, signer: @gpg_key, output: out)
    end
  end
end

#find_secret_key(key_name) ⇒ Object



81
82
83
84
85
86
87
88
89
90
# File 'lib/akabei/signer.rb', line 81

def find_secret_key(key_name)
  keys = GPGME::Key.find(:secret, key_name, :sign)
  if keys.empty?
    raise KeyNotFound.new(key_name)
  elsif keys.size > 1
    raise AmbiguousKey.new(key_name, keys)
  else
    keys.first
  end
end

#verify!(path) ⇒ Object



69
70
71
72
73
74
75
76
77
78
79
# File 'lib/akabei/signer.rb', line 69

def verify!(path)
  File.open("#{path}.sig") do |sig|
    File.open(path) do |f|
      @crypto.verify(sig, signed_text: f) do |signature|
        unless signature.valid?
          raise InvalidSignature.new(path, signature.from)
        end
      end
    end
  end
end