| 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 |
| 11 #include "core/include/fdrm/fx_crypt.h" | 11 #include "core/include/fdrm/fx_crypt.h" |
| 12 | 12 |
| 13 const uint8_t defpasscode[32] = { | 13 const uint8_t defpasscode[32] = { |
| 14 0x28, 0xbf, 0x4e, 0x5e, 0x4e, 0x75, 0x8a, 0x41, 0x64, 0x00, 0x4e, | 14 0x28, 0xbf, 0x4e, 0x5e, 0x4e, 0x75, 0x8a, 0x41, 0x64, 0x00, 0x4e, |
| 15 0x56, 0xff, 0xfa, 0x01, 0x08, 0x2e, 0x2e, 0x00, 0xb6, 0xd0, 0x68, | 15 0x56, 0xff, 0xfa, 0x01, 0x08, 0x2e, 0x2e, 0x00, 0xb6, 0xd0, 0x68, |
| 16 0x3e, 0x80, 0x2f, 0x0c, 0xa9, 0xfe, 0x64, 0x53, 0x69, 0x7a}; | 16 0x3e, 0x80, 0x2f, 0x0c, 0xa9, 0xfe, 0x64, 0x53, 0x69, 0x7a}; |
| 17 void CalcEncryptKey(CPDF_Dictionary* pEncrypt, | 17 void CalcEncryptKey(CPDF_Dictionary* pEncrypt, |
| 18 const uint8_t* password, | 18 const uint8_t* password, |
| 19 FX_DWORD pass_size, | 19 FX_DWORD pass_size, |
| 20 uint8_t* key, | 20 uint8_t* key, |
| 21 int keylen, | 21 int keylen, |
| 22 FX_BOOL bIgnoreMeta, | 22 FX_BOOL bIgnoreMeta, |
| 23 CPDF_Array* pIdArray) { | 23 CPDF_Array* pIdArray) { |
| 24 int revision = pEncrypt->GetInteger("R"); | 24 int revision = pEncrypt->GetIntegerBy("R"); |
| 25 uint8_t passcode[32]; | 25 uint8_t passcode[32]; |
| 26 for (FX_DWORD i = 0; i < 32; i++) { | 26 for (FX_DWORD i = 0; i < 32; i++) { |
| 27 passcode[i] = i < pass_size ? password[i] : defpasscode[i - pass_size]; | 27 passcode[i] = i < pass_size ? password[i] : defpasscode[i - pass_size]; |
| 28 } | 28 } |
| 29 uint8_t md5[100]; | 29 uint8_t md5[100]; |
| 30 CRYPT_MD5Start(md5); | 30 CRYPT_MD5Start(md5); |
| 31 CRYPT_MD5Update(md5, passcode, 32); | 31 CRYPT_MD5Update(md5, passcode, 32); |
| 32 CFX_ByteString okey = pEncrypt->GetString("O"); | 32 CFX_ByteString okey = pEncrypt->GetStringBy("O"); |
| 33 CRYPT_MD5Update(md5, (uint8_t*)okey.c_str(), okey.GetLength()); | 33 CRYPT_MD5Update(md5, (uint8_t*)okey.c_str(), okey.GetLength()); |
| 34 FX_DWORD perm = pEncrypt->GetInteger("P"); | 34 FX_DWORD perm = pEncrypt->GetIntegerBy("P"); |
| 35 CRYPT_MD5Update(md5, (uint8_t*)&perm, 4); | 35 CRYPT_MD5Update(md5, (uint8_t*)&perm, 4); |
| 36 if (pIdArray) { | 36 if (pIdArray) { |
| 37 CFX_ByteString id = pIdArray->GetString(0); | 37 CFX_ByteString id = pIdArray->GetStringAt(0); |
| 38 CRYPT_MD5Update(md5, (uint8_t*)id.c_str(), id.GetLength()); | 38 CRYPT_MD5Update(md5, (uint8_t*)id.c_str(), id.GetLength()); |
| 39 } | 39 } |
| 40 if (!bIgnoreMeta && revision >= 3 && | 40 if (!bIgnoreMeta && revision >= 3 && |
| 41 !pEncrypt->GetInteger("EncryptMetadata", 1)) { | 41 !pEncrypt->GetIntegerBy("EncryptMetadata", 1)) { |
| 42 FX_DWORD tag = (FX_DWORD)-1; | 42 FX_DWORD tag = (FX_DWORD)-1; |
| 43 CRYPT_MD5Update(md5, (uint8_t*)&tag, 4); | 43 CRYPT_MD5Update(md5, (uint8_t*)&tag, 4); |
| 44 } | 44 } |
| 45 uint8_t digest[16]; | 45 uint8_t digest[16]; |
| 46 CRYPT_MD5Finish(md5, digest); | 46 CRYPT_MD5Finish(md5, digest); |
| 47 FX_DWORD copy_len = keylen; | 47 FX_DWORD copy_len = keylen; |
| 48 if (copy_len > sizeof(digest)) { | 48 if (copy_len > sizeof(digest)) { |
| 49 copy_len = sizeof(digest); | 49 copy_len = sizeof(digest); |
| 50 } | 50 } |
| 51 if (revision >= 3) { | 51 if (revision >= 3) { |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 103 return CheckPassword(password, password.GetLength(), FALSE, m_EncryptKey, | 103 return CheckPassword(password, password.GetLength(), FALSE, m_EncryptKey, |
| 104 key_len); | 104 key_len); |
| 105 } | 105 } |
| 106 FX_DWORD CPDF_StandardSecurityHandler::GetPermissions() { | 106 FX_DWORD CPDF_StandardSecurityHandler::GetPermissions() { |
| 107 return m_Permissions; | 107 return m_Permissions; |
| 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->GetIntegerBy("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->GetDictBy("CF"); |
| 118 if (!pCryptFilters) { | 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->GetDictBy(name); |
| 125 if (!pDefFilter) { | 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->GetIntegerBy("Length", 0); |
| 131 if (nKeyBits == 0) { | 131 if (nKeyBits == 0) { |
| 132 nKeyBits = pEncryptDict->GetInteger("Length", 128); | 132 nKeyBits = pEncryptDict->GetIntegerBy("Length", 128); |
| 133 } | 133 } |
| 134 } else { | 134 } else { |
| 135 nKeyBits = pEncryptDict->GetInteger("Length", 256); | 135 nKeyBits = pEncryptDict->GetIntegerBy("Length", 256); |
| 136 } | 136 } |
| 137 if (nKeyBits < 40) { | 137 if (nKeyBits < 40) { |
| 138 nKeyBits *= 8; | 138 nKeyBits *= 8; |
| 139 } | 139 } |
| 140 keylen = nKeyBits / 8; | 140 keylen = nKeyBits / 8; |
| 141 CFX_ByteString cipher_name = pDefFilter->GetString("CFM"); | 141 CFX_ByteString cipher_name = pDefFilter->GetStringBy("CFM"); |
| 142 if (cipher_name == "AESV2" || cipher_name == "AESV3") { | 142 if (cipher_name == "AESV2" || cipher_name == "AESV3") { |
| 143 cipher = FXCIPHER_AES; | 143 cipher = FXCIPHER_AES; |
| 144 } | 144 } |
| 145 } | 145 } |
| 146 } else { | 146 } else { |
| 147 keylen = Version > 1 ? pEncryptDict->GetInteger("Length", 40) / 8 : 5; | 147 keylen = Version > 1 ? pEncryptDict->GetIntegerBy("Length", 40) / 8 : 5; |
| 148 } | 148 } |
| 149 if (keylen > 32 || keylen < 0) { | 149 if (keylen > 32 || keylen < 0) { |
| 150 return FALSE; | 150 return FALSE; |
| 151 } | 151 } |
| 152 return TRUE; | 152 return TRUE; |
| 153 } | 153 } |
| 154 FX_BOOL CPDF_StandardSecurityHandler::LoadDict(CPDF_Dictionary* pEncryptDict) { | 154 FX_BOOL CPDF_StandardSecurityHandler::LoadDict(CPDF_Dictionary* pEncryptDict) { |
| 155 m_pEncryptDict = pEncryptDict; | 155 m_pEncryptDict = pEncryptDict; |
| 156 m_bOwner = FALSE; | 156 m_bOwner = FALSE; |
| 157 m_Version = pEncryptDict->GetInteger("V"); | 157 m_Version = pEncryptDict->GetIntegerBy("V"); |
| 158 m_Revision = pEncryptDict->GetInteger("R"); | 158 m_Revision = pEncryptDict->GetIntegerBy("R"); |
| 159 m_Permissions = pEncryptDict->GetInteger("P", -1); | 159 m_Permissions = pEncryptDict->GetIntegerBy("P", -1); |
| 160 if (m_Version < 4) { | 160 if (m_Version < 4) { |
| 161 return _LoadCryptInfo(pEncryptDict, CFX_ByteString(), m_Cipher, m_KeyLen); | 161 return _LoadCryptInfo(pEncryptDict, CFX_ByteString(), m_Cipher, m_KeyLen); |
| 162 } | 162 } |
| 163 CFX_ByteString stmf_name = pEncryptDict->GetString("StmF"); | 163 CFX_ByteString stmf_name = pEncryptDict->GetStringBy("StmF"); |
| 164 CFX_ByteString strf_name = pEncryptDict->GetString("StrF"); | 164 CFX_ByteString strf_name = pEncryptDict->GetStringBy("StrF"); |
| 165 if (stmf_name != strf_name) { | 165 if (stmf_name != strf_name) { |
| 166 return FALSE; | 166 return FALSE; |
| 167 } | 167 } |
| 168 if (!_LoadCryptInfo(pEncryptDict, strf_name, m_Cipher, m_KeyLen)) { | 168 if (!_LoadCryptInfo(pEncryptDict, strf_name, m_Cipher, m_KeyLen)) { |
| 169 return FALSE; | 169 return FALSE; |
| 170 } | 170 } |
| 171 return TRUE; | 171 return TRUE; |
| 172 } | 172 } |
| 173 FX_BOOL CPDF_StandardSecurityHandler::LoadDict(CPDF_Dictionary* pEncryptDict, | 173 FX_BOOL CPDF_StandardSecurityHandler::LoadDict(CPDF_Dictionary* pEncryptDict, |
| 174 FX_DWORD type, | 174 FX_DWORD type, |
| 175 int& cipher, | 175 int& cipher, |
| 176 int& key_len) { | 176 int& key_len) { |
| 177 m_pEncryptDict = pEncryptDict; | 177 m_pEncryptDict = pEncryptDict; |
| 178 m_bOwner = FALSE; | 178 m_bOwner = FALSE; |
| 179 m_Version = pEncryptDict->GetInteger("V"); | 179 m_Version = pEncryptDict->GetIntegerBy("V"); |
| 180 m_Revision = pEncryptDict->GetInteger("R"); | 180 m_Revision = pEncryptDict->GetIntegerBy("R"); |
| 181 m_Permissions = pEncryptDict->GetInteger("P", -1); | 181 m_Permissions = pEncryptDict->GetIntegerBy("P", -1); |
| 182 CFX_ByteString strf_name, stmf_name; | 182 CFX_ByteString strf_name, stmf_name; |
| 183 if (m_Version >= 4) { | 183 if (m_Version >= 4) { |
| 184 stmf_name = pEncryptDict->GetString("StmF"); | 184 stmf_name = pEncryptDict->GetStringBy("StmF"); |
| 185 strf_name = pEncryptDict->GetString("StrF"); | 185 strf_name = pEncryptDict->GetStringBy("StrF"); |
| 186 if (stmf_name != strf_name) { | 186 if (stmf_name != strf_name) { |
| 187 return FALSE; | 187 return FALSE; |
| 188 } | 188 } |
| 189 } | 189 } |
| 190 if (!_LoadCryptInfo(pEncryptDict, strf_name, cipher, key_len)) { | 190 if (!_LoadCryptInfo(pEncryptDict, strf_name, cipher, key_len)) { |
| 191 return FALSE; | 191 return FALSE; |
| 192 } | 192 } |
| 193 m_Cipher = cipher; | 193 m_Cipher = cipher; |
| 194 m_KeyLen = key_len; | 194 m_KeyLen = key_len; |
| 195 return TRUE; | 195 return TRUE; |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 295 if (hash) { | 295 if (hash) { |
| 296 FXSYS_memcpy(hash, input, 32); | 296 FXSYS_memcpy(hash, input, 32); |
| 297 } | 297 } |
| 298 } | 298 } |
| 299 FX_BOOL CPDF_StandardSecurityHandler::AES256_CheckPassword( | 299 FX_BOOL CPDF_StandardSecurityHandler::AES256_CheckPassword( |
| 300 const uint8_t* password, | 300 const uint8_t* password, |
| 301 FX_DWORD size, | 301 FX_DWORD size, |
| 302 FX_BOOL bOwner, | 302 FX_BOOL bOwner, |
| 303 uint8_t* key) { | 303 uint8_t* key) { |
| 304 CFX_ByteString okey = | 304 CFX_ByteString okey = |
| 305 m_pEncryptDict ? m_pEncryptDict->GetString("O") : CFX_ByteString(); | 305 m_pEncryptDict ? m_pEncryptDict->GetStringBy("O") : CFX_ByteString(); |
| 306 if (okey.GetLength() < 48) { | 306 if (okey.GetLength() < 48) { |
| 307 return FALSE; | 307 return FALSE; |
| 308 } | 308 } |
| 309 CFX_ByteString ukey = | 309 CFX_ByteString ukey = |
| 310 m_pEncryptDict ? m_pEncryptDict->GetString("U") : CFX_ByteString(); | 310 m_pEncryptDict ? m_pEncryptDict->GetStringBy("U") : CFX_ByteString(); |
| 311 if (ukey.GetLength() < 48) { | 311 if (ukey.GetLength() < 48) { |
| 312 return FALSE; | 312 return FALSE; |
| 313 } | 313 } |
| 314 const uint8_t* pkey = bOwner ? (const uint8_t*)okey : (const uint8_t*)ukey; | 314 const uint8_t* pkey = bOwner ? (const uint8_t*)okey : (const uint8_t*)ukey; |
| 315 uint8_t sha[128]; | 315 uint8_t sha[128]; |
| 316 uint8_t digest[32]; | 316 uint8_t digest[32]; |
| 317 if (m_Revision >= 6) { | 317 if (m_Revision >= 6) { |
| 318 Revision6_Hash(password, size, (const uint8_t*)pkey + 32, | 318 Revision6_Hash(password, size, (const uint8_t*)pkey + 32, |
| 319 (bOwner ? (const uint8_t*)ukey : NULL), digest); | 319 (bOwner ? (const uint8_t*)ukey : NULL), digest); |
| 320 } else { | 320 } else { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 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) { |
| 343 CRYPT_SHA256Update(sha, ukey, 48); | 343 CRYPT_SHA256Update(sha, ukey, 48); |
| 344 } | 344 } |
| 345 CRYPT_SHA256Finish(sha, digest); | 345 CRYPT_SHA256Finish(sha, digest); |
| 346 } | 346 } |
| 347 CFX_ByteString ekey = m_pEncryptDict | 347 CFX_ByteString ekey = m_pEncryptDict |
| 348 ? m_pEncryptDict->GetString(bOwner ? "OE" : "UE") | 348 ? m_pEncryptDict->GetStringBy(bOwner ? "OE" : "UE") |
| 349 : CFX_ByteString(); | 349 : CFX_ByteString(); |
| 350 if (ekey.GetLength() < 32) { | 350 if (ekey.GetLength() < 32) { |
| 351 return FALSE; | 351 return FALSE; |
| 352 } | 352 } |
| 353 uint8_t* aes = FX_Alloc(uint8_t, 2048); | 353 uint8_t* aes = FX_Alloc(uint8_t, 2048); |
| 354 CRYPT_AESSetKey(aes, 16, digest, 32, FALSE); | 354 CRYPT_AESSetKey(aes, 16, digest, 32, FALSE); |
| 355 uint8_t iv[16]; | 355 uint8_t iv[16]; |
| 356 FXSYS_memset(iv, 0, 16); | 356 FXSYS_memset(iv, 0, 16); |
| 357 CRYPT_AESSetIV(aes, iv); | 357 CRYPT_AESSetIV(aes, iv); |
| 358 CRYPT_AESDecrypt(aes, key, ekey, 32); | 358 CRYPT_AESDecrypt(aes, key, ekey, 32); |
| 359 CRYPT_AESSetKey(aes, 16, key, 32, FALSE); | 359 CRYPT_AESSetKey(aes, 16, key, 32, FALSE); |
| 360 CRYPT_AESSetIV(aes, iv); | 360 CRYPT_AESSetIV(aes, iv); |
| 361 CFX_ByteString perms = m_pEncryptDict->GetString("Perms"); | 361 CFX_ByteString perms = m_pEncryptDict->GetStringBy("Perms"); |
| 362 if (perms.IsEmpty()) { | 362 if (perms.IsEmpty()) { |
| 363 return FALSE; | 363 return FALSE; |
| 364 } | 364 } |
| 365 uint8_t perms_buf[16]; | 365 uint8_t perms_buf[16]; |
| 366 FXSYS_memset(perms_buf, 0, sizeof(perms_buf)); | 366 FXSYS_memset(perms_buf, 0, sizeof(perms_buf)); |
| 367 FX_DWORD copy_len = sizeof(perms_buf); | 367 FX_DWORD copy_len = sizeof(perms_buf); |
| 368 if (copy_len > (FX_DWORD)perms.GetLength()) { | 368 if (copy_len > (FX_DWORD)perms.GetLength()) { |
| 369 copy_len = perms.GetLength(); | 369 copy_len = perms.GetLength(); |
| 370 } | 370 } |
| 371 FXSYS_memcpy(perms_buf, (const uint8_t*)perms, copy_len); | 371 FXSYS_memcpy(perms_buf, (const uint8_t*)perms, copy_len); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 410 } | 410 } |
| 411 FX_BOOL CPDF_StandardSecurityHandler::CheckUserPassword( | 411 FX_BOOL CPDF_StandardSecurityHandler::CheckUserPassword( |
| 412 const uint8_t* password, | 412 const uint8_t* password, |
| 413 FX_DWORD pass_size, | 413 FX_DWORD pass_size, |
| 414 FX_BOOL bIgnoreEncryptMeta, | 414 FX_BOOL bIgnoreEncryptMeta, |
| 415 uint8_t* key, | 415 uint8_t* key, |
| 416 int32_t key_len) { | 416 int32_t key_len) { |
| 417 CalcEncryptKey(m_pEncryptDict, password, pass_size, key, key_len, | 417 CalcEncryptKey(m_pEncryptDict, password, pass_size, key, key_len, |
| 418 bIgnoreEncryptMeta, m_pParser->GetIDArray()); | 418 bIgnoreEncryptMeta, m_pParser->GetIDArray()); |
| 419 CFX_ByteString ukey = | 419 CFX_ByteString ukey = |
| 420 m_pEncryptDict ? m_pEncryptDict->GetString("U") : CFX_ByteString(); | 420 m_pEncryptDict ? m_pEncryptDict->GetStringBy("U") : CFX_ByteString(); |
| 421 if (ukey.GetLength() < 16) { | 421 if (ukey.GetLength() < 16) { |
| 422 return FALSE; | 422 return FALSE; |
| 423 } | 423 } |
| 424 uint8_t ukeybuf[32]; | 424 uint8_t ukeybuf[32]; |
| 425 if (m_Revision == 2) { | 425 if (m_Revision == 2) { |
| 426 FXSYS_memcpy(ukeybuf, defpasscode, 32); | 426 FXSYS_memcpy(ukeybuf, defpasscode, 32); |
| 427 CRYPT_ArcFourCryptBlock(ukeybuf, 32, key, key_len); | 427 CRYPT_ArcFourCryptBlock(ukeybuf, 32, key, key_len); |
| 428 } else { | 428 } else { |
| 429 uint8_t test[32], tmpkey[32]; | 429 uint8_t test[32], tmpkey[32]; |
| 430 FX_DWORD copy_len = sizeof(test); | 430 FX_DWORD copy_len = sizeof(test); |
| 431 if (copy_len > (FX_DWORD)ukey.GetLength()) { | 431 if (copy_len > (FX_DWORD)ukey.GetLength()) { |
| 432 copy_len = ukey.GetLength(); | 432 copy_len = ukey.GetLength(); |
| 433 } | 433 } |
| 434 FXSYS_memset(test, 0, sizeof(test)); | 434 FXSYS_memset(test, 0, sizeof(test)); |
| 435 FXSYS_memset(tmpkey, 0, sizeof(tmpkey)); | 435 FXSYS_memset(tmpkey, 0, sizeof(tmpkey)); |
| 436 FXSYS_memcpy(test, ukey.c_str(), copy_len); | 436 FXSYS_memcpy(test, ukey.c_str(), copy_len); |
| 437 for (int i = 19; i >= 0; i--) { | 437 for (int i = 19; i >= 0; i--) { |
| 438 for (int j = 0; j < key_len; j++) { | 438 for (int j = 0; j < key_len; j++) { |
| 439 tmpkey[j] = key[j] ^ i; | 439 tmpkey[j] = key[j] ^ i; |
| 440 } | 440 } |
| 441 CRYPT_ArcFourCryptBlock(test, 32, tmpkey, key_len); | 441 CRYPT_ArcFourCryptBlock(test, 32, tmpkey, key_len); |
| 442 } | 442 } |
| 443 uint8_t md5[100]; | 443 uint8_t md5[100]; |
| 444 CRYPT_MD5Start(md5); | 444 CRYPT_MD5Start(md5); |
| 445 CRYPT_MD5Update(md5, defpasscode, 32); | 445 CRYPT_MD5Update(md5, defpasscode, 32); |
| 446 CPDF_Array* pIdArray = m_pParser->GetIDArray(); | 446 CPDF_Array* pIdArray = m_pParser->GetIDArray(); |
| 447 if (pIdArray) { | 447 if (pIdArray) { |
| 448 CFX_ByteString id = pIdArray->GetString(0); | 448 CFX_ByteString id = pIdArray->GetStringAt(0); |
| 449 CRYPT_MD5Update(md5, (uint8_t*)id.c_str(), id.GetLength()); | 449 CRYPT_MD5Update(md5, (uint8_t*)id.c_str(), id.GetLength()); |
| 450 } | 450 } |
| 451 CRYPT_MD5Finish(md5, ukeybuf); | 451 CRYPT_MD5Finish(md5, ukeybuf); |
| 452 return FXSYS_memcmp(test, ukeybuf, 16) == 0; | 452 return FXSYS_memcmp(test, ukeybuf, 16) == 0; |
| 453 } | 453 } |
| 454 if (FXSYS_memcmp((void*)ukey.c_str(), ukeybuf, 16) == 0) { | 454 if (FXSYS_memcmp((void*)ukey.c_str(), ukeybuf, 16) == 0) { |
| 455 return TRUE; | 455 return TRUE; |
| 456 } | 456 } |
| 457 return FALSE; | 457 return FALSE; |
| 458 } | 458 } |
| 459 CFX_ByteString CPDF_StandardSecurityHandler::GetUserPassword( | 459 CFX_ByteString CPDF_StandardSecurityHandler::GetUserPassword( |
| 460 const uint8_t* owner_pass, | 460 const uint8_t* owner_pass, |
| 461 FX_DWORD pass_size) { | 461 FX_DWORD pass_size) { |
| 462 return GetUserPassword(owner_pass, pass_size, m_KeyLen); | 462 return GetUserPassword(owner_pass, pass_size, m_KeyLen); |
| 463 } | 463 } |
| 464 CFX_ByteString CPDF_StandardSecurityHandler::GetUserPassword( | 464 CFX_ByteString CPDF_StandardSecurityHandler::GetUserPassword( |
| 465 const uint8_t* owner_pass, | 465 const uint8_t* owner_pass, |
| 466 FX_DWORD pass_size, | 466 FX_DWORD pass_size, |
| 467 int32_t key_len) { | 467 int32_t key_len) { |
| 468 CFX_ByteString okey = m_pEncryptDict->GetString("O"); | 468 CFX_ByteString okey = m_pEncryptDict->GetStringBy("O"); |
| 469 uint8_t passcode[32]; | 469 uint8_t passcode[32]; |
| 470 FX_DWORD i; | 470 FX_DWORD i; |
| 471 for (i = 0; i < 32; i++) { | 471 for (i = 0; i < 32; i++) { |
| 472 passcode[i] = i < pass_size ? owner_pass[i] : defpasscode[i - pass_size]; | 472 passcode[i] = i < pass_size ? owner_pass[i] : defpasscode[i - pass_size]; |
| 473 } | 473 } |
| 474 uint8_t digest[16]; | 474 uint8_t digest[16]; |
| 475 CRYPT_MD5Generate(passcode, 32, digest); | 475 CRYPT_MD5Generate(passcode, 32, digest); |
| 476 if (m_Revision >= 3) { | 476 if (m_Revision >= 3) { |
| 477 for (int i = 0; i < 50; i++) { | 477 for (int i = 0; i < 50; i++) { |
| 478 CRYPT_MD5Generate(digest, 16, digest); | 478 CRYPT_MD5Generate(digest, 16, digest); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 517 int32_t key_len) { | 517 int32_t key_len) { |
| 518 CFX_ByteString user_pass = GetUserPassword(password, pass_size, key_len); | 518 CFX_ByteString user_pass = GetUserPassword(password, pass_size, key_len); |
| 519 if (CheckUserPassword(user_pass, user_pass.GetLength(), FALSE, key, | 519 if (CheckUserPassword(user_pass, user_pass.GetLength(), FALSE, key, |
| 520 key_len)) { | 520 key_len)) { |
| 521 return TRUE; | 521 return TRUE; |
| 522 } | 522 } |
| 523 return CheckUserPassword(user_pass, user_pass.GetLength(), TRUE, key, | 523 return CheckUserPassword(user_pass, user_pass.GetLength(), TRUE, key, |
| 524 key_len); | 524 key_len); |
| 525 } | 525 } |
| 526 FX_BOOL CPDF_StandardSecurityHandler::IsMetadataEncrypted() { | 526 FX_BOOL CPDF_StandardSecurityHandler::IsMetadataEncrypted() { |
| 527 return m_pEncryptDict->GetBoolean("EncryptMetadata", TRUE); | 527 return m_pEncryptDict->GetBooleanBy("EncryptMetadata", TRUE); |
| 528 } | 528 } |
| 529 CPDF_SecurityHandler* FPDF_CreateStandardSecurityHandler() { | 529 CPDF_SecurityHandler* FPDF_CreateStandardSecurityHandler() { |
| 530 return new CPDF_StandardSecurityHandler; | 530 return new CPDF_StandardSecurityHandler; |
| 531 } | 531 } |
| 532 void CPDF_StandardSecurityHandler::OnCreate(CPDF_Dictionary* pEncryptDict, | 532 void CPDF_StandardSecurityHandler::OnCreate(CPDF_Dictionary* pEncryptDict, |
| 533 CPDF_Array* pIdArray, | 533 CPDF_Array* pIdArray, |
| 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, |
| (...skipping 13 matching lines...) Expand all Loading... |
| 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); |
| 555 CRYPT_SHA256Finish(sha, m_EncryptKey); | 555 CRYPT_SHA256Finish(sha, m_EncryptKey); |
| 556 AES256_SetPassword(pEncryptDict, user_pass, user_size, FALSE, m_EncryptKey); | 556 AES256_SetPassword(pEncryptDict, user_pass, user_size, FALSE, m_EncryptKey); |
| 557 if (bDefault) { | 557 if (bDefault) { |
| 558 AES256_SetPassword(pEncryptDict, owner_pass, owner_size, TRUE, | 558 AES256_SetPassword(pEncryptDict, owner_pass, owner_size, TRUE, |
| 559 m_EncryptKey); | 559 m_EncryptKey); |
| 560 AES256_SetPerms(pEncryptDict, m_Permissions, | 560 AES256_SetPerms(pEncryptDict, m_Permissions, |
| 561 pEncryptDict->GetBoolean("EncryptMetadata", TRUE), | 561 pEncryptDict->GetBooleanBy("EncryptMetadata", TRUE), |
| 562 m_EncryptKey); | 562 m_EncryptKey); |
| 563 } | 563 } |
| 564 return; | 564 return; |
| 565 } | 565 } |
| 566 if (bDefault) { | 566 if (bDefault) { |
| 567 uint8_t passcode[32]; | 567 uint8_t passcode[32]; |
| 568 FX_DWORD i; | 568 FX_DWORD i; |
| 569 for (i = 0; i < 32; i++) { | 569 for (i = 0; i < 32; i++) { |
| 570 passcode[i] = | 570 passcode[i] = |
| 571 i < owner_size ? owner_pass[i] : defpasscode[i - owner_size]; | 571 i < owner_size ? owner_pass[i] : defpasscode[i - owner_size]; |
| (...skipping 27 matching lines...) Expand all Loading... |
| 599 if (m_Revision < 3) { | 599 if (m_Revision < 3) { |
| 600 uint8_t tempbuf[32]; | 600 uint8_t tempbuf[32]; |
| 601 FXSYS_memcpy(tempbuf, defpasscode, 32); | 601 FXSYS_memcpy(tempbuf, defpasscode, 32); |
| 602 CRYPT_ArcFourCryptBlock(tempbuf, 32, m_EncryptKey, key_len); | 602 CRYPT_ArcFourCryptBlock(tempbuf, 32, m_EncryptKey, key_len); |
| 603 pEncryptDict->SetAtString("U", CFX_ByteString(tempbuf, 32)); | 603 pEncryptDict->SetAtString("U", CFX_ByteString(tempbuf, 32)); |
| 604 } else { | 604 } else { |
| 605 uint8_t md5[100]; | 605 uint8_t md5[100]; |
| 606 CRYPT_MD5Start(md5); | 606 CRYPT_MD5Start(md5); |
| 607 CRYPT_MD5Update(md5, defpasscode, 32); | 607 CRYPT_MD5Update(md5, defpasscode, 32); |
| 608 if (pIdArray) { | 608 if (pIdArray) { |
| 609 CFX_ByteString id = pIdArray->GetString(0); | 609 CFX_ByteString id = pIdArray->GetStringAt(0); |
| 610 CRYPT_MD5Update(md5, (uint8_t*)id.c_str(), id.GetLength()); | 610 CRYPT_MD5Update(md5, (uint8_t*)id.c_str(), id.GetLength()); |
| 611 } | 611 } |
| 612 uint8_t digest[32]; | 612 uint8_t digest[32]; |
| 613 CRYPT_MD5Finish(md5, digest); | 613 CRYPT_MD5Finish(md5, digest); |
| 614 CRYPT_ArcFourCryptBlock(digest, 16, m_EncryptKey, key_len); | 614 CRYPT_ArcFourCryptBlock(digest, 16, m_EncryptKey, key_len); |
| 615 uint8_t tempkey[32]; | 615 uint8_t tempkey[32]; |
| 616 for (int i = 1; i <= 19; i++) { | 616 for (int i = 1; i <= 19; i++) { |
| 617 for (int j = 0; j < key_len; j++) { | 617 for (int j = 0; j < key_len; j++) { |
| 618 tempkey[j] = m_EncryptKey[j] ^ (uint8_t)i; | 618 tempkey[j] = m_EncryptKey[j] ^ (uint8_t)i; |
| 619 } | 619 } |
| (...skipping 25 matching lines...) Expand all Loading... |
| 645 const uint8_t* password, | 645 const uint8_t* password, |
| 646 FX_DWORD size, | 646 FX_DWORD size, |
| 647 FX_BOOL bOwner, | 647 FX_BOOL bOwner, |
| 648 const uint8_t* key) { | 648 const uint8_t* key) { |
| 649 uint8_t sha[128]; | 649 uint8_t sha[128]; |
| 650 CRYPT_SHA1Start(sha); | 650 CRYPT_SHA1Start(sha); |
| 651 CRYPT_SHA1Update(sha, key, 32); | 651 CRYPT_SHA1Update(sha, key, 32); |
| 652 CRYPT_SHA1Update(sha, (uint8_t*)"hello", 5); | 652 CRYPT_SHA1Update(sha, (uint8_t*)"hello", 5); |
| 653 uint8_t digest[20]; | 653 uint8_t digest[20]; |
| 654 CRYPT_SHA1Finish(sha, digest); | 654 CRYPT_SHA1Finish(sha, digest); |
| 655 CFX_ByteString ukey = pEncryptDict->GetString("U"); | 655 CFX_ByteString ukey = pEncryptDict->GetStringBy("U"); |
| 656 uint8_t digest1[48]; | 656 uint8_t digest1[48]; |
| 657 if (m_Revision >= 6) { | 657 if (m_Revision >= 6) { |
| 658 Revision6_Hash(password, size, digest, | 658 Revision6_Hash(password, size, digest, |
| 659 (bOwner ? (const uint8_t*)ukey : NULL), digest1); | 659 (bOwner ? (const uint8_t*)ukey : NULL), digest1); |
| 660 } else { | 660 } else { |
| 661 CRYPT_SHA256Start(sha); | 661 CRYPT_SHA256Start(sha); |
| 662 CRYPT_SHA256Update(sha, password, size); | 662 CRYPT_SHA256Update(sha, password, size); |
| 663 CRYPT_SHA256Update(sha, digest, 8); | 663 CRYPT_SHA256Update(sha, digest, 8); |
| 664 if (bOwner) { | 664 if (bOwner) { |
| 665 CRYPT_SHA256Update(sha, ukey, ukey.GetLength()); | 665 CRYPT_SHA256Update(sha, ukey, ukey.GetLength()); |
| (...skipping 363 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 |