class HexaPDF::Encryption::StandardSecurityHandler

def compute_u_field(password)

PDF2.0 s7.6.4.4.7 (algorithm 8 (a) for R=6)
See: PDF2.0 s7.6.4.4.3 (algorithm 4 for R=2), PDF s7.6.4.4.4 (algorithm 5 for R=3 and R=4)

password with added validation and key salts.
based on the user password. For revision 6 the /U value is a hash computed from the
Short explanation: For revisions <= 4, the password padding string is encrypted with a key

Computes the encryption dictionary's /U (user password) value.
def compute_u_field(password)
  if dict[:R] == 2
    key = compute_user_encryption_key(password)
    arc4_algorithm.encrypt(key, PASSWORD_PADDING)
  elsif dict[:R] <= 4
    key = compute_user_encryption_key(password)
    data = Digest::MD5.digest(PASSWORD_PADDING + document.trailer[:ID][0])
    data = arc4_algorithm.encrypt(key, data)
    19.times {|i| data = arc4_algorithm.encrypt(xor_key(key, i + 1), data) }
    data << "hexapdfhexapdfhe"
  elsif dict[:R] == 6
    validation_salt = random_bytes(8)
    key_salt = random_bytes(8)
    compute_hash(password, validation_salt) << validation_salt << key_salt
  end
end