Class: MooTool::Models::Decompressor

Inherits:
Object
  • Object
show all
Includes:
Helpers::IMG4
Defined in:
lib/mootool/models/decompressor.rb

Overview

The magic Apple decompressor (as in it uses magics)

Constant Summary collapse

COMPRESSION_LZSS =
'lzss'
COMPRESSION_LZVN =
'lzvn'
COMPRESSION_LZFSE =
'bvx2'
COMPRESSION_LZMA =
'lzma'

Constants included from Helpers::IMG4

Helpers::IMG4::DECODE_TAGS, Helpers::IMG4::FIRMWARE_TAGS, Helpers::IMG4::HASH_LENGTHS, Helpers::IMG4::KEY_INSTANCE_TAGS, Helpers::IMG4::KVP_TAGS, Helpers::IMG4::OCTET_TAGS, Helpers::IMG4::SEQUENCE_TAGS, Helpers::IMG4::SIGNATURE_TAGS

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Helpers::IMG4

#construct, #construct_object, #decode_construct, parse_4cc

Constructor Details

#initialize(data, hint) ⇒ Decompressor

Returns a new instance of Decompressor.



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/mootool/models/decompressor.rb', line 27

def initialize(data, hint)
  @hint = hint.to_sym
  data = data.value if data.is_a? MooTool::Models::Digest
  @hash = MooTool::Models::Digest.create(::Digest::SHA384.digest(data))
  @data = data
  @value = case data[0..3]
           when COMPRESSION_LZFSE
             @compression = :lzfse
             LZFSE.lzfse_decompress(data)
           when COMPRESSION_LZVN
             @compression = :lzvn
             LZFSE.lzvn_decompress(data)
           when COMPRESSION_LZSS
             @compression = :lzss
             OpenSSL::Digest::DSS.decompress(data)
           when COMPRESSION_LZMA
             @compression = :lzma
             Net::DNS::QueryTypes::ATMA.decompress(data)
           else
             @compression = :raw
             data
           end

  parse_based_on_hint(@value, @hint)

  @decompressed_hash = MooTool::Models::Digest.create(::Digest::SHA384.digest(@value))
end

Instance Attribute Details

#dataObject (readonly)

Returns the value of attribute data.



19
20
21
# File 'lib/mootool/models/decompressor.rb', line 19

def data
  @data
end

#hashObject (readonly)

Returns the value of attribute hash.



19
20
21
# File 'lib/mootool/models/decompressor.rb', line 19

def hash
  @hash
end

#valueObject (readonly)

Returns the value of attribute value.



19
20
21
# File 'lib/mootool/models/decompressor.rb', line 19

def value
  @value
end

Class Method Details

.load(filename) ⇒ Object



21
22
23
# File 'lib/mootool/models/decompressor.rb', line 21

def self.load(filename)
  new File.binread(filename)
end

Instance Method Details

#hashesObject



90
91
92
# File 'lib/mootool/models/decompressor.rb', line 90

def hashes
  [@hash, @decompressed_hash].compact.uniq
end

#inspectObject



94
95
96
97
98
99
100
101
# File 'lib/mootool/models/decompressor.rb', line 94

def inspect
  result = { length: @value.size, hash: @hash, parsed: @parsed }
  result[:compression] = @compression if @compression != :raw
  result[:decompressed_hash] = @decompressed_hash if @decompressed_hash && @decompressed_hash != @hash
  result[:parsed] = @parsed if @parsed
  result[:hint] = @hint if @hint
  result.ai
end

#parse_based_on_hint(value, hint) ⇒ Object



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/mootool/models/decompressor.rb', line 55

def parse_based_on_hint(value, hint)
  @compression = :raw
  begin
    @asn1 = OpenSSL::ASN1.decode(value)
    @constructed = construct(@asn1)
    @compression = :asn1

    @parsed = case hint
              when :scrt, :lcrt
                {
                  unk1: @constructed[0],
                  unk2: @constructed[1],
                  signature: Models::Digest.create(@constructed[2]),
                  certificate: OpenSSL::X509::Certificate.new(OpenSSL::ASN1.decode(@constructed[3].value).to_der),
                  unk4: @constructed[4]
                }
              when :dCfg
                @constructed
              when :FSC2
                @constructed.map do |item|
                  case item
                  when Integer
                    item.to_4cc
                  when Hash
                    item.transform_keys(&:to_4cc)
                  end
                end
              else
                { hint => @asn1 }
              end
  rescue StandardError => e
    @parsed = { value: Models::Digest.create(value), error: e }
  end
end