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

Returns a transformed copy of value with every literal string replaced by the block's result.

Returns:

  • (Object)

    a transformed copy of value with every literal string replaced by the block's result.



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