From 3101955ac0f7f3818dca53d285f5ccd60ccdddea Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Wed, 26 Dec 2012 17:10:25 -0500 Subject: Add V5 parameters to EncryptionData --- libqpdf/QPDFWriter.cc | 10 ++++++++-- libqpdf/QPDF_encryption.cc | 39 +++++++++++++++++++++++++++++++++++++-- 2 files changed, 45 insertions(+), 4 deletions(-) (limited to 'libqpdf') diff --git a/libqpdf/QPDFWriter.cc b/libqpdf/QPDFWriter.cc index 05b5a9a9..f893053b 100644 --- a/libqpdf/QPDFWriter.cc +++ b/libqpdf/QPDFWriter.cc @@ -406,7 +406,7 @@ QPDFWriter::setEncryptionParameters( user_password, owner_password, V, R, key_len, P, this->encrypt_metadata, this->id1, O, U); setEncryptionParametersInternal( - V, R, key_len, P, O, U, this->id1, user_password); + V, R, key_len, P, O, U, "", "", "", this->id1, user_password); } void @@ -467,6 +467,9 @@ QPDFWriter::copyEncryptionParameters(QPDF& qpdf) encrypt.getKey("/P").getIntValue(), encrypt.getKey("/O").getStringValue(), encrypt.getKey("/U").getStringValue(), + "", // XXXX OE + "", // XXXX UE + "", // XXXX Perms this->id1, // this->id1 == the other file's id1 qpdf.getPaddedUserPassword()); } @@ -569,8 +572,11 @@ void QPDFWriter::setEncryptionParametersInternal( int V, int R, int key_len, long P, std::string const& O, std::string const& U, + std::string const& OE, std::string const& UE, std::string const& Perms, std::string const& id1, std::string const& user_password) { + // XXXX OE, UE, Perms, V=5 + encryption_dictionary["/Filter"] = "/Standard"; encryption_dictionary["/V"] = QUtil::int_to_string(V); encryption_dictionary["/Length"] = QUtil::int_to_string(key_len * 8); @@ -606,7 +612,7 @@ QPDFWriter::setEncryptionParametersInternal( this->encrypted = true; QPDF::EncryptionData encryption_data( - V, R, key_len, P, O, U, id1, this->encrypt_metadata); + V, R, key_len, P, O, U, OE, UE, Perms, id1, this->encrypt_metadata); this->encryption_key = QPDF::compute_encryption_key( user_password, encryption_data); } diff --git a/libqpdf/QPDF_encryption.cc b/libqpdf/QPDF_encryption.cc index 4cfc3b33..893f93f5 100644 --- a/libqpdf/QPDF_encryption.cc +++ b/libqpdf/QPDF_encryption.cc @@ -62,6 +62,24 @@ QPDF::EncryptionData::getU() const return this->U; } +std::string const& +QPDF::EncryptionData::getOE() const +{ + return this->OE; +} + +std::string const& +QPDF::EncryptionData::getUE() const +{ + return this->UE; +} + +std::string const& +QPDF::EncryptionData::getPerms() const +{ + return this->Perms; +} + std::string const& QPDF::EncryptionData::getId1() const { @@ -86,6 +104,21 @@ QPDF::EncryptionData::setU(std::string const& U) this->U = U; } +void +QPDF::EncryptionData::setV5EncryptionParameters( + std::string const& O, + std::string const& OE, + std::string const& U, + std::string const& UE, + std::string const& Perms) +{ + this->O = O; + this->OE = OE; + this->U = U; + this->UE = UE; + this->Perms = Perms; +} + static void pad_or_truncate_password(std::string const& password, char k1[key_bytes]) { @@ -557,7 +590,8 @@ QPDF::initializeEncryption() " a bug report that includes this file."); } } - EncryptionData data(V, R, Length / 8, P, O, U, id1, this->encrypt_metadata); + EncryptionData data(V, R, Length / 8, P, O, U, "", "", "", + id1, this->encrypt_metadata); if (check_owner_password( this->user_password, this->provided_password, data)) { @@ -779,7 +813,8 @@ QPDF::compute_encryption_O_U( int V, int R, int key_len, int P, bool encrypt_metadata, std::string const& id1, std::string& O, std::string& U) { - EncryptionData data(V, R, key_len, P, "", "", id1, encrypt_metadata); + EncryptionData data(V, R, key_len, P, "", "", "", "", "", + id1, encrypt_metadata); data.setO(compute_O_value(user_password, owner_password, data)); O = data.getO(); data.setU(compute_U_value(user_password, data)); -- cgit v1.2.3-54-g00ecf