#include "core/fpdfapi/parser/cpdf_security_handler.h"
#include <stdint.h>
#include <time.h>
#include <algorithm>
#include <utility>
#include "core/fdrm/fx_crypt.h"
#include "core/fpdfapi/parser/cpdf_array.h"
#include "core/fpdfapi/parser/cpdf_crypto_handler.h"
#include "core/fpdfapi/parser/cpdf_dictionary.h"
#include "core/fpdfapi/parser/cpdf_object.h"
#include "core/fpdfapi/parser/cpdf_string.h"
#include "core/fxcrt/byteorder.h"
#include "core/fxcrt/check.h"
#include "core/fxcrt/check_op.h"
#include "core/fxcrt/compiler_specific.h"
#include "core/fxcrt/data_vector.h"
#include "core/fxcrt/fx_memcpy_wrappers.h"
#include "core/fxcrt/fx_random.h"
#include "core/fxcrt/notreached.h"
#include "core/fxcrt/span.h"
#include "core/fxcrt/span_util.h"
#include "core/fxcrt/stl_util.h"
namespace {
const uint8_t kDefaultPasscode[32] = …;
void GetPassCode(const ByteString& password, pdfium::span<uint8_t> output) { … }
void CalcEncryptKey(const CPDF_Dictionary* pEncrypt,
const ByteString& password,
pdfium::span<uint8_t> key,
bool ignore_metadata,
const ByteString& file_id) { … }
bool IsValidKeyLengthForCipher(CPDF_CryptoHandler::Cipher cipher,
size_t keylen) { … }
int BigOrder64BitsMod3(pdfium::span<const uint8_t> data) { … }
void Revision6_Hash(const ByteString& password,
const uint8_t* salt,
const uint8_t* vector,
uint8_t* hash) { … }
}
CPDF_SecurityHandler::CPDF_SecurityHandler() = default;
CPDF_SecurityHandler::~CPDF_SecurityHandler() = default;
bool CPDF_SecurityHandler::OnInit(const CPDF_Dictionary* pEncryptDict,
RetainPtr<const CPDF_Array> pIdArray,
const ByteString& password) { … }
bool CPDF_SecurityHandler::CheckSecurity(const ByteString& password) { … }
uint32_t CPDF_SecurityHandler::GetPermissions(bool get_owner_perms) const { … }
static bool LoadCryptInfo(const CPDF_Dictionary* pEncryptDict,
const ByteString& name,
CPDF_CryptoHandler::Cipher* cipher,
size_t* keylen_out) { … }
bool CPDF_SecurityHandler::LoadDict(const CPDF_Dictionary* pEncryptDict) { … }
bool CPDF_SecurityHandler::LoadDict(const CPDF_Dictionary* pEncryptDict,
CPDF_CryptoHandler::Cipher* cipher,
size_t* key_len) { … }
bool CPDF_SecurityHandler::AES256_CheckPassword(const ByteString& password,
bool bOwner) { … }
bool CPDF_SecurityHandler::CheckPassword(const ByteString& password,
bool bOwner) { … }
bool CPDF_SecurityHandler::CheckPasswordImpl(const ByteString& password,
bool bOwner) { … }
bool CPDF_SecurityHandler::CheckUserPassword(const ByteString& password,
bool bIgnoreEncryptMeta) { … }
ByteString CPDF_SecurityHandler::GetUserPassword(
const ByteString& owner_password) const { … }
bool CPDF_SecurityHandler::CheckOwnerPassword(const ByteString& password) { … }
bool CPDF_SecurityHandler::IsMetadataEncrypted() const { … }
ByteString CPDF_SecurityHandler::GetEncodedPassword(
ByteStringView password) const { … }
void CPDF_SecurityHandler::OnCreate(CPDF_Dictionary* pEncryptDict,
const CPDF_Array* pIdArray,
const ByteString& password) { … }
void CPDF_SecurityHandler::AES256_SetPassword(CPDF_Dictionary* pEncryptDict,
const ByteString& password) { … }
void CPDF_SecurityHandler::AES256_SetPerms(CPDF_Dictionary* pEncryptDict) { … }
void CPDF_SecurityHandler::InitCryptoHandler() { … }