OpenPKG CVS Repository
http://cvs.openpkg.org/
____________________________________________________________________________
Server: cvs.openpkg.org Name: Ralf S. Engelschall
Root: /v/openpkg/cvs Email: [EMAIL PROTECTED]
Module: openpkg-src Date: 06-May-2005 21:54:12
Branch: HEAD Handle: 2005050620541100
Added files:
openpkg-src/csp csp.patch.cvs
Modified files:
openpkg-src/csp csp.patch csp.spec
Log:
apply the changes the upstream author has in its CVS
Summary:
Revision Changes Path
1.3 +0 -46 openpkg-src/csp/csp.patch
1.1 +1814 -0 openpkg-src/csp/csp.patch.cvs
1.2 +3 -2 openpkg-src/csp/csp.spec
____________________________________________________________________________
patch -p0 <<'@@ .'
Index: openpkg-src/csp/csp.patch
============================================================================
$ cvs diff -u -r1.2 -r1.3 csp.patch
--- openpkg-src/csp/csp.patch 2 May 2005 17:43:38 -0000 1.2
+++ openpkg-src/csp/csp.patch 6 May 2005 19:54:11 -0000 1.3
@@ -1,49 +1,3 @@
-Index: CSP.pm
---- CSP.pm.orig 2002-09-24 20:33:20 +0200
-+++ CSP.pm 2005-05-02 19:41:28 +0200
-@@ -1523,12 +1523,12 @@
- CSP is designed to easily handle multiple distinct Certificate Authorities.
- Hence the name which stands for Certificate Service Provider.
-
--= item o
-+=item o
-
- CSP can be used to produce a web site (certificate repository, CRLs etc etc)
- without the need for cgi-scripts.
-
--= item o
-+=item o
-
- CSP tries to be as PKIX-compliant as OpenSSL allows.
-
-@@ -1551,22 +1551,22 @@
- writer or some other means for making backups of the certificate directory.
- Day to day operations include the following tasks.
-
--= over 4
-+=over 4
-
--= item 1
-+=item 1
-
- Issuing certificates based on pkcs10 or out-of-band (non pkcs10) requests.
-
--= item 2
-+=item 2
-
- Backing up the csp main directory (see below) to read-only medium.
-
--= item 3
-+=item 3
-
- Producing the public web site and exporting it (typically using floppy or
- zip-drive) to your web server.
-
--= back
-+=back
-
- =head1 CONFIGURATION
-
Index: ca/etc/extensions.conf
--- ca/etc/extensions.conf.orig 2001-05-28 13:04:20 +0200
+++ ca/etc/extensions.conf 2005-05-02 19:42:39 +0200
@@ .
patch -p0 <<'@@ .'
Index: openpkg-src/csp/csp.patch.cvs
============================================================================
$ cvs diff -u -r0 -r1.1 csp.patch.cvs
--- /dev/null 2005-05-06 21:45:06 +0200
+++ csp.patch.cvs 2005-05-06 21:54:12 +0200
@@ -0,0 +1,1814 @@
+Unreleased changes from upstream author CVS
+http://devel.it.su.se/cgi-bin/local/cvsweb.cgi/CSP/
+
+Index: CSP.pm
+--- CSP.pm.orig 2002-09-24 20:33:20 +0200
++++ CSP.pm 2005-05-06 21:42:11 +0200
+@@ -8,6 +8,7 @@
+ use IO::File;
+ use Term::Prompt;
+ use POSIX qw(strftime);
++use Date::Calc qw(Day_of_Week Gmtime Add_Delta_Days Add_Delta_DHMS);
+
+ @ISA = qw(Exporter AutoLoader);
+ # Items to export into callers namespace by default. Note: do not export
+@@ -15,7 +16,7 @@
+ # Do not simply export all your public functions/methods/constants.
+ @EXPORT = qw();
+ @EXPORT_OK = qw($_openssl);
+-$VERSION = '0.26';
++$VERSION = '0.29';
+
+
+ # Preloaded methods go here.
+@@ -49,7 +50,7 @@
+ my $me = bless { dir=>$dir,name=>$name },$class;
+
+ open ALIASES,"$dir/etc/aliases.txt";
+- while (<ALIASES>)
++ while (<ALIASES>)
+ {
+ chomp;
+ next unless /\s*([^:]+)\s*:\s*([^:]+)\s*/;
+@@ -58,6 +59,8 @@
+ }
+ close ALIASES;
+
++ $me->{openssl} = CSP::OpenSSL->new($me);
++
+ $me;
+ }
+
+@@ -158,7 +161,7 @@
+
+ $self->mppFile($cf,$vars,$1),last SWITCH if /^%include\s+(.+)/;
+
+- $cf->print(&_rewrite($vars,$_));
++ print $cf &_rewrite($vars,$_);
+ }
+ }
+ close IN;
+@@ -168,11 +171,11 @@
+ {
+ my $self = shift;
+ my $cmd = shift;
+- my $vars = shift;
++ my $args = shift;
+
+ my $cadir = "$self->{dir}/csp/$self->{name}";
+
+- $ENV{TMPDIR} = '/tmp' unless exists $ENV{TMPDIR};
++ $ENV{TMPDIR} ||= ("$self->{dir}/tmp" || '/tmp');
+ my $cff = $self->tempFile("csp","conf");
+ my $cf = IO::File->new();
+ eval
+@@ -187,15 +190,30 @@
+ \#\# by hand. Please see the CSP-documentation for details.
+ \#\# $date
+
++openssl_conf = openssl_init
++
++[openssl_init]
++engines = engine_section
++oid_section = oids
++
++[engine_section]
++EOW
++
++ $ENV{CSP_OPENSC} && $cf->print(<<EOW);
++opensc = opensc_section
++
++[opensc_section]
++dynamic_path = $ENV{CSP_OPENSC}/lib/opensc/engine_opensc.so
++
+ EOW
+
+ ## Default section
+- $cf->print("\noid_section = oids\n\n[ oids ]\n");
++ $cf->print("[ oids ]\n");
+ $self->addFile($cf,"$self->{dir}/etc/oids.conf");
+
+ $cf->print("\n[ csp ]\n\n");
+ my ($k,$v);
+- while (($k,$v) = each %{$vars})
++ while (($k,$v) = each %{$args})
+ {
+ $cf->print("$k\t= $v\n") if ($k ne 'keypass' && $k ne 'capass');
+ }
+@@ -209,9 +227,9 @@
+ [ ca ]
+
+ default_ca = $self->{name}
+-
++
+ [ $self->{name} ]
+-
++
+ dir = \${csp::home}/csp/\${csp::ca}
+ certs = \$dir/certs
+ database = \$dir/index.txt
+@@ -228,7 +246,7 @@
+ policy = policy
+
+ [ req ]
+-
++
+ default_bits = \${csp::keysize}
+ default_keyfile = privkey.pem
+ distinguished_name = req_dn
+@@ -241,15 +259,15 @@
+
+ ## Extension based on command
+
+- my $type = $vars->{type};
++ my $type = $args->{type};
+ my $name = $self->{name};
+- if ($cmd eq 'x509' || $cmd eq 'req' || $cmd eq 'ca')
++ if ($cmd eq 'x509' || $cmd eq 'req' || $cmd eq 'ca')
+ {
+- $self->die("missing \"type\" parameter")
++ $self->die("missing \"type\" parameter")
+ unless $type;
+
+ $cf->print("[ policy ]\n\n");
+- foreach my $attr (keys %{$vars->{name_attributes}})
++ foreach my $attr (keys %{$args->{name_attributes}})
+ {
+ next unless $attr;
+ if ($self->{aname}->{lc($attr)})
+@@ -261,43 +279,43 @@
+ $cf->print("$attr = optional\n");
+ }
+ }
+-
++
+ ## Define a few CPP/MPP-style variables and run the prototype file
+- $vars->{uc("type_$type")}++;
+- foreach my $x (qw(email url ip dns))
++ $args->{uc("type_$type")}++;
++ foreach my $x (qw(email url ip dns))
+ {
+- $vars->{uc($x)} = $vars->{$x};
++ $args->{uc($x)} = $args->{$x};
+ }
+ $cf->print("\n\n");
+- if ($name)
++ if ($name)
+ {
+ my $econf = "$self->{dir}/csp/$name/extensions.conf";
+ $econf = "$self->{dir}/etc/extensions.conf" unless -f $econf;
+
+- $self->mppFile($cf,$vars,$econf);
++ $self->mppFile($cf,$args,$econf);
+ }
+ $cf->print("\n\n");
+- if ($name)
++ if ($name)
+ {
+ my $econf = "$self->{dir}/csp/$name/crl_extensions.conf";
+ $econf = "$self->{dir}/etc/crl_extensions.conf" unless -f
$econf;
+
+- $self->mppFile($cf,$vars,$econf);
++ $self->mppFile($cf,$args,$econf);
+ }
+ $cf->print("\n");
+ }
+
+- my $dn = $vars->{dn};
+- if ($dn)
++ my $dn = $args->{dn};
++ if ($dn)
+ {
+ my %acount;
+-
++
+ $cf->print("[ req_dn ]\n\n");
+ foreach my $rdn (split /\s*,\s*/,$dn)
+ {
+ next unless $rdn =~ /^([^=]+)\s*=\s*([^=]+)$/;
+ my $n = exists $self->{aname}->{lc($1)} ?
$self->{aname}->{lc($1)} : $1;
+- $vars->{_nrdn}++; ## At the end of the run _nrdn contains the
++ $args->{_nrdn}++; ## At the end of the run _nrdn contains the
+ ## number of newlines to send to openssl.
+ my $pos = $acount{$n}++;
+ $cf->print($pos.".${n}\t\t= $2\n");
+@@ -307,13 +325,13 @@
+
+ $cf->close;
+ };
+- if ($@)
++ if ($@)
+ {
+ $cf->close;
+ #unlink $cff; ## uncomment when debugging
+ $self->die($@);
+ }
+-
++
+ return $cff;
+ }
+
+@@ -321,7 +339,7 @@
+ {
+ my $self = shift;
+ my $dir = $self->caDir();
+-
++
+ mkdir $dir,00755;
+ mkdir "$dir/certs",00755;
+ open SERIAL,">$dir/serial";
+@@ -329,7 +347,7 @@
+ close SERIAL;
+ mkdir "$dir/tmp",00700;
+ system('touch',"$dir/index.txt");
+-
++
+ mkdir "$dir/private",00700;
+ mkdir "$dir/private/keys",00700;
+
system('cp','-p',"$self->{dir}/etc/extensions.conf","$dir/extensions.conf");
+@@ -337,12 +355,12 @@
+ system('cp','-rp',"$self->{dir}/etc/public_html","$dir/");
+ }
+
+-sub caDir
++sub caDir
+ {
+ my $self = shift;
+ my $name = $self->{name};
+ $self->die("CA Name not set") unless $name;
+-
++
+ "$self->{dir}/csp/$self->{name}";
+ }
+
+@@ -360,9 +378,9 @@
+ my $self = shift;
+ my $comment = shift;
+ my $reenter = shift;
+-
++
+ my ($pw,$pwr);
+-
++
+ system("stty -echo") &&
+ $self->die("Unable to configure tty for password entry");
+
+@@ -370,22 +388,22 @@
+ chop($pw = <STDIN>);
+ print STDERR "\n";
+
+- if ($reenter)
++ if ($reenter)
+ {
+ $pwr = $self->getPassword("Re-enter $comment");
+ }
+- else
++ else
+ {
+ $pwr = $pw;
+ }
+-
++
+ system("stty echo") &&
+ $self->die("Unable to configure tty for password entry");
+-
++
+ $self->die("Passwords do not match")
+ unless $pw eq $pwr;
+
+- $self->die("Zero-length password")
++ return undef
+ if length($pw) == 0;
+
+ $pw;
+@@ -398,17 +416,14 @@
+
+ $self->die("Required parameter keyfile missing")
+ unless $args->{keyfile};
+-
++
+ $args->{keysize} = 1024 unless $args->{keysize} > 0;
+- $args->{keypass} = $self->getPassword("Private key password",1);
+-
+- my $process =
+- CSP::OpenSSL->new($self,
+- 'genrsa',
+- "-des3 -passout stdin -out $args->{keyfile}
$args->{keysize}",$args);
+-
+- $process->print($args->{keypass});
+- $process->closeok();
++ $args->{keypass} = $self->getPassword("Private key password",1)
++ unless $args->{keypass};
++
++ my $cmd = "-out $args->{keyfile} $args->{keysize}";
++ $cmd = "-des3 -passout pass:$args->{keypass} ".$cmd if
defined($args->{keypass});
++ $self->{openssl}->cmd('genrsa',$cmd,$args);
+ }
+
+ sub create
+@@ -417,35 +432,35 @@
+ my $args = shift;
+
+ $self->createFiles();
+- $self->warn("Successfully created CA $self->{name}")
+- unless $args->{verobse} > 1;
++ $self->warn("Successfully created CA $self->{name}")
++ if $args->{verbose};
+ }
+
+ sub delete
+ {
+ my $self = shift;
+ my $args = shift;
+-
++
+ my $dir = $self->caDir();
+
+ system('rm','-rf',$dir);
+- $self->warn("Successfully deleted CA $self->{name}")
+- unless $args->{verbose} > 1;
++ $self->warn("Successfully deleted CA $self->{name}")
++ if $args->{verbose};
+ }
+
+ sub init
+ {
+ my $self = shift;
+ my $args = shift;
+-
++
+ my $dir = $self->caDir();
+- $self->create($args) unless -d $dir;
+-
++ $self->die("You must create the CA before it can be initialized")
unless -d $dir;
++
+ if ($args->{crtfile})
+ {
+ system('cp',$args->{crtfile},"$dir/ca.crt");
+- $self->warn("Successfully initialized CA $self->{name}")
+- unless $args->{verbose} > 1;
++ $self->warn("Successfully initialized CA $self->{name}")
++ if $args->{verbose};
+ }
+ else
+ {
+@@ -458,38 +473,38 @@
+ my $cakey = "$dir/private/ca.key";
+ my $cacert = "$dir/ca.crt";
+
+- ## Generate the CA key
+- $self->warn("Generating CA key")
+- unless $args->{verbose} > 1;
+- $args->{keyfile} = $cakey;
+- $self->genkey($args) or
+- $self->die("Unable to generate CA key in $cakey");
++ unless (-f $args->{keyfile})
++ {
++ ## Generate the CA key
++ $self->warn("Generating CA key")
++ if $args->{verbose};
++ $args->{keyfile} = $cakey;
++ defined $self->genkey($args) or
++ $self->die("Unable to generate CA key in $cakey");
++ $self->die("CA key must have a password")
++ unless defined($args->{keypass});
++ }
+
+ $args->{capass} = $args->{keypass};
+
+ ## Generate and optionally self-sign the request
+ my $process;
+ my $what;
+- my $common_args = "-$args->{digest} -days $args->{days} -key $cakey
-passin stdin";
++ my $common_args = "-$args->{digest} -days $args->{days} ".
++ " -key $cakey -passin pass:$args->{keypass}";
+ if ($args->{csrfile})
+ {
+- $process =
+- $self->req("-new $common_args -out $args->{csrfile}",$args);
+- $process->print("$args->{keypass}\n");
+- $process->closeok();
++ $self->{openssl}->cmd('req',"-new $common_args -out
$args->{csrfile}",$args);
+ $what = "generated CA request for";
+ }
+- else
++ else
+ {
+- $process =
+- $self->req("-x509 $common_args -new -out $cacert",$args);
+- $process->print("$args->{keypass}\n");
+- $process->closeok();
++ $self->{openssl}->cmd('req',"-x509 $common_args -new -out
$cacert",$args);
+ $what = "initialized self-signed";
+ }
+
+- $self->warn("Successfully $what CA $self->{name}")
+- unless $args->{verbose} > 1;
++ $self->warn("Successfully $what CA $self->{name}")
++ if $args->{verbose};
+ }
+ }
+
+@@ -497,13 +512,13 @@
+ {
+ my $self = shift;
+ my $dir = $self->caDir();
+-
++
+ $self->die("Uninitialized CA: missing or unreadable ca certificate")
+ unless -r "$dir/ca.crt";
+
+ $self->die("Uninitialized CA: missing or unreadable ca private key")
+ unless -r "$dir/private/ca.key";
+-
++
+ $dir;
+ }
+
+@@ -518,7 +533,7 @@
+
+ my $file = "$dir/tmp/$base-$$.$ext";
+ $self->{_tmpfiles}->{$file}++;
+-
++
+ $file;
+ }
+
+@@ -526,7 +541,7 @@
+ {
+ my $self = shift;
+ my $file = shift;
+-
++
+ delete $self->{_tmpfiles}->{$file};
+ }
+
+@@ -534,7 +549,7 @@
+ {
+ my $self = shift;
+ my $dir = $self->caDir();
+-
++
+ my $serial = shift;
+ "$dir/private/keys/$serial.key";
+ }
+@@ -543,7 +558,7 @@
+ {
+ my $self = shift;
+ my $dir = $self->caDir();
+-
++
+ my $serial = shift;
+ "$dir/certs/$serial.pem";
+ }
+@@ -552,30 +567,29 @@
+ {
+ my $self = shift;
+ my $args = shift;
+-
+- $self->die("Required parameter dn missing")
++
++ $self->die("Required parameter dn missing")
+ unless $args->{'dn'};
+-
++
+ my $dir = $self->checkCA();
+-
++
+ $args->{type} = 'user' unless $args->{type};
+ $args->{csrfile} = $self->tempFile("request","csr") unless
$args->{csrfile};
+ $args->{keyfile} = $self->tempFile("request","key") unless
$args->{keyfile};
+-
+ ## Generate a key unless one already exists
+- unless (-r $args->{keyfile})
++ if (! -r $args->{keyfile})
+ {
+- $self->warn("Generating new key") unless $args->{verbose} > 1;
++ $self->warn("Generating new key") if $args->{verbose};
+ $self->genkey($args)
+ or $self->die("Unable to generate key in $args->{keyfile}");
+ }
+
+ ## Generate a certificate request
+- $self->warn("Create certificate request for $args->{dn}")
+- unless $args->{verbose} > 1;
+- my $process = $self->req("-new -$args->{digest} -key $args->{keyfile}
-out $args->{csrfile} -passin stdin",$args);
+- $process->print("$args->{keypass}\n");
+- $process->closedie();
++ $self->warn("Create certificate request for $args->{dn}")
++ if $args->{verbose};
++ my $cmd = "-new -$args->{digest} -key $args->{keyfile} -out
$args->{csrfile}";
++ $cmd .= " -passin pass:$args->{keypass}" if defined($args->{keypass});
++ $self->{openssl}->cmd('req',$cmd,$args);
+ }
+
+ sub gencrl
+@@ -587,6 +601,8 @@
+
+ $args->{capass} = $self->getPassword("CA Private key password")
+ unless $args->{capass};
++ $self->die("CA key must have a password")
++ unless defined($args->{capass});
+ my $days = $args->{crldays} || 30;
+ my $hours = $args->{crlhours};
+
+@@ -600,26 +616,19 @@
+ {
+ $time = "-crldays $days";
+ }
+- my $common = "-batch -passin stdin -gencrl $time";
++ my $common = "-batch -passin pass:$args->{capass} -gencrl $time";
+
+ ## Generate both version 1 and version 2 (with extensions) CRLs
+ ## and convert from PEM to DER format
+
+- my $p1 =
+- $self->ca("$common -out $dir/crl-v1.pem",$args);
+- $p1->print("$args->{capass}\n");
+- $p1->closedie();
+-
+- CSP::OpenSSL->new()->
+- sopen($self,'dummy',"crl -outform DER -out $dir/crl-v1.crl -in
$dir/crl-v1.pem")->closeok();
+-
+- my $p2 =
+- $self->ca("$common -crlexts crl_extensions -out
$dir/crl-v2.pem",$args);
+- $p2->print("$args->{capass}\n");
+- $p2->closedie();
++ $self->{openssl}->cmd('ca',"$common -out $dir/crl-v1.pem",$args);
++
++ $self->{openssl}->cmd('crl',"-outform DER -out $dir/crl-v1.crl -in
$dir/crl-v1.pem");
++
++ $self->{openssl}->cmd('ca',"$common -crlexts crl_extensions -out
$dir/crl-v2.pem",$args);
+
+- CSP::OpenSSL->new()->
+- sopen($self,'dummy',"crl -outform DER -out $dir/crl-v2.crl -in
$dir/crl-v2.pem")->closedie();
++ $self->{openssl}->
++ cmd('crl',"-outform DER -out $dir/crl-v2.crl -in $dir/crl-v2.pem");
+ }
+
+ sub list
+@@ -639,8 +648,7 @@
+ my @row = split /\t/;
+
+ next if ($row[0] ne 'V' && !$args->{all});
+-
+- next if ($args->{serial} && $row[3] ne $args->{serial});
++ next if ($args->{serial} && $row[3] != $args->{serial});
+
+ my $entity = $eclass->new($self,[EMAIL
PROTECTED],$args->{xinfo},$args->{contents});
+ push(@out,$entity) if ref $entity;
+@@ -653,7 +661,7 @@
+ {
+ my $date = shift;
+ my @parts = split /\s+/,$date;
+- warn "$parts[0] $parts[1] $parts[3]";
++ #warn "$parts[0] $parts[1] $parts[3]";
+ my ($y,$m,$d) = Date::Calc::Parse_Date("$parts[0] $parts[1] $parts[3]");
+ my $t = $parts[2];
+ $t =~ s/://og;
+@@ -674,9 +682,8 @@
+
+ $self->die("Not a directory: $args->{export}")
+ unless -d $args->{export};
+-
++
+ my $odir = $args->{export};
+- mkdir $odir,00755;
+ mkdir "$odir/certs",00755;
+
+ my $expired_count = 0;
+@@ -721,7 +728,7 @@
+ <csp:fingerprint
type="md5">$e->{info}->{fingerprint_md5}</csp:fingerprint>
+ <csp:validity>
+ <csp:notbefore
dateandtime="$from">$e->{info}->{notbefore}</csp:notbefore>
+- <csp:notafter
dateandtime="$to">$e->{info}->{notbefore}</csp:notbefore>
++ <csp:notafter dateandtime="$to">$e->{info}->{notafter}</csp:notafter>
+ </csp:validity>
+ </csp:entity>
+ EOXML
+@@ -733,8 +740,8 @@
+ }
+
+ my $file = $self->certFile($serial);
+- CSP::OpenSSL->new()->
+- ropen($self,'dummy',"x509 -in $file -outform DER -out
$odir/certs/$serial.crt")->closeok();
++ $self->{openssl}->
++ cmd('x509',"-in $file -outform DER -out
$odir/certs/$serial.crt",{noconfig=>1});
+
+ system('cp',$file,"$odir/certs/$serial.pem");
+
+@@ -764,8 +771,8 @@
+ $revoked_html .= "</table>\n";
+ $expired_html .= "</table>\n";
+
+- my $pp = CSP::OpenSSL->new()->
+- sopen($self,'dummy',"x509 -inform PEM -in $dir/ca.crt -outform PEM
-out $odir/ca.crt")->closeok();
++ my $pp = $self->{openssl}->
++ cmd('x509',"-inform PEM -in $dir/ca.crt -outform PEM -out
$odir/ca.crt",{noconfig=>1});
+ #system('cp',"$dir/ca.crt","$odir/ca.crt");
+ system('cp',"$dir/crl-v1.crl","$odir/crl-v1.crl");
+ system('cp',"$dir/crl-v2.crl","$odir/crl-v2.crl");
+@@ -844,7 +851,7 @@
+ {
+ my $self = shift;
+ my $fn = shift;
+-
++
+ my $html = IO::File->new();
+ my ($base) = $fn =~ /(.+)\.html\.mpp$/;
+ $self->die("Filename missing .html.mpp extension: $fn")
+@@ -858,16 +865,10 @@
+ {
+ my $self = shift;
+ my $args = shift;
+-
++
+ my $dir = $self->checkCA();
+-
+- my $process = CSP::OpenSSL->new()->
+- ropen($self,'dummy',"x509 -noout -text -in $dir/ca.crt");
+- my $fh = $process->handle();
+- while (<$fh>)
+- {
+- print $_;
+- }
++
++ print $self->{openssl}->cmd('x509',"-noout -text -in
$dir/ca.crt",{noconfig=>1});
+ }
+
+ sub caBundle
+@@ -894,10 +895,10 @@
+ print BUNDLE $_;
+ }
+ close CERT;
+- my $process = CSP::OpenSSL->new()->
+- ropen($self,'dummy',"x509 -noout -text -in $certfile");
++ my $process = $self->{openssl}->
++ cmd('x509',"-noout -text -in $certfile",{noconfig=>1});
+ my $fh = $process->handle();
+- while (<$fh>)
++ while (<$fh>)
+ {
+ print BUNDLE $_;
+ }
+@@ -910,27 +911,39 @@
+ {
+ my $self = shift;
+ my $args = shift;
+-
++
+ my $dir = $self->checkCA();
+
+ my $serial = $args->{serial};
+ my $file = $self->certFile($serial);
+-
++
+ $self->die("Serial $serial not issued by this CA") unless -f $file;
+-
++
+ if ($args->{confirm})
+ {
+ $self->dumpcert($file);
+ $self->confirm("Really revoke this?","Bye...");
+ }
+-
++
+ $args->{capass} = $self->getPassword("CA Private key password")
+ unless $args->{capass};
++ $self->die("CA key must have a password")
++ unless defined($args->{capass});
+
+- my $process =
+- $self->ca("-passin stdin -batch -revoke $file",$args);
+- $process->print("$args->{capass}\n");
+- $process->closeok();
++ $self->{openssl}->cmd('ca',"-passin pass:$args->{capass} -batch -revoke
$file",$args);
++ }
++
++sub _time
++ {
++ my ($self,$Dd,$Dh,$Dm,$Ds) = @_;
++
++ my ($year,$month,$day,$hour,$min,$sec,$doy,$dow,$dst) = Gmtime();
++ my ($nyear,$nmonth,$nday,$nhour,$nmin,$nsec) =
++ Add_Delta_DHMS($year,$month,$day,$hour,$min,$sec,$Dd,$Dh,$Dm,$Ds);
++
++ my $tmp =
sprintf("%02d%02d%02d%02d%02d%02dZ",$nyear,$nmonth,$nday,$nhour,$nmin,$nsec);
++ $tmp =~ s/^[0-9][0-9]//;
++ $tmp;
+ }
+
+ sub issue
+@@ -939,26 +952,26 @@
+ my $args = shift;
+
+ my $dir = $self->checkCA();
+-
++
+ $args->{type} = 'user' unless $args->{type};
+
+- unless ($args->{csrfile})
++ unless ($args->{csrfile})
+ {
+ $args->{csrfile} = $self->tempFile("request","csr");
+- eval
++ eval
+ {
+ $self->request($args);
+ $args->{p12pass} = $args->{keypass};
+ };
+- if ($@)
++ if ($@)
+ {
+ $self->die("Unable to generate request: ".$self->exm($@));
+ }
+ }
+-
+- $self->die("No csr file $args->{csrfile}")
+- unless -f $args->{csrfile};
+-
++
++# $self->die("No csr file $args->{csrfile}")
++# unless -r $args->{csrfile};
++
+ eval
+ {
+ if ($args->{confirm})
+@@ -967,7 +980,7 @@
+ $self->confirm("Really sign this?","Bye...");
+ }
+
+- $self->warn("Signing request") unless $args->{verbose} > 1;
++ $self->warn("Signing request") if $args->{verbose};
+
+ my $serial;
+ open SERIAL,"$dir/serial";
+@@ -976,18 +989,25 @@
+
+ $args->{capass} = $self->getPassword("CA Private key password")
+ unless $args->{capass};
+-
+- $args->{days} = 365 unless $args->{days};
+-
+- my $process =
+- $self->ca("-batch -md $args->{digest} -days $args->{days} -passin
stdin -preserveDN -outdir $dir/certs -in $args->{csrfile}",$args);
+- $process->print("$args->{capass}\n");
+- $process->closeok();
++ $self->die("CA key must have a password")
++ unless defined($args->{capass});
++
++ $args->{startdate} = $self->_time()
++ unless $args->{startdate};
++ $args->{enddate} =
++ $self->_time($args->{days} or
365,$args->{hours},$args->{mins},$args->{secs})
++ unless $args->{enddate};
++
++ $self->{openssl}->cmd('ca',
++ "-batch -md $args->{digest} -startdate
$args->{startdate} ".
++ "-enddate $args->{enddate} ".
++ "-passin pass:$args->{capass} -preserveDN -outdir
$dir/certs ".
++ "-in $args->{csrfile}",$args);
+ rename $args->{keyfile},"$dir/private/keys/$serial.key";
+ $self->unTempFile($args->{keyfile});
+ $args->{serial} = $serial;
+ };
+- if ($@)
++ if ($@)
+ {
+ $self->die("Unable to sign request: ".$self->exm($@));
+ }
+@@ -999,26 +1019,26 @@
+ my $args = shift;
+
+ my $dir = $self->checkCA();
+-
++
+ my $serial = $args->{serial};
+ $self->die("Missing serial number") unless $serial;
+-
++
+ $args->{keypass} = $self->getPassword("Private key password")
+- unless $args->{keypass};
+-
++ unless defined($args->{keypass});
++
+ $args->{p12pass} = $self->getPassword("PKCS12 export password")
+- unless $args->{p12pass};
++ unless defined($args->{p12pass});
+
+ my $othercerts;
+- if (-f "$dir/certpath.crt")
++ if (-f "$dir/certpath.crt")
+ {
+ $othercerts = "-certfile $dir/certpath.crt";
+ }
+- else
++ else
+ {
+ $othercerts = "-certfile $dir/ca.crt";
+ }
+-
++
+ my $certFile = $self->certFile($serial);
+ my $keyFile = $self->keyFile($serial);
+ $self->die("The private key of $serial is not on-line")
+@@ -1026,15 +1046,14 @@
+ $self->die("The certificate of $serial is not on-line")
+ unless -f $certFile;
+
+- eval
++ eval
+ {
+ mkdir "$dir/p12",00755 unless -d "$dir/p12";
+ my $p12File = "$dir/p12/$serial.p12";
+- my $process =
+- $self->pkcs12("-export -des3 $othercerts -inkey $keyFile -in
$certFile -out $p12File -passout stdin -passin stdin",$args);
+- $process->print("$args->{keypass}\n");
+- $process->print("$args->{p12pass}\n");
+- $process->closeok();
++ my $cmd = "-export -des3 $othercerts -inkey $keyFile -in $certFile -out
$p12File";
++ $cmd .= " -passout pass:$args->{p12pass}" if defined($args->{p12pass});
++ $cmd .= " -passin pass:$args->{keypass}" if defined($args->{keypass});
++ $self->{openssl}->cmd('pkcs12',$cmd,$args);
+ };
+ if ($@)
+ {
+@@ -1046,10 +1065,10 @@
+ {
+ my $self = shift;
+ my $dn = shift;
+-
++
+ my @rdns = split /\//,$dn;
+ shift @rdns;
+- foreach my $aname (keys %{$self->{alias}})
++ foreach my $aname (keys %{$self->{alias}})
+ {
+ map { s/$aname/$self->{alias}->{$aname}/ig; } @rdns;
+ }
+@@ -1063,21 +1082,21 @@
+ my $args = shift;
+
+ my $dn;
+-
+- SWITCH:
++
++ SWITCH:
+ {
+- $dn = $x,last SWITCH
++ $dn = $x,last SWITCH
+ if $x =~ /=/; ## probably a distinguished name
+-
+- $dn = $self->email2DN($1,$2,$args),last SWITCH
++
++ $dn = $self->email2DN($1,$2,$args),last SWITCH
+ if $x =~ /([EMAIL PROTECTED])\@([EMAIL PROTECTED])/; ## probably an
email address
+-
+- $dn = $self->domainName2DN($x,$args),last SWITCH
++
++ $dn = $self->domainName2DN($x,$args),last SWITCH
+ if $x =~/\./; ## probably a DNS domain name
+
+ $self->die("Unknown name form: $x");
+ }
+-
++
+ foreach my $av (split /\s*[,\/]\s*/,$dn)
+ {
+ $self->die("Bad X.501 name $dn") unless $av =~
/([a-zA-Z]+)\s*=\s*([^=]+)/;
+@@ -1095,14 +1114,14 @@
+ {
+ my $self = shift;
+ my ($lp,$dp,$args) = @_;
+-
++
+ #my $attr = 'uid';
+ #$attr = 'CN' if $lp =~ /[-\.\_]/;
+ my $attr = 'CN';
+-
++
+ $args->{email} = "[EMAIL PROTECTED]";
+
+- return "$attr=$lp,".$self->domainName2DN($dp);
++ return $self->domainName2DN($dp).",$attr=$lp";
+ }
+
+ sub domainName2DN
+@@ -1115,59 +1134,29 @@
+ $args->{ip} = $dns;
+ my @dn = split /\./,$dns;
+ @dn = map { "dc=$_" } @dn;
+- join(',',@dn);
+- }
+-
+-sub req
+- {
+- my $self = shift;
+-
+- CSP::OpenSSL->new($self,'req',@_);
+- }
+-
+-sub ca
+- {
+- my $self = shift;
+-
+- CSP::OpenSSL->new($self,'ca',@_);
+- }
+-
+-sub pkcs12
+- {
+- my $self = shift;
+-
+- CSP::OpenSSL->new($self,'pkcs12',@_);
+- }
+-
+-sub x509
+- {
+- my $self = shift;
+-
+- CSP::OpenSSL->new($self,'x509',@_);
++ join(',',reverse @dn);
+ }
+
+ sub dumpcert
+ {
+ my $self = shift;
+ my $certfile = shift;
+-
+- CSP::OpenSSL->new()->
+- sopen($self,
+- 'x509',
+- "-text -in $certfile -noout -nameopt RFC2253",
+- {noconfig=>1,verbose=>1})->closeok();
++
++ print $self->{csp}->{openssl}->
++ cmd('x509',
++ "-text -in $certfile -noout -nameopt RFC2253",
++ {noconfig=>1,verbose=>1});
+ }
+
+ sub dumpreq
+ {
+ my $self = shift;
+ my $reqfile = shift;
+-
+- CSP::OpenSSL->new()->
+- sopen($self,
+- 'req',
+- "-text -in $reqfile -noout",
+- {noconfig=>1,verbose=>1})->closeok();
++
++ print $self->{openssl}->
++ cmd('req',
++ "-text -in $reqfile -noout",
++ {noconfig=>1,verbose=>1});
+ }
+
+ sub exm
+@@ -1183,74 +1172,57 @@
+ {
+ my $self = shift;
+ my $certfile = shift;
+-
++
+ my (%info,$fh,$process);
+-
+- $process = CSP::OpenSSL->new()->ropen($self,'dummy',"x509 -noout -hash
-in $certfile");
+- $fh = $process->handle();
+- $info{hash} = <$fh>;
+- chomp $info{hash};
+- $process->closedie;
+-
+- $process =
+- CSP::OpenSSL->new()->ropen($self,'dummy',"x509 -noout -serial -dates
-subject -issuer -in $certfile");
+- $fh = $process->handle();
+- while (<$fh>)
++
++ $info{hash} = $self->{openssl}->cmd('x509',"-noout -hash -in
$certfile",{noconfig=>1});
++
++ local $_ = $self->{openssl}->cmd('x509',"-noout -serial -dates -subject
-issuer -in $certfile",{noconfig=>1});
++ while ($_)
+ {
+- chomp;
+- if (/^subject=\s*(.+)/)
++ s/^\s*\n//o;
++ if (s/^subject=\s*(.+)//o)
+ {
+ $info{subject}=$1;
+ $info{subject} =~ s/\//,/og;
+ $info{subject} =~ s/^,//og;
+- next;
+ }
+- elsif (/^issuer=\s*(.+)/)
++ elsif (s/^issuer=\s*(.+)//o)
+ {
+ $info{issuer}=$1;
+ $info{issuer} =~ s/\//,/og;
+ $info{issuer} =~ s/^,//og;
+- next;
+ }
+- elsif (/^notBefore=\s*(.+)/)
++ elsif (s/^notBefore=\s*(.+)//o)
+ {
+ $info{notbefore}=$1;
+- next;
+ }
+- elsif (/^notAfter=\s*(.+)/)
++ elsif (s/^notAfter=\s*(.+)//o)
+ {
+ $info{notafter}=$1;
+- next;
+ }
+- elsif (/^serial=\s*(.+)/)
++ elsif (s/^serial=\s*(.+)//o)
+ {
+ $info{serial}=$1;
+- next;
+ }
+ }
+-
+- $process->closedie;
+-
+- $process =
+- CSP::OpenSSL->new()->ropen($self,'dummy',"x509 -noout -md5
-fingerprint -in $certfile");
+- $fh = $process->handle();
+- while (<$fh>)
++
++ $_ = $self->{openssl}->cmd('x509',"-noout -md5 -fingerprint -in
$certfile",{noconfig=>1});
++ while ($_)
+ {
+- chomp;
+- $info{fingerprint_md5}=$1,next if /MD5 Fingerprint=(.+)/;
++ chomp;
++ s/^\s*\n//o;
++ $info{fingerprint_md5}=$1,last if /MD5 Fingerprint=(.+)/o;
+ }
+- $process->closedie;
+
+- $process =
+- CSP::OpenSSL->new()->ropen($self,'dummy',"x509 -noout -sha1
-fingerprint -in $certfile");
+- $fh = $process->handle();
+- while (<$fh>)
++ $_ = $self->{openssl}->cmd('x509',"-noout -sha1 -fingerprint -in
$certfile",{noconfig=>1});
++ while ($_)
+ {
+- chomp;
+- $info{fingerprint_sha1}=$1,next if /SHA1 Fingerprint=(.+)/;
++ chomp;
++ s/^\s*\n//o;
++ $info{fingerprint_sha1}=$1,last if /SHA1 Fingerprint=(.+)/;
+ }
+- $process->closedie;
+-
++
+ \%info;
+ }
+
+@@ -1260,7 +1232,7 @@
+ {
+ my $self = shift;
+ my $class = ref $self || $self;
+-
++
+ my @stack = @_;
+ bless [EMAIL PROTECTED],$class;
+ }
+@@ -1284,15 +1256,15 @@
+ package CSP::Entity; # Just a db object
+ @CSP::Entity::ISA = qw(CSP);
+
+-use Date::Calc qw(Day_of_Week);
++use Date::Calc qw(Day_of_Week Gmtime Add_Delta_Days Add_Delta_DHMS);
+ use POSIX qw(strftime);
+
+ sub parse_date
+ {
+ my $str = shift;
+-
++
+ my ($y,$mon,$mday,$h,$m,$s) = $str =~
/([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})Z$/;
+-
++
+ $y += 100;
+ my $wday = Day_of_Week($y+1999,$mon,$mday);
+ my @date = ($s,$m,$h,$mday,$mon,$y,$wday,0);
+@@ -1303,12 +1275,12 @@
+ {
+ my $self = shift;
+ my $class = ref $self || $self;
+-
++
+ my $csp = shift;
+ my $row = shift;
+ my $getinfo = shift;
+ my $getcontents = shift;
+-
++
+ my $serial = $row->[3];
+ my $file = ($row->[4] && $row->[4] ne 'unknown' ? $row->[4] :
$csp->certFile($serial));
+
+@@ -1335,7 +1307,7 @@
+ sub dump
+ {
+ my $self = shift;
+-
++
+ printf "%-8s: %s\n",'Serial',$self->{serial};
+ my $status = $self->{status};
+ printf "%-8s: %s\n",'Status',exists $_status{$status} ?
$_status{$status} : "Unknown";
+@@ -1344,7 +1316,7 @@
+ printf "%-8s: %s\n",'Revoked',strftime("%a %b %e %H:%M:%S
%Y",@{$self->{revoked}}) if $self->{revoked};
+ printf "%-8s: %s\n",'SHA1',$self->info('fingerprint_sha1') if
$self->info('fingerprint_sha1');
+ printf "%-8s: %s\n",'MD5',$self->info('fingerprint_md5') if
$self->info('fingerprint_md5');
+- if ($self->{getcontents})
++ if ($self->{getcontents})
+ {
+ $self->dumpcert($self->{file});
+ }
+@@ -1362,53 +1334,86 @@
+ ***
+ EOTXT
+
++use IPC::Run qw( start pump finish timeout new_appender new_chunker);
++
+ sub new
+ {
+ my $self = shift;
+ my $class = ref $self || $self;
++ my $csp = shift;
+
+- local *FH;
+- my $me = bless
+- {
+- fh=>*FH,
+- openssl=>$ENV{OPENSSL} || die $_unset
+- },$class;
+- @_ > 0 ? $me->wopen(@_) : $me;
+- }
++ my %me;
++ my @openssl = ($ENV{OPENSSL},@_);
+
+-sub DESTROY
+- {
+- $_[0]->closeok();
+- }
++ $me{csp} = $csp;
++ $me{_handle} = start([EMAIL PROTECTED],
++ '<',new_appender("\n"),\${$me{_in}},
++ '>',\${$me{_out}},'2>&1',debug=>0)
++ or die "Cannot start $ENV{OPENSSL}: $!\n";
+
+-sub ropen
+- {
+- my $self = shift;
+- $self->rws_open('r',@_);
++ bless \%me,$class;
+ }
+
+-sub wopen
++sub cmd
+ {
+ my $self = shift;
+- $self->rws_open('w',@_);
+- }
++ my $cmd = shift;
++ my $cmdline = shift;
++ my $args = shift;
+
+-sub sopen
+- {
+- my $self = shift;
+- $self->rws_open('s',@_);
++ my $conf;
++ my $cfgcmd;
++ if ( (grep $_ eq $cmd,qw(req ca)) && !$args->{noconfig})
++ {
++ $conf = $self->{csp}->writeConfig($cmd,$args);
++ $self->{csp}->die("Unable to write configuration file") unless -f $conf;
++ $cfgcmd = " -config $conf ";
++ }
++ elsif ($cmd eq 'x509' && !$args->{noconfig})
++ {
++ $conf = $self->{csp}->writeConfig($cmd,$args);
++ $self->{csp}->die("Unable to write configuration file") unless -f $conf;
++ $cfgcmd = " -extfile $conf -extensions extensions ";
++ }
++ $cmd = '' if $cmd eq 'dummy';
++
++ ${$self->{_in}} = "$cmd $cfgcmd $cmdline";
++ $self->warn("# openssl $cmd $cfgcmd $cmdline\n") if $ENV{CSPDEBUG};
++ $self->{_handle}->pump while length ${$self->{_in}};
++ $self->{_handle}->finish;
++
++ my @out = split /\n/,${$self->{_out}};
++ my @err;
++ my @nout;
++ foreach $_ (@out)
++ {
++ chomp;
++ s/\s*OpenSSL>\s*//og;
++ next unless $_;
++ if (/:error:/) {
++ push (@err,$_);
++ } else {
++ push (@nout,$_);
++ }
++ }
++
++ $self->{csp}->die(sprintf "OpenSSL Error\n%s",join("\n",@err))
++ if @err;
++
++ join("\n",@nout)."\n";
+ }
+
+-sub handle
++sub DESTROY
+ {
+- $_[0]->{fh};
++ $_[0]->{_handle}->close();
++ finish $_[0]->{_handle};
+ }
+
+ sub rws_open
+ {
+ my $self = shift;
+ my $rw = shift;
+- my $scp = shift;
++ my $csp = shift;
+ my $cmd = shift;
+ my $cmdline = shift;
+ my $args = shift;
+@@ -1428,31 +1433,33 @@
+ my $cfgcmd;
+ if ( (grep $_ eq $cmd,qw(req ca)) && !$args->{noconfig})
+ {
+- $self->{conf} = $scp->writeConfig($cmd,$args);
+- $scp->die("Unable to write configuration file") unless -f $self->{conf};
++ $self->{conf} = $self->{csp}->writeConfig($cmd,$args);
++ $self->{csp}->die("Unable to write configuration file") unless -f
$self->{conf};
+ $cfgcmd = " -config $self->{conf} ";
+ }
+- elsif ($cmd eq 'x509' && !$args->{noconfig})
++ elsif ($cmd eq 'x509' && !$args->{noconfig})
+ {
+- $self->{conf} = $scp->writeConfig($cmd,$args);
+- $scp->die("Unable to write configuration file") unless -f $self->{conf};
++ $self->{conf} = $self->{csp}->writeConfig($cmd,$args);
++ $self->{csp}->die("Unable to write configuration file") unless -f
$self->{conf};
+ $cfgcmd = " -extfile $self->{conf} -extensions extensions ";
+ }
+- $self->{csp} = $scp;
++ $self->{csp} = $csp;
+
+ $cmd = '' if $cmd eq 'dummy';
+
++ my $engine = "-engine opensc" if $ENV{CSP_OPENSC};
++
+ my $redirect = ($args->{verbose} == 0 && $rw ne 'r' ? ">/dev/null 2>&1"
: "");
+ warn "${lp}$self->{openssl} $cmd $cfgcmd $cmdline ${redirect}${rp}"
+ if $ENV{CSPDEBUG};
+ if ($rw eq 's')
+ {
+- $self->{rc} = system("$self->{openssl} $cmd $cfgcmd $cmdline
${redirect}");
++ $self->{rc} = system("$self->{openssl} $cmd $engine $cfgcmd $cmdline
${redirect}");
+ }
+ else
+ {
+- open $self->{fh},"${lp}$self->{openssl} $cmd $cfgcmd $cmdline
${redirect}${rp}" or
+- $scp->die("Unable to execute: $!");
++ open $self->{fh},"${lp}$self->{openssl} $cmd $engine $cfgcmd $cmdline
${redirect}${rp}" or
++ $self->{csp}->die("Unable to execute: $!");
+ }
+
+ $self;
+@@ -1463,7 +1470,7 @@
+ my $self = shift;
+
+ close $self->{fh} if defined $self->{fh};
+- unless ($ENV{CSPDEBUG})
++ unless ($ENV{CSPDEBUG})
+ {
+ unlink $self->{conf} if $self->{conf};
+ }
+@@ -1523,12 +1530,12 @@
+ CSP is designed to easily handle multiple distinct Certificate Authorities.
+ Hence the name which stands for Certificate Service Provider.
+
+-= item o
++=item o
+
+ CSP can be used to produce a web site (certificate repository, CRLs etc etc)
+ without the need for cgi-scripts.
+
+-= item o
++=item o
+
+ CSP tries to be as PKIX-compliant as OpenSSL allows.
+
+@@ -1551,22 +1558,22 @@
+ writer or some other means for making backups of the certificate directory.
+ Day to day operations include the following tasks.
+
+-= over 4
++=over 4
+
+-= item 1
++=item 1
+
+ Issuing certificates based on pkcs10 or out-of-band (non pkcs10) requests.
+
+-= item 2
++=item 2
+
+ Backing up the csp main directory (see below) to read-only medium.
+
+-= item 3
++=item 3
+
+ Producing the public web site and exporting it (typically using floppy or
+ zip-drive) to your web server.
+
+-= back
++=back
+
+ =head1 CONFIGURATION
+
+Index: csp
+--- csp.orig 2005-05-06 21:41:40 +0200
++++ csp 2005-05-06 21:44:23 +0200
+@@ -15,101 +15,157 @@
+ closedir CSPD;
+ grep /^[^.]/,@dirs;
+ }
+-
+-$usage=<<EOU;
+
+-Usage: $0 <ca name> create
++my %usage;
++
++$usage{create}=<<EOU;
++$0 <ca name> create
++EOU
++
++$usage{delete}=<<EOU;
++$0 <ca name> delete
++EOU
++
++$usage{init}=<<EOU;
++$0 <ca name> init
++ [--crtfile=<PEM certificate>]
++
++$0 <ca name> init
++ [--keysize=<size>]
++ [--keypass=<ca private key password>]
++ [--keyfile=<private key file>]
++ [--csrfile=<output PKCS10 request>]
++ [--days=<ca certificate validity (days)>]
++ [--email=<subjectAltName email>]
++ [--url=<subjectAltName url>]
++ [--crldays=<days to first CRL update>]
++ [--crlhours=<hours to first CRL update>]
++ [--digest=<sha1*|md5|md2|mdc2>]
++ [--verbose]+
++ <CA Subject (X509 Name)>
++EOU
++
++$usage{request}=<<EOU;
++$0 <ca name> request
++ [--keysize=<size>]
++ [--keypass=<subject private key password>]
++ [--keyfile=<private key file>]
++ [--type=<*user|server|objsign|ca>]
++ [--csrfile=<output pkcs10 request file>]
++ [--noconfirm]
++ [--verbose]+
++ [--digest=<sha1*|md5|md2|mdc2>]
++ {<X509 Name>|<RFC822 address>|<DNS name>}
++EOU
++
++$usage{issue}=<<EOU;
++$0 <ca name> issue
++ [--keysize=<size> ]
++ [--keypass=<subject private key password>]
++ [--keyfile=<private key file>]
++ [--noconfirm]
++ [--verbose]+
++ [--type=<*user|server|objsign|ca>]
++
++ - delta -
++ [--days=<certificate validity (days)>]
++ [--hours=<certificate validity (hours)>]
++ [--mins=<certificate validity (minutes)>]
++ [--secs=<certificate validity (seconds)>]
++ - absolute -
++ [--startdate=<certificate validity (start-date)>]
++ [--enddate=<certificate validity (end-date)>]
++
++ [--capass=<CA private key password>]
++ [--email=<subjectAltName email>]
++ [--url=<subjectAltName url>]
++ [--ip=<subjectAltName ip address>]
++ [--dns=<subjectAltName dns name>]
++ [--digest=<sha1*|md5|md2|mdc2>]
++ {<X509 Name>|<RFC822 address>|<DNS name>}
++EOU
++
++$usage{sign}=<<EOU;
++$0 <ca name> sign
++ [--type=<*user|server|objsign|ca>]
++ - delta -
++ [--days=<certificate validity (days)>]
++ [--hours=<certificate validity (hours)>]
++ [--mins=<certificate validity (minutes)>]
++ [--secs=<certificate validity (seconds)>]
++ - absolute -
++ [--startdate=<certificate validity (start-date)>]
++ [--enddate=<certificate validity (end-date)>]
++
++ [--capass=<CA private key password>]
++ [--csrfile=<input PKCS10 request>]
++ [--email=<subjectAltName email>]
++ [--url=<subjectAltName url>]
++ [--ip=<subjectAltName ip address>]
++ [--dns=<subjectAltName dns name>]
++ [--digest=<sha1*|md5|md2|mdc2>]
++ [--verbose]+
++EOU
++
++$usage{p12}=<<EOU;
++$0 <ca name> p12
++ [--p12pass=<pkcs12 export password>]
++ [--keypass=<private key password>]
++ [--verbose]+
++ <serial>
++EOU
++
++$usage{revoke}=<<EOU;
++$0 <ca name> revoke <serial>
++ [--noconfirm] [--quiet[=<level>]]
++EOU
++
++$usage{gencrl}=<<EOU;
++$0 <ca name> gencrl
++ [--crldays=<days to next CRL update>]
++ [--crlhours=<hours to next CRL update>]
++ [--digest=<sha1*|md5|md2|mdc2>]
++ [--verbose]+
++EOU
++
++$usage{genpublic}=<<EOU;
++$0 <ca name> genpublic
++ [--export=<export directory>]
++ [--verbose]+
++EOU
++
++$usage{list}=<<EOU;
++$0 <ca name> list
++ [--serial=<serial>]
++ [--all]
++ [--xinfo]
++ [--contents]
++ [--verbose]+
++EOU
++
++$usage{dump}=<<EOU;
++$0 <ca name> dump
++EOU
++
++my $cmds = join(' ',sort keys %usage);
++
++$usage{_nocmd_}=<<EOU;
++
++$0 --list
+
+- $0 <ca name> delete
++$0 --bundle
+
+- $0 <ca name> init
+- [--crtfile=<PEM certificate>]
+-
+- $0 <ca name> init
+- [--keysize=<size>]
+- [--keypass=<ca private key password>]
+- [--keyfile=<private key file>]
+- [--csrfile=<output PKCS10 request>]
+- [--days=<ca certificate validity (days)>]
+- [--email=<subjectAltName email>]
+- [--url=<subjectAltName url>]
+- [--crldays=<days to first CRL update>]
+- [--crlhours=<hours to first CRL update>]
+- [--digest=<sha1*|md5|md2|mdc2>]
+- [--verbose]+
+- <CA Subject (X509 Name)>
+-
+- $0 <ca name> request
+- [--keysize=<size>]
+- [--keypass=<subject private key password>]
+- [--keyfile=<private key file>]
+- [--type=<*user|server|objsign|ca>]
+- [--csrfile=<output pkcs10 request file>]
+- [--noconfirm]
+- [--verbose]+
+- [--digest=<sha1*|md5|md2|mdc2>]
+- {<X509 Name>|<RFC822 address>|<DNS name>}
+-
+- $0 <ca name> issue
+- [--keysize=<size> ]
+- [--keypass=<subject private key password>]
+- [--keyfile=<private key file>]
+- [--noconfirm]
+- [--verbose]+
+- [--type=<*user|server|objsign|ca>]
+- [--days=<certificate validity (days)>]
+- [--capass=<CA private key password>]
+- [--email=<subjectAltName email>]
+- [--url=<subjectAltName url>]
+- [--ip=<subjectAltName ip address>]
+- [--dns=<subjectAltName dns name>]
+- [--digest=<sha1*|md5|md2|mdc2>]
+- {<X509 Name>|<RFC822 address>|<DNS name>}
+-
+- $0 <ca name> sign
+- [--type=<*user|server|objsign|ca>]
+- [--capass=<CA private key password>]
+- [--csrfile=<input PKCS10 request>]
+- [--email=<subjectAltName email>]
+- [--url=<subjectAltName url>]
+- [--ip=<subjectAltName ip address>]
+- [--dns=<subjectAltName dns name>]
+- [--digest=<sha1*|md5|md2|mdc2>]
+- [--verbose]+
+-
+- $0 <ca name> p12
+- [--p12pass=<pkcs12 export password>]
+- [--keypass=<private key password>]
+- [--verbose]+
+- <serial>
+-
+- $0 <ca name> revoke <serial>
+- [--noconfirm] [--quiet[=<level>]]
+-
+- $0 <ca name> gencrl
+- [--crldays=<days to next CRL update>]
+- [--crlhours=<hours to next CRL update>]
+- [--digest=<sha1*|md5|md2|mdc2>]
+- [--verbose]+
+-
+- $0 <ca name> genpublic
+- [--export=<export directory>]
+- [--verbose]+
+-
+- $0 <ca name> list
+- [--serial=<serial>]
+- [--all]
+- [--xinfo]
+- [--contents]
+- [--verbose]+
++$0 --help [<cmd>]
+
+- $0 --list
++$0 <ca name> <cmd> [--help] <options>*
+
+- $0 --bundle
++Where <cmd> is one of
++
++$cmds.
+
+ EOU
+
+-die $usage unless @ARGV > 0;
++die $usage{_nocmd_} unless @ARGV > 0;
+
+ my $name = shift @ARGV;
+
+@@ -129,7 +185,7 @@
+ mkdir "$home/csp",00755 unless -d "$home/csp";
+
+ $name eq '--list' and
+- do
++ do
+ {
+ map { print "$_\n"; } &list_csp($home);
+ },exit;
+@@ -141,7 +197,9 @@
+ CSP->caBundle({bundle=>"$home/ca-bundle.crt"},@certs);
+ },exit;
+
+-die $usage unless @ARGV > 0;
++
++$name eq '--help' && @ARGV == 1 and die $usage{$ARGV[0]};
++$name eq '--help' || @ARGV == 0 and die $usage{_nocmd_};
+
+ my $cmd = shift @ARGV;
+
+@@ -157,6 +215,7 @@
+ xinfo => 0,
+ contents=> 0,
+ digest => 'sha1',
++ help => 0,
+ all => 0);
+
+ my @args = ("type=s",
+@@ -165,10 +224,17 @@
+ "confirm!",
+ "keysize=i",
+ "days=i",
++ "hours=i",
++ "mins=i",
++ "secs=i",
++ "startdate=s",
++ "enddate=s",
+ "xinfo!",
+ "contents!",
+ "serial=i",
+ "keypass=s",
++ "capass=s",
++ "p12pass:s",
+ "keyfile=s",
+ "csrfile=s",
+ "crtfile=s",
+@@ -177,59 +243,55 @@
+ "dns=s",
+ "export:s",
+ "digest=s",
++ "help!",
+ "url=s");
+
+-SWITCH:
++GetOptions(\%args,@args) or die $usage{$cmd};
++die $usage{$cmd} if $args{help};
++
++SWITCH:
+ {
+ ##
+ ## Dump (text form) the CA certificate
+- ##
++ ##
+
+ $cmd eq 'dump' and
+ do
+ {
+- GetOptions(\%args,@args) or die $usage;
+-
+ $csp->dump(\%args);
+ },last SWITCH;
+
+- ##
++ ##
+ ## Drop the CA
+ ##
+
+- $cmd eq 'delete' and
+- do
++ $cmd eq 'delete' and
++ do
+ {
+- GetOptions(\%args,@args) or die $usage;
+-
+ $csp->delete(\%args);
+ },last SWITCH;
+-
+- ##
++
++ ##
+ ## Initialize a ca using a self-signed certificate.
+ ##
+
+- $cmd eq 'create' and
++ $cmd eq 'create' and
+ do
+ {
+- GetOptions(\%args,@args) or die $usage;
++ $args{keysize} = 2048 unless $args{keysize};
++ $args{type} = 'root';
+
+ $csp->create(\%args);
+ },last SWITCH;
+-
+- ##
++
++ ##
+ ## Initialize a ca using a self-signed certificate.
+ ##
+
+- $cmd eq 'init' and
+- do
++ $cmd eq 'init' and
++ do
+ {
+- $args{keysize} = 2048;
+- $args{type} = 'root';
+-
+- GetOptions(\%args,@args) or die $usage;
+-
+- die $usage unless @ARGV == 1 or $args{crtfile};
++ die $usage{init} unless @ARGV == 1 or $args{crtfile};
+
+ $args{dn} = $csp->getDN(shift @ARGV,\%args) if @ARGV;
+ $csp->init(\%args);
+@@ -238,13 +300,11 @@
+ ##
+ ## Request a certificate of a specific type
+ ##
+-
++
+ $cmd eq 'request' and
+ do
+ {
+- GetOptions(\%args,@args) or die $usage;
+-
+- die $usage unless @ARGV == 1;
++ die $usage{request} unless @ARGV == 1;
+
+ $args{dn} = $csp->getDN(shift @ARGV,\%args);
+
+@@ -258,10 +318,8 @@
+ $cmd eq 'p12' and
+ do
+ {
+- GetOptions(\%args,@args) or die $usage;
+-
+- die $usage unless @ARGV == 1;
+- $args{serial} = $ARGV[0];
++ die $usage{p12} unless @ARGV == 1;
++ $args{serial} = $ARGV[0] unless $args{serial};
+
+ $csp->export_pkcs12(\%args);
+ },last SWITCH;
+@@ -273,15 +331,13 @@
+ $cmd eq 'issue' and
+ do
+ {
+- GetOptions(\%args,@args) or die $usage;
+-
+- die $usage unless @ARGV == 1;
++ die $usage{issue} unless 1 == @ARGV;
+
+ $args{dn} = $csp->getDN(shift @ARGV,\%args);
+
+ $csp->issue(\%args);
+ },last SWITCH;
+-
++
+ ##
+ ## Sign a certificate request (PKCS10 file)
+ ##
+@@ -289,11 +345,9 @@
+ $cmd eq 'sign' and
+ do
+ {
+- GetOptions(\%args,@args) or die $usage;
+-
+ $csp->issue(\%args);
+ },last SWITCH;
+-
++
+ ##
+ ## Revoke a certificate given by serial
+ ##
+@@ -301,9 +355,7 @@
+ $cmd eq 'revoke' and
+ do
+ {
+- GetOptions(\%args,@args) or die $usage;
+-
+- die $usage unless @ARGV == 1 || $args{serial};
++ die $usage{revoke} unless 1 == @ARGV || $args{serial};
+
+ $args{serial} = shift unless $args{serial};
+
+@@ -317,20 +369,16 @@
+ $cmd eq 'gencrl' and
+ do
+ {
+- GetOptions(\%args,@args) or die $usage;
+-
+ $csp->gencrl(\%args);
+ },last SWITCH;
+-
++
+ ##
+ ## Generate public sites (www & ldap)
+- ##
++ ##
+
+ ($cmd eq 'genpublic') and
+ do
+ {
+- GetOptions(\%args,@args) or die $usage;
+-
+ $csp->genPublic(\%args);
+ },last SWITCH;
+
+@@ -341,9 +389,8 @@
+ ($cmd eq 'list' or $cmd eq 'show') and
+ do
+ {
+- GetOptions(\%args,@args) or die $usage;
+ map { $_->dump(); } $csp->list(\%args,'CSP::Entity');
+ },last SWITCH;
+-
+- die $usage;
++
++ die $usage{_nocmd_};
+ }
@@ .
patch -p0 <<'@@ .'
Index: openpkg-src/csp/csp.spec
============================================================================
$ cvs diff -u -r1.1 -r1.2 csp.spec
--- openpkg-src/csp/csp.spec 2 May 2005 17:37:18 -0000 1.1
+++ openpkg-src/csp/csp.spec 6 May 2005 19:54:11 -0000 1.2
@@ -33,12 +33,13 @@
Group: Cryptography
License: GPL
Version: 0.26
-Release: 20050502
+Release: 20050506
# list of sources
Source0: ftp://ftp.it.su.se/pub/users/leifj/CSP-%{version}.tar.gz
Source1: http://devel.it.su.se/projects/CSP/cspguide.pdf
Patch0: csp.patch
+Patch1: csp.patch.cvs
# build information
Prefix: %{l_prefix}
@@ -63,7 +64,7 @@
%prep
%setup -q -n CSP-%{version}
- %patch -p0
+ %patch -p0 -P 0 1
%build
@@ .
______________________________________________________________________
The OpenPKG Project www.openpkg.org
CVS Repository Commit List [email protected]