enc.c 18.9 KB
Newer Older
R
Rich Salz 已提交
1
/*
2
 * Copyright 1995-2017 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

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

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

40 41
typedef enum OPTION_choice {
    OPT_ERR = -1, OPT_EOF = 0, OPT_HELP,
R
Rich Salz 已提交
42
    OPT_LIST,
43 44 45
    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,
R
Rich Salz 已提交
46 47
    OPT_UPPER_S, OPT_IV, OPT_MD, OPT_CIPHER,
    OPT_R_ENUM
48 49
} OPTION_CHOICE;

F
FdaSilvaYY 已提交
50
const OPTIONS enc_options[] = {
51
    {"help", OPT_HELP, '-', "Display this summary"},
R
Rich Salz 已提交
52
    {"ciphers", OPT_LIST, '-', "List ciphers"},
53 54 55 56 57 58 59
    {"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 已提交
60
    {"v", OPT_V, '-', "Verbose output"},
61
    {"nopad", OPT_NOPAD, '-', "Disable standard block padding"},
R
Rich Salz 已提交
62 63 64 65 66 67 68
    {"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"},
69 70
    {"bufsize", OPT_BUFSIZE, 's', "Buffer size"},
    {"k", OPT_K, 's', "Passphrase"},
K
Kurt Cancemi 已提交
71
    {"kfile", OPT_KFILE, '<', "Read passphrase from file"},
72
    {"K", OPT_UPPER_K, 's', "Raw key, in hex"},
73 74
    {"S", OPT_UPPER_S, 's', "Salt, in hex"},
    {"iv", OPT_IV, 's', "IV in hex"},
K
Kurt Cancemi 已提交
75
    {"md", OPT_MD, 's', "Use specified digest to create a key from the passphrase"},
76 77
    {"none", OPT_NONE, '-', "Don't encrypt"},
    {"", OPT_CIPHER, '-', "Any supported cipher"},
R
Rich Salz 已提交
78
    OPT_R_OPTIONS,
79 80 81 82 83 84
#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
85 86 87 88
    {NULL}
};

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

116
    /* first check the program name */
117
    prog = opt_progname(argv[0]);
118
    if (strcmp(prog, "base64") == 0) {
119
        base64 = 1;
D
Dr. Stephen Henson 已提交
120
#ifdef ZLIB
121
    } else if (strcmp(prog, "zlib") == 0) {
122
        do_zlib = 1;
D
Dr. Stephen Henson 已提交
123
#endif
124
    } else {
125 126 127 128 129
        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;
        }
130 131
    }

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

271
    if (cipher && EVP_CIPHER_flags(cipher) & EVP_CIPH_FLAG_AEAD_CIPHER) {
272
        BIO_printf(bio_err, "%s: AEAD ciphers not supported\n", prog);
273 274 275 276
        goto end;
    }

    if (cipher && (EVP_CIPHER_mode(cipher) == EVP_CIPH_XTS_MODE)) {
277
        BIO_printf(bio_err, "%s XTS ciphers not supported\n", prog);
278 279 280
        goto end;
    }

281
    if (dgst == NULL)
R
Rich Salz 已提交
282
        dgst = EVP_sha256();
283

284
    /* It must be large enough for a base64 encoded line */
285
    if (base64 && bsize < 80)
286 287 288
        bsize = 80;
    if (verbose)
        BIO_printf(bio_err, "bufsize=%d\n", bsize);
289

290 291 292 293 294 295 296 297 298
#ifdef ZLIB
    if (!do_zlib)
#endif
        if (base64) {
            if (enc)
                outformat = FORMAT_BASE64;
            else
                informat = FORMAT_BASE64;
        }
299

R
Rich Salz 已提交
300 301
    strbuf = app_malloc(SIZE, "strbuf");
    buff = app_malloc(EVP_ENCODE_LENGTH(bsize), "evp buffer");
302

303
    if (infile == NULL) {
304
        in = dup_bio_in(informat);
305
    } else {
306
        in = bio_open_default(infile, 'r', informat);
307
    }
308 309
    if (in == NULL)
        goto end;
310

311
    if (str == NULL && passarg != NULL) {
312
        if (!app_passwd(passarg, NULL, &pass, NULL)) {
313 314 315 316 317 318 319
            BIO_printf(bio_err, "Error getting password\n");
            goto end;
        }
        str = pass;
    }

    if ((str == NULL) && (cipher != NULL) && (hkey == NULL)) {
R
Richard Levitte 已提交
320
        if (1) {
321
#ifndef OPENSSL_NO_UI_CONSOLE
R
Richard Levitte 已提交
322 323
            for (;;) {
                char prompt[200];
324

P
Pauli 已提交
325
                BIO_snprintf(prompt, sizeof(prompt), "enter %s %s password:",
R
Rich Salz 已提交
326 327
                        OBJ_nid2ln(EVP_CIPHER_nid(cipher)),
                        (enc) ? "encryption" : "decryption");
R
Richard Levitte 已提交
328 329 330 331 332 333 334 335 336 337 338 339
                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");
340 341 342
                    goto end;
                }
            }
R
Richard Levitte 已提交
343 344 345 346
        } else {
#endif
            BIO_printf(bio_err, "password required\n");
            goto end;
347 348 349
        }
    }

350
    out = bio_open_default(outfile, 'w', outformat);
351 352
    if (out == NULL)
        goto end;
353

354 355 356 357 358 359 360
    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);
    }

361 362
    rbio = in;
    wbio = out;
363

D
Dr. Stephen Henson 已提交
364
#ifdef ZLIB
365 366 367
    if (do_zlib) {
        if ((bzl = BIO_new(BIO_f_zlib())) == NULL)
            goto end;
368 369 370 371
        if (debug) {
            BIO_set_callback(bzl, BIO_debug_callback);
            BIO_set_callback_arg(bzl, (char *)bio_err);
        }
372 373 374 375 376
        if (enc)
            wbio = BIO_push(bzl, wbio);
        else
            rbio = BIO_push(bzl, rbio);
    }
D
Dr. Stephen Henson 已提交
377 378
#endif

379
    if (base64) {
380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404
        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 已提交
405 406
            size_t str_len = strlen(str);

407
            if (nosalt) {
408
                sptr = NULL;
409
            } else {
410 411 412 413 414 415
                if (enc) {
                    if (hsalt) {
                        if (!set_hex(hsalt, salt, sizeof salt)) {
                            BIO_printf(bio_err, "invalid hex salt value\n");
                            goto end;
                        }
416
                    } else if (RAND_bytes(salt, sizeof salt) <= 0) {
417
                        goto end;
418
                    }
419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446
                    /*
                     * 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 已提交
447
                                str_len, 1, key, iv)) {
448 449 450 451 452 453 454 455 456 457
                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 已提交
458
                OPENSSL_cleanse(str, str_len);
459
        }
460 461 462 463
        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");
E
EasySec 已提交
464
            } else if (!set_hex(hiv, iv, siz)) {
465 466 467
                BIO_printf(bio_err, "invalid hex iv value\n");
                goto end;
            }
468 469 470 471 472 473 474 475 476 477 478
        }
        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;
        }
479
        if ((hkey != NULL) && !set_hex(hkey, key, EVP_CIPHER_key_length(cipher))) {
480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522
            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");
            }
523
            if (EVP_CIPHER_key_length(cipher) > 0) {
524
                printf("key=");
525
                for (i = 0; i < EVP_CIPHER_key_length(cipher); i++)
526 527 528
                    printf("%02X", key[i]);
                printf("\n");
            }
529
            if (EVP_CIPHER_iv_length(cipher) > 0) {
530
                printf("iv =");
531
                for (i = 0; i < EVP_CIPHER_iv_length(cipher); i++)
532 533 534 535 536 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
                    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) {
R
Rich Salz 已提交
562 563
        BIO_printf(bio_err, "bytes read   : %8ju\n", BIO_number_read(in));
        BIO_printf(bio_err, "bytes written: %8ju\n", BIO_number_written(out));
564 565 566
    }
 end:
    ERR_print_errors(bio_err);
R
Rich Salz 已提交
567 568
    OPENSSL_free(strbuf);
    OPENSSL_free(buff);
R
Rich Salz 已提交
569 570 571 572
    BIO_free(in);
    BIO_free_all(out);
    BIO_free(benc);
    BIO_free(b64);
D
Dr. Stephen Henson 已提交
573
#ifdef ZLIB
R
Rich Salz 已提交
574
    BIO_free(bzl);
D
Dr. Stephen Henson 已提交
575
#endif
576
    release_engine(e);
R
Rich Salz 已提交
577
    OPENSSL_free(pass);
P
Pauli 已提交
578
    return ret;
579 580
}

581
static void show_ciphers(const OBJ_NAME *name, void *arg)
582
{
583
    struct doall_enc_ciphers *dec = (struct doall_enc_ciphers *)arg;
584
    const EVP_CIPHER *cipher;
585 586 587 588

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

589 590 591 592 593 594 595
    /* 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;

596 597 598 599
    BIO_printf(dec->bio, "-%-25s", name->name);
    if (++dec->n == 3) {
        BIO_printf(dec->bio, "\n");
        dec->n = 0;
600
    } else
601
        BIO_printf(dec->bio, " ");
602
}
603

E
EasySec 已提交
604
static int set_hex(const char *in, unsigned char *out, int size)
605 606 607 608
{
    int i, n;
    unsigned char j;

E
EasySec 已提交
609
    i = size * 2;
610
    n = strlen(in);
E
EasySec 已提交
611 612 613 614 615
    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");
616
    }
E
EasySec 已提交
617

618 619
    memset(out, 0, size);
    for (i = 0; i < n; i++) {
E
EasySec 已提交
620
        j = (unsigned char)*in++;
R
Rich Salz 已提交
621
        if (!isxdigit(j)) {
622
            BIO_printf(bio_err, "non-hex digit\n");
P
Pauli 已提交
623
            return 0;
624
        }
625
        j = (unsigned char)OPENSSL_hexchar2int(j);
626 627 628 629 630
        if (i & 1)
            out[i / 2] |= j;
        else
            out[i / 2] = (j << 4);
    }
P
Pauli 已提交
631
    return 1;
632
}