## OpenCA - Public Command
## (c) 1998-2001 by Massimiliano Pala and OpenCA Group
##
##   File Name: verifySignature
##       Brief: Verifies a signature
## Description: verify a passed signature
##  Parameters: text, signature

sub cmdVerifySignature {

## Get the Configuration parameters ...
my ( $parsed, $lnk, $serLink, $sigInfo, $sigStatus, $signer, $signature);
my ( $baseDoc, $info, $sigCertStatus, $def, $dbStatus, $dbMessage);
my ( $myCN, $myEmail, $mySerial, $tmpCert, $pCert );

## Get Required Parameters from Configuration
my $baseDoc    = getRequired ('verifySignatureform');
my $chaindir = getRequired ('ChainDir');
my $tmpDir     = getRequired ('tempdir');

my $signature 	= $query->param('signature' );
my $text     	= $query->param('text');

## Load base page
if( not ( $page = $query->getFile( $baseDoc )) ) {
	configError (i18nGettext ("Error while loading __FILE__!", "__FILE__", $baseDoc) );
};

@cols = ( gettext("Variable"), gettext("Value") );

chomp( $signature );
$signature = "-----BEGIN PKCS7-----\n" . $signature . "\n-----END PKCS7-----\n";

## Get Signature
$tools->saveFile( FILENAME=>"$tmpDir/$$.txt", DATA=>$text );
$tools->saveFile( FILENAME=>"$tmpDir/$$.sig", DATA=>$signature );

my $sign = new OpenCA::PKCS7( SHELL    => $cryptoShell,
                              INFILE   => "$tmpDir/$$.sig",
                              DATAFILE => "$tmpDir/$$.txt",
			      CA_DIR   => "$chaindir" );

unlink( "$tmpDir/$$.sig" );
unlink( "$tmpDir/$$.txt" );

if( not $sign ) {
	configError( gettext("Invalid Signature Found!") );
}

## Get Signer
$signer = $sign->getSigner();

$myDN = $signer->{DN};
$myDN =~ s/^\///; $myDN =~ s/\//<BR>/g;

$issuerDN = $sign->getParsed()->{CHAIN}->{1}->{DN};
$issuerDN =~ s/^\///; $issuerDN =~ s/[\/\,]/<BR>/g;

## Check Signature Status
if( not libCheckSignature( SIGNATURE=>$sign ) ) {
	$sigStatus = "<FONT COLOR=\"Red\">".gettext("Error")."</FONT>";
	$sigMessage = gettext("Signature Verification Error!");

	$sigInfo = $query->img({-src=>getRequired ('SigErrorImage'),
				-align=>"MIDDLE"});
	if( $errno > 400 ) {
		$dbMessage = $errval;
		$dbStatus = $errno;
		$sigStatus = "<FONT COLOR=\"Red\">".gettext("Unknown")."</FONT>";

		$serLink = $sign->getSigner()->{SERIAL};
	} else {
		$sigMessage = gettext("Signature correctly verified");
	}
} else {
	$sigStatus = gettext("Valid");
	$sigInfo = $query->img({src=>getRequired ('ValidSigImage'),
			border=>"0", align=>"MIDDLE"});
}

$tmpCert = libGetSignerCertificateDB( SIGNATURE=>$sign );
if( $errno < 400 ) {
	if( $tmpCert->{DATATYPE} =~ /VALID/ ) {
		$sigCertStatus = gettext("Valid");
	} elsif ( $tmpCert->{DATATYPE} =~ /EXPIRED/ ) {
		$sigCertStatus = gettext("Expired");
	} elsif ( $tmpCert->{DATATYPE} =~ /REVOKED/ ) {
		$sigCertStatus = "<FONT COLOR=\"RED\">".gettext("Revoked")."</FONT>";
	}
	$dbStatus   = "0";
	$dbMessage  = gettext("Certificate present in dB");

	$serLink    = $tmpCert->getSerial();
}

$pCert = $tmpCert->getParsed();

## View the Operator Used Certificate Data
$page = $query->subVar( $page, '@DN@',       ($myDN or "n/a" ) );
$page = $query->subVar( $page, '@ISSUERDN@', ($issuerDN or "n/a" ) );
$page = $query->subVar( $page, '@SERIAL@',    $serLink );

$page = $query->subVar( $page, '@NOTBEFORE@', ($pCert->{NOTBEFORE} or "n/a"));
$page = $query->subVar( $page, '@NOTAFTER@',  ($pCert->{NOTAFTER} or "n/a" ));
$page = $query->subVar( $page, '@SIGSTATUS@',  $sigStatus );
$page = $query->subVar( $page, '@SIGMESSAGE@', $sigMessage );

$page = $query->subVar( $page, '@KEY@', 	$key);
$page = $query->subVar( $page, '@SIGINFO@',     $sigInfo );

$page = $query->subVar( $page, '@SIGNATURE@',   $signature );
$page = $query->subVar( $page, '@DBSTATUS@',    $dbStatus );
$page = $query->subVar( $page, '@DBMESSAGE@',   $dbMessage );

print "$page";

}

1;

