Coverage Report

Created: 2025-06-10 07:27

/src/ghostpdl/pdf/pdf_sec.c
Line
Count
Source (jump to first uncovered line)
1
/* Copyright (C) 2020-2025 Artifex Software, Inc.
2
   All Rights Reserved.
3
4
   This software is provided AS-IS with no warranty, either express or
5
   implied.
6
7
   This software is distributed under license and may not be copied,
8
   modified or distributed except as expressly authorized under the terms
9
   of the license contained in the file LICENSE in this distribution.
10
11
   Refer to licensing information at http://www.artifex.com or contact
12
   Artifex Software, Inc.,  39 Mesa Street, Suite 108A, San Francisco,
13
   CA 94129, USA, for further information.
14
*/
15
16
/* PDF decryption routines */
17
18
#include "pdf_stack.h"
19
#include "pdf_file.h"
20
#include "pdf_dict.h"
21
#include "pdf_array.h"
22
#include "pdf_sec.h"
23
#include "pdf_misc.h"
24
#include "strmio.h"
25
#include "smd5.h"
26
#include "sarc4.h"
27
#include "aes.h"
28
#include "sha2.h"
29
#include "pdf_utf8.h"
30
#include "pdf_deref.h"
31
32
/* The padding string as defined in step 1 of Algorithm 3.2 */
33
static char PadString[32] = {
34
    0x28, 0xbf, 0x4e, 0x5e, 0x4e, 0x75, 0x8a, 0x41, 0x64, 0x00, 0x4e, 0x56, 0xff, 0xfa, 0x01, 0x08,
35
    0x2e, 0x2e, 0x00, 0xb6, 0xd0, 0x68, 0x3e, 0x80, 0x2f, 0x0c, 0xa9, 0xfe, 0x64, 0x53, 0x69, 0x7a
36
};
37
38
/* If EncryptMetadata is true we need to add 4 bytes of 0xFF to the MD5 hash
39
 * when computing an encryption key (Algorithm 3.2, step 6 when R is 4 or more)
40
 */
41
static char R4String[4] = {
42
    0xFF, 0xFF, 0xFF, 0xFF
43
};
44
45
/* If using the AES filter, we need to add this to the encryption
46
 * key when creating the key for decrypting objects (streams or strings)
47
 */
48
static char sAlTString[4] = {
49
    0x73, 0x41, 0x6c, 0x54
50
};
51
52
static int pdf_compute_encryption_key_preR5(pdf_context *ctx, char *Password, int PasswordLen, int KeyLen, pdf_string **EKey, int R)
53
746
{
54
746
    char Key[32];
55
746
    int code = 0, KeyLenBytes = KeyLen / 8, i;
56
746
    char P[4];
57
746
    gs_md5_state_t md5;
58
746
    pdf_array *a = NULL;
59
746
    pdf_string *s = NULL;
60
746
    pdf_dict *d = NULL;
61
62
746
    *EKey = NULL;
63
    /* Algorithm 3.2 */
64
    /* Step 1. Pad or truncate the password string to exactly 32 bytes
65
     * using the defined padding string.
66
     */
67
746
    if (PasswordLen > 32)
68
0
        PasswordLen = 32;
69
70
746
    memcpy(Key, Password, PasswordLen);
71
72
746
    if (PasswordLen < 32)
73
706
        memcpy(&Key[PasswordLen], PadString, 32 - PasswordLen);
74
75
    /* 2. Initialise the MD5 hash function and pass the result of step 1 to this function */
76
746
    gs_md5_init(&md5);
77
746
    gs_md5_append(&md5, (gs_md5_byte_t *)&Key, 32);
78
79
    /* 3. Pass the value of the encryption dictionary's O entry to the MD5 hash */
80
746
    gs_md5_append(&md5, (gs_md5_byte_t *)ctx->encryption.O, 32);
81
82
    /* 4. Treat the value of P as an unsigned 4 byte integer and pass those bytes to the MD5 */
83
746
    P[3] = ((uint32_t)ctx->encryption.P) >> 24;
84
746
    P[2] = ((uint32_t)ctx->encryption.P & 0x00ff0000) >> 16;
85
746
    P[1] = ((uint32_t)ctx->encryption.P & 0x0000ff00) >> 8;
86
746
    P[0] = ((uint32_t)ctx->encryption.P & 0xff);
87
746
    gs_md5_append(&md5, (gs_md5_byte_t *)P, 4);
88
89
    /* 5. Pass the first element of the file's file identifier array */
90
    /* See comment in pdfi_read_Root() for details of why we indirect through 'd' */
91
746
    d = ctx->Trailer;
92
746
    pdfi_countup(d);
93
746
    code = pdfi_dict_get_type(ctx, d, "ID", PDF_ARRAY, (pdf_obj **)&a);
94
746
    pdfi_countdown(d);
95
746
    if (code < 0) {
96
2
        if (code == gs_error_undefined) {
97
2
            emprintf(ctx->memory, "\n   **** Error: ID key in the trailer is required for encrypted files.\n");
98
2
            emprintf(ctx->memory, "               File may not be possible to decrypt.\n");
99
2
        } else
100
0
            return code;
101
2
    }
102
    /* If the file ID was missing, just ignore the error */
103
746
    if (code == 0) {
104
744
        code = pdfi_array_get_type(ctx, a, (uint64_t)0, PDF_STRING, (pdf_obj **)&s);
105
744
        if (code < 0)
106
0
            goto done;
107
744
        gs_md5_append(&md5, s->data, s->length);
108
744
    }
109
110
    /* Step 6
111
     * (revision 4 or greater) If document Metadata is not being encrypted
112
     * pass 4 bytes with the value 0xFFFFFFFF to the MD5 hash function.
113
     */
114
746
    if (R > 3 && !ctx->encryption.EncryptMetadata) {
115
30
        gs_md5_append(&md5, (const gs_md5_byte_t *)R4String, 4);
116
30
    }
117
118
    /* 7. Finish the hash */
119
746
    gs_md5_finish(&md5, (gs_md5_byte_t *)&Key);
120
121
746
    code = pdfi_object_alloc(ctx, PDF_STRING, KeyLenBytes, (pdf_obj **)EKey);
122
746
    if (code < 0)
123
0
        goto done;
124
746
    pdfi_countup((pdf_obj *)*EKey);
125
126
    /* Step 8
127
     * (revision 3 or greater) Do the following 50 times. Take the output from the
128
     * previous MD5 hash and pass hte first n bytes of the output as input to a new
129
     * MD5 hash, where n is the number of bytes of the encryption key as defined by
130
     * the value of the encryption dictionary's Length entry. (NB Length is in bits)
131
     */
132
746
    if (R > 2) {
133
25.7k
        for (i=0;i < 50; i++) {
134
25.2k
            memcpy((*EKey)->data, Key, KeyLenBytes);
135
25.2k
            gs_md5_init(&md5);
136
25.2k
            gs_md5_append(&md5, (gs_md5_byte_t *)(*EKey)->data, KeyLenBytes);
137
25.2k
            gs_md5_finish(&md5, (gs_md5_byte_t *)&Key);
138
25.2k
        }
139
504
    }
140
141
    /* Step 9
142
     * Set the encryption key to the first n bytes of the output from the final MD5 hash
143
     * where n is always 5 for revision 2 but, for revision 3 or greater, depends on the
144
     * value of the encryption dictionary's Length entry.
145
     */
146
746
    memcpy((*EKey)->data, Key, KeyLenBytes);
147
148
746
done:
149
746
    pdfi_countdown(s);
150
746
    pdfi_countdown(a);
151
746
    return code;
152
746
}
153
154
#ifdef HAVE_LIBIDN
155
#  include <stringprep.h>
156
157
static int apply_sasl(pdf_context *ctx, char *Password, int Len, char **NewPassword, int *NewLen)
158
{
159
    byte *buffer;
160
    uint buffer_size;
161
    Stringprep_rc err;
162
163
    buffer_size = Len * 11 + 1;
164
    buffer = (byte *)gs_alloc_bytes(ctx->memory, buffer_size, "saslprep result");
165
    if (buffer == NULL)
166
        return_error(gs_error_VMerror);
167
168
    err = stringprep((char *)buffer, buffer_size, 0, stringprep_saslprep);
169
    if (err != STRINGPREP_OK) {
170
        gs_free_object(ctx->memory, buffer, "saslprep result");
171
172
        /* Since we're just verifying the password to an existing
173
         * document here, we don't care about "invalid input" errors
174
         * like STRINGPREP_CONTAINS_PROHIBITED.  In these cases, we
175
         * ignore the error and return the original string unchanged --
176
         * chances are it's not the right password anyway, and if it
177
         * is we shouldn't gratuitously fail to decrypt the document.
178
         *
179
         * On the other hand, errors like STRINGPREP_NFKC_FAILED are
180
         * real errors, and should be returned to the user.
181
         *
182
         * Fortunately, the stringprep error codes are sorted to make
183
         * this easy: the errors we want to ignore are the ones with
184
         * codes less than 100. */
185
        if ((int)err < 100) {
186
            *NewPassword = Password;
187
            *NewLen = Len;
188
            return 0;
189
        }
190
191
        return_error(gs_error_ioerror);
192
    }
193
194
    *NewLen = strlen((char *)buffer);
195
    *NewPassword = (char *)buffer;
196
197
    return 0;
198
199
}
200
#endif
201
202
static int check_user_password_R5(pdf_context *ctx, char *Password, int Len, int KeyLen)
203
0
{
204
0
    char *UTF8_Password = NULL, *Test = NULL, Buffer[32], UEPadded[48];
205
0
    int NewLen;
206
0
    int code = 0;
207
0
    pdf_c_stream *stream = NULL, *filter_stream = NULL;
208
0
    pdf_string *Key = NULL;
209
0
    SHA256_CTX sha256;
210
211
    /* Algorithm 3.11 from the Adobe extensions to the ISO 32000 specification (Extension Level 3) */
212
    /* Step 1 convert the password to UTF-8 */
213
214
    /* From the original code in Resource/Init/pdf_sec.ps:
215
     * Step 1.
216
     * If the .saslprep operator isn't available (because ghostscript
217
     * wasn't built with libidn support), just skip this step.  ASCII
218
     * passwords will still work fine, and even most non-ASCII passwords
219
     * will be okay; any non-ASCII passwords that fail will produce a
220
     * warning from pdf_process_Encrypt.
221
     */
222
#ifdef HAVE_LIBIDN
223
    code = apply_sasl(ctx, Password, Len, &UTF8_Password, &NewLen);
224
    if (code < 0)
225
        return code;
226
#else
227
0
    UTF8_Password = Password;
228
0
    NewLen = Len;
229
0
#endif
230
0
    if (NewLen > 127)
231
0
        NewLen = 127;
232
233
0
    Test = (char *)gs_alloc_bytes(ctx->memory, NewLen + 8, "R5 password test");
234
0
    if (Test == NULL) {
235
0
        code = gs_note_error(gs_error_VMerror);
236
0
        goto error;
237
0
    }
238
239
    /* Try to validate the password as the user password */
240
    /* concatenate the password */
241
0
    memcpy(Test, UTF8_Password, NewLen);
242
    /* With the 'User Validation Salt' (stored as part of the /O string */
243
0
    memcpy(&Test[NewLen], &ctx->encryption.U[32], 8);
244
245
0
    pSHA256_Init(&sha256);
246
0
    pSHA256_Update(&sha256, (uint8_t *)Test, NewLen + 8);
247
0
    pSHA256_Final((uint8_t *)Buffer, &sha256);
248
249
0
    if (memcmp(Buffer, ctx->encryption.U, 32) != 0) {
250
0
        code = gs_note_error(gs_error_unknownerror);
251
0
        goto error;
252
0
    }
253
254
    /* Password matched */
255
    /* Finally calculate the decryption key */
256
0
    gs_free_object(ctx->memory, Test, "R5 password test");
257
258
    /* Password + last 8 bytes of /U */
259
0
    Test = (char *)gs_alloc_bytes(ctx->memory, NewLen + 8, "R5 password test");
260
0
    if (Test == NULL) {
261
0
        code = gs_note_error(gs_error_VMerror);
262
0
        goto error;
263
0
    }
264
265
0
    memcpy(Test, UTF8_Password, NewLen);
266
    /* The 'User Key Salt' (stored as part of the /O string */
267
0
    memcpy(&Test[NewLen], &ctx->encryption.U[40], 8);
268
269
0
    pSHA256_Init(&sha256);
270
0
    pSHA256_Update(&sha256, (uint8_t *)Test, NewLen + 8);
271
0
    pSHA256_Final((uint8_t *)Buffer, &sha256);
272
273
0
    memset(UEPadded, 0x00, 16);
274
0
    memcpy(&UEPadded[16], ctx->encryption.UE, 32);
275
276
0
    code = pdfi_object_alloc(ctx, PDF_STRING, 32, (pdf_obj **)&Key);
277
0
    if (code < 0)
278
0
        goto error;
279
    /* pdfi_object_alloc() creates objects with a refrence count of 0 */
280
0
    pdfi_countup(Key);
281
0
    memcpy(Key->data, Buffer, 32);
282
283
    /* Now apply AESDecode to the padded UE string, using the SHA from above as the key */
284
0
    code = pdfi_open_memory_stream_from_memory(ctx, 48, (byte *)UEPadded, &stream, true);
285
0
    if (code < 0)
286
0
        goto error;
287
288
0
    code = pdfi_apply_AES_filter(ctx, Key, false, stream, &filter_stream);
289
0
    if (code < 0) {
290
0
        pdfi_close_memory_stream(ctx, NULL, stream);
291
0
        goto error;
292
0
    }
293
294
0
    sfread(Buffer, 1, 32, filter_stream->s);
295
0
    pdfi_close_file(ctx, filter_stream);
296
0
    pdfi_close_memory_stream(ctx, NULL, stream);
297
0
    code = pdfi_object_alloc(ctx, PDF_STRING, 32, (pdf_obj **)&ctx->encryption.EKey);
298
0
    if (code < 0)
299
0
        goto error;
300
0
    memcpy(ctx->encryption.EKey->data, Buffer, 32);
301
0
    pdfi_countup(ctx->encryption.EKey);
302
303
0
error:
304
0
    pdfi_countdown(Key);
305
0
    gs_free_object(ctx->memory, Test, "R5 password test");
306
#ifdef HAVE_LIBIDN
307
    if (UTF8_Password != Password)
308
        gs_free_object(ctx->memory, UTF8_Password, "free sasl result");
309
#endif
310
0
    return code;
311
0
}
312
313
/* Implementation of the PDF security handler revision6 (PDF 1.7 ExtensionLevel 8 algorithm)
314
 *
315
 * Adobe/ISO has not yet released the details, so the algorithm reference is:
316
 * http://esec-lab.sogeti.com/post/The-undocumented-password-validation-algorithm-of-Adobe-Reader-X
317
 *
318
 * The code below is the same as (and copied from) the MuPDF implementation. And copied from the
319
 * Ghostscript implementation in zpdf_r6.c. The ISO specification is now released and the algorithms
320
 * used here are documented in the PDF 2.0 specification ISO 32000-2:2017
321
 */
322
323
static void
324
pdf_compute_hardened_hash_r6(unsigned char *password, int pwlen, unsigned char *salt, unsigned char *ownerkey, unsigned char *hash)
325
974
{
326
974
  unsigned char data[(128 + 64 + 48) * 64];
327
974
  unsigned char block[64];
328
974
  int block_size = 32;
329
974
  int data_len = 0;
330
974
  int i, j, sum;
331
332
974
    SHA256_CTX sha256;
333
974
    SHA384_CTX sha384;
334
974
    SHA512_CTX sha512;
335
974
    aes_context aes;
336
337
974
    pSHA256_Init(&sha256);
338
974
    pSHA256_Update(&sha256, password, pwlen);
339
974
    pSHA256_Update(&sha256, salt, 8);
340
974
    if (ownerkey)
341
326
        pSHA256_Update(&sha256, ownerkey, 48);
342
974
    pSHA256_Final((uint8_t *)block, &sha256);
343
344
67.1k
  for (i = 0; i < 64 || i < data[data_len * 64 - 1] + 32; i++)
345
66.1k
  {
346
    /* Step 2: repeat password and data block 64 times */
347
66.1k
    memcpy(data, password, pwlen);
348
66.1k
    memcpy(data + pwlen, block, block_size);
349
66.1k
    if (ownerkey)
350
22.0k
      memcpy(data + pwlen + block_size, ownerkey, 48);
351
66.1k
    data_len = pwlen + block_size + (ownerkey ? 48 : 0);
352
4.23M
    for (j = 1; j < 64; j++)
353
4.16M
      memcpy(data + j * data_len, data, data_len);
354
355
    /* Step 3: encrypt data using data block as key and iv */
356
66.1k
    aes_setkey_enc(&aes, block, 128);
357
66.1k
    aes_crypt_cbc(&aes, AES_ENCRYPT, data_len * 64, block + 16, data, data);
358
359
    /* Step 4: determine SHA-2 hash size for this round */
360
1.12M
    for (j = 0, sum = 0; j < 16; j++)
361
1.05M
      sum += data[j];
362
363
    /* Step 5: calculate data block for next round */
364
66.1k
    block_size = 32 + (sum % 3) * 16;
365
66.1k
    switch (block_size)
366
66.1k
    {
367
23.2k
        case 32:
368
23.2k
            pSHA256_Init(&sha256);
369
23.2k
            pSHA256_Update(&sha256, data, data_len * 64);
370
23.2k
            pSHA256_Final((uint8_t *)block, &sha256);
371
23.2k
            break;
372
20.7k
        case 48:
373
20.7k
            pSHA384_Init(&sha384);
374
20.7k
            pSHA384_Update(&sha384, data, data_len * 64);
375
20.7k
            pSHA384_Final((uint8_t *)block, &sha384);
376
20.7k
            break;
377
22.1k
        case 64:
378
22.1k
            pSHA512_Init(&sha512);
379
22.1k
            pSHA512_Update(&sha512, data, data_len * 64);
380
22.1k
            pSHA512_Final((uint8_t *)block, &sha512);
381
22.1k
            break;
382
66.1k
    }
383
66.1k
  }
384
385
974
  memset(data, 0, sizeof(data));
386
974
  memcpy(hash, block, 32);
387
974
}
388
389
static void
390
pdf_compute_encryption_key_r6(unsigned char *password, int pwlen, unsigned char *O, unsigned char *OE, unsigned char *U, unsigned char *UE, int ownerkey, unsigned char *validationkey, unsigned char *output)
391
487
{
392
487
  unsigned char hash[32];
393
487
  unsigned char iv[16];
394
487
    aes_context aes;
395
396
487
  if (pwlen > 127)
397
0
    pwlen = 127;
398
399
487
  pdf_compute_hardened_hash_r6(password, pwlen,
400
487
    (ownerkey ? O : U) + 32,
401
487
    ownerkey ? U : NULL, validationkey);
402
487
  pdf_compute_hardened_hash_r6(password, pwlen,
403
487
        (ownerkey ? O : U) + 40,
404
487
        (ownerkey ? U : NULL), hash);
405
406
487
  memset(iv, 0, sizeof(iv));
407
487
    aes_setkey_dec(&aes, hash, 256);
408
487
  aes_crypt_cbc(&aes, AES_DECRYPT, 32, iv,
409
487
    ownerkey ? OE : UE, output);
410
487
}
411
412
static int check_user_password_R6(pdf_context *ctx, char *Password, int Len, int KeyLen)
413
324
{
414
324
  unsigned char validation[32];
415
324
  unsigned char output[32];
416
324
    int code = 0;
417
418
324
    pdf_compute_encryption_key_r6((unsigned char *)Password, Len, (unsigned char *)ctx->encryption.O, (unsigned char *)ctx->encryption.OE,
419
324
                                  (unsigned char *)ctx->encryption.U, (unsigned char *)ctx->encryption.UE, 0, validation, output);
420
421
324
    if (memcmp(validation, ctx->encryption.U, 32) != 0)
422
163
        return_error(gs_error_unknownerror);
423
424
161
    code = pdfi_object_alloc(ctx, PDF_STRING, 32, (pdf_obj **)&ctx->encryption.EKey);
425
161
    if (code < 0)
426
161
        return_error(gs_error_VMerror);;
427
161
    memcpy(ctx->encryption.EKey->data, output, 32);
428
161
    pdfi_countup(ctx->encryption.EKey);
429
430
161
    return 0;
431
161
}
432
433
static int check_user_password_preR5(pdf_context *ctx, char *Password, int Len, int KeyLen, int R)
434
746
{
435
746
    pdf_string *Key = NULL, *XORKey = NULL;
436
746
    int code = 0, i, j, KeyLenBytes = KeyLen / 8;
437
746
    pdf_c_stream *stream, *arc4_stream;
438
746
    char Buffer[32];
439
746
    char Hash[16];
440
746
    gs_md5_state_t md5;
441
746
    pdf_string *s = NULL;
442
746
    pdf_array *a = NULL;
443
746
    pdf_dict *d = NULL;
444
445
    /* Algorithm 3.6, step 1
446
     * perform all but the last step of Algorithm 3,4 (Revision 2)
447
     * or Algorithm 3.5 (revision 3 or greater).
448
     */
449
450
    /* Algorithm 3.4 step 1
451
     * Create an encryption key based on the user password string as described in Algorithm 3.2
452
     */
453
746
    code = pdf_compute_encryption_key_preR5(ctx, Password, Len, KeyLen, &Key, R);
454
746
    if (code < 0)
455
0
        return code;
456
457
746
    switch (R) {
458
242
        case 2:
459
            /* Algorithm 3.4, step 2
460
             * Encrypt the 32 byte padding string from step 1 of Algorithm 3.2, with an RC4
461
             * encryption function, using the key from the preceding step.
462
             */
463
464
242
            code = pdfi_open_memory_stream_from_memory(ctx, 32, (byte *)PadString, &stream, true);
465
242
            if (code < 0)
466
0
                goto error;
467
468
242
            code = pdfi_apply_Arc4_filter(ctx, Key, stream, &arc4_stream);
469
242
            if (code < 0) {
470
0
                pdfi_close_memory_stream(ctx, NULL, stream);
471
0
                goto error;
472
0
            }
473
474
242
            sfread(Buffer, 1, 32, arc4_stream->s);
475
242
            pdfi_close_file(ctx, arc4_stream);
476
242
            pdfi_close_memory_stream(ctx, NULL, stream);
477
478
            /* Algorithm 3.6 step 2
479
             * If the result of the step above is equal to the value of the encryption dictionary
480
             * U entry the password supplied is the correct user password.
481
             */
482
242
            if (memcmp(Buffer, ctx->encryption.U, 32) != 0) {
483
20
                code = gs_error_unknownerror;
484
20
                goto error;
485
222
            } else {
486
                /* Password authenticated, we can now use the calculated encryption key to decrypt the file */
487
222
                ctx->encryption.EKey = Key;
488
222
            }
489
222
            break;
490
222
        case 3:
491
504
        case 4:
492
            /* Algorithm 3.5 step 2
493
             * Pass the 32 byte padding string from step 1 of Algorithm 3.2 to an MD5 hash */
494
504
            gs_md5_init(&md5);
495
504
            gs_md5_append(&md5, (gs_md5_byte_t *)PadString, 32);
496
            /* See comment in pdfi_read_Root() for details of why we indirect through 'd' */
497
504
            d = ctx->Trailer;
498
504
            pdfi_countup(d);
499
504
            code = pdfi_dict_get_type(ctx, d, "ID", PDF_ARRAY, (pdf_obj **)&a);
500
504
            pdfi_countdown(d);
501
504
            if (code < 0) {
502
0
                if (code == gs_error_undefined) {
503
0
                    emprintf(ctx->memory, "\n   **** Error: ID key in the trailer is required for encrypted files.\n");
504
0
                    emprintf(ctx->memory, "               File may not be possible to decrypt.\n");
505
0
                } else
506
0
                    return code;
507
0
            }
508
504
            if (code == 0) {
509
                /* Step 3
510
                 * Pass the first element of the file's file identifier array to the hash function
511
                 * and finish the hash
512
                 */
513
504
                code = pdfi_array_get_type(ctx, a, (uint64_t)0, PDF_STRING, (pdf_obj **)&s);
514
504
                if (code < 0)
515
0
                    goto error;
516
504
                gs_md5_append(&md5, s->data, s->length);
517
504
            }
518
504
            gs_md5_finish(&md5, (gs_md5_byte_t *)&Hash);
519
520
            /* Step 4
521
             * Encrypt the 16-byte result of the hash using an RC4 encryption function with
522
             * the encryption key from step 1 (of Algorithm 3.5).
523
             */
524
504
            code = pdfi_open_memory_stream_from_memory(ctx, 16, (byte *)Hash, &stream, true);
525
504
            if (code < 0)
526
0
                goto error;
527
528
504
            code = pdfi_apply_Arc4_filter(ctx, Key, stream, &arc4_stream);
529
504
            if (code < 0) {
530
0
                pdfi_close_memory_stream(ctx, NULL, stream);
531
0
                goto error;
532
0
            }
533
534
504
            sfread(Buffer, 1, 16, arc4_stream->s);
535
504
            pdfi_close_file(ctx, arc4_stream);
536
504
            pdfi_close_memory_stream(ctx, NULL, stream);
537
538
504
            code = pdfi_object_alloc(ctx, PDF_STRING, KeyLenBytes, (pdf_obj **)&XORKey);
539
504
            if (code < 0)
540
0
                goto error;
541
            /* pdfi_object_alloc() creates objects with a reference count of 0 */
542
504
            pdfi_countup(XORKey);
543
544
            /* Step 5
545
             * Do the following 19 times. Take the output from the previous invocation of the RC4
546
             * function and pas it as input to a new invocation of the function; use an encryption key
547
             * generated by taking each byte of the original encyption key (obtained in step 1 of
548
             * algorithm 3.5) and performing an XOR operation between that byte and the single byte
549
             * value of the iteration counter (from 1 to 19).
550
             */
551
10.0k
            for (i=1;i < 20;i++) {
552
9.57k
                memcpy(Hash, Buffer, 16);
553
9.57k
                code = pdfi_open_memory_stream_from_memory(ctx, 16, (byte *)Hash, &stream, true);
554
9.57k
                if (code < 0)
555
0
                    goto error;
556
557
160k
                for (j=0;j < KeyLenBytes;j++) {
558
151k
                    XORKey->data[j] = Key->data[j] ^ i;
559
151k
                }
560
561
9.57k
                code = pdfi_apply_Arc4_filter(ctx, XORKey, stream, &arc4_stream);
562
9.57k
                if (code < 0) {
563
0
                    pdfi_close_memory_stream(ctx, NULL, stream);
564
0
                    goto error;
565
0
                }
566
9.57k
                sfread(Buffer, 1, 16, arc4_stream->s);
567
9.57k
                pdfi_close_file(ctx, arc4_stream);
568
9.57k
                pdfi_close_memory_stream(ctx, NULL, stream);
569
9.57k
            }
570
571
            /* Algorithm 3.6 step 2
572
             * If the result of the step above is equal to the value of the encryption dictionary U entry
573
             * (comparing on the first 16 bytes in the case of revision 3 of greater)
574
             * the password supplied is the correct user password.
575
             */
576
504
            if (memcmp(Buffer, ctx->encryption.U, 16) != 0) {
577
60
                code = gs_error_unknownerror;
578
60
                goto error;
579
444
            } else {
580
                /* Password authenticated, we can now use the calculated encryption key to decrypt the file */
581
444
                ctx->encryption.EKey = Key;
582
444
            }
583
444
            break;
584
444
        default:
585
0
            code = gs_note_error(gs_error_rangecheck);
586
0
            goto error;
587
0
            break;
588
746
    }
589
590
    /* We deliberately don't countdown Key here, if we created it and there were no
591
     * errors then we will have stored it in the global context for future use. It
592
     * will be counted down when the context is destroyed.
593
     */
594
666
    pdfi_countdown(XORKey);
595
666
    pdfi_countdown(s);
596
666
    pdfi_countdown(a);
597
666
    return 0;
598
599
80
error:
600
80
    pdfi_countdown(XORKey);
601
80
    pdfi_countdown(Key);
602
80
    pdfi_countdown(s);
603
80
    pdfi_countdown(a);
604
80
    return code;
605
746
}
606
607
static int check_owner_password_R5(pdf_context *ctx, char *Password, int Len, int KeyLen)
608
0
{
609
0
    char *UTF8_Password = NULL, *Test = NULL, Buffer[32], OEPadded[48];
610
0
    int NewLen;
611
0
    int code = 0;
612
0
    pdf_c_stream *stream = NULL, *filter_stream = NULL;
613
0
    pdf_string *Key = NULL;
614
0
    SHA256_CTX sha256;
615
616
    /* From the original code in Resource/Init/pdf_sec.ps:
617
     * Step 1.
618
     * If the .saslprep operator isn't available (because ghostscript
619
     * wasn't built with libidn support), just skip this step.  ASCII
620
     * passwords will still work fine, and even most non-ASCII passwords
621
     * will be okay; any non-ASCII passwords that fail will produce a
622
     * warning from pdf_process_Encrypt.
623
     */
624
#ifdef HAVE_LIBIDN
625
    code = apply_sasl(ctx, Password, Len, &UTF8_Password, &NewLen);
626
    if (code < 0)
627
        return code;
628
#else
629
0
    UTF8_Password = Password;
630
0
    NewLen = Len;
631
0
#endif
632
0
    if (NewLen > 127)
633
0
        NewLen = 127;
634
635
0
    Test = (char *)gs_alloc_bytes(ctx->memory, NewLen + 8 + 48, "r5 password test");
636
0
    if (Test == NULL) {
637
0
        code = gs_note_error(gs_error_VMerror);
638
0
        goto error;
639
0
    }
640
641
    /* concatenate the password */
642
0
    memcpy(Test, UTF8_Password, NewLen);
643
    /* With the 'Owner Validation Salt' (stored as part of the /O string */
644
0
    memcpy(&Test[NewLen], &ctx->encryption.O[32], 8);
645
    /* and also concatenated with the /U string, which is defined to be 48 bytes for revision 5 */
646
0
    memcpy(&Test[NewLen + 8], &ctx->encryption.U, 48);
647
648
    /* Now calculate the SHA256 hash */
649
0
    pSHA256_Init(&sha256);
650
0
    pSHA256_Update(&sha256, (const uint8_t *)Test, NewLen + 8 + 48);
651
0
    pSHA256_Final((uint8_t *)Buffer, &sha256);
652
653
0
    if (memcmp(Buffer, ctx->encryption.O, 32) != 0) {
654
0
        code = gs_note_error(gs_error_unknownerror);
655
0
        goto error;
656
0
    }
657
658
    /* Password matched */
659
    /* Finally calculate the decryption key */
660
0
    gs_free_object(ctx->memory, Test, "R5 password test");
661
662
    /* Password + last 8 bytes of /O */
663
0
    Test = (char *)gs_alloc_bytes(ctx->memory, NewLen + 8 + 48, "R5 password test");
664
0
    if (Test == NULL) {
665
0
        code = gs_note_error(gs_error_VMerror);
666
0
        goto error;
667
0
    }
668
669
0
    memcpy(Test, UTF8_Password, NewLen);
670
    /* The 'User Key Salt' (stored as part of the /O string */
671
0
    memcpy(&Test[NewLen], &ctx->encryption.O[40], 8);
672
0
    memcpy(&Test[NewLen + 8], ctx->encryption.U, 48);
673
674
    /* Now calculate the SHA256 hash */
675
0
    pSHA256_Init(&sha256);
676
0
    pSHA256_Update(&sha256, (const uint8_t *)Test, NewLen + 8 + 48);
677
0
    pSHA256_Final((uint8_t *)Buffer, &sha256);
678
679
0
    memset(OEPadded, 0x00, 16);
680
0
    memcpy(&OEPadded[16], ctx->encryption.OE, 32);
681
682
0
    code = pdfi_object_alloc(ctx, PDF_STRING, 32, (pdf_obj **)&Key);
683
0
    if (code < 0)
684
0
        goto error;
685
    /* pdfi_object_alloc() creates objects with a refrence count of 0 */
686
0
    pdfi_countup(Key);
687
0
    memcpy(Key->data, Buffer, 32);
688
689
    /* Now apply AESDecode to the padded UE string, using the SHA from above as the key */
690
0
    code = pdfi_open_memory_stream_from_memory(ctx, 48, (byte *)OEPadded, &stream, true);
691
0
    if (code < 0)
692
0
        goto error;
693
694
0
    code = pdfi_apply_AES_filter(ctx, Key, false, stream, &filter_stream);
695
0
    if (code < 0) {
696
0
        pdfi_close_memory_stream(ctx, NULL, stream);
697
0
        goto error;
698
0
    }
699
700
0
    sfread(Buffer, 1, 32, filter_stream->s);
701
0
    pdfi_close_file(ctx, filter_stream);
702
0
    pdfi_close_memory_stream(ctx, NULL, stream);
703
0
    code = pdfi_object_alloc(ctx, PDF_STRING, 32, (pdf_obj **)&ctx->encryption.EKey);
704
0
    if (code < 0)
705
0
        goto error;
706
0
    memcpy(ctx->encryption.EKey->data, Buffer, 32);
707
0
    pdfi_countup(ctx->encryption.EKey);
708
709
0
error:
710
0
    pdfi_countdown(Key);
711
0
    gs_free_object(ctx->memory, Test, "R5 password test");
712
#ifdef HAVE_LIBIDN
713
    if (UTF8_Password != Password)
714
        gs_free_object(ctx->memory, UTF8_Password, "free sasl result");
715
#endif
716
0
    return code;
717
0
}
718
719
static int check_owner_password_R6(pdf_context *ctx, char *Password, int Len, int KeyLen)
720
163
{
721
163
  unsigned char validation[32];
722
163
  unsigned char output[32];
723
163
    int code = 0;
724
725
163
    pdf_compute_encryption_key_r6((unsigned char *)Password, Len, (unsigned char *)ctx->encryption.O, (unsigned char *)ctx->encryption.OE,
726
163
                                  (unsigned char *)ctx->encryption.U, (unsigned char *)ctx->encryption.UE, 1, validation, output);
727
728
163
    if (memcmp(validation, ctx->encryption.O, 32) != 0)
729
68
        return_error(gs_error_unknownerror);
730
731
95
    code = pdfi_object_alloc(ctx, PDF_STRING, 32, (pdf_obj **)&ctx->encryption.EKey);
732
95
    if (code < 0)
733
95
        return_error(gs_error_VMerror);;
734
95
    memcpy(ctx->encryption.EKey->data, output, 32);
735
95
    pdfi_countup(ctx->encryption.EKey);
736
737
95
    return 0;
738
95
}
739
740
static int check_owner_password_preR5(pdf_context *ctx, char *Password, int Len, int KeyLen, int R)
741
40
{
742
40
    char Key[32];
743
40
    int code = 0, i, j, KeyLenBytes = KeyLen / 8;
744
40
    pdf_string *EKey = NULL;
745
40
    gs_md5_state_t md5;
746
40
    pdf_c_stream *stream, *arc4_stream;
747
40
    char Buffer[32], Arc4Source[32];
748
749
    /* Algorithm 3.7 */
750
    /* Step 1, Compute an encryption key from steps 1-4 of Algorithm 3.3 */
751
752
    /* Algorithm 3.3, step 1. Pad or truncate the password string to exactly 32 bytes */
753
40
    if (Len > 32)
754
0
        Len = 32;
755
756
40
    memcpy(Key, Password, Len);
757
758
40
    if (Len < 32)
759
40
        memcpy(&Key[Len], PadString, 32 - Len);
760
761
    /* Algorithm 3.3, step 2. Initialise the MD5 hash function and pass the result of step 1 to this function */
762
40
    gs_md5_init(&md5);
763
40
    gs_md5_append(&md5, (gs_md5_byte_t *)&Key, 32);
764
40
    gs_md5_finish(&md5, (gs_md5_byte_t *)&Key);
765
766
    /* Algorithm 3.3, step 3. Only for R3 or greater */
767
40
    if (R > 2) {
768
30
        code = pdfi_object_alloc(ctx, PDF_STRING, KeyLenBytes, (pdf_obj **)&EKey);
769
30
        if (code < 0)
770
0
            goto error;
771
        /* pdfi_object_alloc() creates objects with a refrence count of 0 */
772
30
        pdfi_countup(EKey);
773
774
1.53k
        for (i = 0; i < 50; i++) {
775
1.50k
            gs_md5_init(&md5);
776
1.50k
            gs_md5_append(&md5, (gs_md5_byte_t *)&Key, KeyLenBytes);
777
1.50k
            gs_md5_finish(&md5, (gs_md5_byte_t *)&Key);
778
1.50k
        }
779
        /* Algorithm 3.3, step 4. Use KeyLen bytes of the final hash as an RC$ key */
780
        /* Algorithm 3.7, step 2 (R >= 3) */
781
30
        memcpy(Buffer, ctx->encryption.O, 32);
782
783
        /* Algorithm 3.7 states (at the end):
784
         * "performing an XOR (exclusive or) operation between each byte of the key and the single-byte value of the iteration counter (from 19 to 0)."
785
         * which implies that the loop should run 20 times couting down from 19 to 0. For decryption at least this is completely
786
         * incorrect. Doing that results in completely garbage output.
787
         * By using 0 as the first index we get the correct Key when XOR'ing that with the
788
         * key computed above, and continuing until the loop counter reaches 19 gives us the correct
789
         * result.
790
         */
791
630
        for (i=0; i<20; i++) {
792
600
            memcpy(Arc4Source, Buffer, 32);
793
600
            code = pdfi_open_memory_stream_from_memory(ctx, 32, (byte *)Arc4Source, &stream, true);
794
600
            if (code < 0)
795
0
                goto error;
796
9.10k
            for(j=0;j< KeyLenBytes;j++){
797
8.50k
                EKey->data[j] = Key[j] ^ i;
798
8.50k
            }
799
600
            code = pdfi_apply_Arc4_filter(ctx, EKey, stream, &arc4_stream);
800
600
            sfread(Buffer, 1, 32, arc4_stream->s);
801
600
            pdfi_close_file(ctx, arc4_stream);
802
600
            pdfi_close_memory_stream(ctx, NULL, stream);
803
600
        }
804
805
30
    } else {
806
        /* Algorithm 3.3, step 4. For revision 2 always use 5 bytes of the final hash as an RC4 key */
807
10
        code = pdfi_object_alloc(ctx, PDF_STRING, 5, (pdf_obj **)&EKey);
808
10
        if (code < 0)
809
0
            goto error;
810
10
        pdfi_countup(EKey);
811
10
        memcpy(EKey->data, Key, 5);
812
813
        /* Algorithm 3.7, step 2 (R == 2) Use RC4 with the computed key to decrypt the O entry of the crypt dict */
814
10
        code = pdfi_open_memory_stream_from_memory(ctx, 32, (byte *)ctx->encryption.O, &stream, true);
815
10
        if (code < 0)
816
0
            goto error;
817
818
10
        code = pdfi_apply_Arc4_filter(ctx, EKey, stream, &arc4_stream);
819
10
        pdfi_countdown(EKey);
820
10
        EKey = NULL;
821
822
10
        sfread(Buffer, 1, 32, arc4_stream->s);
823
824
10
        pdfi_close_file(ctx, arc4_stream);
825
10
        pdfi_close_memory_stream(ctx, NULL, stream);
826
10
    }
827
828
    /* Algorithm 3.7, step 3, the result of step 2 purports to be the user password, check it */
829
40
    code = check_user_password_preR5(ctx, Buffer, 32, KeyLen, R);
830
831
40
error:
832
40
    pdfi_countdown(EKey);
833
40
    return code;
834
40
}
835
836
/* Compute a decryption key for an 'object'. The decryption key for a string or stream is
837
 * calculated by algorithm 3.1.
838
 */
839
int pdfi_compute_objkey(pdf_context *ctx, pdf_obj *obj, pdf_string **Key)
840
24.6k
{
841
24.6k
    char *Buffer;
842
24.6k
    int idx, ELength, code = 0, md5_length = 0;
843
24.6k
    gs_md5_state_t md5;
844
24.6k
    int64_t object_num;
845
24.6k
    uint32_t generation_num;
846
847
24.6k
    if (ctx->encryption.R < 5) {
848
21.8k
        if (obj->object_num == 0) {
849
            /* The object is a direct object, use the object number of the container instead */
850
13.4k
            object_num = obj->indirect_num;
851
13.4k
            generation_num = obj->indirect_gen;
852
13.4k
        } else {
853
8.38k
            object_num = obj->object_num;
854
8.38k
            generation_num = obj->generation_num;
855
8.38k
        }
856
857
        /* Step 1, obtain the object and generation numbers (see arguments). If the string is
858
         * a direct object, use the identifier of the indirect object containing it.
859
         * Buffer length is a maximum of the Encryption key + 3 bytes from the object number
860
         * + 2 bytes from the generation number and (for AES filters) 4 bytes of sALT.
861
         * But... We must make sure the buffer is large enough for the 128 bits of an MD5 hash.
862
         */
863
21.8k
        md5_length = ctx->encryption.EKey->length + 9;
864
21.8k
        if (md5_length < 16)
865
4.62k
            md5_length = 16;
866
867
21.8k
        Buffer = (char *)gs_alloc_bytes(ctx->memory, md5_length, "");
868
21.8k
        if (Buffer == NULL)
869
0
            return gs_note_error(gs_error_VMerror);
870
871
        /* Step 2, Treating the object number and generation number as binary integers, extend
872
         * the original n-byte encryption key (calculated in pdfi_read_Encryption) to n+5 bytes
873
         * by appending the low order 3 bytes of the object number and the low order 2 bytes of
874
         * the generation number in that order, low-order byte first. (n is 5 unless the value
875
         * of V in the encryption dictionary is greater than 1 in which case n is the value of
876
         * Length divided by 8). Because we store the encryption key is as a PDF string object,
877
         * we can just use the length of the string data, we calculated the length as part of
878
         * creating the key.
879
         */
880
21.8k
        memcpy(Buffer, ctx->encryption.EKey->data, ctx->encryption.EKey->length);
881
21.8k
        idx = ctx->encryption.EKey->length;
882
21.8k
        Buffer[idx] = object_num & 0xff;
883
21.8k
        Buffer[++idx] = (object_num & 0xff00) >> 8;
884
21.8k
        Buffer[++idx] = (object_num & 0xff0000) >> 16;
885
21.8k
        Buffer[++idx] = generation_num & 0xff;
886
21.8k
        Buffer[++idx] = (generation_num & 0xff00) >> 8;
887
888
21.8k
        md5_length = ctx->encryption.EKey->length + 5;
889
890
        /* If using the AES algorithm, extend the encryption key an additional 4 bytes
891
         * by adding the value "sAlT" which corresponds to the hexadecimal 0x73416c54
892
         * (This addition is done for backward compatibility and is not intended to
893
         * provide addtional security).
894
         */
895
21.8k
        if (ctx->encryption.StmF == CRYPT_AESV2 || ctx->encryption.StmF == CRYPT_AESV3){
896
16.9k
            memcpy(&Buffer[++idx], sAlTString, 4);
897
16.9k
            md5_length += 4;
898
16.9k
        }
899
900
        /* Step 3
901
         * Initialise the MD5 function and pass the result of step 2 as input to this function
902
         */
903
21.8k
        gs_md5_init(&md5);
904
21.8k
        gs_md5_append(&md5, (gs_md5_byte_t *)Buffer, md5_length);
905
21.8k
        gs_md5_finish(&md5, (gs_md5_byte_t *)Buffer);
906
907
        /* Step 4
908
         * Use the first n+5 bytes, up to a maximum of 16, of the output from the MD5
909
         * hash as the key for the RC4 or AES symmetric key algorithms, along with the
910
         * string or stream data to be encrypted.
911
         */
912
21.8k
        ELength = ctx->encryption.EKey->length + 5;
913
21.8k
        if (ELength > 16)
914
17.2k
            ELength = 16;
915
916
21.8k
        code = pdfi_object_alloc(ctx, PDF_STRING, (uint64_t)ELength, (pdf_obj **)Key);
917
21.8k
        if (code >= 0)
918
21.8k
            memcpy((*Key)->data, Buffer, ELength);
919
        /* pdfi_object_alloc() creates objects with a refrence count of 0 */
920
21.8k
        pdfi_countup(*Key);
921
922
21.8k
        gs_free_object(ctx->memory, Buffer, "");
923
21.8k
    } else {
924
        /* Revision 5 & 6 don't use the object number and generation, just return the pre-calculated key */
925
2.76k
        *Key = ctx->encryption.EKey;
926
2.76k
        pdfi_countup(*Key);
927
2.76k
    }
928
24.6k
    return code;
929
24.6k
}
930
931
int pdfi_decrypt_string(pdf_context *ctx, pdf_string *string)
932
15.6k
{
933
15.6k
    int code = 0, bytes_decrypted = 0;
934
15.6k
    pdf_c_stream *stream = NULL, *crypt_stream = NULL;
935
15.6k
    pdf_string *EKey = NULL;
936
15.6k
    char *Buffer = NULL;
937
938
15.6k
    if (ctx->encryption.StrF == CRYPT_IDENTITY)
939
0
        return 0;
940
941
15.6k
    if (!is_compressed_object(ctx, string->indirect_num, string->indirect_gen)) {
942
15.6k
        Buffer = (char *)gs_alloc_bytes(ctx->memory, string->length, "pdfi_decrypt_string");
943
15.6k
        if (Buffer == NULL)
944
0
            return_error(gs_error_VMerror);
945
946
15.6k
        code = pdfi_compute_objkey(ctx, (pdf_obj *)string, &EKey);
947
15.6k
        if (code < 0)
948
0
            goto error;
949
950
15.6k
        code = pdfi_open_memory_stream_from_memory(ctx, string->length, (byte *)string->data, &stream, true);
951
15.6k
        if (code < 0)
952
0
            goto error;
953
954
15.6k
        switch(ctx->encryption.StrF) {
955
            /* There are only two possible filters, RC4 or AES, we take care
956
             * of the number of bits in the key by using ctx->Length.
957
             */
958
0
            case CRYPT_IDENTITY:
959
0
                pdfi_close_memory_stream(ctx, NULL, stream);
960
0
                code = 0;
961
0
                goto error;
962
0
                break;
963
3.14k
            case CRYPT_V1:
964
3.37k
            case CRYPT_V2:
965
3.37k
                code = pdfi_apply_Arc4_filter(ctx, EKey, stream, &crypt_stream);
966
3.37k
                break;
967
10.0k
            case CRYPT_AESV2:
968
12.2k
            case CRYPT_AESV3:
969
12.2k
                code = pdfi_apply_AES_filter(ctx, EKey, 1, stream, &crypt_stream);
970
12.2k
                break;
971
0
            default:
972
0
                code = gs_error_rangecheck;
973
15.6k
        }
974
15.6k
        if (code < 0) {
975
0
            pdfi_close_memory_stream(ctx, NULL, stream);
976
0
            goto error;
977
0
        }
978
979
        /* The decrypted string length will likely be less than the original encrypted
980
         * string length. sfread won't tell us how many bytes it actually read, so we need
981
         * to decrypt one byte at a time until it returns EOD/ERRC. Then we can copy the
982
         * bytes we actually read and change the string length.
983
         */
984
1.21M
        for (bytes_decrypted = 0;bytes_decrypted < string->length;bytes_decrypted++) {
985
1.21M
            code = sfread(&Buffer[bytes_decrypted], 1, 1, crypt_stream->s);
986
1.21M
            if (code != 1) {
987
12.2k
                code = 0;
988
12.2k
                break;
989
12.2k
            }
990
1.21M
        }
991
992
15.6k
        pdfi_close_file(ctx, crypt_stream);
993
15.6k
        pdfi_close_memory_stream(ctx, NULL, stream);
994
995
15.6k
        string->length = bytes_decrypted;
996
15.6k
        memcpy(string->data, Buffer, string->length);
997
15.6k
    }
998
999
15.6k
error:
1000
15.6k
    gs_free_object(ctx->memory, Buffer, "pdfi_decrypt_string");
1001
15.6k
    pdfi_countdown(EKey);
1002
15.6k
    return code;
1003
15.6k
}
1004
1005
/* Read the Encrypt dictionary entries and store the relevant ones
1006
 * in the PDF context for easy access. Return < 0 = error, 0 = encrypted
1007
 * and read the encryption details, 1 = not encrypted.
1008
 */
1009
static int pdfi_read_Encrypt_dict(pdf_context *ctx, int *KeyLen)
1010
1.15k
{
1011
1.15k
    int code = 0;
1012
1.15k
    pdf_dict *CF_dict = NULL, *StdCF_dict = NULL;
1013
1.15k
    pdf_dict *d = NULL, *d1 = NULL;
1014
1.15k
    pdf_obj *o = NULL;
1015
1.15k
    bool b;
1016
1.15k
    pdf_string *s = NULL;
1017
1.15k
    int64_t i64;
1018
1.15k
    double f;
1019
1020
1.15k
    if (ctx->args.pdfdebug)
1021
0
        outprintf(ctx->memory, "%% Checking for Encrypt dictionary\n");
1022
1023
    /* See comment in pdfi_read_Root() for details of why we indirect through 'd' */
1024
1.15k
    d1 = ctx->Trailer;
1025
1.15k
    pdfi_countup(d1);
1026
1.15k
    code = pdfi_dict_get(ctx, d1, "Encrypt", (pdf_obj **)&d);
1027
1.15k
    pdfi_countdown(d1);
1028
1.15k
    d1 = NULL;
1029
1030
    /* Undefined is acceptable here, it just means the PDF file is not ostensibly encrypted */
1031
    /* NB pdfi_process_pdf_file() always checks for the Encrypt dictionary before we
1032
     * get here, so there shouldn't be a problem.....
1033
     */
1034
1.15k
    if (code == gs_error_undefined)
1035
0
        return 1;
1036
1.15k
    else
1037
1.15k
        if (code < 0)
1038
0
            goto done;
1039
1040
1.15k
    code = pdfi_dict_get_type(ctx, d, "Filter", PDF_NAME, &o);
1041
1.15k
    if (code < 0)
1042
11
        goto done;
1043
1044
1.13k
    if (!pdfi_name_is((pdf_name *)o, "Standard")) {
1045
2
        char *Str = NULL;
1046
1047
2
        Str = (char *)gs_alloc_bytes(ctx->memory, ((pdf_name *)o)->length + 1, "temp string for warning");
1048
2
        if (Str == NULL) {
1049
0
            code = gs_note_error(gs_error_VMerror);
1050
0
            goto done;
1051
0
        }
1052
2
        memset(Str, 0x00, ((pdf_name *)o)->length + 1);
1053
2
        memcpy(Str, ((pdf_name *)o)->data, ((pdf_name *)o)->length);
1054
2
        emprintf1(ctx->memory, "\n   **** Warning: This file uses an unknown security handler %s\n", Str);
1055
2
        gs_free_object(ctx->memory, Str, "temp string for warning");
1056
2
        code = gs_note_error(gs_error_typecheck);
1057
2
        goto done;
1058
2
    }
1059
1.13k
    pdfi_countdown(o);
1060
1.13k
    o = NULL;
1061
1062
1.13k
    *KeyLen = 0;
1063
1.13k
    ctx->encryption.V = -1;
1064
1065
1.13k
    code = pdfi_dict_get_int(ctx, d, "R", &i64);
1066
1.13k
    if (code < 0)
1067
0
        goto done;
1068
1.13k
    ctx->encryption.R = (int)i64;
1069
1070
    /* V is required for PDF 2.0 but only strongly recommended for earlier versions */
1071
1.13k
    code = pdfi_dict_known(ctx, d, "V", &b);
1072
1.13k
    if (code < 0)
1073
0
        goto done;
1074
1075
1.13k
    if (b) {
1076
1.13k
        code = pdfi_dict_get_int(ctx, d, "V", &i64);
1077
1.13k
        if (code < 0)
1078
0
            goto done;
1079
1080
1.13k
        if (i64 < 1 || i64 > 5) {
1081
2
            code = gs_error_rangecheck;
1082
2
            goto done;
1083
2
        }
1084
1085
1.13k
        ctx->encryption.V = (int)i64;
1086
1087
1.13k
        code = pdfi_dict_knownget_number(ctx, d, "Length", &f);
1088
1.13k
        if (code < 0)
1089
0
            goto done;
1090
1091
1.13k
        if (code > 0)
1092
1.09k
            *KeyLen = (int)f;
1093
1.13k
    }
1094
1095
1.13k
    code = pdfi_dict_get_int(ctx, d, "P", &i64);
1096
1.13k
    if (code < 0)
1097
0
        goto done;
1098
1.13k
    ctx->encryption.P = (int)i64;
1099
1100
1.13k
    code = pdfi_dict_get_type(ctx, d, "O", PDF_STRING, (pdf_obj **)&s);
1101
1.13k
    if (code < 0)
1102
0
        goto done;
1103
1104
1.13k
    if (ctx->encryption.R < 5) {
1105
735
        if (s->length < 32) {
1106
12
            code = gs_note_error(gs_error_rangecheck);
1107
12
            goto done;
1108
12
        }
1109
723
        memcpy(ctx->encryption.O, s->data, 32);
1110
723
    } else {
1111
400
        if (s->length < 48) {
1112
4
            code = gs_note_error(gs_error_rangecheck);
1113
4
            goto done;
1114
4
        }
1115
396
        memcpy(ctx->encryption.O, s->data, 48);
1116
396
    }
1117
1.11k
    pdfi_countdown(s);
1118
1.11k
    s = NULL;
1119
1120
1.11k
    code = pdfi_dict_get_type(ctx, d, "U", PDF_STRING, (pdf_obj **)&s);
1121
1.11k
    if (code < 0)
1122
0
        goto done;
1123
1124
1.11k
    if (ctx->encryption.R < 5) {
1125
723
        if (s->length < 32) {
1126
10
            code = gs_note_error(gs_error_rangecheck);
1127
10
            goto done;
1128
10
        }
1129
713
        memcpy(ctx->encryption.U, s->data, 32);
1130
713
    } else {
1131
396
        if (s->length < 48) {
1132
5
            code = gs_note_error(gs_error_rangecheck);
1133
5
            goto done;
1134
5
        }
1135
391
        memcpy(ctx->encryption.U, s->data, 48);
1136
391
    }
1137
1.10k
    pdfi_countdown(s);
1138
1.10k
    s = NULL;
1139
1140
1.10k
    code = pdfi_dict_knownget_bool(ctx, d, "EncryptMetadata", &b);
1141
1.10k
    if (code < 0)
1142
0
        goto done;
1143
1.10k
    if (code > 0) {
1144
79
        ctx->encryption.EncryptMetadata = b;
1145
79
        code = 0;
1146
79
    }
1147
1.02k
    else
1148
1.02k
        ctx->encryption.EncryptMetadata = true;
1149
1150
1.10k
    if (ctx->encryption.R > 3) {
1151
        /* Check the Encrypt dictionary has default values for Stmf and StrF
1152
         * and that they have the names /StdCF. We don't support anything else.
1153
         */
1154
844
        code = pdfi_dict_get_type(ctx, d, "StmF", PDF_NAME, &o);
1155
844
        if (code < 0)
1156
7
            goto done;
1157
837
        if (!pdfi_name_is((pdf_name *)o, "StdCF")) {
1158
3
            if (pdfi_name_is((pdf_name *)o, "Identity")) {
1159
0
                ctx->encryption.StmF = CRYPT_IDENTITY;
1160
3
            } else {
1161
3
                code = gs_note_error(gs_error_undefined);
1162
3
                goto done;
1163
3
            }
1164
3
        }
1165
834
        pdfi_countdown(o);
1166
834
        o = NULL;
1167
1168
834
        code = pdfi_dict_knownget_type(ctx, d, "StrF", PDF_NAME, &o);
1169
834
        if (code < 0)
1170
0
            goto done;
1171
834
        if (code == 0) {
1172
11
            code = gs_note_error(gs_error_undefined);
1173
11
            goto done;
1174
11
        }
1175
823
        if (!pdfi_name_is((pdf_name *)o, "StdCF")) {
1176
16
            if (pdfi_name_is((pdf_name *)o, "Identity")) {
1177
12
                ctx->encryption.StrF = CRYPT_IDENTITY;
1178
12
            } else {
1179
4
                code = gs_note_error(gs_error_undefined);
1180
4
                goto done;
1181
4
            }
1182
16
        }
1183
819
        pdfi_countdown(o);
1184
819
        o = NULL;
1185
1186
        /* Validated StmF and StrF, now check the Encrypt dictionary for the definition of
1187
         * the Crypt Filter dictionary and ensure it has a /StdCF dictionary.
1188
         */
1189
819
        code = pdfi_dict_get_type(ctx, d, "CF", PDF_DICT, (pdf_obj **)&CF_dict);
1190
819
        if (code < 0)
1191
10
            goto done;
1192
1193
809
        code = pdfi_dict_get_type(ctx, CF_dict, "StdCF", PDF_DICT, (pdf_obj **)&StdCF_dict);
1194
809
        if (code < 0)
1195
12
            goto done;
1196
1197
797
        code = pdfi_dict_get_type(ctx, StdCF_dict, "CFM", PDF_NAME, &o);
1198
797
        if (code < 0)
1199
2
            goto done;
1200
1201
795
        if (pdfi_name_is((pdf_name *)o, "V2")) {
1202
3
            if (ctx->encryption.StmF == CRYPT_NONE)
1203
3
                ctx->encryption.StmF = CRYPT_V2;
1204
3
            if (ctx->encryption.StrF == CRYPT_NONE)
1205
3
                ctx->encryption.StrF = CRYPT_V2;
1206
792
        } else {
1207
792
            if (pdfi_name_is((pdf_name *)o, "AESV2")) {
1208
444
                if (ctx->encryption.StmF == CRYPT_NONE)
1209
444
                    ctx->encryption.StmF = CRYPT_AESV2;
1210
444
                if (ctx->encryption.StrF == CRYPT_NONE)
1211
432
                    ctx->encryption.StrF = CRYPT_AESV2;
1212
444
            } else {
1213
348
                if (pdfi_name_is((pdf_name *)o, "AESV3")) {
1214
341
                    if (ctx->encryption.StmF == CRYPT_NONE)
1215
341
                        ctx->encryption.StmF = CRYPT_AESV3;
1216
341
                    if (ctx->encryption.StrF == CRYPT_NONE)
1217
341
                        ctx->encryption.StrF = CRYPT_AESV3;
1218
341
                } else {
1219
7
                    emprintf(ctx->memory, "\n   **** Error: Unknown default encryption method in crypt filter.\n");
1220
7
                    code = gs_error_rangecheck;
1221
7
                    goto done;
1222
7
                }
1223
348
            }
1224
792
        }
1225
788
        pdfi_countdown(o);
1226
788
        o = NULL;
1227
1228
788
        if (ctx->encryption.R > 4) {
1229
342
            code = pdfi_dict_get_type(ctx, d, "OE", PDF_STRING, (pdf_obj **)&s);
1230
342
            if (code < 0)
1231
3
                goto done;
1232
1233
339
            if (s->length != 32) {
1234
7
                code = gs_note_error(gs_error_rangecheck);
1235
7
                goto done;
1236
7
            }
1237
332
            memcpy(ctx->encryption.OE, s->data, 32);
1238
332
            pdfi_countdown(s);
1239
332
            s = NULL;
1240
1241
332
            code = pdfi_dict_get_type(ctx, d, "UE", PDF_STRING, (pdf_obj **)&s);
1242
332
            if (code < 0)
1243
0
                goto done;
1244
1245
332
            if (s->length != 32) {
1246
8
                code = gs_note_error(gs_error_rangecheck);
1247
8
                goto done;
1248
8
            }
1249
324
            memcpy(ctx->encryption.UE, s->data, 32);
1250
324
            pdfi_countdown(s);
1251
324
            s = NULL;
1252
324
        }
1253
788
    }
1254
1255
1.15k
done:
1256
1.15k
    pdfi_countdown(StdCF_dict);
1257
1.15k
    pdfi_countdown(CF_dict);
1258
1.15k
    pdfi_countdown(s);
1259
1.15k
    pdfi_countdown(o);
1260
1.15k
    pdfi_countdown(d);
1261
1.15k
    return code;
1262
1.10k
}
1263
1264
static int check_password_preR5(pdf_context *ctx, char *Password, int PasswordLen, int KeyLen, int Revision)
1265
706
{
1266
706
    int code;
1267
1268
706
    if (PasswordLen != 0) {
1269
0
        code = check_user_password_preR5(ctx, Password, PasswordLen, KeyLen, Revision);
1270
0
        if (code >= 0)
1271
0
            return 0;
1272
1273
0
        code = check_owner_password_preR5(ctx, Password, PasswordLen, KeyLen, Revision);
1274
0
        if (code >= 0)
1275
0
            return 0;
1276
0
    }
1277
706
    code = check_user_password_preR5(ctx, (char *)"", 0, KeyLen, Revision);
1278
706
    if (code >= 0)
1279
666
        return 0;
1280
1281
40
    return check_owner_password_preR5(ctx, (char *)"", 0, KeyLen, Revision);
1282
706
}
1283
1284
static int check_password_R5(pdf_context *ctx, char *Password, int PasswordLen, int KeyLen)
1285
0
{
1286
0
    int code;
1287
1288
0
    if (PasswordLen != 0) {
1289
0
        pdf_string *P = NULL, *P_UTF8 = NULL;
1290
1291
0
        code = check_user_password_R5(ctx, Password, PasswordLen, KeyLen);
1292
0
        if (code >= 0)
1293
0
            return 0;
1294
1295
0
        code = check_owner_password_R5(ctx, Password, PasswordLen, KeyLen);
1296
0
        if (code >= 0)
1297
0
            return 0;
1298
1299
        /* If the supplied Password fails as the user *and* owner password, maybe its in
1300
         * the locale, not UTF-8, try converting to UTF-8
1301
         */
1302
0
        code = pdfi_object_alloc(ctx, PDF_STRING, PasswordLen, (pdf_obj **)&P);
1303
0
        if (code < 0)
1304
0
            return code;
1305
0
        memcpy(P->data, Password, PasswordLen);
1306
0
        pdfi_countup(P);
1307
0
        code = locale_to_utf8(ctx, P, &P_UTF8);
1308
0
        if (code < 0) {
1309
0
            pdfi_countdown(P);
1310
0
            return code;
1311
0
        }
1312
0
        code = check_user_password_R5(ctx, (char *)P_UTF8->data, P_UTF8->length, KeyLen);
1313
0
        if (code >= 0) {
1314
0
            pdfi_countdown(P);
1315
0
            pdfi_countdown(P_UTF8);
1316
0
            return code;
1317
0
        }
1318
1319
0
        code = check_owner_password_R5(ctx, (char *)P_UTF8->data, P_UTF8->length, KeyLen);
1320
0
        pdfi_countdown(P);
1321
0
        pdfi_countdown(P_UTF8);
1322
0
        if (code >= 0)
1323
0
            return code;
1324
0
    }
1325
0
    code = check_user_password_R5(ctx, (char *)"", 0, KeyLen);
1326
0
    if (code >= 0)
1327
0
        return 0;
1328
1329
0
    return check_owner_password_R5(ctx, (char *)"", 0, KeyLen);
1330
0
}
1331
1332
static int check_password_R6(pdf_context *ctx, char *Password, int PasswordLen, int KeyLen)
1333
324
{
1334
324
    int code;
1335
1336
324
    if (PasswordLen != 0) {
1337
0
        pdf_string *P = NULL, *P_UTF8 = NULL;
1338
1339
0
        code = check_user_password_R6(ctx, Password, PasswordLen, KeyLen);
1340
0
        if (code >= 0)
1341
0
            return 0;
1342
1343
0
        code = check_owner_password_R6(ctx, Password, PasswordLen, KeyLen);
1344
0
        if (code >= 0)
1345
0
            return 0;
1346
        /* If the supplied Password fails as the user *and* owner password, maybe its in
1347
         * the locale, not UTF-8, try converting to UTF-8
1348
         */
1349
0
        code = pdfi_object_alloc(ctx, PDF_STRING, PasswordLen, (pdf_obj **)&P);
1350
0
        if (code < 0)
1351
0
            return code;
1352
0
        memcpy(P->data, Password, PasswordLen);
1353
0
        pdfi_countup(P);
1354
0
        code = locale_to_utf8(ctx, P, &P_UTF8);
1355
0
        if (code < 0) {
1356
0
            pdfi_countdown(P);
1357
0
            return code;
1358
0
        }
1359
0
        code = check_user_password_R5(ctx, (char *)P_UTF8->data, P_UTF8->length, KeyLen);
1360
0
        if (code >= 0) {
1361
0
            pdfi_countdown(P);
1362
0
            pdfi_countdown(P_UTF8);
1363
0
            return code;
1364
0
        }
1365
1366
0
        code = check_owner_password_R5(ctx, (char *)P_UTF8->data, P_UTF8->length, KeyLen);
1367
0
        pdfi_countdown(P);
1368
0
        pdfi_countdown(P_UTF8);
1369
0
        if (code >= 0)
1370
0
            return code;
1371
0
    }
1372
324
    code = check_user_password_R6(ctx, (char *)"", 0, KeyLen);
1373
324
    if (code >= 0)
1374
161
        return 0;
1375
1376
163
    return check_owner_password_R6(ctx, (char *)"", 0, KeyLen);
1377
324
}
1378
1379
/* Read the Encrypt dictionary entries and store the relevant ones
1380
 * in the PDF context for easy access. Check whether the file is
1381
 * readable without a password and if not, check to see if we've been
1382
 * supplied a password. If we have try the password as the user password
1383
 * and if that fails as the owner password. Store the calculated decryption key
1384
 * for later use decrypting objects.
1385
 */
1386
int pdfi_initialise_Decryption(pdf_context *ctx)
1387
1.15k
{
1388
1.15k
    int code = 0, KeyLen = 0;
1389
1390
1.15k
    code = pdfi_read_Encrypt_dict(ctx, &KeyLen);
1391
1.15k
    if (code > 0)
1392
0
        return 0;
1393
1.15k
    if (code < 0)
1394
120
        return code;
1395
1396
1.03k
    switch(ctx->encryption.R) {
1397
232
        case 2:
1398
            /* Set up the defaults if not already set */
1399
            /* R of 2 means V < 2 which is either algorithm 3.1 with a 40-bit key
1400
             * or an undocumented and unsupported algorithm.
1401
             */
1402
232
            if (ctx->encryption.V >= 0) {
1403
232
                if (ctx->encryption.V == 0) {
1404
0
                    code = gs_note_error(gs_error_undefined);
1405
0
                    goto done;
1406
0
                }
1407
232
            }
1408
            /* Revision 2 is always 40-bit RC4 */
1409
232
            if (KeyLen != 0 && KeyLen != 40)
1410
2
                if ((code = pdfi_set_error_stop(ctx, gs_note_error(gs_error_undefined), NULL, E_PDF_INVALID_DECRYPT_LEN, "pdfi_initialise_Decryption", NULL)) < 0)
1411
0
                    goto done;
1412
232
            KeyLen = 40;
1413
232
            if (ctx->encryption.StmF == CRYPT_NONE)
1414
232
                ctx->encryption.StmF = CRYPT_V1;
1415
232
            if (ctx->encryption.StrF == CRYPT_NONE)
1416
232
                ctx->encryption.StrF = CRYPT_V1;
1417
232
            code = check_password_preR5(ctx, ctx->encryption.Password, ctx->encryption.PasswordLen, KeyLen, 2);
1418
232
            break;
1419
28
        case 3:
1420
            /* Set up the defaults if not already set */
1421
28
            if (ctx->encryption.V >= 0) {
1422
28
                if (ctx->encryption.V == 3) {
1423
0
                    code = gs_note_error(gs_error_undefined);
1424
0
                    goto done;
1425
0
                }
1426
28
            }
1427
            /* Revision 3 *may* be more than 40 bits of RC4 */
1428
28
            if (KeyLen != 0) {
1429
23
                if (KeyLen < 40 || KeyLen > 128 || KeyLen % 8 != 0) {
1430
2
                    pdfi_set_warning(ctx, 0, NULL, W_PDF_INVALID_DECRYPT_LEN, "pdfi_initialise_Decryption", NULL);
1431
2
                    KeyLen = 128;
1432
2
                }
1433
23
            } else
1434
5
                KeyLen = 40;
1435
28
            if (ctx->encryption.StmF == CRYPT_NONE)
1436
28
                ctx->encryption.StmF = CRYPT_V2;
1437
28
            if (ctx->encryption.StrF == CRYPT_NONE)
1438
28
                ctx->encryption.StrF = CRYPT_V2;
1439
28
            code = check_password_preR5(ctx, ctx->encryption.Password, ctx->encryption.PasswordLen, KeyLen, 3);
1440
28
            break;
1441
446
        case 4:
1442
446
            if (ctx->encryption.StrF != CRYPT_IDENTITY || ctx->encryption.StmF != CRYPT_IDENTITY) {
1443
                /* Revision 4 is either AES or RC4, but its always 128-bits */
1444
446
                if (KeyLen != 0)
1445
446
                    pdfi_set_warning(ctx, 0, NULL, W_PDF_SPURIOUS_DECRYPT_LEN, "pdfi_initialise_Decryption", NULL);
1446
446
                KeyLen = 128;
1447
                /* We can't set the encryption filter, so we have to hope the PDF file did */
1448
446
                code = check_password_preR5(ctx, ctx->encryption.Password, ctx->encryption.PasswordLen, KeyLen, 4);
1449
446
            }
1450
446
            break;
1451
0
        case 5:
1452
            /* Set up the defaults if not already set */
1453
0
            if (KeyLen != 0)
1454
0
                pdfi_set_warning(ctx, 0, NULL, W_PDF_SPURIOUS_DECRYPT_LEN, "pdfi_initialise_Decryption", NULL);
1455
0
            KeyLen = 256;
1456
0
            if (ctx->encryption.StmF == CRYPT_NONE)
1457
0
                ctx->encryption.StmF = CRYPT_AESV2;
1458
0
            if (ctx->encryption.StrF == CRYPT_NONE)
1459
0
                ctx->encryption.StrF = CRYPT_AESV2;
1460
0
            code = check_password_R5(ctx, ctx->encryption.Password, ctx->encryption.PasswordLen, KeyLen);
1461
0
            break;
1462
324
        case 6:
1463
            /* Set up the defaults if not already set */
1464
            /* Revision 6 is always 256-bit AES */
1465
324
            if (KeyLen != 0)
1466
313
                pdfi_set_warning(ctx, 0, NULL, W_PDF_SPURIOUS_DECRYPT_LEN, "pdfi_initialise_Decryption", NULL);
1467
324
            KeyLen = 256;
1468
324
            if (ctx->encryption.StmF == CRYPT_NONE)
1469
0
                ctx->encryption.StmF = CRYPT_AESV3;
1470
324
            if (ctx->encryption.StrF == CRYPT_NONE)
1471
0
                ctx->encryption.StrF = CRYPT_AESV3;
1472
324
            code = check_password_R6(ctx, ctx->encryption.Password, ctx->encryption.PasswordLen, KeyLen);
1473
324
            break;
1474
0
        default:
1475
0
            emprintf1(ctx->memory, "\n   **** Warning: This file uses an unknown standard security handler revision: %d\n", ctx->encryption.R);
1476
0
            code = gs_error_rangecheck;
1477
0
            goto done;
1478
1.03k
    }
1479
1.03k
    if (code < 0) {
1480
108
        if(ctx->encryption.Password) {
1481
0
            emprintf(ctx->memory, "\n   **** Error: Password did not work.\n");
1482
0
            emprintf(ctx->memory, "               Cannot decrypt PDF file.\n");
1483
0
        } else
1484
108
            emprintf(ctx->memory, "\n   **** This file requires a password for access.\n");
1485
108
    } else
1486
922
        ctx->encryption.is_encrypted = true;
1487
1488
1.03k
done:
1489
1.03k
    return code;
1490
1.03k
}