enc.c 18.0 KB
Newer Older
R
Rich Salz 已提交
1 2
/*
 * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
3
 *
R
Rich Salz 已提交
4 5 6 7
 * Licensed under the OpenSSL license (the "License").  You may not use
 * 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 16 17 18 19
#include <openssl/bio.h>
#include <openssl/err.h>
#include <openssl/evp.h>
#include <openssl/objects.h>
#include <openssl/x509.h>
20
#include <openssl/rand.h>
21
#include <openssl/pem.h>
22
#ifndef OPENSSL_NO_COMP
23
# include <openssl/comp.h>
24
#endif
25
#include <ctype.h>
26 27 28

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

32 33 34 35 36
static int set_hex(char *in, unsigned char *out, int size);
static void show_ciphers(const OBJ_NAME *name, void *bio_);

typedef enum OPTION_choice {
    OPT_ERR = -1, OPT_EOF = 0, OPT_HELP,
R
Rich Salz 已提交
37
    OPT_LIST,
38 39 40
    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,
41
    OPT_UPPER_S, OPT_IV, OPT_MD, OPT_CIPHER
42 43
} OPTION_CHOICE;

F
FdaSilvaYY 已提交
44
const OPTIONS enc_options[] = {
45
    {"help", OPT_HELP, '-', "Display this summary"},
R
Rich Salz 已提交
46
    {"ciphers", OPT_LIST, '-', "List ciphers"},
47 48 49 50 51 52 53
    {"in", OPT_IN, '<', "Input file"},
    {"out", OPT_OUT, '>', "Output file"},
    {"pass", OPT_PASS, 's', "Passphrase source"},
    {"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 已提交
54
    {"v", OPT_V, '-', "Verbose output"},
55
    {"nopad", OPT_NOPAD, '-', "Disable standard block padding"},
R
Rich Salz 已提交
56 57 58 59 60 61 62
    {"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"},
    {"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"},
63 64
    {"bufsize", OPT_BUFSIZE, 's', "Buffer size"},
    {"k", OPT_K, 's', "Passphrase"},
K
Kurt Cancemi 已提交
65
    {"kfile", OPT_KFILE, '<', "Read passphrase from file"},
66
    {"K", OPT_UPPER_K, 's', "Raw key, in hex"},
67 68
    {"S", OPT_UPPER_S, 's', "Salt, in hex"},
    {"iv", OPT_IV, 's', "IV in hex"},
K
Kurt Cancemi 已提交
69
    {"md", OPT_MD, 's', "Use specified digest to create a key from the passphrase"},
70 71
    {"none", OPT_NONE, '-', "Don't encrypt"},
    {"", OPT_CIPHER, '-', "Any supported cipher"},
72 73 74 75 76 77
#ifdef ZLIB
    {"z", OPT_Z, '-', "Use zlib as the 'encryption'"},
#endif
#ifndef OPENSSL_NO_ENGINE
    {"engine", OPT_ENGINE, 's', "Use engine, possibly a hardware device"},
#endif
78 79 80 81
    {NULL}
};

int enc_main(int argc, char **argv)
82
{
83
    static char buf[128];
84
    static const char magic[] = "Salted__";
85
    ENGINE *e = NULL;
86 87 88 89 90
    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 已提交
91
    char *hkey = NULL, *hiv = NULL, *hsalt = NULL, *p;
92 93
    char *infile = NULL, *outfile = NULL, *prog;
    char *str = NULL, *passarg = NULL, *pass = NULL, *strbuf = NULL;
94
    char mbuf[sizeof magic - 1];
95 96
    OPTION_CHOICE o;
    int bsize = BSIZE, verbose = 0, debug = 0, olb64 = 0, nosalt = 0;
97 98
    int enc = 1, printkey = 0, i, k;
    int base64 = 0, informat = FORMAT_BINARY, outformat = FORMAT_BINARY;
99
    int ret = 1, inl, nopad = 0;
100
    unsigned char key[EVP_MAX_KEY_LENGTH], iv[EVP_MAX_IV_LENGTH];
101
    unsigned char *buff = NULL, salt[PKCS5_SALT_LEN];
R
Rich Salz 已提交
102
    long n;
D
Dr. Stephen Henson 已提交
103
#ifdef ZLIB
104 105
    int do_zlib = 0;
    BIO *bzl = NULL;
D
Dr. Stephen Henson 已提交
106
#endif
D
Dr. Stephen Henson 已提交
107

108
    /* first check the program name */
109 110
    prog = opt_progname(argv[0]);
    if (strcmp(prog, "base64") == 0)
111
        base64 = 1;
D
Dr. Stephen Henson 已提交
112
#ifdef ZLIB
113
    else if (strcmp(prog, "zlib") == 0)
114
        do_zlib = 1;
D
Dr. Stephen Henson 已提交
115
#endif
116 117 118 119 120 121
    else {
        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;
        }
122 123
    }

124 125 126 127 128 129 130 131 132 133 134
    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 已提交
135 136 137
            goto end;
        case OPT_LIST:
            BIO_printf(bio_err, "Supported ciphers:\n");
138 139 140 141 142
            OBJ_NAME_do_all_sorted(OBJ_NAME_TYPE_CIPHER_METH,
                                   show_ciphers, bio_err);
            BIO_printf(bio_err, "\n");
            goto end;
        case OPT_E:
143
            enc = 1;
144 145 146 147 148 149 150 151 152 153 154
            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:
155
            e = setup_engine(opt_arg(), 0);
156 157
            break;
        case OPT_D:
158
            enc = 0;
159 160
            break;
        case OPT_P:
161
            printkey = 1;
162 163
            break;
        case OPT_V:
164
            verbose = 1;
165 166
            break;
        case OPT_NOPAD:
167
            nopad = 1;
168 169
            break;
        case OPT_SALT:
170
            nosalt = 0;
171 172
            break;
        case OPT_NOSALT:
173
            nosalt = 1;
174 175
            break;
        case OPT_DEBUG:
176
            debug = 1;
177 178
            break;
        case OPT_UPPER_P:
179
            printkey = 2;
180 181
            break;
        case OPT_UPPER_A:
182
            olb64 = 1;
183 184
            break;
        case OPT_A:
185
            base64 = 1;
186 187
            break;
        case OPT_Z:
D
Dr. Stephen Henson 已提交
188
#ifdef ZLIB
189
            do_zlib = 1;
D
Dr. Stephen Henson 已提交
190
#endif
191 192 193 194 195 196 197
            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 已提交
198 199
            if (!opt_long(opt_arg(), &n)
                    || n < 0 || (k && n >= LONG_MAX / 1024))
200 201 202 203 204 205 206 207 208
                goto opthelp;
            if (k)
                n *= 1024;
            bsize = (int)n;
            break;
        case OPT_K:
            str = opt_arg();
            break;
        case OPT_KFILE:
209
            in = bio_open_default(opt_arg(), 'r', FORMAT_TEXT);
210 211 212 213 214 215 216 217 218
            if (in == NULL)
                goto opthelp;
            i = BIO_gets(in, buf, sizeof buf);
            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;
219
            }
220 221 222 223 224
            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;
225 226
            }
            str = buf;
227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243
            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;
244
            cipher = c;
245 246
            break;
        case OPT_NONE:
247
            cipher = NULL;
248
            break;
249 250
        }
    }
251

252
    if (cipher && EVP_CIPHER_flags(cipher) & EVP_CIPH_FLAG_AEAD_CIPHER) {
253
        BIO_printf(bio_err, "%s: AEAD ciphers not supported\n", prog);
254 255 256 257
        goto end;
    }

    if (cipher && (EVP_CIPHER_mode(cipher) == EVP_CIPH_XTS_MODE)) {
258
        BIO_printf(bio_err, "%s XTS ciphers not supported\n", prog);
259 260 261
        goto end;
    }

262
    if (dgst == NULL)
R
Rich Salz 已提交
263
        dgst = EVP_sha256();
264

265
    /* It must be large enough for a base64 encoded line */
266
    if (base64 && bsize < 80)
267 268 269
        bsize = 80;
    if (verbose)
        BIO_printf(bio_err, "bufsize=%d\n", bsize);
270

271 272 273 274 275 276 277 278 279
#ifdef ZLIB
    if (!do_zlib)
#endif
        if (base64) {
            if (enc)
                outformat = FORMAT_BASE64;
            else
                informat = FORMAT_BASE64;
        }
280

R
Rich Salz 已提交
281 282
    strbuf = app_malloc(SIZE, "strbuf");
    buff = app_malloc(EVP_ENCODE_LENGTH(bsize), "evp buffer");
283

284 285
    if (infile == NULL) {
        unbuffer(stdin);
286
        in = dup_bio_in(informat);
287
    } else
288
        in = bio_open_default(infile, 'r', informat);
289 290
    if (in == NULL)
        goto end;
291 292

    if (!str && passarg) {
293
        if (!app_passwd(passarg, NULL, &pass, NULL)) {
294 295 296 297 298 299 300
            BIO_printf(bio_err, "Error getting password\n");
            goto end;
        }
        str = pass;
    }

    if ((str == NULL) && (cipher != NULL) && (hkey == NULL)) {
R
Richard Levitte 已提交
301 302 303 304
        if (1) {
#ifndef OPENSSL_NO_UI
            for (;;) {
                char prompt[200];
305

R
Richard Levitte 已提交
306 307 308 309 310 311 312 313 314 315 316 317 318 319 320
                BIO_snprintf(prompt, sizeof prompt, "enter %s %s password:",
                             OBJ_nid2ln(EVP_CIPHER_nid(cipher)),
                             (enc) ? "encryption" : "decryption");
                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");
321 322 323
                    goto end;
                }
            }
R
Richard Levitte 已提交
324 325 326 327
        } else {
#endif
            BIO_printf(bio_err, "password required\n");
            goto end;
328 329 330
        }
    }

331
    out = bio_open_default(outfile, 'w', outformat);
332 333
    if (out == NULL)
        goto end;
334

335 336 337 338 339 340 341
    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);
    }

342 343
    rbio = in;
    wbio = out;
344

D
Dr. Stephen Henson 已提交
345
#ifdef ZLIB
346 347 348
    if (do_zlib) {
        if ((bzl = BIO_new(BIO_f_zlib())) == NULL)
            goto end;
349 350 351 352
        if (debug) {
            BIO_set_callback(bzl, BIO_debug_callback);
            BIO_set_callback_arg(bzl, (char *)bio_err);
        }
353 354 355 356 357
        if (enc)
            wbio = BIO_push(bzl, wbio);
        else
            rbio = BIO_push(bzl, rbio);
    }
D
Dr. Stephen Henson 已提交
358 359
#endif

360
    if (base64) {
361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385
        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 已提交
386 387
            size_t str_len = strlen(str);

388 389 390 391 392 393 394 395 396
            if (nosalt)
                sptr = NULL;
            else {
                if (enc) {
                    if (hsalt) {
                        if (!set_hex(hsalt, salt, sizeof salt)) {
                            BIO_printf(bio_err, "invalid hex salt value\n");
                            goto end;
                        }
M
Matt Caswell 已提交
397
                    } else if (RAND_bytes(salt, sizeof salt) <= 0)
398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426
                        goto end;
                    /*
                     * If -P option then don't bother writing
                     */
                    if ((printkey != 2)
                        && (BIO_write(wbio, magic,
                                      sizeof magic - 1) != sizeof magic - 1
                            || BIO_write(wbio,
                                         (char *)salt,
                                         sizeof salt) != sizeof salt)) {
                        BIO_printf(bio_err, "error writing output file\n");
                        goto end;
                    }
                } else if (BIO_read(rbio, mbuf, sizeof mbuf) != sizeof mbuf
                           || BIO_read(rbio,
                                       (unsigned char *)salt,
                                       sizeof salt) != sizeof salt) {
                    BIO_printf(bio_err, "error reading input file\n");
                    goto end;
                } else if (memcmp(mbuf, magic, sizeof magic - 1)) {
                    BIO_printf(bio_err, "bad magic number\n");
                    goto end;
                }

                sptr = salt;
            }

            if (!EVP_BytesToKey(cipher, dgst, sptr,
                                (unsigned char *)str,
F
FdaSilvaYY 已提交
427
                                str_len, 1, key, iv)) {
428 429 430 431 432 433 434 435 436 437
                BIO_printf(bio_err, "EVP_BytesToKey failed\n");
                goto end;
            }
            /*
             * zero the complete buffer or the string passed from the command
             * line bug picked up by Larry J. Hughes Jr. <hughes@indiana.edu>
             */
            if (str == strbuf)
                OPENSSL_cleanse(str, SIZE);
            else
F
FdaSilvaYY 已提交
438
                OPENSSL_cleanse(str, str_len);
439
        }
440 441 442 443 444 445 446 447
        if (hiv != NULL) {
            int siz = EVP_CIPHER_iv_length(cipher);
            if (siz == 0) {
                BIO_printf(bio_err, "warning: iv not use by this cipher\n");
            } else if (!set_hex(hiv, iv, sizeof iv)) {
                BIO_printf(bio_err, "invalid hex iv value\n");
                goto end;
            }
448 449 450 451 452 453 454 455 456 457 458
        }
        if ((hiv == NULL) && (str == NULL)
            && EVP_CIPHER_iv_length(cipher) != 0) {
            /*
             * No IV was explicitly set and no IV was generated during
             * EVP_BytesToKey. Hence the IV is undefined, making correct
             * decryption impossible.
             */
            BIO_printf(bio_err, "iv undefined\n");
            goto end;
        }
459
        if ((hkey != NULL) && !set_hex(hkey, key, EVP_CIPHER_key_length(cipher))) {
460 461 462 463 464 465 466 467 468 469 470 471 472 473 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 502
            BIO_printf(bio_err, "invalid hex key value\n");
            goto end;
        }

        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");
            }
503
            if (EVP_CIPHER_key_length(cipher) > 0) {
504
                printf("key=");
505
                for (i = 0; i < EVP_CIPHER_key_length(cipher); i++)
506 507 508
                    printf("%02X", key[i]);
                printf("\n");
            }
509
            if (EVP_CIPHER_iv_length(cipher) > 0) {
510
                printf("iv =");
511
                for (i = 0; i < EVP_CIPHER_iv_length(cipher); i++)
512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541
                    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);

    for (;;) {
        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) {
542 543
        BIO_printf(bio_err, "bytes read   :%8"PRIu64"\n", BIO_number_read(in));
        BIO_printf(bio_err, "bytes written:%8"PRIu64"\n", BIO_number_written(out));
544 545 546
    }
 end:
    ERR_print_errors(bio_err);
R
Rich Salz 已提交
547 548
    OPENSSL_free(strbuf);
    OPENSSL_free(buff);
R
Rich Salz 已提交
549 550 551 552
    BIO_free(in);
    BIO_free_all(out);
    BIO_free(benc);
    BIO_free(b64);
D
Dr. Stephen Henson 已提交
553
#ifdef ZLIB
R
Rich Salz 已提交
554
    BIO_free(bzl);
D
Dr. Stephen Henson 已提交
555
#endif
556
    release_engine(e);
R
Rich Salz 已提交
557
    OPENSSL_free(pass);
558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574
    return (ret);
}

static void show_ciphers(const OBJ_NAME *name, void *bio_)
{
    BIO *bio = bio_;
    static int n;

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

    BIO_printf(bio, "-%-25s", name->name);
    if (++n == 3) {
        BIO_printf(bio, "\n");
        n = 0;
    } else
        BIO_printf(bio, " ");
575
}
576

577
static int set_hex(char *in, unsigned char *out, int size)
578 579 580 581 582 583 584 585 586 587 588 589 590 591 592
{
    int i, n;
    unsigned char j;

    n = strlen(in);
    if (n > (size * 2)) {
        BIO_printf(bio_err, "hex string is too long\n");
        return (0);
    }
    memset(out, 0, size);
    for (i = 0; i < n; i++) {
        j = (unsigned char)*in;
        *(in++) = '\0';
        if (j == 0)
            break;
R
Rich Salz 已提交
593
        if (!isxdigit(j)) {
594 595 596
            BIO_printf(bio_err, "non-hex digit\n");
            return (0);
        }
597
        j = (unsigned char)OPENSSL_hexchar2int(j);
598 599 600 601 602 603 604
        if (i & 1)
            out[i / 2] |= j;
        else
            out[i / 2] = (j << 4);
    }
    return (1);
}