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

Returns a new instance of 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

Returns:

  • (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

Returns:

  • (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

Returns:

  • (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