Class: AmpkReader

Inherits:
Object
  • Object
show all
Defined in:
lib/ampk/reader.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(path, public_key) ⇒ AmpkReader



5
6
7
8
# File 'lib/ampk/reader.rb', line 5

def initialize(path, public_key)
  @fp = File.open(@path=path,'rb')
  @public_key = public_key
end

Instance Attribute Details

#itemsObject (readonly)

Returns the value of attribute items.



4
5
6
# File 'lib/ampk/reader.rb', line 4

def items
  @items
end

#pathObject (readonly)

Returns the value of attribute path.



4
5
6
# File 'lib/ampk/reader.rb', line 4

def path
  @path
end

Instance Method Details

#closeObject



72
73
74
# File 'lib/ampk/reader.rb', line 72

def close
  @fp.close
end

#entitiesObject



38
39
40
41
# File 'lib/ampk/reader.rb', line 38

def entities
  auto_scan
  @items.map { |item| item[:name] }
end

#entity(name) ⇒ Object

Raises:

  • (Errno::ENOENT)


60
61
62
63
64
65
# File 'lib/ampk/reader.rb', line 60

def entity(name)
  auto_scan
  item = @items.find { |item| item[:name] == name }
  raise Errno::ENOENT, name if item.nil?
  item
end

#entity_compressed?(name) ⇒ Boolean



49
50
51
52
# File 'lib/ampk/reader.rb', line 49

def entity_compressed?(name)
  item = entity(name)
  item.has_key?(:filter) and item[:filter].include?(?Z)
end

#entity_encrypted?(name) ⇒ Boolean



45
46
47
48
# File 'lib/ampk/reader.rb', line 45

def entity_encrypted?(name)
  item = entity(name)
  item.has_key?(:filter) and item[:filter].include?(?C)
end

#entity_signed?(name) ⇒ Boolean



42
43
44
# File 'lib/ampk/reader.rb', line 42

def entity_signed?(name)
  entity(name).has_key?(:signature)
end

#entity_size(name) ⇒ Object Also known as: entity_length



53
54
55
# File 'lib/ampk/reader.rb', line 53

def entity_size(name)
  entity(name)[:length]
end

#entity_type(name) ⇒ Object



57
58
59
# File 'lib/ampk/reader.rb', line 57

def entity_type(name)
  entity(name)[:type]
end

#read_entity(name) ⇒ Object

Raises:

  • (Errno::ENOENT)


66
67
68
69
70
71
# File 'lib/ampk/reader.rb', line 66

def read_entity(name)
  auto_scan unless @items
  item = @items.find { |item| item[:name] == name }
  raise Errno::ENOENT, name if item.nil?
  read_entity_data(item)
end

#verify!(verify_data = false) ⇒ Object



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
# File 'lib/ampk/reader.rb', line 9

def verify!(verify_data=false)
  @fp.rewind
  must('start AMPK') { read4 == 'AMPK' }
  until @fp.eof?
    break if peek4 == 'ENDS'
    name = verify_entry('NAME', true)
    headers = {}
    signature = nil
    
    until (header = peek4).eql?('DATA')
      headers[header] ||= 0
      headers[header] += 1
      raise "Duplicate #{header} entry for #{name}" if headers[header] > 1
      
      case header
      when 'FILT', 'DLEN', 'TYPE'
        verify_entry(header, false)
      when 'SIGN'
        signature = verify_entry('SIGN', true)
      end
    end
    
    if signature
      verify_entry_with_sig('DATA', verify_data, signature)
    else
      verify_entry('DATA', verify_data)
    end
  end
end