- }
-#ifdef CRYPTO_MDEBUG
- CRYPTO_push_info("load encryption certificates");
-#endif
- encerts = sk_X509_new_null();
- while (*args) {
- if(!(cert = load_cert(*args))) {
- BIO_printf(bio_err, "Can't read recipent certificate file %s\n", *args);
- goto end;
- }
- sk_X509_push(encerts, cert);
- cert = NULL;
- args++;
- }
-#ifdef CRYPTO_MDEBUG
- CRYPTO_pop_info();
-#endif
- }
-
- if(signerfile && (operation == SMIME_SIGN)) {
-#ifdef CRYPTO_MDEBUG
- CRYPTO_push_info("load signer certificate");
-#endif
- if(!(signer = load_cert(signerfile))) {
- BIO_printf(bio_err, "Can't read signer certificate file %s\n", signerfile);
- goto end;
- }
-#ifdef CRYPTO_MDEBUG
- CRYPTO_pop_info();
-#endif
- }
-
- if(certfile) {
-#ifdef CRYPTO_MDEBUG
- CRYPTO_push_info("load other certfiles");
-#endif
- if(!(other = load_certs(certfile))) {
- BIO_printf(bio_err, "Can't read certificate file %s\n", certfile);
- ERR_print_errors(bio_err);
- goto end;
- }
-#ifdef CRYPTO_MDEBUG
- CRYPTO_pop_info();
-#endif
- }
-
- if(recipfile && (operation == SMIME_DECRYPT)) {
-#ifdef CRYPTO_MDEBUG
- CRYPTO_push_info("load recipient certificate");
-#endif
- if(!(recip = load_cert(recipfile))) {
- BIO_printf(bio_err, "Can't read recipient certificate file %s\n", recipfile);
- ERR_print_errors(bio_err);
- goto end;
- }
-#ifdef CRYPTO_MDEBUG
- CRYPTO_pop_info();
-#endif
- }
-
- if(operation == SMIME_DECRYPT) {
- if(!keyfile) keyfile = recipfile;
- } else if(operation == SMIME_SIGN) {
- if(!keyfile) keyfile = signerfile;
- } else keyfile = NULL;
-
- if(keyfile) {
-#ifdef CRYPTO_MDEBUG
- CRYPTO_push_info("load keyfile");
-#endif
- if(!(key = load_key(keyfile, passin))) {
- BIO_printf(bio_err, "Can't read recipient certificate file %s\n", keyfile);
- ERR_print_errors(bio_err);
- goto end;
- }
-#ifdef CRYPTO_MDEBUG
- CRYPTO_pop_info();
-#endif
- }
-
-#ifdef CRYPTO_MDEBUG
- CRYPTO_push_info("open input files");
-#endif
- if (infile) {
- if (!(in = BIO_new_file(infile, inmode))) {
- BIO_printf (bio_err,
- "Can't open input file %s\n", infile);
- goto end;
- }
- } else in = BIO_new_fp(stdin, BIO_NOCLOSE);
-#ifdef CRYPTO_MDEBUG
- CRYPTO_pop_info();
-#endif
-
-#ifdef CRYPTO_MDEBUG
- CRYPTO_push_info("open output files");
-#endif
- if (outfile) {
- if (!(out = BIO_new_file(outfile, outmode))) {
- BIO_printf (bio_err,
- "Can't open output file %s\n", outfile);
- goto end;
- }
- } else out = BIO_new_fp(stdout, BIO_NOCLOSE);
-#ifdef CRYPTO_MDEBUG
- CRYPTO_pop_info();
-#endif
-
- if(operation == SMIME_VERIFY) {
-#ifdef CRYPTO_MDEBUG
- CRYPTO_push_info("setup_verify");
-#endif
- if(!(store = setup_verify(CAfile, CApath))) goto end;
-#ifdef CRYPTO_MDEBUG
- CRYPTO_pop_info();
-#endif
- }
-
- ret = 3;
-
- if(operation == SMIME_ENCRYPT) {
-#ifdef CRYPTO_MDEBUG
- CRYPTO_push_info("PKCS7_encrypt");
-#endif
- p7 = PKCS7_encrypt(encerts, in, cipher, flags);
-#ifdef CRYPTO_MDEBUG
- CRYPTO_pop_info();
-#endif
- } else if(operation == SMIME_SIGN) {
-#ifdef CRYPTO_MDEBUG
- CRYPTO_push_info("PKCS7_sign");
-#endif
- p7 = PKCS7_sign(signer, key, other, in, flags);
- BIO_reset(in);
-#ifdef CRYPTO_MDEBUG
- CRYPTO_pop_info();
-#endif
- } else {
-#ifdef CRYPTO_MDEBUG
- CRYPTO_push_info("SMIME_read_PKCS7");
-#endif
- if(!(p7 = SMIME_read_PKCS7(in, &indata))) {
- BIO_printf(bio_err, "Error reading S/MIME message\n");
- goto end;
- }
-#ifdef CRYPTO_MDEBUG
- CRYPTO_pop_info();
-#endif
- }
-
- if(!p7) {
- BIO_printf(bio_err, "Error creating PKCS#7 structure\n");
- goto end;
- }
-
- ret = 4;
- if(operation == SMIME_DECRYPT) {
-#ifdef CRYPTO_MDEBUG
- CRYPTO_push_info("PKCS7_decrypt");
-#endif
- if(!PKCS7_decrypt(p7, key, recip, out, flags)) {
- BIO_printf(bio_err, "Error decrypting PKCS#7 structure\n");
- goto end;
- }
-#ifdef CRYPTO_MDEBUG
- CRYPTO_pop_info();
-#endif
- } else if(operation == SMIME_VERIFY) {
- STACK_OF(X509) *signers;
-#ifdef CRYPTO_MDEBUG
- CRYPTO_push_info("PKCS7_verify");
-#endif
- if(PKCS7_verify(p7, other, store, indata, out, flags)) {
- BIO_printf(bio_err, "Verification Successful\n");
- } else {
- BIO_printf(bio_err, "Verification Failure\n");
- goto end;
- }
-#ifdef CRYPTO_MDEBUG
- CRYPTO_pop_info();
- CRYPTO_push_info("PKCS7_iget_signers");
-#endif
- signers = PKCS7_iget_signers(p7, other, flags);
-#ifdef CRYPTO_MDEBUG
- CRYPTO_pop_info();
- CRYPTO_push_info("save_certs");
-#endif
- if(!save_certs(signerfile, signers)) {
- BIO_printf(bio_err, "Error writing signers to %s\n",
- signerfile);
- ret = 5;
- goto end;
- }
-#ifdef CRYPTO_MDEBUG
- CRYPTO_pop_info();
-#endif
- sk_X509_free(signers);
- } else if(operation == SMIME_PK7OUT) {
- PEM_write_bio_PKCS7(out, p7);
- } else {
- if(to) BIO_printf(out, "To: %s\n", to);
- if(from) BIO_printf(out, "From: %s\n", from);
- if(subject) BIO_printf(out, "Subject: %s\n", subject);
- SMIME_write_PKCS7(out, p7, in, flags);
- }
- ret = 0;
-end:
-#ifdef CRYPTO_MDEBUG
- CRYPTO_remove_all_info();
+ goto end;
+ }
+ sk_X509_push(encerts, cert);
+ cert = NULL;
+ args++;
+ }
+ }
+
+ if (certfile) {
+ if (!(other = load_certs(bio_err, certfile, FORMAT_PEM, NULL,
+ e, "certificate file"))) {
+ ERR_print_errors(bio_err);
+ goto end;
+ }
+ }
+
+ if (recipfile && (operation == SMIME_DECRYPT)) {
+ if (!(recip = load_cert(bio_err, recipfile, FORMAT_PEM, NULL,
+ e, "recipient certificate file"))) {
+ ERR_print_errors(bio_err);
+ goto end;
+ }
+ }
+
+ if (operation == SMIME_DECRYPT) {
+ if (!keyfile)
+ keyfile = recipfile;
+ } else if (operation == SMIME_SIGN) {
+ if (!keyfile)
+ keyfile = signerfile;
+ } else
+ keyfile = NULL;
+
+ if (keyfile) {
+ key = load_key(bio_err, keyfile, keyform, 0, passin, e,
+ "signing key file");
+ if (!key)
+ goto end;
+ }
+
+ if (infile) {
+ if (!(in = BIO_new_file(infile, inmode))) {
+ BIO_printf(bio_err, "Can't open input file %s\n", infile);
+ goto end;
+ }
+ } else
+ in = BIO_new_fp(stdin, BIO_NOCLOSE);
+
+ if (operation & SMIME_IP) {
+ if (informat == FORMAT_SMIME)
+ p7 = SMIME_read_PKCS7(in, &indata);
+ else if (informat == FORMAT_PEM)
+ p7 = PEM_read_bio_PKCS7(in, NULL, NULL, NULL);
+ else if (informat == FORMAT_ASN1)
+ p7 = d2i_PKCS7_bio(in, NULL);
+ else {
+ BIO_printf(bio_err, "Bad input format for PKCS#7 file\n");
+ goto end;
+ }
+
+ if (!p7) {
+ BIO_printf(bio_err, "Error reading S/MIME message\n");
+ goto end;
+ }
+ if (contfile) {
+ BIO_free(indata);
+ if (!(indata = BIO_new_file(contfile, "rb"))) {
+ BIO_printf(bio_err, "Can't read content file %s\n", contfile);
+ goto end;
+ }
+ }
+ }
+
+ if (outfile) {
+ if (!(out = BIO_new_file(outfile, outmode))) {
+ BIO_printf(bio_err, "Can't open output file %s\n", outfile);
+ goto end;
+ }
+ } else {
+ out = BIO_new_fp(stdout, BIO_NOCLOSE);
+#ifdef OPENSSL_SYS_VMS
+ {
+ BIO *tmpbio = BIO_new(BIO_f_linebuffer());
+ out = BIO_push(tmpbio, out);
+ }