Michael, I am now further along and here is what I had to do
1. in the OpenCA::Token::LunaCA3 function new
sub new {
print "Enter OpenCA::Token:LunaCA3 sub new\n";
my $that = shift;
my $class = ref($that) || $that;
my $self = {
DEBUG => 0,
debug_fd => $STDOUT,
## debug_msg => ()
};
bless $self, $class;
my $keys = { @_ };
$self->{CRYPTO} = $keys->{OPENCA_CRYPTO};
$self->{gettext} = $keys->{GETTEXT};
$self->{NAME} = $keys->{OPENCA_TOKEN};
$self->{MODE} = $keys->{TOKEN_MODE};
$self->{UTILITY} = $keys->{UTILITY};
$self->{SLOT} = $keys->{SLOT};
$self->{APPID} = $keys->{APPID};
$self->{LOCK_FILE} = $keys->{LOCK_FILE};
#$keys->{SHELL} = "/apps/local/bin/openssl";
return undef if (not $self->{CRYPTO});
return undef if (not $self->{NAME});
#my $ret =`/apps/usr/luna/bin/
## create openssl object
#$keys->{ENGINE} = "LunaCA3 -enginearg ".
$keys->{ENGINE} = "-engine LunaCA3 ";
#$self->{SLOT}.":".$self->{APPID};
print "Calling self->{OPENSSL} = OpenCA::OpenSSL->new ($keys )\n";
$self->{OPENSSL} = OpenCA::OpenSSL->new ( $keys );
$errno = $OpenCA::OpenSSL::errno;
$errval = $OpenCA::OpenSSL::errval;
return undef if not $self->{OPENSSL};
return $self;
}
#################################################################################
you can see that I modified the way it passes the engine stuff
#################################################################################
OpenCA::Token::LunaCA3 function AUTOLOAD
sub AUTOLOAD {
#print "in the AutoLOAD sub";
my $self = shift;
use vars qw($AUTOLOAD);
#print "KKK $AUTOLOAD KKKK\n";
if ($AUTOLOAD =~ /OpenCA::OpenSSL/)
{
print STDERR "PKI Master Alert: OpenCA::OpenSSL is missing a
function\n";
print STDERR "PKI Master Alert: $AUTOLOAD\n";
# $self->setError (666,
# $self->{gettext} ("OpenCA::OpenSSL is missing a function.
__FUNCTION__",
print "OpenCA::OpenSSL is missing a function. __FUNCTION__
__FUNCTION__ , $AUTOLOAD\n";
return undef;
}
$self->debug ("OpenCA::Token::LunaCA3: AUTOLOAD => $AUTOLOAD");
return 1 if ($AUTOLOAD eq 'OpenCA::Token::LunaCA3::DESTROY');
my $function = $AUTOLOAD;
$function =~ s/.*:://g;
print "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ\n";
my $ret = $self->{OPENSSL}->$function ( @_ );
$self->setError ($OpenCA::OpenSSL::errno, $OpenCA::OpenSSL::errval);
return $ret;
}
###################################################################################
I basically commented out the gettext call here to get it to go pass
this and really I think this was causing it to infinitely call itself
recursively.
##################################################################################
in OpenCA::OpenSSL function new
sub new {
print " Enter OpenCA::OpenSSL sub new\n";
my $that = shift;
my $class = ref($that) || $that;
my $self = {
%params,
};
bless $self, $class;
my $keys = { @_ };
$self->setParams( @_ );
if( not $self->{binDir} ) {
$self->{binDir} = "/usr/bin";
};
if( not $self->{shell} ) {
$self->{shell} = "$self->{binDir}/openssl";
};
if( not $self->{openca_sv} ) {
$self->{openca_sv} = "$self->{binDir}/openca-sv";
}
if( not $self->{verify} ) {
$self->{verify} = "$self->{binDir}/openca-sv verify";
};
if( not $self->{sign} ) {
$self->{sign} = "$self->{binDir}/openca-sv sign";
};
if( not $self->{decrypt} ) {
$self->{decrypt} = "$self->{binDir}/openca-sv decrypt";
};
if( not $self->{encrypt} ) {
$self->{encrypt} = "$self->{binDir}/openca-sv encrypt";
};
if( not $self->{tmpDir} ) {
$self->{tmpDir} = '/tmp';
};
print " Just before if (self->{gettext} )\n self->setError (7700110,
\"There is no translation fun
ction specified.\")";
# if( not $self->{gettext} ) {
# $self->setError (7700110, "There is no translation
function specified.");
# return undef;
print " after the gettext code";
print " $self->{openssl}\n";
if( not -e $self->{openssl} ) {
$self->setError (7700120,
$self->{gettext} ("There is no path to OpenSSL
specified."));
return undef;
};
$self->setError (0, "");
return $self;
}
##################################################################################################
Here I did the same thing, I commented out the gettext function call to
get it to go pass this point.
#################################################################################################
OpenCA::OpenSSL in function setParams
sub setParams {
print "Entering function setParams \n";
my $self = shift;
my $params = { @_ };
my $key;
my $rebuild_engine = 0;
## activate debugging
$self->{DEBUG} = $params->{DEBUG} if (exists $params->{DEBUG});
foreach $key ( keys %{$params} ) {
$self->_debug ("setParams: key: $key");
$self->_debug ("setParams: value: $params->{$key}");
$self->{cnf} = $params->{$key} if ( $key
=~ /CONFIG/ );
$self->{gettext} = $params->{$key} if ( $key
=~ /GETTEXT/ );
$self->{openssl} = "/apps/local/bin/openssl";
#:w$self->{openssl} = $params->{$key} if ( $key
=~ /SHELL/ );
$self->{wrapper} = $params->{$key} if ( $key
=~ /WRAPPER/ );
$self->{ENGINE} = $params->{$key} if ( $key
=~ /^ENGINE/ );
$self->{PRE_ENGINE} = $params->{$key} if ( $key
=~ /PRE_ENGINE/ );
$self->{POST_ENGINE} = $params->{$key} if ( $key
=~ /POST_ENGINE/ );
$self->{CALLBACK_HANDLER} = $params->{$key} if ( $key
=~ /CALLBACK_HANDLER/);
$self->{GET_PIN_CALLBACK} = $params->{$key} if ( $key
=~ /GET_PIN_CALLBACK/);
$self->{PIN_CALLBACK} = $params->{$key} if ( $key
=~ /^PIN_CALLBACK/);
$self->{STDERR_CALLBACK} = $params->{$key} if ( $key
=~ /STDERR_CALLBACK/);
$self->{STDOUT_CALLBACK} = $params->{$key} if ( $key
=~ /STDOUT_CALLBACK/);
$self->{KEY} = $params->{$key} if ( $key
=~ /KEY/ );
$self->{PASSWD} = $params->{$key} if ( $key
=~ /PASSWD/ );
$self->{PEM_CERT} = $params->{$key} if ( $key
=~ /PEM_CERT/ );
$self->{tmpDir} = $params->{$key} if ( $key
=~ /TMPDIR/ );
$self->{binDir} = $params->{$key} if ( $key
=~ /BINDIR/ );
if ( $key =~ /OPENCA_SV/ )
{
$self->{openca_sv} = $params->{$key};
$self->{verify} = $self->{openca_sv}."
verify";
$self->{sign} = $self->{openca_sv}." sign";
$self->{decrypt} = $self->{openca_sv}."
decrypt";
$self->{encrypt} = $self->{openca_sv}."
encrypt";
$rebuild_engine = 1;
}
$ENV{RANDFILE} = $params->{$key} if ( $key
=~ /RANDFILE/ );
$self->{DEBUG} = $params->{$key} if ( $key
=~ /DEBUG/ );
open STDERR, $params->{$key} if ( $key =~ /STDERR/ );
}
$self->{shell} = $self->{openssl};
# add wrapper to commands that make use of private keys
if ((exists $self->{wrapper}) and $self->{wrapper})
{
foreach (qw(shell sign decrypt))
{
if (exists $self->{$_})
{
$self->{$_} = $self->{wrapper} . " " . $self->{$_};
}
}
}
print "Leaving function setParams\n";
return 1;
}
#################################################################################################
Here I added the line $self->{openssl} = "/apps/local/bin/openssl";
because it was null before and openssl was not passed.
#################################################################################################
and here is what was in the log
OpenCA::Crypto->addToken: argument: name: DER_CERT
OpenCA::Crypto->addToken: argument: name: UTILITY
OpenCA::Crypto->addToken: argument: name: CONFIG
OpenCA::Crypto->addToken: argument: name: LOCK_FILE
OpenCA::Crypto->addToken: argument: name: TOKEN_MODE
OpenCA::Crypto->addToken: argument: name: PEM_CERT
OpenCA::Crypto->addToken: argument: name: GETTEXT
OpenCA::Crypto->addToken: argument: name: SLOT
OpenCA::Crypto->addToken: argument: name: PASSWD_PARTS
OpenCA::Crypto->addToken: argument: name: DEBUG
OpenCA::Crypto->addToken: argument: name: KEY
OpenCA::Crypto->addToken: argument: name: OPENCA_SV
OpenCA::Crypto->addToken: argument: name: RANDFILE
OpenCA::Crypto->addToken: argument: name: OPENCA_TOKEN
OpenCA::Crypto->addToken: argument: name: TXT_CERT
OpenCA::Crypto->addToken: argument: name: CHAIN
OpenCA::Crypto->addToken: argument: name: SHELL
OpenCA::Crypto->addToken: argument: name: OPENCA_CRYPTO
OpenCA::Crypto->addToken: argument: name: TMPDIR
OpenCA::Crypto->addToken: argument: name: WRAPPER
OpenCA::Crypto->addToken: argument: name: APPID
OpenCA::Crypto->addToken: fixed multivalued options
OpenCA::Crypto->addToken: try to setup LunaCA3 token
OpenCA::Crypto->newToken: entering function
OpenCA::Crypto->newToken: argument: DER_CERT
OpenCA::Crypto->newToken:
argument: /apps/var/OpenCA/ca/0921/vtc1sca/OpenCA/var/crypto/cacerts/cacert.der
OpenCA::Crypto->newToken: argument: UTILITY
OpenCA::Crypto->newToken: argument: /apps/usr/luna/bin/ca3util
OpenCA::Crypto->newToken: argument: CONFIG
OpenCA::Crypto->newToken:
argument: /apps/var/OpenCA/ca/0921/vtc1sca/OpenCA/etc/openssl/openssl.cnf
OpenCA::Crypto->newToken: argument: LOCK_FILE
OpenCA::Crypto->newToken:
argument: /apps/var/OpenCA/ca/0921/vtc1sca/OpenCA/var/tmp/ca_hsm_lock
OpenCA::Crypto->newToken: argument: TOKEN_MODE
OpenCA::Crypto->newToken: argument: standby
OpenCA::Crypto->newToken: argument: PEM_CERT
OpenCA::Crypto->newToken:
argument: /apps/var/OpenCA/ca/0921/vtc1sca/OpenCA/var/crypto/cacerts/cacert.pem
OpenCA::Crypto->newToken: argument: GETTEXT
OpenCA::Crypto->newToken: argument: CODE(0xad3165c)
OpenCA::Crypto->newToken: argument: SLOT
OpenCA::Crypto->newToken: argument: 1
OpenCA::Crypto->newToken: argument: PASSWD_PARTS
OpenCA::Crypto->newToken: argument: 0
OpenCA::Crypto->newToken: argument: DEBUG
OpenCA::Crypto->newToken: argument: 1
OpenCA::Crypto->newToken: argument: KEY
OpenCA::Crypto->newToken:
argument: /apps/var/OpenCA/ca/0921/vtc1sca/OpenCA/var/crypto/keys/cakey.pem
OpenCA::Crypto->newToken: argument: OPENCA_SV
OpenCA::Crypto->newToken:
argument: /apps/var/OpenCA/ca/0921/vtc1sca/bin/openca-sv
OpenCA::Crypto->newToken: argument: RANDFILE
OpenCA::Crypto->newToken:
argument: /apps/var/OpenCA/ca/0921/vtc1sca/OpenCA/var/crypto/.rand
OpenCA::Crypto->newToken: argument: OPENCA_TOKEN
OpenCA::Crypto->newToken: argument: CA
OpenCA::Crypto->newToken: argument: TXT_CERT
OpenCA::Crypto->newToken:
argument: /apps/var/OpenCA/ca/0921/vtc1sca/OpenCA/var/crypto/cacerts/cacert.txt
OpenCA::Crypto->newToken: argument: CHAIN
OpenCA::Crypto->newToken:
argument: /apps/var/OpenCA/ca/0921/vtc1sca/OpenCA/var/crypto/chain
OpenCA::Crypto->newToken: argument: SHELL
OpenCA::Crypto->newToken: argument: /apps/local/bin/openssl
OpenCA::Crypto->newToken: argument: OPENCA_CRYPTO
OpenCA::Crypto->newToken: argument: OpenCA::Crypto=HASH(0xb4e44b8)
OpenCA::Crypto->newToken: argument: TMPDIR
OpenCA::Crypto->newToken:
argument: /apps/var/OpenCA/ca/0921/vtc1sca/OpenCA/var/tmp
OpenCA::Crypto->newToken: argument: WRAPPER
OpenCA::Crypto->newToken: argument:
OpenCA::Crypto->newToken: argument: APPID
OpenCA::Crypto->newToken: argument: 11:10
OpenCA::Crypto->newToken: class: OpenCA::Token::LunaCA3
OpenCA::Crypto->newToken: no error during new
OpenCA::Crypto->newToken: new token present
OpenCA::Crypto->addToken: token CA successfully added
OpenCA::Crypto->new: crypto layer is ready
OpenCA::Crypto->getToken: entering function
OpenCA::Crypto->getToken: CA
OpenCA::Crypto->getToken: token added
OpenCA::Crypto->getToken: token is present
OpenCA::Crypto->getToken: token is usable
OpenCA::Crypto->getToken: entering function
OpenCA::Crypto->getToken: LOG
OpenCA::Crypto->addToken: entering function
OpenCA::Crypto->addToken: LOG
OpenCA::Crypto->addToken: checking name
OpenCA::Crypto->addToken: checking name
OpenCA::Crypto->addToken: checking name
OpenCA::Crypto->addToken: name ok
OpenCA::Crypto->addToken: loading mode
OpenCA::Crypto->addToken: loading options
OpenCA::Crypto->addToken: option name: SHELL
OpenCA::Crypto->addToken: option value: /apps/local/bin/openssl
OpenCA::Crypto->addToken: option name: WRAPPER
OpenCA::Crypto->addToken: option value:
OpenCA::Crypto->addToken: option name: KEY
OpenCA::Crypto->addToken: option
value: /apps/var/OpenCA/ca/0921/vtc1sca/OpenCA/var/crypto/keys/log_key.pem
OpenCA::Crypto->addToken: option name: PASSWD_PARTS
OpenCA::Crypto->addToken: option value: 1
OpenCA::Crypto->addToken: option name: PEM_CERT
OpenCA::Crypto->addToken: option
value: /apps/var/OpenCA/ca/0921/vtc1sca/OpenCA/var/crypto/cacerts/log_cert.pem
OpenCA::Crypto->addToken: option name: CHAIN
OpenCA::Crypto->addToken: option
value: /apps/var/OpenCA/ca/0921/vtc1sca/OpenCA/var/crypto/chain
OpenCA::Crypto->addToken: option name: OPENCA_SV
OpenCA::Crypto->addToken: option
value: /apps/var/OpenCA/ca/0921/vtc1sca/bin/openca-sv
OpenCA::Crypto->addToken: option name: TMPDIR
OpenCA::Crypto->addToken: option
value: /apps/var/OpenCA/ca/0921/vtc1sca/OpenCA/var/tmp
OpenCA::Crypto->addToken: option name: CONFIG
OpenCA::Crypto->addToken: option
value: /apps/var/OpenCA/ca/0921/vtc1sca/OpenCA/etc/openssl/openssl.cnf
OpenCA::Crypto->addToken: option name: RANDFILE
OpenCA::Crypto->addToken: option
value: /apps/var/OpenCA/ca/0921/vtc1sca/OpenCA/var/crypto/.rand
OpenCA::Crypto->addToken: option name: DEBUG
OpenCA::Crypto->addToken: option value: 0
OpenCA::Crypto->addToken: loaded options
OpenCA::Crypto->addToken: argument: name: CONFIG
OpenCA::Crypto->addToken: argument: name: TOKEN_MODE
OpenCA::Crypto->addToken: argument: name: PEM_CERT
OpenCA::Crypto->addToken: argument: name: GETTEXT
OpenCA::Crypto->addToken: argument: name: PASSWD_PARTS
OpenCA::Crypto->addToken: argument: name: DEBUG
OpenCA::Crypto->addToken: argument: name: KEY
OpenCA::Crypto->addToken: argument: name: OPENCA_SV
OpenCA::Crypto->addToken: argument: name: RANDFILE
OpenCA::Crypto->addToken: argument: name: OPENCA_TOKEN
OpenCA::Crypto->addToken: argument: name: CHAIN
OpenCA::Crypto->addToken: argument: name: SHELL
OpenCA::Crypto->addToken: argument: name: TMPDIR
OpenCA::Crypto->addToken: argument: name: OPENCA_CRYPTO
OpenCA::Crypto->addToken: argument: name: WRAPPER
OpenCA::Crypto->addToken: fixed multivalued options
OpenCA::Crypto->addToken: try to setup OpenSSL token
OpenCA::Crypto->newToken: entering function
OpenCA::Crypto->newToken: argument: CONFIG
OpenCA::Crypto->newToken:
argument: /apps/var/OpenCA/ca/0921/vtc1sca/OpenCA/etc/openssl/openssl.cnf
OpenCA::Crypto->newToken: argument: TOKEN_MODE
OpenCA::Crypto->newToken: argument: standby
OpenCA::Crypto->newToken: argument: PEM_CERT
OpenCA::Crypto->newToken:
argument:
/apps/var/OpenCA/ca/0921/vtc1sca/OpenCA/var/crypto/cacerts/log_cert.pem
OpenCA::Crypto->newToken: argument: GETTEXT
OpenCA::Crypto->newToken: argument: CODE(0xad3165c)
OpenCA::Crypto->newToken: argument: PASSWD_PARTS
OpenCA::Crypto->newToken: argument: 1
OpenCA::Crypto->newToken: argument: DEBUG
OpenCA::Crypto->newToken: argument: 1
OpenCA::Crypto->newToken: argument: KEY
OpenCA::Crypto->newToken:
argument: /apps/var/OpenCA/ca/0921/vtc1sca/OpenCA/var/crypto/keys/log_key.pem
OpenCA::Crypto->newToken: argument: OPENCA_SV
OpenCA::Crypto->newToken:
argument: /apps/var/OpenCA/ca/0921/vtc1sca/bin/openca-sv
OpenCA::Crypto->newToken: argument: RANDFILE
OpenCA::Crypto->newToken:
argument: /apps/var/OpenCA/ca/0921/vtc1sca/OpenCA/var/crypto/.rand
OpenCA::Crypto->newToken: argument: OPENCA_TOKEN
OpenCA::Crypto->newToken: argument: LOG
OpenCA::Crypto->newToken: argument: CHAIN
OpenCA::Crypto->newToken:
argument: /apps/var/OpenCA/ca/0921/vtc1sca/OpenCA/var/crypto/chain
OpenCA::Crypto->newToken: argument: SHELL
OpenCA::Crypto->newToken: argument: /apps/local/bin/openssl
OpenCA::Crypto->newToken: argument: TMPDIR
OpenCA::Crypto->newToken:
argument: /apps/var/OpenCA/ca/0921/vtc1sca/OpenCA/var/tmp
OpenCA::Crypto->newToken: argument: OPENCA_CRYPTO
OpenCA::Crypto->newToken: argument: OpenCA::Crypto=HASH(0xb4e44b8)
OpenCA::Crypto->newToken: argument: WRAPPER
OpenCA::Crypto->newToken: argument:
OpenCA::Crypto->newToken: class: OpenCA::Token::OpenSSL
OpenCA::OpenSSL->setParams: key: DEBUG
OpenCA::OpenSSL->setParams: value: 1
OpenCA::OpenSSL->setParams: key: KEY
OpenCA::OpenSSL->setParams:
value: /apps/var/OpenCA/ca/0921/vtc1sca/OpenCA/var/crypto/keys/log_key.pem
OpenCA::OpenSSL->setParams: key: OPENCA_SV
OpenCA::OpenSSL->setParams:
value: /apps/var/OpenCA/ca/0921/vtc1sca/bin/openca-sv
OpenCA::OpenSSL->setParams: key: CONFIG
OpenCA::OpenSSL->setParams:
value: /apps/var/OpenCA/ca/0921/vtc1sca/OpenCA/etc/openssl/openssl.cnf
OpenCA::OpenSSL->setParams: key: RANDFILE
OpenCA::OpenSSL->setParams:
value: /apps/var/OpenCA/ca/0921/vtc1sca/OpenCA/var/crypto/.rand
OpenCA::OpenSSL->setParams: key: CHAIN
OpenCA::OpenSSL->setParams:
value: /apps/var/OpenCA/ca/0921/vtc1sca/OpenCA/var/crypto/chain
OpenCA::OpenSSL->setParams: key: SHELL
OpenCA::OpenSSL->setParams: value: /apps/local/bin/openssl
OpenCA::OpenSSL->setParams: key: TOKEN_MODE
OpenCA::OpenSSL->setParams: value: standby
OpenCA::OpenSSL->setParams: key: GETTEXT
OpenCA::OpenSSL->setParams: value: CODE(0xad3165c)
OpenCA::OpenSSL->setParams: key: PEM_CERT
OpenCA::OpenSSL->setParams:
value: /apps/var/OpenCA/ca/0921/vtc1sca/OpenCA/var/crypto/cacerts/log_cert.pem
OpenCA::OpenSSL->setParams: key: TMPDIR
OpenCA::OpenSSL->setParams:
value: /apps/var/OpenCA/ca/0921/vtc1sca/OpenCA/var/tmp
OpenCA::OpenSSL->setParams: key: WRAPPER
OpenCA::OpenSSL->setParams: value:
OpenCA::OpenSSL->setError: errno: 0
OpenCA::OpenSSL->setError: errval:
OpenCA::Crypto->newToken: no error during new
OpenCA::Crypto->newToken: new token present
OpenCA::Crypto->addToken: token LOG successfully added
OpenCA::Crypto->getToken: token added
OpenCA::Crypto->getToken: token is present
OpenCA::Crypto->getToken: token is usable
OpenCA::Crypto->getToken: entering function
OpenCA::Crypto->getToken: CA
OpenCA::Crypto->getToken: token added
OpenCA::Crypto->getToken: token is present
OpenCA::Crypto->getToken: token is usable
OpenCA::Crypto->getToken: entering function
OpenCA::Crypto->getToken: CA
OpenCA::Crypto->getToken: token added
OpenCA::Crypto->getToken: token is present
OpenCA::Crypto->getToken: token is usable
Process Backgrounded
2005/02/02-10:50:08 OpenCA::Server (type Net::Server::Fork) starting!
pid(25841)
OpenCA::OpenSSL->_stop_shell: try to stop shell
Binding to UNIX socket
file /apps/var/OpenCA/ca/0921/vtc1sca/OpenCA/var/tmp/openca_socket using
SOCK_STREAM
#######################################################################
then it fails any ideas?
best regards
Bahaa Al-amood
On Wed, 2005-02-02 at 10:05 -0500, Bahaaldin Al-amood wrote:
> Michael,
>
> I have to use my own debugging statements since I think the debug
> function here does not work and it is the one being called as AUTLOAD
> infinitely. I put these debugging statement because I do not get any of
> the relevant output in the log even though I enabled debugging. here is
> a trace of just output to debugging statements I put in the relevant
> parts of the code:
>
>
> [EMAIL PROTECTED] etc]$ ./openca_rc restart
> Shutting down OpenCA ...
> Stopping XML cache ...done
> Stopping openca server ...done
> Starting OpenCA ... Enter OpenCA::Token:LunaCA3 sub new
> Calling self->{OPENSSL} = OpenCA::OpenSSL->new ($keys ) Enter
> OpenCA::OpenSSL sub new
> Entering function setParams
> Leaving function setParams
> Just before if (self->{gettext} )
> self->setError (7700110, "There is no translation function
> specified.")./openca_rc: line 26: 22881 Killed
> $openca_start
> FAILED
>
>
> best regards,
> Bahaa Al-amood
>
>
> On Wed, 2005-02-02 at 15:41 +0100, Michael Bell wrote:
> > Bahaaldin Al-amood wrote:
> > > Hi all,
> > >
> > > from the debuging I have been doing on the LunaCA3 module it seems that
> > > OpenCA::OpenSSL has issues with "gettext" in the sub new which causes it
> > > to fail. any help here is welcome.
> >
> > How about a small trace or other debugging output ... ;)
> >
> > Michael
smime.p7s
Description: S/MIME cryptographic signature
