Przeglądaj źródła

LibPDF: Plumb OE, UE, Perms values to StandardSecurityHandler

Nico Weber 2 lat temu
rodzic
commit
f8a3022ca2

+ 3 - 0
Userland/Libraries/LibPDF/CommonNames.h

@@ -111,6 +111,7 @@
     A(Names)                      \
     A(Names)                      \
     A(Next)                       \
     A(Next)                       \
     A(O)                          \
     A(O)                          \
+    A(OE)                         \
     A(OP)                         \
     A(OP)                         \
     A(OPM)                        \
     A(OPM)                        \
     A(Ordering)                   \
     A(Ordering)                   \
@@ -119,6 +120,7 @@
     A(Pages)                      \
     A(Pages)                      \
     A(Parent)                     \
     A(Parent)                     \
     A(Pattern)                    \
     A(Pattern)                    \
+    A(Perms)                      \
     A(Predictor)                  \
     A(Predictor)                  \
     A(Prev)                       \
     A(Prev)                       \
     A(Producer)                   \
     A(Producer)                   \
@@ -146,6 +148,7 @@
     A(Type)                       \
     A(Type)                       \
     A(Type1C)                     \
     A(Type1C)                     \
     A(U)                          \
     A(U)                          \
+    A(UE)                         \
     A(UCR)                        \
     A(UCR)                        \
     A(UseBlackPTComp)             \
     A(UseBlackPTComp)             \
     A(UserUnit)                   \
     A(UserUnit)                   \

+ 16 - 2
Userland/Libraries/LibPDF/Encryption.cpp

@@ -166,7 +166,12 @@ PDFErrorOr<NonnullRefPtr<StandardSecurityHandler>> StandardSecurityHandler::crea
     if (encryption_dict->contains(CommonNames::EncryptMetadata))
     if (encryption_dict->contains(CommonNames::EncryptMetadata))
         encryption_dict->get_value(CommonNames::EncryptMetadata).get<bool>();
         encryption_dict->get_value(CommonNames::EncryptMetadata).get<bool>();
 
 
+    DeprecatedString oe, ue, perms;
     if (v >= 5) {
     if (v >= 5) {
+        oe = TRY(encryption_dict->get_string(document, CommonNames::OE))->string();
+        ue = TRY(encryption_dict->get_string(document, CommonNames::UE))->string();
+        perms = TRY(encryption_dict->get_string(document, CommonNames::Perms))->string();
+
         // O and U are 48 bytes for V == 5, but some files pad them with nul bytes to 127 bytes. So trim them, if necessary.
         // O and U are 48 bytes for V == 5, but some files pad them with nul bytes to 127 bytes. So trim them, if necessary.
         if (o.length() > 48)
         if (o.length() > 48)
             o = o.substring(0, 48);
             o = o.substring(0, 48);
@@ -175,18 +180,27 @@ PDFErrorOr<NonnullRefPtr<StandardSecurityHandler>> StandardSecurityHandler::crea
 
 
         if (o.length() != 48)
         if (o.length() != 48)
             return Error(Error::Type::Parse, "Invalid O size");
             return Error(Error::Type::Parse, "Invalid O size");
+        if (oe.length() != 32)
+            return Error(Error::Type::Parse, "Invalid OE size");
         if (u.length() != 48)
         if (u.length() != 48)
             return Error(Error::Type::Parse, "Invalid U size");
             return Error(Error::Type::Parse, "Invalid U size");
+        if (ue.length() != 32)
+            return Error(Error::Type::Parse, "Invalid UE size");
+        if (perms.length() != 16)
+            return Error(Error::Type::Parse, "Invalid Perms size");
     }
     }
 
 
-    return adopt_ref(*new StandardSecurityHandler(document, revision, o, u, p, encrypt_metadata, length, method));
+    return adopt_ref(*new StandardSecurityHandler(document, revision, o, oe, u, ue, perms, p, encrypt_metadata, length, method));
 }
 }
 
 
-StandardSecurityHandler::StandardSecurityHandler(Document* document, size_t revision, DeprecatedString const& o_entry, DeprecatedString const& u_entry, u32 flags, bool encrypt_metadata, size_t length, CryptFilterMethod method)
+StandardSecurityHandler::StandardSecurityHandler(Document* document, size_t revision, DeprecatedString const& o_entry, DeprecatedString const& oe_entry, DeprecatedString const& u_entry, DeprecatedString const& ue_entry, DeprecatedString const& perms_entry, u32 flags, bool encrypt_metadata, size_t length, CryptFilterMethod method)
     : m_document(document)
     : m_document(document)
     , m_revision(revision)
     , m_revision(revision)
     , m_o_entry(o_entry)
     , m_o_entry(o_entry)
+    , m_oe_entry(oe_entry)
     , m_u_entry(u_entry)
     , m_u_entry(u_entry)
+    , m_ue_entry(ue_entry)
+    , m_perms_entry(perms_entry)
     , m_flags(flags)
     , m_flags(flags)
     , m_encrypt_metadata(encrypt_metadata)
     , m_encrypt_metadata(encrypt_metadata)
     , m_length(length)
     , m_length(length)

+ 4 - 1
Userland/Libraries/LibPDF/Encryption.h

@@ -39,7 +39,7 @@ class StandardSecurityHandler : public SecurityHandler {
 public:
 public:
     static PDFErrorOr<NonnullRefPtr<StandardSecurityHandler>> create(Document*, NonnullRefPtr<DictObject> encryption_dict);
     static PDFErrorOr<NonnullRefPtr<StandardSecurityHandler>> create(Document*, NonnullRefPtr<DictObject> encryption_dict);
 
 
-    StandardSecurityHandler(Document*, size_t revision, DeprecatedString const& o_entry, DeprecatedString const& u_entry, u32 flags, bool encrypt_metadata, size_t length, CryptFilterMethod method);
+    StandardSecurityHandler(Document*, size_t revision, DeprecatedString const& o_entry, DeprecatedString const& oe_entry, DeprecatedString const& u_entry, DeprecatedString const& ue_entry, DeprecatedString const& perms, u32 flags, bool encrypt_metadata, size_t length, CryptFilterMethod method);
 
 
     ~StandardSecurityHandler() override = default;
     ~StandardSecurityHandler() override = default;
 
 
@@ -74,7 +74,10 @@ private:
     size_t m_revision;
     size_t m_revision;
     Optional<ByteBuffer> m_encryption_key;
     Optional<ByteBuffer> m_encryption_key;
     DeprecatedString m_o_entry;
     DeprecatedString m_o_entry;
+    DeprecatedString m_oe_entry;
     DeprecatedString m_u_entry;
     DeprecatedString m_u_entry;
+    DeprecatedString m_ue_entry;
+    DeprecatedString m_perms_entry;
     u32 m_flags;
     u32 m_flags;
     bool m_encrypt_metadata;
     bool m_encrypt_metadata;
     size_t m_length;
     size_t m_length;