OLD | NEW |
1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #include "core/include/fpdfapi/fpdf_parser.h" | 7 #include "core/include/fpdfapi/fpdf_parser.h" |
8 | 8 |
9 #include <time.h> | 9 #include <time.h> |
10 | 10 |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
108 } | 108 } |
109 static FX_BOOL _LoadCryptInfo(CPDF_Dictionary* pEncryptDict, | 109 static FX_BOOL _LoadCryptInfo(CPDF_Dictionary* pEncryptDict, |
110 const CFX_ByteStringC& name, | 110 const CFX_ByteStringC& name, |
111 int& cipher, | 111 int& cipher, |
112 int& keylen) { | 112 int& keylen) { |
113 int Version = pEncryptDict->GetInteger("V"); | 113 int Version = pEncryptDict->GetInteger("V"); |
114 cipher = FXCIPHER_RC4; | 114 cipher = FXCIPHER_RC4; |
115 keylen = 0; | 115 keylen = 0; |
116 if (Version >= 4) { | 116 if (Version >= 4) { |
117 CPDF_Dictionary* pCryptFilters = pEncryptDict->GetDict("CF"); | 117 CPDF_Dictionary* pCryptFilters = pEncryptDict->GetDict("CF"); |
118 if (pCryptFilters == NULL) { | 118 if (!pCryptFilters) { |
119 return FALSE; | 119 return FALSE; |
120 } | 120 } |
121 if (name == "Identity") { | 121 if (name == "Identity") { |
122 cipher = FXCIPHER_NONE; | 122 cipher = FXCIPHER_NONE; |
123 } else { | 123 } else { |
124 CPDF_Dictionary* pDefFilter = pCryptFilters->GetDict(name); | 124 CPDF_Dictionary* pDefFilter = pCryptFilters->GetDict(name); |
125 if (pDefFilter == NULL) { | 125 if (!pDefFilter) { |
126 return FALSE; | 126 return FALSE; |
127 } | 127 } |
128 int nKeyBits = 0; | 128 int nKeyBits = 0; |
129 if (Version == 4) { | 129 if (Version == 4) { |
130 nKeyBits = pDefFilter->GetInteger("Length", 0); | 130 nKeyBits = pDefFilter->GetInteger("Length", 0); |
131 if (nKeyBits == 0) { | 131 if (nKeyBits == 0) { |
132 nKeyBits = pEncryptDict->GetInteger("Length", 128); | 132 nKeyBits = pEncryptDict->GetInteger("Length", 128); |
133 } | 133 } |
134 } else { | 134 } else { |
135 nKeyBits = pEncryptDict->GetInteger("Length", 256); | 135 nKeyBits = pEncryptDict->GetInteger("Length", 256); |
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
322 CRYPT_SHA256Update(sha, password, size); | 322 CRYPT_SHA256Update(sha, password, size); |
323 CRYPT_SHA256Update(sha, pkey + 32, 8); | 323 CRYPT_SHA256Update(sha, pkey + 32, 8); |
324 if (bOwner) { | 324 if (bOwner) { |
325 CRYPT_SHA256Update(sha, ukey, 48); | 325 CRYPT_SHA256Update(sha, ukey, 48); |
326 } | 326 } |
327 CRYPT_SHA256Finish(sha, digest); | 327 CRYPT_SHA256Finish(sha, digest); |
328 } | 328 } |
329 if (FXSYS_memcmp(digest, pkey, 32) != 0) { | 329 if (FXSYS_memcmp(digest, pkey, 32) != 0) { |
330 return FALSE; | 330 return FALSE; |
331 } | 331 } |
332 if (key == NULL) { | 332 if (!key) { |
333 return TRUE; | 333 return TRUE; |
334 } | 334 } |
335 if (m_Revision >= 6) { | 335 if (m_Revision >= 6) { |
336 Revision6_Hash(password, size, (const uint8_t*)pkey + 40, | 336 Revision6_Hash(password, size, (const uint8_t*)pkey + 40, |
337 (bOwner ? (const uint8_t*)ukey : NULL), digest); | 337 (bOwner ? (const uint8_t*)ukey : NULL), digest); |
338 } else { | 338 } else { |
339 CRYPT_SHA256Start(sha); | 339 CRYPT_SHA256Start(sha); |
340 CRYPT_SHA256Update(sha, password, size); | 340 CRYPT_SHA256Update(sha, password, size); |
341 CRYPT_SHA256Update(sha, pkey + 40, 8); | 341 CRYPT_SHA256Update(sha, pkey + 40, 8); |
342 if (bOwner) { | 342 if (bOwner) { |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
392 } | 392 } |
393 int CPDF_StandardSecurityHandler::CheckPassword(const uint8_t* password, | 393 int CPDF_StandardSecurityHandler::CheckPassword(const uint8_t* password, |
394 FX_DWORD size, | 394 FX_DWORD size, |
395 FX_BOOL bOwner, | 395 FX_BOOL bOwner, |
396 uint8_t* key, | 396 uint8_t* key, |
397 int32_t key_len) { | 397 int32_t key_len) { |
398 if (m_Revision >= 5) { | 398 if (m_Revision >= 5) { |
399 return AES256_CheckPassword(password, size, bOwner, key); | 399 return AES256_CheckPassword(password, size, bOwner, key); |
400 } | 400 } |
401 uint8_t keybuf[32]; | 401 uint8_t keybuf[32]; |
402 if (key == NULL) { | 402 if (!key) { |
403 key = keybuf; | 403 key = keybuf; |
404 } | 404 } |
405 if (bOwner) { | 405 if (bOwner) { |
406 return CheckOwnerPassword(password, size, key, key_len); | 406 return CheckOwnerPassword(password, size, key, key_len); |
407 } | 407 } |
408 return CheckUserPassword(password, size, FALSE, key, key_len) || | 408 return CheckUserPassword(password, size, FALSE, key, key_len) || |
409 CheckUserPassword(password, size, TRUE, key, key_len); | 409 CheckUserPassword(password, size, TRUE, key, key_len); |
410 } | 410 } |
411 FX_BOOL CPDF_StandardSecurityHandler::CheckUserPassword( | 411 FX_BOOL CPDF_StandardSecurityHandler::CheckUserPassword( |
412 const uint8_t* password, | 412 const uint8_t* password, |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
534 const uint8_t* user_pass, | 534 const uint8_t* user_pass, |
535 FX_DWORD user_size, | 535 FX_DWORD user_size, |
536 const uint8_t* owner_pass, | 536 const uint8_t* owner_pass, |
537 FX_DWORD owner_size, | 537 FX_DWORD owner_size, |
538 FX_BOOL bDefault, | 538 FX_BOOL bDefault, |
539 FX_DWORD type) { | 539 FX_DWORD type) { |
540 int cipher = 0, key_len = 0; | 540 int cipher = 0, key_len = 0; |
541 if (!LoadDict(pEncryptDict, type, cipher, key_len)) { | 541 if (!LoadDict(pEncryptDict, type, cipher, key_len)) { |
542 return; | 542 return; |
543 } | 543 } |
544 if (bDefault && (owner_pass == NULL || owner_size == 0)) { | 544 if (bDefault && (!owner_pass || owner_size == 0)) { |
545 owner_pass = user_pass; | 545 owner_pass = user_pass; |
546 owner_size = user_size; | 546 owner_size = user_size; |
547 } | 547 } |
548 if (m_Revision >= 5) { | 548 if (m_Revision >= 5) { |
549 int t = (int)time(NULL); | 549 int t = (int)time(NULL); |
550 uint8_t sha[128]; | 550 uint8_t sha[128]; |
551 CRYPT_SHA256Start(sha); | 551 CRYPT_SHA256Start(sha); |
552 CRYPT_SHA256Update(sha, (uint8_t*)&t, sizeof t); | 552 CRYPT_SHA256Update(sha, (uint8_t*)&t, sizeof t); |
553 CRYPT_SHA256Update(sha, m_EncryptKey, 32); | 553 CRYPT_SHA256Update(sha, m_EncryptKey, 32); |
554 CRYPT_SHA256Update(sha, (uint8_t*)"there", 5); | 554 CRYPT_SHA256Update(sha, (uint8_t*)"there", 5); |
(...skipping 474 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1029 str = dest_buf; | 1029 str = dest_buf; |
1030 } | 1030 } |
1031 CPDF_StandardCryptoHandler::CPDF_StandardCryptoHandler() { | 1031 CPDF_StandardCryptoHandler::CPDF_StandardCryptoHandler() { |
1032 m_pAESContext = NULL; | 1032 m_pAESContext = NULL; |
1033 m_Cipher = FXCIPHER_NONE; | 1033 m_Cipher = FXCIPHER_NONE; |
1034 m_KeyLen = 0; | 1034 m_KeyLen = 0; |
1035 } | 1035 } |
1036 CPDF_StandardCryptoHandler::~CPDF_StandardCryptoHandler() { | 1036 CPDF_StandardCryptoHandler::~CPDF_StandardCryptoHandler() { |
1037 FX_Free(m_pAESContext); | 1037 FX_Free(m_pAESContext); |
1038 } | 1038 } |
OLD | NEW |