summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2012-12-26 23:10:25 +0100
committerJay Berkenbilt <ejb@ql.org>2012-12-31 11:36:50 +0100
commit3101955ac0f7f3818dca53d285f5ccd60ccdddea (patch)
treef9cca4d19e8105d850803b0d9678d3ad3cd2704a
parent68447bb556364efefc41a3af72a9455b6e43c137 (diff)
downloadqpdf-3101955ac0f7f3818dca53d285f5ccd60ccdddea.tar.zst
Add V5 parameters to EncryptionData
-rw-r--r--include/qpdf/QPDF.hh16
-rw-r--r--include/qpdf/QPDFWriter.hh1
-rw-r--r--libqpdf/QPDFWriter.cc10
-rw-r--r--libqpdf/QPDF_encryption.cc39
4 files changed, 62 insertions, 4 deletions
diff --git a/include/qpdf/QPDF.hh b/include/qpdf/QPDF.hh
index 70ba3e95..00591ea5 100644
--- a/include/qpdf/QPDF.hh
+++ b/include/qpdf/QPDF.hh
@@ -230,6 +230,8 @@ class QPDF
// This class holds data read from the encryption dictionary.
EncryptionData(int V, int R, int Length_bytes, int 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, bool encrypt_metadata) :
V(V),
R(R),
@@ -237,6 +239,9 @@ class QPDF
P(P),
O(O),
U(U),
+ OE(OE),
+ UE(UE),
+ Perms(Perms),
id1(id1),
encrypt_metadata(encrypt_metadata)
{
@@ -248,11 +253,19 @@ class QPDF
int getP() const;
std::string const& getO() const;
std::string const& getU() const;
+ std::string const& getOE() const;
+ std::string const& getUE() const;
+ std::string const& getPerms() const;
std::string const& getId1() const;
bool getEncryptMetadata() const;
void setO(std::string const&);
void setU(std::string const&);
+ void setV5EncryptionParameters(std::string const& O,
+ std::string const& OE,
+ std::string const& U,
+ std::string const& UE,
+ std::string const& Perms);
private:
EncryptionData(EncryptionData const&);
@@ -264,6 +277,9 @@ class QPDF
int P;
std::string O;
std::string U;
+ std::string OE;
+ std::string UE;
+ std::string Perms;
std::string id1;
bool encrypt_metadata;
};
diff --git a/include/qpdf/QPDFWriter.hh b/include/qpdf/QPDFWriter.hh
index 611c6aef..89536e13 100644
--- a/include/qpdf/QPDFWriter.hh
+++ b/include/qpdf/QPDFWriter.hh
@@ -295,6 +295,7 @@ class QPDFWriter
void 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);
void setDataKey(int objid);
int openObject(int objid = 0);
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
@@ -63,6 +63,24 @@ QPDF::EncryptionData::getU() const
}
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
{
return this->id1;
@@ -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));