aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2019-08-24 16:52:10 +0200
committerJay Berkenbilt <ejb@ql.org>2019-08-24 17:01:19 +0200
commit9ebb55aff1e24ff48545a67bc12d0e1918d779dd (patch)
treefd4aaa31db75856e7d43908f1684484d88dadb12
parent5da146c8b53bb5a12c514f83fb52265e4922b5e1 (diff)
downloadqpdf-9ebb55aff1e24ff48545a67bc12d0e1918d779dd.tar.zst
Include password match information in show encryption
-rw-r--r--qpdf/qpdf.cc8
-rw-r--r--qpdf/qtest/qpdf.test134
-rw-r--r--qpdf/qtest/qpdf/V4-aes-clearmeta-encryption.out2
-rw-r--r--qpdf/qtest/qpdf/V4-aes-encryption.out2
-rw-r--r--qpdf/qtest/qpdf/V4-clearmeta-encryption.out2
-rw-r--r--qpdf/qtest/qpdf/V4-encryption.out2
-rw-r--r--qpdf/qtest/qpdf/V5R5.out1
-rw-r--r--qpdf/qtest/qpdf/V5R6.out1
-rw-r--r--qpdf/qtest/qpdf/bad-encryption-length.out1
-rw-r--r--qpdf/qtest/qpdf/c-r5-key-owner.out1
-rw-r--r--qpdf/qtest/qpdf/c-r5-key-user.out1
-rw-r--r--qpdf/qtest/qpdf/c-r5.out1
-rw-r--r--qpdf/qtest/qpdf/c-r6.out1
-rw-r--r--qpdf/qtest/qpdf/copied-encryption.out1
-rw-r--r--qpdf/qtest/qpdf/enc-XI-R6,V5,U=wwwww,O=wwwww.pdfbin0 -> 13642 bytes
-rw-r--r--qpdf/qtest/qpdf/encrypt-before-filename.out1
-rw-r--r--qpdf/qtest/qpdf/encrypted-40-bit-R3.out1
-rw-r--r--qpdf/qtest/qpdf/encrypted-with-images.10-ogen.check1
-rw-r--r--qpdf/qtest/qpdf/encrypted-with-images.10.check1
-rw-r--r--qpdf/qtest/qpdf/encrypted-with-images.11-ogen.check1
-rw-r--r--qpdf/qtest/qpdf/encrypted-with-images.11.check1
-rw-r--r--qpdf/qtest/qpdf/encrypted-with-images.12-ogen.check2
-rw-r--r--qpdf/qtest/qpdf/encrypted-with-images.12.check2
-rw-r--r--qpdf/qtest/qpdf/encrypted-with-images.9-ogen.check2
-rw-r--r--qpdf/qtest/qpdf/encrypted-with-images.9.check2
-rw-r--r--qpdf/qtest/qpdf/hybrid-xref.10-ogen.check1
-rw-r--r--qpdf/qtest/qpdf/hybrid-xref.10.check1
-rw-r--r--qpdf/qtest/qpdf/hybrid-xref.11-ogen.check1
-rw-r--r--qpdf/qtest/qpdf/hybrid-xref.11.check1
-rw-r--r--qpdf/qtest/qpdf/inline-images.10-ogen.check1
-rw-r--r--qpdf/qtest/qpdf/inline-images.10.check1
-rw-r--r--qpdf/qtest/qpdf/inline-images.11-ogen.check1
-rw-r--r--qpdf/qtest/qpdf/inline-images.11.check1
-rw-r--r--qpdf/qtest/qpdf/invalid-id-xref.out1
-rw-r--r--qpdf/qtest/qpdf/leading-junk.out1
-rw-r--r--qpdf/qtest/qpdf/lin-special.10-ogen.check1
-rw-r--r--qpdf/qtest/qpdf/lin-special.10.check1
-rw-r--r--qpdf/qtest/qpdf/lin-special.11-ogen.check1
-rw-r--r--qpdf/qtest/qpdf/lin-special.11.check1
-rw-r--r--qpdf/qtest/qpdf/long-id-check.out1
-rw-r--r--qpdf/qtest/qpdf/object-stream.10-ogen.check1
-rw-r--r--qpdf/qtest/qpdf/object-stream.10.check1
-rw-r--r--qpdf/qtest/qpdf/object-stream.11-ogen.check1
-rw-r--r--qpdf/qtest/qpdf/object-stream.11.check1
-rw-r--r--qpdf/qtest/qpdf/short-O-U.out2
-rw-r--r--qpdf/qtest/qpdf/short-id-check.out1
-rw-r--r--qpdf/qtest/qpdf/unicode-op.out1
-rw-r--r--qpdf/qtest/qpdf/unicode-up.out1
48 files changed, 136 insertions, 60 deletions
diff --git a/qpdf/qpdf.cc b/qpdf/qpdf.cc
index a5eef425..467db2fc 100644
--- a/qpdf/qpdf.cc
+++ b/qpdf/qpdf.cc
@@ -2550,6 +2550,14 @@ static void show_encryption(QPDF& pdf, Options& o)
std::cout << "Encryption key = "
<< QUtil::hex_encode(encryption_key) << std::endl;
}
+ if (pdf.ownerPasswordMatched())
+ {
+ std::cout << "Supplied password is owner password" << std::endl;
+ }
+ if (pdf.userPasswordMatched())
+ {
+ std::cout << "Supplied password is user password" << std::endl;
+ }
std::cout << "extract for accessibility: "
<< show_bool(pdf.allowAccessibility()) << std::endl
<< "extract for any purpose: "
diff --git a/qpdf/qtest/qpdf.test b/qpdf/qtest/qpdf.test
index 9474d723..00f29c72 100644
--- a/qpdf/qtest/qpdf.test
+++ b/qpdf/qtest/qpdf.test
@@ -3005,81 +3005,84 @@ $td->notify("--- Encryption Tests ---");
# print-low-res, print-high-res, modify-assembly, modify-forms,
# modify-annotate, modify-other, modify-all
my @encrypted_files =
- (['base', ''],
- ['R3,V2', '',
+ (['base', ''], # 1
+ ['R3,V2', '', # 2
'-accessibility=n -extract=n -print=full -modify=all', -532,
- 0, 0, 1, 1, 1, 1, 1, 1, 1],
- ['R3,V2,U=view', 'view',
+ 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1],
+ ['R3,V2,U=view', 'view', # 3
'-accessibility=y -extract=n -print=none -modify=none', -3392,
- 1, 0, 0, 0, 0, 0, 0, 0, 0],
- ['R3,V2,O=master', 'master',
+ 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0],
+ ['R3,V2,O=master', 'master', # 4
'-accessibility=n -extract=y -print=none -modify=annotate', -2576,
- 0, 1, 0, 0, 1, 1, 1, 0, 0],
- ['R3,V2,O=master', '',
+ 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0],
+ ['R3,V2,O=master', '', # 5
'-accessibility=n -extract=n -print=none -modify=form', -2624,
- 0, 0, 0, 0, 1, 1, 0, 0, 0],
- ['R3,V2,U=view,O=master', 'view',
+ 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0],
+ ['R3,V2,U=view,O=master', 'view', # 6
'-accessibility=n -extract=n -print=none -modify=assembly', -2880,
- 0, 0, 0, 0, 1, 0, 0, 0, 0],
- ['R3,V2,U=view,O=master', 'master',
+ 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0],
+ ['R3,V2,U=view,O=master', 'master', # 7
'-accessibility=n -print=low', -2564,
- 0, 1, 1, 0, 1, 1, 1, 1, 1],
- ['R3,V2,U=view,O=master', 'master',
+ 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1],
+ ['R3,V2,U=view,O=master', 'master', # 8
'-modify=all -assemble=n', -1028,
- 1, 1, 1, 1, 0, 1, 1, 1, 0],
- ['R3,V2,U=view,O=master', 'master',
+ 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0],
+ ['R3,V2,U=view,O=master', 'master', # 9
'-modify=none -form=y', -1068,
- 1, 1, 1, 1, 0, 1, 0, 0, 0],
- ['R3,V2,U=view,O=master', 'master',
+ 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0],
+ ['R3,V2,U=view,O=master', 'master', # 10
'-modify=annotate -assemble=n', -1036,
- 1, 1, 1, 1, 0, 1, 1, 0, 0],
- ['R3,V2,U=view,O=master', 'master',
+ 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0],
+ ['R3,V2,U=view,O=master', 'master', # 11
'-form=n', -260,
- 1, 1, 1, 1, 1, 0, 1, 1, 0],
- ['R3,V2,U=view,O=master', 'master',
+ 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0],
+ ['R3,V2,U=view,O=master', 'master', # 12
'-annotate=n', -36,
- 1, 1, 1, 1, 1, 1, 0, 1, 0],
- ['R3,V2,U=view,O=master', 'master',
+ 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0],
+ ['R3,V2,U=view,O=master', 'master', # 13
'-modify-other=n', -12,
- 1, 1, 1, 1, 1, 1, 1, 0, 0],
- ['R2,V1', '',
+ 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0],
+ ['R2,V1', '', # 14
'-print=n -modify=n -extract=n -annotate=n', -64,
- 0, 0, 0, 0, 0, 0, 0, 0, 0],
- ['R2,V1,U=view', 'view',
+ 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+ ['R2,V1,U=view', 'view', # 15
'-print=y -modify=n -extract=n -annotate=n', -60,
- 0, 0, 1, 1, 0, 0, 0, 0, 0],
- ['R2,V1,O=master', 'master',
+ 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0],
+ ['R2,V1,O=master', 'master', # 16
'-print=n -modify=y -extract=n -annotate=n', -56,
- 0, 0, 0, 0, 1, 0, 0, 1, 0],
- ['R2,V1,O=master', '',
+ 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0],
+ ['R2,V1,O=master', '', # 17
'-print=n -modify=n -extract=y -annotate=n', -48,
- 1, 1, 0, 0, 0, 0, 0, 0, 0],
- ['R2,V1,U=view,O=master', 'view',
+ 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0],
+ ['R2,V1,U=view,O=master', 'view', # 18
'-print=n -modify=n -extract=n -annotate=y', -32,
- 0, 0, 0, 0, 0, 1, 1, 0, 0],
- ['R2,V1,U=view,O=master', 'master',
+ 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0],
+ ['R2,V1,U=view,O=master', 'master', # 19
'', -4,
- 1, 1, 1, 1, 1, 1, 1, 1, 1],
- ['long-password', 'asdf asdf asdf asdf asdf asdf qwer'],
- ['long-password', 'asdf asdf asdf asdf asdf asdf qw'],
- ['XI-base', ''],
- ['XI-R6,V5,O=master', '',
+ 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1],
+ ['long-password', 'asdf asdf asdf asdf asdf asdf qwer'], # 20
+ ['long-password', 'asdf asdf asdf asdf asdf asdf qw'], # 21
+ ['XI-base', ''], # 22
+ ['XI-R6,V5,O=master', '', # 23
'-extract=n -print=none -modify=assembly', -2368,
- 1, 0, 0, 0, 1, 0, 0, 0, 0],
- ['XI-R6,V5,O=master', 'master',
+ 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0],
+ ['XI-R6,V5,O=master', 'master', # 24
'-extract=n -print=none -modify=assembly', -2368,
- 1, 0, 0, 0, 1, 0, 0, 0, 0],
- ['XI-R6,V5,U=view,O=master', 'view',
+ 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0],
+ ['XI-R6,V5,U=view,O=master', 'view', # 25
'-print=low', -2052,
- 1, 1, 1, 0, 1, 1, 1, 1, 1],
- ['XI-R6,V5,U=view,O=master', 'master',
+ 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1],
+ ['XI-R6,V5,U=view,O=master', 'master', # 26
'-print=low', -2052,
- 1, 1, 1, 0, 1, 1, 1, 1, 1],
- ['XI-R6,V5,U=view,O=master', 'master',
+ 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1],
+ ['XI-R6,V5,U=view,O=master', 'master', # 27
'-accessibility=n', -4, # -accessibility=n has no effect
- 1, 1, 1, 1, 1, 1, 1, 1, 1],
- ['XI-long-password', 'qwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnm'],
- ['XI-long-password', 'qwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcv'],
+ 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1],
+ ['XI-long-password', 'qwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnm'], # 28; -accessibility=n has no effect
+ ['XI-long-password', 'qwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcv'], # 29
+ ['XI-R6,V5,U=wwwww,O=wwwww', 'wwwww', # 30
+ '', -4,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
);
$n_tests += 5 + (2 * (@encrypted_files)) + (6 * (@encrypted_files - 6)) + 9;
@@ -3112,15 +3115,26 @@ $td->runtest("significant password characters (V = 5)",
{$td->REGEXP => ".*invalid password.*", $td->EXIT_STATUS => 2});
my $enc_base = undef;
+my $enc_n = 0;
foreach my $d (@encrypted_files)
{
- my ($file, $pass, $xeflags, $P,
+ ++$enc_n;
+ my ($file, $pass, $xeflags, $P, $match_owner, $match_user,
$accessible, $extract, $printlow, $printhigh,
$modifyassembly, $modifyform, $modifyannot,
$modifyother, $modifyall) = @$d;
my $f = sub { $_[0] ? "allowed" : "not allowed" };
- my $enc_details =
+ my $enc_details = "";
+ if ($match_owner)
+ {
+ $enc_details .= "Supplied password is owner password\n";
+ }
+ if ($match_user)
+ {
+ $enc_details .= "Supplied password is user password\n";
+ }
+ $enc_details .=
"extract for accessibility: " . &$f($accessible) . "\n" .
"extract for any purpose: " . &$f($extract) . "\n" .
"print low resolution: " . &$f($printlow) . "\n" .
@@ -3194,7 +3208,7 @@ foreach my $d (@encrypted_files)
{$td->STRING => $accessibility_warning,
$td->EXIT_STATUS => 0},
$td->NORMALIZE_NEWLINES);
- $td->runtest("check /P",
+ $td->runtest("check /P enc2 ($enc_n)",
{$td->COMMAND =>
"qpdf --show-encryption --password=\"$pass\"" .
" $file.enc2"},
@@ -3218,7 +3232,7 @@ foreach my $d (@encrypted_files)
" $file.enc2 $file.enc4"},
{$td->STRING => "",
$td->EXIT_STATUS => 0});
- $td->runtest("check /P",
+ $td->runtest("check /P enc4 ($enc_n)",
{$td->COMMAND =>
"qpdf --show-encryption --password=\"$pass\"" .
" $file.enc4"},
@@ -3306,7 +3320,7 @@ $td->runtest("linearize encrypted file",
$td->EXIT_STATUS => 0});
$td->runtest("check encryption",
{$td->COMMAND => "qpdf --show-encryption a.pdf",
- $td->FILTER => "grep -v allowed"},
+ $td->FILTER => "grep -v allowed | grep -v Supplied"},
{$td->STRING => "R = 3\nP = -4\nUser password = \n",
$td->EXIT_STATUS => 0},
$td->NORMALIZE_NEWLINES);
@@ -3323,7 +3337,7 @@ $td->runtest("linearize and encrypt file",
$td->EXIT_STATUS => 0});
$td->runtest("check encryption",
{$td->COMMAND => "qpdf --show-encryption --password=owner a.pdf",
- $td->FILTER => "grep -v allowed | grep -v method"},
+ $td->FILTER => "grep -v allowed | grep -v method | grep -v Supplied"},
{$td->STRING => "R = 4\nP = -4\nUser password = user\n",
$td->EXIT_STATUS => 0},
$td->NORMALIZE_NEWLINES);
@@ -3342,7 +3356,7 @@ $td->runtest("encrypt with AES",
{$td->STRING => "", $td->EXIT_STATUS => 0});
$td->runtest("check encryption",
{$td->COMMAND => "qpdf --show-encryption a.pdf",
- $td->FILTER => "grep -v allowed | grep -v method"},
+ $td->FILTER => "grep -v allowed | grep -v method | grep -v Supplied"},
{$td->STRING => "R = 4\nP = -4\nUser password = \n",
$td->EXIT_STATUS => 0},
$td->NORMALIZE_NEWLINES);
@@ -3363,7 +3377,7 @@ $td->runtest("linearize with AES and object streams",
{$td->STRING => "", $td->EXIT_STATUS => 0});
$td->runtest("check encryption",
{$td->COMMAND => "qpdf --show-encryption a.pdf",
- $td->FILTER => "grep -v allowed | grep -v method"},
+ $td->FILTER => "grep -v allowed | grep -v method | grep -v Supplied"},
{$td->STRING => "R = 4\nP = -4\nUser password = \n",
$td->EXIT_STATUS => 0},
$td->NORMALIZE_NEWLINES);
diff --git a/qpdf/qtest/qpdf/V4-aes-clearmeta-encryption.out b/qpdf/qtest/qpdf/V4-aes-clearmeta-encryption.out
index 928818dc..eab0ad67 100644
--- a/qpdf/qtest/qpdf/V4-aes-clearmeta-encryption.out
+++ b/qpdf/qtest/qpdf/V4-aes-clearmeta-encryption.out
@@ -1,6 +1,8 @@
R = 4
P = -4
User password =
+Supplied password is owner password
+Supplied password is user password
extract for accessibility: allowed
extract for any purpose: allowed
print low resolution: allowed
diff --git a/qpdf/qtest/qpdf/V4-aes-encryption.out b/qpdf/qtest/qpdf/V4-aes-encryption.out
index 928818dc..eab0ad67 100644
--- a/qpdf/qtest/qpdf/V4-aes-encryption.out
+++ b/qpdf/qtest/qpdf/V4-aes-encryption.out
@@ -1,6 +1,8 @@
R = 4
P = -4
User password =
+Supplied password is owner password
+Supplied password is user password
extract for accessibility: allowed
extract for any purpose: allowed
print low resolution: allowed
diff --git a/qpdf/qtest/qpdf/V4-clearmeta-encryption.out b/qpdf/qtest/qpdf/V4-clearmeta-encryption.out
index 157fb8da..b9ba279b 100644
--- a/qpdf/qtest/qpdf/V4-clearmeta-encryption.out
+++ b/qpdf/qtest/qpdf/V4-clearmeta-encryption.out
@@ -1,6 +1,8 @@
R = 4
P = -4
User password =
+Supplied password is owner password
+Supplied password is user password
extract for accessibility: allowed
extract for any purpose: allowed
print low resolution: allowed
diff --git a/qpdf/qtest/qpdf/V4-encryption.out b/qpdf/qtest/qpdf/V4-encryption.out
index 157fb8da..b9ba279b 100644
--- a/qpdf/qtest/qpdf/V4-encryption.out
+++ b/qpdf/qtest/qpdf/V4-encryption.out
@@ -1,6 +1,8 @@
R = 4
P = -4
User password =
+Supplied password is owner password
+Supplied password is user password
extract for accessibility: allowed
extract for any purpose: allowed
print low resolution: allowed
diff --git a/qpdf/qtest/qpdf/V5R5.out b/qpdf/qtest/qpdf/V5R5.out
index 91fcd99a..508e3876 100644
--- a/qpdf/qtest/qpdf/V5R5.out
+++ b/qpdf/qtest/qpdf/V5R5.out
@@ -3,6 +3,7 @@ PDF Version: 1.7 extension level 3
R = 5
P = -4
User password =
+Supplied password is owner password
extract for accessibility: allowed
extract for any purpose: allowed
print low resolution: allowed
diff --git a/qpdf/qtest/qpdf/V5R6.out b/qpdf/qtest/qpdf/V5R6.out
index fa5569a3..5bbc88ee 100644
--- a/qpdf/qtest/qpdf/V5R6.out
+++ b/qpdf/qtest/qpdf/V5R6.out
@@ -3,6 +3,7 @@ PDF Version: 1.7 extension level 8
R = 6
P = -4
User password = user
+Supplied password is user password
extract for accessibility: allowed
extract for any purpose: allowed
print low resolution: allowed
diff --git a/qpdf/qtest/qpdf/bad-encryption-length.out b/qpdf/qtest/qpdf/bad-encryption-length.out
index c59b750e..a29eb13e 100644
--- a/qpdf/qtest/qpdf/bad-encryption-length.out
+++ b/qpdf/qtest/qpdf/bad-encryption-length.out
@@ -3,6 +3,7 @@ PDF Version: 1.4
R = 3
P = -4
User password =
+Supplied password is user password
extract for accessibility: allowed
extract for any purpose: allowed
print low resolution: allowed
diff --git a/qpdf/qtest/qpdf/c-r5-key-owner.out b/qpdf/qtest/qpdf/c-r5-key-owner.out
index b905595e..ce2cdcef 100644
--- a/qpdf/qtest/qpdf/c-r5-key-owner.out
+++ b/qpdf/qtest/qpdf/c-r5-key-owner.out
@@ -4,6 +4,7 @@ R = 5
P = -2052
User password =
Encryption key = 35ea16a48b6a3045133b69ac0906c2e8fb0a2cc97903ae17b51a5786ebdba020
+Supplied password is owner password
extract for accessibility: allowed
extract for any purpose: allowed
print low resolution: allowed
diff --git a/qpdf/qtest/qpdf/c-r5-key-user.out b/qpdf/qtest/qpdf/c-r5-key-user.out
index ffc38a2e..004b5f77 100644
--- a/qpdf/qtest/qpdf/c-r5-key-user.out
+++ b/qpdf/qtest/qpdf/c-r5-key-user.out
@@ -4,6 +4,7 @@ R = 5
P = -2052
User password = user3
Encryption key = 35ea16a48b6a3045133b69ac0906c2e8fb0a2cc97903ae17b51a5786ebdba020
+Supplied password is user password
extract for accessibility: allowed
extract for any purpose: allowed
print low resolution: allowed
diff --git a/qpdf/qtest/qpdf/c-r5.out b/qpdf/qtest/qpdf/c-r5.out
index b8789e22..8477b561 100644
--- a/qpdf/qtest/qpdf/c-r5.out
+++ b/qpdf/qtest/qpdf/c-r5.out
@@ -3,6 +3,7 @@ PDF Version: 1.7 extension level 3
R = 5
P = -2052
User password =
+Supplied password is owner password
extract for accessibility: allowed
extract for any purpose: allowed
print low resolution: allowed
diff --git a/qpdf/qtest/qpdf/c-r6.out b/qpdf/qtest/qpdf/c-r6.out
index 1f99b975..dce8a7c2 100644
--- a/qpdf/qtest/qpdf/c-r6.out
+++ b/qpdf/qtest/qpdf/c-r6.out
@@ -3,6 +3,7 @@ PDF Version: 1.7 extension level 8
R = 6
P = -2052
User password = user4
+Supplied password is user password
extract for accessibility: allowed
extract for any purpose: allowed
print low resolution: allowed
diff --git a/qpdf/qtest/qpdf/copied-encryption.out b/qpdf/qtest/qpdf/copied-encryption.out
index cbec2305..6289b739 100644
--- a/qpdf/qtest/qpdf/copied-encryption.out
+++ b/qpdf/qtest/qpdf/copied-encryption.out
@@ -1,6 +1,7 @@
R = 4
P = -20
User password = user
+Supplied password is owner password
extract for accessibility: allowed
extract for any purpose: not allowed
print low resolution: allowed
diff --git a/qpdf/qtest/qpdf/enc-XI-R6,V5,U=wwwww,O=wwwww.pdf b/qpdf/qtest/qpdf/enc-XI-R6,V5,U=wwwww,O=wwwww.pdf
new file mode 100644
index 00000000..d8009302
--- /dev/null
+++ b/qpdf/qtest/qpdf/enc-XI-R6,V5,U=wwwww,O=wwwww.pdf
Binary files differ
diff --git a/qpdf/qtest/qpdf/encrypt-before-filename.out b/qpdf/qtest/qpdf/encrypt-before-filename.out
index e7d7dbd4..2c0e192a 100644
--- a/qpdf/qtest/qpdf/encrypt-before-filename.out
+++ b/qpdf/qtest/qpdf/encrypt-before-filename.out
@@ -3,6 +3,7 @@ PDF Version: 1.7 extension level 8
R = 6
P = -4
User password = u
+Supplied password is user password
extract for accessibility: allowed
extract for any purpose: allowed
print low resolution: allowed
diff --git a/qpdf/qtest/qpdf/encrypted-40-bit-R3.out b/qpdf/qtest/qpdf/encrypted-40-bit-R3.out
index c79f942c..6cebef9d 100644
--- a/qpdf/qtest/qpdf/encrypted-40-bit-R3.out
+++ b/qpdf/qtest/qpdf/encrypted-40-bit-R3.out
@@ -4,6 +4,7 @@ R = 3
P = -12
User password = 623
Encryption key = e390e220da
+Supplied password is user password
extract for accessibility: allowed
extract for any purpose: allowed
print low resolution: allowed
diff --git a/qpdf/qtest/qpdf/encrypted-with-images.10-ogen.check b/qpdf/qtest/qpdf/encrypted-with-images.10-ogen.check
index 331cd70e..2b6488cd 100644
--- a/qpdf/qtest/qpdf/encrypted-with-images.10-ogen.check
+++ b/qpdf/qtest/qpdf/encrypted-with-images.10-ogen.check
@@ -3,6 +3,7 @@ PDF Version: 1.5
R = 3
P = -4
User password =
+Supplied password is user password
extract for accessibility: allowed
extract for any purpose: allowed
print low resolution: allowed
diff --git a/qpdf/qtest/qpdf/encrypted-with-images.10.check b/qpdf/qtest/qpdf/encrypted-with-images.10.check
index 331cd70e..2b6488cd 100644
--- a/qpdf/qtest/qpdf/encrypted-with-images.10.check
+++ b/qpdf/qtest/qpdf/encrypted-with-images.10.check
@@ -3,6 +3,7 @@ PDF Version: 1.5
R = 3
P = -4
User password =
+Supplied password is user password
extract for accessibility: allowed
extract for any purpose: allowed
print low resolution: allowed
diff --git a/qpdf/qtest/qpdf/encrypted-with-images.11-ogen.check b/qpdf/qtest/qpdf/encrypted-with-images.11-ogen.check
index aae0b3a5..a8b98339 100644
--- a/qpdf/qtest/qpdf/encrypted-with-images.11-ogen.check
+++ b/qpdf/qtest/qpdf/encrypted-with-images.11-ogen.check
@@ -3,6 +3,7 @@ PDF Version: 1.5
R = 3
P = -4
User password =
+Supplied password is user password
extract for accessibility: allowed
extract for any purpose: allowed
print low resolution: allowed
diff --git a/qpdf/qtest/qpdf/encrypted-with-images.11.check b/qpdf/qtest/qpdf/encrypted-with-images.11.check
index aae0b3a5..a8b98339 100644
--- a/qpdf/qtest/qpdf/encrypted-with-images.11.check
+++ b/qpdf/qtest/qpdf/encrypted-with-images.11.check
@@ -3,6 +3,7 @@ PDF Version: 1.5
R = 3
P = -4
User password =
+Supplied password is user password
extract for accessibility: allowed
extract for any purpose: allowed
print low resolution: allowed
diff --git a/qpdf/qtest/qpdf/encrypted-with-images.12-ogen.check b/qpdf/qtest/qpdf/encrypted-with-images.12-ogen.check
index 331cd70e..38acde9d 100644
--- a/qpdf/qtest/qpdf/encrypted-with-images.12-ogen.check
+++ b/qpdf/qtest/qpdf/encrypted-with-images.12-ogen.check
@@ -3,6 +3,8 @@ PDF Version: 1.5
R = 3
P = -4
User password =
+Supplied password is owner password
+Supplied password is user password
extract for accessibility: allowed
extract for any purpose: allowed
print low resolution: allowed
diff --git a/qpdf/qtest/qpdf/encrypted-with-images.12.check b/qpdf/qtest/qpdf/encrypted-with-images.12.check
index 331cd70e..38acde9d 100644
--- a/qpdf/qtest/qpdf/encrypted-with-images.12.check
+++ b/qpdf/qtest/qpdf/encrypted-with-images.12.check
@@ -3,6 +3,8 @@ PDF Version: 1.5
R = 3
P = -4
User password =
+Supplied password is owner password
+Supplied password is user password
extract for accessibility: allowed
extract for any purpose: allowed
print low resolution: allowed
diff --git a/qpdf/qtest/qpdf/encrypted-with-images.9-ogen.check b/qpdf/qtest/qpdf/encrypted-with-images.9-ogen.check
index aae0b3a5..3bc793c4 100644
--- a/qpdf/qtest/qpdf/encrypted-with-images.9-ogen.check
+++ b/qpdf/qtest/qpdf/encrypted-with-images.9-ogen.check
@@ -3,6 +3,8 @@ PDF Version: 1.5
R = 3
P = -4
User password =
+Supplied password is owner password
+Supplied password is user password
extract for accessibility: allowed
extract for any purpose: allowed
print low resolution: allowed
diff --git a/qpdf/qtest/qpdf/encrypted-with-images.9.check b/qpdf/qtest/qpdf/encrypted-with-images.9.check
index aae0b3a5..3bc793c4 100644
--- a/qpdf/qtest/qpdf/encrypted-with-images.9.check
+++ b/qpdf/qtest/qpdf/encrypted-with-images.9.check
@@ -3,6 +3,8 @@ PDF Version: 1.5
R = 3
P = -4
User password =
+Supplied password is owner password
+Supplied password is user password
extract for accessibility: allowed
extract for any purpose: allowed
print low resolution: allowed
diff --git a/qpdf/qtest/qpdf/hybrid-xref.10-ogen.check b/qpdf/qtest/qpdf/hybrid-xref.10-ogen.check
index 331cd70e..2b6488cd 100644
--- a/qpdf/qtest/qpdf/hybrid-xref.10-ogen.check
+++ b/qpdf/qtest/qpdf/hybrid-xref.10-ogen.check
@@ -3,6 +3,7 @@ PDF Version: 1.5
R = 3
P = -4
User password =
+Supplied password is user password
extract for accessibility: allowed
extract for any purpose: allowed
print low resolution: allowed
diff --git a/qpdf/qtest/qpdf/hybrid-xref.10.check b/qpdf/qtest/qpdf/hybrid-xref.10.check
index 331cd70e..2b6488cd 100644
--- a/qpdf/qtest/qpdf/hybrid-xref.10.check
+++ b/qpdf/qtest/qpdf/hybrid-xref.10.check
@@ -3,6 +3,7 @@ PDF Version: 1.5
R = 3
P = -4
User password =
+Supplied password is user password
extract for accessibility: allowed
extract for any purpose: allowed
print low resolution: allowed
diff --git a/qpdf/qtest/qpdf/hybrid-xref.11-ogen.check b/qpdf/qtest/qpdf/hybrid-xref.11-ogen.check
index aae0b3a5..a8b98339 100644
--- a/qpdf/qtest/qpdf/hybrid-xref.11-ogen.check
+++ b/qpdf/qtest/qpdf/hybrid-xref.11-ogen.check
@@ -3,6 +3,7 @@ PDF Version: 1.5
R = 3
P = -4
User password =
+Supplied password is user password
extract for accessibility: allowed
extract for any purpose: allowed
print low resolution: allowed
diff --git a/qpdf/qtest/qpdf/hybrid-xref.11.check b/qpdf/qtest/qpdf/hybrid-xref.11.check
index aae0b3a5..a8b98339 100644
--- a/qpdf/qtest/qpdf/hybrid-xref.11.check
+++ b/qpdf/qtest/qpdf/hybrid-xref.11.check
@@ -3,6 +3,7 @@ PDF Version: 1.5
R = 3
P = -4
User password =
+Supplied password is user password
extract for accessibility: allowed
extract for any purpose: allowed
print low resolution: allowed
diff --git a/qpdf/qtest/qpdf/inline-images.10-ogen.check b/qpdf/qtest/qpdf/inline-images.10-ogen.check
index 331cd70e..2b6488cd 100644
--- a/qpdf/qtest/qpdf/inline-images.10-ogen.check
+++ b/qpdf/qtest/qpdf/inline-images.10-ogen.check
@@ -3,6 +3,7 @@ PDF Version: 1.5
R = 3
P = -4
User password =
+Supplied password is user password
extract for accessibility: allowed
extract for any purpose: allowed
print low resolution: allowed
diff --git a/qpdf/qtest/qpdf/inline-images.10.check b/qpdf/qtest/qpdf/inline-images.10.check
index 921e171a..27828d48 100644
--- a/qpdf/qtest/qpdf/inline-images.10.check
+++ b/qpdf/qtest/qpdf/inline-images.10.check
@@ -3,6 +3,7 @@ PDF Version: 1.4
R = 3
P = -4
User password =
+Supplied password is user password
extract for accessibility: allowed
extract for any purpose: allowed
print low resolution: allowed
diff --git a/qpdf/qtest/qpdf/inline-images.11-ogen.check b/qpdf/qtest/qpdf/inline-images.11-ogen.check
index aae0b3a5..a8b98339 100644
--- a/qpdf/qtest/qpdf/inline-images.11-ogen.check
+++ b/qpdf/qtest/qpdf/inline-images.11-ogen.check
@@ -3,6 +3,7 @@ PDF Version: 1.5
R = 3
P = -4
User password =
+Supplied password is user password
extract for accessibility: allowed
extract for any purpose: allowed
print low resolution: allowed
diff --git a/qpdf/qtest/qpdf/inline-images.11.check b/qpdf/qtest/qpdf/inline-images.11.check
index 74a360c1..6b8121d3 100644
--- a/qpdf/qtest/qpdf/inline-images.11.check
+++ b/qpdf/qtest/qpdf/inline-images.11.check
@@ -3,6 +3,7 @@ PDF Version: 1.4
R = 3
P = -4
User password =
+Supplied password is user password
extract for accessibility: allowed
extract for any purpose: allowed
print low resolution: allowed
diff --git a/qpdf/qtest/qpdf/invalid-id-xref.out b/qpdf/qtest/qpdf/invalid-id-xref.out
index 63aa2660..209d5826 100644
--- a/qpdf/qtest/qpdf/invalid-id-xref.out
+++ b/qpdf/qtest/qpdf/invalid-id-xref.out
@@ -4,6 +4,7 @@ PDF Version: 1.4
R = 3
P = -1804
User password =
+Supplied password is user password
extract for accessibility: not allowed
extract for any purpose: allowed
print low resolution: allowed
diff --git a/qpdf/qtest/qpdf/leading-junk.out b/qpdf/qtest/qpdf/leading-junk.out
index 58847c9d..8af94ac3 100644
--- a/qpdf/qtest/qpdf/leading-junk.out
+++ b/qpdf/qtest/qpdf/leading-junk.out
@@ -3,6 +3,7 @@ PDF Version: 1.4
R = 3
P = -4
User password =
+Supplied password is user password
extract for accessibility: allowed
extract for any purpose: allowed
print low resolution: allowed
diff --git a/qpdf/qtest/qpdf/lin-special.10-ogen.check b/qpdf/qtest/qpdf/lin-special.10-ogen.check
index 331cd70e..2b6488cd 100644
--- a/qpdf/qtest/qpdf/lin-special.10-ogen.check
+++ b/qpdf/qtest/qpdf/lin-special.10-ogen.check
@@ -3,6 +3,7 @@ PDF Version: 1.5
R = 3
P = -4
User password =
+Supplied password is user password
extract for accessibility: allowed
extract for any purpose: allowed
print low resolution: allowed
diff --git a/qpdf/qtest/qpdf/lin-special.10.check b/qpdf/qtest/qpdf/lin-special.10.check
index 921e171a..27828d48 100644
--- a/qpdf/qtest/qpdf/lin-special.10.check
+++ b/qpdf/qtest/qpdf/lin-special.10.check
@@ -3,6 +3,7 @@ PDF Version: 1.4
R = 3
P = -4
User password =
+Supplied password is user password
extract for accessibility: allowed
extract for any purpose: allowed
print low resolution: allowed
diff --git a/qpdf/qtest/qpdf/lin-special.11-ogen.check b/qpdf/qtest/qpdf/lin-special.11-ogen.check
index aae0b3a5..a8b98339 100644
--- a/qpdf/qtest/qpdf/lin-special.11-ogen.check
+++ b/qpdf/qtest/qpdf/lin-special.11-ogen.check
@@ -3,6 +3,7 @@ PDF Version: 1.5
R = 3
P = -4
User password =
+Supplied password is user password
extract for accessibility: allowed
extract for any purpose: allowed
print low resolution: allowed
diff --git a/qpdf/qtest/qpdf/lin-special.11.check b/qpdf/qtest/qpdf/lin-special.11.check
index 74a360c1..6b8121d3 100644
--- a/qpdf/qtest/qpdf/lin-special.11.check
+++ b/qpdf/qtest/qpdf/lin-special.11.check
@@ -3,6 +3,7 @@ PDF Version: 1.4
R = 3
P = -4
User password =
+Supplied password is user password
extract for accessibility: allowed
extract for any purpose: allowed
print low resolution: allowed
diff --git a/qpdf/qtest/qpdf/long-id-check.out b/qpdf/qtest/qpdf/long-id-check.out
index a1dca673..e17df450 100644
--- a/qpdf/qtest/qpdf/long-id-check.out
+++ b/qpdf/qtest/qpdf/long-id-check.out
@@ -4,6 +4,7 @@ R = 2
P = -4
User password =
Encryption key = 2f382cf6e1
+Supplied password is user password
extract for accessibility: allowed
extract for any purpose: allowed
print low resolution: allowed
diff --git a/qpdf/qtest/qpdf/object-stream.10-ogen.check b/qpdf/qtest/qpdf/object-stream.10-ogen.check
index 331cd70e..2b6488cd 100644
--- a/qpdf/qtest/qpdf/object-stream.10-ogen.check
+++ b/qpdf/qtest/qpdf/object-stream.10-ogen.check
@@ -3,6 +3,7 @@ PDF Version: 1.5
R = 3
P = -4
User password =
+Supplied password is user password
extract for accessibility: allowed
extract for any purpose: allowed
print low resolution: allowed
diff --git a/qpdf/qtest/qpdf/object-stream.10.check b/qpdf/qtest/qpdf/object-stream.10.check
index 331cd70e..2b6488cd 100644
--- a/qpdf/qtest/qpdf/object-stream.10.check
+++ b/qpdf/qtest/qpdf/object-stream.10.check
@@ -3,6 +3,7 @@ PDF Version: 1.5
R = 3
P = -4
User password =
+Supplied password is user password
extract for accessibility: allowed
extract for any purpose: allowed
print low resolution: allowed
diff --git a/qpdf/qtest/qpdf/object-stream.11-ogen.check b/qpdf/qtest/qpdf/object-stream.11-ogen.check
index aae0b3a5..a8b98339 100644
--- a/qpdf/qtest/qpdf/object-stream.11-ogen.check
+++ b/qpdf/qtest/qpdf/object-stream.11-ogen.check
@@ -3,6 +3,7 @@ PDF Version: 1.5
R = 3
P = -4
User password =
+Supplied password is user password
extract for accessibility: allowed
extract for any purpose: allowed
print low resolution: allowed
diff --git a/qpdf/qtest/qpdf/object-stream.11.check b/qpdf/qtest/qpdf/object-stream.11.check
index aae0b3a5..a8b98339 100644
--- a/qpdf/qtest/qpdf/object-stream.11.check
+++ b/qpdf/qtest/qpdf/object-stream.11.check
@@ -3,6 +3,7 @@ PDF Version: 1.5
R = 3
P = -4
User password =
+Supplied password is user password
extract for accessibility: allowed
extract for any purpose: allowed
print low resolution: allowed
diff --git a/qpdf/qtest/qpdf/short-O-U.out b/qpdf/qtest/qpdf/short-O-U.out
index e0b19742..9e67120a 100644
--- a/qpdf/qtest/qpdf/short-O-U.out
+++ b/qpdf/qtest/qpdf/short-O-U.out
@@ -3,6 +3,8 @@ PDF Version: 1.6
R = 4
P = -4
User password = 19723102477
+Supplied password is owner password
+Supplied password is user password
extract for accessibility: allowed
extract for any purpose: allowed
print low resolution: allowed
diff --git a/qpdf/qtest/qpdf/short-id-check.out b/qpdf/qtest/qpdf/short-id-check.out
index 2451b2e2..f6ae2a21 100644
--- a/qpdf/qtest/qpdf/short-id-check.out
+++ b/qpdf/qtest/qpdf/short-id-check.out
@@ -4,6 +4,7 @@ R = 2
P = -4
User password =
Encryption key = 897d768fbd
+Supplied password is user password
extract for accessibility: allowed
extract for any purpose: allowed
print low resolution: allowed
diff --git a/qpdf/qtest/qpdf/unicode-op.out b/qpdf/qtest/qpdf/unicode-op.out
index a1437ca4..a9f2a25c 100644
--- a/qpdf/qtest/qpdf/unicode-op.out
+++ b/qpdf/qtest/qpdf/unicode-op.out
@@ -1,6 +1,7 @@
R = 6
P = -4
User password =
+Supplied password is owner password
extract for accessibility: allowed
extract for any purpose: allowed
print low resolution: allowed
diff --git a/qpdf/qtest/qpdf/unicode-up.out b/qpdf/qtest/qpdf/unicode-up.out
index 9e3a0581..ba58a26d 100644
--- a/qpdf/qtest/qpdf/unicode-up.out
+++ b/qpdf/qtest/qpdf/unicode-up.out
@@ -1,6 +1,7 @@
R = 6
P = -4
User password = π
+Supplied password is user password
extract for accessibility: allowed
extract for any purpose: allowed
print low resolution: allowed