diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/usr.bin/openssl/x509.c | 1161 |
1 files changed, 747 insertions, 414 deletions
diff --git a/src/usr.bin/openssl/x509.c b/src/usr.bin/openssl/x509.c index 14c61261ee..a9155fee36 100644 --- a/src/usr.bin/openssl/x509.c +++ b/src/usr.bin/openssl/x509.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: x509.c,v 1.18 2020/05/10 17:13:31 beck Exp $ */ | 1 | /* $OpenBSD: x509.c,v 1.19 2021/03/24 12:09:16 inoguchi Exp $ */ |
2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
3 | * All rights reserved. | 3 | * All rights reserved. |
4 | * | 4 | * |
@@ -81,69 +81,6 @@ | |||
81 | #define POSTFIX ".srl" | 81 | #define POSTFIX ".srl" |
82 | #define DEF_DAYS 30 | 82 | #define DEF_DAYS 30 |
83 | 83 | ||
84 | static const char *x509_usage[] = { | ||
85 | "usage: x509 args\n", | ||
86 | " -inform arg - input format - default PEM (one of DER, NET or PEM)\n", | ||
87 | " -outform arg - output format - default PEM (one of DER, NET or PEM)\n", | ||
88 | " -keyform arg - private key format - default PEM\n", | ||
89 | " -CAform arg - CA format - default PEM\n", | ||
90 | " -CAkeyform arg - CA key format - default PEM\n", | ||
91 | " -in arg - input file - default stdin\n", | ||
92 | " -out arg - output file - default stdout\n", | ||
93 | " -passin arg - private key password source\n", | ||
94 | " -serial - print serial number value\n", | ||
95 | " -subject_hash - print subject hash value\n", | ||
96 | #ifndef OPENSSL_NO_MD5 | ||
97 | " -subject_hash_old - print old-style (MD5) subject hash value\n", | ||
98 | #endif | ||
99 | " -issuer_hash - print issuer hash value\n", | ||
100 | #ifndef OPENSSL_NO_MD5 | ||
101 | " -issuer_hash_old - print old-style (MD5) issuer hash value\n", | ||
102 | #endif | ||
103 | " -hash - synonym for -subject_hash\n", | ||
104 | " -subject - print subject DN\n", | ||
105 | " -issuer - print issuer DN\n", | ||
106 | " -email - print email address(es)\n", | ||
107 | " -startdate - notBefore field\n", | ||
108 | " -enddate - notAfter field\n", | ||
109 | " -purpose - print out certificate purposes\n", | ||
110 | " -dates - both Before and After dates\n", | ||
111 | " -modulus - print the RSA key modulus\n", | ||
112 | " -pubkey - output the public key\n", | ||
113 | " -fingerprint - print the certificate fingerprint\n", | ||
114 | " -alias - output certificate alias\n", | ||
115 | " -noout - no certificate output\n", | ||
116 | " -ocspid - print OCSP hash values for the subject name and public key\n", | ||
117 | " -ocsp_uri - print OCSP Responder URL(s)\n", | ||
118 | " -trustout - output a \"trusted\" certificate\n", | ||
119 | " -clrtrust - clear all trusted purposes\n", | ||
120 | " -clrreject - clear all rejected purposes\n", | ||
121 | " -addtrust arg - trust certificate for a given purpose\n", | ||
122 | " -addreject arg - reject certificate for a given purpose\n", | ||
123 | " -setalias arg - set certificate alias\n", | ||
124 | " -days arg - How long till expiry of a signed certificate - def 30 days\n", | ||
125 | " -checkend arg - check whether the cert expires in the next arg seconds\n", | ||
126 | " exit 1 if so, 0 if not\n", | ||
127 | " -signkey arg - self sign cert with arg\n", | ||
128 | " -x509toreq - output a certification request object\n", | ||
129 | " -req - input is a certificate request, sign and output.\n", | ||
130 | " -CA arg - set the CA certificate, must be PEM format.\n", | ||
131 | " -CAkey arg - set the CA key, must be PEM format\n", | ||
132 | " missing, it is assumed to be in the CA file.\n", | ||
133 | " -CAcreateserial - create serial number file if it does not exist\n", | ||
134 | " -CAserial arg - serial file\n", | ||
135 | " -set_serial - serial number to use\n", | ||
136 | " -text - print the certificate in text form\n", | ||
137 | " -C - print out C code forms\n", | ||
138 | " -md5/-sha1 - digest to use\n", | ||
139 | " -extfile - configuration file with X509V3 extensions to add\n", | ||
140 | " -extensions - section from config file with X509V3 extensions to add\n", | ||
141 | " -clrext - delete extensions before signing and input certificate\n", | ||
142 | " -nameopt arg - various certificate name options\n", | ||
143 | " -certopt arg - various certificate text options\n", | ||
144 | NULL | ||
145 | }; | ||
146 | |||
147 | static int callb(int ok, X509_STORE_CTX *ctx); | 84 | static int callb(int ok, X509_STORE_CTX *ctx); |
148 | static int sign(X509 *x, EVP_PKEY *pkey, int days, int clrext, | 85 | static int sign(X509 *x, EVP_PKEY *pkey, int days, int clrext, |
149 | const EVP_MD *digest, CONF *conf, char *section); | 86 | const EVP_MD *digest, CONF *conf, char *section); |
@@ -152,7 +89,637 @@ static int x509_certify(X509_STORE *ctx, char *CAfile, const EVP_MD *digest, | |||
152 | char *serial, int create, int days, int clrext, CONF *conf, char *section, | 89 | char *serial, int create, int days, int clrext, CONF *conf, char *section, |
153 | ASN1_INTEGER *sno); | 90 | ASN1_INTEGER *sno); |
154 | static int purpose_print(BIO *bio, X509 *cert, X509_PURPOSE *pt); | 91 | static int purpose_print(BIO *bio, X509 *cert, X509_PURPOSE *pt); |
155 | static int reqfile = 0; | 92 | |
93 | static struct { | ||
94 | char *alias; | ||
95 | int aliasout; | ||
96 | int badops; | ||
97 | int C; | ||
98 | int CA_createserial; | ||
99 | int CA_flag; | ||
100 | char *CAfile; | ||
101 | int CAformat; | ||
102 | char *CAkeyfile; | ||
103 | int CAkeyformat; | ||
104 | char *CAserial; | ||
105 | unsigned long certflag; | ||
106 | int checkend; | ||
107 | int checkoffset; | ||
108 | int clrext; | ||
109 | int clrreject; | ||
110 | int clrtrust; | ||
111 | int days; | ||
112 | const EVP_MD *digest; | ||
113 | int email; | ||
114 | int enddate; | ||
115 | char *extfile; | ||
116 | char *extsect; | ||
117 | int fingerprint; | ||
118 | char *infile; | ||
119 | int informat; | ||
120 | int issuer; | ||
121 | int issuer_hash; | ||
122 | #ifndef OPENSSL_NO_MD5 | ||
123 | int issuer_hash_old; | ||
124 | #endif | ||
125 | char *keyfile; | ||
126 | int keyformat; | ||
127 | const EVP_MD *md_alg; | ||
128 | int modulus; | ||
129 | int next_serial; | ||
130 | unsigned long nmflag; | ||
131 | int noout; | ||
132 | int num; | ||
133 | int ocspid; | ||
134 | ASN1_OBJECT *objtmp; | ||
135 | int ocsp_uri; | ||
136 | char *outfile; | ||
137 | int outformat; | ||
138 | char *passargin; | ||
139 | int pprint; | ||
140 | int pubkey; | ||
141 | STACK_OF(ASN1_OBJECT) *reject; | ||
142 | int reqfile; | ||
143 | int serial; | ||
144 | int sign_flag; | ||
145 | STACK_OF(OPENSSL_STRING) *sigopts; | ||
146 | ASN1_INTEGER *sno; | ||
147 | int startdate; | ||
148 | int subject; | ||
149 | int subject_hash; | ||
150 | #ifndef OPENSSL_NO_MD5 | ||
151 | int subject_hash_old; | ||
152 | #endif | ||
153 | int text; | ||
154 | STACK_OF(ASN1_OBJECT) *trust; | ||
155 | int trustout; | ||
156 | int x509req; | ||
157 | } x509_config; | ||
158 | |||
159 | static int | ||
160 | x509_opt_addreject(char *arg) | ||
161 | { | ||
162 | if ((x509_config.objtmp = OBJ_txt2obj(arg, 0)) == NULL) { | ||
163 | BIO_printf(bio_err, "Invalid reject object value %s\n", arg); | ||
164 | return (1); | ||
165 | } | ||
166 | |||
167 | if (x509_config.reject == NULL && | ||
168 | (x509_config.reject = sk_ASN1_OBJECT_new_null()) == NULL) | ||
169 | return (1); | ||
170 | |||
171 | if (!sk_ASN1_OBJECT_push(x509_config.reject, x509_config.objtmp)) | ||
172 | return (1); | ||
173 | |||
174 | x509_config.trustout = 1; | ||
175 | return (0); | ||
176 | } | ||
177 | |||
178 | static int | ||
179 | x509_opt_addtrust(char *arg) | ||
180 | { | ||
181 | if ((x509_config.objtmp = OBJ_txt2obj(arg, 0)) == NULL) { | ||
182 | BIO_printf(bio_err, "Invalid trust object value %s\n", arg); | ||
183 | return (1); | ||
184 | } | ||
185 | |||
186 | if (x509_config.trust == NULL && | ||
187 | (x509_config.trust = sk_ASN1_OBJECT_new_null()) == NULL) | ||
188 | return (1); | ||
189 | |||
190 | if (!sk_ASN1_OBJECT_push(x509_config.trust, x509_config.objtmp)) | ||
191 | return (1); | ||
192 | |||
193 | x509_config.trustout = 1; | ||
194 | return (0); | ||
195 | } | ||
196 | |||
197 | static int | ||
198 | x509_opt_ca(char *arg) | ||
199 | { | ||
200 | x509_config.CAfile = arg; | ||
201 | x509_config.CA_flag = ++x509_config.num; | ||
202 | return (0); | ||
203 | } | ||
204 | |||
205 | static int | ||
206 | x509_opt_certopt(char *arg) | ||
207 | { | ||
208 | if (!set_cert_ex(&x509_config.certflag, arg)) | ||
209 | return (1); | ||
210 | |||
211 | return (0); | ||
212 | } | ||
213 | |||
214 | static int | ||
215 | x509_opt_checkend(char *arg) | ||
216 | { | ||
217 | const char *errstr; | ||
218 | |||
219 | x509_config.checkoffset = strtonum(arg, 0, INT_MAX, &errstr); | ||
220 | if (errstr != NULL) { | ||
221 | BIO_printf(bio_err, "checkend unusable: %s\n", errstr); | ||
222 | return (1); | ||
223 | } | ||
224 | x509_config.checkend = 1; | ||
225 | return (0); | ||
226 | } | ||
227 | |||
228 | static int | ||
229 | x509_opt_dates(void) | ||
230 | { | ||
231 | x509_config.startdate = ++x509_config.num; | ||
232 | x509_config.enddate = ++x509_config.num; | ||
233 | return (0); | ||
234 | } | ||
235 | |||
236 | static int | ||
237 | x509_opt_days(char *arg) | ||
238 | { | ||
239 | const char *errstr; | ||
240 | |||
241 | x509_config.days = strtonum(arg, 1, INT_MAX, &errstr); | ||
242 | if (errstr != NULL) { | ||
243 | BIO_printf(bio_err, "bad number of days: %s\n", errstr); | ||
244 | return (1); | ||
245 | } | ||
246 | return (0); | ||
247 | } | ||
248 | |||
249 | static int | ||
250 | x509_opt_digest(int argc, char **argv, int *argsused) | ||
251 | { | ||
252 | char *name = argv[0]; | ||
253 | |||
254 | if (*name++ != '-') | ||
255 | return (1); | ||
256 | |||
257 | if ((x509_config.md_alg = EVP_get_digestbyname(name)) != NULL) { | ||
258 | x509_config.digest = x509_config.md_alg; | ||
259 | } else { | ||
260 | BIO_printf(bio_err, "unknown option %s\n", *argv); | ||
261 | x509_config.badops = 1; | ||
262 | return (1); | ||
263 | } | ||
264 | |||
265 | *argsused = 1; | ||
266 | return (0); | ||
267 | } | ||
268 | |||
269 | static int | ||
270 | x509_opt_nameopt(char *arg) | ||
271 | { | ||
272 | if (!set_name_ex(&x509_config.nmflag, arg)) | ||
273 | return (1); | ||
274 | |||
275 | return (0); | ||
276 | } | ||
277 | |||
278 | static int | ||
279 | x509_opt_set_serial(char *arg) | ||
280 | { | ||
281 | ASN1_INTEGER_free(x509_config.sno); | ||
282 | if ((x509_config.sno = s2i_ASN1_INTEGER(NULL, arg)) == NULL) | ||
283 | return (1); | ||
284 | |||
285 | return (0); | ||
286 | } | ||
287 | |||
288 | static int | ||
289 | x509_opt_setalias(char *arg) | ||
290 | { | ||
291 | x509_config.alias = arg; | ||
292 | x509_config.trustout = 1; | ||
293 | return (0); | ||
294 | } | ||
295 | |||
296 | static int | ||
297 | x509_opt_signkey(char *arg) | ||
298 | { | ||
299 | x509_config.keyfile = arg; | ||
300 | x509_config.sign_flag = ++x509_config.num; | ||
301 | return (0); | ||
302 | } | ||
303 | |||
304 | static int | ||
305 | x509_opt_sigopt(char *arg) | ||
306 | { | ||
307 | if (x509_config.sigopts == NULL && | ||
308 | (x509_config.sigopts = sk_OPENSSL_STRING_new_null()) == NULL) | ||
309 | return (1); | ||
310 | |||
311 | if (!sk_OPENSSL_STRING_push(x509_config.sigopts, arg)) | ||
312 | return (1); | ||
313 | |||
314 | return (0); | ||
315 | } | ||
316 | |||
317 | static const struct option x509_options[] = { | ||
318 | { | ||
319 | .name = "C", | ||
320 | .desc = "Convert the certificate into C code", | ||
321 | .type = OPTION_ORDER, | ||
322 | .opt.order = &x509_config.C, | ||
323 | .order = &x509_config.num, | ||
324 | }, | ||
325 | { | ||
326 | .name = "addreject", | ||
327 | .argname = "arg", | ||
328 | .desc = "Reject certificate for a given purpose", | ||
329 | .type = OPTION_ARG_FUNC, | ||
330 | .opt.argfunc = x509_opt_addreject, | ||
331 | }, | ||
332 | { | ||
333 | .name = "addtrust", | ||
334 | .argname = "arg", | ||
335 | .desc = "Trust certificate for a given purpose", | ||
336 | .type = OPTION_ARG_FUNC, | ||
337 | .opt.argfunc = x509_opt_addtrust, | ||
338 | }, | ||
339 | { | ||
340 | .name = "alias", | ||
341 | .desc = "Output certificate alias", | ||
342 | .type = OPTION_ORDER, | ||
343 | .opt.order = &x509_config.aliasout, | ||
344 | .order = &x509_config.num, | ||
345 | }, | ||
346 | { | ||
347 | .name = "CA", | ||
348 | .argname = "file", | ||
349 | .desc = "CA certificate in PEM format unless -CAform is specified", | ||
350 | .type = OPTION_ARG_FUNC, | ||
351 | .opt.argfunc = x509_opt_ca, | ||
352 | }, | ||
353 | { | ||
354 | .name = "CAcreateserial", | ||
355 | .desc = "Create serial number file if it does not exist", | ||
356 | .type = OPTION_ORDER, | ||
357 | .opt.order = &x509_config.CA_createserial, | ||
358 | .order = &x509_config.num, | ||
359 | }, | ||
360 | { | ||
361 | .name = "CAform", | ||
362 | .argname = "fmt", | ||
363 | .desc = "CA format - default PEM", | ||
364 | .type = OPTION_ARG_FORMAT, | ||
365 | .opt.value = &x509_config.CAformat, | ||
366 | }, | ||
367 | { | ||
368 | .name = "CAkey", | ||
369 | .argname = "file", | ||
370 | .desc = "CA key in PEM format unless -CAkeyform is specified\n" | ||
371 | "if omitted, the key is assumed to be in the CA file", | ||
372 | .type = OPTION_ARG, | ||
373 | .opt.arg = &x509_config.CAkeyfile, | ||
374 | }, | ||
375 | { | ||
376 | .name = "CAkeyform", | ||
377 | .argname = "fmt", | ||
378 | .desc = "CA key format - default PEM", | ||
379 | .type = OPTION_ARG_FORMAT, | ||
380 | .opt.value = &x509_config.CAkeyformat, | ||
381 | }, | ||
382 | { | ||
383 | .name = "CAserial", | ||
384 | .argname = "file", | ||
385 | .desc = "Serial file", | ||
386 | .type = OPTION_ARG, | ||
387 | .opt.arg = &x509_config.CAserial, | ||
388 | }, | ||
389 | { | ||
390 | .name = "certopt", | ||
391 | .argname = "option", | ||
392 | .desc = "Various certificate text options", | ||
393 | .type = OPTION_ARG_FUNC, | ||
394 | .opt.argfunc = x509_opt_certopt, | ||
395 | }, | ||
396 | { | ||
397 | .name = "checkend", | ||
398 | .argname = "arg", | ||
399 | .desc = "Check whether the cert expires in the next arg seconds\n" | ||
400 | "exit 1 if so, 0 if not", | ||
401 | .type = OPTION_ARG_FUNC, | ||
402 | .opt.argfunc = x509_opt_checkend, | ||
403 | }, | ||
404 | { | ||
405 | .name = "clrext", | ||
406 | .desc = "Clear all extensions", | ||
407 | .type = OPTION_FLAG, | ||
408 | .opt.flag = &x509_config.clrext, | ||
409 | }, | ||
410 | { | ||
411 | .name = "clrreject", | ||
412 | .desc = "Clear all rejected purposes", | ||
413 | .type = OPTION_ORDER, | ||
414 | .opt.order = &x509_config.clrreject, | ||
415 | .order = &x509_config.num, | ||
416 | }, | ||
417 | { | ||
418 | .name = "clrtrust", | ||
419 | .desc = "Clear all trusted purposes", | ||
420 | .type = OPTION_ORDER, | ||
421 | .opt.order = &x509_config.clrtrust, | ||
422 | .order = &x509_config.num, | ||
423 | }, | ||
424 | { | ||
425 | .name = "dates", | ||
426 | .desc = "Both Before and After dates", | ||
427 | .type = OPTION_FUNC, | ||
428 | .opt.func = x509_opt_dates, | ||
429 | }, | ||
430 | { | ||
431 | .name = "days", | ||
432 | .argname = "arg", | ||
433 | .desc = "How long till expiry of a signed certificate - def 30 days", | ||
434 | .type = OPTION_ARG_FUNC, | ||
435 | .opt.argfunc = x509_opt_days, | ||
436 | }, | ||
437 | { | ||
438 | .name = "email", | ||
439 | .desc = "Print email address(es)", | ||
440 | .type = OPTION_ORDER, | ||
441 | .opt.order = &x509_config.email, | ||
442 | .order = &x509_config.num, | ||
443 | }, | ||
444 | { | ||
445 | .name = "enddate", | ||
446 | .desc = "Print notAfter field", | ||
447 | .type = OPTION_ORDER, | ||
448 | .opt.order = &x509_config.enddate, | ||
449 | .order = &x509_config.num, | ||
450 | }, | ||
451 | { | ||
452 | .name = "extensions", | ||
453 | .argname = "section", | ||
454 | .desc = "Section from config file with X509V3 extensions to add", | ||
455 | .type = OPTION_ARG, | ||
456 | .opt.arg = &x509_config.extsect, | ||
457 | }, | ||
458 | { | ||
459 | .name = "extfile", | ||
460 | .argname = "file", | ||
461 | .desc = "Configuration file with X509V3 extensions to add", | ||
462 | .type = OPTION_ARG, | ||
463 | .opt.arg = &x509_config.extfile, | ||
464 | }, | ||
465 | { | ||
466 | .name = "fingerprint", | ||
467 | .desc = "Print the certificate fingerprint", | ||
468 | .type = OPTION_ORDER, | ||
469 | .opt.order = &x509_config.fingerprint, | ||
470 | .order = &x509_config.num, | ||
471 | }, | ||
472 | { | ||
473 | .name = "hash", | ||
474 | .desc = "Synonym for -subject_hash", | ||
475 | .type = OPTION_ORDER, | ||
476 | .opt.order = &x509_config.subject_hash, | ||
477 | .order = &x509_config.num, | ||
478 | }, | ||
479 | { | ||
480 | .name = "in", | ||
481 | .argname = "file", | ||
482 | .desc = "Input file - default stdin", | ||
483 | .type = OPTION_ARG, | ||
484 | .opt.arg = &x509_config.infile, | ||
485 | }, | ||
486 | { | ||
487 | .name = "inform", | ||
488 | .argname = "fmt", | ||
489 | .desc = "Input format - default PEM (one of DER, NET or PEM)", | ||
490 | .type = OPTION_ARG_FORMAT, | ||
491 | .opt.value = &x509_config.informat, | ||
492 | }, | ||
493 | { | ||
494 | .name = "issuer", | ||
495 | .desc = "Print issuer name", | ||
496 | .type = OPTION_ORDER, | ||
497 | .opt.order = &x509_config.issuer, | ||
498 | .order = &x509_config.num, | ||
499 | }, | ||
500 | { | ||
501 | .name = "issuer_hash", | ||
502 | .desc = "Print issuer hash value", | ||
503 | .type = OPTION_ORDER, | ||
504 | .opt.order = &x509_config.issuer_hash, | ||
505 | .order = &x509_config.num, | ||
506 | }, | ||
507 | #ifndef OPENSSL_NO_MD5 | ||
508 | { | ||
509 | .name = "issuer_hash_old", | ||
510 | .desc = "Print old-style (MD5) issuer hash value", | ||
511 | .type = OPTION_ORDER, | ||
512 | .opt.order = &x509_config.issuer_hash_old, | ||
513 | .order = &x509_config.num, | ||
514 | }, | ||
515 | #endif | ||
516 | { | ||
517 | .name = "keyform", | ||
518 | .argname = "fmt", | ||
519 | .desc = "Private key format - default PEM", | ||
520 | .type = OPTION_ARG_FORMAT, | ||
521 | .opt.value = &x509_config.keyformat, | ||
522 | }, | ||
523 | { | ||
524 | .name = "modulus", | ||
525 | .desc = "Print the RSA key modulus", | ||
526 | .type = OPTION_ORDER, | ||
527 | .opt.order = &x509_config.modulus, | ||
528 | .order = &x509_config.num, | ||
529 | }, | ||
530 | { | ||
531 | .name = "nameopt", | ||
532 | .argname = "option", | ||
533 | .desc = "Various certificate name options", | ||
534 | .type = OPTION_ARG_FUNC, | ||
535 | .opt.argfunc = x509_opt_nameopt, | ||
536 | }, | ||
537 | { | ||
538 | .name = "next_serial", | ||
539 | .desc = "Print the next serial number", | ||
540 | .type = OPTION_ORDER, | ||
541 | .opt.order = &x509_config.next_serial, | ||
542 | .order = &x509_config.num, | ||
543 | }, | ||
544 | { | ||
545 | .name = "noout", | ||
546 | .desc = "No certificate output", | ||
547 | .type = OPTION_ORDER, | ||
548 | .opt.order = &x509_config.noout, | ||
549 | .order = &x509_config.num, | ||
550 | }, | ||
551 | { | ||
552 | .name = "ocsp_uri", | ||
553 | .desc = "Print OCSP Responder URL(s)", | ||
554 | .type = OPTION_ORDER, | ||
555 | .opt.order = &x509_config.ocsp_uri, | ||
556 | .order = &x509_config.num, | ||
557 | }, | ||
558 | { | ||
559 | .name = "ocspid", | ||
560 | .desc = "Print OCSP hash values for the subject name and public key", | ||
561 | .type = OPTION_ORDER, | ||
562 | .opt.order = &x509_config.ocspid, | ||
563 | .order = &x509_config.num, | ||
564 | }, | ||
565 | { | ||
566 | .name = "out", | ||
567 | .argname = "file", | ||
568 | .desc = "Output file - default stdout", | ||
569 | .type = OPTION_ARG, | ||
570 | .opt.arg = &x509_config.outfile, | ||
571 | }, | ||
572 | { | ||
573 | .name = "outform", | ||
574 | .argname = "fmt", | ||
575 | .desc = "Output format - default PEM (one of DER, NET or PEM)", | ||
576 | .type = OPTION_ARG_FORMAT, | ||
577 | .opt.value = &x509_config.outformat, | ||
578 | }, | ||
579 | { | ||
580 | .name = "passin", | ||
581 | .argname = "src", | ||
582 | .desc = "Private key password source", | ||
583 | .type = OPTION_ARG, | ||
584 | .opt.arg = &x509_config.passargin, | ||
585 | }, | ||
586 | { | ||
587 | .name = "pubkey", | ||
588 | .desc = "Output the public key", | ||
589 | .type = OPTION_ORDER, | ||
590 | .opt.order = &x509_config.pubkey, | ||
591 | .order = &x509_config.num, | ||
592 | }, | ||
593 | { | ||
594 | .name = "purpose", | ||
595 | .desc = "Print out certificate purposes", | ||
596 | .type = OPTION_ORDER, | ||
597 | .opt.order = &x509_config.pprint, | ||
598 | .order = &x509_config.num, | ||
599 | }, | ||
600 | { | ||
601 | .name = "req", | ||
602 | .desc = "Input is a certificate request, sign and output", | ||
603 | .type = OPTION_FLAG, | ||
604 | .opt.flag = &x509_config.reqfile, | ||
605 | }, | ||
606 | { | ||
607 | .name = "serial", | ||
608 | .desc = "Print serial number value", | ||
609 | .type = OPTION_ORDER, | ||
610 | .opt.order = &x509_config.serial, | ||
611 | .order = &x509_config.num, | ||
612 | }, | ||
613 | { | ||
614 | .name = "set_serial", | ||
615 | .argname = "n", | ||
616 | .desc = "Serial number to use", | ||
617 | .type = OPTION_ARG_FUNC, | ||
618 | .opt.argfunc = x509_opt_set_serial, | ||
619 | }, | ||
620 | { | ||
621 | .name = "setalias", | ||
622 | .argname = "arg", | ||
623 | .desc = "Set certificate alias", | ||
624 | .type = OPTION_ARG_FUNC, | ||
625 | .opt.argfunc = x509_opt_setalias, | ||
626 | }, | ||
627 | { | ||
628 | .name = "signkey", | ||
629 | .argname = "file", | ||
630 | .desc = "Self sign cert with arg", | ||
631 | .type = OPTION_ARG_FUNC, | ||
632 | .opt.argfunc = x509_opt_signkey, | ||
633 | }, | ||
634 | { | ||
635 | .name = "sigopt", | ||
636 | .argname = "nm:v", | ||
637 | .desc = "Various signature algorithm options", | ||
638 | .type = OPTION_ARG_FUNC, | ||
639 | .opt.argfunc = x509_opt_sigopt, | ||
640 | }, | ||
641 | { | ||
642 | .name = "startdate", | ||
643 | .desc = "Print notBefore field", | ||
644 | .type = OPTION_ORDER, | ||
645 | .opt.order = &x509_config.startdate, | ||
646 | .order = &x509_config.num, | ||
647 | }, | ||
648 | { | ||
649 | .name = "subject", | ||
650 | .desc = "Print subject name", | ||
651 | .type = OPTION_ORDER, | ||
652 | .opt.order = &x509_config.subject, | ||
653 | .order = &x509_config.num, | ||
654 | }, | ||
655 | { | ||
656 | .name = "subject_hash", | ||
657 | .desc = "Print subject hash value", | ||
658 | .type = OPTION_ORDER, | ||
659 | .opt.order = &x509_config.subject_hash, | ||
660 | .order = &x509_config.num, | ||
661 | }, | ||
662 | #ifndef OPENSSL_NO_MD5 | ||
663 | { | ||
664 | .name = "subject_hash_old", | ||
665 | .desc = "Print old-style (MD5) subject hash value", | ||
666 | .type = OPTION_ORDER, | ||
667 | .opt.order = &x509_config.subject_hash_old, | ||
668 | .order = &x509_config.num, | ||
669 | }, | ||
670 | #endif | ||
671 | { | ||
672 | .name = "text", | ||
673 | .desc = "Print the certificate in text form", | ||
674 | .type = OPTION_ORDER, | ||
675 | .opt.order = &x509_config.text, | ||
676 | .order = &x509_config.num, | ||
677 | }, | ||
678 | { | ||
679 | .name = "trustout", | ||
680 | .desc = "Output a trusted certificate", | ||
681 | .type = OPTION_FLAG, | ||
682 | .opt.flag = &x509_config.trustout, | ||
683 | }, | ||
684 | { | ||
685 | .name = "x509toreq", | ||
686 | .desc = "Output a certification request object", | ||
687 | .type = OPTION_ORDER, | ||
688 | .opt.order = &x509_config.x509req, | ||
689 | .order = &x509_config.num, | ||
690 | }, | ||
691 | { | ||
692 | .name = NULL, | ||
693 | .desc = "", | ||
694 | .type = OPTION_ARGV_FUNC, | ||
695 | .opt.argvfunc = x509_opt_digest, | ||
696 | }, | ||
697 | { NULL }, | ||
698 | }; | ||
699 | |||
700 | static void | ||
701 | x509_usage(void) | ||
702 | { | ||
703 | fprintf(stderr, "usage: x509 " | ||
704 | "[-C] [-addreject arg] [-addtrust arg] [-alias] [-CA file]\n" | ||
705 | " [-CAcreateserial] [-CAform der | pem] [-CAkey file]\n" | ||
706 | " [-CAkeyform der | pem] [-CAserial file] [-certopt option]\n" | ||
707 | " [-checkend arg] [-clrext] [-clrreject] [-clrtrust] [-dates]\n" | ||
708 | " [-days arg] [-email] [-enddate] [-extensions section]\n" | ||
709 | " [-extfile file] [-fingerprint] [-hash] [-in file]\n" | ||
710 | " [-inform der | net | pem] [-issuer] [-issuer_hash]\n" | ||
711 | " [-issuer_hash_old] [-keyform der | pem] [-md5 | -sha1]\n" | ||
712 | " [-modulus] [-nameopt option] [-next_serial] [-noout]\n" | ||
713 | " [-ocsp_uri] [-ocspid] [-out file]\n" | ||
714 | " [-outform der | net | pem] [-passin arg] [-pubkey]\n" | ||
715 | " [-purpose] [-req] [-serial] [-set_serial n] [-setalias arg]\n" | ||
716 | " [-signkey file] [-sigopt nm:v] [-startdate] [-subject]\n" | ||
717 | " [-subject_hash] [-subject_hash_old] [-text] [-trustout]\n" | ||
718 | " [-x509toreq]\n"); | ||
719 | fprintf(stderr, "\n"); | ||
720 | options_usage(x509_options); | ||
721 | fprintf(stderr, "\n"); | ||
722 | } | ||
156 | 723 | ||
157 | int | 724 | int |
158 | x509_main(int argc, char **argv) | 725 | x509_main(int argc, char **argv) |
@@ -160,43 +727,15 @@ x509_main(int argc, char **argv) | |||
160 | int ret = 1; | 727 | int ret = 1; |
161 | X509_REQ *req = NULL; | 728 | X509_REQ *req = NULL; |
162 | X509 *x = NULL, *xca = NULL; | 729 | X509 *x = NULL, *xca = NULL; |
163 | ASN1_OBJECT *objtmp; | ||
164 | STACK_OF(OPENSSL_STRING) *sigopts = NULL; | ||
165 | EVP_PKEY *Upkey = NULL, *CApkey = NULL; | 730 | EVP_PKEY *Upkey = NULL, *CApkey = NULL; |
166 | ASN1_INTEGER *sno = NULL; | 731 | int i; |
167 | int i, num, badops = 0; | ||
168 | BIO *out = NULL; | 732 | BIO *out = NULL; |
169 | BIO *STDout = NULL; | 733 | BIO *STDout = NULL; |
170 | STACK_OF(ASN1_OBJECT) *trust = NULL, *reject = NULL; | ||
171 | int informat, outformat, keyformat, CAformat, CAkeyformat; | ||
172 | char *infile = NULL, *outfile = NULL, *keyfile = NULL, *CAfile = NULL; | ||
173 | char *CAkeyfile = NULL, *CAserial = NULL; | ||
174 | char *alias = NULL; | ||
175 | int text = 0, serial = 0, subject = 0, issuer = 0, startdate = 0, | ||
176 | enddate = 0; | ||
177 | int next_serial = 0; | ||
178 | int subject_hash = 0, issuer_hash = 0, ocspid = 0; | ||
179 | #ifndef OPENSSL_NO_MD5 | ||
180 | int subject_hash_old = 0, issuer_hash_old = 0; | ||
181 | #endif | ||
182 | int noout = 0, sign_flag = 0, CA_flag = 0, CA_createserial = 0, | ||
183 | email = 0; | ||
184 | int ocsp_uri = 0; | ||
185 | int trustout = 0, clrtrust = 0, clrreject = 0, aliasout = 0, clrext = 0; | ||
186 | int C = 0; | ||
187 | int x509req = 0, days = DEF_DAYS, modulus = 0, pubkey = 0; | ||
188 | int pprint = 0; | ||
189 | const char **pp; | ||
190 | X509_STORE *ctx = NULL; | 734 | X509_STORE *ctx = NULL; |
191 | X509_REQ *rq = NULL; | 735 | X509_REQ *rq = NULL; |
192 | int fingerprint = 0; | ||
193 | char buf[256]; | 736 | char buf[256]; |
194 | const EVP_MD *md_alg, *digest = NULL; | ||
195 | CONF *extconf = NULL; | 737 | CONF *extconf = NULL; |
196 | char *extsect = NULL, *extfile = NULL, *passin = NULL, *passargin = NULL; | 738 | char *passin = NULL; |
197 | int checkend = 0, checkoffset = 0; | ||
198 | unsigned long nmflag = 0, certflag = 0; | ||
199 | const char *errstr = NULL; | ||
200 | 739 | ||
201 | if (single_execution) { | 740 | if (single_execution) { |
202 | if (pledge("stdio cpath wpath rpath tty", NULL) == -1) { | 741 | if (pledge("stdio cpath wpath rpath tty", NULL) == -1) { |
@@ -205,237 +744,31 @@ x509_main(int argc, char **argv) | |||
205 | } | 744 | } |
206 | } | 745 | } |
207 | 746 | ||
208 | reqfile = 0; | 747 | memset(&x509_config, 0, sizeof(x509_config)); |
748 | x509_config.days = DEF_DAYS; | ||
749 | x509_config.informat = FORMAT_PEM; | ||
750 | x509_config.outformat = FORMAT_PEM; | ||
751 | x509_config.keyformat = FORMAT_PEM; | ||
752 | x509_config.CAformat = FORMAT_PEM; | ||
753 | x509_config.CAkeyformat = FORMAT_PEM; | ||
209 | 754 | ||
210 | STDout = BIO_new_fp(stdout, BIO_NOCLOSE); | 755 | STDout = BIO_new_fp(stdout, BIO_NOCLOSE); |
211 | 756 | ||
212 | informat = FORMAT_PEM; | ||
213 | outformat = FORMAT_PEM; | ||
214 | keyformat = FORMAT_PEM; | ||
215 | CAformat = FORMAT_PEM; | ||
216 | CAkeyformat = FORMAT_PEM; | ||
217 | |||
218 | ctx = X509_STORE_new(); | 757 | ctx = X509_STORE_new(); |
219 | if (ctx == NULL) | 758 | if (ctx == NULL) |
220 | goto end; | 759 | goto end; |
221 | X509_STORE_set_verify_cb(ctx, callb); | 760 | X509_STORE_set_verify_cb(ctx, callb); |
222 | 761 | ||
223 | argc--; | 762 | if (options_parse(argc, argv, x509_options, NULL, NULL) != 0) |
224 | argv++; | 763 | goto bad; |
225 | num = 0; | ||
226 | while (argc >= 1) { | ||
227 | if (strcmp(*argv, "-inform") == 0) { | ||
228 | if (--argc < 1) | ||
229 | goto bad; | ||
230 | informat = str2fmt(*(++argv)); | ||
231 | } else if (strcmp(*argv, "-outform") == 0) { | ||
232 | if (--argc < 1) | ||
233 | goto bad; | ||
234 | outformat = str2fmt(*(++argv)); | ||
235 | } else if (strcmp(*argv, "-keyform") == 0) { | ||
236 | if (--argc < 1) | ||
237 | goto bad; | ||
238 | keyformat = str2fmt(*(++argv)); | ||
239 | } else if (strcmp(*argv, "-req") == 0) { | ||
240 | reqfile = 1; | ||
241 | } else if (strcmp(*argv, "-CAform") == 0) { | ||
242 | if (--argc < 1) | ||
243 | goto bad; | ||
244 | CAformat = str2fmt(*(++argv)); | ||
245 | } else if (strcmp(*argv, "-CAkeyform") == 0) { | ||
246 | if (--argc < 1) | ||
247 | goto bad; | ||
248 | CAkeyformat = str2fmt(*(++argv)); | ||
249 | } else if (strcmp(*argv, "-sigopt") == 0) { | ||
250 | if (--argc < 1) | ||
251 | goto bad; | ||
252 | if (!sigopts) | ||
253 | sigopts = sk_OPENSSL_STRING_new_null(); | ||
254 | if (!sigopts || !sk_OPENSSL_STRING_push(sigopts, *(++argv))) | ||
255 | goto bad; | ||
256 | } else if (strcmp(*argv, "-days") == 0) { | ||
257 | if (--argc < 1) | ||
258 | goto bad; | ||
259 | days = strtonum(*(++argv), 1, INT_MAX, &errstr); | ||
260 | if (errstr) { | ||
261 | BIO_printf(bio_err, "bad number of days: %s\n", errstr); | ||
262 | goto bad; | ||
263 | } | ||
264 | } else if (strcmp(*argv, "-passin") == 0) { | ||
265 | if (--argc < 1) | ||
266 | goto bad; | ||
267 | passargin = *(++argv); | ||
268 | } else if (strcmp(*argv, "-extfile") == 0) { | ||
269 | if (--argc < 1) | ||
270 | goto bad; | ||
271 | extfile = *(++argv); | ||
272 | } else if (strcmp(*argv, "-extensions") == 0) { | ||
273 | if (--argc < 1) | ||
274 | goto bad; | ||
275 | extsect = *(++argv); | ||
276 | } else if (strcmp(*argv, "-in") == 0) { | ||
277 | if (--argc < 1) | ||
278 | goto bad; | ||
279 | infile = *(++argv); | ||
280 | } else if (strcmp(*argv, "-out") == 0) { | ||
281 | if (--argc < 1) | ||
282 | goto bad; | ||
283 | outfile = *(++argv); | ||
284 | } else if (strcmp(*argv, "-signkey") == 0) { | ||
285 | if (--argc < 1) | ||
286 | goto bad; | ||
287 | keyfile = *(++argv); | ||
288 | sign_flag = ++num; | ||
289 | } else if (strcmp(*argv, "-CA") == 0) { | ||
290 | if (--argc < 1) | ||
291 | goto bad; | ||
292 | CAfile = *(++argv); | ||
293 | CA_flag = ++num; | ||
294 | } else if (strcmp(*argv, "-CAkey") == 0) { | ||
295 | if (--argc < 1) | ||
296 | goto bad; | ||
297 | CAkeyfile = *(++argv); | ||
298 | } else if (strcmp(*argv, "-CAserial") == 0) { | ||
299 | if (--argc < 1) | ||
300 | goto bad; | ||
301 | CAserial = *(++argv); | ||
302 | } else if (strcmp(*argv, "-set_serial") == 0) { | ||
303 | if (--argc < 1) | ||
304 | goto bad; | ||
305 | ASN1_INTEGER_free(sno); | ||
306 | if (!(sno = s2i_ASN1_INTEGER(NULL, *(++argv)))) | ||
307 | goto bad; | ||
308 | } else if (strcmp(*argv, "-addtrust") == 0) { | ||
309 | if (--argc < 1) | ||
310 | goto bad; | ||
311 | if (!(objtmp = OBJ_txt2obj(*(++argv), 0))) { | ||
312 | BIO_printf(bio_err, | ||
313 | "Invalid trust object value %s\n", *argv); | ||
314 | goto bad; | ||
315 | } | ||
316 | if (!trust) | ||
317 | trust = sk_ASN1_OBJECT_new_null(); | ||
318 | sk_ASN1_OBJECT_push(trust, objtmp); | ||
319 | trustout = 1; | ||
320 | } else if (strcmp(*argv, "-addreject") == 0) { | ||
321 | if (--argc < 1) | ||
322 | goto bad; | ||
323 | if (!(objtmp = OBJ_txt2obj(*(++argv), 0))) { | ||
324 | BIO_printf(bio_err, | ||
325 | "Invalid reject object value %s\n", *argv); | ||
326 | goto bad; | ||
327 | } | ||
328 | if (!reject) | ||
329 | reject = sk_ASN1_OBJECT_new_null(); | ||
330 | sk_ASN1_OBJECT_push(reject, objtmp); | ||
331 | trustout = 1; | ||
332 | } else if (strcmp(*argv, "-setalias") == 0) { | ||
333 | if (--argc < 1) | ||
334 | goto bad; | ||
335 | alias = *(++argv); | ||
336 | trustout = 1; | ||
337 | } else if (strcmp(*argv, "-certopt") == 0) { | ||
338 | if (--argc < 1) | ||
339 | goto bad; | ||
340 | if (!set_cert_ex(&certflag, *(++argv))) | ||
341 | goto bad; | ||
342 | } else if (strcmp(*argv, "-nameopt") == 0) { | ||
343 | if (--argc < 1) | ||
344 | goto bad; | ||
345 | if (!set_name_ex(&nmflag, *(++argv))) | ||
346 | goto bad; | ||
347 | } | ||
348 | else if (strcmp(*argv, "-C") == 0) | ||
349 | C = ++num; | ||
350 | else if (strcmp(*argv, "-email") == 0) | ||
351 | email = ++num; | ||
352 | else if (strcmp(*argv, "-ocsp_uri") == 0) | ||
353 | ocsp_uri = ++num; | ||
354 | else if (strcmp(*argv, "-serial") == 0) | ||
355 | serial = ++num; | ||
356 | else if (strcmp(*argv, "-next_serial") == 0) | ||
357 | next_serial = ++num; | ||
358 | else if (strcmp(*argv, "-modulus") == 0) | ||
359 | modulus = ++num; | ||
360 | else if (strcmp(*argv, "-pubkey") == 0) | ||
361 | pubkey = ++num; | ||
362 | else if (strcmp(*argv, "-x509toreq") == 0) | ||
363 | x509req = ++num; | ||
364 | else if (strcmp(*argv, "-text") == 0) | ||
365 | text = ++num; | ||
366 | else if (strcmp(*argv, "-hash") == 0 || | ||
367 | strcmp(*argv, "-subject_hash") == 0) | ||
368 | subject_hash = ++num; | ||
369 | #ifndef OPENSSL_NO_MD5 | ||
370 | else if (strcmp(*argv, "-subject_hash_old") == 0) | ||
371 | subject_hash_old = ++num; | ||
372 | #endif | ||
373 | else if (strcmp(*argv, "-issuer_hash") == 0) | ||
374 | issuer_hash = ++num; | ||
375 | #ifndef OPENSSL_NO_MD5 | ||
376 | else if (strcmp(*argv, "-issuer_hash_old") == 0) | ||
377 | issuer_hash_old = ++num; | ||
378 | #endif | ||
379 | else if (strcmp(*argv, "-subject") == 0) | ||
380 | subject = ++num; | ||
381 | else if (strcmp(*argv, "-issuer") == 0) | ||
382 | issuer = ++num; | ||
383 | else if (strcmp(*argv, "-fingerprint") == 0) | ||
384 | fingerprint = ++num; | ||
385 | else if (strcmp(*argv, "-dates") == 0) { | ||
386 | startdate = ++num; | ||
387 | enddate = ++num; | ||
388 | } else if (strcmp(*argv, "-purpose") == 0) | ||
389 | pprint = ++num; | ||
390 | else if (strcmp(*argv, "-startdate") == 0) | ||
391 | startdate = ++num; | ||
392 | else if (strcmp(*argv, "-enddate") == 0) | ||
393 | enddate = ++num; | ||
394 | else if (strcmp(*argv, "-checkend") == 0) { | ||
395 | if (--argc < 1) | ||
396 | goto bad; | ||
397 | checkoffset = strtonum(*(++argv), 0, INT_MAX, &errstr); | ||
398 | if (errstr) { | ||
399 | BIO_printf(bio_err, "checkend unusable: %s\n", errstr); | ||
400 | goto bad; | ||
401 | } | ||
402 | checkend = 1; | ||
403 | } else if (strcmp(*argv, "-noout") == 0) | ||
404 | noout = ++num; | ||
405 | else if (strcmp(*argv, "-trustout") == 0) | ||
406 | trustout = 1; | ||
407 | else if (strcmp(*argv, "-clrtrust") == 0) | ||
408 | clrtrust = ++num; | ||
409 | else if (strcmp(*argv, "-clrreject") == 0) | ||
410 | clrreject = ++num; | ||
411 | else if (strcmp(*argv, "-alias") == 0) | ||
412 | aliasout = ++num; | ||
413 | else if (strcmp(*argv, "-CAcreateserial") == 0) | ||
414 | CA_createserial = ++num; | ||
415 | else if (strcmp(*argv, "-clrext") == 0) | ||
416 | clrext = 1; | ||
417 | else if (strcmp(*argv, "-ocspid") == 0) | ||
418 | ocspid = ++num; | ||
419 | else if ((md_alg = EVP_get_digestbyname(*argv + 1))) { | ||
420 | /* ok */ | ||
421 | digest = md_alg; | ||
422 | } else { | ||
423 | BIO_printf(bio_err, "unknown option %s\n", *argv); | ||
424 | badops = 1; | ||
425 | break; | ||
426 | } | ||
427 | argc--; | ||
428 | argv++; | ||
429 | } | ||
430 | 764 | ||
431 | if (badops) { | 765 | if (x509_config.badops) { |
432 | bad: | 766 | bad: |
433 | for (pp = x509_usage; (*pp != NULL); pp++) | 767 | x509_usage(); |
434 | BIO_printf(bio_err, "%s", *pp); | ||
435 | goto end; | 768 | goto end; |
436 | } | 769 | } |
437 | 770 | ||
438 | if (!app_passwd(bio_err, passargin, NULL, &passin, NULL)) { | 771 | if (!app_passwd(bio_err, x509_config.passargin, NULL, &passin, NULL)) { |
439 | BIO_printf(bio_err, "Error getting password\n"); | 772 | BIO_printf(bio_err, "Error getting password\n"); |
440 | goto end; | 773 | goto end; |
441 | } | 774 | } |
@@ -443,51 +776,51 @@ x509_main(int argc, char **argv) | |||
443 | ERR_print_errors(bio_err); | 776 | ERR_print_errors(bio_err); |
444 | goto end; | 777 | goto end; |
445 | } | 778 | } |
446 | if ((CAkeyfile == NULL) && (CA_flag) && (CAformat == FORMAT_PEM)) { | 779 | if ((x509_config.CAkeyfile == NULL) && (x509_config.CA_flag) && (x509_config.CAformat == FORMAT_PEM)) { |
447 | CAkeyfile = CAfile; | 780 | x509_config.CAkeyfile = x509_config.CAfile; |
448 | } else if ((CA_flag) && (CAkeyfile == NULL)) { | 781 | } else if ((x509_config.CA_flag) && (x509_config.CAkeyfile == NULL)) { |
449 | BIO_printf(bio_err, | 782 | BIO_printf(bio_err, |
450 | "need to specify a CAkey if using the CA command\n"); | 783 | "need to specify a CAkey if using the CA command\n"); |
451 | goto end; | 784 | goto end; |
452 | } | 785 | } |
453 | if (extfile) { | 786 | if (x509_config.extfile) { |
454 | long errorline = -1; | 787 | long errorline = -1; |
455 | X509V3_CTX ctx2; | 788 | X509V3_CTX ctx2; |
456 | extconf = NCONF_new(NULL); | 789 | extconf = NCONF_new(NULL); |
457 | if (!NCONF_load(extconf, extfile, &errorline)) { | 790 | if (!NCONF_load(extconf, x509_config.extfile, &errorline)) { |
458 | if (errorline <= 0) | 791 | if (errorline <= 0) |
459 | BIO_printf(bio_err, | 792 | BIO_printf(bio_err, |
460 | "error loading the config file '%s'\n", | 793 | "error loading the config file '%s'\n", |
461 | extfile); | 794 | x509_config.extfile); |
462 | else | 795 | else |
463 | BIO_printf(bio_err, | 796 | BIO_printf(bio_err, |
464 | "error on line %ld of config file '%s'\n", | 797 | "error on line %ld of config file '%s'\n", |
465 | errorline, extfile); | 798 | errorline, x509_config.extfile); |
466 | goto end; | 799 | goto end; |
467 | } | 800 | } |
468 | if (!extsect) { | 801 | if (!x509_config.extsect) { |
469 | extsect = NCONF_get_string(extconf, "default", | 802 | x509_config.extsect = NCONF_get_string(extconf, "default", |
470 | "extensions"); | 803 | "extensions"); |
471 | if (!extsect) { | 804 | if (!x509_config.extsect) { |
472 | ERR_clear_error(); | 805 | ERR_clear_error(); |
473 | extsect = "default"; | 806 | x509_config.extsect = "default"; |
474 | } | 807 | } |
475 | } | 808 | } |
476 | X509V3_set_ctx_test(&ctx2); | 809 | X509V3_set_ctx_test(&ctx2); |
477 | X509V3_set_nconf(&ctx2, extconf); | 810 | X509V3_set_nconf(&ctx2, extconf); |
478 | if (!X509V3_EXT_add_nconf(extconf, &ctx2, extsect, NULL)) { | 811 | if (!X509V3_EXT_add_nconf(extconf, &ctx2, x509_config.extsect, NULL)) { |
479 | BIO_printf(bio_err, | 812 | BIO_printf(bio_err, |
480 | "Error Loading extension section %s\n", | 813 | "Error Loading extension section %s\n", |
481 | extsect); | 814 | x509_config.extsect); |
482 | ERR_print_errors(bio_err); | 815 | ERR_print_errors(bio_err); |
483 | goto end; | 816 | goto end; |
484 | } | 817 | } |
485 | } | 818 | } |
486 | if (reqfile) { | 819 | if (x509_config.reqfile) { |
487 | EVP_PKEY *pkey; | 820 | EVP_PKEY *pkey; |
488 | BIO *in; | 821 | BIO *in; |
489 | 822 | ||
490 | if (!sign_flag && !CA_flag) { | 823 | if (!x509_config.sign_flag && !x509_config.CA_flag) { |
491 | BIO_printf(bio_err, "We need a private key to sign with\n"); | 824 | BIO_printf(bio_err, "We need a private key to sign with\n"); |
492 | goto end; | 825 | goto end; |
493 | } | 826 | } |
@@ -496,11 +829,11 @@ x509_main(int argc, char **argv) | |||
496 | ERR_print_errors(bio_err); | 829 | ERR_print_errors(bio_err); |
497 | goto end; | 830 | goto end; |
498 | } | 831 | } |
499 | if (infile == NULL) | 832 | if (x509_config.infile == NULL) |
500 | BIO_set_fp(in, stdin, BIO_NOCLOSE | BIO_FP_TEXT); | 833 | BIO_set_fp(in, stdin, BIO_NOCLOSE | BIO_FP_TEXT); |
501 | else { | 834 | else { |
502 | if (BIO_read_filename(in, infile) <= 0) { | 835 | if (BIO_read_filename(in, x509_config.infile) <= 0) { |
503 | perror(infile); | 836 | perror(x509_config.infile); |
504 | BIO_free(in); | 837 | BIO_free(in); |
505 | goto end; | 838 | goto end; |
506 | } | 839 | } |
@@ -537,20 +870,20 @@ x509_main(int argc, char **argv) | |||
537 | } else | 870 | } else |
538 | BIO_printf(bio_err, "Signature ok\n"); | 871 | BIO_printf(bio_err, "Signature ok\n"); |
539 | 872 | ||
540 | print_name(bio_err, "subject=", X509_REQ_get_subject_name(req), nmflag); | 873 | print_name(bio_err, "subject=", X509_REQ_get_subject_name(req), x509_config.nmflag); |
541 | 874 | ||
542 | if ((x = X509_new()) == NULL) | 875 | if ((x = X509_new()) == NULL) |
543 | goto end; | 876 | goto end; |
544 | 877 | ||
545 | if (sno == NULL) { | 878 | if (x509_config.sno == NULL) { |
546 | sno = ASN1_INTEGER_new(); | 879 | x509_config.sno = ASN1_INTEGER_new(); |
547 | if (!sno || !rand_serial(NULL, sno)) | 880 | if (!x509_config.sno || !rand_serial(NULL, x509_config.sno)) |
548 | goto end; | 881 | goto end; |
549 | if (!X509_set_serialNumber(x, sno)) | 882 | if (!X509_set_serialNumber(x, x509_config.sno)) |
550 | goto end; | 883 | goto end; |
551 | ASN1_INTEGER_free(sno); | 884 | ASN1_INTEGER_free(x509_config.sno); |
552 | sno = NULL; | 885 | x509_config.sno = NULL; |
553 | } else if (!X509_set_serialNumber(x, sno)) | 886 | } else if (!X509_set_serialNumber(x, x509_config.sno)) |
554 | goto end; | 887 | goto end; |
555 | 888 | ||
556 | if (!X509_set_issuer_name(x, req->req_info->subject)) | 889 | if (!X509_set_issuer_name(x, req->req_info->subject)) |
@@ -559,22 +892,22 @@ x509_main(int argc, char **argv) | |||
559 | goto end; | 892 | goto end; |
560 | 893 | ||
561 | X509_gmtime_adj(X509_get_notBefore(x), 0); | 894 | X509_gmtime_adj(X509_get_notBefore(x), 0); |
562 | X509_time_adj_ex(X509_get_notAfter(x), days, 0, NULL); | 895 | X509_time_adj_ex(X509_get_notAfter(x), x509_config.days, 0, NULL); |
563 | 896 | ||
564 | pkey = X509_REQ_get_pubkey(req); | 897 | pkey = X509_REQ_get_pubkey(req); |
565 | X509_set_pubkey(x, pkey); | 898 | X509_set_pubkey(x, pkey); |
566 | EVP_PKEY_free(pkey); | 899 | EVP_PKEY_free(pkey); |
567 | } else | 900 | } else |
568 | x = load_cert(bio_err, infile, informat, NULL, "Certificate"); | 901 | x = load_cert(bio_err, x509_config.infile, x509_config.informat, NULL, "Certificate"); |
569 | 902 | ||
570 | if (x == NULL) | 903 | if (x == NULL) |
571 | goto end; | 904 | goto end; |
572 | if (CA_flag) { | 905 | if (x509_config.CA_flag) { |
573 | xca = load_cert(bio_err, CAfile, CAformat, NULL, "CA Certificate"); | 906 | xca = load_cert(bio_err, x509_config.CAfile, x509_config.CAformat, NULL, "CA Certificate"); |
574 | if (xca == NULL) | 907 | if (xca == NULL) |
575 | goto end; | 908 | goto end; |
576 | } | 909 | } |
577 | if (!noout || text || next_serial) { | 910 | if (!x509_config.noout || x509_config.text || x509_config.next_serial) { |
578 | OBJ_create("2.99999.3", | 911 | OBJ_create("2.99999.3", |
579 | "SET.ex3", "SET x509v3 extension 3"); | 912 | "SET.ex3", "SET x509v3 extension 3"); |
580 | 913 | ||
@@ -583,49 +916,49 @@ x509_main(int argc, char **argv) | |||
583 | ERR_print_errors(bio_err); | 916 | ERR_print_errors(bio_err); |
584 | goto end; | 917 | goto end; |
585 | } | 918 | } |
586 | if (outfile == NULL) { | 919 | if (x509_config.outfile == NULL) { |
587 | BIO_set_fp(out, stdout, BIO_NOCLOSE); | 920 | BIO_set_fp(out, stdout, BIO_NOCLOSE); |
588 | } else { | 921 | } else { |
589 | if (BIO_write_filename(out, outfile) <= 0) { | 922 | if (BIO_write_filename(out, x509_config.outfile) <= 0) { |
590 | perror(outfile); | 923 | perror(x509_config.outfile); |
591 | goto end; | 924 | goto end; |
592 | } | 925 | } |
593 | } | 926 | } |
594 | } | 927 | } |
595 | if (alias) | 928 | if (x509_config.alias) |
596 | X509_alias_set1(x, (unsigned char *) alias, -1); | 929 | X509_alias_set1(x, (unsigned char *) x509_config.alias, -1); |
597 | 930 | ||
598 | if (clrtrust) | 931 | if (x509_config.clrtrust) |
599 | X509_trust_clear(x); | 932 | X509_trust_clear(x); |
600 | if (clrreject) | 933 | if (x509_config.clrreject) |
601 | X509_reject_clear(x); | 934 | X509_reject_clear(x); |
602 | 935 | ||
603 | if (trust) { | 936 | if (x509_config.trust) { |
604 | for (i = 0; i < sk_ASN1_OBJECT_num(trust); i++) { | 937 | for (i = 0; i < sk_ASN1_OBJECT_num(x509_config.trust); i++) { |
605 | objtmp = sk_ASN1_OBJECT_value(trust, i); | 938 | x509_config.objtmp = sk_ASN1_OBJECT_value(x509_config.trust, i); |
606 | X509_add1_trust_object(x, objtmp); | 939 | X509_add1_trust_object(x, x509_config.objtmp); |
607 | } | 940 | } |
608 | } | 941 | } |
609 | if (reject) { | 942 | if (x509_config.reject) { |
610 | for (i = 0; i < sk_ASN1_OBJECT_num(reject); i++) { | 943 | for (i = 0; i < sk_ASN1_OBJECT_num(x509_config.reject); i++) { |
611 | objtmp = sk_ASN1_OBJECT_value(reject, i); | 944 | x509_config.objtmp = sk_ASN1_OBJECT_value(x509_config.reject, i); |
612 | X509_add1_reject_object(x, objtmp); | 945 | X509_add1_reject_object(x, x509_config.objtmp); |
613 | } | 946 | } |
614 | } | 947 | } |
615 | if (num) { | 948 | if (x509_config.num) { |
616 | for (i = 1; i <= num; i++) { | 949 | for (i = 1; i <= x509_config.num; i++) { |
617 | if (issuer == i) { | 950 | if (x509_config.issuer == i) { |
618 | print_name(STDout, "issuer= ", | 951 | print_name(STDout, "issuer= ", |
619 | X509_get_issuer_name(x), nmflag); | 952 | X509_get_issuer_name(x), x509_config.nmflag); |
620 | } else if (subject == i) { | 953 | } else if (x509_config.subject == i) { |
621 | print_name(STDout, "subject= ", | 954 | print_name(STDout, "subject= ", |
622 | X509_get_subject_name(x), nmflag); | 955 | X509_get_subject_name(x), x509_config.nmflag); |
623 | } else if (serial == i) { | 956 | } else if (x509_config.serial == i) { |
624 | BIO_printf(STDout, "serial="); | 957 | BIO_printf(STDout, "serial="); |
625 | i2a_ASN1_INTEGER(STDout, | 958 | i2a_ASN1_INTEGER(STDout, |
626 | X509_get_serialNumber(x)); | 959 | X509_get_serialNumber(x)); |
627 | BIO_printf(STDout, "\n"); | 960 | BIO_printf(STDout, "\n"); |
628 | } else if (next_serial == i) { | 961 | } else if (x509_config.next_serial == i) { |
629 | BIGNUM *bnser; | 962 | BIGNUM *bnser; |
630 | ASN1_INTEGER *ser; | 963 | ASN1_INTEGER *ser; |
631 | ser = X509_get_serialNumber(x); | 964 | ser = X509_get_serialNumber(x); |
@@ -641,10 +974,10 @@ x509_main(int argc, char **argv) | |||
641 | i2a_ASN1_INTEGER(out, ser); | 974 | i2a_ASN1_INTEGER(out, ser); |
642 | ASN1_INTEGER_free(ser); | 975 | ASN1_INTEGER_free(ser); |
643 | BIO_puts(out, "\n"); | 976 | BIO_puts(out, "\n"); |
644 | } else if ((email == i) || (ocsp_uri == i)) { | 977 | } else if ((x509_config.email == i) || (x509_config.ocsp_uri == i)) { |
645 | int j; | 978 | int j; |
646 | STACK_OF(OPENSSL_STRING) *emlst; | 979 | STACK_OF(OPENSSL_STRING) *emlst; |
647 | if (email == i) | 980 | if (x509_config.email == i) |
648 | emlst = X509_get1_email(x); | 981 | emlst = X509_get1_email(x); |
649 | else | 982 | else |
650 | emlst = X509_get1_ocsp(x); | 983 | emlst = X509_get1_ocsp(x); |
@@ -652,30 +985,30 @@ x509_main(int argc, char **argv) | |||
652 | BIO_printf(STDout, "%s\n", | 985 | BIO_printf(STDout, "%s\n", |
653 | sk_OPENSSL_STRING_value(emlst, j)); | 986 | sk_OPENSSL_STRING_value(emlst, j)); |
654 | X509_email_free(emlst); | 987 | X509_email_free(emlst); |
655 | } else if (aliasout == i) { | 988 | } else if (x509_config.aliasout == i) { |
656 | unsigned char *alstr; | 989 | unsigned char *alstr; |
657 | alstr = X509_alias_get0(x, NULL); | 990 | alstr = X509_alias_get0(x, NULL); |
658 | if (alstr) | 991 | if (alstr) |
659 | BIO_printf(STDout, "%s\n", alstr); | 992 | BIO_printf(STDout, "%s\n", alstr); |
660 | else | 993 | else |
661 | BIO_puts(STDout, "<No Alias>\n"); | 994 | BIO_puts(STDout, "<No Alias>\n"); |
662 | } else if (subject_hash == i) { | 995 | } else if (x509_config.subject_hash == i) { |
663 | BIO_printf(STDout, "%08lx\n", X509_subject_name_hash(x)); | 996 | BIO_printf(STDout, "%08lx\n", X509_subject_name_hash(x)); |
664 | } | 997 | } |
665 | #ifndef OPENSSL_NO_MD5 | 998 | #ifndef OPENSSL_NO_MD5 |
666 | else if (subject_hash_old == i) { | 999 | else if (x509_config.subject_hash_old == i) { |
667 | BIO_printf(STDout, "%08lx\n", X509_subject_name_hash_old(x)); | 1000 | BIO_printf(STDout, "%08lx\n", X509_subject_name_hash_old(x)); |
668 | } | 1001 | } |
669 | #endif | 1002 | #endif |
670 | else if (issuer_hash == i) { | 1003 | else if (x509_config.issuer_hash == i) { |
671 | BIO_printf(STDout, "%08lx\n", X509_issuer_name_hash(x)); | 1004 | BIO_printf(STDout, "%08lx\n", X509_issuer_name_hash(x)); |
672 | } | 1005 | } |
673 | #ifndef OPENSSL_NO_MD5 | 1006 | #ifndef OPENSSL_NO_MD5 |
674 | else if (issuer_hash_old == i) { | 1007 | else if (x509_config.issuer_hash_old == i) { |
675 | BIO_printf(STDout, "%08lx\n", X509_issuer_name_hash_old(x)); | 1008 | BIO_printf(STDout, "%08lx\n", X509_issuer_name_hash_old(x)); |
676 | } | 1009 | } |
677 | #endif | 1010 | #endif |
678 | else if (pprint == i) { | 1011 | else if (x509_config.pprint == i) { |
679 | X509_PURPOSE *ptmp; | 1012 | X509_PURPOSE *ptmp; |
680 | int j; | 1013 | int j; |
681 | BIO_printf(STDout, "Certificate purposes:\n"); | 1014 | BIO_printf(STDout, "Certificate purposes:\n"); |
@@ -683,7 +1016,7 @@ x509_main(int argc, char **argv) | |||
683 | ptmp = X509_PURPOSE_get0(j); | 1016 | ptmp = X509_PURPOSE_get0(j); |
684 | purpose_print(STDout, x, ptmp); | 1017 | purpose_print(STDout, x, ptmp); |
685 | } | 1018 | } |
686 | } else if (modulus == i) { | 1019 | } else if (x509_config.modulus == i) { |
687 | EVP_PKEY *pkey; | 1020 | EVP_PKEY *pkey; |
688 | 1021 | ||
689 | pkey = X509_get_pubkey(x); | 1022 | pkey = X509_get_pubkey(x); |
@@ -702,7 +1035,7 @@ x509_main(int argc, char **argv) | |||
702 | BIO_printf(STDout, "Wrong Algorithm type"); | 1035 | BIO_printf(STDout, "Wrong Algorithm type"); |
703 | BIO_printf(STDout, "\n"); | 1036 | BIO_printf(STDout, "\n"); |
704 | EVP_PKEY_free(pkey); | 1037 | EVP_PKEY_free(pkey); |
705 | } else if (pubkey == i) { | 1038 | } else if (x509_config.pubkey == i) { |
706 | EVP_PKEY *pkey; | 1039 | EVP_PKEY *pkey; |
707 | 1040 | ||
708 | pkey = X509_get_pubkey(x); | 1041 | pkey = X509_get_pubkey(x); |
@@ -713,7 +1046,7 @@ x509_main(int argc, char **argv) | |||
713 | } | 1046 | } |
714 | PEM_write_bio_PUBKEY(STDout, pkey); | 1047 | PEM_write_bio_PUBKEY(STDout, pkey); |
715 | EVP_PKEY_free(pkey); | 1048 | EVP_PKEY_free(pkey); |
716 | } else if (C == i) { | 1049 | } else if (x509_config.C == i) { |
717 | unsigned char *d; | 1050 | unsigned char *d; |
718 | char *m; | 1051 | char *m; |
719 | int y, z; | 1052 | int y, z; |
@@ -771,9 +1104,9 @@ x509_main(int argc, char **argv) | |||
771 | BIO_printf(STDout, "};\n"); | 1104 | BIO_printf(STDout, "};\n"); |
772 | 1105 | ||
773 | free(m); | 1106 | free(m); |
774 | } else if (text == i) { | 1107 | } else if (x509_config.text == i) { |
775 | X509_print_ex(STDout, x, nmflag, certflag); | 1108 | X509_print_ex(STDout, x, x509_config.nmflag, x509_config.certflag); |
776 | } else if (startdate == i) { | 1109 | } else if (x509_config.startdate == i) { |
777 | ASN1_TIME *nB = X509_get_notBefore(x); | 1110 | ASN1_TIME *nB = X509_get_notBefore(x); |
778 | BIO_puts(STDout, "notBefore="); | 1111 | BIO_puts(STDout, "notBefore="); |
779 | if (ASN1_time_parse(nB->data, nB->length, NULL, 0) == -1) | 1112 | if (ASN1_time_parse(nB->data, nB->length, NULL, 0) == -1) |
@@ -781,7 +1114,7 @@ x509_main(int argc, char **argv) | |||
781 | else | 1114 | else |
782 | ASN1_TIME_print(STDout, nB); | 1115 | ASN1_TIME_print(STDout, nB); |
783 | BIO_puts(STDout, "\n"); | 1116 | BIO_puts(STDout, "\n"); |
784 | } else if (enddate == i) { | 1117 | } else if (x509_config.enddate == i) { |
785 | ASN1_TIME *nA = X509_get_notAfter(x); | 1118 | ASN1_TIME *nA = X509_get_notAfter(x); |
786 | BIO_puts(STDout, "notAfter="); | 1119 | BIO_puts(STDout, "notAfter="); |
787 | if (ASN1_time_parse(nA->data, nA->length, NULL, 0) == -1) | 1120 | if (ASN1_time_parse(nA->data, nA->length, NULL, 0) == -1) |
@@ -789,11 +1122,11 @@ x509_main(int argc, char **argv) | |||
789 | else | 1122 | else |
790 | ASN1_TIME_print(STDout, nA); | 1123 | ASN1_TIME_print(STDout, nA); |
791 | BIO_puts(STDout, "\n"); | 1124 | BIO_puts(STDout, "\n"); |
792 | } else if (fingerprint == i) { | 1125 | } else if (x509_config.fingerprint == i) { |
793 | int j; | 1126 | int j; |
794 | unsigned int n; | 1127 | unsigned int n; |
795 | unsigned char md[EVP_MAX_MD_SIZE]; | 1128 | unsigned char md[EVP_MAX_MD_SIZE]; |
796 | const EVP_MD *fdig = digest; | 1129 | const EVP_MD *fdig = x509_config.digest; |
797 | 1130 | ||
798 | if (!fdig) | 1131 | if (!fdig) |
799 | fdig = EVP_sha256(); | 1132 | fdig = EVP_sha256(); |
@@ -810,42 +1143,42 @@ x509_main(int argc, char **argv) | |||
810 | } | 1143 | } |
811 | } | 1144 | } |
812 | /* should be in the library */ | 1145 | /* should be in the library */ |
813 | else if ((sign_flag == i) && (x509req == 0)) { | 1146 | else if ((x509_config.sign_flag == i) && (x509_config.x509req == 0)) { |
814 | BIO_printf(bio_err, "Getting Private key\n"); | 1147 | BIO_printf(bio_err, "Getting Private key\n"); |
815 | if (Upkey == NULL) { | 1148 | if (Upkey == NULL) { |
816 | Upkey = load_key(bio_err, | 1149 | Upkey = load_key(bio_err, |
817 | keyfile, keyformat, 0, | 1150 | x509_config.keyfile, x509_config.keyformat, 0, |
818 | passin, "Private key"); | 1151 | passin, "Private key"); |
819 | if (Upkey == NULL) | 1152 | if (Upkey == NULL) |
820 | goto end; | 1153 | goto end; |
821 | } | 1154 | } |
822 | if (!sign(x, Upkey, days, clrext, digest, | 1155 | if (!sign(x, Upkey, x509_config.days, x509_config.clrext, x509_config.digest, |
823 | extconf, extsect)) | 1156 | extconf, x509_config.extsect)) |
824 | goto end; | 1157 | goto end; |
825 | } else if (CA_flag == i) { | 1158 | } else if (x509_config.CA_flag == i) { |
826 | BIO_printf(bio_err, "Getting CA Private Key\n"); | 1159 | BIO_printf(bio_err, "Getting CA Private Key\n"); |
827 | if (CAkeyfile != NULL) { | 1160 | if (x509_config.CAkeyfile != NULL) { |
828 | CApkey = load_key(bio_err, | 1161 | CApkey = load_key(bio_err, |
829 | CAkeyfile, CAkeyformat, | 1162 | x509_config.CAkeyfile, x509_config.CAkeyformat, |
830 | 0, passin, "CA Private Key"); | 1163 | 0, passin, "CA Private Key"); |
831 | if (CApkey == NULL) | 1164 | if (CApkey == NULL) |
832 | goto end; | 1165 | goto end; |
833 | } | 1166 | } |
834 | if (!x509_certify(ctx, CAfile, digest, x, xca, | 1167 | if (!x509_certify(ctx, x509_config.CAfile, x509_config.digest, x, xca, |
835 | CApkey, sigopts, | 1168 | CApkey, x509_config.sigopts, |
836 | CAserial, CA_createserial, days, clrext, | 1169 | x509_config.CAserial, x509_config.CA_createserial, x509_config.days, x509_config.clrext, |
837 | extconf, extsect, sno)) | 1170 | extconf, x509_config.extsect, x509_config.sno)) |
838 | goto end; | 1171 | goto end; |
839 | } else if (x509req == i) { | 1172 | } else if (x509_config.x509req == i) { |
840 | EVP_PKEY *pk; | 1173 | EVP_PKEY *pk; |
841 | 1174 | ||
842 | BIO_printf(bio_err, "Getting request Private Key\n"); | 1175 | BIO_printf(bio_err, "Getting request Private Key\n"); |
843 | if (keyfile == NULL) { | 1176 | if (x509_config.keyfile == NULL) { |
844 | BIO_printf(bio_err, "no request key file specified\n"); | 1177 | BIO_printf(bio_err, "no request key file specified\n"); |
845 | goto end; | 1178 | goto end; |
846 | } else { | 1179 | } else { |
847 | pk = load_key(bio_err, | 1180 | pk = load_key(bio_err, |
848 | keyfile, keyformat, 0, | 1181 | x509_config.keyfile, x509_config.keyformat, 0, |
849 | passin, "request key"); | 1182 | passin, "request key"); |
850 | if (pk == NULL) | 1183 | if (pk == NULL) |
851 | goto end; | 1184 | goto end; |
@@ -853,24 +1186,24 @@ x509_main(int argc, char **argv) | |||
853 | 1186 | ||
854 | BIO_printf(bio_err, "Generating certificate request\n"); | 1187 | BIO_printf(bio_err, "Generating certificate request\n"); |
855 | 1188 | ||
856 | rq = X509_to_X509_REQ(x, pk, digest); | 1189 | rq = X509_to_X509_REQ(x, pk, x509_config.digest); |
857 | EVP_PKEY_free(pk); | 1190 | EVP_PKEY_free(pk); |
858 | if (rq == NULL) { | 1191 | if (rq == NULL) { |
859 | ERR_print_errors(bio_err); | 1192 | ERR_print_errors(bio_err); |
860 | goto end; | 1193 | goto end; |
861 | } | 1194 | } |
862 | if (!noout) { | 1195 | if (!x509_config.noout) { |
863 | X509_REQ_print(out, rq); | 1196 | X509_REQ_print(out, rq); |
864 | PEM_write_bio_X509_REQ(out, rq); | 1197 | PEM_write_bio_X509_REQ(out, rq); |
865 | } | 1198 | } |
866 | noout = 1; | 1199 | x509_config.noout = 1; |
867 | } else if (ocspid == i) { | 1200 | } else if (x509_config.ocspid == i) { |
868 | X509_ocspid_print(out, x); | 1201 | X509_ocspid_print(out, x); |
869 | } | 1202 | } |
870 | } | 1203 | } |
871 | } | 1204 | } |
872 | if (checkend) { | 1205 | if (x509_config.checkend) { |
873 | time_t tcheck = time(NULL) + checkoffset; | 1206 | time_t tcheck = time(NULL) + x509_config.checkoffset; |
874 | int timecheck = X509_cmp_time(X509_get_notAfter(x), &tcheck); | 1207 | int timecheck = X509_cmp_time(X509_get_notAfter(x), &tcheck); |
875 | if (timecheck == 0) { | 1208 | if (timecheck == 0) { |
876 | BIO_printf(out, "Certificate expiry time is invalid\n"); | 1209 | BIO_printf(out, "Certificate expiry time is invalid\n"); |
@@ -884,18 +1217,18 @@ x509_main(int argc, char **argv) | |||
884 | } | 1217 | } |
885 | goto end; | 1218 | goto end; |
886 | } | 1219 | } |
887 | if (noout) { | 1220 | if (x509_config.noout) { |
888 | ret = 0; | 1221 | ret = 0; |
889 | goto end; | 1222 | goto end; |
890 | } | 1223 | } |
891 | if (outformat == FORMAT_ASN1) | 1224 | if (x509_config.outformat == FORMAT_ASN1) |
892 | i = i2d_X509_bio(out, x); | 1225 | i = i2d_X509_bio(out, x); |
893 | else if (outformat == FORMAT_PEM) { | 1226 | else if (x509_config.outformat == FORMAT_PEM) { |
894 | if (trustout) | 1227 | if (x509_config.trustout) |
895 | i = PEM_write_bio_X509_AUX(out, x); | 1228 | i = PEM_write_bio_X509_AUX(out, x); |
896 | else | 1229 | else |
897 | i = PEM_write_bio_X509(out, x); | 1230 | i = PEM_write_bio_X509(out, x); |
898 | } else if (outformat == FORMAT_NETSCAPE) { | 1231 | } else if (x509_config.outformat == FORMAT_NETSCAPE) { |
899 | NETSCAPE_X509 nx; | 1232 | NETSCAPE_X509 nx; |
900 | ASN1_OCTET_STRING hdr; | 1233 | ASN1_OCTET_STRING hdr; |
901 | 1234 | ||
@@ -927,11 +1260,11 @@ x509_main(int argc, char **argv) | |||
927 | X509_free(xca); | 1260 | X509_free(xca); |
928 | EVP_PKEY_free(Upkey); | 1261 | EVP_PKEY_free(Upkey); |
929 | EVP_PKEY_free(CApkey); | 1262 | EVP_PKEY_free(CApkey); |
930 | sk_OPENSSL_STRING_free(sigopts); | 1263 | sk_OPENSSL_STRING_free(x509_config.sigopts); |
931 | X509_REQ_free(rq); | 1264 | X509_REQ_free(rq); |
932 | ASN1_INTEGER_free(sno); | 1265 | ASN1_INTEGER_free(x509_config.sno); |
933 | sk_ASN1_OBJECT_pop_free(trust, ASN1_OBJECT_free); | 1266 | sk_ASN1_OBJECT_pop_free(x509_config.trust, ASN1_OBJECT_free); |
934 | sk_ASN1_OBJECT_pop_free(reject, ASN1_OBJECT_free); | 1267 | sk_ASN1_OBJECT_pop_free(x509_config.reject, ASN1_OBJECT_free); |
935 | free(passin); | 1268 | free(passin); |
936 | 1269 | ||
937 | return (ret); | 1270 | return (ret); |
@@ -1013,7 +1346,7 @@ x509_certify(X509_STORE *ctx, char *CAfile, const EVP_MD *digest, X509 *x, | |||
1013 | */ | 1346 | */ |
1014 | X509_STORE_CTX_set_cert(&xsc, x); | 1347 | X509_STORE_CTX_set_cert(&xsc, x); |
1015 | X509_STORE_CTX_set_flags(&xsc, X509_V_FLAG_CHECK_SS_SIGNATURE); | 1348 | X509_STORE_CTX_set_flags(&xsc, X509_V_FLAG_CHECK_SS_SIGNATURE); |
1016 | if (!reqfile && X509_verify_cert(&xsc) <= 0) | 1349 | if (!x509_config.reqfile && X509_verify_cert(&xsc) <= 0) |
1017 | goto end; | 1350 | goto end; |
1018 | 1351 | ||
1019 | if (!X509_check_private_key(xca, pkey)) { | 1352 | if (!X509_check_private_key(xca, pkey)) { |