From 2061ee26324b75d6ade3003733b3a6da674341e4 Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Tue, 11 Jul 2023 10:49:38 -0400 Subject: [PATCH] Tests/LibPDF: Add test for AES-encrypted PDF MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I created this by typing "sup" into TextEdit.app on macOS 13.4, hitting Cmd-P to bring up the print dialog, clicked the PDF button at the bottom, changed Title and Author to "sup", clicked "Security Options…", and checked "Require password to open document" (with password "sup"). This file tests several things: - It has a compressed stream as first object. This used to make the linearization dict detection logic assert. - It uses AES as encryption key using version 4 of the encryption dict. This used to not be implemented. --- Tests/LibPDF/CMakeLists.txt | 1 + Tests/LibPDF/TestPDF.cpp | 9 +++++++++ Tests/LibPDF/password-is-sup.pdf | Bin 0 -> 12731 bytes 3 files changed, 10 insertions(+) create mode 100644 Tests/LibPDF/password-is-sup.pdf diff --git a/Tests/LibPDF/CMakeLists.txt b/Tests/LibPDF/CMakeLists.txt index 514cea6353..536be7f6fd 100644 --- a/Tests/LibPDF/CMakeLists.txt +++ b/Tests/LibPDF/CMakeLists.txt @@ -10,6 +10,7 @@ set(TEST_FILES complex.pdf linearized.pdf non-linearized.pdf + password-is-sup.pdf type1.pdf ) install(FILES ${TEST_FILES} DESTINATION home/anon/Documents/pdf) diff --git a/Tests/LibPDF/TestPDF.cpp b/Tests/LibPDF/TestPDF.cpp index fe6ef90772..1acb48fdd6 100644 --- a/Tests/LibPDF/TestPDF.cpp +++ b/Tests/LibPDF/TestPDF.cpp @@ -48,3 +48,12 @@ TEST_CASE(truncated_pdf_header_issue_10717) auto document = PDF::Document::create(string.bytes()); EXPECT(document.is_error()); } + +TEST_CASE(encrypted_with_aes) +{ + auto file = MUST(Core::MappedFile::map("password-is-sup.pdf"sv)); + auto document = MUST(PDF::Document::create(file->bytes())); + EXPECT(document->security_handler()->try_provide_user_password("sup"sv)); + MUST(document->initialize()); + EXPECT_EQ(document->get_page_count(), 1U); +} diff --git a/Tests/LibPDF/password-is-sup.pdf b/Tests/LibPDF/password-is-sup.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e725cdc2a551fdf3deef5af1069afe75604c6917 GIT binary patch literal 12731 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