mirror of
https://github.com/qpdf/qpdf.git
synced 2024-12-22 10:58:58 +00:00
Modernize encryption API for more granularity
Setting encryption permissions for R >= 3 set permission bits in groups corresponding to menu options in Acrobat 5. The new API allows the bits to be set individually.
This commit is contained in:
parent
4630377731
commit
6ec22f117d
@ -16,6 +16,15 @@
|
|||||||
|
|
||||||
2019-01-14 Jay Berkenbilt <ejb@ql.org>
|
2019-01-14 Jay Berkenbilt <ejb@ql.org>
|
||||||
|
|
||||||
|
* Add new versions of
|
||||||
|
QPDFWriter::setR{3,4,5,6}EncryptionParameters that allow
|
||||||
|
individual setting of the various permission bits. The old
|
||||||
|
interfaces are retained for backward compatibility. In the "C"
|
||||||
|
API, add qpdf_set_r{3,4,5,6}_encryption_parameters2. The new
|
||||||
|
interfaces use separate booleans for various permissions instead
|
||||||
|
of the qpdf_r3_modify_e enumerated type, which set permission bits
|
||||||
|
in predefined groups.
|
||||||
|
|
||||||
* Add versions of utf8 to single-byte character transcoders that
|
* Add versions of utf8 to single-byte character transcoders that
|
||||||
return a success code.
|
return a success code.
|
||||||
|
|
||||||
|
@ -80,13 +80,18 @@ enum qpdf_r3_print_e
|
|||||||
qpdf_r3p_low, /* allow only low-resolution printing */
|
qpdf_r3p_low, /* allow only low-resolution printing */
|
||||||
qpdf_r3p_none /* allow no printing */
|
qpdf_r3p_none /* allow no printing */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* qpdf_r3_modify_e doesn't allow the full flexibility of the spec. It
|
||||||
|
* corresponds to options in Acrobat 5's menus. The new interface in
|
||||||
|
* QPDFWriter offers more granularity and no longer uses this type.
|
||||||
|
*/
|
||||||
enum qpdf_r3_modify_e /* Allowed changes: */
|
enum qpdf_r3_modify_e /* Allowed changes: */
|
||||||
{
|
{
|
||||||
qpdf_r3m_all = 0, /* General editing, comments, forms */
|
qpdf_r3m_all = 0, /* All editing */
|
||||||
qpdf_r3m_annotate, /* Comments, form field fill-in, and signing */
|
qpdf_r3m_annotate, /* Comments, fill forms, signing, assembly */
|
||||||
qpdf_r3m_form, /* form field fill-in and signing */
|
qpdf_r3m_form, /* Fill forms, signing, assembly */
|
||||||
qpdf_r3m_assembly, /* only document assembly */
|
qpdf_r3m_assembly, /* Only document assembly */
|
||||||
qpdf_r3m_none /* no modifications */
|
qpdf_r3m_none /* No modifications */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Form field flags from the PDF spec */
|
/* Form field flags from the PDF spec */
|
||||||
|
@ -344,6 +344,39 @@ class QPDFWriter
|
|||||||
// AES is used, 1.6, and setting R5 or R6 parameters pushes the
|
// AES is used, 1.6, and setting R5 or R6 parameters pushes the
|
||||||
// version to at least 1.7 with extension level 3.
|
// version to at least 1.7 with extension level 3.
|
||||||
QPDF_DLL
|
QPDF_DLL
|
||||||
|
void setR3EncryptionParameters(
|
||||||
|
char const* user_password, char const* owner_password,
|
||||||
|
bool allow_accessibility, bool allow_extract,
|
||||||
|
bool allow_assemble, bool allow_annotate_and_form,
|
||||||
|
bool allow_form_filling, bool allow_modify_other,
|
||||||
|
qpdf_r3_print_e print);
|
||||||
|
QPDF_DLL
|
||||||
|
void setR4EncryptionParameters(
|
||||||
|
char const* user_password, char const* owner_password,
|
||||||
|
bool allow_accessibility, bool allow_extract,
|
||||||
|
bool allow_assemble, bool allow_annotate_and_form,
|
||||||
|
bool allow_form_filling, bool allow_modify_other,
|
||||||
|
qpdf_r3_print_e print, bool encrypt_metadata, bool use_aes);
|
||||||
|
// R5 is deprecated. Do not use it for production use. Writing
|
||||||
|
// R5 is supported by qpdf primarily to generate test files for
|
||||||
|
// applications that may need to test R5 support.
|
||||||
|
QPDF_DLL
|
||||||
|
void setR5EncryptionParameters(
|
||||||
|
char const* user_password, char const* owner_password,
|
||||||
|
bool allow_accessibility, bool allow_extract,
|
||||||
|
bool allow_assemble, bool allow_annotate_and_form,
|
||||||
|
bool allow_form_filling, bool allow_modify_other,
|
||||||
|
qpdf_r3_print_e print, bool encrypt_metadata);
|
||||||
|
QPDF_DLL
|
||||||
|
void setR6EncryptionParameters(
|
||||||
|
char const* user_password, char const* owner_password,
|
||||||
|
bool allow_accessibility, bool allow_extract,
|
||||||
|
bool allow_assemble, bool allow_annotate_and_form,
|
||||||
|
bool allow_form_filling, bool allow_modify_other,
|
||||||
|
qpdf_r3_print_e print, bool encrypt_metadata_aes);
|
||||||
|
|
||||||
|
// Pre qpdf 8.4.0 API
|
||||||
|
QPDF_DLL
|
||||||
void setR2EncryptionParameters(
|
void setR2EncryptionParameters(
|
||||||
char const* user_password, char const* owner_password,
|
char const* user_password, char const* owner_password,
|
||||||
bool allow_print, bool allow_modify,
|
bool allow_print, bool allow_modify,
|
||||||
@ -359,9 +392,6 @@ class QPDFWriter
|
|||||||
bool allow_accessibility, bool allow_extract,
|
bool allow_accessibility, bool allow_extract,
|
||||||
qpdf_r3_print_e print, qpdf_r3_modify_e modify,
|
qpdf_r3_print_e print, qpdf_r3_modify_e modify,
|
||||||
bool encrypt_metadata, bool use_aes);
|
bool encrypt_metadata, bool use_aes);
|
||||||
// R5 is deprecated. Do not use it for production use. Writing
|
|
||||||
// R5 is supported by qpdf primarily to generate test files for
|
|
||||||
// applications that may need to test R5 support.
|
|
||||||
QPDF_DLL
|
QPDF_DLL
|
||||||
void setR5EncryptionParameters(
|
void setR5EncryptionParameters(
|
||||||
char const* user_password, char const* owner_password,
|
char const* user_password, char const* owner_password,
|
||||||
@ -459,6 +489,8 @@ class QPDFWriter
|
|||||||
std::set<int>& bits_to_clear,
|
std::set<int>& bits_to_clear,
|
||||||
char const* user_password, char const* owner_password,
|
char const* user_password, char const* owner_password,
|
||||||
bool allow_accessibility, bool allow_extract,
|
bool allow_accessibility, bool allow_extract,
|
||||||
|
bool allow_assemble, bool allow_annotate_and_form,
|
||||||
|
bool allow_form_filling, bool allow_modify_other,
|
||||||
qpdf_r3_print_e print, qpdf_r3_modify_e modify);
|
qpdf_r3_print_e print, qpdf_r3_modify_e modify);
|
||||||
void disableIncompatibleEncryption(int major, int minor,
|
void disableIncompatibleEncryption(int major, int minor,
|
||||||
int extension_level);
|
int extension_level);
|
||||||
|
@ -389,6 +389,40 @@ extern "C" {
|
|||||||
QPDF_BOOL allow_print, QPDF_BOOL allow_modify,
|
QPDF_BOOL allow_print, QPDF_BOOL allow_modify,
|
||||||
QPDF_BOOL allow_extract, QPDF_BOOL allow_annotate);
|
QPDF_BOOL allow_extract, QPDF_BOOL allow_annotate);
|
||||||
|
|
||||||
|
QPDF_DLL
|
||||||
|
void qpdf_set_r3_encryption_parameters2(
|
||||||
|
qpdf_data qpdf, char const* user_password, char const* owner_password,
|
||||||
|
QPDF_BOOL allow_accessibility, QPDF_BOOL allow_extract,
|
||||||
|
QPDF_BOOL allow_assemble, QPDF_BOOL allow_annotate_and_form,
|
||||||
|
QPDF_BOOL allow_form_filling, QPDF_BOOL allow_modify_other,
|
||||||
|
enum qpdf_r3_print_e print);
|
||||||
|
|
||||||
|
QPDF_DLL
|
||||||
|
void qpdf_set_r4_encryption_parameters2(
|
||||||
|
qpdf_data qpdf, char const* user_password, char const* owner_password,
|
||||||
|
QPDF_BOOL allow_accessibility, QPDF_BOOL allow_extract,
|
||||||
|
QPDF_BOOL allow_assemble, QPDF_BOOL allow_annotate_and_form,
|
||||||
|
QPDF_BOOL allow_form_filling, QPDF_BOOL allow_modify_other,
|
||||||
|
enum qpdf_r3_print_e print,
|
||||||
|
QPDF_BOOL encrypt_metadata, QPDF_BOOL use_aes);
|
||||||
|
|
||||||
|
QPDF_DLL
|
||||||
|
void qpdf_set_r5_encryption_parameters2(
|
||||||
|
qpdf_data qpdf, char const* user_password, char const* owner_password,
|
||||||
|
QPDF_BOOL allow_accessibility, QPDF_BOOL allow_extract,
|
||||||
|
QPDF_BOOL allow_assemble, QPDF_BOOL allow_annotate_and_form,
|
||||||
|
QPDF_BOOL allow_form_filling, QPDF_BOOL allow_modify_other,
|
||||||
|
enum qpdf_r3_print_e print, QPDF_BOOL encrypt_metadata);
|
||||||
|
|
||||||
|
QPDF_DLL
|
||||||
|
void qpdf_set_r6_encryption_parameters2(
|
||||||
|
qpdf_data qpdf, char const* user_password, char const* owner_password,
|
||||||
|
QPDF_BOOL allow_accessibility, QPDF_BOOL allow_extract,
|
||||||
|
QPDF_BOOL allow_assemble, QPDF_BOOL allow_annotate_and_form,
|
||||||
|
QPDF_BOOL allow_form_filling, QPDF_BOOL allow_modify_other,
|
||||||
|
enum qpdf_r3_print_e print, QPDF_BOOL encrypt_metadata);
|
||||||
|
|
||||||
|
/* Pre 8.4.0 encryption API */
|
||||||
QPDF_DLL
|
QPDF_DLL
|
||||||
void qpdf_set_r3_encryption_parameters(
|
void qpdf_set_r3_encryption_parameters(
|
||||||
qpdf_data qpdf, char const* user_password, char const* owner_password,
|
qpdf_data qpdf, char const* user_password, char const* owner_password,
|
||||||
|
@ -409,7 +409,26 @@ QPDFWriter::setR3EncryptionParameters(
|
|||||||
std::set<int> clear;
|
std::set<int> clear;
|
||||||
interpretR3EncryptionParameters(
|
interpretR3EncryptionParameters(
|
||||||
clear, user_password, owner_password,
|
clear, user_password, owner_password,
|
||||||
allow_accessibility, allow_extract, print, modify);
|
allow_accessibility, allow_extract,
|
||||||
|
true, true, true, true, print, modify);
|
||||||
|
setEncryptionParameters(user_password, owner_password, 2, 3, 16, clear);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
QPDFWriter::setR3EncryptionParameters(
|
||||||
|
char const* user_password, char const* owner_password,
|
||||||
|
bool allow_accessibility, bool allow_extract,
|
||||||
|
bool allow_assemble, bool allow_annotate_and_form,
|
||||||
|
bool allow_form_filling, bool allow_modify_other,
|
||||||
|
qpdf_r3_print_e print)
|
||||||
|
{
|
||||||
|
std::set<int> clear;
|
||||||
|
interpretR3EncryptionParameters(
|
||||||
|
clear, user_password, owner_password,
|
||||||
|
allow_accessibility, allow_extract,
|
||||||
|
allow_assemble, allow_annotate_and_form,
|
||||||
|
allow_form_filling, allow_modify_other,
|
||||||
|
print, qpdf_r3m_all);
|
||||||
setEncryptionParameters(user_password, owner_password, 2, 3, 16, clear);
|
setEncryptionParameters(user_password, owner_password, 2, 3, 16, clear);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -423,7 +442,29 @@ QPDFWriter::setR4EncryptionParameters(
|
|||||||
std::set<int> clear;
|
std::set<int> clear;
|
||||||
interpretR3EncryptionParameters(
|
interpretR3EncryptionParameters(
|
||||||
clear, user_password, owner_password,
|
clear, user_password, owner_password,
|
||||||
allow_accessibility, allow_extract, print, modify);
|
allow_accessibility, allow_extract,
|
||||||
|
true, true, true, true, print, modify);
|
||||||
|
this->m->encrypt_use_aes = use_aes;
|
||||||
|
this->m->encrypt_metadata = encrypt_metadata;
|
||||||
|
setEncryptionParameters(user_password, owner_password, 4, 4, 16, clear);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
QPDFWriter::setR4EncryptionParameters(
|
||||||
|
char const* user_password, char const* owner_password,
|
||||||
|
bool allow_accessibility, bool allow_extract,
|
||||||
|
bool allow_assemble, bool allow_annotate_and_form,
|
||||||
|
bool allow_form_filling, bool allow_modify_other,
|
||||||
|
qpdf_r3_print_e print,
|
||||||
|
bool encrypt_metadata, bool use_aes)
|
||||||
|
{
|
||||||
|
std::set<int> clear;
|
||||||
|
interpretR3EncryptionParameters(
|
||||||
|
clear, user_password, owner_password,
|
||||||
|
allow_accessibility, allow_extract,
|
||||||
|
allow_assemble, allow_annotate_and_form,
|
||||||
|
allow_form_filling, allow_modify_other,
|
||||||
|
print, qpdf_r3m_all);
|
||||||
this->m->encrypt_use_aes = use_aes;
|
this->m->encrypt_use_aes = use_aes;
|
||||||
this->m->encrypt_metadata = encrypt_metadata;
|
this->m->encrypt_metadata = encrypt_metadata;
|
||||||
setEncryptionParameters(user_password, owner_password, 4, 4, 16, clear);
|
setEncryptionParameters(user_password, owner_password, 4, 4, 16, clear);
|
||||||
@ -439,7 +480,29 @@ QPDFWriter::setR5EncryptionParameters(
|
|||||||
std::set<int> clear;
|
std::set<int> clear;
|
||||||
interpretR3EncryptionParameters(
|
interpretR3EncryptionParameters(
|
||||||
clear, user_password, owner_password,
|
clear, user_password, owner_password,
|
||||||
allow_accessibility, allow_extract, print, modify);
|
allow_accessibility, allow_extract,
|
||||||
|
true, true, true, true, print, modify);
|
||||||
|
this->m->encrypt_use_aes = true;
|
||||||
|
this->m->encrypt_metadata = encrypt_metadata;
|
||||||
|
setEncryptionParameters(user_password, owner_password, 5, 5, 32, clear);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
QPDFWriter::setR5EncryptionParameters(
|
||||||
|
char const* user_password, char const* owner_password,
|
||||||
|
bool allow_accessibility, bool allow_extract,
|
||||||
|
bool allow_assemble, bool allow_annotate_and_form,
|
||||||
|
bool allow_form_filling, bool allow_modify_other,
|
||||||
|
qpdf_r3_print_e print,
|
||||||
|
bool encrypt_metadata)
|
||||||
|
{
|
||||||
|
std::set<int> clear;
|
||||||
|
interpretR3EncryptionParameters(
|
||||||
|
clear, user_password, owner_password,
|
||||||
|
allow_accessibility, allow_extract,
|
||||||
|
allow_assemble, allow_annotate_and_form,
|
||||||
|
allow_form_filling, allow_modify_other,
|
||||||
|
print, qpdf_r3m_all);
|
||||||
this->m->encrypt_use_aes = true;
|
this->m->encrypt_use_aes = true;
|
||||||
this->m->encrypt_metadata = encrypt_metadata;
|
this->m->encrypt_metadata = encrypt_metadata;
|
||||||
setEncryptionParameters(user_password, owner_password, 5, 5, 32, clear);
|
setEncryptionParameters(user_password, owner_password, 5, 5, 32, clear);
|
||||||
@ -455,7 +518,29 @@ QPDFWriter::setR6EncryptionParameters(
|
|||||||
std::set<int> clear;
|
std::set<int> clear;
|
||||||
interpretR3EncryptionParameters(
|
interpretR3EncryptionParameters(
|
||||||
clear, user_password, owner_password,
|
clear, user_password, owner_password,
|
||||||
allow_accessibility, allow_extract, print, modify);
|
allow_accessibility, allow_extract,
|
||||||
|
true, true, true, true, print, modify);
|
||||||
|
this->m->encrypt_use_aes = true;
|
||||||
|
this->m->encrypt_metadata = encrypt_metadata;
|
||||||
|
setEncryptionParameters(user_password, owner_password, 5, 6, 32, clear);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
QPDFWriter::setR6EncryptionParameters(
|
||||||
|
char const* user_password, char const* owner_password,
|
||||||
|
bool allow_accessibility, bool allow_extract,
|
||||||
|
bool allow_assemble, bool allow_annotate_and_form,
|
||||||
|
bool allow_form_filling, bool allow_modify_other,
|
||||||
|
qpdf_r3_print_e print,
|
||||||
|
bool encrypt_metadata)
|
||||||
|
{
|
||||||
|
std::set<int> clear;
|
||||||
|
interpretR3EncryptionParameters(
|
||||||
|
clear, user_password, owner_password,
|
||||||
|
allow_accessibility, allow_extract,
|
||||||
|
allow_assemble, allow_annotate_and_form,
|
||||||
|
allow_form_filling, allow_modify_other,
|
||||||
|
print, qpdf_r3m_all);
|
||||||
this->m->encrypt_use_aes = true;
|
this->m->encrypt_use_aes = true;
|
||||||
this->m->encrypt_metadata = encrypt_metadata;
|
this->m->encrypt_metadata = encrypt_metadata;
|
||||||
setEncryptionParameters(user_password, owner_password, 5, 6, 32, clear);
|
setEncryptionParameters(user_password, owner_password, 5, 6, 32, clear);
|
||||||
@ -466,6 +551,8 @@ QPDFWriter::interpretR3EncryptionParameters(
|
|||||||
std::set<int>& clear,
|
std::set<int>& clear,
|
||||||
char const* user_password, char const* owner_password,
|
char const* user_password, char const* owner_password,
|
||||||
bool allow_accessibility, bool allow_extract,
|
bool allow_accessibility, bool allow_extract,
|
||||||
|
bool allow_assemble, bool allow_annotate_and_form,
|
||||||
|
bool allow_form_filling, bool allow_modify_other,
|
||||||
qpdf_r3_print_e print, qpdf_r3_modify_e modify)
|
qpdf_r3_print_e print, qpdf_r3_modify_e modify)
|
||||||
{
|
{
|
||||||
// Acrobat 5 security options:
|
// Acrobat 5 security options:
|
||||||
@ -486,8 +573,21 @@ QPDFWriter::interpretR3EncryptionParameters(
|
|||||||
// Low Resolution
|
// Low Resolution
|
||||||
// Full printing
|
// Full printing
|
||||||
|
|
||||||
|
// Meanings of bits in P when R >= 3
|
||||||
|
//
|
||||||
|
// 3: low-resolution printing
|
||||||
|
// 4: document modification except as controlled by 6, 9, and 11
|
||||||
|
// 5: extraction
|
||||||
|
// 6: add/modify annotations (comment), fill in forms
|
||||||
|
// if 4+6 are set, also allows modification of form fields
|
||||||
|
// 9: fill in forms even if 6 is clear
|
||||||
|
// 10: accessibility; ignored by readers, should always be set
|
||||||
|
// 11: document assembly even if 4 is clear
|
||||||
|
// 12: high-resolution printing
|
||||||
|
|
||||||
if (! allow_accessibility)
|
if (! allow_accessibility)
|
||||||
{
|
{
|
||||||
|
// setEncryptionParameters sets this if R > 3
|
||||||
clear.insert(10);
|
clear.insert(10);
|
||||||
}
|
}
|
||||||
if (! allow_extract)
|
if (! allow_extract)
|
||||||
@ -511,6 +611,13 @@ QPDFWriter::interpretR3EncryptionParameters(
|
|||||||
// no default so gcc warns for missing cases
|
// no default so gcc warns for missing cases
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Modify options. The qpdf_r3_modify_e options control groups of
|
||||||
|
// bits and lack the full flexibility of the spec. This is
|
||||||
|
// unfortunate, but it's been in the API for ages, and we're stuck
|
||||||
|
// with it. See also allow checks below to control the bits
|
||||||
|
// individually.
|
||||||
|
|
||||||
|
// NOT EXERCISED IN TEST SUITE
|
||||||
switch (modify)
|
switch (modify)
|
||||||
{
|
{
|
||||||
case qpdf_r3m_none:
|
case qpdf_r3m_none:
|
||||||
@ -530,6 +637,24 @@ QPDFWriter::interpretR3EncryptionParameters(
|
|||||||
|
|
||||||
// no default so gcc warns for missing cases
|
// no default so gcc warns for missing cases
|
||||||
}
|
}
|
||||||
|
// END NOT EXERCISED IN TEST SUITE
|
||||||
|
|
||||||
|
if (! allow_assemble)
|
||||||
|
{
|
||||||
|
clear.insert(11);
|
||||||
|
}
|
||||||
|
if (! allow_annotate_and_form)
|
||||||
|
{
|
||||||
|
clear.insert(6);
|
||||||
|
}
|
||||||
|
if (! allow_form_filling)
|
||||||
|
{
|
||||||
|
clear.insert(9);
|
||||||
|
}
|
||||||
|
if (! allow_modify_other)
|
||||||
|
{
|
||||||
|
clear.insert(4);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -603,12 +603,77 @@ void qpdf_set_r2_encryption_parameters(
|
|||||||
allow_print, allow_modify, allow_extract, allow_annotate);
|
allow_print, allow_modify, allow_extract, allow_annotate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void qpdf_set_r3_encryption_parameters2(
|
||||||
|
qpdf_data qpdf, char const* user_password, char const* owner_password,
|
||||||
|
QPDF_BOOL allow_accessibility, QPDF_BOOL allow_extract,
|
||||||
|
QPDF_BOOL allow_assemble, QPDF_BOOL allow_annotate_and_form,
|
||||||
|
QPDF_BOOL allow_form_filling, QPDF_BOOL allow_modify_other,
|
||||||
|
enum qpdf_r3_print_e print)
|
||||||
|
{
|
||||||
|
QTC::TC("qpdf", "qpdf-c called qpdf_set_r3_encryption_parameters");
|
||||||
|
qpdf->qpdf_writer->setR3EncryptionParameters(
|
||||||
|
user_password, owner_password,
|
||||||
|
allow_accessibility, allow_extract,
|
||||||
|
allow_assemble, allow_annotate_and_form,
|
||||||
|
allow_form_filling, allow_modify_other,
|
||||||
|
print);
|
||||||
|
}
|
||||||
|
|
||||||
|
void qpdf_set_r4_encryption_parameters2(
|
||||||
|
qpdf_data qpdf, char const* user_password, char const* owner_password,
|
||||||
|
QPDF_BOOL allow_accessibility, QPDF_BOOL allow_extract,
|
||||||
|
QPDF_BOOL allow_assemble, QPDF_BOOL allow_annotate_and_form,
|
||||||
|
QPDF_BOOL allow_form_filling, QPDF_BOOL allow_modify_other,
|
||||||
|
enum qpdf_r3_print_e print,
|
||||||
|
QPDF_BOOL encrypt_metadata, QPDF_BOOL use_aes)
|
||||||
|
{
|
||||||
|
QTC::TC("qpdf", "qpdf-c called qpdf_set_r4_encryption_parameters");
|
||||||
|
qpdf->qpdf_writer->setR4EncryptionParameters(
|
||||||
|
user_password, owner_password,
|
||||||
|
allow_accessibility, allow_extract,
|
||||||
|
allow_assemble, allow_annotate_and_form,
|
||||||
|
allow_form_filling, allow_modify_other,
|
||||||
|
print, encrypt_metadata, use_aes);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void qpdf_set_r5_encryption_parameters2(
|
||||||
|
qpdf_data qpdf, char const* user_password, char const* owner_password,
|
||||||
|
QPDF_BOOL allow_accessibility, QPDF_BOOL allow_extract,
|
||||||
|
QPDF_BOOL allow_assemble, QPDF_BOOL allow_annotate_and_form,
|
||||||
|
QPDF_BOOL allow_form_filling, QPDF_BOOL allow_modify_other,
|
||||||
|
enum qpdf_r3_print_e print, QPDF_BOOL encrypt_metadata)
|
||||||
|
{
|
||||||
|
QTC::TC("qpdf", "qpdf-c called qpdf_set_r5_encryption_parameters");
|
||||||
|
qpdf->qpdf_writer->setR5EncryptionParameters(
|
||||||
|
user_password, owner_password,
|
||||||
|
allow_accessibility, allow_extract,
|
||||||
|
allow_assemble, allow_annotate_and_form,
|
||||||
|
allow_form_filling, allow_modify_other,
|
||||||
|
print, encrypt_metadata);
|
||||||
|
}
|
||||||
|
|
||||||
|
void qpdf_set_r6_encryption_parameters2(
|
||||||
|
qpdf_data qpdf, char const* user_password, char const* owner_password,
|
||||||
|
QPDF_BOOL allow_accessibility, QPDF_BOOL allow_extract,
|
||||||
|
QPDF_BOOL allow_assemble, QPDF_BOOL allow_annotate_and_form,
|
||||||
|
QPDF_BOOL allow_form_filling, QPDF_BOOL allow_modify_other,
|
||||||
|
enum qpdf_r3_print_e print, QPDF_BOOL encrypt_metadata)
|
||||||
|
{
|
||||||
|
QTC::TC("qpdf", "qpdf-c called qpdf_set_r6_encryption_parameters");
|
||||||
|
qpdf->qpdf_writer->setR6EncryptionParameters(
|
||||||
|
user_password, owner_password,
|
||||||
|
allow_accessibility, allow_extract,
|
||||||
|
allow_assemble, allow_annotate_and_form,
|
||||||
|
allow_form_filling, allow_modify_other,
|
||||||
|
print, encrypt_metadata);
|
||||||
|
}
|
||||||
|
|
||||||
void qpdf_set_r3_encryption_parameters(
|
void qpdf_set_r3_encryption_parameters(
|
||||||
qpdf_data qpdf, char const* user_password, char const* owner_password,
|
qpdf_data qpdf, char const* user_password, char const* owner_password,
|
||||||
QPDF_BOOL allow_accessibility, QPDF_BOOL allow_extract,
|
QPDF_BOOL allow_accessibility, QPDF_BOOL allow_extract,
|
||||||
qpdf_r3_print_e print, qpdf_r3_modify_e modify)
|
qpdf_r3_print_e print, qpdf_r3_modify_e modify)
|
||||||
{
|
{
|
||||||
QTC::TC("qpdf", "qpdf-c called qpdf_set_r3_encryption_parameters");
|
|
||||||
qpdf->qpdf_writer->setR3EncryptionParameters(
|
qpdf->qpdf_writer->setR3EncryptionParameters(
|
||||||
user_password, owner_password,
|
user_password, owner_password,
|
||||||
allow_accessibility, allow_extract, print, modify);
|
allow_accessibility, allow_extract, print, modify);
|
||||||
@ -620,7 +685,6 @@ void qpdf_set_r4_encryption_parameters(
|
|||||||
qpdf_r3_print_e print, qpdf_r3_modify_e modify,
|
qpdf_r3_print_e print, qpdf_r3_modify_e modify,
|
||||||
QPDF_BOOL encrypt_metadata, QPDF_BOOL use_aes)
|
QPDF_BOOL encrypt_metadata, QPDF_BOOL use_aes)
|
||||||
{
|
{
|
||||||
QTC::TC("qpdf", "qpdf-c called qpdf_set_r4_encryption_parameters");
|
|
||||||
qpdf->qpdf_writer->setR4EncryptionParameters(
|
qpdf->qpdf_writer->setR4EncryptionParameters(
|
||||||
user_password, owner_password,
|
user_password, owner_password,
|
||||||
allow_accessibility, allow_extract, print, modify,
|
allow_accessibility, allow_extract, print, modify,
|
||||||
@ -633,7 +697,6 @@ void qpdf_set_r5_encryption_parameters(
|
|||||||
qpdf_r3_print_e print, qpdf_r3_modify_e modify,
|
qpdf_r3_print_e print, qpdf_r3_modify_e modify,
|
||||||
QPDF_BOOL encrypt_metadata)
|
QPDF_BOOL encrypt_metadata)
|
||||||
{
|
{
|
||||||
QTC::TC("qpdf", "qpdf-c called qpdf_set_r5_encryption_parameters");
|
|
||||||
qpdf->qpdf_writer->setR5EncryptionParameters(
|
qpdf->qpdf_writer->setR5EncryptionParameters(
|
||||||
user_password, owner_password,
|
user_password, owner_password,
|
||||||
allow_accessibility, allow_extract, print, modify,
|
allow_accessibility, allow_extract, print, modify,
|
||||||
@ -646,7 +709,6 @@ void qpdf_set_r6_encryption_parameters(
|
|||||||
qpdf_r3_print_e print, qpdf_r3_modify_e modify,
|
qpdf_r3_print_e print, qpdf_r3_modify_e modify,
|
||||||
QPDF_BOOL encrypt_metadata)
|
QPDF_BOOL encrypt_metadata)
|
||||||
{
|
{
|
||||||
QTC::TC("qpdf", "qpdf-c called qpdf_set_r6_encryption_parameters");
|
|
||||||
qpdf->qpdf_writer->setR6EncryptionParameters(
|
qpdf->qpdf_writer->setR6EncryptionParameters(
|
||||||
user_password, owner_password,
|
user_password, owner_password,
|
||||||
allow_accessibility, allow_extract, print, modify,
|
allow_accessibility, allow_extract, print, modify,
|
||||||
|
@ -303,9 +303,10 @@ static void test12(char const* infile,
|
|||||||
qpdf_read(qpdf, infile, password);
|
qpdf_read(qpdf, infile, password);
|
||||||
qpdf_init_write(qpdf, outfile);
|
qpdf_init_write(qpdf, outfile);
|
||||||
qpdf_set_static_ID(qpdf, QPDF_TRUE);
|
qpdf_set_static_ID(qpdf, QPDF_TRUE);
|
||||||
qpdf_set_r3_encryption_parameters(
|
qpdf_set_r3_encryption_parameters2(
|
||||||
qpdf, "user2", "owner2", QPDF_TRUE, QPDF_TRUE,
|
qpdf, "user2", "owner2", QPDF_TRUE, QPDF_TRUE,
|
||||||
qpdf_r3p_low, qpdf_r3m_all);
|
QPDF_TRUE, QPDF_TRUE, QPDF_TRUE, QPDF_TRUE,
|
||||||
|
qpdf_r3p_low);
|
||||||
qpdf_write(qpdf);
|
qpdf_write(qpdf);
|
||||||
report_errors();
|
report_errors();
|
||||||
}
|
}
|
||||||
@ -350,9 +351,10 @@ static void test15(char const* infile,
|
|||||||
qpdf_init_write(qpdf, outfile);
|
qpdf_init_write(qpdf, outfile);
|
||||||
qpdf_set_static_ID(qpdf, QPDF_TRUE);
|
qpdf_set_static_ID(qpdf, QPDF_TRUE);
|
||||||
qpdf_set_static_aes_IV(qpdf, QPDF_TRUE);
|
qpdf_set_static_aes_IV(qpdf, QPDF_TRUE);
|
||||||
qpdf_set_r4_encryption_parameters(
|
qpdf_set_r4_encryption_parameters2(
|
||||||
qpdf, "user2", "owner2", QPDF_TRUE, QPDF_TRUE,
|
qpdf, "user2", "owner2", QPDF_TRUE, QPDF_TRUE,
|
||||||
qpdf_r3p_low, qpdf_r3m_all, QPDF_TRUE, QPDF_TRUE);
|
QPDF_TRUE, QPDF_TRUE, QPDF_TRUE, QPDF_TRUE,
|
||||||
|
qpdf_r3p_low, QPDF_TRUE, QPDF_TRUE);
|
||||||
qpdf_write(qpdf);
|
qpdf_write(qpdf);
|
||||||
report_errors();
|
report_errors();
|
||||||
}
|
}
|
||||||
@ -405,9 +407,10 @@ static void test17(char const* infile,
|
|||||||
qpdf_init_write(qpdf, outfile);
|
qpdf_init_write(qpdf, outfile);
|
||||||
qpdf_set_static_ID(qpdf, QPDF_TRUE);
|
qpdf_set_static_ID(qpdf, QPDF_TRUE);
|
||||||
qpdf_set_static_aes_IV(qpdf, QPDF_TRUE);
|
qpdf_set_static_aes_IV(qpdf, QPDF_TRUE);
|
||||||
qpdf_set_r5_encryption_parameters(
|
qpdf_set_r5_encryption_parameters2(
|
||||||
qpdf, "user3", "owner3", QPDF_TRUE, QPDF_TRUE,
|
qpdf, "user3", "owner3", QPDF_TRUE, QPDF_TRUE,
|
||||||
qpdf_r3p_low, qpdf_r3m_all, QPDF_TRUE);
|
QPDF_TRUE, QPDF_TRUE, QPDF_TRUE, QPDF_TRUE,
|
||||||
|
qpdf_r3p_low, QPDF_TRUE);
|
||||||
qpdf_write(qpdf);
|
qpdf_write(qpdf);
|
||||||
report_errors();
|
report_errors();
|
||||||
}
|
}
|
||||||
@ -421,9 +424,10 @@ static void test18(char const* infile,
|
|||||||
qpdf_init_write(qpdf, outfile);
|
qpdf_init_write(qpdf, outfile);
|
||||||
qpdf_set_static_ID(qpdf, QPDF_TRUE);
|
qpdf_set_static_ID(qpdf, QPDF_TRUE);
|
||||||
qpdf_set_static_aes_IV(qpdf, QPDF_TRUE);
|
qpdf_set_static_aes_IV(qpdf, QPDF_TRUE);
|
||||||
qpdf_set_r6_encryption_parameters(
|
qpdf_set_r6_encryption_parameters2(
|
||||||
qpdf, "user4", "owner4", QPDF_TRUE, QPDF_TRUE,
|
qpdf, "user4", "owner4", QPDF_TRUE, QPDF_TRUE,
|
||||||
qpdf_r3p_low, qpdf_r3m_all, QPDF_TRUE);
|
QPDF_TRUE, QPDF_TRUE, QPDF_TRUE, QPDF_TRUE,
|
||||||
|
qpdf_r3p_low, QPDF_TRUE);
|
||||||
qpdf_write(qpdf);
|
qpdf_write(qpdf);
|
||||||
report_errors();
|
report_errors();
|
||||||
}
|
}
|
||||||
|
58
qpdf/qpdf.cc
58
qpdf/qpdf.cc
@ -80,8 +80,11 @@ struct Options
|
|||||||
r2_annotate(true),
|
r2_annotate(true),
|
||||||
r3_accessibility(true),
|
r3_accessibility(true),
|
||||||
r3_extract(true),
|
r3_extract(true),
|
||||||
|
r3_assemble(true),
|
||||||
|
r3_annotate_and_form(true),
|
||||||
|
r3_form_filling(true),
|
||||||
|
r3_modify_other(true),
|
||||||
r3_print(qpdf_r3p_full),
|
r3_print(qpdf_r3p_full),
|
||||||
r3_modify(qpdf_r3m_all),
|
|
||||||
force_V4(false),
|
force_V4(false),
|
||||||
force_R5(false),
|
force_R5(false),
|
||||||
cleartext_metadata(false),
|
cleartext_metadata(false),
|
||||||
@ -160,8 +163,11 @@ struct Options
|
|||||||
bool r2_annotate;
|
bool r2_annotate;
|
||||||
bool r3_accessibility;
|
bool r3_accessibility;
|
||||||
bool r3_extract;
|
bool r3_extract;
|
||||||
|
bool r3_assemble;
|
||||||
|
bool r3_annotate_and_form;
|
||||||
|
bool r3_form_filling;
|
||||||
|
bool r3_modify_other;
|
||||||
qpdf_r3_print_e r3_print;
|
qpdf_r3_print_e r3_print;
|
||||||
qpdf_r3_modify_e r3_modify;
|
|
||||||
bool force_V4;
|
bool force_V4;
|
||||||
bool force_R5;
|
bool force_R5;
|
||||||
bool cleartext_metadata;
|
bool cleartext_metadata;
|
||||||
@ -1863,23 +1869,38 @@ ArgParser::arg128Modify(char* parameter)
|
|||||||
{
|
{
|
||||||
if (strcmp(parameter, "all") == 0)
|
if (strcmp(parameter, "all") == 0)
|
||||||
{
|
{
|
||||||
o.r3_modify = qpdf_r3m_all;
|
o.r3_assemble = true;
|
||||||
|
o.r3_annotate_and_form = true;
|
||||||
|
o.r3_form_filling = true;
|
||||||
|
o.r3_modify_other = true;
|
||||||
}
|
}
|
||||||
else if (strcmp(parameter, "annotate") == 0)
|
else if (strcmp(parameter, "annotate") == 0)
|
||||||
{
|
{
|
||||||
o.r3_modify = qpdf_r3m_annotate;
|
o.r3_assemble = true;
|
||||||
|
o.r3_annotate_and_form = true;
|
||||||
|
o.r3_form_filling = true;
|
||||||
|
o.r3_modify_other = false;
|
||||||
}
|
}
|
||||||
else if (strcmp(parameter, "form") == 0)
|
else if (strcmp(parameter, "form") == 0)
|
||||||
{
|
{
|
||||||
o.r3_modify = qpdf_r3m_form;
|
o.r3_assemble = true;
|
||||||
|
o.r3_annotate_and_form = false;
|
||||||
|
o.r3_form_filling = true;
|
||||||
|
o.r3_modify_other = false;
|
||||||
}
|
}
|
||||||
else if (strcmp(parameter, "assembly") == 0)
|
else if (strcmp(parameter, "assembly") == 0)
|
||||||
{
|
{
|
||||||
o.r3_modify = qpdf_r3m_assembly;
|
o.r3_assemble = true;
|
||||||
|
o.r3_annotate_and_form = false;
|
||||||
|
o.r3_form_filling = false;
|
||||||
|
o.r3_modify_other = false;
|
||||||
}
|
}
|
||||||
else if (strcmp(parameter, "none") == 0)
|
else if (strcmp(parameter, "none") == 0)
|
||||||
{
|
{
|
||||||
o.r3_modify = qpdf_r3m_none;
|
o.r3_assemble = false;
|
||||||
|
o.r3_annotate_and_form = false;
|
||||||
|
o.r3_form_filling = false;
|
||||||
|
o.r3_modify_other = false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -4030,25 +4051,34 @@ static void set_encryption_options(QPDF& pdf, Options& o, QPDFWriter& w)
|
|||||||
case 3:
|
case 3:
|
||||||
w.setR3EncryptionParameters(
|
w.setR3EncryptionParameters(
|
||||||
o.user_password.c_str(), o.owner_password.c_str(),
|
o.user_password.c_str(), o.owner_password.c_str(),
|
||||||
o.r3_accessibility, o.r3_extract, o.r3_print, o.r3_modify);
|
o.r3_accessibility, o.r3_extract,
|
||||||
|
o.r3_assemble, o.r3_annotate_and_form,
|
||||||
|
o.r3_form_filling, o.r3_modify_other,
|
||||||
|
o.r3_print);
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
w.setR4EncryptionParameters(
|
w.setR4EncryptionParameters(
|
||||||
o.user_password.c_str(), o.owner_password.c_str(),
|
o.user_password.c_str(), o.owner_password.c_str(),
|
||||||
o.r3_accessibility, o.r3_extract, o.r3_print, o.r3_modify,
|
o.r3_accessibility, o.r3_extract,
|
||||||
!o.cleartext_metadata, o.use_aes);
|
o.r3_assemble, o.r3_annotate_and_form,
|
||||||
|
o.r3_form_filling, o.r3_modify_other,
|
||||||
|
o.r3_print, !o.cleartext_metadata, o.use_aes);
|
||||||
break;
|
break;
|
||||||
case 5:
|
case 5:
|
||||||
w.setR5EncryptionParameters(
|
w.setR5EncryptionParameters(
|
||||||
o.user_password.c_str(), o.owner_password.c_str(),
|
o.user_password.c_str(), o.owner_password.c_str(),
|
||||||
o.r3_accessibility, o.r3_extract, o.r3_print, o.r3_modify,
|
o.r3_accessibility, o.r3_extract,
|
||||||
!o.cleartext_metadata);
|
o.r3_assemble, o.r3_annotate_and_form,
|
||||||
|
o.r3_form_filling, o.r3_modify_other,
|
||||||
|
o.r3_print, !o.cleartext_metadata);
|
||||||
break;
|
break;
|
||||||
case 6:
|
case 6:
|
||||||
w.setR6EncryptionParameters(
|
w.setR6EncryptionParameters(
|
||||||
o.user_password.c_str(), o.owner_password.c_str(),
|
o.user_password.c_str(), o.owner_password.c_str(),
|
||||||
o.r3_accessibility, o.r3_extract, o.r3_print, o.r3_modify,
|
o.r3_accessibility, o.r3_extract,
|
||||||
!o.cleartext_metadata);
|
o.r3_assemble, o.r3_annotate_and_form,
|
||||||
|
o.r3_form_filling, o.r3_modify_other,
|
||||||
|
o.r3_print, !o.cleartext_metadata);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
throw std::logic_error("bad encryption R value");
|
throw std::logic_error("bad encryption R value");
|
||||||
|
Loading…
Reference in New Issue
Block a user