enc.c 18.6 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

32 33 34
static int set_hex(char *in, unsigned char *out, int size);
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
    if (cipher && EVP_CIPHER_flags(cipher) & EVP_CIPH_FLAG_AEAD_CIPHER) {
268
        BIO_printf(bio_err, "%s: AEAD ciphers not supported\n", prog);
269 270 271 272
        goto end;
    }

    if (cipher && (EVP_CIPHER_mode(cipher) == EVP_CIPH_XTS_MODE)) {
273
        BIO_printf(bio_err, "%s XTS ciphers not supported\n", prog);
274 275 276
        goto end;
    }

277
    if (dgst == NULL)
R
Rich Salz 已提交
278
        dgst = EVP_sha256();
279

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

286 287 288 289 290 291 292 293 294
#ifdef ZLIB
    if (!do_zlib)
#endif
        if (base64) {
            if (enc)
                outformat = FORMAT_BASE64;
            else
                informat = FORMAT_BASE64;
        }
295

R
Rich Salz 已提交
296 297
    strbuf = app_malloc(SIZE, "strbuf");
    buff = app_malloc(EVP_ENCODE_LENGTH(bsize), "evp buffer");
298

299
    if (infile == NULL) {
300
        in = dup_bio_in(informat);
301
    } else {
302
        in = bio_open_default(infile, 'r', informat);
303
    }
304 305
    if (in == NULL)
        goto end;
306

307
    if (str == NULL && passarg != NULL) {
308
        if (!app_passwd(passarg, NULL, &pass, NULL)) {
309 310 311 312 313 314 315
            BIO_printf(bio_err, "Error getting password\n");
            goto end;
        }
        str = pass;
    }

    if ((str == NULL) && (cipher != NULL) && (hkey == NULL)) {
R
Richard Levitte 已提交
316
        if (1) {
317
#ifndef OPENSSL_NO_UI_CONSOLE
R
Richard Levitte 已提交
318 319
            for (;;) {
                char prompt[200];
320

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

346
    out = bio_open_default(outfile, 'w', outformat);
347 348
    if (out == NULL)
        goto end;
349

350 351 352 353 354 355 356
    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);
    }

357 358
    rbio = in;
    wbio = out;
359

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

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

403
            if (nosalt) {
404
                sptr = NULL;
405
            } else {
406 407 408 409 410 411
                if (enc) {
                    if (hsalt) {
                        if (!set_hex(hsalt, salt, sizeof salt)) {
                            BIO_printf(bio_err, "invalid hex salt value\n");
                            goto end;
                        }
412
                    } else if (RAND_bytes(salt, sizeof salt) <= 0) {
413
                        goto end;
414
                    }
415 416 417 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
                    /*
                     * 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 已提交
443
                                str_len, 1, key, iv)) {
444 445 446 447 448 449 450 451 452 453
                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 已提交
454
                OPENSSL_cleanse(str, str_len);
455
        }
456 457 458 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");
            } else if (!set_hex(hiv, iv, sizeof iv)) {
                BIO_printf(bio_err, "invalid hex iv value\n");
                goto end;
            }
464 465 466 467 468 469 470 471 472 473 474
        }
        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;
        }
475
        if ((hkey != NULL) && !set_hex(hkey, key, EVP_CIPHER_key_length(cipher))) {
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 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518
            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");
            }
519
            if (EVP_CIPHER_key_length(cipher) > 0) {
520
                printf("key=");
521
                for (i = 0; i < EVP_CIPHER_key_length(cipher); i++)
522 523 524
                    printf("%02X", key[i]);
                printf("\n");
            }
525
            if (EVP_CIPHER_iv_length(cipher) > 0) {
526
                printf("iv =");
527
                for (i = 0; i < EVP_CIPHER_iv_length(cipher); i++)
528 529 530 531 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
                    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 已提交
558 559
        BIO_printf(bio_err, "bytes read   : %8ju\n", BIO_number_read(in));
        BIO_printf(bio_err, "bytes written: %8ju\n", BIO_number_written(out));
560 561 562
    }
 end:
    ERR_print_errors(bio_err);
R
Rich Salz 已提交
563 564
    OPENSSL_free(strbuf);
    OPENSSL_free(buff);
R
Rich Salz 已提交
565 566 567 568
    BIO_free(in);
    BIO_free_all(out);
    BIO_free(benc);
    BIO_free(b64);
D
Dr. Stephen Henson 已提交
569
#ifdef ZLIB
R
Rich Salz 已提交
570
    BIO_free(bzl);
D
Dr. Stephen Henson 已提交
571
#endif
572
    release_engine(e);
R
Rich Salz 已提交
573
    OPENSSL_free(pass);
P
Pauli 已提交
574
    return ret;
575 576
}

577
static void show_ciphers(const OBJ_NAME *name, void *arg)
578
{
579
    struct doall_enc_ciphers *dec = (struct doall_enc_ciphers *)arg;
580
    const EVP_CIPHER *cipher;
581 582 583 584

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

585 586 587 588 589 590 591
    /* 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;

592 593 594 595
    BIO_printf(dec->bio, "-%-25s", name->name);
    if (++dec->n == 3) {
        BIO_printf(dec->bio, "\n");
        dec->n = 0;
596
    } else
597
        BIO_printf(dec->bio, " ");
598
}
599

600
static int set_hex(char *in, unsigned char *out, int size)
601 602 603 604 605 606 607
{
    int i, n;
    unsigned char j;

    n = strlen(in);
    if (n > (size * 2)) {
        BIO_printf(bio_err, "hex string is too long\n");
P
Pauli 已提交
608
        return 0;
609 610 611 612 613 614 615
    }
    memset(out, 0, size);
    for (i = 0; i < n; i++) {
        j = (unsigned char)*in;
        *(in++) = '\0';
        if (j == 0)
            break;
R
Rich Salz 已提交
616
        if (!isxdigit(j)) {
617
            BIO_printf(bio_err, "non-hex digit\n");
P
Pauli 已提交
618
            return 0;
619
        }
620
        j = (unsigned char)OPENSSL_hexchar2int(j);
621 622 623 624 625
        if (i & 1)
            out[i / 2] |= j;
        else
            out[i / 2] = (j << 4);
    }
P
Pauli 已提交
626
    return 1;
627
}