enc.c 20.9 KB
Newer Older
R
Rich Salz 已提交
1
/*
2
 * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved.
3
 *
4
 * Licensed under the Apache License 2.0 (the "License").  You may not use
R
Rich Salz 已提交
5 6 7
 * this file except in compliance with the License.  You can obtain a copy
 * in the file LICENSE in the source distribution or at
 * https://www.openssl.org/source/license.html
8 9 10 11 12
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
R
Rich Salz 已提交
13
#include <limits.h>
14
#include "apps.h"
15
#include "progs.h"
16 17 18 19 20
#include <openssl/bio.h>
#include <openssl/err.h>
#include <openssl/evp.h>
#include <openssl/objects.h>
#include <openssl/x509.h>
21
#include <openssl/rand.h>
22
#include <openssl/pem.h>
23
#ifndef OPENSSL_NO_COMP
24
# include <openssl/comp.h>
25
#endif
26
#include <ctype.h>
27 28 29

#undef SIZE
#undef BSIZE
30 31
#define SIZE    (512)
#define BSIZE   (8*1024)
32

E
EasySec 已提交
33
static int set_hex(const char *in, unsigned char *out, int size);
34 35
static void show_ciphers(const OBJ_NAME *name, void *bio_);

36 37 38 39 40
struct doall_enc_ciphers {
    BIO *bio;
    int n;
};

41 42
typedef enum OPTION_choice {
    OPT_ERR = -1, OPT_EOF = 0, OPT_HELP,
R
Rich Salz 已提交
43
    OPT_LIST,
44 45 46
    OPT_E, OPT_IN, OPT_OUT, OPT_PASS, OPT_ENGINE, OPT_D, OPT_P, OPT_V,
    OPT_NOPAD, OPT_SALT, OPT_NOSALT, OPT_DEBUG, OPT_UPPER_P, OPT_UPPER_A,
    OPT_A, OPT_Z, OPT_BUFSIZE, OPT_K, OPT_KFILE, OPT_UPPER_K, OPT_NONE,
E
EasySec 已提交
47
    OPT_UPPER_S, OPT_IV, OPT_MD, OPT_ITER, OPT_PBKDF2, OPT_CIPHER,
R
Rich Salz 已提交
48
    OPT_R_ENUM
49 50
} OPTION_CHOICE;

F
FdaSilvaYY 已提交
51
const OPTIONS enc_options[] = {
R
Rich Salz 已提交
52
    OPT_SECTION("General"),
53
    {"help", OPT_HELP, '-', "Display this summary"},
54
    {"list", OPT_LIST, '-', "List ciphers"},
55
#ifndef OPENSSL_NO_DEPRECATED_3_0
56 57
    {"ciphers", OPT_LIST, '-', "Alias for -list"},
#endif
58 59 60 61
    {"e", OPT_E, '-', "Encrypt"},
    {"d", OPT_D, '-', "Decrypt"},
    {"p", OPT_P, '-', "Print the iv/key"},
    {"P", OPT_UPPER_P, '-', "Print the iv/key and exit"},
R
Rich Salz 已提交
62 63 64 65 66 67 68 69 70 71 72 73
#ifndef OPENSSL_NO_ENGINE
    {"engine", OPT_ENGINE, 's', "Use engine, possibly a hardware device"},
#endif

    OPT_SECTION("Input"),
    {"in", OPT_IN, '<', "Input file"},
    {"k", OPT_K, 's', "Passphrase"},
    {"kfile", OPT_KFILE, '<', "Read passphrase from file"},

    OPT_SECTION("Output"),
    {"out", OPT_OUT, '>', "Output file"},
    {"pass", OPT_PASS, 's', "Passphrase source"},
R
Rich Salz 已提交
74 75 76 77 78
    {"v", OPT_V, '-', "Verbose output"},
    {"a", OPT_A, '-', "Base64 encode/decode, depending on encryption flag"},
    {"base64", OPT_A, '-', "Same as option -a"},
    {"A", OPT_UPPER_A, '-',
     "Used with -[base64|a] to specify base64 buffer as a single line"},
R
Rich Salz 已提交
79 80 81 82 83 84 85

    OPT_SECTION("Encryption"),
    {"nopad", OPT_NOPAD, '-', "Disable standard block padding"},
    {"salt", OPT_SALT, '-', "Use salt in the KDF (default)"},
    {"nosalt", OPT_NOSALT, '-', "Do not use salt in the KDF"},
    {"debug", OPT_DEBUG, '-', "Print debug info"},

86
    {"bufsize", OPT_BUFSIZE, 's', "Buffer size"},
87
    {"K", OPT_UPPER_K, 's', "Raw key, in hex"},
88 89
    {"S", OPT_UPPER_S, 's', "Salt, in hex"},
    {"iv", OPT_IV, 's', "IV in hex"},
K
Kurt Cancemi 已提交
90
    {"md", OPT_MD, 's', "Use specified digest to create a key from the passphrase"},
E
EasySec 已提交
91 92
    {"iter", OPT_ITER, 'p', "Specify the iteration count and force use of PBKDF2"},
    {"pbkdf2", OPT_PBKDF2, '-', "Use password-based key derivation function 2"},
93
    {"none", OPT_NONE, '-', "Don't encrypt"},
94 95 96
#ifdef ZLIB
    {"z", OPT_Z, '-', "Use zlib as the 'encryption'"},
#endif
R
Rich Salz 已提交
97 98 99
    {"", OPT_CIPHER, '-', "Any supported cipher"},

    OPT_R_OPTIONS,
100 101 102 103
    {NULL}
};

int enc_main(int argc, char **argv)
104
{
105
    static char buf[128];
106
    static const char magic[] = "Salted__";
107
    ENGINE *e = NULL;
108 109 110 111 112
    BIO *in = NULL, *out = NULL, *b64 = NULL, *benc = NULL, *rbio =
        NULL, *wbio = NULL;
    EVP_CIPHER_CTX *ctx = NULL;
    const EVP_CIPHER *cipher = NULL, *c;
    const EVP_MD *dgst = NULL;
R
Rich Salz 已提交
113
    char *hkey = NULL, *hiv = NULL, *hsalt = NULL, *p;
114 115
    char *infile = NULL, *outfile = NULL, *prog;
    char *str = NULL, *passarg = NULL, *pass = NULL, *strbuf = NULL;
R
Rich Salz 已提交
116
    char mbuf[sizeof(magic) - 1];
117 118
    OPTION_CHOICE o;
    int bsize = BSIZE, verbose = 0, debug = 0, olb64 = 0, nosalt = 0;
119 120
    int enc = 1, printkey = 0, i, k;
    int base64 = 0, informat = FORMAT_BINARY, outformat = FORMAT_BINARY;
121
    int ret = 1, inl, nopad = 0;
122
    unsigned char key[EVP_MAX_KEY_LENGTH], iv[EVP_MAX_IV_LENGTH];
123
    unsigned char *buff = NULL, salt[PKCS5_SALT_LEN];
E
EasySec 已提交
124 125
    int pbkdf2 = 0;
    int iter = 0;
R
Rich Salz 已提交
126
    long n;
127
    struct doall_enc_ciphers dec;
D
Dr. Stephen Henson 已提交
128
#ifdef ZLIB
129 130
    int do_zlib = 0;
    BIO *bzl = NULL;
D
Dr. Stephen Henson 已提交
131
#endif
D
Dr. Stephen Henson 已提交
132

133
    /* first check the program name */
134
    prog = opt_progname(argv[0]);
135
    if (strcmp(prog, "base64") == 0) {
136
        base64 = 1;
D
Dr. Stephen Henson 已提交
137
#ifdef ZLIB
138
    } else if (strcmp(prog, "zlib") == 0) {
139
        do_zlib = 1;
D
Dr. Stephen Henson 已提交
140
#endif
141
    } else {
142 143 144 145 146
        cipher = EVP_get_cipherbyname(prog);
        if (cipher == NULL && strcmp(prog, "enc") != 0) {
            BIO_printf(bio_err, "%s is not a known cipher\n", prog);
            goto end;
        }
147 148
    }

149 150 151 152 153 154 155 156 157 158 159
    prog = opt_init(argc, argv, enc_options);
    while ((o = opt_next()) != OPT_EOF) {
        switch (o) {
        case OPT_EOF:
        case OPT_ERR:
 opthelp:
            BIO_printf(bio_err, "%s: Use -help for summary.\n", prog);
            goto end;
        case OPT_HELP:
            opt_help(enc_options);
            ret = 0;
R
Rich Salz 已提交
160 161
            goto end;
        case OPT_LIST:
162
            BIO_printf(bio_out, "Supported ciphers:\n");
163 164
            dec.bio = bio_out;
            dec.n = 0;
165
            OBJ_NAME_do_all_sorted(OBJ_NAME_TYPE_CIPHER_METH,
166
                                   show_ciphers, &dec);
167 168
            BIO_printf(bio_out, "\n");
            ret = 0;
169 170
            goto end;
        case OPT_E:
171
            enc = 1;
172 173 174 175 176 177 178 179 180 181 182
            break;
        case OPT_IN:
            infile = opt_arg();
            break;
        case OPT_OUT:
            outfile = opt_arg();
            break;
        case OPT_PASS:
            passarg = opt_arg();
            break;
        case OPT_ENGINE:
183
            e = setup_engine(opt_arg(), 0);
184 185
            break;
        case OPT_D:
186
            enc = 0;
187 188
            break;
        case OPT_P:
189
            printkey = 1;
190 191
            break;
        case OPT_V:
192
            verbose = 1;
193 194
            break;
        case OPT_NOPAD:
195
            nopad = 1;
196 197
            break;
        case OPT_SALT:
198
            nosalt = 0;
199 200
            break;
        case OPT_NOSALT:
201
            nosalt = 1;
202 203
            break;
        case OPT_DEBUG:
204
            debug = 1;
205 206
            break;
        case OPT_UPPER_P:
207
            printkey = 2;
208 209
            break;
        case OPT_UPPER_A:
210
            olb64 = 1;
211 212
            break;
        case OPT_A:
213
            base64 = 1;
214 215
            break;
        case OPT_Z:
D
Dr. Stephen Henson 已提交
216
#ifdef ZLIB
217
            do_zlib = 1;
D
Dr. Stephen Henson 已提交
218
#endif
219 220 221 222 223 224 225
            break;
        case OPT_BUFSIZE:
            p = opt_arg();
            i = (int)strlen(p) - 1;
            k = i >= 1 && p[i] == 'k';
            if (k)
                p[i] = '\0';
R
Rich Salz 已提交
226 227
            if (!opt_long(opt_arg(), &n)
                    || n < 0 || (k && n >= LONG_MAX / 1024))
228 229 230 231 232 233 234 235 236
                goto opthelp;
            if (k)
                n *= 1024;
            bsize = (int)n;
            break;
        case OPT_K:
            str = opt_arg();
            break;
        case OPT_KFILE:
237
            in = bio_open_default(opt_arg(), 'r', FORMAT_TEXT);
238 239
            if (in == NULL)
                goto opthelp;
R
Rich Salz 已提交
240
            i = BIO_gets(in, buf, sizeof(buf));
241 242 243 244 245 246
            BIO_free(in);
            in = NULL;
            if (i <= 0) {
                BIO_printf(bio_err,
                           "%s Can't read key from %s\n", prog, opt_arg());
                goto opthelp;
247
            }
248 249 250 251 252
            while (--i > 0 && (buf[i] == '\r' || buf[i] == '\n'))
                buf[i] = '\0';
            if (i <= 0) {
                BIO_printf(bio_err, "%s: zero length password\n", prog);
                goto opthelp;
253 254
            }
            str = buf;
255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271
            break;
        case OPT_UPPER_K:
            hkey = opt_arg();
            break;
        case OPT_UPPER_S:
            hsalt = opt_arg();
            break;
        case OPT_IV:
            hiv = opt_arg();
            break;
        case OPT_MD:
            if (!opt_md(opt_arg(), &dgst))
                goto opthelp;
            break;
        case OPT_CIPHER:
            if (!opt_cipher(opt_unknown(), &c))
                goto opthelp;
272
            cipher = c;
273
            break;
E
EasySec 已提交
274 275 276 277 278 279 280 281 282 283
        case OPT_ITER:
            if (!opt_int(opt_arg(), &iter))
                goto opthelp;
            pbkdf2 = 1;
            break;
        case OPT_PBKDF2:
            pbkdf2 = 1;
            if (iter == 0)    /* do not overwrite a chosen value */
                iter = 10000;
            break;
284
        case OPT_NONE:
285
            cipher = NULL;
286
            break;
R
Rich Salz 已提交
287 288 289 290
        case OPT_R_CASES:
            if (!opt_rand(o))
                goto end;
            break;
291 292
        }
    }
293 294 295 296
    if (opt_num_rest() != 0) {
        BIO_printf(bio_err, "Extra arguments given.\n");
        goto opthelp;
    }
297

298
    if (cipher && EVP_CIPHER_flags(cipher) & EVP_CIPH_FLAG_AEAD_CIPHER) {
299
        BIO_printf(bio_err, "%s: AEAD ciphers not supported\n", prog);
300 301 302 303
        goto end;
    }

    if (cipher && (EVP_CIPHER_mode(cipher) == EVP_CIPH_XTS_MODE)) {
304
        BIO_printf(bio_err, "%s XTS ciphers not supported\n", prog);
305 306 307
        goto end;
    }

308
    if (dgst == NULL)
R
Rich Salz 已提交
309
        dgst = EVP_sha256();
310

E
EasySec 已提交
311 312 313
    if (iter == 0)
        iter = 1;

314
    /* It must be large enough for a base64 encoded line */
315
    if (base64 && bsize < 80)
316 317 318
        bsize = 80;
    if (verbose)
        BIO_printf(bio_err, "bufsize=%d\n", bsize);
319

320 321 322 323 324 325 326 327 328
#ifdef ZLIB
    if (!do_zlib)
#endif
        if (base64) {
            if (enc)
                outformat = FORMAT_BASE64;
            else
                informat = FORMAT_BASE64;
        }
329

R
Rich Salz 已提交
330 331
    strbuf = app_malloc(SIZE, "strbuf");
    buff = app_malloc(EVP_ENCODE_LENGTH(bsize), "evp buffer");
332

333
    if (infile == NULL) {
334
        in = dup_bio_in(informat);
335
    } else {
336
        in = bio_open_default(infile, 'r', informat);
337
    }
338 339
    if (in == NULL)
        goto end;
340

341
    if (str == NULL && passarg != NULL) {
342
        if (!app_passwd(passarg, NULL, &pass, NULL)) {
343 344 345 346 347 348 349
            BIO_printf(bio_err, "Error getting password\n");
            goto end;
        }
        str = pass;
    }

    if ((str == NULL) && (cipher != NULL) && (hkey == NULL)) {
R
Richard Levitte 已提交
350
        if (1) {
351
#ifndef OPENSSL_NO_UI_CONSOLE
R
Richard Levitte 已提交
352 353
            for (;;) {
                char prompt[200];
354

P
Pauli 已提交
355
                BIO_snprintf(prompt, sizeof(prompt), "enter %s %s password:",
R
Rich Salz 已提交
356 357
                        OBJ_nid2ln(EVP_CIPHER_nid(cipher)),
                        (enc) ? "encryption" : "decryption");
R
Richard Levitte 已提交
358 359 360 361 362 363 364 365 366 367 368 369
                strbuf[0] = '\0';
                i = EVP_read_pw_string((char *)strbuf, SIZE, prompt, enc);
                if (i == 0) {
                    if (strbuf[0] == '\0') {
                        ret = 1;
                        goto end;
                    }
                    str = strbuf;
                    break;
                }
                if (i < 0) {
                    BIO_printf(bio_err, "bad password read\n");
370 371 372
                    goto end;
                }
            }
R
Richard Levitte 已提交
373 374 375 376
        } else {
#endif
            BIO_printf(bio_err, "password required\n");
            goto end;
377 378 379
        }
    }

380
    out = bio_open_default(outfile, 'w', outformat);
381 382
    if (out == NULL)
        goto end;
383

384 385 386 387 388 389 390
    if (debug) {
        BIO_set_callback(in, BIO_debug_callback);
        BIO_set_callback(out, BIO_debug_callback);
        BIO_set_callback_arg(in, (char *)bio_err);
        BIO_set_callback_arg(out, (char *)bio_err);
    }

391 392
    rbio = in;
    wbio = out;
393

D
Dr. Stephen Henson 已提交
394
#ifdef ZLIB
395 396 397
    if (do_zlib) {
        if ((bzl = BIO_new(BIO_f_zlib())) == NULL)
            goto end;
398 399 400 401
        if (debug) {
            BIO_set_callback(bzl, BIO_debug_callback);
            BIO_set_callback_arg(bzl, (char *)bio_err);
        }
402 403 404 405 406
        if (enc)
            wbio = BIO_push(bzl, wbio);
        else
            rbio = BIO_push(bzl, rbio);
    }
D
Dr. Stephen Henson 已提交
407 408
#endif

409
    if (base64) {
410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434
        if ((b64 = BIO_new(BIO_f_base64())) == NULL)
            goto end;
        if (debug) {
            BIO_set_callback(b64, BIO_debug_callback);
            BIO_set_callback_arg(b64, (char *)bio_err);
        }
        if (olb64)
            BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
        if (enc)
            wbio = BIO_push(b64, wbio);
        else
            rbio = BIO_push(b64, rbio);
    }

    if (cipher != NULL) {
        /*
         * Note that str is NULL if a key was passed on the command line, so
         * we get no salt in that case. Is this a bug?
         */
        if (str != NULL) {
            /*
             * Salt handling: if encrypting generate a salt and write to
             * output BIO. If decrypting read salt from input BIO.
             */
            unsigned char *sptr;
F
FdaSilvaYY 已提交
435 436
            size_t str_len = strlen(str);

437
            if (nosalt) {
438
                sptr = NULL;
439
            } else {
440 441
                if (enc) {
                    if (hsalt) {
R
Rich Salz 已提交
442
                        if (!set_hex(hsalt, salt, sizeof(salt))) {
443 444 445
                            BIO_printf(bio_err, "invalid hex salt value\n");
                            goto end;
                        }
R
Rich Salz 已提交
446
                    } else if (RAND_bytes(salt, sizeof(salt)) <= 0) {
447
                        goto end;
448
                    }
449 450 451 452 453
                    /*
                     * If -P option then don't bother writing
                     */
                    if ((printkey != 2)
                        && (BIO_write(wbio, magic,
R
Rich Salz 已提交
454
                                      sizeof(magic) - 1) != sizeof(magic) - 1
455 456
                            || BIO_write(wbio,
                                         (char *)salt,
R
Rich Salz 已提交
457
                                         sizeof(salt)) != sizeof(salt))) {
458 459 460
                        BIO_printf(bio_err, "error writing output file\n");
                        goto end;
                    }
R
Rich Salz 已提交
461
                } else if (BIO_read(rbio, mbuf, sizeof(mbuf)) != sizeof(mbuf)
462 463
                           || BIO_read(rbio,
                                       (unsigned char *)salt,
R
Rich Salz 已提交
464
                                       sizeof(salt)) != sizeof(salt)) {
465 466
                    BIO_printf(bio_err, "error reading input file\n");
                    goto end;
R
Rich Salz 已提交
467
                } else if (memcmp(mbuf, magic, sizeof(magic) - 1)) {
468 469 470 471 472 473
                    BIO_printf(bio_err, "bad magic number\n");
                    goto end;
                }
                sptr = salt;
            }

E
EasySec 已提交
474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501
            if (pbkdf2 == 1) {
                /*
                * derive key and default iv
                * concatenated into a temporary buffer
                */
                unsigned char tmpkeyiv[EVP_MAX_KEY_LENGTH + EVP_MAX_IV_LENGTH];
                int iklen = EVP_CIPHER_key_length(cipher);
                int ivlen = EVP_CIPHER_iv_length(cipher);
                /* not needed if HASH_UPDATE() is fixed : */
                int islen = (sptr != NULL ? sizeof(salt) : 0);
                if (!PKCS5_PBKDF2_HMAC(str, str_len, sptr, islen,
                                       iter, dgst, iklen+ivlen, tmpkeyiv)) {
                    BIO_printf(bio_err, "PKCS5_PBKDF2_HMAC failed\n");
                    goto end;
                }
                /* split and move data back to global buffer */
                memcpy(key, tmpkeyiv, iklen);
                memcpy(iv, tmpkeyiv+iklen, ivlen);
            } else {
                BIO_printf(bio_err, "*** WARNING : "
                                    "deprecated key derivation used.\n"
                                    "Using -iter or -pbkdf2 would be better.\n");
                if (!EVP_BytesToKey(cipher, dgst, sptr,
                                    (unsigned char *)str, str_len,
                                    1, key, iv)) {
                    BIO_printf(bio_err, "EVP_BytesToKey failed\n");
                    goto end;
                }
502 503 504
            }
            /*
             * zero the complete buffer or the string passed from the command
505
             * line.
506 507 508 509
             */
            if (str == strbuf)
                OPENSSL_cleanse(str, SIZE);
            else
F
FdaSilvaYY 已提交
510
                OPENSSL_cleanse(str, str_len);
511
        }
512 513 514
        if (hiv != NULL) {
            int siz = EVP_CIPHER_iv_length(cipher);
            if (siz == 0) {
X
x753 已提交
515
                BIO_printf(bio_err, "warning: iv not used by this cipher\n");
E
EasySec 已提交
516
            } else if (!set_hex(hiv, iv, siz)) {
517 518 519
                BIO_printf(bio_err, "invalid hex iv value\n");
                goto end;
            }
520 521 522 523
        }
        if ((hiv == NULL) && (str == NULL)
            && EVP_CIPHER_iv_length(cipher) != 0) {
            /*
E
EasySec 已提交
524 525
             * No IV was explicitly set and no IV was generated.
             * Hence the IV is undefined, making correct decryption impossible.
526 527 528 529
             */
            BIO_printf(bio_err, "iv undefined\n");
            goto end;
        }
E
EasySec 已提交
530 531 532 533 534 535 536
        if (hkey != NULL) {
            if (!set_hex(hkey, key, EVP_CIPHER_key_length(cipher))) {
                BIO_printf(bio_err, "invalid hex key value\n");
                goto end;
            }
            /* wiping secret data as we no longer need it */
            OPENSSL_cleanse(hkey, strlen(hkey));
537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577
        }

        if ((benc = BIO_new(BIO_f_cipher())) == NULL)
            goto end;

        /*
         * Since we may be changing parameters work on the encryption context
         * rather than calling BIO_set_cipher().
         */

        BIO_get_cipher_ctx(benc, &ctx);

        if (!EVP_CipherInit_ex(ctx, cipher, NULL, NULL, NULL, enc)) {
            BIO_printf(bio_err, "Error setting cipher %s\n",
                       EVP_CIPHER_name(cipher));
            ERR_print_errors(bio_err);
            goto end;
        }

        if (nopad)
            EVP_CIPHER_CTX_set_padding(ctx, 0);

        if (!EVP_CipherInit_ex(ctx, NULL, NULL, key, iv, enc)) {
            BIO_printf(bio_err, "Error setting cipher %s\n",
                       EVP_CIPHER_name(cipher));
            ERR_print_errors(bio_err);
            goto end;
        }

        if (debug) {
            BIO_set_callback(benc, BIO_debug_callback);
            BIO_set_callback_arg(benc, (char *)bio_err);
        }

        if (printkey) {
            if (!nosalt) {
                printf("salt=");
                for (i = 0; i < (int)sizeof(salt); i++)
                    printf("%02X", salt[i]);
                printf("\n");
            }
578
            if (EVP_CIPHER_key_length(cipher) > 0) {
579
                printf("key=");
580
                for (i = 0; i < EVP_CIPHER_key_length(cipher); i++)
581 582 583
                    printf("%02X", key[i]);
                printf("\n");
            }
584
            if (EVP_CIPHER_iv_length(cipher) > 0) {
585
                printf("iv =");
586
                for (i = 0; i < EVP_CIPHER_iv_length(cipher); i++)
587 588 589 590 591 592 593 594 595 596 597 598 599 600
                    printf("%02X", iv[i]);
                printf("\n");
            }
            if (printkey == 2) {
                ret = 0;
                goto end;
            }
        }
    }

    /* Only encrypt/decrypt as we write the file */
    if (benc != NULL)
        wbio = BIO_push(benc, wbio);

601
    while (BIO_pending(rbio) || !BIO_eof(rbio)) {
602 603 604 605 606 607 608 609 610 611 612 613 614 615 616
        inl = BIO_read(rbio, (char *)buff, bsize);
        if (inl <= 0)
            break;
        if (BIO_write(wbio, (char *)buff, inl) != inl) {
            BIO_printf(bio_err, "error writing output file\n");
            goto end;
        }
    }
    if (!BIO_flush(wbio)) {
        BIO_printf(bio_err, "bad decrypt\n");
        goto end;
    }

    ret = 0;
    if (verbose) {
R
Rich Salz 已提交
617 618
        BIO_printf(bio_err, "bytes read   : %8ju\n", BIO_number_read(in));
        BIO_printf(bio_err, "bytes written: %8ju\n", BIO_number_written(out));
619 620 621
    }
 end:
    ERR_print_errors(bio_err);
R
Rich Salz 已提交
622 623
    OPENSSL_free(strbuf);
    OPENSSL_free(buff);
R
Rich Salz 已提交
624 625 626 627
    BIO_free(in);
    BIO_free_all(out);
    BIO_free(benc);
    BIO_free(b64);
D
Dr. Stephen Henson 已提交
628
#ifdef ZLIB
R
Rich Salz 已提交
629
    BIO_free(bzl);
D
Dr. Stephen Henson 已提交
630
#endif
631
    release_engine(e);
R
Rich Salz 已提交
632
    OPENSSL_free(pass);
P
Pauli 已提交
633
    return ret;
634 635
}

636
static void show_ciphers(const OBJ_NAME *name, void *arg)
637
{
638
    struct doall_enc_ciphers *dec = (struct doall_enc_ciphers *)arg;
639
    const EVP_CIPHER *cipher;
640 641 642 643

    if (!islower((unsigned char)*name->name))
        return;

644 645 646 647 648 649 650
    /* Filter out ciphers that we cannot use */
    cipher = EVP_get_cipherbyname(name->name);
    if (cipher == NULL ||
            (EVP_CIPHER_flags(cipher) & EVP_CIPH_FLAG_AEAD_CIPHER) != 0 ||
            EVP_CIPHER_mode(cipher) == EVP_CIPH_XTS_MODE)
        return;

651 652 653 654
    BIO_printf(dec->bio, "-%-25s", name->name);
    if (++dec->n == 3) {
        BIO_printf(dec->bio, "\n");
        dec->n = 0;
655
    } else
656
        BIO_printf(dec->bio, " ");
657
}
658

E
EasySec 已提交
659
static int set_hex(const char *in, unsigned char *out, int size)
660 661 662 663
{
    int i, n;
    unsigned char j;

E
EasySec 已提交
664
    i = size * 2;
665
    n = strlen(in);
E
EasySec 已提交
666 667 668 669 670
    if (n > i) {
        BIO_printf(bio_err, "hex string is too long, ignoring excess\n");
        n = i; /* ignore exceeding part */
    } else if (n < i) {
        BIO_printf(bio_err, "hex string is too short, padding with zero bytes to length\n");
671
    }
E
EasySec 已提交
672

673 674
    memset(out, 0, size);
    for (i = 0; i < n; i++) {
E
EasySec 已提交
675
        j = (unsigned char)*in++;
R
Rich Salz 已提交
676
        if (!isxdigit(j)) {
677
            BIO_printf(bio_err, "non-hex digit\n");
P
Pauli 已提交
678
            return 0;
679
        }
680
        j = (unsigned char)OPENSSL_hexchar2int(j);
681 682 683 684 685
        if (i & 1)
            out[i / 2] |= j;
        else
            out[i / 2] = (j << 4);
    }
P
Pauli 已提交
686
    return 1;
687
}