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

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

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

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

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

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

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

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

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

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

R
Richard Levitte 已提交
307 308 309 310 311 312 313 314 315 316 317 318 319 320 321
                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");
322 323 324
                    goto end;
                }
            }
R
Richard Levitte 已提交
325 326 327 328
        } else {
#endif
            BIO_printf(bio_err, "password required\n");
            goto end;
329 330 331
        }
    }

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

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

343 344
    rbio = in;
    wbio = out;
345

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

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

389 390 391 392 393 394 395 396 397
            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 已提交
398
                    } else if (RAND_bytes(salt, sizeof salt) <= 0)
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 427
                        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 已提交
428
                                str_len, 1, key, iv)) {
429 430 431 432 433 434 435 436 437 438
                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 已提交
439
                OPENSSL_cleanse(str, str_len);
440
        }
441 442 443 444 445 446 447 448
        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;
            }
449 450 451 452 453 454 455 456 457 458 459
        }
        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;
        }
460
        if ((hkey != NULL) && !set_hex(hkey, key, EVP_CIPHER_key_length(cipher))) {
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 503
            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");
            }
504
            if (EVP_CIPHER_key_length(cipher) > 0) {
505
                printf("key=");
506
                for (i = 0; i < EVP_CIPHER_key_length(cipher); i++)
507 508 509
                    printf("%02X", key[i]);
                printf("\n");
            }
510
            if (EVP_CIPHER_iv_length(cipher) > 0) {
511
                printf("iv =");
512
                for (i = 0; i < EVP_CIPHER_iv_length(cipher); i++)
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 542
                    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) {
543 544
        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));
545 546 547
    }
 end:
    ERR_print_errors(bio_err);
R
Rich Salz 已提交
548 549
    OPENSSL_free(strbuf);
    OPENSSL_free(buff);
R
Rich Salz 已提交
550 551 552 553
    BIO_free(in);
    BIO_free_all(out);
    BIO_free(benc);
    BIO_free(b64);
D
Dr. Stephen Henson 已提交
554
#ifdef ZLIB
R
Rich Salz 已提交
555
    BIO_free(bzl);
D
Dr. Stephen Henson 已提交
556
#endif
557
    release_engine(e);
R
Rich Salz 已提交
558
    OPENSSL_free(pass);
559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575
    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, " ");
576
}
577

578
static int set_hex(char *in, unsigned char *out, int size)
579 580 581 582 583 584 585 586 587 588 589 590 591 592 593
{
    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 已提交
594
        if (!isxdigit(j)) {
595 596 597
            BIO_printf(bio_err, "non-hex digit\n");
            return (0);
        }
598
        j = (unsigned char)OPENSSL_hexchar2int(j);
599 600 601 602 603 604 605
        if (i & 1)
            out[i / 2] |= j;
        else
            out[i / 2] = (j << 4);
    }
    return (1);
}