1 /* apps/enc.c */ 2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 3 * All rights reserved. 4 * 5 * This package is an SSL implementation written 6 * by Eric Young (eay@cryptsoft.com). 7 * The implementation was written so as to conform with Netscapes SSL. 8 * 9 * This library is free for commercial and non-commercial use as long as 10 * the following conditions are aheared to. The following conditions 11 * apply to all code found in this distribution, be it the RC4, RSA, 12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation 13 * included with this distribution is covered by the same copyright terms 14 * except that the holder is Tim Hudson (tjh@cryptsoft.com). 15 * 16 * Copyright remains Eric Young's, and as such any Copyright notices in 17 * the code are not to be removed. 18 * If this package is used in a product, Eric Young should be given attribution 19 * as the author of the parts of the library used. 20 * This can be in the form of a textual message at program startup or 21 * in documentation (online or textual) provided with the package. 22 * 23 * Redistribution and use in source and binary forms, with or without 24 * modification, are permitted provided that the following conditions 25 * are met: 26 * 1. Redistributions of source code must retain the copyright 27 * notice, this list of conditions and the following disclaimer. 28 * 2. Redistributions in binary form must reproduce the above copyright 29 * notice, this list of conditions and the following disclaimer in the 30 * documentation and/or other materials provided with the distribution. 31 * 3. All advertising materials mentioning features or use of this software 32 * must display the following acknowledgement: 33 * "This product includes cryptographic software written by 34 * Eric Young (eay@cryptsoft.com)" 35 * The word 'cryptographic' can be left out if the rouines from the library 36 * being used are not cryptographic related :-). 37 * 4. If you include any Windows specific code (or a derivative thereof) from 38 * the apps directory (application code) you must include an acknowledgement: 39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 40 * 41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 51 * SUCH DAMAGE. 52 * 53 * The licence and distribution terms for any publically available version or 54 * derivative of this code cannot be changed. i.e. this code cannot simply be 55 * copied and put under another distribution licence 56 * [including the GNU Public Licence.] 57 */ 58 59 #include <stdio.h> 60 #include <stdlib.h> 61 #include <string.h> 62 #include "apps.h" 63 #include <openssl/bio.h> 64 #include <openssl/err.h> 65 #include <openssl/evp.h> 66 #include <openssl/objects.h> 67 #include <openssl/x509.h> 68 #include <openssl/rand.h> 69 #include <openssl/pem.h> 70 #ifndef OPENSSL_NO_COMP 71 # include <openssl/comp.h> 72 #endif 73 #include <ctype.h> 74 75 int set_hex(char *in, unsigned char *out, int size); 76 #undef SIZE 77 #undef BSIZE 78 #undef PROG 79 80 #define SIZE (512) 81 #define BSIZE (8*1024) 82 #define PROG enc_main 83 84 static void show_ciphers(const OBJ_NAME *name, void *bio_) 85 { 86 BIO *bio = bio_; 87 static int n; 88 89 if (!islower((unsigned char)*name->name)) 90 return; 91 92 BIO_printf(bio, "-%-25s", name->name); 93 if (++n == 3) { 94 BIO_printf(bio, "\n"); 95 n = 0; 96 } else 97 BIO_printf(bio, " "); 98 } 99 100 int MAIN(int, char **); 101 102 int MAIN(int argc, char **argv) 103 { 104 static const char magic[] = "Salted__"; 105 char mbuf[sizeof magic - 1]; 106 char *strbuf = NULL; 107 unsigned char *buff = NULL, *bufsize = NULL; 108 int bsize = BSIZE, verbose = 0; 109 int ret = 1, inl; 110 int nopad = 0; 111 unsigned char key[EVP_MAX_KEY_LENGTH], iv[EVP_MAX_IV_LENGTH]; 112 unsigned char salt[PKCS5_SALT_LEN]; 113 char *str = NULL, *passarg = NULL, *pass = NULL; 114 char *hkey = NULL, *hiv = NULL, *hsalt = NULL; 115 char *md = NULL; 116 int enc = 1, printkey = 0, i, base64 = 0; 117 #ifdef ZLIB 118 int do_zlib = 0; 119 BIO *bzl = NULL; 120 #endif 121 int debug = 0, olb64 = 0, nosalt = 0; 122 const EVP_CIPHER *cipher = NULL, *c; 123 EVP_CIPHER_CTX *ctx = NULL; 124 char *inf = NULL, *outf = NULL; 125 BIO *in = NULL, *out = NULL, *b64 = NULL, *benc = NULL, *rbio = 126 NULL, *wbio = NULL; 127 #define PROG_NAME_SIZE 39 128 char pname[PROG_NAME_SIZE + 1]; 129 #ifndef OPENSSL_NO_ENGINE 130 char *engine = NULL; 131 #endif 132 const EVP_MD *dgst = NULL; 133 int non_fips_allow = 0; 134 135 apps_startup(); 136 137 if (bio_err == NULL) 138 if ((bio_err = BIO_new(BIO_s_file())) != NULL) 139 BIO_set_fp(bio_err, stderr, BIO_NOCLOSE | BIO_FP_TEXT); 140 141 if (!load_config(bio_err, NULL)) 142 goto end; 143 144 /* first check the program name */ 145 program_name(argv[0], pname, sizeof pname); 146 if (strcmp(pname, "base64") == 0) 147 base64 = 1; 148 #ifdef ZLIB 149 if (strcmp(pname, "zlib") == 0) 150 do_zlib = 1; 151 #endif 152 153 cipher = EVP_get_cipherbyname(pname); 154 #ifdef ZLIB 155 if (!do_zlib && !base64 && (cipher == NULL) 156 && (strcmp(pname, "enc") != 0)) 157 #else 158 if (!base64 && (cipher == NULL) && (strcmp(pname, "enc") != 0)) 159 #endif 160 { 161 BIO_printf(bio_err, "%s is an unknown cipher\n", pname); 162 goto bad; 163 } 164 165 argc--; 166 argv++; 167 while (argc >= 1) { 168 if (strcmp(*argv, "-e") == 0) 169 enc = 1; 170 else if (strcmp(*argv, "-in") == 0) { 171 if (--argc < 1) 172 goto bad; 173 inf = *(++argv); 174 } else if (strcmp(*argv, "-out") == 0) { 175 if (--argc < 1) 176 goto bad; 177 outf = *(++argv); 178 } else if (strcmp(*argv, "-pass") == 0) { 179 if (--argc < 1) 180 goto bad; 181 passarg = *(++argv); 182 } 183 #ifndef OPENSSL_NO_ENGINE 184 else if (strcmp(*argv, "-engine") == 0) { 185 if (--argc < 1) 186 goto bad; 187 engine = *(++argv); 188 } 189 #endif 190 else if (strcmp(*argv, "-d") == 0) 191 enc = 0; 192 else if (strcmp(*argv, "-p") == 0) 193 printkey = 1; 194 else if (strcmp(*argv, "-v") == 0) 195 verbose = 1; 196 else if (strcmp(*argv, "-nopad") == 0) 197 nopad = 1; 198 else if (strcmp(*argv, "-salt") == 0) 199 nosalt = 0; 200 else if (strcmp(*argv, "-nosalt") == 0) 201 nosalt = 1; 202 else if (strcmp(*argv, "-debug") == 0) 203 debug = 1; 204 else if (strcmp(*argv, "-P") == 0) 205 printkey = 2; 206 else if (strcmp(*argv, "-A") == 0) 207 olb64 = 1; 208 else if (strcmp(*argv, "-a") == 0) 209 base64 = 1; 210 else if (strcmp(*argv, "-base64") == 0) 211 base64 = 1; 212 #ifdef ZLIB 213 else if (strcmp(*argv, "-z") == 0) 214 do_zlib = 1; 215 #endif 216 else if (strcmp(*argv, "-bufsize") == 0) { 217 if (--argc < 1) 218 goto bad; 219 bufsize = (unsigned char *)*(++argv); 220 } else if (strcmp(*argv, "-k") == 0) { 221 if (--argc < 1) 222 goto bad; 223 str = *(++argv); 224 } else if (strcmp(*argv, "-kfile") == 0) { 225 static char buf[128]; 226 FILE *infile; 227 char *file; 228 229 if (--argc < 1) 230 goto bad; 231 file = *(++argv); 232 infile = fopen(file, "r"); 233 if (infile == NULL) { 234 BIO_printf(bio_err, "unable to read key from '%s'\n", file); 235 goto bad; 236 } 237 buf[0] = '\0'; 238 if (!fgets(buf, sizeof buf, infile)) { 239 BIO_printf(bio_err, "unable to read key from '%s'\n", file); 240 goto bad; 241 } 242 fclose(infile); 243 i = strlen(buf); 244 if ((i > 0) && ((buf[i - 1] == '\n') || (buf[i - 1] == '\r'))) 245 buf[--i] = '\0'; 246 if ((i > 0) && ((buf[i - 1] == '\n') || (buf[i - 1] == '\r'))) 247 buf[--i] = '\0'; 248 if (i < 1) { 249 BIO_printf(bio_err, "zero length password\n"); 250 goto bad; 251 } 252 str = buf; 253 } else if (strcmp(*argv, "-K") == 0) { 254 if (--argc < 1) 255 goto bad; 256 hkey = *(++argv); 257 } else if (strcmp(*argv, "-S") == 0) { 258 if (--argc < 1) 259 goto bad; 260 hsalt = *(++argv); 261 } else if (strcmp(*argv, "-iv") == 0) { 262 if (--argc < 1) 263 goto bad; 264 hiv = *(++argv); 265 } else if (strcmp(*argv, "-md") == 0) { 266 if (--argc < 1) 267 goto bad; 268 md = *(++argv); 269 } else if (strcmp(*argv, "-non-fips-allow") == 0) 270 non_fips_allow = 1; 271 else if ((argv[0][0] == '-') && 272 ((c = EVP_get_cipherbyname(&(argv[0][1]))) != NULL)) { 273 cipher = c; 274 } else if (strcmp(*argv, "-none") == 0) 275 cipher = NULL; 276 else { 277 BIO_printf(bio_err, "unknown option '%s'\n", *argv); 278 bad: 279 BIO_printf(bio_err, "options are\n"); 280 BIO_printf(bio_err, "%-14s input file\n", "-in <file>"); 281 BIO_printf(bio_err, "%-14s output file\n", "-out <file>"); 282 BIO_printf(bio_err, "%-14s pass phrase source\n", "-pass <arg>"); 283 BIO_printf(bio_err, "%-14s encrypt\n", "-e"); 284 BIO_printf(bio_err, "%-14s decrypt\n", "-d"); 285 BIO_printf(bio_err, 286 "%-14s base64 encode/decode, depending on encryption flag\n", 287 "-a/-base64"); 288 BIO_printf(bio_err, "%-14s passphrase is the next argument\n", 289 "-k"); 290 BIO_printf(bio_err, 291 "%-14s passphrase is the first line of the file argument\n", 292 "-kfile"); 293 BIO_printf(bio_err, 294 "%-14s the next argument is the md to use to create a key\n", 295 "-md"); 296 BIO_printf(bio_err, 297 "%-14s from a passphrase. One of md2, md5, sha or sha1\n", 298 ""); 299 BIO_printf(bio_err, "%-14s salt in hex is the next argument\n", 300 "-S"); 301 BIO_printf(bio_err, "%-14s key/iv in hex is the next argument\n", 302 "-K/-iv"); 303 BIO_printf(bio_err, "%-14s print the iv/key (then exit if -P)\n", 304 "-[pP]"); 305 BIO_printf(bio_err, "%-14s buffer size\n", "-bufsize <n>"); 306 BIO_printf(bio_err, "%-14s disable standard block padding\n", 307 "-nopad"); 308 #ifndef OPENSSL_NO_ENGINE 309 BIO_printf(bio_err, 310 "%-14s use engine e, possibly a hardware device.\n", 311 "-engine e"); 312 #endif 313 314 BIO_printf(bio_err, "Cipher Types\n"); 315 OBJ_NAME_do_all_sorted(OBJ_NAME_TYPE_CIPHER_METH, 316 show_ciphers, bio_err); 317 BIO_printf(bio_err, "\n"); 318 319 goto end; 320 } 321 argc--; 322 argv++; 323 } 324 325 #ifndef OPENSSL_NO_ENGINE 326 setup_engine(bio_err, engine, 0); 327 #endif 328 329 if (cipher && EVP_CIPHER_flags(cipher) & EVP_CIPH_FLAG_AEAD_CIPHER) { 330 BIO_printf(bio_err, 331 "AEAD ciphers not supported by the enc utility\n"); 332 goto end; 333 } 334 335 if (cipher && (EVP_CIPHER_mode(cipher) == EVP_CIPH_XTS_MODE)) { 336 BIO_printf(bio_err, 337 "Ciphers in XTS mode are not supported by the enc utility\n"); 338 goto end; 339 } 340 341 if (md && (dgst = EVP_get_digestbyname(md)) == NULL) { 342 BIO_printf(bio_err, "%s is an unsupported message digest type\n", md); 343 goto end; 344 } 345 346 if (dgst == NULL) { 347 dgst = EVP_md5(); 348 } 349 350 if (bufsize != NULL) { 351 unsigned long n; 352 353 for (n = 0; *bufsize; bufsize++) { 354 i = *bufsize; 355 if ((i <= '9') && (i >= '0')) 356 n = n * 10 + i - '0'; 357 else if (i == 'k') { 358 n *= 1024; 359 bufsize++; 360 break; 361 } 362 } 363 if (*bufsize != '\0') { 364 BIO_printf(bio_err, "invalid 'bufsize' specified.\n"); 365 goto end; 366 } 367 368 /* It must be large enough for a base64 encoded line */ 369 if (base64 && n < 80) 370 n = 80; 371 372 bsize = (int)n; 373 if (verbose) 374 BIO_printf(bio_err, "bufsize=%d\n", bsize); 375 } 376 377 strbuf = OPENSSL_malloc(SIZE); 378 buff = (unsigned char *)OPENSSL_malloc(EVP_ENCODE_LENGTH(bsize)); 379 if ((buff == NULL) || (strbuf == NULL)) { 380 BIO_printf(bio_err, "OPENSSL_malloc failure %ld\n", 381 (long)EVP_ENCODE_LENGTH(bsize)); 382 goto end; 383 } 384 385 in = BIO_new(BIO_s_file()); 386 out = BIO_new(BIO_s_file()); 387 if ((in == NULL) || (out == NULL)) { 388 ERR_print_errors(bio_err); 389 goto end; 390 } 391 if (debug) { 392 BIO_set_callback(in, BIO_debug_callback); 393 BIO_set_callback(out, BIO_debug_callback); 394 BIO_set_callback_arg(in, (char *)bio_err); 395 BIO_set_callback_arg(out, (char *)bio_err); 396 } 397 398 if (inf == NULL) { 399 #ifndef OPENSSL_NO_SETVBUF_IONBF 400 if (bufsize != NULL) 401 setvbuf(stdin, (char *)NULL, _IONBF, 0); 402 #endif /* ndef OPENSSL_NO_SETVBUF_IONBF */ 403 BIO_set_fp(in, stdin, BIO_NOCLOSE); 404 } else { 405 if (BIO_read_filename(in, inf) <= 0) { 406 perror(inf); 407 goto end; 408 } 409 } 410 411 if (!str && passarg) { 412 if (!app_passwd(bio_err, passarg, NULL, &pass, NULL)) { 413 BIO_printf(bio_err, "Error getting password\n"); 414 goto end; 415 } 416 str = pass; 417 } 418 419 if ((str == NULL) && (cipher != NULL) && (hkey == NULL)) { 420 for (;;) { 421 char buf[200]; 422 423 BIO_snprintf(buf, sizeof buf, "enter %s %s password:", 424 OBJ_nid2ln(EVP_CIPHER_nid(cipher)), 425 (enc) ? "encryption" : "decryption"); 426 strbuf[0] = '\0'; 427 i = EVP_read_pw_string((char *)strbuf, SIZE, buf, enc); 428 if (i == 0) { 429 if (strbuf[0] == '\0') { 430 ret = 1; 431 goto end; 432 } 433 str = strbuf; 434 break; 435 } 436 if (i < 0) { 437 BIO_printf(bio_err, "bad password read\n"); 438 goto end; 439 } 440 } 441 } 442 443 if (outf == NULL) { 444 BIO_set_fp(out, stdout, BIO_NOCLOSE); 445 #ifndef OPENSSL_NO_SETVBUF_IONBF 446 if (bufsize != NULL) 447 setvbuf(stdout, (char *)NULL, _IONBF, 0); 448 #endif /* ndef OPENSSL_NO_SETVBUF_IONBF */ 449 #ifdef OPENSSL_SYS_VMS 450 { 451 BIO *tmpbio = BIO_new(BIO_f_linebuffer()); 452 out = BIO_push(tmpbio, out); 453 } 454 #endif 455 } else { 456 if (BIO_write_filename(out, outf) <= 0) { 457 perror(outf); 458 goto end; 459 } 460 } 461 462 rbio = in; 463 wbio = out; 464 465 #ifdef ZLIB 466 467 if (do_zlib) { 468 if ((bzl = BIO_new(BIO_f_zlib())) == NULL) 469 goto end; 470 if (enc) 471 wbio = BIO_push(bzl, wbio); 472 else 473 rbio = BIO_push(bzl, rbio); 474 } 475 #endif 476 477 if (base64) { 478 if ((b64 = BIO_new(BIO_f_base64())) == NULL) 479 goto end; 480 if (debug) { 481 BIO_set_callback(b64, BIO_debug_callback); 482 BIO_set_callback_arg(b64, (char *)bio_err); 483 } 484 if (olb64) 485 BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL); 486 if (enc) 487 wbio = BIO_push(b64, wbio); 488 else 489 rbio = BIO_push(b64, rbio); 490 } 491 492 if (cipher != NULL) { 493 /* 494 * Note that str is NULL if a key was passed on the command line, so 495 * we get no salt in that case. Is this a bug? 496 */ 497 if (str != NULL) { 498 /* 499 * Salt handling: if encrypting generate a salt and write to 500 * output BIO. If decrypting read salt from input BIO. 501 */ 502 unsigned char *sptr; 503 if (nosalt) 504 sptr = NULL; 505 else { 506 if (enc) { 507 if (hsalt) { 508 if (!set_hex(hsalt, salt, sizeof salt)) { 509 BIO_printf(bio_err, "invalid hex salt value\n"); 510 goto end; 511 } 512 } else if (RAND_pseudo_bytes(salt, sizeof salt) < 0) 513 goto end; 514 /* 515 * If -P option then don't bother writing 516 */ 517 if ((printkey != 2) 518 && (BIO_write(wbio, magic, 519 sizeof magic - 1) != sizeof magic - 1 520 || BIO_write(wbio, 521 (char *)salt, 522 sizeof salt) != sizeof salt)) { 523 BIO_printf(bio_err, "error writing output file\n"); 524 goto end; 525 } 526 } else if (BIO_read(rbio, mbuf, sizeof mbuf) != sizeof mbuf 527 || BIO_read(rbio, 528 (unsigned char *)salt, 529 sizeof salt) != sizeof salt) { 530 BIO_printf(bio_err, "error reading input file\n"); 531 goto end; 532 } else if (memcmp(mbuf, magic, sizeof magic - 1)) { 533 BIO_printf(bio_err, "bad magic number\n"); 534 goto end; 535 } 536 537 sptr = salt; 538 } 539 540 EVP_BytesToKey(cipher, dgst, sptr, 541 (unsigned char *)str, strlen(str), 1, key, iv); 542 /* 543 * zero the complete buffer or the string passed from the command 544 * line bug picked up by Larry J. Hughes Jr. <hughes@indiana.edu> 545 */ 546 if (str == strbuf) 547 OPENSSL_cleanse(str, SIZE); 548 else 549 OPENSSL_cleanse(str, strlen(str)); 550 } 551 if (hiv != NULL) { 552 int siz = EVP_CIPHER_iv_length(cipher); 553 if (siz == 0) { 554 BIO_printf(bio_err, "warning: iv not use by this cipher\n"); 555 } else if (!set_hex(hiv, iv, sizeof iv)) { 556 BIO_printf(bio_err, "invalid hex iv value\n"); 557 goto end; 558 } 559 } 560 if ((hiv == NULL) && (str == NULL) 561 && EVP_CIPHER_iv_length(cipher) != 0) { 562 /* 563 * No IV was explicitly set and no IV was generated during 564 * EVP_BytesToKey. Hence the IV is undefined, making correct 565 * decryption impossible. 566 */ 567 BIO_printf(bio_err, "iv undefined\n"); 568 goto end; 569 } 570 if ((hkey != NULL) && !set_hex(hkey, key, EVP_CIPHER_key_length(cipher))) { 571 BIO_printf(bio_err, "invalid hex key value\n"); 572 goto end; 573 } 574 575 if ((benc = BIO_new(BIO_f_cipher())) == NULL) 576 goto end; 577 578 /* 579 * Since we may be changing parameters work on the encryption context 580 * rather than calling BIO_set_cipher(). 581 */ 582 583 BIO_get_cipher_ctx(benc, &ctx); 584 585 if (non_fips_allow) 586 EVP_CIPHER_CTX_set_flags(ctx, EVP_CIPH_FLAG_NON_FIPS_ALLOW); 587 588 if (!EVP_CipherInit_ex(ctx, cipher, NULL, NULL, NULL, enc)) { 589 BIO_printf(bio_err, "Error setting cipher %s\n", 590 EVP_CIPHER_name(cipher)); 591 ERR_print_errors(bio_err); 592 goto end; 593 } 594 595 if (nopad) 596 EVP_CIPHER_CTX_set_padding(ctx, 0); 597 598 if (!EVP_CipherInit_ex(ctx, NULL, NULL, key, iv, enc)) { 599 BIO_printf(bio_err, "Error setting cipher %s\n", 600 EVP_CIPHER_name(cipher)); 601 ERR_print_errors(bio_err); 602 goto end; 603 } 604 605 if (debug) { 606 BIO_set_callback(benc, BIO_debug_callback); 607 BIO_set_callback_arg(benc, (char *)bio_err); 608 } 609 610 if (printkey) { 611 if (!nosalt) { 612 printf("salt="); 613 for (i = 0; i < (int)sizeof(salt); i++) 614 printf("%02X", salt[i]); 615 printf("\n"); 616 } 617 if (cipher->key_len > 0) { 618 printf("key="); 619 for (i = 0; i < cipher->key_len; i++) 620 printf("%02X", key[i]); 621 printf("\n"); 622 } 623 if (cipher->iv_len > 0) { 624 printf("iv ="); 625 for (i = 0; i < cipher->iv_len; i++) 626 printf("%02X", iv[i]); 627 printf("\n"); 628 } 629 if (printkey == 2) { 630 ret = 0; 631 goto end; 632 } 633 } 634 } 635 636 /* Only encrypt/decrypt as we write the file */ 637 if (benc != NULL) 638 wbio = BIO_push(benc, wbio); 639 640 for (;;) { 641 inl = BIO_read(rbio, (char *)buff, bsize); 642 if (inl <= 0) 643 break; 644 if (BIO_write(wbio, (char *)buff, inl) != inl) { 645 BIO_printf(bio_err, "error writing output file\n"); 646 goto end; 647 } 648 } 649 if (!BIO_flush(wbio)) { 650 BIO_printf(bio_err, "bad decrypt\n"); 651 goto end; 652 } 653 654 ret = 0; 655 if (verbose) { 656 BIO_printf(bio_err, "bytes read :%8ld\n", BIO_number_read(in)); 657 BIO_printf(bio_err, "bytes written:%8ld\n", BIO_number_written(out)); 658 } 659 end: 660 ERR_print_errors(bio_err); 661 if (strbuf != NULL) 662 OPENSSL_free(strbuf); 663 if (buff != NULL) 664 OPENSSL_free(buff); 665 if (in != NULL) 666 BIO_free(in); 667 if (out != NULL) 668 BIO_free_all(out); 669 if (benc != NULL) 670 BIO_free(benc); 671 if (b64 != NULL) 672 BIO_free(b64); 673 #ifdef ZLIB 674 if (bzl != NULL) 675 BIO_free(bzl); 676 #endif 677 if (pass) 678 OPENSSL_free(pass); 679 apps_shutdown(); 680 OPENSSL_EXIT(ret); 681 } 682 683 int set_hex(char *in, unsigned char *out, int size) 684 { 685 int i, n; 686 unsigned char j; 687 688 n = strlen(in); 689 if (n > (size * 2)) { 690 BIO_printf(bio_err, "hex string is too long\n"); 691 return (0); 692 } 693 memset(out, 0, size); 694 for (i = 0; i < n; i++) { 695 j = (unsigned char)*in; 696 *(in++) = '\0'; 697 if (j == 0) 698 break; 699 if ((j >= '0') && (j <= '9')) 700 j -= '0'; 701 else if ((j >= 'A') && (j <= 'F')) 702 j = j - 'A' + 10; 703 else if ((j >= 'a') && (j <= 'f')) 704 j = j - 'a' + 10; 705 else { 706 BIO_printf(bio_err, "non-hex digit\n"); 707 return (0); 708 } 709 if (i & 1) 710 out[i / 2] |= j; 711 else 712 out[i / 2] = (j << 4); 713 } 714 return (1); 715 } 716