Module: Pdfrb::Encryption::ValueStrings

Defined in:
lib/pdfrb/encryption/value_strings.rb

Overview

The COS value-tree string walk, shared by both directions of the encryption seam: the Serializer encrypts every literal string an indirect object carries (building transformed copies), and the ObjectReader decrypts them back (mutating the freshly-parsed containers in place). One walk, two adapters — keeps the string set and traversal rules from drifting.

Class Method Summary collapse

Class Method Details

.decrypt!(value, oid, gen, cipher) ⇒ Object

Replaces every literal string inside the freshly-parsed value (a Hash/Array container tree) with its decrypted form, in place. Returns value.



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/pdfrb/encryption/value_strings.rb', line 42

def decrypt!(value, oid, gen, cipher)
  case value
  when ::Hash
    value.each { |k, v| value[k] = decrypt!(v, oid, gen, cipher) }
  when ::Array
    value.map! { |v| decrypt!(v, oid, gen, cipher) }
  when Pdfrb::Model::PdfArray
    value.value.map! { |v| decrypt!(v, oid, gen, cipher) }
    value
  when ::String
    cipher.decrypt_string(value, oid, gen)
  else
    value
  end
end

.encrypt(value, oid, gen, cipher) ⇒ Object



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/pdfrb/encryption/value_strings.rb', line 16

def encrypt(value, oid, gen, cipher)
  case value
  when ::Hash
    value.each_with_object({}) { |(k, v), h| h[k] = encrypt(v, oid, gen, cipher) }
  when ::Array
    value.map { |v| encrypt(v, oid, gen, cipher) }
  when Pdfrb::Model::PdfArray
    Pdfrb::Model::PdfArray.new(value.map { |v| encrypt(v, oid, gen, cipher) })
  when Pdfrb::Model::Object
    Pdfrb::Model::Object.new(encrypt(value.value, oid, gen, cipher),
                             oid: value.oid, gen: value.gen)
  when ::String
    bytes = if value.encoding == Encoding::UTF_8
              Pdfrb::Model::Cos::StringEncoding.encode_text(value)
            else
              value.dup.force_encoding(Encoding::BINARY)
            end
    cipher.encrypt_string(bytes, oid, gen)
  else
    value
  end
end