diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/usr.bin/openssl/ca.c | 1099 |
1 files changed, 643 insertions, 456 deletions
diff --git a/src/usr.bin/openssl/ca.c b/src/usr.bin/openssl/ca.c index 6952226ffb..8d1ea25470 100644 --- a/src/usr.bin/openssl/ca.c +++ b/src/usr.bin/openssl/ca.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ca.c,v 1.28 2020/12/16 18:53:10 tb Exp $ */ | 1 | /* $OpenBSD: ca.c,v 1.29 2021/07/15 09:56:32 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 | * |
@@ -120,47 +120,6 @@ | |||
120 | #define REV_KEY_COMPROMISE 3 /* Value is cert key compromise time */ | 120 | #define REV_KEY_COMPROMISE 3 /* Value is cert key compromise time */ |
121 | #define REV_CA_COMPROMISE 4 /* Value is CA key compromise time */ | 121 | #define REV_CA_COMPROMISE 4 /* Value is CA key compromise time */ |
122 | 122 | ||
123 | static const char *ca_usage[] = { | ||
124 | "usage: ca args\n", | ||
125 | "\n", | ||
126 | " -verbose - Talk a lot while doing things\n", | ||
127 | " -config file - A config file\n", | ||
128 | " -name arg - The particular CA definition to use\n", | ||
129 | " -gencrl - Generate a new CRL\n", | ||
130 | " -crldays days - Days is when the next CRL is due\n", | ||
131 | " -crlhours hours - Hours is when the next CRL is due\n", | ||
132 | " -startdate YYMMDDHHMMSSZ - certificate validity notBefore\n", | ||
133 | " -enddate YYMMDDHHMMSSZ - certificate validity notAfter (overrides -days)\n", | ||
134 | " -days arg - number of days to certify the certificate for\n", | ||
135 | " -md arg - md to use, one of md5 or sha1\n", | ||
136 | " -policy arg - The CA 'policy' to support\n", | ||
137 | " -keyfile arg - private key file\n", | ||
138 | " -keyform arg - private key file format (PEM)\n", | ||
139 | " -key arg - key to decode the private key if it is encrypted\n", | ||
140 | " -cert file - The CA certificate\n", | ||
141 | " -selfsign - sign a certificate with the key associated with it\n", | ||
142 | " -in file - The input PEM encoded certificate request(s)\n", | ||
143 | " -out file - Where to put the output file(s)\n", | ||
144 | " -outdir dir - Where to put output certificates\n", | ||
145 | " -infiles .... - The last argument, requests to process\n", | ||
146 | " -spkac file - File contains DN and signed public key and challenge\n", | ||
147 | " -ss_cert file - File contains a self signed cert to sign\n", | ||
148 | " -preserveDN - Don't re-order the DN\n", | ||
149 | " -noemailDN - Don't add the EMAIL field into certificate' subject\n", | ||
150 | " -batch - Don't ask questions\n", | ||
151 | " -msie_hack - msie modifications to handle all those universal strings\n", | ||
152 | " -revoke file - Revoke a certificate (given in file)\n", | ||
153 | " -subj arg - Use arg instead of request's subject\n", | ||
154 | " -utf8 - input characters are UTF8 (default ASCII)\n", | ||
155 | " -multivalue-rdn - enable support for multivalued RDNs\n", | ||
156 | " -extensions .. - Extension section (override value in config file)\n", | ||
157 | " -extfile file - Configuration file with X509v3 extentions to add\n", | ||
158 | " -crlexts .. - CRL extension section (override value in config file)\n", | ||
159 | " -status serial - Shows certificate status given the serial number\n", | ||
160 | " -updatedb - Updates db for expired certificates\n", | ||
161 | NULL | ||
162 | }; | ||
163 | |||
164 | static void lookup_fail(const char *name, const char *tag); | 123 | static void lookup_fail(const char *name, const char *tag); |
165 | static int certify(X509 ** xret, char *infile, EVP_PKEY * pkey, X509 * x509, | 124 | static int certify(X509 ** xret, char *infile, EVP_PKEY * pkey, X509 * x509, |
166 | const EVP_MD * dgst, STACK_OF(OPENSSL_STRING) * sigopts, | 125 | const EVP_MD * dgst, STACK_OF(OPENSSL_STRING) * sigopts, |
@@ -199,13 +158,454 @@ static char * bin2hex(unsigned char *, size_t); | |||
199 | char *make_revocation_str(int rev_type, char *rev_arg); | 158 | char *make_revocation_str(int rev_type, char *rev_arg); |
200 | int make_revoked(X509_REVOKED * rev, const char *str); | 159 | int make_revoked(X509_REVOKED * rev, const char *str); |
201 | int old_entry_print(BIO * bp, ASN1_OBJECT * obj, ASN1_STRING * str); | 160 | int old_entry_print(BIO * bp, ASN1_OBJECT * obj, ASN1_STRING * str); |
161 | |||
202 | static CONF *conf = NULL; | 162 | static CONF *conf = NULL; |
203 | static CONF *extconf = NULL; | 163 | static CONF *extconf = NULL; |
204 | static char *section = NULL; | ||
205 | 164 | ||
206 | static int preserve = 0; | 165 | static struct { |
207 | static int msie_hack = 0; | 166 | int batch; |
167 | char *certfile; | ||
168 | unsigned long chtype; | ||
169 | char *configfile; | ||
170 | int create_ser; | ||
171 | char *crl_ext; | ||
172 | long crldays; | ||
173 | long crlhours; | ||
174 | long crlsec; | ||
175 | long days; | ||
176 | int dorevoke; | ||
177 | int doupdatedb; | ||
178 | int email_dn; | ||
179 | char *enddate; | ||
180 | char *extensions; | ||
181 | char *extfile; | ||
182 | int gencrl; | ||
183 | char *infile; | ||
184 | char **infiles; | ||
185 | int infiles_num; | ||
186 | char *key; | ||
187 | char *keyfile; | ||
188 | int keyform; | ||
189 | char *md; | ||
190 | int multirdn; | ||
191 | int msie_hack; | ||
192 | int notext; | ||
193 | char *outdir; | ||
194 | char *outfile; | ||
195 | char *passargin; | ||
196 | char *policy; | ||
197 | int preserve; | ||
198 | int req; | ||
199 | char *rev_arg; | ||
200 | int rev_type; | ||
201 | char *ser_status; | ||
202 | char *section; | ||
203 | int selfsign; | ||
204 | STACK_OF(OPENSSL_STRING) * sigopts; | ||
205 | char *spkac_file; | ||
206 | char *ss_cert_file; | ||
207 | char *startdate; | ||
208 | char *subj; | ||
209 | int verbose; | ||
210 | } ca_config; | ||
211 | |||
212 | static int | ||
213 | ca_opt_chtype_utf8(void) | ||
214 | { | ||
215 | ca_config.chtype = MBSTRING_UTF8; | ||
216 | return (0); | ||
217 | } | ||
218 | |||
219 | static int | ||
220 | ca_opt_crl_ca_compromise(char *arg) | ||
221 | { | ||
222 | ca_config.rev_arg = arg; | ||
223 | ca_config.rev_type = REV_CA_COMPROMISE; | ||
224 | return (0); | ||
225 | } | ||
226 | |||
227 | static int | ||
228 | ca_opt_crl_compromise(char *arg) | ||
229 | { | ||
230 | ca_config.rev_arg = arg; | ||
231 | ca_config.rev_type = REV_KEY_COMPROMISE; | ||
232 | return (0); | ||
233 | } | ||
234 | |||
235 | static int | ||
236 | ca_opt_crl_hold(char *arg) | ||
237 | { | ||
238 | ca_config.rev_arg = arg; | ||
239 | ca_config.rev_type = REV_HOLD; | ||
240 | return (0); | ||
241 | } | ||
242 | |||
243 | static int | ||
244 | ca_opt_crl_reason(char *arg) | ||
245 | { | ||
246 | ca_config.rev_arg = arg; | ||
247 | ca_config.rev_type = REV_CRL_REASON; | ||
248 | return (0); | ||
249 | } | ||
250 | |||
251 | static int | ||
252 | ca_opt_in(char *arg) | ||
253 | { | ||
254 | ca_config.infile = arg; | ||
255 | ca_config.req = 1; | ||
256 | return (0); | ||
257 | } | ||
258 | |||
259 | static int | ||
260 | ca_opt_infiles(int argc, char **argv, int *argsused) | ||
261 | { | ||
262 | ca_config.infiles_num = argc - 1; | ||
263 | if (ca_config.infiles_num < 1) | ||
264 | return (1); | ||
265 | ca_config.infiles = argv + 1; | ||
266 | ca_config.req = 1; | ||
267 | *argsused = argc; | ||
268 | return (0); | ||
269 | } | ||
270 | |||
271 | static int | ||
272 | ca_opt_revoke(char *arg) | ||
273 | { | ||
274 | ca_config.infile = arg; | ||
275 | ca_config.dorevoke = 1; | ||
276 | return (0); | ||
277 | } | ||
278 | |||
279 | static int | ||
280 | ca_opt_sigopt(char *arg) | ||
281 | { | ||
282 | if (ca_config.sigopts == NULL) | ||
283 | ca_config.sigopts = sk_OPENSSL_STRING_new_null(); | ||
284 | if (ca_config.sigopts == NULL) | ||
285 | return (1); | ||
286 | if (!sk_OPENSSL_STRING_push(ca_config.sigopts, arg)) | ||
287 | return (1); | ||
288 | return (0); | ||
289 | } | ||
290 | |||
291 | static int | ||
292 | ca_opt_spkac(char *arg) | ||
293 | { | ||
294 | ca_config.spkac_file = arg; | ||
295 | ca_config.req = 1; | ||
296 | return (0); | ||
297 | } | ||
208 | 298 | ||
299 | static int | ||
300 | ca_opt_ss_cert(char *arg) | ||
301 | { | ||
302 | ca_config.ss_cert_file = arg; | ||
303 | ca_config.req = 1; | ||
304 | return (0); | ||
305 | } | ||
306 | |||
307 | static const struct option ca_options[] = { | ||
308 | { | ||
309 | .name = "batch", | ||
310 | .desc = "Operate in batch mode", | ||
311 | .type = OPTION_FLAG, | ||
312 | .opt.flag = &ca_config.batch, | ||
313 | }, | ||
314 | { | ||
315 | .name = "cert", | ||
316 | .argname = "file", | ||
317 | .desc = "File containing the CA certificate", | ||
318 | .type = OPTION_ARG, | ||
319 | .opt.arg = &ca_config.certfile, | ||
320 | }, | ||
321 | { | ||
322 | .name = "config", | ||
323 | .argname = "file", | ||
324 | .desc = "Specify an alternative configuration file", | ||
325 | .type = OPTION_ARG, | ||
326 | .opt.arg = &ca_config.configfile, | ||
327 | }, | ||
328 | { | ||
329 | .name = "create_serial", | ||
330 | .desc = "If reading serial fails, create a new random serial", | ||
331 | .type = OPTION_FLAG, | ||
332 | .opt.flag = &ca_config.create_ser, | ||
333 | }, | ||
334 | { | ||
335 | .name = "crl_CA_compromise", | ||
336 | .argname = "time", | ||
337 | .desc = "Set the compromise time and the revocation reason to\n" | ||
338 | "CACompromise", | ||
339 | .type = OPTION_ARG_FUNC, | ||
340 | .opt.argfunc = ca_opt_crl_ca_compromise, | ||
341 | }, | ||
342 | { | ||
343 | .name = "crl_compromise", | ||
344 | .argname = "time", | ||
345 | .desc = "Set the compromise time and the revocation reason to\n" | ||
346 | "keyCompromise", | ||
347 | .type = OPTION_ARG_FUNC, | ||
348 | .opt.argfunc = ca_opt_crl_compromise, | ||
349 | }, | ||
350 | { | ||
351 | .name = "crl_hold", | ||
352 | .argname = "instruction", | ||
353 | .desc = "Set the hold instruction and the revocation reason to\n" | ||
354 | "certificateHold", | ||
355 | .type = OPTION_ARG_FUNC, | ||
356 | .opt.argfunc = ca_opt_crl_hold, | ||
357 | }, | ||
358 | { | ||
359 | .name = "crl_reason", | ||
360 | .argname = "reason", | ||
361 | .desc = "Revocation reason", | ||
362 | .type = OPTION_ARG_FUNC, | ||
363 | .opt.argfunc = ca_opt_crl_reason, | ||
364 | }, | ||
365 | { | ||
366 | .name = "crldays", | ||
367 | .argname = "days", | ||
368 | .desc = "Number of days before the next CRL is due", | ||
369 | .type = OPTION_ARG_LONG, | ||
370 | .opt.lvalue = &ca_config.crldays, | ||
371 | }, | ||
372 | { | ||
373 | .name = "crlexts", | ||
374 | .argname = "section", | ||
375 | .desc = "CRL extension section (override value in config file)", | ||
376 | .type = OPTION_ARG, | ||
377 | .opt.arg = &ca_config.crl_ext, | ||
378 | }, | ||
379 | { | ||
380 | .name = "crlhours", | ||
381 | .argname = "hours", | ||
382 | .desc = "Number of hours before the next CRL is due", | ||
383 | .type = OPTION_ARG_LONG, | ||
384 | .opt.lvalue = &ca_config.crlhours, | ||
385 | }, | ||
386 | { | ||
387 | .name = "crlsec", | ||
388 | .argname = "seconds", | ||
389 | .desc = "Number of seconds before the next CRL is due", | ||
390 | .type = OPTION_ARG_LONG, | ||
391 | .opt.lvalue = &ca_config.crlsec, | ||
392 | }, | ||
393 | { | ||
394 | .name = "days", | ||
395 | .argname = "arg", | ||
396 | .desc = "Number of days to certify the certificate for", | ||
397 | .type = OPTION_ARG_LONG, | ||
398 | .opt.lvalue = &ca_config.days, | ||
399 | }, | ||
400 | { | ||
401 | .name = "enddate", | ||
402 | .argname = "YYMMDDHHMMSSZ", | ||
403 | .desc = "Certificate validity notAfter (overrides -days)", | ||
404 | .type = OPTION_ARG, | ||
405 | .opt.arg = &ca_config.enddate, | ||
406 | }, | ||
407 | { | ||
408 | .name = "extensions", | ||
409 | .argname = "section", | ||
410 | .desc = "Extension section (override value in config file)", | ||
411 | .type = OPTION_ARG, | ||
412 | .opt.arg = &ca_config.extensions, | ||
413 | }, | ||
414 | { | ||
415 | .name = "extfile", | ||
416 | .argname = "file", | ||
417 | .desc = "Configuration file with X509v3 extentions to add", | ||
418 | .type = OPTION_ARG, | ||
419 | .opt.arg = &ca_config.extfile, | ||
420 | }, | ||
421 | { | ||
422 | .name = "gencrl", | ||
423 | .desc = "Generate a new CRL", | ||
424 | .type = OPTION_FLAG, | ||
425 | .opt.flag = &ca_config.gencrl, | ||
426 | }, | ||
427 | { | ||
428 | .name = "in", | ||
429 | .argname = "file", | ||
430 | .desc = "Input file containing a single certificate request", | ||
431 | .type = OPTION_ARG_FUNC, | ||
432 | .opt.argfunc = ca_opt_in, | ||
433 | }, | ||
434 | { | ||
435 | .name = "infiles", | ||
436 | .argname = "...", | ||
437 | .desc = "The last argument, certificate requests to process", | ||
438 | .type = OPTION_ARGV_FUNC, | ||
439 | .opt.argvfunc = ca_opt_infiles, | ||
440 | }, | ||
441 | { | ||
442 | .name = "key", | ||
443 | .argname = "password", | ||
444 | .desc = "Key to decode the private key if it is encrypted", | ||
445 | .type = OPTION_ARG, | ||
446 | .opt.arg = &ca_config.key, | ||
447 | }, | ||
448 | { | ||
449 | .name = "keyfile", | ||
450 | .argname = "file", | ||
451 | .desc = "Private key file", | ||
452 | .type = OPTION_ARG, | ||
453 | .opt.arg = &ca_config.keyfile, | ||
454 | }, | ||
455 | { | ||
456 | .name = "keyform", | ||
457 | .argname = "fmt", | ||
458 | .desc = "Private key file format (DER or PEM (default))", | ||
459 | .type = OPTION_ARG_FORMAT, | ||
460 | .opt.value = &ca_config.keyform, | ||
461 | }, | ||
462 | { | ||
463 | .name = "md", | ||
464 | .argname = "alg", | ||
465 | .desc = "Message digest to use", | ||
466 | .type = OPTION_ARG, | ||
467 | .opt.arg = &ca_config.md, | ||
468 | }, | ||
469 | { | ||
470 | .name = "msie_hack", | ||
471 | .type = OPTION_FLAG, | ||
472 | .opt.flag = &ca_config.msie_hack, | ||
473 | }, | ||
474 | { | ||
475 | .name = "multivalue-rdn", | ||
476 | .desc = "Enable support for multivalued RDNs", | ||
477 | .type = OPTION_FLAG, | ||
478 | .opt.flag = &ca_config.multirdn, | ||
479 | }, | ||
480 | { | ||
481 | .name = "name", | ||
482 | .argname = "section", | ||
483 | .desc = "Specifies the configuration file section to use", | ||
484 | .type = OPTION_ARG, | ||
485 | .opt.arg = &ca_config.section, | ||
486 | }, | ||
487 | { | ||
488 | .name = "noemailDN", | ||
489 | .desc = "Do not add the EMAIL field to the DN", | ||
490 | .type = OPTION_VALUE, | ||
491 | .opt.value = &ca_config.email_dn, | ||
492 | .value = 0, | ||
493 | }, | ||
494 | { | ||
495 | .name = "notext", | ||
496 | .desc = "Do not print the generated certificate", | ||
497 | .type = OPTION_FLAG, | ||
498 | .opt.flag = &ca_config.notext, | ||
499 | }, | ||
500 | { | ||
501 | .name = "out", | ||
502 | .argname = "file", | ||
503 | .desc = "Output file (default stdout)", | ||
504 | .type = OPTION_ARG, | ||
505 | .opt.arg = &ca_config.outfile, | ||
506 | }, | ||
507 | { | ||
508 | .name = "outdir", | ||
509 | .argname = "directory", | ||
510 | .desc = " Directory to output certificates to", | ||
511 | .type = OPTION_ARG, | ||
512 | .opt.arg = &ca_config.outdir, | ||
513 | }, | ||
514 | { | ||
515 | .name = "passin", | ||
516 | .argname = "src", | ||
517 | .desc = "Private key input password source", | ||
518 | .type = OPTION_ARG, | ||
519 | .opt.arg = &ca_config.passargin, | ||
520 | }, | ||
521 | { | ||
522 | .name = "policy", | ||
523 | .argname = "name", | ||
524 | .desc = "The CA 'policy' to support", | ||
525 | .type = OPTION_ARG, | ||
526 | .opt.arg = &ca_config.policy, | ||
527 | }, | ||
528 | { | ||
529 | .name = "preserveDN", | ||
530 | .desc = "Do not re-order the DN", | ||
531 | .type = OPTION_FLAG, | ||
532 | .opt.flag = &ca_config.preserve, | ||
533 | }, | ||
534 | { | ||
535 | .name = "revoke", | ||
536 | .argname = "file", | ||
537 | .desc = "Revoke a certificate (given in file)", | ||
538 | .type = OPTION_ARG_FUNC, | ||
539 | .opt.argfunc = ca_opt_revoke, | ||
540 | }, | ||
541 | { | ||
542 | .name = "selfsign", | ||
543 | .desc = "Sign a certificate using the key associated with it", | ||
544 | .type = OPTION_FLAG, | ||
545 | .opt.flag = &ca_config.selfsign, | ||
546 | }, | ||
547 | { | ||
548 | .name = "sigopt", | ||
549 | .argname = "nm:v", | ||
550 | .desc = "Signature parameter in nm:v form", | ||
551 | .type = OPTION_ARG_FUNC, | ||
552 | .opt.argfunc = ca_opt_sigopt, | ||
553 | }, | ||
554 | { | ||
555 | .name = "spkac", | ||
556 | .argname = "file", | ||
557 | .desc = "File contains DN and signed public key and challenge", | ||
558 | .type = OPTION_ARG_FUNC, | ||
559 | .opt.argfunc = ca_opt_spkac, | ||
560 | }, | ||
561 | { | ||
562 | .name = "ss_cert", | ||
563 | .argname = "file", | ||
564 | .desc = "File contains a self signed certificate to sign", | ||
565 | .type = OPTION_ARG_FUNC, | ||
566 | .opt.argfunc = ca_opt_ss_cert, | ||
567 | }, | ||
568 | { | ||
569 | .name = "startdate", | ||
570 | .argname = "YYMMDDHHMMSSZ", | ||
571 | .desc = "Certificate validity notBefore", | ||
572 | .type = OPTION_ARG, | ||
573 | .opt.arg = &ca_config.startdate, | ||
574 | }, | ||
575 | { | ||
576 | .name = "status", | ||
577 | .argname = "serial", | ||
578 | .desc = "Shows certificate status given the serial number", | ||
579 | .type = OPTION_ARG, | ||
580 | .opt.arg = &ca_config.ser_status, | ||
581 | }, | ||
582 | { | ||
583 | .name = "subj", | ||
584 | .argname = "arg", | ||
585 | .desc = "Use arg instead of request's subject", | ||
586 | .type = OPTION_ARG, | ||
587 | .opt.arg = &ca_config.subj, | ||
588 | }, | ||
589 | { | ||
590 | .name = "updatedb", | ||
591 | .desc = "Updates db for expired certificates", | ||
592 | .type = OPTION_FLAG, | ||
593 | .opt.flag = &ca_config.doupdatedb, | ||
594 | }, | ||
595 | { | ||
596 | .name = "utf8", | ||
597 | .desc = "Input characters are in UTF-8 (default ASCII)", | ||
598 | .type = OPTION_FUNC, | ||
599 | .opt.func = ca_opt_chtype_utf8, | ||
600 | }, | ||
601 | { | ||
602 | .name = "verbose", | ||
603 | .desc = "Verbose output during processing", | ||
604 | .type = OPTION_FLAG, | ||
605 | .opt.flag = &ca_config.verbose, | ||
606 | }, | ||
607 | { NULL }, | ||
608 | }; | ||
209 | 609 | ||
210 | /* | 610 | /* |
211 | * Set a certificate time based on user provided input. Make sure | 611 | * Set a certificate time based on user provided input. Make sure |
@@ -227,62 +627,45 @@ setCertificateTime(ASN1_TIME *x509time, char *timestring) | |||
227 | return 0; | 627 | return 0; |
228 | } | 628 | } |
229 | 629 | ||
630 | static void | ||
631 | ca_usage(void) | ||
632 | { | ||
633 | fprintf(stderr, | ||
634 | "usage: ca [-batch] [-cert file] [-config file] [-create_serial]\n" | ||
635 | " [-crl_CA_compromise time] [-crl_compromise time]\n" | ||
636 | " [-crl_hold instruction] [-crl_reason reason] [-crldays days]\n" | ||
637 | " [-crlexts section] [-crlhours hours] [-crlsec seconds]\n" | ||
638 | " [-days arg] [-enddate date] [-extensions section]\n" | ||
639 | " [-extfile file] [-gencrl] [-in file] [-infiles]\n" | ||
640 | " [-key password] [-keyfile file] [-keyform pem | der]\n" | ||
641 | " [-md alg] [-multivalue-rdn] [-name section]\n" | ||
642 | " [-noemailDN] [-notext] [-out file] [-outdir directory]\n" | ||
643 | " [-passin arg] [-policy name] [-preserveDN] [-revoke file]\n" | ||
644 | " [-selfsign] [-sigopt nm:v] [-spkac file] [-ss_cert file]\n" | ||
645 | " [-startdate date] [-status serial] [-subj arg] [-updatedb]\n" | ||
646 | " [-utf8] [-verbose]\n\n"); | ||
647 | options_usage(ca_options); | ||
648 | fprintf(stderr, "\n"); | ||
649 | } | ||
650 | |||
230 | int | 651 | int |
231 | ca_main(int argc, char **argv) | 652 | ca_main(int argc, char **argv) |
232 | { | 653 | { |
233 | char *key = NULL, *passargin = NULL; | ||
234 | int create_ser = 0; | ||
235 | int free_key = 0; | 654 | int free_key = 0; |
236 | int total = 0; | 655 | int total = 0; |
237 | int total_done = 0; | 656 | int total_done = 0; |
238 | int badops = 0; | ||
239 | int ret = 1; | 657 | int ret = 1; |
240 | int email_dn = 1; | ||
241 | int req = 0; | ||
242 | int verbose = 0; | ||
243 | int gencrl = 0; | ||
244 | int dorevoke = 0; | ||
245 | int doupdatedb = 0; | ||
246 | long crldays = 0; | ||
247 | long crlhours = 0; | ||
248 | long crlsec = 0; | ||
249 | long errorline = -1; | 658 | long errorline = -1; |
250 | char *configfile = NULL; | ||
251 | char *md = NULL; | ||
252 | char *policy = NULL; | ||
253 | char *keyfile = NULL; | ||
254 | char *certfile = NULL; | ||
255 | int keyform = FORMAT_PEM; | ||
256 | char *infile = NULL; | ||
257 | char *spkac_file = NULL; | ||
258 | char *ss_cert_file = NULL; | ||
259 | char *ser_status = NULL; | ||
260 | EVP_PKEY *pkey = NULL; | 659 | EVP_PKEY *pkey = NULL; |
261 | int output_der = 0; | 660 | int output_der = 0; |
262 | char *outfile = NULL; | ||
263 | char *outdir = NULL; | ||
264 | char *serialfile = NULL; | 661 | char *serialfile = NULL; |
265 | char *crlnumberfile = NULL; | 662 | char *crlnumberfile = NULL; |
266 | char *extensions = NULL; | ||
267 | char *extfile = NULL; | ||
268 | char *subj = NULL; | ||
269 | unsigned long chtype = MBSTRING_ASC; | ||
270 | int multirdn = 0; | ||
271 | char *tmp_email_dn = NULL; | 663 | char *tmp_email_dn = NULL; |
272 | char *crl_ext = NULL; | ||
273 | int rev_type = REV_NONE; | ||
274 | char *rev_arg = NULL; | ||
275 | BIGNUM *serial = NULL; | 664 | BIGNUM *serial = NULL; |
276 | BIGNUM *crlnumber = NULL; | 665 | BIGNUM *crlnumber = NULL; |
277 | char *startdate = NULL; | ||
278 | char *enddate = NULL; | ||
279 | long days = 0; | ||
280 | int batch = 0; | ||
281 | int notext = 0; | ||
282 | unsigned long nameopt = 0, certopt = 0; | 666 | unsigned long nameopt = 0, certopt = 0; |
283 | int default_op = 1; | 667 | int default_op = 1; |
284 | int ext_copy = EXT_COPY_NONE; | 668 | int ext_copy = EXT_COPY_NONE; |
285 | int selfsign = 0; | ||
286 | X509 *x509 = NULL, *x509p = NULL; | 669 | X509 *x509 = NULL, *x509p = NULL; |
287 | X509 *x = NULL; | 670 | X509 *x = NULL; |
288 | BIO *in = NULL, *out = NULL, *Sout = NULL, *Cout = NULL; | 671 | BIO *in = NULL, *out = NULL, *Sout = NULL, *Cout = NULL; |
@@ -299,9 +682,7 @@ ca_main(int argc, char **argv) | |||
299 | const EVP_MD *dgst = NULL; | 682 | const EVP_MD *dgst = NULL; |
300 | STACK_OF(CONF_VALUE) * attribs = NULL; | 683 | STACK_OF(CONF_VALUE) * attribs = NULL; |
301 | STACK_OF(X509) * cert_sk = NULL; | 684 | STACK_OF(X509) * cert_sk = NULL; |
302 | STACK_OF(OPENSSL_STRING) * sigopts = NULL; | ||
303 | char *tofree = NULL; | 685 | char *tofree = NULL; |
304 | const char *errstr = NULL; | ||
305 | DB_ATTR db_attr; | 686 | DB_ATTR db_attr; |
306 | 687 | ||
307 | if (single_execution) { | 688 | if (single_execution) { |
@@ -311,244 +692,50 @@ ca_main(int argc, char **argv) | |||
311 | } | 692 | } |
312 | } | 693 | } |
313 | 694 | ||
314 | conf = NULL; | 695 | memset(&ca_config, 0, sizeof(ca_config)); |
315 | key = NULL; | 696 | ca_config.email_dn = 1; |
316 | section = NULL; | 697 | ca_config.keyform = FORMAT_PEM; |
317 | 698 | ca_config.chtype = MBSTRING_ASC; | |
318 | preserve = 0; | 699 | ca_config.rev_type = REV_NONE; |
319 | msie_hack = 0; | ||
320 | |||
321 | argc--; | ||
322 | argv++; | ||
323 | while (argc >= 1) { | ||
324 | if (strcmp(*argv, "-verbose") == 0) | ||
325 | verbose = 1; | ||
326 | else if (strcmp(*argv, "-config") == 0) { | ||
327 | if (--argc < 1) | ||
328 | goto bad; | ||
329 | configfile = *(++argv); | ||
330 | } else if (strcmp(*argv, "-name") == 0) { | ||
331 | if (--argc < 1) | ||
332 | goto bad; | ||
333 | section = *(++argv); | ||
334 | } else if (strcmp(*argv, "-subj") == 0) { | ||
335 | if (--argc < 1) | ||
336 | goto bad; | ||
337 | subj = *(++argv); | ||
338 | /* preserve=1; */ | ||
339 | } else if (strcmp(*argv, "-utf8") == 0) | ||
340 | chtype = MBSTRING_UTF8; | ||
341 | else if (strcmp(*argv, "-create_serial") == 0) | ||
342 | create_ser = 1; | ||
343 | else if (strcmp(*argv, "-multivalue-rdn") == 0) | ||
344 | multirdn = 1; | ||
345 | else if (strcmp(*argv, "-startdate") == 0) { | ||
346 | if (--argc < 1) | ||
347 | goto bad; | ||
348 | startdate = *(++argv); | ||
349 | } else if (strcmp(*argv, "-enddate") == 0) { | ||
350 | if (--argc < 1) | ||
351 | goto bad; | ||
352 | enddate = *(++argv); | ||
353 | } else if (strcmp(*argv, "-days") == 0) { | ||
354 | if (--argc < 1) | ||
355 | goto bad; | ||
356 | days = strtonum(*(++argv), 0, LONG_MAX, &errstr); | ||
357 | if (errstr) | ||
358 | goto bad; | ||
359 | } else if (strcmp(*argv, "-md") == 0) { | ||
360 | if (--argc < 1) | ||
361 | goto bad; | ||
362 | md = *(++argv); | ||
363 | } else if (strcmp(*argv, "-policy") == 0) { | ||
364 | if (--argc < 1) | ||
365 | goto bad; | ||
366 | policy = *(++argv); | ||
367 | } else if (strcmp(*argv, "-keyfile") == 0) { | ||
368 | if (--argc < 1) | ||
369 | goto bad; | ||
370 | keyfile = *(++argv); | ||
371 | } else if (strcmp(*argv, "-keyform") == 0) { | ||
372 | if (--argc < 1) | ||
373 | goto bad; | ||
374 | keyform = str2fmt(*(++argv)); | ||
375 | } else if (strcmp(*argv, "-passin") == 0) { | ||
376 | if (--argc < 1) | ||
377 | goto bad; | ||
378 | passargin = *(++argv); | ||
379 | } else if (strcmp(*argv, "-key") == 0) { | ||
380 | if (--argc < 1) | ||
381 | goto bad; | ||
382 | key = *(++argv); | ||
383 | } else if (strcmp(*argv, "-cert") == 0) { | ||
384 | if (--argc < 1) | ||
385 | goto bad; | ||
386 | certfile = *(++argv); | ||
387 | } else if (strcmp(*argv, "-selfsign") == 0) | ||
388 | selfsign = 1; | ||
389 | else if (strcmp(*argv, "-in") == 0) { | ||
390 | if (--argc < 1) | ||
391 | goto bad; | ||
392 | infile = *(++argv); | ||
393 | req = 1; | ||
394 | } else if (strcmp(*argv, "-out") == 0) { | ||
395 | if (--argc < 1) | ||
396 | goto bad; | ||
397 | outfile = *(++argv); | ||
398 | } else if (strcmp(*argv, "-outdir") == 0) { | ||
399 | if (--argc < 1) | ||
400 | goto bad; | ||
401 | outdir = *(++argv); | ||
402 | } else if (strcmp(*argv, "-sigopt") == 0) { | ||
403 | if (--argc < 1) | ||
404 | goto bad; | ||
405 | if (!sigopts) | ||
406 | sigopts = sk_OPENSSL_STRING_new_null(); | ||
407 | if (!sigopts || | ||
408 | !sk_OPENSSL_STRING_push(sigopts, *(++argv))) | ||
409 | goto bad; | ||
410 | } else if (strcmp(*argv, "-notext") == 0) | ||
411 | notext = 1; | ||
412 | else if (strcmp(*argv, "-batch") == 0) | ||
413 | batch = 1; | ||
414 | else if (strcmp(*argv, "-preserveDN") == 0) | ||
415 | preserve = 1; | ||
416 | else if (strcmp(*argv, "-noemailDN") == 0) | ||
417 | email_dn = 0; | ||
418 | else if (strcmp(*argv, "-gencrl") == 0) | ||
419 | gencrl = 1; | ||
420 | else if (strcmp(*argv, "-msie_hack") == 0) | ||
421 | msie_hack = 1; | ||
422 | else if (strcmp(*argv, "-crldays") == 0) { | ||
423 | if (--argc < 1) | ||
424 | goto bad; | ||
425 | crldays = strtonum(*(++argv), 0, LONG_MAX, &errstr); | ||
426 | if (errstr) | ||
427 | goto bad; | ||
428 | } else if (strcmp(*argv, "-crlhours") == 0) { | ||
429 | if (--argc < 1) | ||
430 | goto bad; | ||
431 | crlhours = strtonum(*(++argv), 0, LONG_MAX, &errstr); | ||
432 | if (errstr) | ||
433 | goto bad; | ||
434 | } else if (strcmp(*argv, "-crlsec") == 0) { | ||
435 | if (--argc < 1) | ||
436 | goto bad; | ||
437 | crlsec = strtonum(*(++argv), 0, LONG_MAX, &errstr); | ||
438 | if (errstr) | ||
439 | goto bad; | ||
440 | } else if (strcmp(*argv, "-infiles") == 0) { | ||
441 | argc--; | ||
442 | argv++; | ||
443 | req = 1; | ||
444 | break; | ||
445 | } else if (strcmp(*argv, "-ss_cert") == 0) { | ||
446 | if (--argc < 1) | ||
447 | goto bad; | ||
448 | ss_cert_file = *(++argv); | ||
449 | req = 1; | ||
450 | } else if (strcmp(*argv, "-spkac") == 0) { | ||
451 | if (--argc < 1) | ||
452 | goto bad; | ||
453 | spkac_file = *(++argv); | ||
454 | req = 1; | ||
455 | } else if (strcmp(*argv, "-revoke") == 0) { | ||
456 | if (--argc < 1) | ||
457 | goto bad; | ||
458 | infile = *(++argv); | ||
459 | dorevoke = 1; | ||
460 | } else if (strcmp(*argv, "-extensions") == 0) { | ||
461 | if (--argc < 1) | ||
462 | goto bad; | ||
463 | extensions = *(++argv); | ||
464 | } else if (strcmp(*argv, "-extfile") == 0) { | ||
465 | if (--argc < 1) | ||
466 | goto bad; | ||
467 | extfile = *(++argv); | ||
468 | } else if (strcmp(*argv, "-status") == 0) { | ||
469 | if (--argc < 1) | ||
470 | goto bad; | ||
471 | ser_status = *(++argv); | ||
472 | } else if (strcmp(*argv, "-updatedb") == 0) { | ||
473 | doupdatedb = 1; | ||
474 | } else if (strcmp(*argv, "-crlexts") == 0) { | ||
475 | if (--argc < 1) | ||
476 | goto bad; | ||
477 | crl_ext = *(++argv); | ||
478 | } else if (strcmp(*argv, "-crl_reason") == 0) { | ||
479 | if (--argc < 1) | ||
480 | goto bad; | ||
481 | rev_arg = *(++argv); | ||
482 | rev_type = REV_CRL_REASON; | ||
483 | } else if (strcmp(*argv, "-crl_hold") == 0) { | ||
484 | if (--argc < 1) | ||
485 | goto bad; | ||
486 | rev_arg = *(++argv); | ||
487 | rev_type = REV_HOLD; | ||
488 | } else if (strcmp(*argv, "-crl_compromise") == 0) { | ||
489 | if (--argc < 1) | ||
490 | goto bad; | ||
491 | rev_arg = *(++argv); | ||
492 | rev_type = REV_KEY_COMPROMISE; | ||
493 | } else if (strcmp(*argv, "-crl_CA_compromise") == 0) { | ||
494 | if (--argc < 1) | ||
495 | goto bad; | ||
496 | rev_arg = *(++argv); | ||
497 | rev_type = REV_CA_COMPROMISE; | ||
498 | } | ||
499 | else { | ||
500 | bad: | ||
501 | if (errstr) | ||
502 | BIO_printf(bio_err, "invalid argument %s: %s\n", | ||
503 | *argv, errstr); | ||
504 | else | ||
505 | BIO_printf(bio_err, "unknown option %s\n", *argv); | ||
506 | badops = 1; | ||
507 | break; | ||
508 | } | ||
509 | argc--; | ||
510 | argv++; | ||
511 | } | ||
512 | 700 | ||
513 | if (badops) { | 701 | conf = NULL; |
514 | const char **pp2; | ||
515 | 702 | ||
516 | for (pp2 = ca_usage; (*pp2 != NULL); pp2++) | 703 | if (options_parse(argc, argv, ca_options, NULL, NULL) != 0) { |
517 | BIO_printf(bio_err, "%s", *pp2); | 704 | ca_usage(); |
518 | goto err; | 705 | goto err; |
519 | } | 706 | } |
520 | 707 | ||
521 | /*****************************************************************/ | 708 | /*****************************************************************/ |
522 | tofree = NULL; | 709 | tofree = NULL; |
523 | if (configfile == NULL) | 710 | if (ca_config.configfile == NULL) |
524 | configfile = getenv("OPENSSL_CONF"); | 711 | ca_config.configfile = getenv("OPENSSL_CONF"); |
525 | if (configfile == NULL) { | 712 | if (ca_config.configfile == NULL) { |
526 | if ((tofree = make_config_name()) == NULL) { | 713 | if ((tofree = make_config_name()) == NULL) { |
527 | BIO_printf(bio_err, "error making config file name\n"); | 714 | BIO_printf(bio_err, "error making config file name\n"); |
528 | goto err; | 715 | goto err; |
529 | } | 716 | } |
530 | configfile = tofree; | 717 | ca_config.configfile = tofree; |
531 | } | 718 | } |
532 | BIO_printf(bio_err, "Using configuration from %s\n", configfile); | 719 | BIO_printf(bio_err, "Using configuration from %s\n", ca_config.configfile); |
533 | conf = NCONF_new(NULL); | 720 | conf = NCONF_new(NULL); |
534 | if (NCONF_load(conf, configfile, &errorline) <= 0) { | 721 | if (NCONF_load(conf, ca_config.configfile, &errorline) <= 0) { |
535 | if (errorline <= 0) | 722 | if (errorline <= 0) |
536 | BIO_printf(bio_err, | 723 | BIO_printf(bio_err, |
537 | "error loading the config file '%s'\n", | 724 | "error loading the config file '%s'\n", |
538 | configfile); | 725 | ca_config.configfile); |
539 | else | 726 | else |
540 | BIO_printf(bio_err, | 727 | BIO_printf(bio_err, |
541 | "error on line %ld of config file '%s'\n", | 728 | "error on line %ld of config file '%s'\n", |
542 | errorline, configfile); | 729 | errorline, ca_config.configfile); |
543 | goto err; | 730 | goto err; |
544 | } | 731 | } |
545 | free(tofree); | 732 | free(tofree); |
546 | tofree = NULL; | 733 | tofree = NULL; |
547 | 734 | ||
548 | /* Lets get the config section we are using */ | 735 | /* Lets get the config section we are using */ |
549 | if (section == NULL) { | 736 | if (ca_config.section == NULL) { |
550 | section = NCONF_get_string(conf, BASE_SECTION, ENV_DEFAULT_CA); | 737 | ca_config.section = NCONF_get_string(conf, BASE_SECTION, ENV_DEFAULT_CA); |
551 | if (section == NULL) { | 738 | if (ca_config.section == NULL) { |
552 | lookup_fail(BASE_SECTION, ENV_DEFAULT_CA); | 739 | lookup_fail(BASE_SECTION, ENV_DEFAULT_CA); |
553 | goto err; | 740 | goto err; |
554 | } | 741 | } |
@@ -578,7 +765,7 @@ ca_main(int argc, char **argv) | |||
578 | goto err; | 765 | goto err; |
579 | } | 766 | } |
580 | } | 767 | } |
581 | f = NCONF_get_string(conf, section, STRING_MASK); | 768 | f = NCONF_get_string(conf, ca_config.section, STRING_MASK); |
582 | if (!f) | 769 | if (!f) |
583 | ERR_clear_error(); | 770 | ERR_clear_error(); |
584 | 771 | ||
@@ -587,15 +774,15 @@ ca_main(int argc, char **argv) | |||
587 | "Invalid global string mask setting %s\n", f); | 774 | "Invalid global string mask setting %s\n", f); |
588 | goto err; | 775 | goto err; |
589 | } | 776 | } |
590 | if (chtype != MBSTRING_UTF8) { | 777 | if (ca_config.chtype != MBSTRING_UTF8) { |
591 | f = NCONF_get_string(conf, section, UTF8_IN); | 778 | f = NCONF_get_string(conf, ca_config.section, UTF8_IN); |
592 | if (!f) | 779 | if (!f) |
593 | ERR_clear_error(); | 780 | ERR_clear_error(); |
594 | else if (!strcmp(f, "yes")) | 781 | else if (!strcmp(f, "yes")) |
595 | chtype = MBSTRING_UTF8; | 782 | ca_config.chtype = MBSTRING_UTF8; |
596 | } | 783 | } |
597 | db_attr.unique_subject = 1; | 784 | db_attr.unique_subject = 1; |
598 | p = NCONF_get_string(conf, section, ENV_UNIQUE_SUBJECT); | 785 | p = NCONF_get_string(conf, ca_config.section, ENV_UNIQUE_SUBJECT); |
599 | if (p) { | 786 | if (p) { |
600 | db_attr.unique_subject = parse_yesno(p, 1); | 787 | db_attr.unique_subject = parse_yesno(p, 1); |
601 | } else | 788 | } else |
@@ -611,10 +798,10 @@ ca_main(int argc, char **argv) | |||
611 | } | 798 | } |
612 | /*****************************************************************/ | 799 | /*****************************************************************/ |
613 | /* report status of cert with serial number given on command line */ | 800 | /* report status of cert with serial number given on command line */ |
614 | if (ser_status) { | 801 | if (ca_config.ser_status) { |
615 | if ((dbfile = NCONF_get_string(conf, section, | 802 | if ((dbfile = NCONF_get_string(conf, ca_config.section, |
616 | ENV_DATABASE)) == NULL) { | 803 | ENV_DATABASE)) == NULL) { |
617 | lookup_fail(section, ENV_DATABASE); | 804 | lookup_fail(ca_config.section, ENV_DATABASE); |
618 | goto err; | 805 | goto err; |
619 | } | 806 | } |
620 | db = load_index(dbfile, &db_attr); | 807 | db = load_index(dbfile, &db_attr); |
@@ -624,43 +811,43 @@ ca_main(int argc, char **argv) | |||
624 | if (!index_index(db)) | 811 | if (!index_index(db)) |
625 | goto err; | 812 | goto err; |
626 | 813 | ||
627 | if (get_certificate_status(ser_status, db) != 1) | 814 | if (get_certificate_status(ca_config.ser_status, db) != 1) |
628 | BIO_printf(bio_err, "Error verifying serial %s!\n", | 815 | BIO_printf(bio_err, "Error verifying serial %s!\n", |
629 | ser_status); | 816 | ca_config.ser_status); |
630 | goto err; | 817 | goto err; |
631 | } | 818 | } |
632 | /*****************************************************************/ | 819 | /*****************************************************************/ |
633 | /* we definitely need a private key, so let's get it */ | 820 | /* we definitely need a private key, so let's get it */ |
634 | 821 | ||
635 | if ((keyfile == NULL) && ((keyfile = NCONF_get_string(conf, | 822 | if ((ca_config.keyfile == NULL) && ((ca_config.keyfile = NCONF_get_string(conf, |
636 | section, ENV_PRIVATE_KEY)) == NULL)) { | 823 | ca_config.section, ENV_PRIVATE_KEY)) == NULL)) { |
637 | lookup_fail(section, ENV_PRIVATE_KEY); | 824 | lookup_fail(ca_config.section, ENV_PRIVATE_KEY); |
638 | goto err; | 825 | goto err; |
639 | } | 826 | } |
640 | if (!key) { | 827 | if (!ca_config.key) { |
641 | free_key = 1; | 828 | free_key = 1; |
642 | if (!app_passwd(bio_err, passargin, NULL, &key, NULL)) { | 829 | if (!app_passwd(bio_err, ca_config.passargin, NULL, &ca_config.key, NULL)) { |
643 | BIO_printf(bio_err, "Error getting password\n"); | 830 | BIO_printf(bio_err, "Error getting password\n"); |
644 | goto err; | 831 | goto err; |
645 | } | 832 | } |
646 | } | 833 | } |
647 | pkey = load_key(bio_err, keyfile, keyform, 0, key, "CA private key"); | 834 | pkey = load_key(bio_err, ca_config.keyfile, ca_config.keyform, 0, ca_config.key, "CA private key"); |
648 | if (key) | 835 | if (ca_config.key) |
649 | explicit_bzero(key, strlen(key)); | 836 | explicit_bzero(ca_config.key, strlen(ca_config.key)); |
650 | if (pkey == NULL) { | 837 | if (pkey == NULL) { |
651 | /* load_key() has already printed an appropriate message */ | 838 | /* load_key() has already printed an appropriate message */ |
652 | goto err; | 839 | goto err; |
653 | } | 840 | } |
654 | /*****************************************************************/ | 841 | /*****************************************************************/ |
655 | /* we need a certificate */ | 842 | /* we need a certificate */ |
656 | if (!selfsign || spkac_file || ss_cert_file || gencrl) { | 843 | if (!ca_config.selfsign || ca_config.spkac_file || ca_config.ss_cert_file || ca_config.gencrl) { |
657 | if ((certfile == NULL) && | 844 | if ((ca_config.certfile == NULL) && |
658 | ((certfile = NCONF_get_string(conf, | 845 | ((ca_config.certfile = NCONF_get_string(conf, |
659 | section, ENV_CERTIFICATE)) == NULL)) { | 846 | ca_config.section, ENV_CERTIFICATE)) == NULL)) { |
660 | lookup_fail(section, ENV_CERTIFICATE); | 847 | lookup_fail(ca_config.section, ENV_CERTIFICATE); |
661 | goto err; | 848 | goto err; |
662 | } | 849 | } |
663 | x509 = load_cert(bio_err, certfile, FORMAT_PEM, NULL, | 850 | x509 = load_cert(bio_err, ca_config.certfile, FORMAT_PEM, NULL, |
664 | "CA certificate"); | 851 | "CA certificate"); |
665 | if (x509 == NULL) | 852 | if (x509 == NULL) |
666 | goto err; | 853 | goto err; |
@@ -671,21 +858,21 @@ ca_main(int argc, char **argv) | |||
671 | goto err; | 858 | goto err; |
672 | } | 859 | } |
673 | } | 860 | } |
674 | if (!selfsign) | 861 | if (!ca_config.selfsign) |
675 | x509p = x509; | 862 | x509p = x509; |
676 | 863 | ||
677 | f = NCONF_get_string(conf, BASE_SECTION, ENV_PRESERVE); | 864 | f = NCONF_get_string(conf, BASE_SECTION, ENV_PRESERVE); |
678 | if (f == NULL) | 865 | if (f == NULL) |
679 | ERR_clear_error(); | 866 | ERR_clear_error(); |
680 | if ((f != NULL) && ((*f == 'y') || (*f == 'Y'))) | 867 | if ((f != NULL) && ((*f == 'y') || (*f == 'Y'))) |
681 | preserve = 1; | 868 | ca_config.preserve = 1; |
682 | f = NCONF_get_string(conf, BASE_SECTION, ENV_MSIE_HACK); | 869 | f = NCONF_get_string(conf, BASE_SECTION, ENV_MSIE_HACK); |
683 | if (f == NULL) | 870 | if (f == NULL) |
684 | ERR_clear_error(); | 871 | ERR_clear_error(); |
685 | if ((f != NULL) && ((*f == 'y') || (*f == 'Y'))) | 872 | if ((f != NULL) && ((*f == 'y') || (*f == 'Y'))) |
686 | msie_hack = 1; | 873 | ca_config.msie_hack = 1; |
687 | 874 | ||
688 | f = NCONF_get_string(conf, section, ENV_NAMEOPT); | 875 | f = NCONF_get_string(conf, ca_config.section, ENV_NAMEOPT); |
689 | 876 | ||
690 | if (f) { | 877 | if (f) { |
691 | if (!set_name_ex(&nameopt, f)) { | 878 | if (!set_name_ex(&nameopt, f)) { |
@@ -697,7 +884,7 @@ ca_main(int argc, char **argv) | |||
697 | } else | 884 | } else |
698 | ERR_clear_error(); | 885 | ERR_clear_error(); |
699 | 886 | ||
700 | f = NCONF_get_string(conf, section, ENV_CERTOPT); | 887 | f = NCONF_get_string(conf, ca_config.section, ENV_CERTOPT); |
701 | 888 | ||
702 | if (f) { | 889 | if (f) { |
703 | if (!set_cert_ex(&certopt, f)) { | 890 | if (!set_cert_ex(&certopt, f)) { |
@@ -709,7 +896,7 @@ ca_main(int argc, char **argv) | |||
709 | } else | 896 | } else |
710 | ERR_clear_error(); | 897 | ERR_clear_error(); |
711 | 898 | ||
712 | f = NCONF_get_string(conf, section, ENV_EXTCOPY); | 899 | f = NCONF_get_string(conf, ca_config.section, ENV_EXTCOPY); |
713 | 900 | ||
714 | if (f) { | 901 | if (f) { |
715 | if (!set_ext_copy(&ext_copy, f)) { | 902 | if (!set_ext_copy(&ext_copy, f)) { |
@@ -722,8 +909,8 @@ ca_main(int argc, char **argv) | |||
722 | 909 | ||
723 | /*****************************************************************/ | 910 | /*****************************************************************/ |
724 | /* lookup where to write new certificates */ | 911 | /* lookup where to write new certificates */ |
725 | if (outdir == NULL && req) { | 912 | if (ca_config.outdir == NULL && ca_config.req) { |
726 | if ((outdir = NCONF_get_string(conf, section, | 913 | if ((ca_config.outdir = NCONF_get_string(conf, ca_config.section, |
727 | ENV_NEW_CERTS_DIR)) == NULL) { | 914 | ENV_NEW_CERTS_DIR)) == NULL) { |
728 | BIO_printf(bio_err, "output directory %s not defined\n", | 915 | BIO_printf(bio_err, "output directory %s not defined\n", |
729 | ENV_NEW_CERTS_DIR); | 916 | ENV_NEW_CERTS_DIR); |
@@ -732,8 +919,8 @@ ca_main(int argc, char **argv) | |||
732 | } | 919 | } |
733 | /*****************************************************************/ | 920 | /*****************************************************************/ |
734 | /* we need to load the database file */ | 921 | /* we need to load the database file */ |
735 | if ((dbfile = NCONF_get_string(conf, section, ENV_DATABASE)) == NULL) { | 922 | if ((dbfile = NCONF_get_string(conf, ca_config.section, ENV_DATABASE)) == NULL) { |
736 | lookup_fail(section, ENV_DATABASE); | 923 | lookup_fail(ca_config.section, ENV_DATABASE); |
737 | goto err; | 924 | goto err; |
738 | } | 925 | } |
739 | db = load_index(dbfile, &db_attr); | 926 | db = load_index(dbfile, &db_attr); |
@@ -780,7 +967,7 @@ ca_main(int argc, char **argv) | |||
780 | p++; | 967 | p++; |
781 | } | 968 | } |
782 | } | 969 | } |
783 | if (verbose) { | 970 | if (ca_config.verbose) { |
784 | BIO_set_fp(out, stdout, BIO_NOCLOSE | BIO_FP_TEXT); /* cannot fail */ | 971 | BIO_set_fp(out, stdout, BIO_NOCLOSE | BIO_FP_TEXT); /* cannot fail */ |
785 | TXT_DB_write(out, db->db); | 972 | TXT_DB_write(out, db->db); |
786 | BIO_printf(bio_err, "%d entries loaded from the database\n", | 973 | BIO_printf(bio_err, "%d entries loaded from the database\n", |
@@ -792,8 +979,8 @@ ca_main(int argc, char **argv) | |||
792 | 979 | ||
793 | /*****************************************************************/ | 980 | /*****************************************************************/ |
794 | /* Update the db file for expired certificates */ | 981 | /* Update the db file for expired certificates */ |
795 | if (doupdatedb) { | 982 | if (ca_config.doupdatedb) { |
796 | if (verbose) | 983 | if (ca_config.verbose) |
797 | BIO_printf(bio_err, "Updating %s ...\n", dbfile); | 984 | BIO_printf(bio_err, "Updating %s ...\n", dbfile); |
798 | 985 | ||
799 | i = do_updatedb(db); | 986 | i = do_updatedb(db); |
@@ -801,7 +988,7 @@ ca_main(int argc, char **argv) | |||
801 | BIO_printf(bio_err, "Malloc failure\n"); | 988 | BIO_printf(bio_err, "Malloc failure\n"); |
802 | goto err; | 989 | goto err; |
803 | } else if (i == 0) { | 990 | } else if (i == 0) { |
804 | if (verbose) | 991 | if (ca_config.verbose) |
805 | BIO_printf(bio_err, | 992 | BIO_printf(bio_err, |
806 | "No entries found to mark expired\n"); | 993 | "No entries found to mark expired\n"); |
807 | } else { | 994 | } else { |
@@ -811,86 +998,86 @@ ca_main(int argc, char **argv) | |||
811 | if (!rotate_index(dbfile, "new", "old")) | 998 | if (!rotate_index(dbfile, "new", "old")) |
812 | goto err; | 999 | goto err; |
813 | 1000 | ||
814 | if (verbose) | 1001 | if (ca_config.verbose) |
815 | BIO_printf(bio_err, | 1002 | BIO_printf(bio_err, |
816 | "Done. %d entries marked as expired\n", i); | 1003 | "Done. %d entries marked as expired\n", i); |
817 | } | 1004 | } |
818 | } | 1005 | } |
819 | /*****************************************************************/ | 1006 | /*****************************************************************/ |
820 | /* Read extentions config file */ | 1007 | /* Read extentions config file */ |
821 | if (extfile) { | 1008 | if (ca_config.extfile) { |
822 | extconf = NCONF_new(NULL); | 1009 | extconf = NCONF_new(NULL); |
823 | if (NCONF_load(extconf, extfile, &errorline) <= 0) { | 1010 | if (NCONF_load(extconf, ca_config.extfile, &errorline) <= 0) { |
824 | if (errorline <= 0) | 1011 | if (errorline <= 0) |
825 | BIO_printf(bio_err, | 1012 | BIO_printf(bio_err, |
826 | "ERROR: loading the config file '%s'\n", | 1013 | "ERROR: loading the config file '%s'\n", |
827 | extfile); | 1014 | ca_config.extfile); |
828 | else | 1015 | else |
829 | BIO_printf(bio_err, | 1016 | BIO_printf(bio_err, |
830 | "ERROR: on line %ld of config file '%s'\n", | 1017 | "ERROR: on line %ld of config file '%s'\n", |
831 | errorline, extfile); | 1018 | errorline, ca_config.extfile); |
832 | ret = 1; | 1019 | ret = 1; |
833 | goto err; | 1020 | goto err; |
834 | } | 1021 | } |
835 | if (verbose) | 1022 | if (ca_config.verbose) |
836 | BIO_printf(bio_err, | 1023 | BIO_printf(bio_err, |
837 | "Successfully loaded extensions file %s\n", | 1024 | "Successfully loaded extensions file %s\n", |
838 | extfile); | 1025 | ca_config.extfile); |
839 | 1026 | ||
840 | /* We can have sections in the ext file */ | 1027 | /* We can have sections in the ext file */ |
841 | if (!extensions && !(extensions = NCONF_get_string(extconf, | 1028 | if (!ca_config.extensions && !(ca_config.extensions = NCONF_get_string(extconf, |
842 | "default", "extensions"))) | 1029 | "default", "extensions"))) |
843 | extensions = "default"; | 1030 | ca_config.extensions = "default"; |
844 | } | 1031 | } |
845 | /*****************************************************************/ | 1032 | /*****************************************************************/ |
846 | if (req || gencrl) { | 1033 | if (ca_config.req || ca_config.gencrl) { |
847 | if (outfile != NULL) { | 1034 | if (ca_config.outfile != NULL) { |
848 | if (BIO_write_filename(Sout, outfile) <= 0) { | 1035 | if (BIO_write_filename(Sout, ca_config.outfile) <= 0) { |
849 | perror(outfile); | 1036 | perror(ca_config.outfile); |
850 | goto err; | 1037 | goto err; |
851 | } | 1038 | } |
852 | } else { | 1039 | } else { |
853 | BIO_set_fp(Sout, stdout, BIO_NOCLOSE | BIO_FP_TEXT); | 1040 | BIO_set_fp(Sout, stdout, BIO_NOCLOSE | BIO_FP_TEXT); |
854 | } | 1041 | } |
855 | } | 1042 | } |
856 | if ((md == NULL) && ((md = NCONF_get_string(conf, section, | 1043 | if ((ca_config.md == NULL) && ((ca_config.md = NCONF_get_string(conf, ca_config.section, |
857 | ENV_DEFAULT_MD)) == NULL)) { | 1044 | ENV_DEFAULT_MD)) == NULL)) { |
858 | lookup_fail(section, ENV_DEFAULT_MD); | 1045 | lookup_fail(ca_config.section, ENV_DEFAULT_MD); |
859 | goto err; | 1046 | goto err; |
860 | } | 1047 | } |
861 | if (!strcmp(md, "default")) { | 1048 | if (!strcmp(ca_config.md, "default")) { |
862 | int def_nid; | 1049 | int def_nid; |
863 | if (EVP_PKEY_get_default_digest_nid(pkey, &def_nid) <= 0) { | 1050 | if (EVP_PKEY_get_default_digest_nid(pkey, &def_nid) <= 0) { |
864 | BIO_puts(bio_err, "no default digest\n"); | 1051 | BIO_puts(bio_err, "no default digest\n"); |
865 | goto err; | 1052 | goto err; |
866 | } | 1053 | } |
867 | md = (char *) OBJ_nid2sn(def_nid); | 1054 | ca_config.md = (char *) OBJ_nid2sn(def_nid); |
868 | } | 1055 | } |
869 | if ((dgst = EVP_get_digestbyname(md)) == NULL) { | 1056 | if ((dgst = EVP_get_digestbyname(ca_config.md)) == NULL) { |
870 | BIO_printf(bio_err, | 1057 | BIO_printf(bio_err, |
871 | "%s is an unsupported message digest type\n", md); | 1058 | "%s is an unsupported message digest type\n", ca_config.md); |
872 | goto err; | 1059 | goto err; |
873 | } | 1060 | } |
874 | if (req) { | 1061 | if (ca_config.req) { |
875 | if ((email_dn == 1) && ((tmp_email_dn = NCONF_get_string(conf, | 1062 | if ((ca_config.email_dn == 1) && ((tmp_email_dn = NCONF_get_string(conf, |
876 | section, ENV_DEFAULT_EMAIL_DN)) != NULL)) { | 1063 | ca_config.section, ENV_DEFAULT_EMAIL_DN)) != NULL)) { |
877 | if (strcmp(tmp_email_dn, "no") == 0) | 1064 | if (strcmp(tmp_email_dn, "no") == 0) |
878 | email_dn = 0; | 1065 | ca_config.email_dn = 0; |
879 | } | 1066 | } |
880 | if (verbose) | 1067 | if (ca_config.verbose) |
881 | BIO_printf(bio_err, "message digest is %s\n", | 1068 | BIO_printf(bio_err, "message digest is %s\n", |
882 | OBJ_nid2ln(dgst->type)); | 1069 | OBJ_nid2ln(dgst->type)); |
883 | if ((policy == NULL) && ((policy = NCONF_get_string(conf, | 1070 | if ((ca_config.policy == NULL) && ((ca_config.policy = NCONF_get_string(conf, |
884 | section, ENV_POLICY)) == NULL)) { | 1071 | ca_config.section, ENV_POLICY)) == NULL)) { |
885 | lookup_fail(section, ENV_POLICY); | 1072 | lookup_fail(ca_config.section, ENV_POLICY); |
886 | goto err; | 1073 | goto err; |
887 | } | 1074 | } |
888 | if (verbose) | 1075 | if (ca_config.verbose) |
889 | BIO_printf(bio_err, "policy is %s\n", policy); | 1076 | BIO_printf(bio_err, "policy is %s\n", ca_config.policy); |
890 | 1077 | ||
891 | if ((serialfile = NCONF_get_string(conf, section, | 1078 | if ((serialfile = NCONF_get_string(conf, ca_config.section, |
892 | ENV_SERIAL)) == NULL) { | 1079 | ENV_SERIAL)) == NULL) { |
893 | lookup_fail(section, ENV_SERIAL); | 1080 | lookup_fail(ca_config.section, ENV_SERIAL); |
894 | goto err; | 1081 | goto err; |
895 | } | 1082 | } |
896 | if (!extconf) { | 1083 | if (!extconf) { |
@@ -898,59 +1085,59 @@ ca_main(int argc, char **argv) | |||
898 | * no '-extfile' option, so we look for extensions in | 1085 | * no '-extfile' option, so we look for extensions in |
899 | * the main configuration file | 1086 | * the main configuration file |
900 | */ | 1087 | */ |
901 | if (!extensions) { | 1088 | if (!ca_config.extensions) { |
902 | extensions = NCONF_get_string(conf, section, | 1089 | ca_config.extensions = NCONF_get_string(conf, ca_config.section, |
903 | ENV_EXTENSIONS); | 1090 | ENV_EXTENSIONS); |
904 | if (!extensions) | 1091 | if (!ca_config.extensions) |
905 | ERR_clear_error(); | 1092 | ERR_clear_error(); |
906 | } | 1093 | } |
907 | if (extensions) { | 1094 | if (ca_config.extensions) { |
908 | /* Check syntax of file */ | 1095 | /* Check syntax of file */ |
909 | X509V3_CTX ctx; | 1096 | X509V3_CTX ctx; |
910 | X509V3_set_ctx_test(&ctx); | 1097 | X509V3_set_ctx_test(&ctx); |
911 | X509V3_set_nconf(&ctx, conf); | 1098 | X509V3_set_nconf(&ctx, conf); |
912 | if (!X509V3_EXT_add_nconf(conf, &ctx, | 1099 | if (!X509V3_EXT_add_nconf(conf, &ctx, |
913 | extensions, NULL)) { | 1100 | ca_config.extensions, NULL)) { |
914 | BIO_printf(bio_err, | 1101 | BIO_printf(bio_err, |
915 | "Error Loading extension section %s\n", | 1102 | "Error Loading extension section %s\n", |
916 | extensions); | 1103 | ca_config.extensions); |
917 | ret = 1; | 1104 | ret = 1; |
918 | goto err; | 1105 | goto err; |
919 | } | 1106 | } |
920 | } | 1107 | } |
921 | } | 1108 | } |
922 | if (startdate == NULL) { | 1109 | if (ca_config.startdate == NULL) { |
923 | startdate = NCONF_get_string(conf, section, | 1110 | ca_config.startdate = NCONF_get_string(conf, ca_config.section, |
924 | ENV_DEFAULT_STARTDATE); | 1111 | ENV_DEFAULT_STARTDATE); |
925 | if (startdate == NULL) | 1112 | if (ca_config.startdate == NULL) |
926 | ERR_clear_error(); | 1113 | ERR_clear_error(); |
927 | } | 1114 | } |
928 | if (startdate == NULL) | 1115 | if (ca_config.startdate == NULL) |
929 | startdate = "today"; | 1116 | ca_config.startdate = "today"; |
930 | 1117 | ||
931 | if (enddate == NULL) { | 1118 | if (ca_config.enddate == NULL) { |
932 | enddate = NCONF_get_string(conf, section, | 1119 | ca_config.enddate = NCONF_get_string(conf, ca_config.section, |
933 | ENV_DEFAULT_ENDDATE); | 1120 | ENV_DEFAULT_ENDDATE); |
934 | if (enddate == NULL) | 1121 | if (ca_config.enddate == NULL) |
935 | ERR_clear_error(); | 1122 | ERR_clear_error(); |
936 | } | 1123 | } |
937 | if (days == 0 && enddate == NULL) { | 1124 | if (ca_config.days == 0 && ca_config.enddate == NULL) { |
938 | if (!NCONF_get_number(conf, section, | 1125 | if (!NCONF_get_number(conf, ca_config.section, |
939 | ENV_DEFAULT_DAYS, &days)) | 1126 | ENV_DEFAULT_DAYS, &ca_config.days)) |
940 | days = 0; | 1127 | ca_config.days = 0; |
941 | } | 1128 | } |
942 | if (enddate == NULL && days == 0) { | 1129 | if (ca_config.enddate == NULL && ca_config.days == 0) { |
943 | BIO_printf(bio_err, | 1130 | BIO_printf(bio_err, |
944 | "cannot lookup how many days to certify for\n"); | 1131 | "cannot lookup how many days to certify for\n"); |
945 | goto err; | 1132 | goto err; |
946 | } | 1133 | } |
947 | if ((serial = load_serial(serialfile, create_ser, NULL)) == | 1134 | if ((serial = load_serial(serialfile, ca_config.create_ser, NULL)) == |
948 | NULL) { | 1135 | NULL) { |
949 | BIO_printf(bio_err, | 1136 | BIO_printf(bio_err, |
950 | "error while loading serial number\n"); | 1137 | "error while loading serial number\n"); |
951 | goto err; | 1138 | goto err; |
952 | } | 1139 | } |
953 | if (verbose) { | 1140 | if (ca_config.verbose) { |
954 | if (BN_is_zero(serial)) | 1141 | if (BN_is_zero(serial)) |
955 | BIO_printf(bio_err, | 1142 | BIO_printf(bio_err, |
956 | "next serial number is 00\n"); | 1143 | "next serial number is 00\n"); |
@@ -962,21 +1149,21 @@ ca_main(int argc, char **argv) | |||
962 | free(f); | 1149 | free(f); |
963 | } | 1150 | } |
964 | } | 1151 | } |
965 | if ((attribs = NCONF_get_section(conf, policy)) == NULL) { | 1152 | if ((attribs = NCONF_get_section(conf, ca_config.policy)) == NULL) { |
966 | BIO_printf(bio_err, | 1153 | BIO_printf(bio_err, |
967 | "unable to find 'section' for %s\n", policy); | 1154 | "unable to find 'section' for %s\n", ca_config.policy); |
968 | goto err; | 1155 | goto err; |
969 | } | 1156 | } |
970 | if ((cert_sk = sk_X509_new_null()) == NULL) { | 1157 | if ((cert_sk = sk_X509_new_null()) == NULL) { |
971 | BIO_printf(bio_err, "Memory allocation failure\n"); | 1158 | BIO_printf(bio_err, "Memory allocation failure\n"); |
972 | goto err; | 1159 | goto err; |
973 | } | 1160 | } |
974 | if (spkac_file != NULL) { | 1161 | if (ca_config.spkac_file != NULL) { |
975 | total++; | 1162 | total++; |
976 | j = certify_spkac(&x, spkac_file, pkey, x509, dgst, | 1163 | j = certify_spkac(&x, ca_config.spkac_file, pkey, x509, dgst, |
977 | sigopts, attribs, db, serial, subj, chtype, | 1164 | ca_config.sigopts, attribs, db, serial, ca_config.subj, ca_config.chtype, |
978 | multirdn, email_dn, startdate, enddate, days, | 1165 | ca_config.multirdn, ca_config.email_dn, ca_config.startdate, ca_config.enddate, ca_config.days, |
979 | extensions, conf, verbose, certopt, nameopt, | 1166 | ca_config.extensions, conf, ca_config.verbose, certopt, nameopt, |
980 | default_op, ext_copy); | 1167 | default_op, ext_copy); |
981 | if (j < 0) | 1168 | if (j < 0) |
982 | goto err; | 1169 | goto err; |
@@ -990,18 +1177,18 @@ ca_main(int argc, char **argv) | |||
990 | "Memory allocation failure\n"); | 1177 | "Memory allocation failure\n"); |
991 | goto err; | 1178 | goto err; |
992 | } | 1179 | } |
993 | if (outfile) { | 1180 | if (ca_config.outfile) { |
994 | output_der = 1; | 1181 | output_der = 1; |
995 | batch = 1; | 1182 | ca_config.batch = 1; |
996 | } | 1183 | } |
997 | } | 1184 | } |
998 | } | 1185 | } |
999 | if (ss_cert_file != NULL) { | 1186 | if (ca_config.ss_cert_file != NULL) { |
1000 | total++; | 1187 | total++; |
1001 | j = certify_cert(&x, ss_cert_file, pkey, x509, dgst, | 1188 | j = certify_cert(&x, ca_config.ss_cert_file, pkey, x509, dgst, |
1002 | sigopts, attribs, db, serial, subj, chtype, | 1189 | ca_config.sigopts, attribs, db, serial, ca_config.subj, ca_config.chtype, |
1003 | multirdn, email_dn, startdate, enddate, days, batch, | 1190 | ca_config.multirdn, ca_config.email_dn, ca_config.startdate, ca_config.enddate, ca_config.days, ca_config.batch, |
1004 | extensions, conf, verbose, certopt, nameopt, | 1191 | ca_config.extensions, conf, ca_config.verbose, certopt, nameopt, |
1005 | default_op, ext_copy); | 1192 | default_op, ext_copy); |
1006 | if (j < 0) | 1193 | if (j < 0) |
1007 | goto err; | 1194 | goto err; |
@@ -1017,13 +1204,13 @@ ca_main(int argc, char **argv) | |||
1017 | } | 1204 | } |
1018 | } | 1205 | } |
1019 | } | 1206 | } |
1020 | if (infile != NULL) { | 1207 | if (ca_config.infile != NULL) { |
1021 | total++; | 1208 | total++; |
1022 | j = certify(&x, infile, pkey, x509p, dgst, sigopts, | 1209 | j = certify(&x, ca_config.infile, pkey, x509p, dgst, ca_config.sigopts, |
1023 | attribs, db, serial, subj, chtype, multirdn, | 1210 | attribs, db, serial, ca_config.subj, ca_config.chtype, ca_config.multirdn, |
1024 | email_dn, startdate, enddate, days, batch, | 1211 | ca_config.email_dn, ca_config.startdate, ca_config.enddate, ca_config.days, ca_config.batch, |
1025 | extensions, conf, verbose, certopt, nameopt, | 1212 | ca_config.extensions, conf, ca_config.verbose, certopt, nameopt, |
1026 | default_op, ext_copy, selfsign); | 1213 | default_op, ext_copy, ca_config.selfsign); |
1027 | if (j < 0) | 1214 | if (j < 0) |
1028 | goto err; | 1215 | goto err; |
1029 | if (j > 0) { | 1216 | if (j > 0) { |
@@ -1038,13 +1225,13 @@ ca_main(int argc, char **argv) | |||
1038 | } | 1225 | } |
1039 | } | 1226 | } |
1040 | } | 1227 | } |
1041 | for (i = 0; i < argc; i++) { | 1228 | for (i = 0; i < ca_config.infiles_num; i++) { |
1042 | total++; | 1229 | total++; |
1043 | j = certify(&x, argv[i], pkey, x509p, dgst, sigopts, | 1230 | j = certify(&x, ca_config.infiles[i], pkey, x509p, dgst, ca_config.sigopts, |
1044 | attribs, db, serial, subj, chtype, multirdn, | 1231 | attribs, db, serial, ca_config.subj, ca_config.chtype, ca_config.multirdn, |
1045 | email_dn, startdate, enddate, days, batch, | 1232 | ca_config.email_dn, ca_config.startdate, ca_config.enddate, ca_config.days, ca_config.batch, |
1046 | extensions, conf, verbose, certopt, nameopt, | 1233 | ca_config.extensions, conf, ca_config.verbose, certopt, nameopt, |
1047 | default_op, ext_copy, selfsign); | 1234 | default_op, ext_copy, ca_config.selfsign); |
1048 | if (j < 0) | 1235 | if (j < 0) |
1049 | goto err; | 1236 | goto err; |
1050 | if (j > 0) { | 1237 | if (j > 0) { |
@@ -1065,7 +1252,7 @@ ca_main(int argc, char **argv) | |||
1065 | */ | 1252 | */ |
1066 | 1253 | ||
1067 | if (sk_X509_num(cert_sk) > 0) { | 1254 | if (sk_X509_num(cert_sk) > 0) { |
1068 | if (!batch) { | 1255 | if (!ca_config.batch) { |
1069 | char answer[10]; | 1256 | char answer[10]; |
1070 | 1257 | ||
1071 | BIO_printf(bio_err, "\n%d out of %d certificate requests certified, commit? [y/n]", total_done, total); | 1258 | BIO_printf(bio_err, "\n%d out of %d certificate requests certified, commit? [y/n]", total_done, total); |
@@ -1089,7 +1276,7 @@ ca_main(int argc, char **argv) | |||
1089 | if (!save_index(dbfile, "new", db)) | 1276 | if (!save_index(dbfile, "new", db)) |
1090 | goto err; | 1277 | goto err; |
1091 | } | 1278 | } |
1092 | if (verbose) | 1279 | if (ca_config.verbose) |
1093 | BIO_printf(bio_err, "writing new certificates\n"); | 1280 | BIO_printf(bio_err, "writing new certificates\n"); |
1094 | for (i = 0; i < sk_X509_num(cert_sk); i++) { | 1281 | for (i = 0; i < sk_X509_num(cert_sk); i++) { |
1095 | int k; | 1282 | int k; |
@@ -1107,7 +1294,7 @@ ca_main(int argc, char **argv) | |||
1107 | serialstr = strdup("00"); | 1294 | serialstr = strdup("00"); |
1108 | if (serialstr) { | 1295 | if (serialstr) { |
1109 | k = snprintf(pempath, sizeof(pempath), | 1296 | k = snprintf(pempath, sizeof(pempath), |
1110 | "%s/%s.pem", outdir, serialstr); | 1297 | "%s/%s.pem", ca_config.outdir, serialstr); |
1111 | free(serialstr); | 1298 | free(serialstr); |
1112 | if (k < 0 || k >= sizeof(pempath)) { | 1299 | if (k < 0 || k >= sizeof(pempath)) { |
1113 | BIO_printf(bio_err, | 1300 | BIO_printf(bio_err, |
@@ -1119,15 +1306,15 @@ ca_main(int argc, char **argv) | |||
1119 | "memory allocation failed\n"); | 1306 | "memory allocation failed\n"); |
1120 | goto err; | 1307 | goto err; |
1121 | } | 1308 | } |
1122 | if (verbose) | 1309 | if (ca_config.verbose) |
1123 | BIO_printf(bio_err, "writing %s\n", pempath); | 1310 | BIO_printf(bio_err, "writing %s\n", pempath); |
1124 | 1311 | ||
1125 | if (BIO_write_filename(Cout, pempath) <= 0) { | 1312 | if (BIO_write_filename(Cout, pempath) <= 0) { |
1126 | perror(pempath); | 1313 | perror(pempath); |
1127 | goto err; | 1314 | goto err; |
1128 | } | 1315 | } |
1129 | write_new_certificate(Cout, x, 0, notext); | 1316 | write_new_certificate(Cout, x, 0, ca_config.notext); |
1130 | write_new_certificate(Sout, x, output_der, notext); | 1317 | write_new_certificate(Sout, x, output_der, ca_config.notext); |
1131 | } | 1318 | } |
1132 | 1319 | ||
1133 | if (sk_X509_num(cert_sk)) { | 1320 | if (sk_X509_num(cert_sk)) { |
@@ -1142,27 +1329,27 @@ ca_main(int argc, char **argv) | |||
1142 | } | 1329 | } |
1143 | } | 1330 | } |
1144 | /*****************************************************************/ | 1331 | /*****************************************************************/ |
1145 | if (gencrl) { | 1332 | if (ca_config.gencrl) { |
1146 | int crl_v2 = 0; | 1333 | int crl_v2 = 0; |
1147 | if (!crl_ext) { | 1334 | if (!ca_config.crl_ext) { |
1148 | crl_ext = NCONF_get_string(conf, section, ENV_CRLEXT); | 1335 | ca_config.crl_ext = NCONF_get_string(conf, ca_config.section, ENV_CRLEXT); |
1149 | if (!crl_ext) | 1336 | if (!ca_config.crl_ext) |
1150 | ERR_clear_error(); | 1337 | ERR_clear_error(); |
1151 | } | 1338 | } |
1152 | if (crl_ext) { | 1339 | if (ca_config.crl_ext) { |
1153 | /* Check syntax of file */ | 1340 | /* Check syntax of file */ |
1154 | X509V3_CTX ctx; | 1341 | X509V3_CTX ctx; |
1155 | X509V3_set_ctx_test(&ctx); | 1342 | X509V3_set_ctx_test(&ctx); |
1156 | X509V3_set_nconf(&ctx, conf); | 1343 | X509V3_set_nconf(&ctx, conf); |
1157 | if (!X509V3_EXT_add_nconf(conf, &ctx, crl_ext, NULL)) { | 1344 | if (!X509V3_EXT_add_nconf(conf, &ctx, ca_config.crl_ext, NULL)) { |
1158 | BIO_printf(bio_err, | 1345 | BIO_printf(bio_err, |
1159 | "Error Loading CRL extension section %s\n", | 1346 | "Error Loading CRL extension section %s\n", |
1160 | crl_ext); | 1347 | ca_config.crl_ext); |
1161 | ret = 1; | 1348 | ret = 1; |
1162 | goto err; | 1349 | goto err; |
1163 | } | 1350 | } |
1164 | } | 1351 | } |
1165 | if ((crlnumberfile = NCONF_get_string(conf, section, | 1352 | if ((crlnumberfile = NCONF_get_string(conf, ca_config.section, |
1166 | ENV_CRLNUMBER)) != NULL) | 1353 | ENV_CRLNUMBER)) != NULL) |
1167 | if ((crlnumber = load_serial(crlnumberfile, 0, | 1354 | if ((crlnumber = load_serial(crlnumberfile, 0, |
1168 | NULL)) == NULL) { | 1355 | NULL)) == NULL) { |
@@ -1170,20 +1357,20 @@ ca_main(int argc, char **argv) | |||
1170 | "error while loading CRL number\n"); | 1357 | "error while loading CRL number\n"); |
1171 | goto err; | 1358 | goto err; |
1172 | } | 1359 | } |
1173 | if (!crldays && !crlhours && !crlsec) { | 1360 | if (!ca_config.crldays && !ca_config.crlhours && !ca_config.crlsec) { |
1174 | if (!NCONF_get_number(conf, section, | 1361 | if (!NCONF_get_number(conf, ca_config.section, |
1175 | ENV_DEFAULT_CRL_DAYS, &crldays)) | 1362 | ENV_DEFAULT_CRL_DAYS, &ca_config.crldays)) |
1176 | crldays = 0; | 1363 | ca_config.crldays = 0; |
1177 | if (!NCONF_get_number(conf, section, | 1364 | if (!NCONF_get_number(conf, ca_config.section, |
1178 | ENV_DEFAULT_CRL_HOURS, &crlhours)) | 1365 | ENV_DEFAULT_CRL_HOURS, &ca_config.crlhours)) |
1179 | crlhours = 0; | 1366 | ca_config.crlhours = 0; |
1180 | ERR_clear_error(); | 1367 | ERR_clear_error(); |
1181 | } | 1368 | } |
1182 | if ((crldays == 0) && (crlhours == 0) && (crlsec == 0)) { | 1369 | if ((ca_config.crldays == 0) && (ca_config.crlhours == 0) && (ca_config.crlsec == 0)) { |
1183 | BIO_printf(bio_err, "cannot lookup how long until the next CRL is issued\n"); | 1370 | BIO_printf(bio_err, "cannot lookup how long until the next CRL is issued\n"); |
1184 | goto err; | 1371 | goto err; |
1185 | } | 1372 | } |
1186 | if (verbose) | 1373 | if (ca_config.verbose) |
1187 | BIO_printf(bio_err, "making CRL\n"); | 1374 | BIO_printf(bio_err, "making CRL\n"); |
1188 | if ((crl = X509_CRL_new()) == NULL) | 1375 | if ((crl = X509_CRL_new()) == NULL) |
1189 | goto err; | 1376 | goto err; |
@@ -1195,8 +1382,8 @@ ca_main(int argc, char **argv) | |||
1195 | goto err; | 1382 | goto err; |
1196 | X509_gmtime_adj(tmptm, 0); | 1383 | X509_gmtime_adj(tmptm, 0); |
1197 | X509_CRL_set_lastUpdate(crl, tmptm); | 1384 | X509_CRL_set_lastUpdate(crl, tmptm); |
1198 | if (!X509_time_adj_ex(tmptm, crldays, | 1385 | if (!X509_time_adj_ex(tmptm, ca_config.crldays, |
1199 | crlhours * 60 * 60 + crlsec, NULL)) { | 1386 | ca_config.crlhours * 60 * 60 + ca_config.crlsec, NULL)) { |
1200 | BIO_puts(bio_err, "error setting CRL nextUpdate\n"); | 1387 | BIO_puts(bio_err, "error setting CRL nextUpdate\n"); |
1201 | goto err; | 1388 | goto err; |
1202 | } | 1389 | } |
@@ -1233,19 +1420,19 @@ ca_main(int argc, char **argv) | |||
1233 | X509_CRL_sort(crl); | 1420 | X509_CRL_sort(crl); |
1234 | 1421 | ||
1235 | /* we now have a CRL */ | 1422 | /* we now have a CRL */ |
1236 | if (verbose) | 1423 | if (ca_config.verbose) |
1237 | BIO_printf(bio_err, "signing CRL\n"); | 1424 | BIO_printf(bio_err, "signing CRL\n"); |
1238 | 1425 | ||
1239 | /* Add any extensions asked for */ | 1426 | /* Add any extensions asked for */ |
1240 | 1427 | ||
1241 | if (crl_ext || crlnumberfile != NULL) { | 1428 | if (ca_config.crl_ext || crlnumberfile != NULL) { |
1242 | X509V3_CTX crlctx; | 1429 | X509V3_CTX crlctx; |
1243 | X509V3_set_ctx(&crlctx, x509, NULL, NULL, crl, 0); | 1430 | X509V3_set_ctx(&crlctx, x509, NULL, NULL, crl, 0); |
1244 | X509V3_set_nconf(&crlctx, conf); | 1431 | X509V3_set_nconf(&crlctx, conf); |
1245 | 1432 | ||
1246 | if (crl_ext) | 1433 | if (ca_config.crl_ext) |
1247 | if (!X509V3_EXT_CRL_add_nconf(conf, &crlctx, | 1434 | if (!X509V3_EXT_CRL_add_nconf(conf, &crlctx, |
1248 | crl_ext, crl)) | 1435 | ca_config.crl_ext, crl)) |
1249 | goto err; | 1436 | goto err; |
1250 | if (crlnumberfile != NULL) { | 1437 | if (crlnumberfile != NULL) { |
1251 | tmpser = BN_to_ASN1_INTEGER(crlnumber, NULL); | 1438 | tmpser = BN_to_ASN1_INTEGER(crlnumber, NULL); |
@@ -1259,7 +1446,7 @@ ca_main(int argc, char **argv) | |||
1259 | goto err; | 1446 | goto err; |
1260 | } | 1447 | } |
1261 | } | 1448 | } |
1262 | if (crl_ext || crl_v2) { | 1449 | if (ca_config.crl_ext || crl_v2) { |
1263 | if (!X509_CRL_set_version(crl, 1)) | 1450 | if (!X509_CRL_set_version(crl, 1)) |
1264 | goto err; /* version 2 CRL */ | 1451 | goto err; /* version 2 CRL */ |
1265 | } | 1452 | } |
@@ -1272,7 +1459,7 @@ ca_main(int argc, char **argv) | |||
1272 | BN_free(crlnumber); | 1459 | BN_free(crlnumber); |
1273 | crlnumber = NULL; | 1460 | crlnumber = NULL; |
1274 | } | 1461 | } |
1275 | if (!do_X509_CRL_sign(bio_err, crl, pkey, dgst, sigopts)) | 1462 | if (!do_X509_CRL_sign(bio_err, crl, pkey, dgst, ca_config.sigopts)) |
1276 | goto err; | 1463 | goto err; |
1277 | 1464 | ||
1278 | PEM_write_bio_X509_CRL(Sout, crl); | 1465 | PEM_write_bio_X509_CRL(Sout, crl); |
@@ -1283,17 +1470,17 @@ ca_main(int argc, char **argv) | |||
1283 | 1470 | ||
1284 | } | 1471 | } |
1285 | /*****************************************************************/ | 1472 | /*****************************************************************/ |
1286 | if (dorevoke) { | 1473 | if (ca_config.dorevoke) { |
1287 | if (infile == NULL) { | 1474 | if (ca_config.infile == NULL) { |
1288 | BIO_printf(bio_err, "no input files\n"); | 1475 | BIO_printf(bio_err, "no input files\n"); |
1289 | goto err; | 1476 | goto err; |
1290 | } else { | 1477 | } else { |
1291 | X509 *revcert; | 1478 | X509 *revcert; |
1292 | revcert = load_cert(bio_err, infile, FORMAT_PEM, | 1479 | revcert = load_cert(bio_err, ca_config.infile, FORMAT_PEM, |
1293 | NULL, infile); | 1480 | NULL, ca_config.infile); |
1294 | if (revcert == NULL) | 1481 | if (revcert == NULL) |
1295 | goto err; | 1482 | goto err; |
1296 | j = do_revoke(revcert, db, rev_type, rev_arg); | 1483 | j = do_revoke(revcert, db, ca_config.rev_type, ca_config.rev_arg); |
1297 | if (j <= 0) | 1484 | if (j <= 0) |
1298 | goto err; | 1485 | goto err; |
1299 | X509_free(revcert); | 1486 | X509_free(revcert); |
@@ -1323,13 +1510,13 @@ ca_main(int argc, char **argv) | |||
1323 | 1510 | ||
1324 | if (ret) | 1511 | if (ret) |
1325 | ERR_print_errors(bio_err); | 1512 | ERR_print_errors(bio_err); |
1326 | if (free_key && key) | 1513 | if (free_key && ca_config.key) |
1327 | free(key); | 1514 | free(ca_config.key); |
1328 | BN_free(serial); | 1515 | BN_free(serial); |
1329 | BN_free(crlnumber); | 1516 | BN_free(crlnumber); |
1330 | free_index(db); | 1517 | free_index(db); |
1331 | if (sigopts) | 1518 | if (ca_config.sigopts) |
1332 | sk_OPENSSL_STRING_free(sigopts); | 1519 | sk_OPENSSL_STRING_free(ca_config.sigopts); |
1333 | EVP_PKEY_free(pkey); | 1520 | EVP_PKEY_free(pkey); |
1334 | if (x509) | 1521 | if (x509) |
1335 | X509_free(x509); | 1522 | X509_free(x509); |
@@ -1526,7 +1713,7 @@ do_body(X509 ** xret, EVP_PKEY * pkey, X509 * x509, const EVP_MD * dgst, | |||
1526 | str = X509_NAME_ENTRY_get_data(ne); | 1713 | str = X509_NAME_ENTRY_get_data(ne); |
1527 | obj = X509_NAME_ENTRY_get_object(ne); | 1714 | obj = X509_NAME_ENTRY_get_object(ne); |
1528 | 1715 | ||
1529 | if (msie_hack) { | 1716 | if (ca_config.msie_hack) { |
1530 | /* assume all type should be strings */ | 1717 | /* assume all type should be strings */ |
1531 | nid = OBJ_obj2nid(ne->object); | 1718 | nid = OBJ_obj2nid(ne->object); |
1532 | 1719 | ||
@@ -1659,7 +1846,7 @@ again2: | |||
1659 | } | 1846 | } |
1660 | } | 1847 | } |
1661 | 1848 | ||
1662 | if (preserve) { | 1849 | if (ca_config.preserve) { |
1663 | X509_NAME_free(subject); | 1850 | X509_NAME_free(subject); |
1664 | /* subject=X509_NAME_dup(X509_REQ_get_subject_name(req)); */ | 1851 | /* subject=X509_NAME_dup(X509_REQ_get_subject_name(req)); */ |
1665 | subject = X509_NAME_dup(name); | 1852 | subject = X509_NAME_dup(name); |