class OpenPGP::Message

OpenPGP message.

@see tools.ietf.org/html/rfc4880#section-4.1 @see tools.ietf.org/html/rfc4880#section-11 @see tools.ietf.org/html/rfc4880#section-11.3

Attributes

packets[RW]

@return [Array<Packet>]

Public Class Methods

decrypt(data, options = {}, &block) click to toggle source

@param [Object] data @param [Hash{Symbol => Object}] options @return [Object]

# File lib/openpgp/message.rb, line 49
def self.decrypt(data, options = {}, &block)
  raise NotImplementedError # TODO
end
encrypt(data, options = {}, &block) click to toggle source

Creates an encrypted OpenPGP message.

@param [Object] data @param [Hash{Symbol => Object}] options @return [Message]

# File lib/openpgp/message.rb, line 20
def self.encrypt(data, options = {}, &block)
  if options[:symmetric]
    key    = (options[:key]    || S2K::DEFAULT.new(options[:passphrase]))
    cipher = (options[:cipher] || Cipher::DEFAULT).new(key)

    msg    = self.new do |msg|
      msg << Packet::SymmetricSessionKey.new(:algorithm => cipher.identifier, :s2k => key)
      msg << Packet::EncryptedData.new do |packet|
        plaintext = self.write do |msg|
          case data
            when Message then data.each { |packet| msg << packet }
            when Packet  then msg << data
            else msg << Packet::LiteralData.new(:data => data)
          end
        end
        packet.data = cipher.encrypt(plaintext)
      end
    end

    block_given? ? block.call(msg) : msg
  else
    raise NotImplementedError # TODO
  end
end
new(*packets, &block) click to toggle source

@param [Array<Packet>] packets

# File lib/openpgp/message.rb, line 84
def initialize(*packets, &block)
  @packets = packets.flatten
  block.call(self) if block_given?
end
parse(data) click to toggle source

Parses an OpenPGP message.

@param [Buffer, to_str] data @return [Message] @see tools.ietf.org/html/rfc4880#section-4.1 @see tools.ietf.org/html/rfc4880#section-4.2

# File lib/openpgp/message.rb, line 60
def self.parse(data)
  data = Buffer.new(data.to_str) if data.respond_to?(:to_str)

  msg = self.new
  until data.eof?
    if packet = OpenPGP::Packet.parse(data)
      msg << packet
    else
      raise "Invalid OpenPGP message data at position #{data.pos}"
    end
  end
  msg
end
write(io = nil, &block) click to toggle source

@return [IO, write] io @return [void]

# File lib/openpgp/message.rb, line 77
def self.write(io = nil, &block)
  data = self.new(&block).to_s
  io.respond_to?(:write) ? io.write(data) : data
end

Public Instance Methods

<<(packet) click to toggle source

@param [Packet] packet @return [self]

# File lib/openpgp/message.rb, line 106
def <<(packet)
  packets << packet
end
each() { |packet| ... } click to toggle source

@yield [packet] @yieldparam [Packet] packet @return [Enumerator]

# File lib/openpgp/message.rb, line 93
def each(&block) # :yields: packet
  packets.each(&block)
end
empty?() click to toggle source

@return [Boolean]

# File lib/openpgp/message.rb, line 112
def empty?
  packets.empty?
end
size() click to toggle source

@return [Integer]

# File lib/openpgp/message.rb, line 118
def size
  inject(0) { |sum, packet| sum + packet.size }
end
to_a() click to toggle source

@return [Array<Packet>]

# File lib/openpgp/message.rb, line 99
def to_a
  packets.to_a
end
to_s() click to toggle source

@return [String]

# File lib/openpgp/message.rb, line 124
def to_s
  Buffer.write do |buffer|
    packets.each do |packet|
      if body = packet.body
        buffer.write_byte(packet.class.tag | 0xC0)
        buffer.write_byte(body.size)
        buffer.write_bytes(body)
      end
    end
  end
end