提交 4ec3d785 编写于 作者: D Dr. Stephen Henson

Reformat smime.c

上级 5d7c222d
...@@ -82,7 +82,7 @@ static int smime_cb(int ok, X509_STORE_CTX *ctx); ...@@ -82,7 +82,7 @@ static int smime_cb(int ok, X509_STORE_CTX *ctx);
int MAIN(int, char **); int MAIN(int, char **);
int MAIN(int argc, char **argv) int MAIN(int argc, char **argv)
{ {
ENGINE *e = NULL; ENGINE *e = NULL;
int operation = 0; int operation = 0;
int ret = 0; int ret = 0;
...@@ -119,18 +119,26 @@ int MAIN(int argc, char **argv) ...@@ -119,18 +119,26 @@ int MAIN(int argc, char **argv)
apps_startup(); apps_startup();
if (bio_err == NULL) if (bio_err == NULL)
{
if ((bio_err = BIO_new(BIO_s_file())) != NULL) if ((bio_err = BIO_new(BIO_s_file())) != NULL)
BIO_set_fp(bio_err, stderr, BIO_NOCLOSE|BIO_FP_TEXT); BIO_set_fp(bio_err, stderr, BIO_NOCLOSE|BIO_FP_TEXT);
}
if (!load_config(bio_err, NULL)) if (!load_config(bio_err, NULL))
goto end; goto end;
while (!badarg && *args && *args[0] == '-') { while (!badarg && *args && *args[0] == '-')
if (!strcmp (*args, "-encrypt")) operation = SMIME_ENCRYPT; {
else if (!strcmp (*args, "-decrypt")) operation = SMIME_DECRYPT; if (!strcmp (*args, "-encrypt"))
else if (!strcmp (*args, "-sign")) operation = SMIME_SIGN; operation = SMIME_ENCRYPT;
else if (!strcmp (*args, "-verify")) operation = SMIME_VERIFY; else if (!strcmp (*args, "-decrypt"))
else if (!strcmp (*args, "-pk7out")) operation = SMIME_PK7OUT; operation = SMIME_DECRYPT;
else if (!strcmp (*args, "-sign"))
operation = SMIME_SIGN;
else if (!strcmp (*args, "-verify"))
operation = SMIME_VERIFY;
else if (!strcmp (*args, "-pk7out"))
operation = SMIME_PK7OUT;
#ifndef OPENSSL_NO_DES #ifndef OPENSSL_NO_DES
else if (!strcmp (*args, "-des3")) else if (!strcmp (*args, "-des3"))
cipher = EVP_des_ede3_cbc(); cipher = EVP_des_ede3_cbc();
...@@ -177,127 +185,225 @@ int MAIN(int argc, char **argv) ...@@ -177,127 +185,225 @@ int MAIN(int argc, char **argv)
flags |= PKCS7_NOOLDMIMETYPE; flags |= PKCS7_NOOLDMIMETYPE;
else if (!strcmp (*args, "-crlfeol")) else if (!strcmp (*args, "-crlfeol"))
flags |= PKCS7_CRLFEOL; flags |= PKCS7_CRLFEOL;
else if (!strcmp(*args,"-rand")) { else if (!strcmp(*args,"-rand"))
if (args[1]) { {
if (args[1])
{
args++; args++;
inrand = *args; inrand = *args;
} else badarg = 1; }
else
badarg = 1;
need_rand = 1; need_rand = 1;
}
#ifndef OPENSSL_NO_ENGINE #ifndef OPENSSL_NO_ENGINE
} else if (!strcmp(*args,"-engine")) { else if (!strcmp(*args,"-engine"))
if (args[1]) { {
if (args[1])
{
args++; args++;
engine = *args; engine = *args;
} else badarg = 1; }
else badarg = 1;
}
#endif #endif
} else if (!strcmp(*args,"-passin")) { else if (!strcmp(*args,"-passin"))
if (args[1]) { {
if (args[1])
{
args++; args++;
passargin = *args; passargin = *args;
} else badarg = 1; }
} else if (!strcmp (*args, "-to")) { else
if (args[1]) { badarg = 1;
}
else if (!strcmp (*args, "-to"))
{
if (args[1])
{
args++; args++;
to = *args; to = *args;
} else badarg = 1; }
} else if (!strcmp (*args, "-from")) { else
if (args[1]) { badarg = 1;
}
else if (!strcmp (*args, "-from"))
{
if (args[1])
{
args++; args++;
from = *args; from = *args;
} else badarg = 1; }
} else if (!strcmp (*args, "-subject")) { else badarg = 1;
if (args[1]) { }
else if (!strcmp (*args, "-subject"))
{
if (args[1])
{
args++; args++;
subject = *args; subject = *args;
} else badarg = 1; }
} else if (!strcmp (*args, "-signer")) { else
if (args[1]) { badarg = 1;
}
else if (!strcmp (*args, "-signer"))
{
if (args[1])
{
args++; args++;
signerfile = *args; signerfile = *args;
} else badarg = 1; }
} else if (!strcmp (*args, "-recip")) { else
if (args[1]) { badarg = 1;
}
else if (!strcmp (*args, "-recip"))
{
if (args[1])
{
args++; args++;
recipfile = *args; recipfile = *args;
} else badarg = 1; }
} else if (!strcmp (*args, "-inkey")) { else badarg = 1;
if (args[1]) { }
else if (!strcmp (*args, "-inkey"))
{
if (args[1])
{
args++; args++;
keyfile = *args; keyfile = *args;
} else badarg = 1; }
} else if (!strcmp (*args, "-keyform")) { else
if (args[1]) { badarg = 1;
}
else if (!strcmp (*args, "-keyform"))
{
if (args[1])
{
args++; args++;
keyform = str2fmt(*args); keyform = str2fmt(*args);
} else badarg = 1; }
} else if (!strcmp (*args, "-certfile")) { else
if (args[1]) { badarg = 1;
}
else if (!strcmp (*args, "-certfile"))
{
if (args[1])
{
args++; args++;
certfile = *args; certfile = *args;
} else badarg = 1; }
} else if (!strcmp (*args, "-CAfile")) { else
if (args[1]) { badarg = 1;
}
else if (!strcmp (*args, "-CAfile"))
{
if (args[1])
{
args++; args++;
CAfile = *args; CAfile = *args;
} else badarg = 1; }
} else if (!strcmp (*args, "-CApath")) { else
if (args[1]) { badarg = 1;
}
else if (!strcmp (*args, "-CApath"))
{
if (args[1])
{
args++; args++;
CApath = *args; CApath = *args;
} else badarg = 1; }
} else if (!strcmp (*args, "-in")) { else
if (args[1]) { badarg = 1;
}
else if (!strcmp (*args, "-in"))
{
if (args[1])
{
args++; args++;
infile = *args; infile = *args;
} else badarg = 1; }
} else if (!strcmp (*args, "-inform")) { else
if (args[1]) { badarg = 1;
}
else if (!strcmp (*args, "-inform"))
{
if (args[1])
{
args++; args++;
informat = str2fmt(*args); informat = str2fmt(*args);
} else badarg = 1; }
} else if (!strcmp (*args, "-outform")) { else
if (args[1]) { badarg = 1;
}
else if (!strcmp (*args, "-outform"))
{
if (args[1])
{
args++; args++;
outformat = str2fmt(*args); outformat = str2fmt(*args);
} else badarg = 1; }
} else if (!strcmp (*args, "-out")) { else
if (args[1]) { badarg = 1;
}
else if (!strcmp (*args, "-out"))
{
if (args[1])
{
args++; args++;
outfile = *args; outfile = *args;
} else badarg = 1; }
} else if (!strcmp (*args, "-content")) { else
if (args[1]) { badarg = 1;
}
else if (!strcmp (*args, "-content"))
{
if (args[1])
{
args++; args++;
contfile = *args; contfile = *args;
} else badarg = 1; }
} else if (args_verify(&args, &badarg, bio_err, &vpm)) else
badarg = 1;
}
else if (args_verify(&args, &badarg, bio_err, &vpm))
continue; continue;
else else
badarg = 1; badarg = 1;
args++; args++;
} }
if(operation == SMIME_SIGN) { if (operation == SMIME_SIGN)
if(!signerfile) { {
if (!signerfile)
{
BIO_printf(bio_err, "No signer certificate specified\n"); BIO_printf(bio_err, "No signer certificate specified\n");
badarg = 1; badarg = 1;
} }
need_rand = 1; need_rand = 1;
} else if(operation == SMIME_DECRYPT) { }
if(!recipfile) { else if (operation == SMIME_DECRYPT)
{
if (!recipfile)
{
BIO_printf(bio_err, "No recipient certificate and key specified\n"); BIO_printf(bio_err, "No recipient certificate and key specified\n");
badarg = 1; badarg = 1;
}
} }
} else if(operation == SMIME_ENCRYPT) { else if (operation == SMIME_ENCRYPT)
if(!*args) { {
if (!*args)
{
BIO_printf(bio_err, "No recipient(s) certificate(s) specified\n"); BIO_printf(bio_err, "No recipient(s) certificate(s) specified\n");
badarg = 1; badarg = 1;
} }
need_rand = 1; need_rand = 1;
} else if(!operation) badarg = 1; }
else if (!operation)
badarg = 1;
if (badarg) { if (badarg)
{
BIO_printf (bio_err, "Usage smime [options] cert.pem ...\n"); BIO_printf (bio_err, "Usage smime [options] cert.pem ...\n");
BIO_printf (bio_err, "where options are\n"); BIO_printf (bio_err, "where options are\n");
BIO_printf (bio_err, "-encrypt encrypt message\n"); BIO_printf (bio_err, "-encrypt encrypt message\n");
...@@ -352,121 +458,155 @@ int MAIN(int argc, char **argv) ...@@ -352,121 +458,155 @@ int MAIN(int argc, char **argv)
BIO_printf(bio_err, " the random number generator\n"); BIO_printf(bio_err, " the random number generator\n");
BIO_printf (bio_err, "cert.pem recipient certificate(s) for encryption\n"); BIO_printf (bio_err, "cert.pem recipient certificate(s) for encryption\n");
goto end; goto end;
} }
#ifndef OPENSSL_NO_ENGINE #ifndef OPENSSL_NO_ENGINE
e = setup_engine(bio_err, engine, 0); e = setup_engine(bio_err, engine, 0);
#endif #endif
if(!app_passwd(bio_err, passargin, NULL, &passin, NULL)) { if (!app_passwd(bio_err, passargin, NULL, &passin, NULL))
{
BIO_printf(bio_err, "Error getting password\n"); BIO_printf(bio_err, "Error getting password\n");
goto end; goto end;
} }
if (need_rand) { if (need_rand)
{
app_RAND_load_file(NULL, bio_err, (inrand != NULL)); app_RAND_load_file(NULL, bio_err, (inrand != NULL));
if (inrand != NULL) if (inrand != NULL)
BIO_printf(bio_err,"%ld semi-random bytes loaded\n", BIO_printf(bio_err,"%ld semi-random bytes loaded\n",
app_RAND_load_files(inrand)); app_RAND_load_files(inrand));
} }
ret = 2; ret = 2;
if(operation != SMIME_SIGN) flags &= ~PKCS7_DETACHED; if (operation != SMIME_SIGN)
flags &= ~PKCS7_DETACHED;
if(operation & SMIME_OP) { if (operation & SMIME_OP)
if(flags & PKCS7_BINARY) inmode = "rb"; {
if(outformat == FORMAT_ASN1) outmode = "wb"; if (flags & PKCS7_BINARY)
} else { inmode = "rb";
if(flags & PKCS7_BINARY) outmode = "wb"; if (outformat == FORMAT_ASN1)
if(informat == FORMAT_ASN1) inmode = "rb"; outmode = "wb";
} }
else
{
if (flags & PKCS7_BINARY)
outmode = "wb";
if (informat == FORMAT_ASN1)
inmode = "rb";
}
if(operation == SMIME_ENCRYPT) { if (operation == SMIME_ENCRYPT)
if (!cipher) { {
if (!cipher)
{
#ifndef OPENSSL_NO_RC2 #ifndef OPENSSL_NO_RC2
cipher = EVP_rc2_40_cbc(); cipher = EVP_rc2_40_cbc();
#else #else
BIO_printf(bio_err, "No cipher selected\n"); BIO_printf(bio_err, "No cipher selected\n");
goto end; goto end;
#endif #endif
} }
encerts = sk_X509_new_null(); encerts = sk_X509_new_null();
while (*args) { while (*args)
if(!(cert = load_cert(bio_err,*args,FORMAT_PEM, {
NULL, e, "recipient certificate file"))) { if (!(cert = load_cert(bio_err,*args,FORMAT_PEM,
NULL, e, "recipient certificate file")))
{
#if 0 /* An appropriate message is already printed */ #if 0 /* An appropriate message is already printed */
BIO_printf(bio_err, "Can't read recipient certificate file %s\n", *args); BIO_printf(bio_err, "Can't read recipient certificate file %s\n", *args);
#endif #endif
goto end; goto end;
} }
sk_X509_push(encerts, cert); sk_X509_push(encerts, cert);
cert = NULL; cert = NULL;
args++; args++;
}
} }
}
if(signerfile && (operation == SMIME_SIGN)) { if (signerfile && (operation == SMIME_SIGN))
if(!(signer = load_cert(bio_err,signerfile,FORMAT_PEM, NULL, {
e, "signer certificate"))) { if (!(signer = load_cert(bio_err,signerfile,FORMAT_PEM, NULL,
e, "signer certificate")))
{
#if 0 /* An appropri message has already been printed */ #if 0 /* An appropri message has already been printed */
BIO_printf(bio_err, "Can't read signer certificate file %s\n", signerfile); BIO_printf(bio_err, "Can't read signer certificate file %s\n", signerfile);
#endif #endif
goto end; goto end;
}
} }
}
if(certfile) { if (certfile)
if(!(other = load_certs(bio_err,certfile,FORMAT_PEM, NULL, {
e, "certificate file"))) { if (!(other = load_certs(bio_err,certfile,FORMAT_PEM, NULL,
e, "certificate file")))
{
#if 0 /* An appropriate message has already been printed */ #if 0 /* An appropriate message has already been printed */
BIO_printf(bio_err, "Can't read certificate file %s\n", certfile); BIO_printf(bio_err, "Can't read certificate file %s\n", certfile);
#endif #endif
ERR_print_errors(bio_err); ERR_print_errors(bio_err);
goto end; goto end;
}
} }
}
if(recipfile && (operation == SMIME_DECRYPT)) { if (recipfile && (operation == SMIME_DECRYPT))
if(!(recip = load_cert(bio_err,recipfile,FORMAT_PEM,NULL, {
e, "recipient certificate file"))) { if (!(recip = load_cert(bio_err,recipfile,FORMAT_PEM,NULL,
e, "recipient certificate file")))
{
#if 0 /* An appropriate message has alrady been printed */ #if 0 /* An appropriate message has alrady been printed */
BIO_printf(bio_err, "Can't read recipient certificate file %s\n", recipfile); BIO_printf(bio_err, "Can't read recipient certificate file %s\n", recipfile);
#endif #endif
ERR_print_errors(bio_err); ERR_print_errors(bio_err);
goto end; goto end;
}
} }
}
if(operation == SMIME_DECRYPT) { if (operation == SMIME_DECRYPT)
if(!keyfile) keyfile = recipfile; {
} else if(operation == SMIME_SIGN) { if (!keyfile)
if(!keyfile) keyfile = signerfile; keyfile = recipfile;
} else keyfile = NULL; }
else if (operation == SMIME_SIGN)
{
if (!keyfile)
keyfile = signerfile;
}
else keyfile = NULL;
if(keyfile) { if (keyfile)
{
key = load_key(bio_err, keyfile, keyform, 0, passin, e, key = load_key(bio_err, keyfile, keyform, 0, passin, e,
"signing key file"); "signing key file");
if (!key) { if (!key)
goto end; goto end;
} }
}
if (infile) { if (infile)
if (!(in = BIO_new_file(infile, inmode))) { {
if (!(in = BIO_new_file(infile, inmode)))
{
BIO_printf (bio_err, BIO_printf (bio_err,
"Can't open input file %s\n", infile); "Can't open input file %s\n", infile);
goto end; goto end;
}
} }
} else in = BIO_new_fp(stdin, BIO_NOCLOSE); else
in = BIO_new_fp(stdin, BIO_NOCLOSE);
if (outfile) { if (outfile)
if (!(out = BIO_new_file(outfile, outmode))) { {
if (!(out = BIO_new_file(outfile, outmode)))
{
BIO_printf (bio_err, BIO_printf (bio_err,
"Can't open output file %s\n", outfile); "Can't open output file %s\n", outfile);
goto end; goto end;
}
} }
} else { else
{
out = BIO_new_fp(stdout, BIO_NOCLOSE); out = BIO_new_fp(stdout, BIO_NOCLOSE);
#ifdef OPENSSL_SYS_VMS #ifdef OPENSSL_SYS_VMS
{ {
...@@ -474,21 +614,24 @@ int MAIN(int argc, char **argv) ...@@ -474,21 +614,24 @@ int MAIN(int argc, char **argv)
out = BIO_push(tmpbio, out); out = BIO_push(tmpbio, out);
} }
#endif #endif
} }
if(operation == SMIME_VERIFY) { if (operation == SMIME_VERIFY)
if(!(store = setup_verify(bio_err, CAfile, CApath))) goto end; {
if (!(store = setup_verify(bio_err, CAfile, CApath)))
goto end;
X509_STORE_set_verify_cb_func(store, smime_cb); X509_STORE_set_verify_cb_func(store, smime_cb);
if (vpm) if (vpm)
X509_STORE_set1_param(store, vpm); X509_STORE_set1_param(store, vpm);
} }
ret = 3; ret = 3;
if(operation == SMIME_ENCRYPT) { if (operation == SMIME_ENCRYPT)
p7 = PKCS7_encrypt(encerts, in, cipher, flags); p7 = PKCS7_encrypt(encerts, in, cipher, flags);
} else if(operation == SMIME_SIGN) { else if (operation == SMIME_SIGN)
{
/* If detached data and SMIME output enable partial /* If detached data and SMIME output enable partial
* signing. * signing.
*/ */
...@@ -496,84 +639,104 @@ int MAIN(int argc, char **argv) ...@@ -496,84 +639,104 @@ int MAIN(int argc, char **argv)
flags |= PKCS7_STREAM; flags |= PKCS7_STREAM;
p7 = PKCS7_sign(signer, key, other, in, flags); p7 = PKCS7_sign(signer, key, other, in, flags);
/* Don't need to rewind for partial signing */ /* Don't need to rewind for partial signing */
if (!(flags & PKCS7_STREAM) && (BIO_reset(in) != 0)) { if (!(flags & PKCS7_STREAM) && (BIO_reset(in) != 0))
BIO_printf(bio_err, "Can't rewind input file\n"); {
goto end; BIO_printf(bio_err, "Can't rewind input file\n");
goto end;
}
} }
} else { else
if(informat == FORMAT_SMIME) {
if (informat == FORMAT_SMIME)
p7 = SMIME_read_PKCS7(in, &indata); p7 = SMIME_read_PKCS7(in, &indata);
else if(informat == FORMAT_PEM) else if (informat == FORMAT_PEM)
p7 = PEM_read_bio_PKCS7(in, NULL, NULL, NULL); p7 = PEM_read_bio_PKCS7(in, NULL, NULL, NULL);
else if(informat == FORMAT_ASN1) else if (informat == FORMAT_ASN1)
p7 = d2i_PKCS7_bio(in, NULL); p7 = d2i_PKCS7_bio(in, NULL);
else { else
{
BIO_printf(bio_err, "Bad input format for PKCS#7 file\n"); BIO_printf(bio_err, "Bad input format for PKCS#7 file\n");
goto end; goto end;
} }
if(!p7) { if (!p7)
{
BIO_printf(bio_err, "Error reading S/MIME message\n"); BIO_printf(bio_err, "Error reading S/MIME message\n");
goto end; goto end;
} }
if(contfile) { if (contfile)
{
BIO_free(indata); BIO_free(indata);
if(!(indata = BIO_new_file(contfile, "rb"))) { if (!(indata = BIO_new_file(contfile, "rb")))
{
BIO_printf(bio_err, "Can't read content file %s\n", contfile); BIO_printf(bio_err, "Can't read content file %s\n", contfile);
goto end; goto end;
}
} }
} }
}
if(!p7) { if (!p7)
{
BIO_printf(bio_err, "Error creating PKCS#7 structure\n"); BIO_printf(bio_err, "Error creating PKCS#7 structure\n");
goto end; goto end;
} }
ret = 4; ret = 4;
if(operation == SMIME_DECRYPT) { if (operation == SMIME_DECRYPT)
if(!PKCS7_decrypt(p7, key, recip, out, flags)) { {
if (!PKCS7_decrypt(p7, key, recip, out, flags))
{
BIO_printf(bio_err, "Error decrypting PKCS#7 structure\n"); BIO_printf(bio_err, "Error decrypting PKCS#7 structure\n");
goto end; goto end;
}
} }
} else if(operation == SMIME_VERIFY) { else if (operation == SMIME_VERIFY)
{
STACK_OF(X509) *signers; STACK_OF(X509) *signers;
if(PKCS7_verify(p7, other, store, indata, out, flags)) { if (PKCS7_verify(p7, other, store, indata, out, flags))
BIO_printf(bio_err, "Verification successful\n"); BIO_printf(bio_err, "Verification successful\n");
} else { else
{
BIO_printf(bio_err, "Verification failure\n"); BIO_printf(bio_err, "Verification failure\n");
goto end; goto end;
} }
signers = PKCS7_get0_signers(p7, other, flags); signers = PKCS7_get0_signers(p7, other, flags);
if(!save_certs(signerfile, signers)) { if (!save_certs(signerfile, signers))
{
BIO_printf(bio_err, "Error writing signers to %s\n", BIO_printf(bio_err, "Error writing signers to %s\n",
signerfile); signerfile);
ret = 5; ret = 5;
goto end; goto end;
} }
sk_X509_free(signers); sk_X509_free(signers);
} else if(operation == SMIME_PK7OUT) { }
else if (operation == SMIME_PK7OUT)
PEM_write_bio_PKCS7(out, p7); PEM_write_bio_PKCS7(out, p7);
} else { else
if(to) BIO_printf(out, "To: %s\n", to); {
if(from) BIO_printf(out, "From: %s\n", from); if (to)
if(subject) BIO_printf(out, "Subject: %s\n", subject); BIO_printf(out, "To: %s\n", to);
if(outformat == FORMAT_SMIME) if (from)
BIO_printf(out, "From: %s\n", from);
if (subject)
BIO_printf(out, "Subject: %s\n", subject);
if (outformat == FORMAT_SMIME)
SMIME_write_PKCS7(out, p7, in, flags); SMIME_write_PKCS7(out, p7, in, flags);
else if(outformat == FORMAT_PEM) else if (outformat == FORMAT_PEM)
PEM_write_bio_PKCS7(out,p7); PEM_write_bio_PKCS7(out,p7);
else if(outformat == FORMAT_ASN1) else if (outformat == FORMAT_ASN1)
i2d_PKCS7_bio(out,p7); i2d_PKCS7_bio(out,p7);
else { else
{
BIO_printf(bio_err, "Bad output format for PKCS#7 file\n"); BIO_printf(bio_err, "Bad output format for PKCS#7 file\n");
goto end; goto end;
}
} }
}
ret = 0; ret = 0;
end: end:
if (need_rand) if (need_rand)
app_RAND_write_file(NULL, bio_err); app_RAND_write_file(NULL, bio_err);
if(ret) ERR_print_errors(bio_err); if (ret) ERR_print_errors(bio_err);
sk_X509_pop_free(encerts, X509_free); sk_X509_pop_free(encerts, X509_free);
sk_X509_pop_free(other, X509_free); sk_X509_pop_free(other, X509_free);
if (vpm) if (vpm)
...@@ -587,22 +750,23 @@ end: ...@@ -587,22 +750,23 @@ end:
BIO_free(in); BIO_free(in);
BIO_free(indata); BIO_free(indata);
BIO_free_all(out); BIO_free_all(out);
if(passin) OPENSSL_free(passin); if (passin) OPENSSL_free(passin);
return (ret); return (ret);
} }
static int save_certs(char *signerfile, STACK_OF(X509) *signers) static int save_certs(char *signerfile, STACK_OF(X509) *signers)
{ {
int i; int i;
BIO *tmp; BIO *tmp;
if(!signerfile) return 1; if (!signerfile)
return 1;
tmp = BIO_new_file(signerfile, "w"); tmp = BIO_new_file(signerfile, "w");
if(!tmp) return 0; if (!tmp) return 0;
for(i = 0; i < sk_X509_num(signers); i++) for(i = 0; i < sk_X509_num(signers); i++)
PEM_write_bio_X509(tmp, sk_X509_value(signers, i)); PEM_write_bio_X509(tmp, sk_X509_value(signers, i));
BIO_free(tmp); BIO_free(tmp);
return 1; return 1;
} }
static void nodes_print(BIO *out, char *name, STACK_OF(X509_POLICY_NODE) *nodes) static void nodes_print(BIO *out, char *name, STACK_OF(X509_POLICY_NODE) *nodes)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册