Skip to content

Commit

Permalink
Merge pull request #6821 from yurydelendik/bug951051
Browse files Browse the repository at this point in the history
Bug 951051 - Better crypto key length recovery.
  • Loading branch information
yurydelendik committed Dec 29, 2015
2 parents b32cdf5 + c991480 commit b8e7efa
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 1 deletion.
23 changes: 22 additions & 1 deletion src/core/crypto.js
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ var utf8StringToString = sharedUtil.utf8StringToString;
var warn = sharedUtil.warn;
var Name = corePrimitives.Name;
var isName = corePrimitives.isName;
var isDict = corePrimitives.isDict;
var DecryptStream = coreStream.DecryptStream;

var ARCFourCipher = (function ARCFourCipherClosure() {
Expand Down Expand Up @@ -1921,7 +1922,27 @@ var CipherTransformFactory = (function CipherTransformFactoryClosure() {
error('unsupported encryption algorithm');
}
this.algorithm = algorithm;
var keyLength = dict.get('Length') || 40;
var keyLength = dict.get('Length');
if (!keyLength) {
// Spec asks to rely on encryption dictionary's Length entry, however
// some PDFs don't have it. Trying to recover.
if (algorithm <= 3) {
// For 1 and 2 it's fixed to 40-bit, for 3 40-bit is a minimal value.
keyLength = 40;
} else {
// Trying to find default handler -- it usually has Length.
var cfDict = dict.get('CF');
var streamCryptoName = dict.get('StmF');
if (isDict(cfDict) && isName(streamCryptoName)) {
var handlerDict = cfDict.get(streamCryptoName.name);
keyLength = (handlerDict && handlerDict.get('Length')) || 128;
if (keyLength < 40) {
// Sometimes it's incorrect value of bits, generators specify bytes.
keyLength <<= 3;
}
}
}
}
if (!isInt(keyLength) ||
keyLength < 40 || (keyLength % 8) !== 0) {
error('invalid key length');
Expand Down
1 change: 1 addition & 0 deletions test/pdfs/bug951051.pdf.link
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
http://web.archive.org/web/20120618235740/http://www.intreprinzatorturism.ro/wp-content/uploads/2012/05/ITPR-studiu-online-5000-turisti-straini_martie-2012.pdf
8 changes: 8 additions & 0 deletions test/test_manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -2007,6 +2007,14 @@
"link": true,
"type": "eq"
},
{ "id": "bug951051",
"file": "pdfs/bug951051.pdf",
"md5": "05d325a5112bd3f6022367dab7bc07b9",
"rounds": 1,
"lastPage": 1,
"link": true,
"type": "load"
},
{ "id": "issue3062",
"file": "pdfs/issue3062.pdf",
"md5": "206715f1258f0e117df4180d98dd4d68",
Expand Down

0 comments on commit b8e7efa

Please sign in to comment.