# $Id$
#
# Test of XML::Simple as a tool for encoding and decoding
eval 'exec perl -w -S $0 ${1+"$@"}'
if 0;
use strict;
use XML::Simple;
use Data::Dumper;
use IPC::Open2;
sub run2 {
my $arg = shift;
my $i;
my $o;
my $pid = open2($o, $i, @_)
or die("Couldn't run @_");
print($i $arg)
or die("Couldn't write to @_");
close($i)
or die("Couldn't close @_");
my @res = <$o>;
waitpid($pid, 0)
or die("Couldn't reap @_");
return @res;
}
my $p7b = "-----BEGIN PKCS7-----\n";
my $p7e = "-----END PKCS7-----\n";
sub encode {
my $arg = shift;
my $cer = shift;
my $key = shift;
my @res = run2($arg, qw(openssl smime -sign -nodetach -outform PEM -signer), $cer, q(-inkey), $key);
die("Missing PKCS7 markers")
unless $res[0] eq $p7b && $res[@res-1] eq $p7e;
return join('', @res[1..@res-2]);
}
sub decode {
my $arg = shift;
my $dir = shift;
my @res = run2($p7b . $arg . $p7e, qw(openssl smime -verify -inform PEM -CApath), $dir);
return join('', @res);
}
my $xs = XML::Simple->new(KeepRoot => 1,
ForceArray => [qw(list_class)],
KeyAttr => [qw(header)],
NormalizeSpace => 2);
my @xml = ('
','
','
[Certificate request]
','
[certificate]
','
','
','
[Readable text]
');
for my $xml (@xml) {
print("1: ", $xml, "\n");
print("2: ", Dumper($xs->XMLin($xml)), "\n");
my $cms = encode($xml, "biz-certs/Alice-EE.cer", "biz-certs/Alice-EE.key");
print("3: ", $cms, "\n");
$xml = decode($cms, "biz-certs");
print("4: ", $xml, "\n");
print("5: ", Dumper($xs->XMLin($xml)), "\n");
# my $x = $xs->XMLin($xml);
# my $t = $xs->XMLout($x);
# print("\n###\n", $xml, "\n", Dumper($x), "\n", $t);
}